Statistics
| Branch: | Tag: | Revision:

root / db / models.py @ 432fc8c3

History | View | Annotate | Download (11.6 kB)

1 46547e14 Faidon Liambotis
# vim: ts=4 sts=4 et ai sw=4 fileencoding=utf-8
2 46547e14 Faidon Liambotis
3 9dbe70f8 Markos Gogoulos
from django.conf import settings
4 17935f41 Vassilios Karakoidas
from django.db import models
5 7b7f9205 Vassilios Karakoidas
6 38684389 Markos Gogoulos
import datetime
7 f5ad2956 Markos Gogoulos
8 d08a5f6f Vangelis Koukis
class SynnefoUser(models.Model):
9 bf48028e Vassilios Karakoidas
    name = models.CharField('Synnefo Username', max_length=255)
10 bf48028e Vassilios Karakoidas
    credit = models.IntegerField('Credit Balance')
11 52194743 Vangelis Koukis
    created = models.DateTimeField('Time of creation', auto_now_add=True)
12 52194743 Vangelis Koukis
    updated = models.DateTimeField('Time of last update', auto_now=True)
13 92c53da1 Vassilios Karakoidas
14 be7b8d37 Vassilios Karakoidas
    class Meta:
15 d08a5f6f Vangelis Koukis
        verbose_name = u'Synnefo User'
16 be7b8d37 Vassilios Karakoidas
    
17 46547e14 Faidon Liambotis
    def __unicode__(self):
18 d174b105 Vassilios Karakoidas
        return self.name 
19 07f3219d Vassilios Karakoidas
20 1583f11a Vassilios Karakoidas
    def get_limit(self, limit_name):
21 1583f11a Vassilios Karakoidas
        """Returns the limit value for the specified limit"""
22 6bffabbd Vassilios Karakoidas
        limit_objs = Limit.objects.filter(name=limit_name, user=self)
23 1583f11a Vassilios Karakoidas
        if len(limit_objs) == 1:
24 1583f11a Vassilios Karakoidas
            return limit_objs[0].value
25 1583f11a Vassilios Karakoidas
        
26 1583f11a Vassilios Karakoidas
        return 0
27 bf48028e Vassilios Karakoidas
        
28 bf48028e Vassilios Karakoidas
    def _get_credit_quota(self):
29 bf48028e Vassilios Karakoidas
        """Internal getter function for credit quota"""
30 bf48028e Vassilios Karakoidas
        return self.get_limit('QUOTA_CREDIT')
31 bf48028e Vassilios Karakoidas
        
32 bf48028e Vassilios Karakoidas
    credit_quota = property(_get_credit_quota)
33 bf48028e Vassilios Karakoidas
    
34 bf48028e Vassilios Karakoidas
    def _get_monthly_rate(self):
35 bf48028e Vassilios Karakoidas
        """Internal getter function for monthly credit issue rate"""
36 bf48028e Vassilios Karakoidas
        return self.get_limit('MONTHLY_RATE')
37 bf48028e Vassilios Karakoidas
        
38 bf48028e Vassilios Karakoidas
    monthly_rate = property(_get_monthly_rate)
39 bf48028e Vassilios Karakoidas
    
40 d174b105 Vassilios Karakoidas
    def _get_min_credits(self):
41 bf48028e Vassilios Karakoidas
        """Internal getter function for maximum number of violations"""
42 d174b105 Vassilios Karakoidas
        return self.get_limit('MIN_CREDITS')
43 bf48028e Vassilios Karakoidas
        
44 d174b105 Vassilios Karakoidas
    min_credits = property(_get_min_credits)
45 b1699441 Vassilios Karakoidas
46 0b5a51f7 Vassilios Karakoidas
47 6496c622 Vassilios Karakoidas
class Image(models.Model):
48 6496c622 Vassilios Karakoidas
    # This is WIP, FIXME
49 6496c622 Vassilios Karakoidas
    IMAGE_STATES = (
50 b4808d2b Vassilios Karakoidas
        ('ACTIVE', 'Active'),
51 b4808d2b Vassilios Karakoidas
        ('SAVING', 'Saving'),
52 b4808d2b Vassilios Karakoidas
        ('DELETED', 'Deleted')
53 6496c622 Vassilios Karakoidas
    )
54 6496c622 Vassilios Karakoidas
55 13b3c5ff Vassilios Karakoidas
    name = models.CharField('Image name', max_length=255)
56 a0d4498a Vangelis Koukis
    state = models.CharField('Current Image State', choices=IMAGE_STATES, max_length=30)
57 a0d4498a Vangelis Koukis
    owner = models.ForeignKey(SynnefoUser, blank=True, null=True)
58 52194743 Vangelis Koukis
    created = models.DateTimeField('Time of creation', auto_now_add=True)
59 52194743 Vangelis Koukis
    updated = models.DateTimeField('Time of last update', auto_now=True)
60 b4808d2b Vassilios Karakoidas
    sourcevm = models.ForeignKey("VirtualMachine", null=True)
61 6496c622 Vassilios Karakoidas
62 6496c622 Vassilios Karakoidas
    class Meta:
63 6496c622 Vassilios Karakoidas
        verbose_name = u'Image'
64 6496c622 Vassilios Karakoidas
65 6496c622 Vassilios Karakoidas
    def __unicode__(self):
66 452d2391 Vassilios Karakoidas
        return u'%s' % ( self.name, )
67 6496c622 Vassilios Karakoidas
68 53827f6d Markos Gogoulos
69 53827f6d Markos Gogoulos
class ImageMetadata(models.Model):
70 13b3c5ff Vassilios Karakoidas
    meta_key = models.CharField('Image metadata key name', max_length=50)
71 13b3c5ff Vassilios Karakoidas
    meta_value = models.CharField('Image metadata value', max_length=500)
72 53827f6d Markos Gogoulos
    image = models.ForeignKey(Image)
73 53827f6d Markos Gogoulos
    
74 53827f6d Markos Gogoulos
    class Meta:
75 a0d4498a Vangelis Koukis
        verbose_name = u'Key-value pair of Image metadata.'
76 53827f6d Markos Gogoulos
    
77 53827f6d Markos Gogoulos
    def __unicode__(self):
78 53827f6d Markos Gogoulos
        return u'%s, %s for %s' % (self.meta_key, self.meta_value, self.image.name)
79 53827f6d Markos Gogoulos
80 53827f6d Markos Gogoulos
81 f51e7b50 Vassilios Karakoidas
class Limit(models.Model):
82 2d45374d Vassilios Karakoidas
    LIMITS = (
83 d174b105 Vassilios Karakoidas
        ('QUOTA_CREDIT', 'Maximum amount of credits per user'),
84 d174b105 Vassilios Karakoidas
        ('MIN_CREDITS', 'Minimum amount of credits per user'),
85 bf48028e Vassilios Karakoidas
        ('MONTHLY_RATE', 'Monthly credit issue rate')
86 2d45374d Vassilios Karakoidas
    )
87 d08a5f6f Vangelis Koukis
    user = models.ForeignKey(SynnefoUser)
88 13b3c5ff Vassilios Karakoidas
    name = models.CharField('Limit key name', choices=LIMITS, max_length=30, null=False)
89 13b3c5ff Vassilios Karakoidas
    value = models.IntegerField('Limit current value')
90 be7b8d37 Vassilios Karakoidas
    
91 46547e14 Faidon Liambotis
    class Meta:
92 dcfc6c2d Vangelis Koukis
        verbose_name = u'Enforced limit for user'
93 be7b8d37 Vassilios Karakoidas
    
94 46547e14 Faidon Liambotis
    def __unicode__(self):
95 452d2391 Vassilios Karakoidas
        return u'Limit %s for user %s: %d' % (self.value, self.user, self.value)
96 46547e14 Faidon Liambotis
97 e7164ebc Vassilios Karakoidas
98 e7164ebc Vassilios Karakoidas
class Flavor(models.Model):
99 13b3c5ff Vassilios Karakoidas
    cpu = models.IntegerField('Number of CPUs', default=0)
100 13b3c5ff Vassilios Karakoidas
    ram = models.IntegerField('Size of RAM', default=0)
101 4daac449 Vassilios Karakoidas
    disk = models.IntegerField('Size of Disk space', default=0)
102 be7b8d37 Vassilios Karakoidas
    
103 be7b8d37 Vassilios Karakoidas
    class Meta:
104 dcfc6c2d Vangelis Koukis
        verbose_name = u'Virtual machine flavor'
105 60bf38e1 Vangelis Koukis
        unique_together = ("cpu","ram","disk")
106 6c9a62b5 Vassilios Karakoidas
            
107 be7b8d37 Vassilios Karakoidas
    def _get_name(self):
108 f0f4edac Vassilios Karakoidas
        """Returns flavor name (generated)"""
109 d08a5f6f Vangelis Koukis
        return u'C%dR%dD%d' % (self.cpu, self.ram, self.disk)
110 452d2391 Vassilios Karakoidas
111 452d2391 Vassilios Karakoidas
    def _current_cost(self, active):
112 452d2391 Vassilios Karakoidas
        """Returns active/inactive cost value
113 452d2391 Vassilios Karakoidas

114 452d2391 Vassilios Karakoidas
        set active = True to get active cost and False for the inactive.
115 452d2391 Vassilios Karakoidas

116 452d2391 Vassilios Karakoidas
        """
117 d174b105 Vassilios Karakoidas
        fch_list = FlavorCost.objects.filter(flavor=self).order_by('-effective_from')
118 d174b105 Vassilios Karakoidas
        if len(fch_list) > 0:
119 452d2391 Vassilios Karakoidas
            if active:
120 452d2391 Vassilios Karakoidas
                return fch_list[0].cost_active
121 452d2391 Vassilios Karakoidas
            else:
122 452d2391 Vassilios Karakoidas
                return fch_list[0].cost_inactive
123 452d2391 Vassilios Karakoidas
124 d174b105 Vassilios Karakoidas
        return 0
125 452d2391 Vassilios Karakoidas
126 452d2391 Vassilios Karakoidas
    def _current_cost_active(self):
127 452d2391 Vassilios Karakoidas
        """Returns current active cost (property method)"""
128 452d2391 Vassilios Karakoidas
        return self._current_cost(True)
129 46547e14 Faidon Liambotis
130 d174b105 Vassilios Karakoidas
    def _current_cost_inactive(self):
131 452d2391 Vassilios Karakoidas
        """Returns current inactive cost (property method)"""
132 452d2391 Vassilios Karakoidas
        return self._current_cost(False)
133 05a90a5b Vassilios Karakoidas
134 be7b8d37 Vassilios Karakoidas
    name = property(_get_name)
135 d174b105 Vassilios Karakoidas
    current_cost_active = property(_current_cost_active)
136 d174b105 Vassilios Karakoidas
    current_cost_inactive = property(_current_cost_inactive)
137 00318048 Vassilios Karakoidas
138 46547e14 Faidon Liambotis
    def __unicode__(self):
139 46547e14 Faidon Liambotis
        return self.name
140 452d2391 Vassilios Karakoidas
141 46547e14 Faidon Liambotis
142 d174b105 Vassilios Karakoidas
class FlavorCost(models.Model):
143 13b3c5ff Vassilios Karakoidas
    cost_active = models.PositiveIntegerField('Active Cost')
144 13b3c5ff Vassilios Karakoidas
    cost_inactive = models.PositiveIntegerField('Inactive Cost')
145 452d2391 Vassilios Karakoidas
    effective_from = models.DateTimeField()
146 41b972e6 Vassilios Karakoidas
    flavor = models.ForeignKey(Flavor)
147 41b972e6 Vassilios Karakoidas
    
148 41b972e6 Vassilios Karakoidas
    class Meta:
149 41b972e6 Vassilios Karakoidas
        verbose_name = u'Pricing history for flavors'
150 41b972e6 Vassilios Karakoidas
    
151 41b972e6 Vassilios Karakoidas
    def __unicode__(self):
