From 4bc09f221dd8e45c934623ee1d76fb5ffbf7580d Mon Sep 17 00:00:00 2001 From: Siobhan Tully Date: Wed, 10 Apr 2013 21:15:21 -0400 Subject: [PATCH] Decomposed models.py into models/ with individual files per topic. Added new admin views, consolidated/reverted views back to Generics, adjusted modeling of Site<->DeploymentNetwork to remove SiteDeploymentNetwork object --- plstackapi/core/admin.py | 115 ++++++++++++++++++-- plstackapi/core/models/__init__.py | 15 +++ plstackapi/core/models/deploymentnetwork.py | 11 ++ plstackapi/core/models/flavor.py | 14 +++ plstackapi/core/models/image.py | 13 +++ plstackapi/core/models/key.py | 15 +++ plstackapi/core/models/node.py | 14 +++ plstackapi/core/models/plcorebase.py | 14 +++ plstackapi/core/models/role.py | 20 ++++ plstackapi/core/models/site.py | 49 +++++++++ plstackapi/core/models/slice.py | 76 +++++++++++++ plstackapi/core/models/sliver.py | 41 +++++++ plstackapi/core/models/subnet.py | 41 +++++++ plstackapi/core/models/user.py | 20 ++++ plstackapi/core/urls.py | 50 ++------- plstackapi/core/views.py | 58 ++++++++++ 16 files changed, 518 insertions(+), 48 deletions(-) create mode 100644 plstackapi/core/models/__init__.py create mode 100644 plstackapi/core/models/deploymentnetwork.py create mode 100644 plstackapi/core/models/flavor.py create mode 100644 plstackapi/core/models/image.py create mode 100644 plstackapi/core/models/key.py create mode 100644 plstackapi/core/models/node.py create mode 100644 plstackapi/core/models/plcorebase.py create mode 100644 plstackapi/core/models/role.py create mode 100644 plstackapi/core/models/site.py create mode 100644 plstackapi/core/models/slice.py create mode 100644 plstackapi/core/models/sliver.py create mode 100644 plstackapi/core/models/subnet.py create mode 100644 plstackapi/core/models/user.py create mode 100644 plstackapi/core/views.py diff --git a/plstackapi/core/admin.py b/plstackapi/core/admin.py index c3b655f..36c1bf9 100644 --- a/plstackapi/core/admin.py +++ b/plstackapi/core/admin.py @@ -1,18 +1,113 @@ +from plstackapi.core.models import Site from plstackapi.core.models import * from django.contrib import admin +from django import forms from django.contrib.auth.admin import UserAdmin -from django.contrib.auth.models import User +from django.contrib.admin.widgets import FilteredSelectMultiple -admin.site.register(Role) -admin.site.register(Site) -#admin.site.register(User) -admin.site.register(Key) -admin.site.register(Slice) -admin.site.register(Node) -admin.site.register(DeploymentNetwork) -admin.site.register(SiteDeploymentNetwork) + +class ReadonlyTabularInline(admin.TabularInline): + can_delete = False + extra = 0 + editable_fields = [] + + def get_readonly_fields(self, request, obj=None): + fields = [] + for field in self.model._meta.get_all_field_names(): + if (not field == 'id'): + if (field not in self.editable_fields): + fields.append(field) + return fields + + def has_add_permission(self, request): + return False + +class SliverInline(admin.TabularInline): + model = Sliver + extra = 0 + +class SiteInline(admin.TabularInline): + model = Site + extra = 0 + +class NodeInline(admin.TabularInline): + model = Node + extra = 0 + +class PlanetStackBaseAdmin(admin.ModelAdmin): + save_on_top = False + +class DeploymentNetworkAdminForm(forms.ModelForm): + sites = forms.ModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + widget=FilteredSelectMultiple( + verbose_name=('Sites'), is_stacked=False + ) + ) + class Meta: + model = DeploymentNetwork + + def __init__(self, *args, **kwargs): + super(DeploymentNetworkAdminForm, self).__init__(*args, **kwargs) + + if self.instance and self.instance.pk: + self.fields['sites'].initial = self.instance.sites.all() + + def save(self, commit=True): + deploymentNetwork = super(DeploymentNetworkAdminForm, self).save(commit=False) + + if commit: + deploymentNetwork.save() + + if deploymentNetwork.pk: + deploymentNetwork.sites = self.cleaned_data['sites'] + self.save_m2m() + + return deploymentNetwork + +class DeploymentNetworkAdmin(PlanetStackBaseAdmin): + form = DeploymentNetworkAdminForm + inlines = [NodeInline,] + +class SiteAdmin(admin.ModelAdmin): + fieldsets = [ + (None, {'fields': ['name', 'site_url', 'enabled', 'is_public', 'login_base']}), + ('Location', {'fields': ['latitude', 'longitude']}), + ('Deployment Networks', {'fields': ['deployments']}) + ] + list_display = ('name', 'login_base','site_url', 'enabled') + filter_horizontal = ('deployments',) + inlines = [NodeInline,] + search_fields = ['name'] + +class SliceAdmin(PlanetStackBaseAdmin): + fields = ['name', 'site', 'instantiation', 'description', 'slice_url'] + list_display = ('name', 'site','slice_url', 'instantiation') + inlines = [SliverInline] + +class SubnetAdmin(admin.ModelAdmin): + fields = ['cidr', 'ip_version', 'start', 'end', 'slice'] + +class ImageAdmin(admin.ModelAdmin): + fields = ['image_id', 'name', 'disk_format', 'container_format'] + +class NodeAdmin(admin.ModelAdmin): + list_display = ('name', 'site', 'deploymentNetwork') + list_filter = ('deploymentNetwork',) + +admin.site.register(Site, SiteAdmin) +admin.site.register(SitePrivilege) +admin.site.register(Slice, SliceAdmin) +admin.site.register(SliceMembership) +admin.site.register(Subnet, SubnetAdmin) +admin.site.register(Image, ImageAdmin) +admin.site.register(Node, NodeAdmin) admin.site.register(Sliver) -admin.site.register(Image) admin.site.register(Flavor) +admin.site.register(Key) +admin.site.register(Role) +admin.site.register(User) +admin.site.register(DeploymentNetwork, DeploymentNetworkAdmin) diff --git a/plstackapi/core/models/__init__.py b/plstackapi/core/models/__init__.py new file mode 100644 index 0000000..1ecda7e --- /dev/null +++ b/plstackapi/core/models/__init__.py @@ -0,0 +1,15 @@ +from .plcorebase import PlCoreBase +from .deploymentnetwork import DeploymentNetwork +from .site import Site +from .site import SitePrivilege +from .flavor import Flavor +from .image import Image +from .user import User +from .role import Role +from .key import Key +from .node import Node +from .slice import Slice +from .slice import SliceMembership +from .sliver import Sliver +from .subnet import Subnet + diff --git a/plstackapi/core/models/deploymentnetwork.py b/plstackapi/core/models/deploymentnetwork.py new file mode 100644 index 0000000..740be33 --- /dev/null +++ b/plstackapi/core/models/deploymentnetwork.py @@ -0,0 +1,11 @@ +import os +from django.db import models +from plstackapi.core.models import PlCoreBase + +# Create your models here. + +class DeploymentNetwork(PlCoreBase): + name = models.CharField(max_length=200, unique=True, help_text="Name of the Deployment Network") + + def __unicode__(self): return u'%s' % (self.name) + diff --git a/plstackapi/core/models/flavor.py b/plstackapi/core/models/flavor.py new file mode 100644 index 0000000..3081f82 --- /dev/null +++ b/plstackapi/core/models/flavor.py @@ -0,0 +1,14 @@ +import os +from django.db import models +from plstackapi.core.models import PlCoreBase + +# Create your models here. + +class Flavor(PlCoreBase): + flavor_id = models.IntegerField(unique=True) + name = models.CharField(max_length=256, unique=True) + memory_mb = models.IntegerField() + disk_gb = models.IntegerField() + vcpus = models.IntegerField() + + def __unicode__(self): return u'%s' % (self.name) diff --git a/plstackapi/core/models/image.py b/plstackapi/core/models/image.py new file mode 100644 index 0000000..930b7df --- /dev/null +++ b/plstackapi/core/models/image.py @@ -0,0 +1,13 @@ +import os +from django.db import models +from plstackapi.core.models import PlCoreBase + +# Create your models here. + +class Image(PlCoreBase): + image_id = models.CharField(max_length=256, unique=True) + name = models.CharField(max_length=256, unique=True) + disk_format = models.CharField(max_length=256) + container_format = models.CharField(max_length=256) + + def __unicode__(self): return u'%s' % (self.name) diff --git a/plstackapi/core/models/key.py b/plstackapi/core/models/key.py new file mode 100644 index 0000000..d0a0a07 --- /dev/null +++ b/plstackapi/core/models/key.py @@ -0,0 +1,15 @@ +import os +from django.db import models +from plstackapi.core.models import PlCoreBase +from plstackapi.core.models import User + +# Create your models here. + +class Key(PlCoreBase): + name = models.CharField(max_length=256, unique=True) + key = models.CharField(max_length=512) + type = models.CharField(max_length=256) + blacklisted = models.BooleanField(default=False) + user = models.ForeignKey(User, related_name='keys') + + def __unicode__(self): return u'%s' % (self.name) diff --git a/plstackapi/core/models/node.py b/plstackapi/core/models/node.py new file mode 100644 index 0000000..a4252b1 --- /dev/null +++ b/plstackapi/core/models/node.py @@ -0,0 +1,14 @@ +import os +from django.db import models +from plstackapi.core.models import PlCoreBase +from plstackapi.core.models import Site +from plstackapi.core.models import DeploymentNetwork + +# Create your models here. + +class Node(PlCoreBase): + name = models.CharField(max_length=200, unique=True, help_text="Name of the Node") + site = models.ForeignKey(Site, related_name='nodes') + deploymentNetwork = models.ForeignKey(DeploymentNetwork, related_name='nodes') + + def __unicode__(self): return u'%s' % (self.name) diff --git a/plstackapi/core/models/plcorebase.py b/plstackapi/core/models/plcorebase.py new file mode 100644 index 0000000..52aa0f7 --- /dev/null +++ b/plstackapi/core/models/plcorebase.py @@ -0,0 +1,14 @@ +import os +from django.db import models + +class PlCoreBase(models.Model): + + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) + + class Meta: + abstract = True + app_label = "core" + + + diff --git a/plstackapi/core/models/role.py b/plstackapi/core/models/role.py new file mode 100644 index 0000000..7b3268c --- /dev/null +++ b/plstackapi/core/models/role.py @@ -0,0 +1,20 @@ +import os +import datetime +from django.db import models +from plstackapi.core.models import PlCoreBase + +# Create your models here. + +class Role(PlCoreBase): + + ROLE_CHOICES = (('admin', 'Admin'), ('pi', 'Principle Investigator'), ('user','User')) + role_id = models.CharField(max_length=256, unique=True) + role_type = models.CharField(max_length=80, unique=True, choices=ROLE_CHOICES) + + def __unicode__(self): return u'%s' % (self.role_type) + + def save(self): + if not self.id: + self.created = datetime.date.today() + self.updated = datetime.datetime.today() + super(Role, self).save() diff --git a/plstackapi/core/models/site.py b/plstackapi/core/models/site.py new file mode 100644 index 0000000..5ec04c4 --- /dev/null +++ b/plstackapi/core/models/site.py @@ -0,0 +1,49 @@ +import os +from django.db import models +from plstackapi.core.models import PlCoreBase +from plstackapi.core.models import DeploymentNetwork + +from plstackapi.openstack.driver import OpenStackDriver + +# Create your models here. + + +class Site(PlCoreBase): + + tenant_id = models.CharField(max_length=200, help_text="Keystone tenant id") + name = models.CharField(max_length=200, help_text="Name for this Site") + site_url = models.URLField(null=True, blank=True, max_length=512, help_text="Site's Home URL Page") + enabled = models.BooleanField(default=True, help_text="Status for this Site") + longitude = models.FloatField(null=True, blank=True) + latitude = models.FloatField(null=True, blank=True) + login_base = models.CharField(max_length=50, unique=True, help_text="Prefix for Slices associated with this Site") + is_public = models.BooleanField(default=True, help_text="Indicates the visibility of this site to other members") + abbreviated_name = models.CharField(max_length=80) + + deployments = models.ManyToManyField(DeploymentNetwork, blank=True, related_name='sites') + + def __unicode__(self): return u'%s' % (self.name) + +class SitePrivilege(PlCoreBase): + + user = models.ForeignKey('User', related_name='site_privileges') + site = models.ForeignKey('Site', related_name='site_privileges') + role = models.ForeignKey('Role') + + def __unicode__(self): return u'%s %s %s' % (self.site, self.user, self.role) + + def save(self, *args, **kwds): + driver = OpenStackDriver() + driver.add_user_role(user_id=user.user_id, + tenant_id=site.tenant_id, + role_name=role.name) + super(SitePrivilege, self).save(*args, **kwds) + + def delete(self, *args, **kwds): + driver = OpenStackDriver() + driver.delete_user_role(user_id=user.user_id, + tenant_id=site.tenant_id, + role_name=role.name) + super(SitePrivilege, self).delete(*args, **kwds) + + diff --git a/plstackapi/core/models/slice.py b/plstackapi/core/models/slice.py new file mode 100644 index 0000000..24c44a6 --- /dev/null +++ b/plstackapi/core/models/slice.py @@ -0,0 +1,76 @@ +import os +from django.db import models +from plstackapi.core.models import PlCoreBase +from plstackapi.core.models import Site +from plstackapi.core.models import User +from plstackapi.core.models import Role +from plstackapi.core.models import DeploymentNetwork + +from plstackapi.openstack.driver import OpenStackDriver + +# Create your models here. + +class Slice(PlCoreBase): + tenant_id = models.CharField(max_length=200, help_text="Keystone tenant id") + name = models.CharField(help_text="The Name of the Slice", max_length=80) + enabled = models.BooleanField(default=True, help_text="Status for this Slice") + SLICE_CHOICES = (('plc', 'PLC'), ('delegated', 'Delegated'), ('controller','Controller'), ('none','None')) + instantiation = models.CharField(help_text="The instantiation type of the slice", max_length=80, choices=SLICE_CHOICES) + omf_friendly = models.BooleanField() + description=models.TextField(blank=True,help_text="High level description of the slice and expected activities", max_length=1024) + slice_url = models.URLField(blank=True, max_length=512) + site = models.ForeignKey(Site, related_name='slices', help_text="The Site this Node belongs too") + network_id = models.CharField(max_length=256, help_text="Quantum network") + router_id = models.CharField(max_length=256, help_text="Quantum router id") + + def __unicode__(self): return u'%s' % (self.name) + + def save(self, *args, **kwds): + # sync keystone tenant + driver = OpenStackDriver() + + if not self.id: + tenant = driver.create_tenant(tenant_name=self.name, + description=self.description, + enabled=self.enabled) + self.tenant_id = tenant.id + + # create a network + network = driver.create_network(name=self.name) + self.network_id = network['id'] + # create router + router = driver.create_router(name=self.name) + self.router_id = router['id'] + +/bin/sh: 1: command not found + # update record + self.driver.update_tenant(self.tenant_id, name=self.name, + description=self.description, enabled=self.enabled) + super(Slice, self).save(*args, **kwds) + + def delete(self, *args, **kwds): + # delete keystone tenant + driver = OpenStackDriver() + driver.delete_tenant(self.tenant_id) + super(Slice, self).delete(*args, **kwds) + +class SliceMembership(PlCoreBase): + user = models.ForeignKey('User', related_name='slice_memberships') + slice = models.ForeignKey('Slice', related_name='slice_memberships') + role = models.ForeignKey('Role') + + def __unicode__(self): return u'%s %s %s' % (self.slice, self.user, self.role) + + def save(self, *args, **kwds): + driver = OpenStackDriver() + driver.add_user_role(user_id=user.user_id, + tenant_id=slice.tenant_id, + role_name=role.name) + super(SliceMembership, self).save(*args, **kwds) + + def delete(self, *args, **kwds): + driver = OpenStackDriver() + driver.delete_user_role(user_id=user.user_id, + tenant_id=slice.tenant_id, + role_name=role.name) + super(SliceMembership, self).delete(*args, **kwds) diff --git a/plstackapi/core/models/sliver.py b/plstackapi/core/models/sliver.py new file mode 100644 index 0000000..6f7aabe --- /dev/null +++ b/plstackapi/core/models/sliver.py @@ -0,0 +1,41 @@ +import os +from django.db import models +from plstackapi.core.models import PlCoreBase +from plstackapi.core.models import Flavor +from plstackapi.core.models import Image +from plstackapi.core.models import Key +from plstackapi.core.models import Slice +from plstackapi.core.models import Node +from plstackapi.core.models import Site +from plstackapi.core.models import DeploymentNetwork +from plstackapi.openstack.driver import OpenStackDriver + +# Create your models here. +class Sliver(PlCoreBase): + instance_id = models.CharField(max_length=200, help_text="Nova instance id") + name = models.CharField(max_length=200, help_text="Sliver name") + flavor = models.ForeignKey(Flavor, related_name='sliver_flavor') + image = models.ForeignKey(Image, related_name='sliver_image') + key = models.ForeignKey(Key, related_name='sliver_key') + slice = models.ForeignKey(Slice, related_name='sliver_slice') + node = models.ForeignKey(Node, related_name='sliver_node') + site = models.ForeignKey(Site, related_name='sliver_site') + deploymentNetwork = models.ForeignKey(DeploymentNetwork, related_name='sliver_deploymentNetwork') + + def __unicode__(self): return u'%s::%s' % (self.slice, self.siteDeploymentNetwork) + + def save(self, *args, **kwds): + driver = OpenStackDriver() + instance = driver.spawn_instances(name=self.name, + keyname=self.name, + hostnames=self.node.name, + flavor=self.flavor.name, + image=self.image.name) + self.instance_id = instance.id + super(Sliver, self).save(*args, **kwds) + + def delete(self, *args, **kwds): + driver = OpenStackDriver() + driver.destroy_instance(name=self.name, id=self.instance_id) + super(Sliver, self).delete(*args, **kwds) + diff --git a/plstackapi/core/models/subnet.py b/plstackapi/core/models/subnet.py new file mode 100644 index 0000000..291ffe8 --- /dev/null +++ b/plstackapi/core/models/subnet.py @@ -0,0 +1,41 @@ +import os +from django.db import models +from plstackapi.core.models import PlCoreBase +from plstackapi.core.models import Slice +from plstackapi.openstack.driver import OpenStackDriver + +# Create your models here. + +class Subnet(PlCoreBase): + subnet_id = models.CharField(max_length=256, unique=True) + cidr = models.CharField(max_length=20) + ip_version = models.IntegerField() + start = models.IPAddressField() + end = models.IPAddressField() + slice = models.ForeignKey(Slice, related_name='slice_subnet') + + def __unicode__(self): return u'%s' % (self.name) + + def save(self, *args, **kwargs): + driver = OpenStackDriver() + if not self.id: + subnet = driver.create_subnet(network_name=self.slice.name, + cidr_ip = self.cidr, + ip_version=self.ip_version, + start = self.start, + end = self.end) + + self.subnet_id = subnet.id + + # add subnet as interface to slice router + driver.add_router_interface(self.slice.router_id, subnet.id) + + super(Subnet, self).save(*args, **kwargs) + + + def delete(self, *args, **kwargs): + # delete quantum network + driver = OpenStackDriver() + driver.delete_subnet(self.subnet_id) + driver.delete_router_interface(self.slice.router_id, self.subnet.id) + super(Subnet, self).delete(*args, **kwargs) diff --git a/plstackapi/core/models/user.py b/plstackapi/core/models/user.py new file mode 100644 index 0000000..765fb62 --- /dev/null +++ b/plstackapi/core/models/user.py @@ -0,0 +1,20 @@ +import os +import datetime +from django.db import models +from plstackapi.core.models import PlCoreBase +from plstackapi.core.models import Site + +# Create your models here. + +class User(PlCoreBase): + user_id = models.CharField(max_length=256, unique=True) + firstname = models.CharField(help_text="person's given name", max_length=200) + lastname = models.CharField(help_text="person's surname", max_length=200) + email = models.EmailField(help_text="e-mail address") + phone = models.CharField(null=True, blank=True, help_text="phone number contact", max_length=100) + user_url = models.URLField(null=True, blank=True) + is_admin = models.BooleanField(default=False) + enabled = models.BooleanField(default=True, help_text="Status for this User") + site = models.ForeignKey(Site, related_name='users', verbose_name="Site this user will be homed too") + + def __unicode__(self): return u'%s' % (self.email) diff --git a/plstackapi/core/urls.py b/plstackapi/core/urls.py index 5a97354..e4bf5c3 100644 --- a/plstackapi/core/urls.py +++ b/plstackapi/core/urls.py @@ -2,16 +2,9 @@ from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: from django.contrib import admin -from plstackapi.core.views.roles import RoleListCreate, RoleRetrieveUpdateDestroy -from plstackapi.core.views.sites import SiteListCreate, SiteRetrieveUpdateDestroy -from plstackapi.core.views.users import UserListCreate, UserRetrieveUpdateDestroy -from plstackapi.core.views.slices import SliceListCreate, SliceRetrieveUpdateDestroy -from plstackapi.core.views.keys import KeyListCreate, KeyRetrieveUpdateDestroy -from plstackapi.core.views.deployment_networks import DeploymentNetworkListCreate, DeploymentNetworkRetrieveUpdateDestroy -from plstackapi.core.views.images import ImageListCreate, ImageRetrieveUpdateDestroy -from plstackapi.core.views.flavors import FlavorListCreate, FlavorRetrieveUpdateDestroy +from plstackapi.core import views +from plstackapi.core.views import api_root from plstackapi.core.models import Site -from plstackapi.core.api_root import api_root from rest_framework import generics admin.autodiscover() @@ -28,41 +21,22 @@ urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), url(r'^plstackapi/$', api_root), - - url(r'^plstackapi/roles/$', RoleListCreate.as_view(), name='role-list'), - url(r'^plstackapi/roles/(?P[a-zA-Z0-9]+)/$', RoleRetrieveUpdateDestroy.as_view(), name='role-detail'), - - url(r'^plstackapi/users/$', UserListCreate.as_view(), name='user-list'), - url(r'^plstackapi/users/(?P[a-zA-Z0-9]+)/$', UserRetrieveUpdateDestroy.as_view(), name='user-detail'), - - url(r'^plstackapi/keys/$', KeyListCreate.as_view(), name='key-list'), - url(r'^plstackapi/keys/(?P[a-zA-Z0-9]+)/$', KeyRetrieveUpdateDestroy.as_view(), name='key-detail'), - - url(r'^plstackapi/sites/$', SiteListCreate.as_view(), name='site-list'), - url(r'^plstackapi/sites/(?P[a-zA-Z0-9_]+)/$', SiteRetrieveUpdateDestroy.as_view(), name='site-detail'), + url(r'^plstackapi/sites/$', views.SiteList.as_view(), name='site-list'), + url(r'^plstackapi/sites/(?P[0-9]+)/$', views.SiteDetail.as_view(), name='site-detail'), + url(r'^plstackapi/slices/$', views.SliceList.as_view(), name='slice-list'), + url(r'^plstackapi/slices/(?P[0-9]+)/$', views.SliceDetail.as_view(), name='slice-detail'), - url(r'^plstackapi/slices/$', SliceListCreate.as_view(), name='slice-list'), - url(r'^plstackapi/slices/(?P[0-9]+)/$', SliceRetrieveUpdateDestroy.as_view(), name='slice-detail'), + url(r'^plstackapi/slivers/$', views.SliverList.as_view()), + url(r'^plstackapi/slivers/(?P[0-9]+)/$', views.SliverDetail.as_view()), - #url(r'^plstackapi/slivers/$', views.SliverList.as_view()), - #url(r'^plstackapi/slivers/(?P[0-9]+)/$', views.SliverDetail.as_view()), - - #url(r'^plstackapi/nodes/$', views.NodeList.as_view(), name='node-list'), - #url(r'^plstackapi/nodes/(?P[0-9]+)/$', views.NodeDetail.as_view(), name='node-detail'), - - - url(r'^plstackapi/deploymentnetworks/$', DeploymentNetworkListCreate.as_view(), name='deploymentnetwork-list'), - url(r'^plstackapi/deploymentnetworks/(?P[a-zA-Z0-9]+)/$', DeploymentNetworkRetrieveUpdateDestroy.as_view(), name='deploymentnetwork-detail'), + url(r'^plstackapi/nodes/$', views.NodeList.as_view(), name='node-list'), + url(r'^plstackapi/nodes/(?P[0-9]+)/$', views.NodeDetail.as_view(), name='node-detail'), - #url(r'^plstackapi/sitedeploymentnetworks/$', views.SiteDeploymentNetworkList.as_view(), name='sitedeploymentnetwork-list'), - #url(r'^plstackapi/sitedeploymentnetworks/(?P[0-9]+)/$', views.SiteDeploymentNetworkDetail.as_view(), name='sitedeploymentnetwork-detail'), + url(r'^plstackapi/deploymentnetworks/$', views.DeploymentNetworkList.as_view(), name='deploymentnetwork-list'), + url(r'^plstackapi/deploymentnetworks/(?P[0-9]+)/$', views.DeploymentNetworkDetail.as_view(), name='deploymentnetwork-detail'), - url(r'^plstackapi/images/$', ImageListCreate.as_view(), name='image-list'), - url(r'^plstackapi/images/(?P[a-zA-Z0-9_]+)/$', ImageRetrieveUpdateDestroy.as_view(), name='image-detail'), - url(r'^plstackapi/flavors/$', FlavorListCreate.as_view(), name='flavor-list'), - url(r'^plstackapi/flavors/(?P[a-zA-Z0-9_]+)/$', FlavorRetrieveUpdateDestroy.as_view(), name='flavor-detail'), #Adding in rest_framework urls url(r'^plstackapi/', include('rest_framework.urls', namespace='rest_framework')), diff --git a/plstackapi/core/views.py b/plstackapi/core/views.py new file mode 100644 index 0000000..c2730bb --- /dev/null +++ b/plstackapi/core/views.py @@ -0,0 +1,58 @@ +# Create your views here. + +from plstackapi.core.models import Site +from serializers import * +from rest_framework import generics +from rest_framework.decorators import api_view +from rest_framework.response import Response +from rest_framework.reverse import reverse +from rest_framework import renderers + +@api_view(['GET']) +def api_root(request, format=None): + return Response({ + 'nodes': reverse('node-list', request=request, format=format), + 'sites': reverse('site-list', request=request, format=format), + 'deploymentNetworks': reverse('deploymentnetwork-list', request=request, format=format), + 'slices': reverse('slice-list', request=request, format=format) + }) + +class SiteList(generics.ListCreateAPIView): + model=Site + serializer_class = SiteSerializer + +class SiteDetail(generics.RetrieveUpdateDestroyAPIView): + model = Site + serializer_class = SiteSerializer + +class SliceList(generics.ListCreateAPIView): + model=Slice + serializer_class = SliceSerializer + +class SliceDetail(generics.RetrieveUpdateDestroyAPIView): + model = Slice + serializer_class = SliceSerializer + +class NodeList(generics.ListCreateAPIView): + model=Node + serializer_class = NodeSerializer + +class NodeDetail(generics.RetrieveUpdateDestroyAPIView): + model = Node + serializer_class = NodeSerializer + +class SliverList(generics.ListCreateAPIView): + model=Sliver + serializer_class = SliverSerializer + +class SliverDetail(generics.RetrieveUpdateDestroyAPIView): + model = Sliver + serializer_class = SliverSerializer + +class DeploymentNetworkList(generics.ListCreateAPIView): + model=DeploymentNetwork + serializer_class = DeploymentNetworkSerializer + +class DeploymentNetworkDetail(generics.RetrieveUpdateDestroyAPIView): + model = DeploymentNetwork + serializer_class = DeploymentNetworkSerializer -- 2.47.0