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