152 1f0fe1d8 Vassilios Karakoidas
        return u'Costs (up, down)=(%d, %d) for %s since %s' % (int(self.cost_active), int(self.cost_inactive), self.flavor.name, self.effective_from)
153 41b972e6 Vassilios Karakoidas
154 41b972e6 Vassilios Karakoidas
155 07f3219d Vassilios Karakoidas
class VirtualMachine(models.Model):
156 c92af313 Vangelis Koukis
    # The list of possible actions for a VM
157 d08a5f6f Vangelis Koukis
    ACTIONS = (
158 d08a5f6f Vangelis Koukis
       ('CREATE', 'Create VM'),
159 d08a5f6f Vangelis Koukis
       ('START', 'Start VM'),
160 d08a5f6f Vangelis Koukis
       ('STOP', 'Shutdown VM'),
161 d08a5f6f Vangelis Koukis
       ('SUSPEND', 'Admin Suspend VM'),
162 d08a5f6f Vangelis Koukis
       ('REBOOT', 'Reboot VM'),
163 d08a5f6f Vangelis Koukis
       ('DESTROY', 'Destroy VM')
164 d08a5f6f Vangelis Koukis
    )
165 c92af313 Vangelis Koukis
    # The internal operating state of a VM
166 d08a5f6f Vangelis Koukis
    OPER_STATES = (
167 d08a5f6f Vangelis Koukis
        ('BUILD', 'Queued for creation'),
168 d08a5f6f Vangelis Koukis
        ('ERROR', 'Creation failed'),
169 d08a5f6f Vangelis Koukis
        ('STOPPED', 'Stopped'),
170 d08a5f6f Vangelis Koukis
        ('STARTED', 'Started'),
171 d08a5f6f Vangelis Koukis
        ('DESTROYED', 'Destroyed')
172 d08a5f6f Vangelis Koukis
    )
173 c92af313 Vangelis Koukis
    # The list of possible operations on the backend
174 d08a5f6f Vangelis Koukis
    BACKEND_OPCODES = (
175 d08a5f6f Vangelis Koukis
        ('OP_INSTANCE_CREATE', 'Create Instance'),
176 d08a5f6f Vangelis Koukis
        ('OP_INSTANCE_REMOVE', 'Remove Instance'),
177 d08a5f6f Vangelis Koukis
        ('OP_INSTANCE_STARTUP', 'Startup Instance'),
178 d08a5f6f Vangelis Koukis
        ('OP_INSTANCE_SHUTDOWN', 'Shutdown Instance'),
179 d08a5f6f Vangelis Koukis
        ('OP_INSTANCE_REBOOT', 'Reboot Instance')
180 d08a5f6f Vangelis Koukis
    )
181 c92af313 Vangelis Koukis
    # A backend job may be in one of the following possible states
182 d08a5f6f Vangelis Koukis
    BACKEND_STATUSES = (
183 d08a5f6f Vangelis Koukis
        ('queued', 'request queued'),
184 d08a5f6f Vangelis Koukis
        ('waiting', 'request waiting for locks'),
185 d08a5f6f Vangelis Koukis
        ('canceling', 'request being canceled'),
186 d08a5f6f Vangelis Koukis
        ('running', 'request running'),
187 d08a5f6f Vangelis Koukis
        ('canceled', 'request canceled'),
188 d08a5f6f Vangelis Koukis
        ('success', 'request completed successfully'),
189 d08a5f6f Vangelis Koukis
        ('error', 'request returned error')
190 d08a5f6f Vangelis Koukis
    )
191 d08a5f6f Vangelis Koukis
192 d08a5f6f Vangelis Koukis
    # The operating state of a VM,
193 d08a5f6f Vangelis Koukis
    # upon the successful completion of a backend operation.
194 d08a5f6f Vangelis Koukis
    OPER_STATE_FROM_OPCODE = {
195 d08a5f6f Vangelis Koukis
        'OP_INSTANCE_CREATE': 'STARTED',
196 d08a5f6f Vangelis Koukis
        'OP_INSTANCE_REMOVE': 'DESTROYED',
197 d08a5f6f Vangelis Koukis
        'OP_INSTANCE_STARTUP': 'STARTED',
198 d08a5f6f Vangelis Koukis
        'OP_INSTANCE_SHUTDOWN': 'STOPPED',
199 d08a5f6f Vangelis Koukis
        'OP_INSTANCE_REBOOT': 'STARTED'
200 d08a5f6f Vangelis Koukis
    }
