Statistics
| Branch: | Tag: | Revision:

root / db / models.py @ fcbc5bb3

History | View | Annotate | Download (4.5 kB)

1
# vim: ts=4 sts=4 et ai sw=4 fileencoding=utf-8
2

    
3
from django.conf import settings
4
from django.db import models
5
from django.contrib.auth.models import User
6
from django.utils.translation import gettext_lazy as _
7

    
8
import datetime
9

    
10
import vocabs
11

    
12
ganeti_prefix_id = settings.GANETI_PREFIX_ID
13

    
14

    
15
def id_from_instance_name(name):    
16
    "Returns VirtualMachine's Django id, given a ganeti machine name"
17
    "Strips the ganeti prefix atm. Needs a better name!"
18
    return '%s' % (str(name).strip(ganeti_prefix_id))
19

    
20

    
21
class Limit(models.Model):
22
    description = models.CharField(max_length=45)
23
    
24
    class Meta:
25
        verbose_name = u'Available limits for users'
26
    
27
    def __unicode__(self):
28
        return self.description
29

    
30

    
31
class OceanUser(models.Model):
32
    name = models.CharField(max_length=255)
33
    credit = models.IntegerField()
34
    quota = models.IntegerField()
35
    created = models.DateField()
36
    monthly_rate = models.IntegerField()
37
    user = models.ForeignKey(User, unique=True)
38
    limits = models.ManyToManyField(Limit, through='UserLimit')
39
    
40
    class Meta:
41
        verbose_name = u'Ocean User'
42
    
43
    def __unicode__(self):
44
        return self.name
45
        
46
    def allocateCredit(self):
47
        """
48
        Allocate credits. Add monthly rate to user credit reserve
49
        """
50
        self.credit = self.credit + self.monthly_rate
51
        
52
        # ensure that the user has not more credits than his quota
53
        if self.credit > self.quota:
54
            self.credit = self.quota
55

    
56
class UserLimit(models.Model):
57
    user = models.ForeignKey(OceanUser)
58
    limit = models.ForeignKey(Limit)
59
    value = models.IntegerField()
60
    
61
    class Meta:
62
        unique_together = ('user', 'limit')
63
        verbose_name = u'Enforced limits for each user'
64
    
65
    def __unicode__(self):
66
        return u'Limit %s for user %s: %d' % (self.limit, self.user, self.value)
67

    
68

    
69
class Flavor(models.Model):
70
    cpu = models.IntegerField(default=0)
71
    ram = models.IntegerField(default=0)
72
    disk = models.IntegerField(default=0)
73
    cost_active = models.PositiveIntegerField()
74
    cost_inactive = models.PositiveIntegerField()
75
    
76
    class Meta:
77
        verbose_name = u'Virtual Machine flavors'
78
    
79
    def _get_name(self):
80
        return u'c%dr%dd%d' % ( self.cpu, self.ram, self.disk )
81

    
82
    name = property(_get_name)
83

    
84
    def __unicode__(self):
85
        return self.name
86

    
87

    
88
class VirtualMachine(models.Model):
89
    name = models.CharField(max_length=255)
90
    created = models.DateTimeField()
91
    state = models.CharField(choices=vocabs.STATES, max_length=30)
92
    charged = models.DateTimeField()
93
    imageid = models.IntegerField()
94
    hostid = models.CharField(max_length=100)
95
    server_label = models.CharField(max_length=100)
96
    image_version = models.CharField(max_length=100)
97
    ipfour = models.IPAddressField()
98
    ipsix = models.CharField(max_length=100)
99
    owner = models.ForeignKey(OceanUser)
100
    flavor = models.ForeignKey(Flavor)
101
    
102
    class Meta:
103
        verbose_name = u'Virtual machine instances'
104
        get_latest_by = 'created'
105
    
106
    def __unicode__(self):
107
        return self.name
108

    
109
    def _get_ganeti_id(self):
110
        "Returns the ganeti-prefix + id of the VM, for ganeti"
111
        return '%s%s' % (ganeti_prefix_id, str(self.id))
112

    
113
    ganeti_id = property(_get_ganeti_id)
114

    
115
class VirtualMachineMetadata(models.Model):
116
    meta_key = models.CharField(max_length=50)
117
    meta_value = models.CharField(max_length=500)
118
    vm = models.ForeignKey(VirtualMachine)
119
    
120
    class Meta:
121
        verbose_name = u'Metadata for virtual machine instances'
122
    
123
    def __unicode__(self):
124
        return u'%s, %s for %s' % ( self.key, self.value, self.vm.name )
125

    
126

    
127
class AccountingLog(models.Model):
128
    vm = models.ForeignKey(VirtualMachine)
129
    date = models.DateTimeField()
130
    state = models.CharField(choices=vocabs.STATES, max_length=30)
131
    
132
    class Meta:
133
        verbose_name = u'Charging log'
134

    
135
    def __unicode__(self):
136
        return u'%s %s %s' % ( self.vm.name, self.date, self.state )
137

    
138

    
139
class Image(models.Model):
140
    name = models.CharField(max_length=255, help_text=_('description'))
141
    updated = models.DateTimeField(help_text=_("Image update date"))
142
    created = models.DateTimeField(help_text=_("Image creation date"), default=datetime.datetime.now)
143
    state = models.CharField(choices=vocabs.STATES, max_length=30)
144
    description = models.TextField(help_text=_('description'))
145
    serverid = models.IntegerField(help_text=_('description'))
146
    vm = models.ForeignKey(VirtualMachine)
147
    
148
    class Meta:
149
        verbose_name = u'Image'
150

    
151
    def __unicode__(self):
152
        return u'%s' % ( self.name )