Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / db / migrations / 0066_add_iv.py @ 9ca32eaa

History | View | Annotate | Download (18.2 kB)

1 3dbd9457 Christos Stavrakakis
# encoding: utf-8
2 3dbd9457 Christos Stavrakakis
import datetime
3 3dbd9457 Christos Stavrakakis
from south.db import db
4 3dbd9457 Christos Stavrakakis
from south.v2 import DataMigration
5 3dbd9457 Christos Stavrakakis
from django.db import models
6 3dbd9457 Christos Stavrakakis
from binascii import b2a_base64, a2b_base64
7 3dbd9457 Christos Stavrakakis
from Crypto.Cipher import AES
8 3dbd9457 Christos Stavrakakis
from Crypto import Random
9 3dbd9457 Christos Stavrakakis
from random import choice
10 3dbd9457 Christos Stavrakakis
from string import letters, digits
11 3dbd9457 Christos Stavrakakis
from synnefo.settings import SECRET_ENCRYPTION_KEY
12 3dbd9457 Christos Stavrakakis
13 3dbd9457 Christos Stavrakakis
DB_ENCRYPTED_FIELD_PREFIX = 'encrypted'
14 3dbd9457 Christos Stavrakakis
SALT_LEN = 8
15 3dbd9457 Christos Stavrakakis
16 3dbd9457 Christos Stavrakakis
17 3dbd9457 Christos Stavrakakis
def _pad_secret(secret, blocksize=32, padding='}'):
18 3dbd9457 Christos Stavrakakis
    len_secret = len(secret)
19 3dbd9457 Christos Stavrakakis
    if len_secret > 32:
20 3dbd9457 Christos Stavrakakis
        raise ValueError('Encryption key must be smaller than 32 bytes')
21 3dbd9457 Christos Stavrakakis
    if not len_secret in (16, 24, 32):
22 3dbd9457 Christos Stavrakakis
        return secret + (blocksize - len(secret)) * padding
23 3dbd9457 Christos Stavrakakis
    return secret
24 3dbd9457 Christos Stavrakakis
25 3dbd9457 Christos Stavrakakis
26 3dbd9457 Christos Stavrakakis
def encrypt(s, iv=None):
27 3dbd9457 Christos Stavrakakis
    if iv is None:
28 3dbd9457 Christos Stavrakakis
        obj = AES.new(_pad_secret(SECRET_ENCRYPTION_KEY), AES.MODE_CFB)
29 3dbd9457 Christos Stavrakakis
    else:
30 3dbd9457 Christos Stavrakakis
        obj = AES.new(_pad_secret(SECRET_ENCRYPTION_KEY), AES.MODE_CFB, iv)
31 3dbd9457 Christos Stavrakakis
    return obj.encrypt(s)
32 3dbd9457 Christos Stavrakakis
33 3dbd9457 Christos Stavrakakis
34 3dbd9457 Christos Stavrakakis
def decrypt(s, iv=None):
35 3dbd9457 Christos Stavrakakis
    if iv is None:
36 3dbd9457 Christos Stavrakakis
        obj = AES.new(_pad_secret(SECRET_ENCRYPTION_KEY), AES.MODE_CFB)
37 3dbd9457 Christos Stavrakakis
    else:
38 3dbd9457 Christos Stavrakakis
        obj = AES.new(_pad_secret(SECRET_ENCRYPTION_KEY), AES.MODE_CFB, iv)
39 3dbd9457 Christos Stavrakakis
    return obj.decrypt(s)
40 3dbd9457 Christos Stavrakakis
41 3dbd9457 Christos Stavrakakis
42 3dbd9457 Christos Stavrakakis
def encrypt_db_charfield_old(plaintext):
43 3dbd9457 Christos Stavrakakis
    if not plaintext:
44 3dbd9457 Christos Stavrakakis
        return plaintext
45 3dbd9457 Christos Stavrakakis
    salt = "".join([choice(letters + digits) for i in xrange(SALT_LEN)])
46 3dbd9457 Christos Stavrakakis
47 3dbd9457 Christos Stavrakakis
    plaintext = "%s%s" % (salt, plaintext)
48 3dbd9457 Christos Stavrakakis
    # Encrypt and convert to binary
49 3dbd9457 Christos Stavrakakis
    ciphertext = b2a_base64(encrypt(plaintext))
50 3dbd9457 Christos Stavrakakis
    # Append prefix,salt and return encoded value
