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'
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)
)
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)
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'),
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':
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)
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")
{% extends 'admin/change_form.html' %}
-{% block extrahead %}
+{% block extrahead %}
{{ block.super }}
<script>
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();
$("#"+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="";