From 168b741759d606dd58a34726af2f8855783784f2 Mon Sep 17 00:00:00 2001 From: Scott Baker <smbaker@gmail.com> Date: Fri, 16 May 2014 14:25:41 -0700 Subject: [PATCH] Amisha's latest changes to tenant view --- planetstack/core/plus/views.py | 93 +++++++++++--- planetstack/core/static/planetstack.css | 15 ++- .../templates/admin/dashboard/tenant.html | 115 +++++++----------- 3 files changed, 133 insertions(+), 90 deletions(-) diff --git a/planetstack/core/plus/views.py b/planetstack/core/plus/views.py index 3c63e16..9f5d8e4 100644 --- a/planetstack/core/plus/views.py +++ b/planetstack/core/plus/views.py @@ -7,6 +7,7 @@ from django.views.generic import TemplateView, View import datetime from pprint import pprint import json +from syndicate.models import * from core.models import * from hpc.models import ContentProvider from operator import attrgetter @@ -59,13 +60,13 @@ class TenantCreateSlice(View): serviceClass = request.POST.get("serviceClass", "0") imageName = request.POST.get("imageName", "0") actionToDo = request.POST.get("actionToDo", "0") - network = request.POST.get("network","0") + #network = request.POST.get("network","0") mountDataSets = request.POST.get("mountDataSets","0") 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=image,mountDataSets=mountDataSets,network=network) + newSlice = Slice(name=sliceName,serviceClass=serviceClass,site=site,imagePreference=image,mountDataSets=mountDataSets) newSlice.save() return HttpResponse("Slice created") @@ -75,7 +76,7 @@ class TenantUpdateSlice(View): serviceClass = request.POST.get("serviceClass", "0") imageName = request.POST.get("imageName", "0") actionToDo = request.POST.get("actionToDo", "0") - network = request.POST.get("network","0") + #network = request.POST.get("network","0") dataSet = request.POST.get("dataSet","0") slice = Slice.objects.all() for entry in slice: @@ -84,19 +85,12 @@ class TenantUpdateSlice(View): if (actionToDo == "update"): setattr(entry,'serviceClass',serviceClass) setattr(entry,'imagePreference',imageName) - setattr(entry,'network',network) + #setattr(entry,'network',network) setattr(entry,'mountDataSets',dataSet) entry.save() break return HttpResponse("Slice updated") -def update_slice(sliceName,**fields): - slice = Slice.objects.filter(name = sliceName) - for (k,v) in fields.items(): - setattr(slice, k, v) - slice.save() - return slice - def getTenantSliceInfo(user, tableFormat = False): tenantSliceDetails = {} tenantSliceData = getTenantInfo(user) @@ -108,13 +102,13 @@ def getTenantSliceInfo(user, tableFormat = False): tenantSliceDetails['userSliceInfo'] = tenantSliceData tenantSliceDetails['sliceServiceClass']=userSliceTableFormatter(tenantServiceClassData) tenantSliceDetails['image']=userSliceTableFormatter(getImageInfo(user)) - tenantSliceDetails['network']=userSliceTableFormatter(getNetworkInfo(user)) + #tenantSliceDetails['network']=userSliceTableFormatter(getNetworkInfo(user)) tenantSliceDetails['deploymentSites']=userSliceTableFormatter(getDeploymentSites()) tenantSliceDetails['sites'] = userSliceTableFormatter(getTenantSitesInfo()) tenantSliceDetails['mountDataSets'] = userSliceTableFormatter(getMountDataSets()) + tenantSliceDetails['publicKey'] = getPublicKey(user) return tenantSliceDetails - def getTenantInfo(user): slices =Slice.objects.all() userSliceInfo = [] @@ -124,7 +118,7 @@ def getTenantInfo(user): sliceServiceClass = entry.serviceClass.name preferredImage = entry.imagePreference sliceDataSet = entry.mountDataSets - sliceNetwork = entry.network + #sliceNetwork = entry.network numSliver = 0 sliceImage="" sliceSite = {} @@ -137,7 +131,7 @@ def getTenantInfo(user): sliceNode[str(sliver)] = sliver.node.name numSliver = sum(sliceSite.values()) numSites = len(sliceSite) - userSliceInfo.append({'sliceName': sliceName,'sliceServiceClass': sliceServiceClass,'preferredImage':preferredImage,'numOfSites':numSites, 'sliceSite':sliceSite,'sliceImage':sliceImage,'numOfSlivers':numSliver,'sliceDataSet':sliceDataSet,'sliceNetwork':sliceNetwork, 'instanceNodePair':sliceNode}) + userSliceInfo.append({'sliceName': sliceName,'sliceServiceClass': sliceServiceClass,'preferredImage':preferredImage,'numOfSites':numSites, 'sliceSite':sliceSite,'sliceImage':sliceImage,'numOfSlivers':numSliver,'sliceDataSet':sliceDataSet,'instanceNodePair':sliceNode}) return userSliceInfo def getTenantSitesInfo(): @@ -154,6 +148,13 @@ def userSliceTableFormatter(data): } return formattedData +def getPublicKey(user): + users=User.objects.all() + for key in users: + if (str(key.email)==str(user)): + sshKey = key.public_key + return sshKey + def getServiceClassInfo(user): serviceClassList = ServiceClass.objects.all() sliceInfo = [] @@ -170,11 +171,58 @@ def getImageInfo(user): #imageInfo.append({'Image':imageEntry}) return imageInfo +def createPrivateVolume(user, sliceName): + caps = Volume.CAP_READ_DATA | Volume.CAP_WRITE_DATA | Volume.CAP_HOST_DATA + getattr(Volume.default_gateway_caps,"read data") | \ + getattr(Volume.default_gateway_caps,"write data") | \ + getattr(Volume.default_gateway_caps,"host files") + v = Volume(name="private_" + sliceName, owner_id=user, description="private volume for %s" % sliceName, blocksize=61440, private=True, archive=False, default_gateway_caps = caps) + v.save() + +SYNDICATE_REPLICATE_PORTNUM = 1025 + +def get_free_port(): + inuse={} + inuse[SYNDICATE_REPLICATE_PORTNUM] = True + for vs in VolumeSlice.objects.all(): + inuse[vs.peer_portnum]=True + inuse[vs.replicate_portnum]=True + for network in Network.objects.all(): + network_ports = [x.strip() for x in network.ports.split(",")] + for network_port in network_ports: + try: + inuse[int(network_port)] = True + except: + # in case someone has put a malformed port number in the list + pass + for i in range(1025, 65535): + if not inuse.get(i,False): + return i + return False + +def mountVolume(sliceName, volumeName, readWrite): + slice = Slice.objects.get(name=sliceName) + volume = Volume.objects.get(name=volumeName) + # choose some unused port numbers + flags = Volume.CAP_READ_DATA + if readWrite: + flags = flags | Volume.CAP_WRITE_DATA + vs = VolumeSlice(volume_id = volume, slice_id = slice, gateway_caps=flags, peer_portnum = get_free_port(), replicate_portnum = SYNDICATE_REPLICATE_PORTNUM) + vs.save() + +def hasPrivateVolume(sliceName): + slice = Slice.objects.get(name=sliceName) + for vs in VolumeSlice.objects.filter(slice_id=slice): + if vs.volume_id.private: + return True + return False + def getMountDataSets(): - dataSetList = ['------','GenBank','LSST','LHC','NOAA','Measurement Lab','Common Crawl'] - dataSetInfo = [] - for entry in dataSetList: - dataSetInfo.append({'DataSet':entry}) + dataSetInfo=[] + for volume in Volume.objects.all(): + if not volume.private: + dataSetInfo.append({'DataSet': volume.name}) + return dataSetInfo def getNetworkInfo(user): @@ -307,6 +355,11 @@ def getCDNOperatorData(randomizeData = False, wait=True): return new_rows +def getPageSummary(request): + slice = request.GET.get('slice', None) + site = request.GET.get('site', None) + node = request.GET.get('node', None) + class SimulatorView(View): def get(self, request, **kwargs): sim = json.loads(file("/tmp/simulator.json","r").read()) @@ -446,7 +499,7 @@ class TenantDeleteSliceView(View): def post(self,request): sliceName = request.POST.get("sliceName",None) slice = Slice.objects.get(name=sliceName) - print slice, slice.id + #print slice, slice.id sliceToDel=Slice(name=sliceName, id=slice.id) sliceToDel.delete() return HttpResponse("Slice deleted") diff --git a/planetstack/core/static/planetstack.css b/planetstack/core/static/planetstack.css index 1fa6ea2..39102be 100644 --- a/planetstack/core/static/planetstack.css +++ b/planetstack/core/static/planetstack.css @@ -1034,7 +1034,7 @@ div.chartContainer margin-left: 5%; } -#network-dropdown,#adv-network-dropdown{ +#network-dropdown,#adv-network-dropdown,#adv-network-value{ margin-left: 3.7%; } @@ -1129,3 +1129,16 @@ display:none; #advNumOfSlivers{ margin-right: 1% !important; } + +#private-vol-checkbox{ +margin: 0 0 1% 1%; +} + +.public-key-warning{ +text-align: center; +display:none; +} + +#private-vol{ +margin-right: 15% !important; +} \ No newline at end of file diff --git a/planetstack/templates/admin/dashboard/tenant.html b/planetstack/templates/admin/dashboard/tenant.html index c3f95ec..a09cec6 100644 --- a/planetstack/templates/admin/dashboard/tenant.html +++ b/planetstack/templates/admin/dashboard/tenant.html @@ -35,8 +35,12 @@ </div> <div class="create-slice-row"> <label for="new-network">Network</label> - <select id="new-network" class="tenant-create-slice"></select> + <input type="text" name="new-network" id="new-network"> </div> + <div class="create-slice-row"> + <label for="private-vol">Include Private Vol</label> + <input type="checkbox" name="checkbox" id="private-vol" value="value"> + </div> <div class="create-slice-row"> <label for="mount-data-sets">Data Sets</label> <select id="mount-data-sets" class="tenant-create-slice"></select> @@ -66,23 +70,20 @@ </script> <script> $(document).ready(function () { - function showSliceData(data,value) { - var imageData = data['image']['rows']; - var networkData = data['network']['rows']; + function showSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value) { $("#service-level-value").empty(); $("#slice-image-value").empty(); $("#tenantSiteTable").empty(); $('#tenantSiteTable').html('<table cellpadding="0" cellspacing="0" border="0" class="display" id="tenantSiteTableData"></table>'); $("#tenantSliceDropDown").val(value); - var rows = data['userSliceInfo']['rows']; var siteNames = []; var sliverCount; for (row in rows) { if (rows[row]['sliceName'] == value) { sliceImageData = rows[row]['preferredImage']; $("#slice-image-value").html(sliceImageData); - serviceLevelData = rows[row]['sliceServiceClass']; - $("#service-level-value").html(serviceLevelData); + serviceLevelDataBasic = rows[row]['sliceServiceClass']; + $("#service-level-value").html(serviceLevelDataBasic); var innerRows = rows[row]['sliceSite']; for (innerRow in innerRows) { sliverCount = innerRows[innerRow]; @@ -103,18 +104,16 @@ "sTitle": "Allocated", sClass: "alignCenter" } - //{ "sTitle": "Allocated" , sClass: "alignCenter"}, - //{ "sTitle": "Desired" , sClass: "alignCenter"}, ] }); $('#tenantSliceDropDown').on('change', function () { var value = $("#tenantSliceDropDown").val(); //alert(value); - checkForBasicAdvView(value, data); + checkForBasicAdvView(value,rows,imageData,serviceLevelData,siteRows,dataSet); }); } - function downloadSliceInfo(data,value){ + function downloadSliceInfo(rows,imageData,serviceLevelData,siteRows,dataSet,value){ $("#download-details").unbind().click(function(){ function download(filename, text) { var sliceDetails = document.createElement('a'); @@ -122,7 +121,6 @@ sliceDetails.setAttribute('download', filename); sliceDetails.click(); } - var rows = data['userSliceInfo']['rows']; var sliceInfo; for (row in rows){ if(rows[row]['sliceName']==value){ @@ -140,8 +138,9 @@ var allocatedSlivers = parseInt($(this).parent().siblings(".allocated").html()); var td = $(this).parent().siblings(".allocated"); var pos = oTable.fnGetPosition(td[0]); + $("#numOfSlivers").val("");; + $("#advNumOfSlivers").val("");; $("#adv-tooltip").css("display", "none"); - $("#numOfSlivers").empty(); $("#adv-dialog-form").dialog({ autoOpen: false, height: 200, @@ -151,21 +150,15 @@ buttons: { "Add": function () { allocatedSlivers += parseInt($("#advNumOfSlivers").val()); - //if (!(parseInt($("#numOfSlivers").val()))) { $("#adv-tooltip").css("display", "block"); - //} else { $(this).dialog("close"); td.html(allocatedSlivers); - //} }, "Remove": function () { allocatedSlivers -= parseInt($("#advNumOfSlivers").val()); - // if (!(parseInt($("#numOfSlivers").val()))) { $("#adv-tooltip").css("display", "block"); - // } else { $(this).dialog("close"); td.html(allocatedSlivers); - // } } } }); @@ -173,23 +166,15 @@ }); } - function advShowSliceData(data,value) { - var serviceLevelData = data['sliceServiceClass']['rows']; - var imageData = data['image']['rows']; - var networkData = data['network']['rows']; - var siteRows = data['sites']['rows']; - var dataSet = data['mountDataSets']['rows']; + function advShowSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value) { $("#adv-service-level-value").empty(); $("#adv-slice-image-value").empty(); $("#adv-slice-data-set-value").empty(); - $("#adv-slice-network-value").empty(); $("#advTenantSliceDropDown").val(value); $("<select></select>").attr('id', 'adv-service-level-dropdown').appendTo('#adv-service-level-value'); $("<select></select>").attr('id', 'adv-image-dropdown').appendTo('#adv-slice-image-value'); - $("<select></select>").attr('id', 'adv-network-dropdown').appendTo('#adv-slice-network-value'); $("<select></select>").attr('id', 'adv-dataset-dropdown').appendTo('#adv-slice-data-set-value'); $('#advTenantSiteTable').html('<table cellpadding="0" cellspacing="0" border="0" class="display" id="advTenantSiteTableData"></table>'); - var rows = data['userSliceInfo']['rows']; var siteNames = []; var sliverCount; var tableData = {}; @@ -199,9 +184,6 @@ for (row in imageData) { $("#adv-image-dropdown").append("<option>" + imageData[row]['Image'] + "</option>"); } - for (row in networkData) { - $("#adv-network-dropdown").append("<option>" + networkData[row]['Network'] + "</option>"); - } for (row in dataSet) { $("#adv-dataset-dropdown").append("<option>" + dataSet[row]['DataSet'] + "</option>"); } @@ -212,7 +194,6 @@ $("#adv-service-level-dropdown").val(rows[row]['sliceServiceClass']); $("#adv-image-dropdown").val(rows[row]['preferredImage']); $("#adv-dataset-dropdown").val(rows[row]['sliceDataSet']); - $("#adv-network-dropdown").val(rows[row]['sliceNetwork']); for (innerRow in innerRows) { tableData[innerRow] = innerRows[innerRow]; } @@ -249,8 +230,8 @@ }, type: 'POST', complete: function () { - //oTable.fnReloadAjax(); - location.reload(); + //location.reload(); + } }); } else if (newTableData[newRow] < tableData[newRow]) { @@ -267,8 +248,7 @@ }, type: 'POST', complete: function () { - // oTable.fnReloadAjax(); - location.reload(); + //location.reload(); } }); } @@ -280,7 +260,6 @@ sliceName: $("#advTenantSliceDropDown").val(), serviceClass: $("#adv-service-level-dropdown").val(), imageName: $("#adv-image-dropdown").val(), - network: $("#adv-network-dropdown").val(), dataSet: $("#adv-dataset-dropdown").val(), actionToDo: "update", csrfmiddlewaretoken: "{{ csrf_token }}", // < here @@ -288,8 +267,8 @@ }, type: 'POST', complete: function () { - //oTable.fnReloadAjax(); - location.reload(); + $("#tabs-5").empty(); + initTenant(); //location.reload(); } }); @@ -315,20 +294,17 @@ }); editSliverAdv(); $('#advTenantSliceDropDown').on('change', function () { - var selectedValue = $("#advTenantSliceDropDown").val(); - //alert(selectedValue); - checkForBasicAdvView(selectedValue, data); - //editSliverAdv(); + var selectedValue = $("#advTenantSliceDropDown").val(); + checkForBasicAdvView(selectedValue, rows,imageData,serviceLevelData,siteRows,dataSet); }); } - function checkForBasicAdvView(value, data) { - var rows = data['userSliceInfo']['rows']; + function checkForBasicAdvView(value, rows,imageData,serviceLevelData,siteRows,dataSet) { for (row in rows) { if (rows[row]['sliceName'] == value) { if (rows[row]['numOfSites'] > 1) { - advShowSliceData(data,value); - downloadSliceInfo(data,value); + advShowSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value); + downloadSliceInfo(rows,imageData,serviceLevelData,siteRows,dataSet,value); $("#tenantSliceDataWrapper").css("display","none"); $("#advancedTenantSliceDataWrapper").css("display","block"); $("#advTenantSiteTable").css("display","block"); @@ -337,9 +313,8 @@ $("#save-btn").css("display","block"); break; } else if(rows[row]['numOfSites'] <= 1){ - showSliceData(data,value); - downloadSliceInfo(data,value); - //editSliverAdv(); + showSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value); + downloadSliceInfo(rows,imageData,serviceLevelData,siteRows,dataSet,value); $("#tenantSliceDataWrapper").css("display","block"); $("#advancedTenantSliceDataWrapper").css("display","none"); $("#advTenantSiteTable").css("display","none"); @@ -352,15 +327,14 @@ } } - function UserSliceTable(data) { + function UserSliceTable(rows,imageData,serviceLevelData,siteRows,dataSet) { //Add check for #dynamicusersliceinfo_filter label-> input having focus here - var rows = data['userSliceInfo']['rows']; $("<div></div>").attr('id', 'tenantSliceDataWrapper').appendTo('#tabs-5'); $("<div></div>").attr('id', 'advancedTenantSliceDataWrapper').appendTo('#tabs-5'); var sliceData = ''; - sliceData += '<div class="tenant-row"><span class="summary-attr"><b>Slice Name:</b> <span id="slice-name-value"> </span> </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Service Level:</b> <span id="service-level-value"> </span> </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Image:</b> <span id="slice-image-value"> </span> </span><br></div><div class="btn btn-high btn-info" id="advanced-tenant">Go to Advanced View</div>'; + sliceData += '<div class="tenant-row public-key-warning"><span class="summary-attr">You have not uploaded your Public Key. <a href="http://{{ request.get_host}}/admin/core/user/{{user.id}}">Click here</a> to upload it now.</span></div><div class="tenant-row"><span class="summary-attr"><b>Slice Name:</b> <span id="slice-name-value"> </span> </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Service Level:</b> <span id="service-level-value"> </span> </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Image:</b> <span id="slice-image-value"> </span> </span><br></div><div class="btn btn-high btn-info" id="advanced-tenant">Go to Advanced View</div>'; var advSliceData = ''; - advSliceData += '<div class="adv-tenant-row"><span class="summary-attr"><b>Slice Name:</b> <span id="adv-slice-name-value"> </span> </span><br><br></div><div class="tenant-row"><span class="summary-attr"><b>Service Level:</b> <span id="adv-service-level-value"> </span> <span class="help-inline">Changes are potentially disruptive to existing slivers</span> </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Image:</b> <span id="adv-slice-image-value"> </span><span class="help-inline">Changes are potentially disruptive to existing slivers</span> </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Network:</b> <span id="adv-slice-network-value"> </span> <span class="help-inline">Changes are potentially disruptive to existing slivers</span></span></div><div class="tenant-row"><span class="summary-attr"><b>Data Sets:</b> <span id="adv-slice-data-set-value"> </span> </span></div>'; + advSliceData += '<div class="tenant-row public-key-warning"><span class="summary-attr">You have not uploaded your Public Key. <a href="http://{{ request.get_host}}/admin/core/user/{{user.id}}">Click here</a> to upload it now.</span></div><div class="adv-tenant-row"><span class="summary-attr"><b>Slice Name:</b> <span id="adv-slice-name-value"> </span> </span><br><br></div><div class="tenant-row"><span class="summary-attr"><b>Service Level:</b> <span id="adv-service-level-value"> </span> <span class="help-inline">Changes are potentially disruptive to existing slivers</span> </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Image:</b> <span id="adv-slice-image-value"> </span><span class="help-inline">Changes are potentially disruptive to existing slivers</span> </span><br></div><div class="tenant-row"><span class="summary-attr"><b>Network:</b> <input type="text" name="adv-network-value" id="adv-network-value"> <span class="help-inline">List of port ranges(if any) e.g. 1021-1026,1029</span><br></div><div class="tenant-row"><span class="summary-attr"><b>Data Sets:</b> <span id="adv-slice-data-set-value"> </span> <input type="checkbox" name="checkbox" id="private-vol-checkbox" value="value"><span class="help-inline">Include Private Volume</span></span></div>'; $('#tenantSliceDataWrapper').append(sliceData).css("display", "none"); $('#advancedTenantSliceDataWrapper').append(advSliceData); $("#advancedTenantSliceDataWrapper").css("display", "none"); @@ -381,7 +355,7 @@ $('<div class="btn btn-high btn-info" id="save-btn">Save</div>').appendTo("#tabs-5").css("display", "none"); $("#advanced-tenant").unbind().click(function () { var value = $("#tenantSliceDropDown").val(); - advShowSliceData(data,value); + advShowSliceData(rows,imageData,serviceLevelData,siteRows,dataSet,value); $("#tenantSliceDataWrapper").css("display","none"); $("#advancedTenantSliceDataWrapper").css("display","block"); $("#advTenantSiteTable").css("display","block"); @@ -391,7 +365,6 @@ }); $("#sliver-btn").click(function () { - $("#numOfSlivers").empty(); $("#basic-tooltip").css("display", "none"); $("#dialog-form").dialog({ autoOpen: false, @@ -420,8 +393,9 @@ return true; } }, - complete: function () { + success: function () { location.reload(); +$("#dialog-form").dialog("close"); } }); }, @@ -445,8 +419,10 @@ return true; } }, - complete: function () { - location.reload(); + success: function () { +$("#dialog-form").dialog("close"); +location.reload(); + } }); } @@ -455,10 +431,6 @@ $("#dialog-form").dialog("open"); }); $("#create-slice-btn").unbind().click(function () { - var serviceLevelData = data['sliceServiceClass']['rows']; - var imageData = data['image']['rows']; - var dataSet = data['mountDataSets']['rows']; - var networkData = data['network']['rows']; $("#new-service-class").empty(); $("#new-image").empty(); $("#mount-data-sets").empty(); @@ -472,9 +444,6 @@ for (row in dataSet) { $("#mount-data-sets").append("<option>" + dataSet[row]['DataSet'] + "</option>"); } - for (row in networkData) { - $("#new-network").append("<option>" + networkData[row]['Network'] + "</option>"); - } var nameOfSlice = $("#new-slice-name").val(); var nameOfServiceClass = $("#new-service-class").val(); var nameOfImage = $("#new-image").val(); @@ -540,7 +509,6 @@ $("#create-slice-form").dialog("open"); }); $("#delete-slice-btn").unbind().click(function () { - var rows = data['userSliceInfo']['rows']; $("#delete-slice").empty(); for (row in rows) { $("#delete-slice").append("<option>" + rows[row]['sliceName'] + "</option>"); @@ -583,9 +551,18 @@ url: '/tenantview', dataType: 'json', success: function (data) { - UserSliceTable(data); + var rows = data['userSliceInfo']['rows']; + var imageData = data['image']['rows']; + //var networkData = data['network']['rows']; + var serviceLevelData = data['sliceServiceClass']['rows']; + var siteRows = data['sites']['rows']; + var dataSet = data['mountDataSets']['rows']; + UserSliceTable(rows,imageData,serviceLevelData,siteRows,dataSet); + if(!(data['publicKey'])){ + $(".public-key-warning").css("display","block"); + } var value = $("#tenantSliceDropDown").val(); - checkForBasicAdvView(value, data); + checkForBasicAdvView(value,rows,imageData,serviceLevelData,siteRows,dataSet); $("#tooltip").css("display", "none"); $("#basic-tooltip").css("display", "none"); $("#adv-tooltip").css("display", "none"); -- 2.47.0