Commit aca6c74c by Őry Máté

one: lint models.py

parent b18fbe92
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Changing field 'SshKey.key'
db.alter_column('one_sshkey', 'key', self.gf('django.db.models.fields.TextField')())
# Changing field 'UserCloudDetails.ssh_private_key'
db.alter_column('one_userclouddetails', 'ssh_private_key', self.gf('django.db.models.fields.TextField')(default=''))
# Changing field 'UserCloudDetails.user'
db.alter_column('one_userclouddetails', 'user_id', self.gf('django.db.models.fields.related.OneToOneField')(unique=True, to=orm['auth.User']))
# Changing field 'Instance.name'
db.alter_column('one_instance', 'name', self.gf('django.db.models.fields.CharField')(default='', unique=True, max_length=100))
def backwards(self, orm):
# Changing field 'SshKey.key'
db.alter_column('one_sshkey', 'key', self.gf('django.db.models.fields.CharField')(max_length=2000))
# Changing field 'UserCloudDetails.ssh_private_key'
db.alter_column('one_userclouddetails', 'ssh_private_key', self.gf('django.db.models.fields.TextField')(null=True))
# Changing field 'UserCloudDetails.user'
db.alter_column('one_userclouddetails', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], unique=True))
# Changing field 'Instance.name'
db.alter_column('one_instance', 'name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100, null=True))
models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'firewall.domain': {
'Meta': {'object_name': 'Domain'},
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
'ttl': ('django.db.models.fields.IntegerField', [], {'default': '600'})
},
'firewall.group': {
'Meta': {'object_name': 'Group'},
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
'firewall.host': {
'Meta': {'object_name': 'Host'},
'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['firewall.Group']", 'null': 'True', 'blank': 'True'}),
'hostname': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ipv4': ('django.db.models.fields.GenericIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
'ipv6': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
'location': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'mac': ('firewall.fields.MACAddressField', [], {'unique': 'True', 'max_length': '17'}),
'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
'pub_ipv4': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}),
'reverse': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}),
'shared_ip': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'vlan': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['firewall.Vlan']"})
},
'firewall.vlan': {
'Meta': {'object_name': 'Vlan'},
'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'dhcp_pool': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['firewall.Domain']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'interface': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}),
'ipv4': ('django.db.models.fields.GenericIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
'ipv6': ('django.db.models.fields.GenericIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}),
'net4': ('django.db.models.fields.GenericIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
'net6': ('django.db.models.fields.GenericIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
'prefix4': ('django.db.models.fields.IntegerField', [], {'default': '16'}),
'prefix6': ('django.db.models.fields.IntegerField', [], {'default': '80'}),
'reverse_domain': ('django.db.models.fields.TextField', [], {}),
'snat_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}),
'snat_to': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['firewall.Vlan']", 'null': 'True', 'blank': 'True'}),
'vid': ('django.db.models.fields.IntegerField', [], {'unique': 'True'})
},
'one.disk': {
'Meta': {'ordering': "['name']", 'object_name': 'Disk'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
},
'one.instance': {
'Meta': {'object_name': 'Instance'},
'active_since': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'firewall_host': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'instance_set'", 'null': 'True', 'to': "orm['firewall.Host']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}),
'one_id': ('django.db.models.fields.IntegerField', [], {'unique': 'True', 'null': 'True', 'blank': 'True'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'instance_set'", 'to': "orm['auth.User']"}),
'pw': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
'share': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'instance_set'", 'null': 'True', 'to': "orm['one.Share']"}),
'state': ('django.db.models.fields.CharField', [], {'default': "'DEPLOYABLE'", 'max_length': '20'}),
'template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'instance_set'", 'to': "orm['one.Template']"}),
'time_of_delete': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
'time_of_suspend': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
'waiting': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
},
'one.instancetype': {
'CPU': ('django.db.models.fields.IntegerField', [], {}),
'Meta': {'ordering': "['credit']", 'object_name': 'InstanceType'},
'RAM': ('django.db.models.fields.IntegerField', [], {}),
'credit': ('django.db.models.fields.IntegerField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
},
'one.network': {
'Meta': {'ordering': "['name']", 'object_name': 'Network'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'nat': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
},
'one.share': {
'Meta': {'object_name': 'Share'},
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {}),
'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'share_set'", 'to': "orm['school.Group']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'instance_limit': ('django.db.models.fields.IntegerField', [], {}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'share_set'", 'null': 'True', 'to': "orm['auth.User']"}),
'per_user_limit': ('django.db.models.fields.IntegerField', [], {}),
'template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'share_set'", 'to': "orm['one.Template']"}),
'type': ('django.db.models.fields.CharField', [], {'max_length': '10'})
},
'one.sshkey': {
'Meta': {'object_name': 'SshKey'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'key': ('django.db.models.fields.TextField', [], {}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sshkey_set'", 'to': "orm['auth.User']"})
},
'one.template': {
'Meta': {'object_name': 'Template'},
'access_type': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'disk': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'template_set'", 'to': "orm['one.Disk']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'instance_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'template_set'", 'to': "orm['one.InstanceType']"}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'template_set'", 'to': "orm['one.Network']"}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'template_set'", 'to': "orm['auth.User']"}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'state': ('django.db.models.fields.CharField', [], {'default': "'NEW'", 'max_length': '10'}),
'system': ('django.db.models.fields.TextField', [], {'blank': 'True'})
},
'one.userclouddetails': {
'Meta': {'object_name': 'UserCloudDetails'},
'disk_quota': ('django.db.models.fields.IntegerField', [], {'default': '2048'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'instance_quota': ('django.db.models.fields.IntegerField', [], {'default': '20'}),
'share_quota': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'smb_password': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
'ssh_key': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'userclouddetails_set'", 'null': 'True', 'to': "orm['one.SshKey']"}),
'ssh_private_key': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'cloud_details'", 'unique': 'True', 'to': "orm['auth.User']"})
},
'school.course': {
'Meta': {'object_name': 'Course'},
'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}),
'default_group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'default_group_of'", 'null': 'True', 'to': "orm['school.Group']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'null': 'True', 'blank': 'True'}),
'owners': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['school.Person']", 'null': 'True', 'blank': 'True'}),
'short_name': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'})
},
'school.group': {
'Meta': {'unique_together': "(('name', 'course', 'semester'),)", 'object_name': 'Group'},
'course': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['school.Course']", 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'members': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'course_groups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['school.Person']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
'owners': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'owned_groups'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['school.Person']"}),
'semester': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['school.Semester']"})
},
'school.person': {
'Meta': {'object_name': 'Person'},
'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'language': ('django.db.models.fields.CharField', [], {'default': "'hu'", 'max_length': '10'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True', 'null': 'True', 'blank': 'True'})
},
'school.semester': {
'Meta': {'object_name': 'Semester'},
'end': ('django.db.models.fields.DateField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}),
'start': ('django.db.models.fields.DateField', [], {})
}
}
complete_apps = ['one']
\ No newline at end of file
# coding=utf-8 # coding=utf-8
from datetime import datetime
from datetime import timedelta as td
import subprocess, tempfile, os, stat, re, base64, struct, logging
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core import signing from django.core import signing
from django.db import models from django.db import models
from django.db import transaction from django.db import transaction
from django.db.models.signals import post_delete, pre_delete
from django.db.models.signals import post_save from django.db.models.signals import post_save
from django import forms from django import forms
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from firewall.models import Host, Rule, Vlan from firewall.models import Host, Rule, Vlan
from one.util import keygen
from school.models import Person, Group from school.models import Person, Group
from datetime import timedelta as td
from django.db.models.signals import post_delete, pre_delete
from store.api import StoreApi from store.api import StoreApi
from django.db import transaction from .util import keygen
from datetime import datetime
import logging
import subprocess, tempfile, os, stat, re, base64, struct
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
pwgen = User.objects.make_random_password pwgen = User.objects.make_random_password
...@@ -33,18 +33,18 @@ post_save.connect(create_user_profile, sender=User) ...@@ -33,18 +33,18 @@ post_save.connect(create_user_profile, sender=User)
class UserCloudDetails(models.Model): class UserCloudDetails(models.Model):
"""Cloud related details of a user.""" """Cloud related details of a user."""
user = models.ForeignKey(User, null=False, blank=False, unique=True, user = models.OneToOneField(User, verbose_name=_('user'),
verbose_name=_('user')) related_name='cloud_details')
smb_password = models.CharField(max_length=20, smb_password = models.CharField(max_length=20,
verbose_name=_('Samba password'), verbose_name=_('Samba password'),
help_text=_('Generated password for accessing store from ' help_text=_('Generated password for accessing store from '
'Windows.')) 'Windows.'))
ssh_key = models.ForeignKey('SshKey', null=True, ssh_key = models.ForeignKey('SshKey', verbose_name=_('SSH key (public)'),
verbose_name=_('SSH key (public)'), null=True, blank=True, related_name='userclouddetails_set',
help_text=_('Generated SSH public key for accessing store from ' help_text=_('Generated SSH public key for accessing store from '
'Linux.')) 'Linux.'))
ssh_private_key = models.TextField(verbose_name=_('SSH key (private)'), ssh_private_key = models.TextField(verbose_name=_('SSH key (private)'),
null=True, help_text=_('Generated SSH private key for ' blank=True, help_text=_('Generated SSH private key for '
'accessing store from Linux.')) 'accessing store from Linux.'))
share_quota = models.IntegerField(verbose_name=_('share quota'), share_quota = models.IntegerField(verbose_name=_('share quota'),
default=0) default=0)
...@@ -139,8 +139,8 @@ class OpenSshKeyValidator(object): ...@@ -139,8 +139,8 @@ class OpenSshKeyValidator(object):
class SshKey(models.Model): class SshKey(models.Model):
"""SSH public key (in OpenSSH format).""" """SSH public key (in OpenSSH format)."""
user = models.ForeignKey(User, null=False, blank=False) user = models.ForeignKey(User, related_name='sshkey_set')
key = models.CharField(max_length=2000, verbose_name=_('SSH key'), key = models.TextField(verbose_name=_('SSH key'),
help_text=_('<a href="/info/ssh/">SSH public key in OpenSSH ' help_text=_('<a href="/info/ssh/">SSH public key in OpenSSH '
'format</a> used for shell and store login ' 'format</a> used for shell and store login '
'(2048+ bit RSA preferred). Example: ' '(2048+ bit RSA preferred). Example: '
...@@ -174,19 +174,18 @@ TYPES_C = tuple([(i[0], i[1]["verbose_name"]) for i in TYPES.items()]) ...@@ -174,19 +174,18 @@ TYPES_C = tuple([(i[0], i[1]["verbose_name"]) for i in TYPES.items()])
class Share(models.Model): class Share(models.Model):
name = models.CharField(max_length=100, verbose_name=_('name')) name = models.CharField(max_length=100, verbose_name=_('name'))
description = models.TextField(verbose_name=_('description')) description = models.TextField(verbose_name=_('description'))
template = models.ForeignKey('Template', null=False, blank=False) template = models.ForeignKey('Template', related_name='share_set')
group = models.ForeignKey(Group, null=False, blank=False) group = models.ForeignKey(Group, related_name='share_set')
created_at = models.DateTimeField(auto_now_add=True, created_at = models.DateTimeField(auto_now_add=True,
verbose_name=_('created at')) verbose_name=_('created at'))
type = models.CharField(choices=TYPES_C, max_length=10, blank=False, type = models.CharField(choices=TYPES_C, max_length=10)
null=False)
instance_limit = models.IntegerField(verbose_name=_('instance limit'), instance_limit = models.IntegerField(verbose_name=_('instance limit'),
help_text=_('Maximal count of instances launchable for this ' help_text=_('Maximal count of instances launchable for this '
'share.')) 'share.'))
per_user_limit = models.IntegerField(verbose_name=_('per user limit'), per_user_limit = models.IntegerField(verbose_name=_('per user limit'),
help_text=_('Maximal count of instances launchable by a single ' help_text=_('Maximal count of instances launchable by a single '
'user.')) 'user.'))
owner = models.ForeignKey(User, null=True, blank=True) owner = models.ForeignKey(User, null=True, blank=True, related_name='share_set')
def get_type(self): def get_type(self):
t = TYPES[self.type] t = TYPES[self.type]
...@@ -218,8 +217,14 @@ class Disk(models.Model): ...@@ -218,8 +217,14 @@ class Disk(models.Model):
name = models.CharField(max_length=100, unique=True, name = models.CharField(max_length=100, unique=True,
verbose_name=_('name')) verbose_name=_('name'))
@classmethod class Meta:
def update(cls): ordering = ['name']
def __unicode__(self):
return u"%s (#%d)" % (self.name, self.id)
@staticmethod
def update():
"""Get and register virtual disks from OpenNebula.""" """Get and register virtual disks from OpenNebula."""
import subprocess import subprocess
proc = subprocess.Popen(["/opt/occi.sh", "storage", "list"], proc = subprocess.Popen(["/opt/occi.sh", "storage", "list"],
...@@ -241,12 +246,6 @@ class Disk(models.Model): ...@@ -241,12 +246,6 @@ class Disk(models.Model):
l.append(id) l.append(id)
Disk.objects.exclude(id__in=l).delete() Disk.objects.exclude(id__in=l).delete()
def __unicode__(self):
return u"%s (#%d)" % (self.name, self.id)
class Meta:
ordering = ['name']
class Network(models.Model): class Network(models.Model):
"""Virtual networks automatically synchronized with OpenNebula.""" """Virtual networks automatically synchronized with OpenNebula."""
name = models.CharField(max_length=100, unique=True, name = models.CharField(max_length=100, unique=True,
...@@ -256,8 +255,14 @@ class Network(models.Model): ...@@ -256,8 +255,14 @@ class Network(models.Model):
public = models.BooleanField(verbose_name=_('public'), public = models.BooleanField(verbose_name=_('public'),
help_text=_('If internet gateway is available.')) help_text=_('If internet gateway is available.'))
@classmethod class Meta:
def update(cls): ordering = ['name']
def __unicode__(self):
return self.name
@staticmethod
def update():
"""Get and register virtual networks from OpenNebula.""" """Get and register virtual networks from OpenNebula."""
import subprocess import subprocess
proc = subprocess.Popen(["/opt/occi.sh", "network", "list"], proc = subprocess.Popen(["/opt/occi.sh", "network", "list"],
...@@ -279,10 +284,6 @@ class Network(models.Model): ...@@ -279,10 +284,6 @@ class Network(models.Model):
l.append(id) l.append(id)
cls.objects.exclude(id__in=l).delete() cls.objects.exclude(id__in=l).delete()
def __unicode__(self):
return self.name
class Meta:
ordering = ['name']
class InstanceType(models.Model): class InstanceType(models.Model):
"""Instance types in OCCI configuration (manually synchronized).""" """Instance types in OCCI configuration (manually synchronized)."""
...@@ -292,11 +293,13 @@ class InstanceType(models.Model): ...@@ -292,11 +293,13 @@ class InstanceType(models.Model):
RAM = models.IntegerField(help_text=_('Mebibytes of memory.')) RAM = models.IntegerField(help_text=_('Mebibytes of memory.'))
credit = models.IntegerField(verbose_name=_('credits'), credit = models.IntegerField(verbose_name=_('credits'),
help_text=_('Price of instance.')) help_text=_('Price of instance.'))
def __unicode__(self):
return u"%s" % self.name
class Meta: class Meta:
ordering = ['credit'] ordering = ['credit']
def __unicode__(self):
return u"%s" % self.name
TEMPLATE_STATES = (('NEW', _('new')), ('SAVING', _('saving')), TEMPLATE_STATES = (('NEW', _('new')), ('SAVING', _('saving')),
('READY', _('ready')), ) ('READY', _('ready')), )
class Template(models.Model): class Template(models.Model):
...@@ -306,11 +309,13 @@ class Template(models.Model): ...@@ -306,11 +309,13 @@ class Template(models.Model):
access_type = models.CharField(max_length=10, access_type = models.CharField(max_length=10,
choices=[('rdp', 'rdp'), ('nx', 'nx'), ('ssh', 'ssh')], choices=[('rdp', 'rdp'), ('nx', 'nx'), ('ssh', 'ssh')],
verbose_name=_('access method')) verbose_name=_('access method'))
disk = models.ForeignKey(Disk, verbose_name=_('disk')) disk = models.ForeignKey(Disk, verbose_name=_('disk'), related_name='template_set')
instance_type = models.ForeignKey(InstanceType, instance_type = models.ForeignKey(InstanceType, related_name='template_set',
verbose_name=_('instance type')) verbose_name=_('instance type'))
network = models.ForeignKey(Network, verbose_name=_('network')) network = models.ForeignKey(Network, verbose_name=_('network'),
owner = models.ForeignKey(User, verbose_name=_('owner')) related_name='template_set')
owner = models.ForeignKey(User, verbose_name=_('owner'),
related_name='template_set')
created_at = models.DateTimeField(auto_now_add=True, created_at = models.DateTimeField(auto_now_add=True,
verbose_name=_('created at')) verbose_name=_('created at'))
state = models.CharField(max_length=10, choices=TEMPLATE_STATES, state = models.CharField(max_length=10, choices=TEMPLATE_STATES,
...@@ -322,17 +327,23 @@ class Template(models.Model): ...@@ -322,17 +327,23 @@ class Template(models.Model):
help_text=(_('Name of operating system in format like "%s".') % help_text=(_('Name of operating system in format like "%s".') %
"Ubuntu 12.04 LTS Desktop amd64")) "Ubuntu 12.04 LTS Desktop amd64"))
class Meta:
verbose_name = _('template')
verbose_name_plural = _('templates')
def __unicode__(self):
return self.name
def running_instances(self): def running_instances(self):
return self.instance_set.exclude(state='DONE').count() return self.instance_set.exclude(state='DONE').count()
@property
def os_type(self): def os_type(self):
if self.access_type == 'rdp': if self.access_type == 'rdp':
return "win" return "win"
else: else:
return "linux" return "linux"
def __unicode__(self):
return self.name
@transaction.commit_on_success @transaction.commit_on_success
def safe_delete(self): def safe_delete(self):
if not self.instance_set.exclude(state='DONE').exists(): if not self.instance_set.exclude(state='DONE').exists():
...@@ -342,18 +353,16 @@ class Template(models.Model): ...@@ -342,18 +353,16 @@ class Template(models.Model):
logger.info("Could not delete template. Instances still running!") logger.info("Could not delete template. Instances still running!")
return False return False
class Meta:
verbose_name = _('template')
verbose_name_plural = _('templates')
class Instance(models.Model): class Instance(models.Model):
"""Virtual machine instance.""" """Virtual machine instance."""
name = models.CharField(max_length=100, unique=True, name = models.CharField(max_length=100, unique=True,
verbose_name=_('name'), null=True, blank=True) verbose_name=_('name'), blank=True)
ip = models.IPAddressField(blank=True, null=True, ip = models.IPAddressField(blank=True, null=True,
verbose_name=_('IP address')) verbose_name=_('IP address'))
template = models.ForeignKey(Template, verbose_name=_('template')) template = models.ForeignKey(Template, verbose_name=_('template'),
owner = models.ForeignKey(User, verbose_name=_('owner')) related_name='instance_set')
owner = models.ForeignKey(User, verbose_name=_('owner'),
related_name='instance_set')
created_at = models.DateTimeField(auto_now_add=True, created_at = models.DateTimeField(auto_now_add=True,
verbose_name=_('created at')) verbose_name=_('created at'))
state = models.CharField(max_length=20, state = models.CharField(max_length=20,
...@@ -369,18 +378,30 @@ class Instance(models.Model): ...@@ -369,18 +378,30 @@ class Instance(models.Model):
verbose_name=_('active since'), verbose_name=_('active since'),
help_text=_('Time stamp of successful boot report.')) help_text=_('Time stamp of successful boot report.'))
firewall_host = models.ForeignKey(Host, blank=True, null=True, firewall_host = models.ForeignKey(Host, blank=True, null=True,
verbose_name=_('host in firewall')) verbose_name=_('host in firewall'), related_name='instance_set')
pw = models.CharField(max_length=20, verbose_name=_('password'), pw = models.CharField(max_length=20, verbose_name=_('password'),
help_text=_('Original password of instance')) help_text=_('Original password of instance'))
one_id = models.IntegerField(unique=True, blank=True, null=True, one_id = models.IntegerField(unique=True, blank=True, null=True,
verbose_name=_('OpenNebula ID')) verbose_name=_('OpenNebula ID'))
share = models.ForeignKey('Share', blank=True, null=True, share = models.ForeignKey('Share', blank=True, null=True,
verbose_name=_('share')) verbose_name=_('share'), related_name='instance_set')
time_of_suspend = models.DateTimeField(default=None, time_of_suspend = models.DateTimeField(default=None,
verbose_name=_('time of suspend'), null=True, blank=False) verbose_name=_('time of suspend'), null=True, blank=True)
time_of_delete = models.DateTimeField(default=None, time_of_delete = models.DateTimeField(default=None,
verbose_name=_('time of delete'), null=True, blank=False) verbose_name=_('time of delete'), null=True, blank=True)
waiting = models.BooleanField(default=False) waiting = models.BooleanField(default=False)
class Meta:
verbose_name = _('instance')
verbose_name_plural = _('instances')
def __unicode__(self):
return self.name
@models.permalink
def get_absolute_url(self):
return ('vm_show', None, {'iid':self.id})
def get_port(self): def get_port(self):
"""Get public port number for default access method.""" """Get public port number for default access method."""
proto = self.template.access_type proto = self.template.access_type
...@@ -410,9 +431,6 @@ class Instance(models.Model): ...@@ -410,9 +431,6 @@ class Instance(models.Model):
except: except:
return return
def __unicode__(self):
return self.name
def update_state(self): def update_state(self):
"""Get and update VM state from OpenNebula.""" """Get and update VM state from OpenNebula."""
import subprocess import subprocess
...@@ -451,10 +469,6 @@ class Instance(models.Model): ...@@ -451,10 +469,6 @@ class Instance(models.Model):
pass pass
return age return age
@models.permalink
def get_absolute_url(self):
return ('vm_show', None, {'iid':self.id})
@classmethod @classmethod
def submit(cls, template, owner, extra="", share=None): def submit(cls, template, owner, extra="", share=None):
"""Submit a new instance to OpenNebula.""" """Submit a new instance to OpenNebula."""
...@@ -466,7 +480,7 @@ class Instance(models.Model): ...@@ -466,7 +480,7 @@ class Instance(models.Model):
os.chmod(f.name, stat.S_IRUSR|stat.S_IWUSR|stat.S_IRGRP|stat.S_IROTH) os.chmod(f.name, stat.S_IRUSR|stat.S_IWUSR|stat.S_IRGRP|stat.S_IROTH)
token = signing.dumps(inst.id, salt='activate') token = signing.dumps(inst.id, salt='activate')
try: try:
details = owner.userclouddetails_set.all()[0] details = owner.cloud_details
except: except:
details = UserCloudDetails(user=owner) details = UserCloudDetails(user=owner)
details.save() details.save()
...@@ -608,6 +622,7 @@ class Instance(models.Model): ...@@ -608,6 +622,7 @@ class Instance(models.Model):
t = self.template t = self.template
t.state = 'SAVING' t.state = 'SAVING'
t.save() t.save()
def check_if_is_save_as_done(self): def check_if_is_save_as_done(self):
if self.state != 'DONE': if self.state != 'DONE':
return False return False
...@@ -615,18 +630,13 @@ class Instance(models.Model): ...@@ -615,18 +630,13 @@ class Instance(models.Model):
imgname = "template-%d-%d" % (self.template.id, self.id) imgname = "template-%d-%d" % (self.template.id, self.id)
disks = Disk.objects.filter(name=imgname) disks = Disk.objects.filter(name=imgname)
if len(disks) != 1: if len(disks) != 1:
return false return False
self.template.disk_id = disks[0].id self.template.disk_id = disks[0].id
self.template.state = 'READY' self.template.state = 'READY'
self.template.save() self.template.save()
self.firewall_host_delete() self.firewall_host_delete()
return True return True
class Meta:
verbose_name = _('instance')
verbose_name_plural = _('instances')
def delete_instance(sender, instance, using, **kwargs): def delete_instance(sender, instance, using, **kwargs):
if instance.state != "DONE": if instance.state != "DONE":
instance.one_delete() instance.one_delete()
......
...@@ -13,7 +13,7 @@ import base64 ...@@ -13,7 +13,7 @@ import base64
def estabilish_store_user(request, user): def estabilish_store_user(request, user):
try: try:
details = request.user.userclouddetails_set.all()[0] details = request.user.cloud_details
password = details.smb_password password = details.smb_password
quota = details.disk_quota * 1024 quota = details.disk_quota * 1024
key_list = [] key_list = []
...@@ -34,7 +34,7 @@ def index(request): ...@@ -34,7 +34,7 @@ def index(request):
try: try:
auth=request.POST['auth'] auth=request.POST['auth']
try: try:
details = request.user.userclouddetails_set.all()[0] details = request.user.cloud_details
password = details.smb_password password = details.smb_password
key_list = [] key_list = []
for key in request.user.sshkey_set.all(): for key in request.user.sshkey_set.all():
...@@ -182,7 +182,7 @@ def gui(request): ...@@ -182,7 +182,7 @@ def gui(request):
return render_to_response('store/gui.html', RequestContext(request, {'username' : user, 'host' : StoreApi.get_host()})) return render_to_response('store/gui.html', RequestContext(request, {'username' : user, 'host' : StoreApi.get_host()}))
elif request.method == 'POST': elif request.method == 'POST':
try: try:
details = request.user.userclouddetails_set.all()[0] details = request.user.cloud_details
password = details.smb_password password = details.smb_password
key_list = [] key_list = []
for key in request.user.sshkey_set.all(): for key in request.user.sshkey_set.all():
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment