Revision a31ff6cb

b/api/handlers.py
8 8
from synnefo.api.faults import fault, noContent, accepted, created
9 9
from synnefo.api.helpers import instance_to_server, paginator
10 10
from synnefo.util.rapi import GanetiRapiClient, GanetiApiError
11
from synnefo.db.models import VirtualMachine, Flavor, Image, User, id_from_instance_name
11
from synnefo.db.models import *
12 12
from util.rapi import GanetiRapiClient
13 13

  
14 14

  
......
283 283
        return noContent
284 284

  
285 285

  
286
class VirtualMachineGroupHandler(BaseHandler):
287
    allowed_methods = ('GET', 'POST', 'DELETE')
288

  
289
    def read(self, request, id=None):
290
        """List Groups"""
291
        vmgroups = VirtualMachineGroup.objects.all() 
292
        vmgroups = [ {'id': vmgroup.id, \
293
              'name': vmgroup.name,  \
294
               'server_id': [machine.id for machine in vmgroup.machines.all()] \
295
               } for vmgroup in vmgroups]
296
        if rapi: # Group info is stored in the DB. Ganeti is not aware of this
297
            if id == "detail":
298
                return { "groups": vmgroups }
299
            elif id is None:
300
                return { "groups": [ { "id": s['id'], "name": s['name'] } for s in vmgroups ] }
301
            else:
302
                return { "groups": vmgroups[0] }
303

  
304

  
305
    def create(self, request, id):
306
        """Creates a Group"""
307
        return created
308

  
309
    def delete(self, request, id):
310
        """Deletes a  Group"""
311
        return noContent
312

  
313

  
314

  
286 315
class LimitHandler(BaseHandler):
287 316
    allowed_methods = ('GET',)
288 317

  
b/api/urls.py
23 23
flavor_handler = Resource(FlavorHandler, auth)
24 24
image_handler = Resource(ImageHandler, auth)
25 25
shared_ip_group_handler = Resource(SharedIPGroupHandler, auth)
26
virtual_machine_group_handler = Resource(VirtualMachineGroupHandler, auth)
26 27

  
27 28
def url_with_format(regex, *args, **kwargs):
28 29
    if regex[-1] == '$':
......
45 46
    url_with_format(r'^images/(?P<id>[^/]+)$', image_handler),
46 47
    url_with_format(r'^shared_ip_groups$', shared_ip_group_handler),
47 48
    url_with_format(r'^shared_ip_groups/(?P<id>[^/]+)$', shared_ip_group_handler),
49
    url_with_format(r'^virtual_machine_groups$', virtual_machine_group_handler),
50
    url_with_format(r'^virtual_machine_groups/(?P<id>[^/]+)$', virtual_machine_group_handler),
48 51
    url(r'^.+', notFound), # catch-all
49 52
)
50 53

  
b/db/admin.py
42 42

  
43 43
    form = VirtualMachineForm
44 44

  
45
class VirtualMachineGroupForm(forms.ModelForm):
46
    class Meta:
47
        model = VirtualMachineGroup
48

  
49
class VirtualMachineGroupAdmin(admin.ModelAdmin):
50
    ""    
51

  
52
    form = VirtualMachineGroupForm
45 53

  
46 54
class AccountingLogForm(forms.ModelForm):
47 55
    class Meta:
......
74 82
admin.site.register(UserLimit, UserLimitAdmin)
75 83
admin.site.register(Flavor, FlavorAdmin)
76 84
admin.site.register(VirtualMachine, VirtualMachineAdmin)
85
admin.site.register(VirtualMachineGroup, VirtualMachineGroupAdmin)
77 86
admin.site.register(AccountingLog, AccountingLogAdmin)
78 87
admin.site.register(Image, ImageAdmin)
79 88

  
b/db/models.py
164 164
    backend_id = property(_get_backend_id)
165 165

  
166 166

  
167
class VirtualMachineGroup(models.Model):
168
    "Groups of VM's for OceanUsers"
169
    name = models.CharField(max_length=255)
170
    owner = models.ForeignKey(User)
171
    machines = models.ManyToManyField(VirtualMachine)
172
    created = models.DateTimeField(help_text=_("Group creation date"), default=datetime.datetime.now)
173

  
174
    class Meta:
175
        verbose_name = u'Virtual Machine Group'
176
        verbose_name_plural = 'Virtual Machine Groups'
177
        ordering = ['name']
178
    
179
    def __unicode__(self):
180
        return self.name
181

  
167 182
class VirtualMachineMetadata(models.Model):
168 183
    meta_key = models.CharField(max_length=50)
169 184
    meta_value = models.CharField(max_length=500)

Also available in: Unified diff