replace sliver.numberCores with sliver.Flavor, add flavor filtering by deployment...
authorScott Baker <smbaker@gmail.com>
Wed, 3 Sep 2014 00:08:20 +0000 (17:08 -0700)
committerScott Baker <smbaker@gmail.com>
Wed, 3 Sep 2014 00:08:20 +0000 (17:08 -0700)
planetstack/core/admin.py
planetstack/core/models/__init__.py
planetstack/core/models/flavor.py
planetstack/core/models/sliver.py
planetstack/templates/admin/core/slice/change_form.html

index 1c42013..fad99a0 100644 (file)
@@ -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():\r
             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':
index 40d9f29..5a4798f 100644 (file)
@@ -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
 
index 0cc14f0..84a5427 100644 (file)
@@ -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
 
index e0ce5e2..50fe499 100644 (file)
@@ -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")
 
index e97364b..9fb9758 100644 (file)
@@ -1,5 +1,5 @@
 {% extends 'admin/change_form.html' %}
-{% block extrahead %} 
+{% block extrahead %}
 {{ block.super }} 
 <script>
 deployment_nodes = [
@@ -8,12 +8,18 @@ deployment_nodes = [
 {% endfor %}
 ];
 
+deployment_flavors = [
+{% for dn in deployment_flavors %}
+   [{{ dn.0 }}, {{ dn.1 }} , "{{ dn.2 }}"],
+{% endfor %}
+];
+
 sites = [
 {% for s in sites %}
   [{{ s.0 }}, {{ s.1 }}],
 {% endfor %}
 ];
+
 
 function update_nodes(deployment_select, node_select_id) {
     deployment_id = $(deployment_select).val();
@@ -28,6 +34,32 @@ function update_nodes(deployment_select, node_select_id) {
     $("#"+node_select_id).empty().append(html);
 }
 
+function update_flavors(deployment_select, flavor_select_id) {
+    deployment_id = $(deployment_select).val();
+    html = "<option value=''>---------</option>\n";
+    for (i in deployment_flavors) {
+        dn = deployment_flavors[i];
+        if (dn[0] == deployment_id) {
+            html = html + '<option value="' + dn[1] + '">' + dn[2] + '</option>\n'
+        }
+    }
+    //console.log(html);
+    $("#"+flavor_select_id).empty().append(html);
+}
+
+function sliver_deployment_changed(deployment_select) {
+   /* 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
+    */
+    nodes_select_id = $($(deployment_select).closest('tr')[0]).find('.field-node select')[0].id;
+    update_nodes(deployment_select, nodes_select_id);
+    flavors_select_id = $($(deployment_select).closest('tr')[0]).find('.field-flavor select')[0].id;
+    update_flavors(deployment_select, flavors_select_id);
+}
+
 function update_slice_prefix(site_select, slice_name_id) {
     site_id = $(site_select).val();
     slice_prefix="";