51 3dbd9457 Christos Stavrakakis
    final = '%s:%s$%s' % (DB_ENCRYPTED_FIELD_PREFIX, salt, ciphertext)
52 3dbd9457 Christos Stavrakakis
    return final.encode('utf8')
53 3dbd9457 Christos Stavrakakis
54 3dbd9457 Christos Stavrakakis
55 3dbd9457 Christos Stavrakakis
def decrypt_db_charfield_old(ciphertext):
56 3dbd9457 Christos Stavrakakis
    if not ciphertext:
57 3dbd9457 Christos Stavrakakis
        return ciphertext
58 3dbd9457 Christos Stavrakakis
    has_prefix = ciphertext.startswith(DB_ENCRYPTED_FIELD_PREFIX + ':')
59 3dbd9457 Christos Stavrakakis
    if not has_prefix:  # Non-encoded value
60 3dbd9457 Christos Stavrakakis
        return ciphertext
61 3dbd9457 Christos Stavrakakis
    else:
62 3dbd9457 Christos Stavrakakis
        _, ciphertext = ciphertext.split(':')
63 3dbd9457 Christos Stavrakakis
64 3dbd9457 Christos Stavrakakis
    pure_salt, encrypted = ciphertext.split('$')
65 3dbd9457 Christos Stavrakakis
66 3dbd9457 Christos Stavrakakis
    plaintext = decrypt(a2b_base64(encrypted))
67 3dbd9457 Christos Stavrakakis
68 3dbd9457 Christos Stavrakakis
    salt = plaintext[:SALT_LEN]
69 3dbd9457 Christos Stavrakakis
    plaintext = plaintext[SALT_LEN:]
70 3dbd9457 Christos Stavrakakis
71 3dbd9457 Christos Stavrakakis
    if salt != pure_salt:
72 3dbd9457 Christos Stavrakakis
        # Can not decrtypt password
73 3dbd9457 Christos Stavrakakis
        raise CorruptedPassword("Can not decrypt password. Check the key")
74 3dbd9457 Christos Stavrakakis
    else:
75 3dbd9457 Christos Stavrakakis
        return plaintext
76 3dbd9457 Christos Stavrakakis
77 3dbd9457 Christos Stavrakakis
78 3dbd9457 Christos Stavrakakis
def encrypt_db_charfield(plaintext):
79 3dbd9457 Christos Stavrakakis
    if not plaintext:
80 3dbd9457 Christos Stavrakakis
        return plaintext
81 3dbd9457 Christos Stavrakakis
    salt = "".join([choice(letters + digits) for i in xrange(SALT_LEN)])
82 3dbd9457 Christos Stavrakakis
83 3dbd9457 Christos Stavrakakis
    iv = Random.get_random_bytes(16)
84 3dbd9457 Christos Stavrakakis
    plaintext = "%s%s" % (salt, plaintext)
85 3dbd9457 Christos Stavrakakis
    # Encrypt and convert to binary
86 3dbd9457 Christos Stavrakakis
    ciphertext = b2a_base64(encrypt(plaintext, iv))
87 3dbd9457 Christos Stavrakakis
    iv = b2a_base64(iv)
88 3dbd9457 Christos Stavrakakis
    # Append prefix,salt and return encoded value
89 3dbd9457 Christos Stavrakakis
    final = '%s:%s:%s$%s' % (DB_ENCRYPTED_FIELD_PREFIX, iv, salt, ciphertext)
90 3dbd9457 Christos Stavrakakis
    return final.encode('utf8')
91 3dbd9457 Christos Stavrakakis
92 3dbd9457 Christos Stavrakakis
93 3dbd9457 Christos Stavrakakis
def decrypt_db_charfield(ciphertext):
94 3dbd9457 Christos Stavrakakis
    if not ciphertext:
95 3dbd9457 Christos Stavrakakis
        return ciphertext
96 3dbd9457 Christos Stavrakakis
    has_prefix = ciphertext.startswith(DB_ENCRYPTED_FIELD_PREFIX + ':')
97 3dbd9457 Christos Stavrakakis
    if not has_prefix:  # Non-encoded value
98 3dbd9457 Christos Stavrakakis
        return ciphertext
99 3dbd9457 Christos Stavrakakis
    else:
100 3dbd9457 Christos Stavrakakis
        _, iv, ciphertext = ciphertext.split(':')
