From: Scott Baker Date: Wed, 9 Apr 2014 06:40:56 +0000 (-0700) Subject: merge Amisha's changes X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;ds=sidebyside;h=537d823597fc37a0f648f69b08c3f0d4d654d775;p=plstackapi.git merge Amisha's changes --- diff --git a/planetstack/core/models/slice.py b/planetstack/core/models/slice.py index 7bffe83..d031766 100644 --- a/planetstack/core/models/slice.py +++ b/planetstack/core/models/slice.py @@ -24,6 +24,7 @@ class Slice(PlCoreBase): network_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum network") router_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum router id") subnet_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum subnet id") + imagePreference = models.CharField(default="abc",null=True, blank=True, max_length=256) service = models.ForeignKey(Service, related_name='service', null=True, blank=True) tags = generic.GenericRelation(Tag) diff --git a/planetstack/core/plus/sites.py b/planetstack/core/plus/sites.py index 6fd278b..c5dde52 100644 --- a/planetstack/core/plus/sites.py +++ b/planetstack/core/plus/sites.py @@ -12,13 +12,15 @@ class AdminMixin(object): def get_urls(self): """Add our dashboard view to the admin urlconf. Deleted the default index.""" from django.conf.urls import patterns, url - from views import DashboardWelcomeView, DashboardAjaxView, SimulatorView, DashboardSummaryAjaxView, DashboardAddOrRemoveSliverView, DashboardUserSiteView, DashboardAnalyticsAjaxView + from views import DashboardWelcomeView, DashboardAjaxView, SimulatorView, DashboardSummaryAjaxView, DashboardAddOrRemoveSliverView, DashboardUserSiteView, DashboardAnalyticsAjaxView, TenantViewData,TenantCreateSlice urls = super(AdminMixin, self).get_urls() del urls[0] custom_url = patterns('', url(r'^$', self.admin_view(DashboardWelcomeView.as_view()), name="index"), + url(r'^test/', self.admin_view(DashboardUserSiteView.as_view()), + name="test"), url(r'^hpcdashuserslices/', self.admin_view(DashboardUserSiteView.as_view()), name="hpcdashuserslices"), url(r'^hpcdashboard/', self.admin_view(DashboardAjaxView.as_view()), # DEPRECATED @@ -30,7 +32,11 @@ class AdminMixin(object): url(r'^analytics/(?P\w+)/$', DashboardAnalyticsAjaxView.as_view(), name="analytics"), url(r'^dashboardaddorremsliver/$', self.admin_view(DashboardAddOrRemoveSliverView.as_view()), - name="addorremsliver") + name="addorremsliver"), + url(r'^tenantview/$', self.admin_view(TenantViewData.as_view()), + name="tenantview"), + url(r'^createnewslice/$', self.admin_view(TenantCreateSlice.as_view()), + name="createnewslice") ) return custom_url + urls diff --git a/planetstack/core/plus/views.py b/planetstack/core/plus/views.py index a50d946..0078d91 100644 --- a/planetstack/core/plus/views.py +++ b/planetstack/core/plus/views.py @@ -5,8 +5,9 @@ from django.views.generic import TemplateView, View import datetime from pprint import pprint import json -from core.models import Slice,SliceRole,SlicePrivilege,Site,Reservation,Sliver +from core.models import * from django.http import HttpResponse +from django.core import urlresolvers import traceback if os.path.exists("/home/smbaker/projects/vicci/cdn/bigquery"): @@ -47,6 +48,64 @@ def getUserSliceInfo(user, tableFormat = False): # pprint( userDetails) return userDetails +class TenantCreateSlice(View): + def post(self, request, *args, **kwargs): + sliceName = request.POST.get("sliceName", "0") + serviceClass = request.POST.get("serviceClass", "0") + imageName = request.POST.get("imageName", "0") + actionToDo = request.POST.get("actionToDo", "0") + print sliceName + if (actionToDo == "add"): + serviceClass = ServiceClass.objects.get(name=serviceClass) + site = request.user.site + #image = Image.objects.get(name=imageName) + newSlice = Slice(name=sliceName,serviceClass=serviceClass,site=site,imagePreference=imageName) + newSlice.save() + return newSlice + + +def getTenantSliceInfo(user, tableFormat = False): + tenantSliceDetails = {} + tenantSliceData = getTenantInfo(user) + tenantServiceClassData = getServiceClassInfo(user) + if (tableFormat): + tenantSliceDetails['userSliceInfo'] = userSliceTableFormatter(tenantSliceData) + tenantSliceDetails['sliceServiceClass']=userSliceTableFormatter(tenantServiceClassData) + else: + tenantSliceDetails['userSliceInfo'] = tenantSliceData + tenantSliceDetails['sliceServiceClass']=userSliceTableFormatter(tenantServiceClassData) + tenantSliceDetails['image']=userSliceTableFormatter(getImageInfo(user)) + tenantSliceDetails['network']=userSliceTableFormatter(getNetworkInfo(user)) + tenantSliceDetails['deploymentSites']=userSliceTableFormatter(getDeploymentSites()) + tenantSliceDetails['sites'] = userSliceTableFormatter(getTenantSitesInfo()); + return tenantSliceDetails + + +def getTenantInfo(user): + slices =Slice.objects.all() + userSliceInfo = [] + for entry in slices: + sliceName = Slice.objects.get(id=entry.id).name + slice = Slice.objects.get(name=Slice.objects.get(id=entry.id).name) + sliceServiceClass = entry.serviceClass.name + preferredImage = entry.imagePreference + numSliver = 0 + sliceImage="" + sliceSite = {} + for sliver in slice.slivers.all(): + numSliver +=sliver.numberCores + # sliceSite[sliver.deploymentNetwork.name] =sliceSite.get(sliver.deploymentNetwork.name,0) + 1 + sliceSite[sliver.node.site.name] = sliceSite.get(sliver.node.site.name,0) + 1 + sliceImage = sliver.image.name + userSliceInfo.append({'sliceName': sliceName,'sliceServiceClass': sliceServiceClass,'preferredImage':preferredImage, 'sliceSite':sliceSite,'sliceImage':sliceImage,'numOfSlivers':numSliver}) + return userSliceInfo + +def getTenantSitesInfo(): + tenantSiteInfo=[] + for entry in Site.objects.all(): + tenantSiteInfo.append({'siteName':entry.name}) + return tenantSiteInfo + def userSliceTableFormatter(data): # pprint(data) formattedData = { @@ -54,6 +113,36 @@ def userSliceTableFormatter(data): } return formattedData +def getServiceClassInfo(user): + serviceClassList = ServiceClass.objects.all() + sliceInfo = [] + for entry in serviceClassList: + sliceInfo.append({'serviceClass':entry.name}) + return sliceInfo + +def getImageInfo(user): + imageList = Image.objects.all() + imageInfo = [] + for imageEntry in imageList: + imageInfo.append({'Image':imageEntry.name}) + return imageInfo + +def getNetworkInfo(user): + #networkList = Network.objects.all() + networkList = ['Private Only','Private and Publicly Routable'] + networkInfo = [] + for networkEntry in networkList: + #networkInfo.append({'Network':networkEntry.name}) + networkInfo.append({'Network':networkEntry}) + return networkInfo + +def getDeploymentSites(): + deploymentList = Deployment.objects.all() + deploymentInfo = [] + for entry in deploymentList: + deploymentInfo.append({'DeploymentSite':entry.name}) + return deploymentInfo + def getSliceInfo(user): sliceList = Slice.objects.all() slicePrivs = SlicePrivilege.objects.filter(user=user) @@ -61,6 +150,13 @@ def getSliceInfo(user): for entry in slicePrivs: slicename = Slice.objects.get(id=entry.slice.id).name + slice = Slice.objects.get(name=Slice.objects.get(id=entry.slice.id).name) + sliverList=Sliver.objects.all() + sites_used = {} + for sliver in slice.slivers.all(): + #sites_used['deploymentSites'] = sliver.node.deployment.name + # sites_used[sliver.image.name] = sliver.image.name + sites_used[sliver.node.site.name] = sliver.numberCores sliceid = Slice.objects.get(id=entry.slice.id).id try: sliverList = Sliver.objects.filter(slice=entry.slice.id) @@ -76,7 +172,10 @@ def getSliceInfo(user): sitecount = 0 userSliceInfo.append({'slicename': slicename, 'sliceid':sliceid, - 'role': SliceRole.objects.get(id=entry.role.id).role, 'slivercount': slivercount, 'sitecount':sitecount}) + 'sitesUsed':sites_used, + 'role': SliceRole.objects.get(id=entry.role.id).role, + 'slivercount': slivercount, + 'sitecount':sitecount}) return userSliceInfo @@ -110,6 +209,10 @@ class DashboardUserSiteView(View): def get(self, request, **kwargs): return HttpResponse(json.dumps(getUserSliceInfo(request.user, True)), mimetype='application/javascript') +class TenantViewData(View): + def get(self, request, **kwargs): + return HttpResponse(json.dumps(getTenantSliceInfo(request.user, True)), mimetype='application/javascript') + class DashboardSummaryAjaxView(View): def get(self, request, **kwargs): return HttpResponse(json.dumps(hpc_wizard.get_hpc_wizard().get_summary_for_view()), mimetype='application/javascript') diff --git a/planetstack/core/serializers.py b/planetstack/core/serializers.py index b83157b..5bbe7aa 100644 --- a/planetstack/core/serializers.py +++ b/planetstack/core/serializers.py @@ -124,6 +124,7 @@ class SliceSerializer(serializers.HyperlinkedModelSerializer): 'network_id', 'router_id', 'subnet_id', + 'imagePreference', 'site', 'slivers', 'updated', diff --git a/planetstack/core/static/planetstack.css b/planetstack/core/static/planetstack.css index c780f5c..18b815e 100644 --- a/planetstack/core/static/planetstack.css +++ b/planetstack/core/static/planetstack.css @@ -1023,3 +1023,88 @@ div.chartContainer font-size: 24px; font-weight: bold; } + +.tenant-row{ + padding-bottom: 0.7%; +} + + +/***********TENANT VIEW*************/ + +#image-dropdown,#slice-image-value,#adv-slice-image-value{ + margin-left: 5%; +} + +#network-dropdown,#adv-network-dropdown{ + margin-left: 3.7%; +} + +#service-level-dropdown,#service-level-value,#adv-service-level-dropdown,#adv-service-level-value{ + margin-left: 0.2% !important; +} + +#slice-name-value,#adv-slice-name-value{ + margin-left: 2%; +} + +#advanced-tenant,#basic-tenant,#sliver-btn,#save-btn{ + float:right; +} + +#sliver-btn,#save-btn,#create-slice-btn{ + margin-top:1%; +} + + +.ui-widget input{ + border-radius: 0px !important; +margin: 1.5% 0 0 5% !important; +height: 20px !important; +width: 100px !important; +} + +.ui-dialog-buttonset .ui-button{ +border-radius: 0 !important; +background-color: grey !important; +font-weight: bold !important; +font-size: 0.9em; !important +} + +.ui-dialog-titlebar{ +border-radius: 0 !important; +background-color: grey !important; +} + +.create-slice-row{ + margin-bottom:3%; +} + +.create-slice-row label{ + margin-right:1%; +} + +.create-slice-row select{ + height:24px; + width: 196px; + font-size: 0.9em !important; + +} + +#new-slice-name{ + width: 194px !important; + margin-left: 16% !important; +} + +#new-site-name{ + margin-left: 20%; +} + +#new-image{ + margin-left: 15%; +} + +#tooltip{ +font-size:0.7em; +color:red; +display:none; +} diff --git a/planetstack/templates/admin/dashboard/tenant.html b/planetstack/templates/admin/dashboard/tenant.html new file mode 100644 index 0000000..8bcd5ce --- /dev/null +++ b/planetstack/templates/admin/dashboard/tenant.html @@ -0,0 +1,325 @@ + + + + + + + + + + + + diff --git a/planetstack/templates/admin/dashboard/welcome.html b/planetstack/templates/admin/dashboard/welcome.html index a4348ba..4967169 100644 --- a/planetstack/templates/admin/dashboard/welcome.html +++ b/planetstack/templates/admin/dashboard/welcome.html @@ -96,7 +96,7 @@ function confirmDialog(title,msg) { {% include "/opt/planetstack/templates/admin/dashboard/slice_interactions.html" %}
-Coming Soon ... +{% include "/opt/planetstack/templates/admin/dashboard/tenant.html" %}