Statistics
| Branch: | Tag: | Revision:

root / db / models.py @ fcbc5bb3

History | View | Annotate | Download (4.5 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 78dec216 Vassilios Karakoidas
from django.contrib.auth.models import User
6 38684389 Markos Gogoulos
from django.utils.translation import gettext_lazy as _
7 9dbe70f8 Markos Gogoulos
8 38684389 Markos Gogoulos
import datetime
9 38684389 Markos Gogoulos
10 be7b8d37 Vassilios Karakoidas
import vocabs
11 17935f41 Vassilios Karakoidas
12 9dbe70f8 Markos Gogoulos
ganeti_prefix_id = settings.GANETI_PREFIX_ID
13 9dbe70f8 Markos Gogoulos
14 9dbe70f8 Markos Gogoulos
15 9dbe70f8 Markos Gogoulos
def id_from_instance_name(name):    
16 9dbe70f8 Markos Gogoulos
    "Returns VirtualMachine's Django id, given a ganeti machine name"
17 9dbe70f8 Markos Gogoulos
    "Strips the ganeti prefix atm. Needs a better name!"
18 9dbe70f8 Markos Gogoulos
    return '%s' % (str(name).strip(ganeti_prefix_id))
19 9dbe70f8 Markos Gogoulos
20 9dbe70f8 Markos Gogoulos
21 46547e14 Faidon Liambotis
class Limit(models.Model):
22 46547e14 Faidon Liambotis
    description = models.CharField(max_length=45)
23 be7b8d37 Vassilios Karakoidas
    
24 be7b8d37 Vassilios Karakoidas
    class Meta:
25 be7b8d37 Vassilios Karakoidas
        verbose_name = u'Available limits for users'
26 be7b8d37 Vassilios Karakoidas
    
27 46547e14 Faidon Liambotis
    def __unicode__(self):
28 46547e14 Faidon Liambotis
        return self.description
29 46547e14 Faidon Liambotis
30 07f3219d Vassilios Karakoidas
31 f0e91699 Vassilios Karakoidas
class OceanUser(models.Model):
32 46547e14 Faidon Liambotis
    name = models.CharField(max_length=255)
33 46547e14 Faidon Liambotis
    credit = models.IntegerField()
34 46547e14 Faidon Liambotis
    quota = models.IntegerField()
35 46547e14 Faidon Liambotis
    created = models.DateField()
36 3f04688d Vassilios Karakoidas
    monthly_rate = models.IntegerField()
37 be7b8d37 Vassilios Karakoidas
    user = models.ForeignKey(User, unique=True)
38 46547e14 Faidon Liambotis
    limits = models.ManyToManyField(Limit, through='UserLimit')
39 be7b8d37 Vassilios Karakoidas
    
40 be7b8d37 Vassilios Karakoidas
    class Meta:
41 be7b8d37 Vassilios Karakoidas
        verbose_name = u'Ocean User'
42 be7b8d37 Vassilios Karakoidas
    
43 46547e14 Faidon Liambotis
    def __unicode__(self):
44 46547e14 Faidon Liambotis
        return self.name
45 fa672379 Vassilios Karakoidas
        
46 fa672379 Vassilios Karakoidas
    def allocateCredit(self):
47 fa672379 Vassilios Karakoidas
        """
48 fa672379 Vassilios Karakoidas
        Allocate credits. Add monthly rate to user credit reserve
49 fa672379 Vassilios Karakoidas
        """
50 fa672379 Vassilios Karakoidas
        self.credit = self.credit + self.monthly_rate
51 fa672379 Vassilios Karakoidas
        
52 fcbc5bb3 Vassilios Karakoidas
        # ensure that the user has not more credits than his quota
53 fa672379 Vassilios Karakoidas
        if self.credit > self.quota:
54 fa672379 Vassilios Karakoidas
            self.credit = self.quota
55 07f3219d Vassilios Karakoidas
56 e7164ebc Vassilios Karakoidas
class UserLimit(models.Model):
57 78dec216 Vassilios Karakoidas
    user = models.ForeignKey(OceanUser)
58 46547e14 Faidon Liambotis
    limit = models.ForeignKey(Limit)
59 46547e14 Faidon Liambotis
    value = models.IntegerField()
60 be7b8d37 Vassilios Karakoidas
    
61 46547e14 Faidon Liambotis
    class Meta:
62 46547e14 Faidon Liambotis
        unique_together = ('user', 'limit')
63 be7b8d37 Vassilios Karakoidas
        verbose_name = u'Enforced limits for each user'
64 be7b8d37 Vassilios Karakoidas
    
65 46547e14 Faidon Liambotis
    def __unicode__(self):
66 46547e14 Faidon Liambotis
        return u'Limit %s for user %s: %d' % (self.limit, self.user, self.value)
67 46547e14 Faidon Liambotis
68 e7164ebc Vassilios Karakoidas
69 e7164ebc Vassilios Karakoidas
class Flavor(models.Model):
70 be7b8d37 Vassilios Karakoidas
    cpu = models.IntegerField(default=0)
71 be7b8d37 Vassilios Karakoidas
    ram = models.IntegerField(default=0)
72 be7b8d37 Vassilios Karakoidas
    disk = models.IntegerField(default=0)
73 46547e14 Faidon Liambotis
    cost_active = models.PositiveIntegerField()
74 46547e14 Faidon Liambotis
    cost_inactive = models.PositiveIntegerField()
75 be7b8d37 Vassilios Karakoidas
    
76 be7b8d37 Vassilios Karakoidas
    class Meta:
77 be7b8d37 Vassilios Karakoidas
        verbose_name = u'Virtual Machine flavors'
78 be7b8d37 Vassilios Karakoidas
    
79 be7b8d37 Vassilios Karakoidas
    def _get_name(self):
80 be7b8d37 Vassilios Karakoidas
        return u'c%dr%dd%d' % ( self.cpu, self.ram, self.disk )
81 46547e14 Faidon Liambotis
82 be7b8d37 Vassilios Karakoidas
    name = property(_get_name)
83 00318048 Vassilios Karakoidas
84 46547e14 Faidon Liambotis
    def __unicode__(self):
85 46547e14 Faidon Liambotis
        return self.name
86 46547e14 Faidon Liambotis
87 46547e14 Faidon Liambotis
88 07f3219d Vassilios Karakoidas
class VirtualMachine(models.Model):
89 46547e14 Faidon Liambotis
    name = models.CharField(max_length=255)
90 46547e14 Faidon Liambotis
    created = models.DateTimeField()
91 be7b8d37 Vassilios Karakoidas
    state = models.CharField(choices=vocabs.STATES, max_length=30)
92 be7b8d37 Vassilios Karakoidas
    charged = models.DateTimeField()
93 22571df6 Vassilios Karakoidas
    imageid = models.IntegerField()
94 22571df6 Vassilios Karakoidas
    hostid = models.CharField(max_length=100)
95 22571df6 Vassilios Karakoidas
    server_label = models.CharField(max_length=100)
96 22571df6 Vassilios Karakoidas
    image_version = models.CharField(max_length=100)
97 be7b8d37 Vassilios Karakoidas
    ipfour = models.IPAddressField()
98 be7b8d37 Vassilios Karakoidas
    ipsix = models.CharField(max_length=100)
99 78dec216 Vassilios Karakoidas
    owner = models.ForeignKey(OceanUser)
100 46547e14 Faidon Liambotis
    flavor = models.ForeignKey(Flavor)
101 be7b8d37 Vassilios Karakoidas
    
102 46547e14 Faidon Liambotis
    class Meta:
103 07f3219d Vassilios Karakoidas
        verbose_name = u'Virtual machine instances'
104 46547e14 Faidon Liambotis
        get_latest_by = 'created'
105 be7b8d37 Vassilios Karakoidas
    
106 46547e14 Faidon Liambotis
    def __unicode__(self):
107 46547e14 Faidon Liambotis
        return self.name
108 7cfb3877 Vassilios Karakoidas
109 9dbe70f8 Markos Gogoulos
    def _get_ganeti_id(self):
110 9dbe70f8 Markos Gogoulos
        "Returns the ganeti-prefix + id of the VM, for ganeti"
111 9dbe70f8 Markos Gogoulos
        return '%s%s' % (ganeti_prefix_id, str(self.id))
112 5b32775a Vassilios Karakoidas
113 9dbe70f8 Markos Gogoulos
    ganeti_id = property(_get_ganeti_id)
114 22571df6 Vassilios Karakoidas
115 be7b8d37 Vassilios Karakoidas
class VirtualMachineMetadata(models.Model):
116 be7b8d37 Vassilios Karakoidas
    meta_key = models.CharField(max_length=50)
117 be7b8d37 Vassilios Karakoidas
    meta_value = models.CharField(max_length=500)
118 be7b8d37 Vassilios Karakoidas
    vm = models.ForeignKey(VirtualMachine)
119 be7b8d37 Vassilios Karakoidas
    
120 be7b8d37 Vassilios Karakoidas
    class Meta:
121 be7b8d37 Vassilios Karakoidas
        verbose_name = u'Metadata for virtual machine instances'
122 be7b8d37 Vassilios Karakoidas
    
123 be7b8d37 Vassilios Karakoidas
    def __unicode__(self):
124 be7b8d37 Vassilios Karakoidas
        return u'%s, %s for %s' % ( self.key, self.value, self.vm.name )
125 be7b8d37 Vassilios Karakoidas
126 be7b8d37 Vassilios Karakoidas
127 a09c1220 Vassilios Karakoidas
class AccountingLog(models.Model):
128 46547e14 Faidon Liambotis
    vm = models.ForeignKey(VirtualMachine)
129 46547e14 Faidon Liambotis
    date = models.DateTimeField()
130 be7b8d37 Vassilios Karakoidas
    state = models.CharField(choices=vocabs.STATES, max_length=30)
131 be7b8d37 Vassilios Karakoidas
    
132 46547e14 Faidon Liambotis
    class Meta:
133 46547e14 Faidon Liambotis
        verbose_name = u'Charging log'
134 be7b8d37 Vassilios Karakoidas
135 5b32775a Vassilios Karakoidas
    def __unicode__(self):
136 5b32775a Vassilios Karakoidas
        return u'%s %s %s' % ( self.vm.name, self.date, self.state )
137 38684389 Markos Gogoulos
138 38684389 Markos Gogoulos
139 38684389 Markos Gogoulos
class Image(models.Model):
140 38684389 Markos Gogoulos
    name = models.CharField(max_length=255, help_text=_('description'))
141 38684389 Markos Gogoulos
    updated = models.DateTimeField(help_text=_("Image update date"))
142 38684389 Markos Gogoulos
    created = models.DateTimeField(help_text=_("Image creation date"), default=datetime.datetime.now)
143 38684389 Markos Gogoulos
    state = models.CharField(choices=vocabs.STATES, max_length=30)
144 38684389 Markos Gogoulos
    description = models.TextField(help_text=_('description'))
145 38684389 Markos Gogoulos
    serverid = models.IntegerField(help_text=_('description'))
146 5b32775a Vassilios Karakoidas
    vm = models.ForeignKey(VirtualMachine)
147 38684389 Markos Gogoulos
    
148 38684389 Markos Gogoulos
    class Meta:
149 38684389 Markos Gogoulos
        verbose_name = u'Image'
150 38684389 Markos Gogoulos
151 5b32775a Vassilios Karakoidas
    def __unicode__(self):
152 5b32775a Vassilios Karakoidas
        return u'%s' % ( self.name )