From 7a61dc4281a01fe1be001b4501080f8ceeaecbe3 Mon Sep 17 00:00:00 2001 From: Scott Baker Date: Tue, 2 Sep 2014 17:08:20 -0700 Subject: [PATCH] replace sliver.numberCores with sliver.Flavor, add flavor filtering by deployment to sliver inline --- planetstack/core/admin.py | 26 ++++++-------- planetstack/core/models/__init__.py | 2 +- planetstack/core/models/flavor.py | 2 +- planetstack/core/models/sliver.py | 26 +++++++++++++- .../admin/core/slice/change_form.html | 36 +++++++++++++++++-- 5 files changed, 72 insertions(+), 20 deletions(-) diff --git a/planetstack/core/admin.py b/planetstack/core/admin.py index 1c42013..fad99a0 100644 --- a/planetstack/core/admin.py +++ b/planetstack/core/admin.py @@ -266,7 +266,7 @@ class NetworkLookerUpper: class SliverInline(PlStackTabularInline): model = Sliver - fields = ['backend_status_icon', 'all_ips_string', 'instance_name', 'slice', 'numberCores', 'deploymentNetwork', 'image', 'node'] + fields = ['backend_status_icon', 'all_ips_string', 'instance_name', 'slice', 'deploymentNetwork', 'flavor', 'image', 'node'] extra = 0 readonly_fields = ['backend_status_icon', 'all_ips_string', 'instance_name'] suit_classes = 'suit-tab suit-tab-slivers' @@ -277,13 +277,7 @@ class SliverInline(PlStackTabularInline): def formfield_for_foreignkey(self, db_field, request=None, **kwargs): if db_field.name == 'deploymentNetwork': kwargs['queryset'] = Deployment.select_by_acl(request.user) - # the inscrutable jquery selector below says: - # find the closest parent "tr" to the current element - # then find the child with class "field-node" - # then find the child with that is a select - # then return its id - kwargs['widget'] = forms.Select(attrs={'onChange': "update_nodes(this, $($(this).closest('tr')[0]).find('.field-node select')[0].id)"}) - #kwargs['widget'] = forms.Select(attrs={'onChange': "console.log($($($(this).closest('tr')[0]).children('.field-node')[0]).children('select')[0].id);"}) + kwargs['widget'] = forms.Select(attrs={'onChange': "sliver_deployment_changed(this);"}) field = super(SliverInline, self).formfield_for_foreignkey(db_field, request, **kwargs) @@ -759,19 +753,21 @@ class SliceAdmin(PlanetStackBaseAdmin): ) def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None): - #deployment_nodes = {} - #for node in Node.objects.all(): - # deployment_nodes[node.deployment.id] = get(deployment_nodes, node.deployment.id, []).append( (node.id, node.name) ) - deployment_nodes = [] for node in Node.objects.all(): deployment_nodes.append( (node.deployment.id, node.id, node.name) ) + deployment_flavors = [] + for flavor in Flavor.objects.all(): + for deployment in flavor.deployments.all(): + deployment_flavors.append( (deployment.id, flavor.id, flavor.name) ) + sites = {} for site in Site.objects.all(): sites[site.id] = site.login_base context["deployment_nodes"] = deployment_nodes + context["deployment_flavors"] = deployment_flavors context["sites"] = sites return super(SliceAdmin, self).render_change_form(request, context, add, change, form_url, obj) @@ -900,10 +896,10 @@ class TagAdmin(PlanetStackBaseAdmin): class SliverAdmin(PlanetStackBaseAdmin): form = SliverForm fieldsets = [ - ('Sliver Details', {'fields': ['backend_status_text', 'slice', 'deploymentNetwork', 'node', 'ip', 'instance_name', 'numberCores', 'image', ], 'classes': ['suit-tab suit-tab-general'], }) + ('Sliver Details', {'fields': ['backend_status_text', 'slice', 'deploymentNetwork', 'node', 'ip', 'instance_name', 'flavor', 'image', ], 'classes': ['suit-tab suit-tab-general'], }) ] readonly_fields = ('backend_status_text', ) - list_display = ['backend_status_icon', 'ip', 'instance_name', 'slice', 'numberCores', 'image', 'node', 'deploymentNetwork'] + list_display = ['backend_status_icon', 'ip', 'instance_name', 'slice', 'flavor', 'image', 'node', 'deploymentNetwork'] list_display_links = ('backend_status_icon', 'ip',) suit_form_tabs =(('general', 'Sliver Details'), @@ -912,7 +908,7 @@ class SliverAdmin(PlanetStackBaseAdmin): inlines = [TagInline] - user_readonly_fields = ['slice', 'deploymentNetwork', 'node', 'ip', 'instance_name', 'numberCores', 'image'] + user_readonly_fields = ['slice', 'deploymentNetwork', 'node', 'ip', 'instance_name', 'flavor', 'image'] def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'slice': diff --git a/planetstack/core/models/__init__.py b/planetstack/core/models/__init__.py index 40d9f29..5a4798f 100644 --- a/planetstack/core/models/__init__.py +++ b/planetstack/core/models/__init__.py @@ -23,10 +23,10 @@ from .site import SitePrivilege from .planetstack import PlanetStackRole from .planetstack import PlanetStackPrivilege from .slicetag import SliceTag +from .flavor import Flavor from .sliver import Sliver from .reservation import ReservedResource from .reservation import Reservation from .network import Network, NetworkParameterType, NetworkParameter, NetworkSliver, NetworkTemplate, Router, NetworkSlice, NetworkDeployments -from .flavor import Flavor from .billing import Account, Invoice, Charge, UsableObject, Payment diff --git a/planetstack/core/models/flavor.py b/planetstack/core/models/flavor.py index 0cc14f0..84a5427 100644 --- a/planetstack/core/models/flavor.py +++ b/planetstack/core/models/flavor.py @@ -1,7 +1,7 @@ import os import socket from django.db import models -from core.models import PlCoreBase, Site, Slice, Sliver, Deployment +from core.models import PlCoreBase, Deployment from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic diff --git a/planetstack/core/models/sliver.py b/planetstack/core/models/sliver.py index e0ce5e2..50fe499 100644 --- a/planetstack/core/models/sliver.py +++ b/planetstack/core/models/sliver.py @@ -9,11 +9,34 @@ from core.models import Site from core.models import Deployment from core.models import User from core.models import Tag +from core.models import Flavor from django.contrib.contenttypes import generic +def get_default_flavor(deployment = None): + # Find a default flavor that can be used for a sliver. This is particularly + # useful in evolution. It's also intended this helper function can be used + # for admin.py when users + + if deployment: + flavors = deployment.flavors.all() + else: + flavors = Flavor.objects.all() + + if not flavors: + print "XXX none" + return None + + for flavor in flavors: + if flavor.default: + print "XXX", flavor + return flavor + + print "XXX", flavors[0] + return flavors[0] + # Create your models here. class Sliver(PlCoreBase): - instance_id = models.CharField(null=True, blank=True, max_length=200, help_text="Nova instance id") + instance_id = models.CharField(null=True, blank=True, max_length=200, help_text="Nova instance id") name = models.CharField(max_length=200, help_text="Sliver name") instance_name = models.CharField(blank=True, null=True, max_length=200, help_text="OpenStack generated name") ip = models.GenericIPAddressField(help_text="Sliver ip address", blank=True, null=True) @@ -24,6 +47,7 @@ class Sliver(PlCoreBase): node = models.ForeignKey(Node, related_name='slivers') deploymentNetwork = models.ForeignKey(Deployment, verbose_name='deployment', related_name='sliver_deploymentNetwork') numberCores = models.IntegerField(verbose_name="Number of Cores", help_text="Number of cores for sliver", default=0) + flavor = models.ForeignKey(Flavor, help_text="Flavor of this instance", default=get_default_flavor) tags = generic.GenericRelation(Tag) userData = models.TextField(blank=True, null=True, help_text="user_data passed to instance during creation") diff --git a/planetstack/templates/admin/core/slice/change_form.html b/planetstack/templates/admin/core/slice/change_form.html index e97364b..9fb9758 100644 --- a/planetstack/templates/admin/core/slice/change_form.html +++ b/planetstack/templates/admin/core/slice/change_form.html @@ -1,5 +1,5 @@ {% extends 'admin/change_form.html' %} -{% block extrahead %} +{% block extrahead %} {{ block.super }}