101 3dbd9457 Christos Stavrakakis
102 3dbd9457 Christos Stavrakakis
    pure_salt, encrypted = ciphertext.split('$')
103 3dbd9457 Christos Stavrakakis
    iv = a2b_base64(iv)
104 3dbd9457 Christos Stavrakakis
105 3dbd9457 Christos Stavrakakis
    plaintext = decrypt(a2b_base64(encrypted), iv)
106 3dbd9457 Christos Stavrakakis
107 3dbd9457 Christos Stavrakakis
    salt = plaintext[:SALT_LEN]
108 3dbd9457 Christos Stavrakakis
    plaintext = plaintext[SALT_LEN:]
109 3dbd9457 Christos Stavrakakis
110 3dbd9457 Christos Stavrakakis
    if salt != pure_salt:
111 3dbd9457 Christos Stavrakakis
        # Can not decrtypt password
112 3dbd9457 Christos Stavrakakis
        raise CorruptedPassword("Can not decrypt password. Check the key")
113 3dbd9457 Christos Stavrakakis
    else:
114 3dbd9457 Christos Stavrakakis
        return plaintext
115 3dbd9457 Christos Stavrakakis
116 3dbd9457 Christos Stavrakakis
117 3dbd9457 Christos Stavrakakis
class CorruptedPassword(Exception):
118 3dbd9457 Christos Stavrakakis
    pass
119 3dbd9457 Christos Stavrakakis
120 3dbd9457 Christos Stavrakakis
121 3dbd9457 Christos Stavrakakis
class Migration(DataMigration):
122 3dbd9457 Christos Stavrakakis
123 3dbd9457 Christos Stavrakakis
    def forwards(self, orm):
124 3dbd9457 Christos Stavrakakis
        "Write your forwards methods here."
125 3dbd9457 Christos Stavrakakis
        for backend in orm.Backend.objects.all():
126 e4ce2d35 Christos Stavrakakis
            old_hash = backend.password_hash
127 e4ce2d35 Christos Stavrakakis
            if len(old_hash.split(":")) == 2:
128 e4ce2d35 Christos Stavrakakis
                old_pass = decrypt_db_charfield_old(old_hash)
129 e4ce2d35 Christos Stavrakakis
                new_hash = encrypt_db_charfield(old_pass)
130 e4ce2d35 Christos Stavrakakis
                # Bypass save method!
131 e4ce2d35 Christos Stavrakakis
                orm.Backend.objects.filter(id=backend.id).update(password_hash=new_hash)
132 3dbd9457 Christos Stavrakakis
133 3dbd9457 Christos Stavrakakis
    def backwards(self, orm):
134 3dbd9457 Christos Stavrakakis
        "Write your backwards methods here."
135 e4ce2d35 Christos Stavrakakis
        try:
136 e4ce2d35 Christos Stavrakakis
            for backend in orm.Backend.objects.all():
137 e4ce2d35 Christos Stavrakakis
                old_pass = decrypt_db_charfield(backend.password_hash)
138 e4ce2d35 Christos Stavrakakis
                new_hash = encrypt_db_charfield_old(old_pass)
139 e4ce2d35 Christos Stavrakakis
                orm.Backend.objects.filter(id=backend.id).update(password_hash=new_hash)
140 e4ce2d35 Christos Stavrakakis
        except:
141 e4ce2d35 Christos Stavrakakis
            pass
142 3dbd9457 Christos Stavrakakis
143 3dbd9457 Christos Stavrakakis
    models = {
144 3dbd9457 Christos Stavrakakis
        'db.backend': {
145 3dbd9457 Christos Stavrakakis
            'Meta': {'object_name': 'Backend'},
146 3dbd9457 Christos Stavrakakis
            'clustername': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}),
147 3dbd9457 Christos Stavrakakis
            'ctotal': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
148 3dbd9457 Christos Stavrakakis
            'dfree': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
149 3dbd9457 Christos Stavrakakis
            'drained': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
150 3dbd9457 Christos Stavrakakis
            'dtotal': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
151 3dbd9457 Christos Stavrakakis
            'hash': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
152 3dbd9457 Christos Stavrakakis
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
153 3dbd9457 Christos Stavrakakis
            'index': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'unique': 'True'}),
154 3dbd9457 Christos Stavrakakis
            'mfree': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
155 3dbd9457 Christos Stavrakakis
            'mtotal': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
156 3dbd9457 Christos Stavrakakis
            'offline': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