201 d08a5f6f Vangelis Koukis
202 c92af313 Vangelis Koukis
    # This dictionary contains the correspondence between
203 c92af313 Vangelis Koukis
    # internal operating states and Server States as defined
204 c92af313 Vangelis Koukis
    # by the Rackspace API.
205 d08a5f6f Vangelis Koukis
    RSAPI_STATE_FROM_OPER_STATE = {
206 d08a5f6f Vangelis Koukis
        "BUILD": "BUILD",
207 d08a5f6f Vangelis Koukis
        "ERROR": "ERROR",
208 d08a5f6f Vangelis Koukis
        "STOPPED": "STOPPED",
209 d08a5f6f Vangelis Koukis
        "STARTED": "ACTIVE",
210 d08a5f6f Vangelis Koukis
        "DESTROYED": "DELETED"
211 d08a5f6f Vangelis Koukis
    }
212 d08a5f6f Vangelis Koukis
213 4daac449 Vassilios Karakoidas
    name = models.CharField('Virtual Machine Name', max_length=255)
214 34a619ae Vangelis Koukis
    owner = models.ForeignKey(SynnefoUser)
215 d174b105 Vassilios Karakoidas
    created = models.DateTimeField(auto_now_add=True)
216 d174b105 Vassilios Karakoidas
    updated = models.DateTimeField(auto_now=True)
217 d174b105 Vassilios Karakoidas
    charged = models.DateTimeField(default=datetime.datetime.now())
218 b4808d2b Vassilios Karakoidas
    sourceimage = models.ForeignKey("Image", null=False) 
219 22571df6 Vassilios Karakoidas
    hostid = models.CharField(max_length=100)
220 be7b8d37 Vassilios Karakoidas
    ipfour = models.IPAddressField()
221 be7b8d37 Vassilios Karakoidas
    ipsix = models.CharField(max_length=100)
222 46547e14 Faidon Liambotis
    flavor = models.ForeignKey(Flavor)
223 c750d1d6 Vangelis Koukis
    deleted = models.BooleanField('Deleted', default=False)
224 c750d1d6 Vangelis Koukis
    suspended = models.BooleanField('Administratively Suspended', default=False)
225 d08a5f6f Vangelis Koukis
226 52194743 Vangelis Koukis
    # VM State 
227 52194743 Vangelis Koukis
    # The following fields are volatile data, in the sense
228 52194743 Vangelis Koukis
    # that they need not be persistent in the DB, but rather
229 52194743 Vangelis Koukis
    # get generated at runtime by quering Ganeti and applying
230 52194743 Vangelis Koukis
    # updates received from Ganeti.
231 73b2b65e Vassilios Karakoidas
    
232 73b2b65e Vassilios Karakoidas
    # In the future they could be moved to a separate caching layer
233 73b2b65e Vassilios Karakoidas
    # and removed from the database.
234 73b2b65e Vassilios Karakoidas
    # [vkoukis] after discussion with [faidon].
235 dfd19c2d Vassilios Karakoidas
    action = models.CharField(choices=ACTIONS, max_length=30, null=True)
236 dfd19c2d Vassilios Karakoidas
    operstate = models.CharField(choices=OPER_STATES, max_length=30, null=True)
237 dfd19c2d Vassilios Karakoidas
    backendjobid = models.PositiveIntegerField(null=True)
238 dfd19c2d Vassilios Karakoidas
    backendopcode = models.CharField(choices=BACKEND_OPCODES, max_length=30, null=True)
239 dfd19c2d Vassilios Karakoidas
    backendjobstatus = models.CharField(choices=BACKEND_STATUSES, max_length=30, null=True)
240 dfd19c2d Vassilios Karakoidas
    backendlogmsg = models.TextField(null=True)
241 d08a5f6f Vangelis Koukis
242 d08a5f6f Vangelis Koukis
    # Error classes
243 d08a5f6f Vangelis Koukis
    class InvalidBackendIdError(Exception):
244 d08a5f6f Vangelis Koukis
         def __init__(self, value):
245 d08a5f6f Vangelis Koukis
            self.value = value
246 d08a5f6f Vangelis Koukis
         def __str__(self):
247 d08a5f6f Vangelis Koukis
            return repr(self.value)
248 d08a5f6f Vangelis Koukis
249 d08a5f6f Vangelis Koukis
    class InvalidBackendMsgError(Exception):
250 d08a5f6f Vangelis Koukis
         def __init__(self, opcode, status):
251 d08a5f6f Vangelis Koukis
            self.opcode = opcode
252 d08a5f6f Vangelis Koukis
            self.status = status
253 d08a5f6f Vangelis Koukis
         def __str__(self):
254 d08a5f6f Vangelis Koukis
            return repr("<opcode: %s, status: %s>" % (str(self.opcode), str(self.status)))
255 d08a5f6f Vangelis Koukis
256 d08a5f6f Vangelis Koukis
    class InvalidActionError(Exception):
257 d08a5f6f Vangelis Koukis
         def __init__(self, action):
258 c92af313 Vangelis Koukis
            self._action = action
259 d08a5f6f Vangelis Koukis
         def __str__(self):
260 78d9b6b7 Vangelis Koukis
            return repr(str(self._action))
261 d08a5f6f Vangelis Koukis
262 3846dfd0 Vassilios Karakoidas
    def __init__(self, *args, **kw):
263 d08a5f6f Vangelis Koukis
        """Initialize state for just created VM instances."""
264 d08a5f6f Vangelis Koukis
        super(VirtualMachine, self).__init__(*args, **kw)
265 bc9c872b Vangelis Koukis
        # This gets called BEFORE an instance gets save()d for
266 bc9c872b Vangelis Koukis
        # the first time.
267 d08a5f6f Vangelis Koukis
        if not self.pk: 
268 dfd19c2d Vassilios Karakoidas
            self.action = None
269 dfd19c2d Vassilios Karakoidas
            self.backendjobid = None
270 dfd19c2d Vassilios Karakoidas
            self.backendjobstatus = None
271 dfd19c2d Vassilios Karakoidas
            self.backendopcode = None
272 dfd19c2d Vassilios Karakoidas
            self.backendlogmsg = None
273 dfd19c2d Vassilios Karakoidas
            self.operstate = 'BUILD'
274 d08a5f6f Vangelis Koukis
275 224b5e19 Markos Gogoulos
    def _get_backend_id(self):
276 224b5e19 Markos Gogoulos
        """Returns the backend id for this VM by prepending backend-prefix."""
277 92c53da1 Vassilios Karakoidas
        return '%s%s' % (settings.BACKEND_PREFIX_ID, str(self.id))
278 5b32775a Vassilios Karakoidas
279 224b5e19 Markos Gogoulos
    backend_id = property(_get_backend_id)
280 05a90a5b Vassilios Karakoidas
281 d08a5f6f Vangelis Koukis
    class Meta:
282 d08a5f6f Vangelis Koukis
        verbose_name = u'Virtual machine instance'
283 d08a5f6f Vangelis Koukis
        get_latest_by = 'created'
284 d08a5f6f Vangelis Koukis
    
285 d08a5f6f Vangelis Koukis
    def __unicode__(self):
286 d08a5f6f Vangelis Koukis
        return self.name
287 d08a5f6f Vangelis Koukis
288 4ffb82dc Vassilios Karakoidas
289 a31ff6cb Markos Gogoulos
class VirtualMachineGroup(models.Model):
290 52194743 Vangelis Koukis
    """Groups of VMs for SynnefoUsers"""
291 a31ff6cb Markos Gogoulos
    name = models.CharField(max_length=255)
292 52194743 Vangelis Koukis
    created = models.DateTimeField('Time of creation', auto_now_add=True)
293 52194743 Vangelis Koukis
    updated = models.DateTimeField('Time of last update', auto_now=True)