157 3dbd9457 Christos Stavrakakis
            'password_hash': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
158 3dbd9457 Christos Stavrakakis
            'pinst_cnt': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
159 3dbd9457 Christos Stavrakakis
            'port': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5080'}),
160 3dbd9457 Christos Stavrakakis
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
161 3dbd9457 Christos Stavrakakis
            'username': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'})
162 3dbd9457 Christos Stavrakakis
        },
163 3dbd9457 Christos Stavrakakis
        'db.backendnetwork': {
164 3dbd9457 Christos Stavrakakis
            'Meta': {'unique_together': "(('network', 'backend'),)", 'object_name': 'BackendNetwork'},
165 3dbd9457 Christos Stavrakakis
            'backend': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'networks'", 'to': "orm['db.Backend']"}),
166 3dbd9457 Christos Stavrakakis
            'backendjobid': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
167 3dbd9457 Christos Stavrakakis
            'backendjobstatus': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
168 3dbd9457 Christos Stavrakakis
            'backendlogmsg': ('django.db.models.fields.TextField', [], {'null': 'True'}),
169 3dbd9457 Christos Stavrakakis
            'backendopcode': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
170 3dbd9457 Christos Stavrakakis
            'backendtime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(1, 1, 1, 0, 0)'}),
171 3dbd9457 Christos Stavrakakis
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
172 3dbd9457 Christos Stavrakakis
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
173 3dbd9457 Christos Stavrakakis
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
174 3dbd9457 Christos Stavrakakis
            'mac_prefix': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
175 3dbd9457 Christos Stavrakakis
            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'backend_networks'", 'to': "orm['db.Network']"}),
176 3dbd9457 Christos Stavrakakis
            'operstate': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '30'}),
177 3dbd9457 Christos Stavrakakis
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
178 3dbd9457 Christos Stavrakakis
        },
179 3dbd9457 Christos Stavrakakis
        'db.bridgepooltable': {
180 3dbd9457 Christos Stavrakakis
            'Meta': {'object_name': 'BridgePoolTable'},
181 3dbd9457 Christos Stavrakakis
            'available_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
182 3dbd9457 Christos Stavrakakis
            'base': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
183 3dbd9457 Christos Stavrakakis
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
184 3dbd9457 Christos Stavrakakis
            'offset': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
185 3dbd9457 Christos Stavrakakis
            'reserved_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
186 3dbd9457 Christos Stavrakakis
            'size': ('django.db.models.fields.IntegerField', [], {})
187 3dbd9457 Christos Stavrakakis
        },
188 3dbd9457 Christos Stavrakakis
        'db.flavor': {
189 3dbd9457 Christos Stavrakakis
            'Meta': {'unique_together': "(('cpu', 'ram', 'disk', 'disk_template'),)", 'object_name': 'Flavor'},
190 3dbd9457 Christos Stavrakakis
            'cpu': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
191 3dbd9457 Christos Stavrakakis
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
192 3dbd9457 Christos Stavrakakis
            'disk': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
193 3dbd9457 Christos Stavrakakis
            'disk_template': ('django.db.models.fields.CharField', [], {'default': "'plain'", 'max_length': '32'}),
194 3dbd9457 Christos Stavrakakis
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
195 3dbd9457 Christos Stavrakakis
            'ram': ('django.db.models.fields.IntegerField', [], {'default': '0'})
196 3dbd9457 Christos Stavrakakis
        },
197 3dbd9457 Christos Stavrakakis
        'db.ippooltable': {
198 3dbd9457 Christos Stavrakakis
            'Meta': {'object_name': 'IPPoolTable'},
199 3dbd9457 Christos Stavrakakis
            'available_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
200 3dbd9457 Christos Stavrakakis
            'base': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
201 3dbd9457 Christos Stavrakakis
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
202 3dbd9457 Christos Stavrakakis
            'offset': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
203 3dbd9457 Christos Stavrakakis
            'reserved_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
204 3dbd9457 Christos Stavrakakis
            'size': ('django.db.models.fields.IntegerField', [], {})
205 3dbd9457 Christos Stavrakakis
        },
206 3dbd9457 Christos Stavrakakis
        'db.macprefixpooltable': {
207 3dbd9457 Christos Stavrakakis
            'Meta': {'object_name': 'MacPrefixPoolTable'},
208 3dbd9457 Christos Stavrakakis
            'available_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
209 3dbd9457 Christos Stavrakakis
            'base': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
210 3dbd9457 Christos Stavrakakis
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
211 3dbd9457 Christos Stavrakakis
            'offset': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
212 3dbd9457 Christos Stavrakakis
            'reserved_map': ('django.db.models.fields.TextField', [], {'default': "''"}),
213 3dbd9457 Christos Stavrakakis
            'size': ('django.db.models.fields.IntegerField', [], {})
214 3dbd9457 Christos Stavrakakis
        },
215 3dbd9457 Christos Stavrakakis
        'db.network': {
216 3dbd9457 Christos Stavrakakis
            'Meta': {'object_name': 'Network'},
217 3dbd9457 Christos Stavrakakis
            'action': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '32', 'null': 'True'}),
218 3dbd9457 Christos Stavrakakis
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
219 3dbd9457 Christos Stavrakakis
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}),
220 3dbd9457 Christos Stavrakakis
            'dhcp': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
221 3dbd9457 Christos Stavrakakis
            'flavor': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
222 3dbd9457 Christos Stavrakakis
            'gateway': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
223 3dbd9457 Christos Stavrakakis
            'gateway6': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
224 3dbd9457 Christos Stavrakakis
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
225 3dbd9457 Christos Stavrakakis
            'link': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
226 3dbd9457 Christos Stavrakakis
            'mac_prefix': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
227 3dbd9457 Christos Stavrakakis
            'machines': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['db.VirtualMachine']", 'through': "orm['db.NetworkInterface']", 'symmetrical': 'False'}),
228 3dbd9457 Christos Stavrakakis
            'mode': ('django.db.models.fields.CharField', [], {'max_length': '16', 'null': 'True'}),
229 3dbd9457 Christos Stavrakakis
            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
230 3dbd9457 Christos Stavrakakis
            'pool': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'network'", 'unique': 'True', 'null': 'True', 'to': "orm['db.IPPoolTable']"}),
231 3dbd9457 Christos Stavrakakis
            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}),
232 3dbd9457 Christos Stavrakakis
            'serial': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'network'", 'null': 'True', 'to': "orm['db.QuotaHolderSerial']"}),
233 3dbd9457 Christos Stavrakakis
            'state': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '32'}),
234 3dbd9457 Christos Stavrakakis
            'subnet': ('django.db.models.fields.CharField', [], {'default': "'10.0.0.0/24'", 'max_length': '32'}),
235 3dbd9457 Christos Stavrakakis
            'subnet6': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
236 3dbd9457 Christos Stavrakakis
            'tags': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
237 3dbd9457 Christos Stavrakakis
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
238 3dbd9457 Christos Stavrakakis
            'userid': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'db_index': 'True'})
239 3dbd9457 Christos Stavrakakis
        },
240 3dbd9457 Christos Stavrakakis
        'db.networkinterface': {
241 3dbd9457 Christos Stavrakakis
            'Meta': {'object_name': 'NetworkInterface'},
242 3dbd9457 Christos Stavrakakis
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
243 3dbd9457 Christos Stavrakakis
            'dirty': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
244 3dbd9457 Christos Stavrakakis
            'firewall_profile': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
245 3dbd9457 Christos Stavrakakis
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
246 3dbd9457 Christos Stavrakakis
            'index': ('django.db.models.fields.IntegerField', [], {}),
247 3dbd9457 Christos Stavrakakis
            'ipv4': ('django.db.models.fields.CharField', [], {'max_length': '15', 'null': 'True'}),
248 3dbd9457 Christos Stavrakakis
            'ipv6': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}),
249 3dbd9457 Christos Stavrakakis
            'mac': ('django.db.models.fields.CharField', [], {'max_length': '32', 'unique': 'True', 'null': 'True'}),
250 3dbd9457 Christos Stavrakakis
            'machine': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'nics'", 'to': "orm['db.VirtualMachine']"}),
251 3dbd9457 Christos Stavrakakis
            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'nics'", 'to': "orm['db.Network']"}),
252 3dbd9457 Christos Stavrakakis
            'state': ('django.db.models.fields.CharField', [], {'default': "'ACTIVE'", 'max_length': '32'}),
253 3dbd9457 Christos Stavrakakis
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
254 3dbd9457 Christos Stavrakakis
        },