294 6496c622 Vassilios Karakoidas
    owner = models.ForeignKey(SynnefoUser)
295 a31ff6cb Markos Gogoulos
    machines = models.ManyToManyField(VirtualMachine)
296 a31ff6cb Markos Gogoulos
297 a31ff6cb Markos Gogoulos
    class Meta:
298 a31ff6cb Markos Gogoulos
        verbose_name = u'Virtual Machine Group'
299 a31ff6cb Markos Gogoulos
        verbose_name_plural = 'Virtual Machine Groups'
300 a31ff6cb Markos Gogoulos
        ordering = ['name']
301 a31ff6cb Markos Gogoulos
    
302 a31ff6cb Markos Gogoulos
    def __unicode__(self):
303 a31ff6cb Markos Gogoulos
        return self.name
304 a31ff6cb Markos Gogoulos
305 3f53219b Vassilios Karakoidas
306 be7b8d37 Vassilios Karakoidas
class VirtualMachineMetadata(models.Model):
307 be7b8d37 Vassilios Karakoidas
    meta_key = models.CharField(max_length=50)
308 be7b8d37 Vassilios Karakoidas
    meta_value = models.CharField(max_length=500)
309 be7b8d37 Vassilios Karakoidas
    vm = models.ForeignKey(VirtualMachine)
310 be7b8d37 Vassilios Karakoidas
    
311 be7b8d37 Vassilios Karakoidas
    class Meta:
312 dcfc6c2d Vangelis Koukis
        verbose_name = u'Key-value pair of metadata for a VM.'
313 be7b8d37 Vassilios Karakoidas
    
314 be7b8d37 Vassilios Karakoidas
    def __unicode__(self):
315 53827f6d Markos Gogoulos
        return u'%s, %s for %s' % (self.meta_key, self.meta_value, self.vm.name)
316 be7b8d37 Vassilios Karakoidas
317 be7b8d37 Vassilios Karakoidas
318 d174b105 Vassilios Karakoidas
class Debit(models.Model):
319 d174b105 Vassilios Karakoidas
    when = models.DateTimeField()
320 d174b105 Vassilios Karakoidas
    user = models.ForeignKey(SynnefoUser)
321 46547e14 Faidon Liambotis
    vm = models.ForeignKey(VirtualMachine)
322 d174b105 Vassilios Karakoidas
    description = models.TextField()
323 be7b8d37 Vassilios Karakoidas
    
324 46547e14 Faidon Liambotis
    class Meta:
325 b90da243 Vassilios Karakoidas
        verbose_name = u'Accounting log'
326 be7b8d37 Vassilios Karakoidas
327 5b32775a Vassilios Karakoidas
    def __unicode__(self):
328 452d2391 Vassilios Karakoidas
        return u'%s - %s - %s - %s' % ( self.user.id, self.vm.name, str(self.when), self.description)
329 38684389 Markos Gogoulos
330 9071888e Constantinos Venetsanopoulos
331 9071888e Constantinos Venetsanopoulos
class Disk(models.Model):
332 9071888e Constantinos Venetsanopoulos
    name = models.CharField(max_length=255)
333 52194743 Vangelis Koukis
    created = models.DateTimeField('Time of creation', auto_now_add=True)
334 52194743 Vangelis Koukis
    updated = models.DateTimeField('Time of last update', auto_now=True)
335 9071888e Constantinos Venetsanopoulos
    size = models.PositiveIntegerField('Disk size in GBs')
336 9071888e Constantinos Venetsanopoulos
    vm = models.ForeignKey(VirtualMachine, blank=True, null=True)
337 9071888e Constantinos Venetsanopoulos
    owner = models.ForeignKey(SynnefoUser, blank=True, null=True)  
338 52194743 Vangelis Koukis
339 9071888e Constantinos Venetsanopoulos
    class Meta:
340 9071888e Constantinos Venetsanopoulos
        verbose_name = u'Disk instance'
341 9071888e Constantinos Venetsanopoulos
342 9071888e Constantinos Venetsanopoulos
    def __unicode__(self):
343 9071888e Constantinos Venetsanopoulos
        return self.name