255 3dbd9457 Christos Stavrakakis
        'db.quotaholderserial': {
256 3dbd9457 Christos Stavrakakis
            'Meta': {'object_name': 'QuotaHolderSerial'},
257 3dbd9457 Christos Stavrakakis
            'accept': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
258 3dbd9457 Christos Stavrakakis
            'pending': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True', 'blank': 'True'}),
259 3dbd9457 Christos Stavrakakis
            'resolved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
260 3dbd9457 Christos Stavrakakis
            'serial': ('django.db.models.fields.BigIntegerField', [], {'primary_key': 'True', 'db_index': 'True'})
261 3dbd9457 Christos Stavrakakis
        },
262 3dbd9457 Christos Stavrakakis
        'db.virtualmachine': {
263 3dbd9457 Christos Stavrakakis
            'Meta': {'object_name': 'VirtualMachine'},
264 3dbd9457 Christos Stavrakakis
            'action': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
265 3dbd9457 Christos Stavrakakis
            'backend': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'virtual_machines'", 'null': 'True', 'to': "orm['db.Backend']"}),
266 3dbd9457 Christos Stavrakakis
            'backend_hash': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
267 3dbd9457 Christos Stavrakakis
            'backendjobid': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
268 3dbd9457 Christos Stavrakakis
            'backendjobstatus': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
269 3dbd9457 Christos Stavrakakis
            'backendlogmsg': ('django.db.models.fields.TextField', [], {'null': 'True'}),
270 3dbd9457 Christos Stavrakakis
            'backendopcode': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
271 3dbd9457 Christos Stavrakakis
            'backendtime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(1, 1, 1, 0, 0)'}),
272 3dbd9457 Christos Stavrakakis
            'buildpercentage': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
273 3dbd9457 Christos Stavrakakis
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
274 3dbd9457 Christos Stavrakakis
            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}),
275 3dbd9457 Christos Stavrakakis
            'flavor': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['db.Flavor']"}),
276 3dbd9457 Christos Stavrakakis
            'hostid': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
277 3dbd9457 Christos Stavrakakis
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
278 3dbd9457 Christos Stavrakakis
            'imageid': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
279 3dbd9457 Christos Stavrakakis
            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
280 3dbd9457 Christos Stavrakakis
            'operstate': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
281 3dbd9457 Christos Stavrakakis
            'serial': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'virtual_machine'", 'null': 'True', 'to': "orm['db.QuotaHolderSerial']"}),
282 3dbd9457 Christos Stavrakakis
            'suspended': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
283 3dbd9457 Christos Stavrakakis
            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
284 3dbd9457 Christos Stavrakakis
            'userid': ('django.db.models.fields.CharField', [], {'max_length': '100', 'db_index': 'True'})
285 3dbd9457 Christos Stavrakakis
        },
286 3dbd9457 Christos Stavrakakis
        'db.virtualmachinediagnostic': {
287 3dbd9457 Christos Stavrakakis
            'Meta': {'object_name': 'VirtualMachineDiagnostic'},
288 3dbd9457 Christos Stavrakakis
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
289 3dbd9457 Christos Stavrakakis
            'details': ('django.db.models.fields.TextField', [], {'null': 'True'}),
290 3dbd9457 Christos Stavrakakis
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
291 3dbd9457 Christos Stavrakakis
            'level': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
292 3dbd9457 Christos Stavrakakis
            'machine': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'diagnostics'", 'to': "orm['db.VirtualMachine']"}),
293 3dbd9457 Christos Stavrakakis
            'message': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
294 3dbd9457 Christos Stavrakakis
            'source': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
295 3dbd9457 Christos Stavrakakis
            'source_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'})
296 3dbd9457 Christos Stavrakakis
        },
297 3dbd9457 Christos Stavrakakis
        'db.virtualmachinemetadata': {
298 3dbd9457 Christos Stavrakakis
            'Meta': {'unique_together': "(('meta_key', 'vm'),)", 'object_name': 'VirtualMachineMetadata'},
299 3dbd9457 Christos Stavrakakis
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
300 3dbd9457 Christos Stavrakakis
            'meta_key': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
301 3dbd9457 Christos Stavrakakis
            'meta_value': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
302 3dbd9457 Christos Stavrakakis
            'vm': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'metadata'", 'to': "orm['db.VirtualMachine']"})
303 3dbd9457 Christos Stavrakakis
        }
304 3dbd9457 Christos Stavrakakis
    }
305 3dbd9457 Christos Stavrakakis
306 3dbd9457 Christos Stavrakakis
    complete_apps = ['db']