| // Licensed to the Apache Software Foundation (ASF) under one | |
| // or more contributor license agreements. See the NOTICE file | |
| // distributed with this work for additional information | |
| // regarding copyright ownership. The ASF licenses this file | |
| // to you under the Apache License, Version 2.0 (the | |
| // "License"); you may not use this file except in compliance | |
| // with the License. You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, | |
| // software distributed under the License is distributed on an | |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| // KIND, either express or implied. See the License for the | |
| // specific language governing permissions and limitations | |
| // under the License. | |
| (function(cloudStack, $) { | |
| cloudStack.sections.templates = { | |
| title: 'label.menu.templates', | |
| id: 'templates', | |
| sectionSelect: { | |
| label: 'label.select-view' | |
| }, | |
| sections: { | |
| templates: { | |
| type: 'select', | |
| title: 'label.menu.templates', | |
| listView: { | |
| id: 'templates', | |
| label: 'label.menu.templates', | |
| filters: { | |
| all: { | |
| preFilter: function(args) { | |
| if (isAdmin()) //"listTemplates&templatefilter=all" only works for root-admin, but no domain-admin. Domain-admin is unable to see all templates until listTemplates API supports a new type of templatefilter for domain-admin to see all templates in his domain. | |
| return true; | |
| else | |
| return false; | |
| }, | |
| label: 'ui.listView.filters.all' | |
| }, | |
| mine: { label: 'ui.listView.filters.mine' }, | |
| featured: { label: 'label.featured' }, | |
| community: { label: 'label.community' } | |
| }, | |
| fields: { | |
| name: { label: 'label.name' }, | |
| zonename: { label: 'label.zone' }, | |
| hypervisor: { label: 'label.hypervisor' } | |
| }, | |
| advSearchFields: { | |
| name: { label: 'Name' }, | |
| zoneid: { | |
| label: 'Zone', | |
| select: function(args) { | |
| $.ajax({ | |
| url: createURL('listZones'), | |
| data: { | |
| listAll: true | |
| }, | |
| success: function(json) { | |
| var zones = json.listzonesresponse.zone; | |
| args.response.success({ | |
| data: $.map(zones, function(zone) { | |
| return { | |
| id: zone.id, | |
| description: zone.name | |
| }; | |
| }) | |
| }); | |
| } | |
| }); | |
| } | |
| }, | |
| tagKey: { label: 'Tag Key' }, | |
| tagValue: { label: 'Tag Value' } | |
| }, | |
| reorder: cloudStack.api.actions.sort('updateTemplate', 'templates'), | |
| actions: { | |
| add: { | |
| label: 'label.action.register.template', | |
| messages: { | |
| notification: function(args) { | |
| return 'label.action.register.template'; | |
| } | |
| }, | |
| createForm: { | |
| title: 'label.action.register.template', | |
| docID:'helpNetworkOfferingName', | |
| preFilter: cloudStack.preFilter.createTemplate, | |
| fields: { | |
| name: { | |
| label: 'label.name', | |
| docID:'helpRegisterTemplateName', | |
| validation: { required: true } | |
| }, | |
| description: { | |
| label: 'label.description', | |
| docID: 'helpRegisterTemplateDescription', | |
| validation: { required: true } | |
| }, | |
| url: { | |
| label: 'URL', | |
| docID: 'helpRegisterTemplateURL', | |
| validation: { required: true } | |
| }, | |
| zone: { | |
| label: 'label.zone', | |
| docID: 'helpRegisterTemplateZone', | |
| select: function(args) { | |
| $.ajax({ | |
| url: createURL("listZones&available=true"), | |
| dataType: "json", | |
| async: true, | |
| success: function(json) { | |
| var zoneObjs; | |
| if(args.context.zoneType == null || args.context.zoneType == '') { //all types | |
| zoneObjs = []; | |
| var items = json.listzonesresponse.zone; | |
| if(items != null) { | |
| for(var i = 0; i < items.length; i++) { | |
| zoneObjs.push({id: items[i].id, description: items[i].name}); | |
| } | |
| } | |
| } | |
| else { //Basic type or Advanced type | |
| zoneObjs = []; | |
| var items = json.listzonesresponse.zone; | |
| if(items != null) { | |
| for(var i = 0; i < items.length; i++) { | |
| if(items[i].networktype == args.context.zoneType) { | |
| zoneObjs.push({id: items[i].id, description: items[i].name}); | |
| } | |
| } | |
| } | |
| } | |
| if (isAdmin() && !(cloudStack.context.projects && cloudStack.context.projects[0])){ | |
| zoneObjs.unshift({id: -1, description: "All Zones"}); | |
| } | |
| args.response.success({data: zoneObjs}); | |
| } | |
| }); | |
| } | |
| }, | |
| hypervisor: { | |
| label: 'label.hypervisor', | |
| docID: 'helpRegisterTemplateHypervisor', | |
| dependsOn: 'zone', | |
| select: function(args) { | |
| if(args.zone == null) | |
| return; | |
| var apiCmd; | |
| if(args.zone == -1) | |
| apiCmd = "listHypervisors&zoneid=-1"; | |
| else | |
| apiCmd = "listHypervisors&zoneid=" + args.zone; | |
| $.ajax({ | |
| url: createURL(apiCmd), | |
| dataType: "json", | |
| async: false, | |
| success: function(json) { | |
| var hypervisorObjs = json.listhypervisorsresponse.hypervisor; | |
| var items = []; | |
| $(hypervisorObjs).each(function(){ | |
| items.push({id: this.name, description: this.name}); | |
| }); | |
| args.response.success({data: items}); | |
| } | |
| }); | |
| args.$select.change(function() { | |
| var $form = $(this).closest('form'); | |
| if($(this).val() == "VMware") { | |
| $form.find('.form-item[rel=rootDiskControllerType]').css('display', 'inline-block'); | |
| $form.find('.form-item[rel=nicAdapterType]').css('display', 'inline-block'); | |
| $form.find('.form-item[rel=keyboardType]').css('display', 'inline-block'); | |
| } | |
| else { | |
| $form.find('.form-item[rel=rootDiskControllerType]').hide(); | |
| $form.find('.form-item[rel=nicAdapterType]').hide(); | |
| $form.find('.form-item[rel=keyboardType]').hide(); | |
| } | |
| }); | |
| } | |
| }, | |
| //fields for hypervisor == "VMware" (starts here) | |
| rootDiskControllerType: { | |
| label: 'label.root.disk.controller', | |
| isHidden: true, | |
| select: function(args) { | |
| var items = [] | |
| items.push({id: "", description: ""}); | |
| items.push({id: "scsi", description: "scsi"}); | |
| items.push({id: "ide", description: "ide"}); | |
| args.response.success({data: items}); | |
| } | |
| }, | |
| nicAdapterType: { | |
| label: 'label.nic.adapter.type', | |
| isHidden: true, | |
| select: function(args) { | |
| var items = [] | |
| items.push({id: "", description: ""}); | |
| items.push({id: "E1000", description: "E1000"}); | |
| items.push({id: "PCNet32", description: "PCNet32"}); | |
| items.push({id: "Vmxnet2", description: "Vmxnet2"}); | |
| items.push({id: "Vmxnet3", description: "Vmxnet3"}); | |
| args.response.success({data: items}); | |
| } | |
| }, | |
| keyboardType: { | |
| label: 'label.keyboard.type', | |
| isHidden: true, | |
| select: function(args) { | |
| var items = [] | |
| items.push({id: "", description: ""}); | |
| items.push({id: "us", description: "US"}); | |
| items.push({id: "jp", description: "Japanese"}); | |
| args.response.success({data: items}); | |
| } | |
| }, | |
| //fields for hypervisor == "VMware" (ends here) | |
| format: { | |
| label: 'label.format', | |
| docID: 'helpRegisterTemplateFormat', | |
| dependsOn: 'hypervisor', | |
| select: function(args) { | |
| var items = []; | |
| if(args.hypervisor == "XenServer") { | |
| //formatSelect.append("<option value='VHD'>VHD</option>"); | |
| items.push({id:'VHD', description: 'VHD'}); | |
| } | |
| else if(args.hypervisor == "VMware") { | |
| //formatSelect.append("<option value='OVA'>OVA</option>"); | |
| items.push({id:'OVA', description: 'OVA'}); | |
| } | |
| else if(args.hypervisor == "KVM") { | |
| //formatSelect.append("<option value='QCOW2'>QCOW2</option>"); | |
| items.push({id:'QCOW2', description: 'QCOW2'}); | |
| } | |
| else if(args.hypervisor == "BareMetal") { | |
| //formatSelect.append("<option value='BareMetal'>BareMetal</option>"); | |
| items.push({id:'BareMetal', description: 'BareMetal'}); | |
| } | |
| else if(args.hypervisor == "Ovm") { | |
| //formatSelect.append("<option value='RAW'>RAW</option>"); | |
| items.push({id:'RAW', description: 'RAW'}); | |
| } | |
| else if(args.hypervisor == "LXC") { | |
| //formatSelect.append("<option value='TAR'>TAR</option>"); | |
| items.push({id:'TAR', description: 'TAR'}); | |
| } | |
| args.response.success({data: items}); | |
| } | |
| }, | |
| osTypeId: { | |
| label: 'label.os.type', | |
| docID: 'helpRegisterTemplateOSType', | |
| select: function(args) { | |
| $.ajax({ | |
| url: createURL("listOsTypes"), | |
| dataType: "json", | |
| async: true, | |
| success: function(json) { | |
| var items = json.listostypesresponse.ostype; | |
| args.response.success({data: items}); | |
| } | |
| }); | |
| } | |
| }, | |
| isExtractable: { | |
| label: "extractable", | |
| docID: 'helpRegisterTemplateExtractable', | |
| isBoolean: true | |
| }, | |
| isPasswordEnabled: { | |
| label: "label.password.enabled", | |
| docID: 'helpRegisterTemplatePasswordEnabled', | |
| isBoolean: true | |
| }, | |
| isPublic: { | |
| label: "label.public", | |
| docID: 'helpRegisterTemplatePublic', | |
| isBoolean: true, | |
| isHidden: true | |
| }, | |
| isFeatured: { | |
| label: "label.featured", | |
| docID: 'helpRegisterTemplateFeatured', | |
| isBoolean: true, | |
| isHidden: true | |
| } | |
| } | |
| }, | |
| action: function(args) { | |
| var data = { | |
| name: args.data.name, | |
| displayText: args.data.description, | |
| url: args.data.url, | |
| zoneid: args.data.zone, | |
| format: args.data.format, | |
| isextractable: (args.data.isExtractable=="on"), | |
| passwordEnabled: (args.data.isPasswordEnabled=="on"), | |
| osTypeId: args.data.osTypeId, | |
| hypervisor: args.data.hypervisor | |
| }; | |
| if(args.$form.find('.form-item[rel=isPublic]').css("display") != "none") { | |
| $.extend(data, { | |
| ispublic: (args.data.isPublic == "on") | |
| }); | |
| } | |
| if(args.$form.find('.form-item[rel=isFeatured]').css("display") != "none") { | |
| $.extend(data, { | |
| isfeatured: (args.data.isFeatured == "on") | |
| }); | |
| } | |
| //VMware only (starts here) | |
| if(args.$form.find('.form-item[rel=rootDiskControllerType]').css("display") != "none" && args.data.rootDiskControllerType != "") { | |
| $.extend(data, { | |
| 'details[0].rootDiskController': args.data.rootDiskControllerType | |
| }); | |
| } | |
| if(args.$form.find('.form-item[rel=nicAdapterType]').css("display") != "none" && args.data.nicAdapterType != "") { | |
| $.extend(data, { | |
| 'details[0].nicAdapter': args.data.nicAdapterType | |
| }); | |
| } | |
| if(args.$form.find('.form-item[rel=keyboardType]').css("display") != "none" && args.data.keyboardType != "") { | |
| $.extend(data, { | |
| 'details[0].keyboard': args.data.keyboardType | |
| }); | |
| } | |
| //VMware only (ends here) | |
| $.ajax({ | |
| url: createURL('registerTemplate'), | |
| data: data, | |
| success: function(json) { | |
| var items = json.registertemplateresponse.template; //items might have more than one array element if it's create templates for all zones. | |
| args.response.success({data:items[0]}); | |
| /* | |
| if(items.length > 1) { | |
| for(var i=1; i<items.length; i++) { | |
| var $midmenuItem2 = $("#midmenu_item").clone(); | |
| templateToMidmenu(items[i], $midmenuItem2); | |
| bindClickToMidMenu($midmenuItem2, templateToRightPanel, templateGetMidmenuId); | |
| $("#midmenu_container").append($midmenuItem2.show()); | |
| } | |
| } | |
| */ | |
| }, | |
| error: function(XMLHttpResponse) { | |
| var errorMsg = parseXMLHttpResponse(XMLHttpResponse); | |
| args.response.error(errorMsg); | |
| } | |
| }); | |
| }, | |
| notification: { | |
| poll: function(args) { | |
| args.complete(); | |
| } | |
| } | |
| } | |
| }, | |
| dataProvider: function(args) { | |
| var data = {}; | |
| listViewDataProvider(args, data); | |
| var ignoreProject = false; | |
| if(args.filterBy != null) { //filter dropdown | |
| if(args.filterBy.kind != null) { | |
| switch(args.filterBy.kind) { | |
| case "all": | |
| ignoreProject = true; | |
| $.extend(data, { | |
| templatefilter: 'all' | |
| }); | |
| break; | |
| case "mine": | |
| $.extend(data, { | |
| templatefilter: 'self' | |
| }); | |
| break; | |
| case "featured": | |
| ignoreProject = true; | |
| $.extend(data, { | |
| templatefilter: 'featured' | |
| }); | |
| break; | |
| case "community": | |
| ignoreProject = true; | |
| $.extend(data, { | |
| templatefilter: 'community' | |
| }); | |
| break; | |
| } | |
| } | |
| } | |
| $.ajax({ | |
| url: createURL('listTemplates', { ignoreProject: ignoreProject }), | |
| data: data, | |
| success: function(json) { | |
| var items = json.listtemplatesresponse.template; | |
| args.response.success({ | |
| actionFilter: templateActionfilter, | |
| data: items | |
| }); | |
| } | |
| }); | |
| } , | |
| detailView: { | |
| name: 'Template details', | |
| actions: { | |
| edit: { | |
| label: 'label.edit', | |
| action: function(args) { | |
| //***** updateTemplate ***** | |
| var data = { | |
| id: args.context.templates[0].id, | |
| zoneid: args.context.templates[0].zoneid, | |
| name: args.data.name, | |
| displaytext: args.data.displaytext, | |
| ostypeid: args.data.ostypeid, | |
| passwordenabled: (args.data.passwordenabled=="on") | |
| }; | |
| $.ajax({ | |
| url: createURL('updateTemplate'), | |
| data: data, | |
| async: false, | |
| success: function(json) { | |
| //API returns an incomplete embedded object (some properties are missing in the embedded template object) | |
| } | |
| }); | |
| //***** updateTemplatePermissions ***** | |
| var data = { | |
| id: args.context.templates[0].id, | |
| zoneid: args.context.templates[0].zoneid | |
| }; | |
| //if args.data.ispublic is undefined, do not pass ispublic to API call. | |
| if(args.data.ispublic == "on") { | |
| $.extend(data, { | |
| ispublic: true | |
| }); | |
| } | |
| else if(args.data.ispublic == "off") { | |
| $.extend(data, { | |
| ispublic: false | |
| }); | |
| } | |
| //if args.data.isfeatured is undefined, do not pass isfeatured to API call. | |
| if(args.data.isfeatured == "on") { | |
| $.extend(data, { | |
| isfeatured: true | |
| }); | |
| } | |
| else if(args.data.isfeatured == "off") { | |
| $.extend(data, { | |
| isfeatured: false | |
| }); } | |
| //if args.data.isextractable is undefined, do not pass isextractable to API call. | |
| if(args.data.isextractable == "on") { | |
| $.extend(data, { | |
| isextractable: true | |
| }); | |
| } | |
| else if(args.data.isextractable == "off") { | |
| $.extend(data, { | |
| isextractable: false | |
| }); | |
| } | |
| $.ajax({ | |
| url: createURL('updateTemplatePermissions'), | |
| data: data, | |
| async: false, | |
| success: function(json) { | |
| //API doesn't return an embedded object | |
| } | |
| }); | |
| //***** listTemplates ***** | |
| //So, we call listTemplates API to get a complete template object | |
| var data = { | |
| id: args.context.templates[0].id, | |
| zoneid: args.context.templates[0].zoneid, | |
| templatefilter: 'self' | |
| }; | |
| $.ajax({ | |
| url: createURL('listTemplates'), | |
| data: data, | |
| async: false, | |
| success: function(json){ | |
| var item = json.listtemplatesresponse.template; | |
| args.response.success({data: item}); | |
| } | |
| }); | |
| } | |
| }, | |
| copyTemplate: { | |
| label: 'label.action.copy.template', | |
| messages: { | |
| confirm: function(args) { | |
| return 'Are you sure you want to copy template?'; | |
| }, | |
| success: function(args) { | |
| return 'Template is being copied.'; | |
| }, | |
| notification: function(args) { | |
| return 'label.action.copy.template'; | |
| } | |
| }, | |
| createForm: { | |
| title: 'label.action.copy.template', | |
| desc: '', | |
| fields: { | |
| destinationZoneId: { | |
| label: 'label.destination.zone', | |
| docID: 'helpCopyTemplateDestination', | |
| validation: { required: true }, | |
| select: function(args) { | |
| $.ajax({ | |
| url: createURL("listZones&available=true"), | |
| dataType: "json", | |
| async: true, | |
| success: function(json) { | |
| var zoneObjs = []; | |
| var items = json.listzonesresponse.zone; | |
| if(args.context.zoneType == null || args.context.zoneType == '') { //all types | |
| if(items != null) { | |
| for(var i = 0; i < items.length; i++) { | |
| if(items[i].id != args.context.templates[0].zoneid) { //destination zone must be different from source zone | |
| zoneObjs.push({id: items[i].id, description: items[i].name}); | |
| } | |
| } | |
| } | |
| } | |
| else { //Basic type or Advanced type | |
| if(items != null) { | |
| for(var i = 0; i < items.length; i++) { | |
| if(items[i].networktype == args.context.zoneType) { //type must be matched | |
| if(items[i].id != args.context.templates[0].zoneid) { //destination zone must be different from source zone | |
| zoneObjs.push({id: items[i].id, description: items[i].name}); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| args.response.success({data: zoneObjs}); | |
| } | |
| }); | |
| } | |
| } | |
| } | |
| }, | |
| action: function(args) { | |
| $.ajax({ | |
| url: createURL("copyTemplate&id=" + args.context.templates[0].id + "&sourcezoneid=" + args.context.templates[0].zoneid + "&destzoneid=" + args.data.destinationZoneId), | |
| dataType: "json", | |
| async: true, | |
| success: function(json) { | |
| var jid = json.copytemplateresponse.jobid; | |
| args.response.success( | |
| {_custom: | |
| {jobId: jid, | |
| getUpdatedItem: function(json) { | |
| return {}; //nothing in this template needs to be updated | |
| }, | |
| getActionFilter: function() { | |
| return templateActionfilter; | |
| } | |
| } | |
| } | |
| ); | |
| } | |
| }); | |
| }, | |
| notification: { | |
| poll: pollAsyncJobResult | |
| } | |
| }, | |
| downloadTemplate: { | |
| label: 'label.action.download.template', | |
| messages: { | |
| confirm: function(args) { | |
| return 'message.action.download.template'; | |
| }, | |
| notification: function(args) { | |
| return 'Downloading template'; | |
| }, | |
| complete: function(args) { | |
| var url = decodeURIComponent(args.url); | |
| var htmlMsg = _l('message.download.template'); | |
| var htmlMsg2 = htmlMsg.replace(/#/, url).replace(/00000/, url); | |
| return htmlMsg2; | |
| } | |
| }, | |
| action: function(args) { | |
| var apiCmd = "extractTemplate&mode=HTTP_DOWNLOAD&id=" + args.context.templates[0].id; | |
| if(args.context.templates[0].zoneid != null) | |
| apiCmd += "&zoneid=" + args.context.templates[0].zoneid; | |
| $.ajax({ | |
| url: createURL(apiCmd), | |
| dataType: "json", | |
| async: true, | |
| success: function(json) { | |
| var jid = json.extracttemplateresponse.jobid; | |
| args.response.success( | |
| {_custom: | |
| {jobId: jid, | |
| getUpdatedItem: function(json) { | |
| return json.queryasyncjobresultresponse.jobresult.template; | |
| }, | |
| getActionFilter: function() { | |
| return templateActionfilter; | |
| } | |
| } | |
| } | |
| ); | |
| } | |
| }); | |
| }, | |
| notification: { | |
| poll: pollAsyncJobResult | |
| } | |
| }, | |
| remove: { | |
| label: 'label.action.delete.template', | |
| messages: { | |
| confirm: function(args) { | |
| return 'message.action.delete.template'; | |
| }, | |
| notification: function(args) { | |
| return 'label.action.delete.template'; | |
| } | |
| }, | |
| action: function(args) { | |
| var array1 = []; | |
| if (args.context.templates[0].zoneid != null) | |
| array1.push("&zoneid=" + args.context.templates[0].zoneid); | |
| $.ajax({ | |
| url: createURL("deleteTemplate&id=" + args.context.templates[0].id + array1.join("")), | |
| dataType: "json", | |
| async: true, | |
| success: function(json) { | |
| var jid = json.deletetemplateresponse.jobid; | |
| args.response.success( | |
| {_custom: | |
| {jobId: jid | |
| } | |
| } | |
| ); | |
| } | |
| }); | |
| }, | |
| notification: { | |
| poll: pollAsyncJobResult | |
| } | |
| } | |
| }, | |
| tabs: { | |
| details: { | |
| title: 'label.details', | |
| preFilter: function(args) { | |
| var hiddenFields; | |
| if(isAdmin()) { | |
| hiddenFields = []; | |
| } | |
| else { | |
| hiddenFields = ["hypervisor"]; | |
| } | |
| return hiddenFields; | |
| }, | |
| fields: [ | |
| { | |
| name: { | |
| label: 'label.name', | |
| isEditable: true, | |
| validation: { required: true } | |
| } | |
| }, | |
| { | |
| id: { label: 'ID' }, | |
| zonename: { label: 'label.zone.name' }, | |
| zoneid: { label: 'label.zone.id' }, | |
| displaytext: { | |
| label: 'label.description', | |
| isEditable: true, | |
| validation: { required: true } | |
| }, | |
| hypervisor: { label: 'label.hypervisor' }, | |
| templatetype: { label: 'label.type' }, | |
| isready: { label: 'state.ready', converter:cloudStack.converters.toBooleanText }, | |
| status: { label: 'label.status' }, | |
| size : { | |
| label: 'label.size', | |
| converter: function(args) { | |
| if (args == null || args == 0) | |
| return ""; | |
| else | |
| return cloudStack.converters.convertBytes(args); | |
| } | |
| }, | |
| isextractable: { | |
| label: 'extractable', | |
| isBoolean: true, | |
| isEditable: function() { | |
| if(isAdmin()) | |
| return true; | |
| else | |
| return false; | |
| }, | |
| converter:cloudStack.converters.toBooleanText | |
| }, | |
| passwordenabled: { | |
| label: 'label.password.enabled', | |
| isBoolean: true, | |
| isEditable: true, | |
| converter:cloudStack.converters.toBooleanText | |
| }, | |
| ispublic: { | |
| label: 'label.public', | |
| isBoolean: true, | |
| isEditable: function() { | |
| if(isAdmin()) { | |
| return true; | |
| } | |
| else { | |
| if (g_userPublicTemplateEnabled == "true") | |
| return true; | |
| else | |
| return false; | |
| } | |
| }, | |
| converter:cloudStack.converters.toBooleanText | |
| }, | |
| isfeatured: { | |
| label: 'label.featured', | |
| isBoolean: true, | |
| isEditable: function() { | |
| if(isAdmin()) | |
| return true; | |
| else | |
| return false; | |
| }, | |
| converter:cloudStack.converters.toBooleanText | |
| }, | |
| crossZones: { | |
| label: 'label.cross.zones', | |
| converter:cloudStack.converters.toBooleanText | |
| }, | |
| ostypeid: { | |
| label: 'label.os.type', | |
| isEditable: true, | |
| select: function(args) { | |
| $.ajax({ | |
| url: createURL("listOsTypes"), | |
| dataType: "json", | |
| async: true, | |
| success: function(json) { | |
| var ostypes = json.listostypesresponse.ostype; | |
| var items = []; | |
| $(ostypes).each(function() { | |
| items.push({id: this.id, description: this.description}); | |
| }); | |
| args.response.success({data: items}); | |
| } | |
| }); | |
| } | |
| }, | |
| domain: { label: 'label.domain' }, | |
| account: { label: 'label.account' }, | |
| created: { label: 'label.created', converter: cloudStack.converters.toLocalDate } | |
| } | |
| ], | |
| tags: cloudStack.api.tags({ resourceType: 'Template', contextId: 'templates' }), | |
| dataProvider: function(args) { | |
| var jsonObj = args.context.templates[0]; | |
| var apiCmd = "listTemplates&templatefilter=self&id=" + jsonObj.id; | |
| if(jsonObj.zoneid != null) | |
| apiCmd = apiCmd + "&zoneid=" + jsonObj.zoneid; | |
| $.ajax({ | |
| url: createURL(apiCmd), | |
| dataType: "json", | |
| success: function(json) { | |
| args.response.success({ | |
| actionFilter: templateActionfilter, | |
| data: json.listtemplatesresponse.template[0] | |
| }); | |
| } | |
| }); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }, | |
| isos: { | |
| type: 'select', | |
| title: 'label.iso', | |
| listView: { | |
| label: 'label.iso', | |
| filters: { | |
| all: { | |
| preFilter: function(args) { | |
| if (isAdmin()) //"listIsos&filter=all" only works for root-admin, but no domain-admin. Domain-admin is unable to see all Isos until listIsos API supports a new type of isofilter for domain-admin to see all Isos in his domain. | |
| return true; | |
| else | |
| return false; | |
| }, | |
| label: 'ui.listView.filters.all' | |
| }, | |
| mine: { label: 'ui.listView.filters.mine' }, | |
| featured: { label: 'label.featured' }, | |
| community: { label: 'label.community' } | |
| }, | |
| fields: { | |
| name: { label: 'label.name' }, | |
| zonename: { label: 'label.zone' } | |
| }, | |
| reorder: cloudStack.api.actions.sort('updateIso', 'isos'), | |
| actions: { | |
| add: { | |
| label: 'label.action.register.iso', | |
| messages: { | |
| notification: function(args) { | |
| return 'label.action.register.iso'; | |
| } | |
| }, | |
| createForm: { | |
| title: 'label.action.register.iso', | |
| preFilter: cloudStack.preFilter.createTemplate, | |
| fields: { | |
| name: { | |
| label: 'label.name', | |
| docID: 'helpRegisterISOName', | |
| validation: { required: true } | |
| }, | |
| description: { | |
| label: 'label.description', | |
| docID: 'helpRegisterISODescription', | |
| validation: { required: true } | |
| }, | |
| url: { | |
| label: 'URL', | |
| docID: 'helpRegisterISOURL', | |
| validation: { required: true } | |
| }, | |
| zone: { | |
| label: 'label.zone', | |
| docID: 'helpRegisterISOZone', | |
| select: function(args) { | |
| $.ajax({ | |
| url: createURL("listZones&available=true"), | |
| dataType: "json", | |
| async: true, | |
| success: function(json) { | |
| var zoneObjs; | |
| if(args.context.zoneType == null || args.context.zoneType == '') { //all types | |
| zoneObjs = []; | |
| var items = json.listzonesresponse.zone; | |
| if(items != null) { | |
| for(var i = 0; i < items.length; i++) { | |
| zoneObjs.push({id: items[i].id, description: items[i].name}); | |
| } | |
| } | |
| } | |
| else { //Basic type or Advanced type | |
| zoneObjs = []; | |
| var items = json.listzonesresponse.zone; | |
| if(items != null) { | |
| for(var i = 0; i < items.length; i++) { | |
| if(items[i].networktype == args.context.zoneType) { | |
| zoneObjs.push({id: items[i].id, description: items[i].name}); | |
| } | |
| } | |
| } | |
| } | |
| if (isAdmin() && !(cloudStack.context.projects && cloudStack.context.projects[0])){ | |
| zoneObjs.unshift({id: -1, description: "All Zones"}); | |
| } | |
| args.response.success({data: zoneObjs}); | |
| } | |
| }); | |
| } | |
| }, | |
| isBootable: { | |
| label: "label.bootable", | |
| docID: 'helpRegisterISOBootable', | |
| isBoolean: true, | |
| isChecked: true | |
| }, | |
| osTypeId: { | |
| label: 'label.os.type', | |
| docID: 'helpRegisterISOOSType', | |
| dependsOn: 'isBootable', | |
| isHidden: false, | |
| validation: { required: true }, | |
| select: function(args) { | |
| $.ajax({ | |
| url: createURL("listOsTypes"), | |
| dataType: "json", | |
| async: true, | |
| success: function(json) { | |
| var osTypeObjs = json.listostypesresponse.ostype; | |
| var items = []; | |
| //items.push({id: "", description: "None"}); //shouldn't have None option when bootable is checked | |
| $(osTypeObjs).each(function(){ | |
| items.push({id: this.id, description: this.description}); | |
| }); | |
| args.response.success({data: items}); | |
| } | |
| }); | |
| } | |
| }, | |
| isExtractable: { | |
| label: "extractable", | |
| docID: 'helpRegisterISOExtractable', | |
| isBoolean: true | |
| }, | |
| isPublic: { | |
| label: "label.public", | |
| docID: 'helpRegisterISOPublic', | |
| isBoolean: true, | |
| isHidden: true | |
| }, | |
| isFeatured: { | |
| label: "label.featured", | |
| docID: 'helpRegisterISOFeatured', | |
| isBoolean: true, | |
| isHidden: true | |
| } | |
| } | |
| }, | |
| action: function(args) { | |
| var data = { | |
| name: args.data.name, | |
| displayText: args.data.description, | |
| url: args.data.url, | |
| zoneid: args.data.zone, | |
| isextractable: (args.data.isExtractable=="on"), | |
| bootable: (args.data.isBootable=="on") | |
| }; | |
| if(args.$form.find('.form-item[rel=osTypeId]').css("display") != "none") { | |
| $.extend(data, { | |
| osTypeId: args.data.osTypeId | |
| }); | |
| } | |
| if(args.$form.find('.form-item[rel=isPublic]').css("display") != "none") { | |
| $.extend(data, { | |
| ispublic: (args.data.isPublic == "on") | |
| }); | |
| } | |
| if(args.$form.find('.form-item[rel=isFeatured]').css("display") != "none") { | |
| $.extend(data, { | |
| isfeatured: (args.data.isFeatured == "on") | |
| }); | |
| } | |
| $.ajax({ | |
| url: createURL('registerIso'), | |
| data: data, | |
| success: function(json) { | |
| var items = json.registerisoresponse.iso; //items might have more than one array element if it's create ISOs for all zones. | |
| args.response.success({data:items[0]}); | |
| /* | |
| if(items.length > 1) { | |
| for(var i=1; i<items.length; i++) { | |
| var $midmenuItem2 = $("#midmenu_item").clone(); | |
| ISOToMidmenu(items[i], $midmenuItem2); | |
| bindClickToMidMenu($midmenuItem2, templateToRightPanel, ISOGetMidmenuId); | |
| $("#midmenu_container").append($midmenuItem2.show()); } | |
| } | |
| */ | |
| }, | |
| error: function(XMLHttpResponse) { | |
| var errorMsg = parseXMLHttpResponse(XMLHttpResponse); | |
| args.response.error(errorMsg); | |
| } | |
| }); | |
| }, | |
| notification: { | |
| poll: function(args) { | |
| args.complete(); | |
| } | |
| } | |
| } | |
| }, | |
| advSearchFields: { | |
| name: { label: 'Name' }, | |
| zoneid: { | |
| label: 'Zone', | |
| select: function(args) { | |
| $.ajax({ | |
| url: createURL('listZones'), | |
| data: { | |
| listAll: true | |
| }, | |
| success: function(json) { | |
| var zones = json.listzonesresponse.zone; | |
| args.response.success({ | |
| data: $.map(zones, function(zone) { | |
| return { | |
| id: zone.id, | |
| description: zone.name | |
| }; | |
| }) | |
| }); | |
| } | |
| }); | |
| } | |
| }, | |
| tagKey: { label: 'Tag Key' }, | |
| tagValue: { label: 'Tag Value' } | |
| }, | |
| dataProvider: function(args) { | |
| var data = {}; | |
| listViewDataProvider(args, data); | |
| var ignoreProject = false; | |
| if(args.filterBy != null) { //filter dropdown | |
| if(args.filterBy.kind != null) { | |
| switch(args.filterBy.kind) { | |
| case "all": | |
| ignoreProject = true; | |
| $.extend(data, { | |
| isofilter: 'all' | |
| }); | |
| break; | |
| case "mine": | |
| $.extend(data, { | |
| isofilter: 'self' | |
| }); | |
| break; | |
| case "featured": | |
| ignoreProject = true; | |
| $.extend(data, { | |
| isofilter: 'featured' | |
| }); | |
| break; | |
| case "community": | |
| ignoreProject = true; | |
| $.extend(data, { | |
| isofilter: 'community' | |
| }); | |
| break; | |
| } | |
| } | |
| } | |
| $.ajax({ | |
| url: createURL('listIsos', { ignoreProject: ignoreProject }), | |
| data: data, | |
| success: function(json) { | |
| var items = json.listisosresponse.iso; | |
| args.response.success({ | |
| actionFilter: isoActionfilter, | |
| data: items | |
| }); | |
| } | |
| }); | |
| }, | |
| detailView: { | |
| name: 'label.details', | |
| actions: { | |
| edit: { | |
| label: 'label.edit', | |
| action: function(args) { | |
| //***** updateIso ***** | |
| var data = { | |
| id: args.context.isos[0].id, | |
| zoneid: args.context.isos[0].zoneid, | |
| name: args.data.name, | |
| displaytext: args.data.displaytext, | |
| ostypeid: args.data.ostypeid | |
| }; | |
| $.ajax({ | |
| url: createURL('updateIso'), | |
| data: data, | |
| async: false, | |
| success: function(json) { | |
| //updateIso API returns an incomplete ISO object (isextractable and isfeatured are missing) | |
| } | |
| }); | |
| //***** updateIsoPermissions ***** | |
| var data = { | |
| id: args.context.isos[0].id, | |
| zoneid: args.context.isos[0].zoneid, | |
| }; | |
| //if args.data.ispublic is undefined, do not pass ispublic to API call. | |
| if(args.data.ispublic == "on") { | |
| $.extend(data, { | |
| ispublic: true | |
| }); | |
| } | |
| else if(args.data.ispublic == "off") { | |
| $.extend(data, { | |
| ispublic: false | |
| }); | |
| } | |
| //if args.data.isfeatured is undefined, do not pass isfeatured to API call. | |
| if(args.data.isfeatured == "on") { | |
| $.extend(data, { | |
| isfeatured: true | |
| }); | |
| } | |
| else if(args.data.isfeatured == "off") { | |
| $.extend(data, { | |
| isfeatured: false | |
| }); } | |
| //if args.data.isextractable is undefined, do not pass isextractable to API call. | |
| if(args.data.isextractable == "on") { | |
| $.extend(data, { | |
| isextractable: true | |
| }); | |
| } | |
| else if(args.data.isextractable == "off") { | |
| $.extend(data, { | |
| isextractable: false | |
| }); | |
| } | |
| $.ajax({ | |
| url: createURL('updateIsoPermissions'), | |
| data: data, | |
| async: false, | |
| success: function(json) { | |
| //updateIsoPermissions API doesn't return ISO object | |
| } | |
| }); | |
| //***** listIsos ***** | |
| //So, we call listIsos API to get a complete ISO object | |
| var data = { | |
| id: args.context.isos[0].id, | |
| zoneid: args.context.isos[0].zoneid, | |
| isofilter: 'self' | |
| }; | |
| $.ajax({ | |
| url: createURL('listIsos'), | |
| data: data, | |
| async: false, | |
| success: function(json){ | |
| var item = json.listisosresponse.iso; | |
| args.response.success({data: item}); | |
| } | |
| }); | |
| } | |
| }, | |
| copyISO: { | |
| label: 'label.action.copy.ISO', | |
| messages: { | |
| notification: function(args) { | |
| return 'Copying ISO'; | |
| } | |
| }, | |
| createForm: { | |
| title: 'label.action.copy.ISO', | |
| desc: 'label.action.copy.ISO', | |
| fields: { | |
| destinationZoneId: { | |
| label: 'label.destination.zone', | |
| validation: { required: true }, | |
| select: function(args) { | |
| $.ajax({ | |
| url: createURL("listZones&available=true"), | |
| dataType: "json", | |
| async: true, | |
| success: function(json) { | |
| var zoneObjs = []; | |
| var items = json.listzonesresponse.zone; | |
| if(args.context.zoneType == null || args.context.zoneType == '') { //all types | |
| if(items != null) { | |
| for(var i = 0; i < items.length; i++) { | |
| if(items[i].id != args.context.isos[0].zoneid) { //destination zone must be different from source zone | |
| zoneObjs.push({id: items[i].id, description: items[i].name}); | |
| } | |
| } | |
| } | |
| } | |
| else { //Basic type or Advanced type | |
| if(items != null) { | |
| for(var i = 0; i < items.length; i++) { | |
| if(items[i].networktype == args.context.zoneType) { //type must be matched | |
| if(items[i].id != args.context.isos[0].zoneid) { //destination zone must be different from source zone | |
| zoneObjs.push({id: items[i].id, description: items[i].name}); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| args.response.success({data: zoneObjs}); | |
| } | |
| }); | |
| } | |
| } | |
| } | |
| }, | |
| action: function(args) { | |
| $.ajax({ | |
| url: createURL("copyIso&id=" + args.context.isos[0].id + "&sourcezoneid=" + args.context.isos[0].zoneid + "&destzoneid=" + args.data.destinationZoneId), | |
| dataType: "json", | |
| async: true, | |
| success: function(json) { | |
| var jid = json.copytemplateresponse.jobid; | |
| args.response.success( | |
| {_custom: | |
| {jobId: jid, | |
| getUpdatedItem: function(json) { | |
| return {}; //nothing in this ISO needs to be updated | |
| }, | |
| getActionFilter: function() { | |
| return isoActionfilter; | |
| } | |
| } | |
| } | |
| ); | |
| } | |
| }); | |
| }, | |
| notification: { | |
| poll: pollAsyncJobResult | |
| } | |
| }, | |
| downloadISO: { | |
| label: 'label.action.download.ISO', | |
| messages: { | |
| confirm: function(args) { | |
| return 'message.action.download.iso'; | |
| }, | |
| notification: function(args) { | |
| return 'label.action.download.ISO'; | |
| }, | |
| complete: function(args) { | |
| var url = decodeURIComponent(args.url); | |
| var htmlMsg = _l('message.download.ISO'); | |
| var htmlMsg2 = htmlMsg.replace(/#/, url).replace(/00000/, url); | |
| return htmlMsg2; | |
| } | |
| }, | |
| action: function(args) { | |
| var apiCmd = "extractIso&mode=HTTP_DOWNLOAD&id=" + args.context.isos[0].id; | |
| if(args.context.isos[0].zoneid != null) | |
| apiCmd += "&zoneid=" + args.context.isos[0].zoneid; | |
| $.ajax({ | |
| url: createURL(apiCmd), | |
| dataType: "json", | |
| async: true, | |
| success: function(json) { | |
| var jid = json.extractisoresponse.jobid; | |
| args.response.success( | |
| {_custom: | |
| {jobId: jid, | |
| getUpdatedItem: function(json) { | |
| return json.queryasyncjobresultresponse.jobresult.iso; | |
| }, | |
| getActionFilter: function() { | |
| return isoActionfilter; | |
| } | |
| } | |
| } | |
| ); | |
| } | |
| }); | |
| }, | |
| notification: { | |
| poll: pollAsyncJobResult | |
| } | |
| }, | |
| remove: { | |
| label: 'label.action.delete.ISO', | |
| messages: { | |
| confirm: function(args) { | |
| return 'message.action.delete.ISO'; | |
| }, | |
| notification: function(args) { | |
| return 'label.action.delete.ISO'; | |
| } | |
| }, | |
| action: function(args) { | |
| var array1 = []; | |
| if (args.context.isos[0].zoneid != null) | |
| array1.push("&zoneid=" + args.context.isos[0].zoneid); | |
| $.ajax({ | |
| url: createURL("deleteIso&id=" + args.context.isos[0].id + array1.join("")), | |
| dataType: "json", | |
| async: true, | |
| success: function(json) { | |
| var jid = json.deleteisosresponse.jobid; | |
| args.response.success( | |
| {_custom: | |
| {jobId: jid | |
| } | |
| } | |
| ); | |
| } | |
| }); | |
| }, | |
| notification: { | |
| poll: pollAsyncJobResult | |
| } | |
| } | |
| }, | |
| tabs: { | |
| details: { | |
| title: 'label.details', | |
| fields: [ | |
| { | |
| name: { | |
| label: 'label.name', | |
| isEditable: true, | |
| validation: { required: true } | |
| } | |
| }, | |
| { | |
| id: { label: 'ID' }, | |
| zonename: { label: 'label.zone.name' }, | |
| zoneid: { label: 'label.zone.id' }, | |
| displaytext: { | |
| label: 'label.description', | |
| isEditable: true, | |
| validation: { required: true } | |
| }, | |
| isready: { label: 'state.Ready', converter:cloudStack.converters.toBooleanText }, | |
| status: { label: 'label.status' }, | |
| size : { | |
| label: 'label.size', | |
| converter: function(args) { | |
| if (args == null || args == 0) | |
| return ""; | |
| else | |
| return cloudStack.converters.convertBytes(args); | |
| } | |
| }, | |
| isextractable: { | |
| label: 'extractable', | |
| isBoolean: true, | |
| isEditable: true, | |
| converter:cloudStack.converters.toBooleanText | |
| }, | |
| bootable: { | |
| label: 'label.bootable', | |
| converter:cloudStack.converters.toBooleanText | |
| }, | |
| ispublic: { | |
| label: 'label.public', | |
| isBoolean: true, | |
| isEditable: true, | |
| converter:cloudStack.converters.toBooleanText | |
| }, | |
| isfeatured: { | |
| label: 'label.featured', | |
| isBoolean: true, | |
| isEditable: true, | |
| converter:cloudStack.converters.toBooleanText | |
| }, | |
| crossZones: { | |
| label: 'label.cross.zones', | |
| converter:cloudStack.converters.toBooleanText | |
| }, | |
| ostypeid: { | |
| label: 'label.os.type', | |
| isEditable: true, | |
| select: function(args) { | |
| $.ajax({ | |
| url: createURL("listOsTypes"), | |
| dataType: "json", | |
| async: true, | |
| success: function(json) { | |
| var ostypes = json.listostypesresponse.ostype; | |
| var items = []; | |
| $(ostypes).each(function() { | |
| items.push({id: this.id, description: this.description}); | |
| }); | |
| args.response.success({data: items}); | |
| } | |
| }); | |
| } | |
| }, | |
| domain: { label: 'label.domain' }, | |
| account: { label: 'label.account' }, | |
| created: { label: 'label.created', converter: cloudStack.converters.toLocalDate } | |
| } | |
| ], | |
| tags: cloudStack.api.tags({ resourceType: 'ISO', contextId: 'isos' }), | |
| dataProvider: function(args) { | |
| var jsonObj = args.context.isos[0]; | |
| var apiCmd = "listIsos&isofilter=self&id="+jsonObj.id; | |
| if(jsonObj.zoneid != null) | |
| apiCmd = apiCmd + "&zoneid="+jsonObj.zoneid; | |
| $.ajax({ | |
| url: createURL(apiCmd), | |
| dataType: "json", | |
| success: function(json) { | |
| args.response.success({ | |
| actionFilter: isoActionfilter, | |
| data: json.listisosresponse.iso[0] | |
| }); | |
| } | |
| }); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }; | |
| var templateActionfilter = function(args) { | |
| var jsonObj = args.context.item; | |
| var allowedActions = []; | |
| // "Edit Template", "Copy Template", "Create VM" | |
| if ((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id)) //if neither root-admin, nor the same account, nor the same project | |
| || jsonObj.templatetype == "SYSTEM" || jsonObj.isready == false) { | |
| //do nothing | |
| } | |
| else { | |
| allowedActions.push("edit"); | |
| if(havingSwift == false && havingS3 == false) | |
| allowedActions.push("copyTemplate"); | |
| //allowedActions.push("createVm"); // For Beta2, this simply doesn't work without a network. | |
| } | |
| // "Download Template" | |
| if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id))) //if neither root-admin, nor the same account, nor the same project | |
| || (jsonObj.isready == false) || jsonObj.templatetype == "SYSTEM") { | |
| //do nothing | |
| } | |
| else { | |
| allowedActions.push("downloadTemplate"); | |
| } | |
| // "Delete Template" | |
| //if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account))) | |
| if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id))) //if neither root-admin, nor the same account, nor the same project | |
| || (jsonObj.isready == false && jsonObj.status != null && jsonObj.status.indexOf("Downloaded") != -1) | |
| || (jsonObj.account == "system")) { | |
| //do nothing | |
| } | |
| else { | |
| allowedActions.push("remove"); | |
| } | |
| return allowedActions; | |
| } | |
| var isoActionfilter = function(args) { | |
| var jsonObj = args.context.item; | |
| var allowedActions = []; | |
| if ((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id)) //if neither root-admin, nor the same account, nor the same project | |
| || (jsonObj.isready == false) | |
| || (jsonObj.domainid == 1 && jsonObj.account == "system") | |
| ) { | |
| //do nothing | |
| } | |
| else { | |
| allowedActions.push("edit"); | |
| if(havingSwift == false) | |
| allowedActions.push("copyISO"); | |
| } | |
| // "Create VM" | |
| // Commenting this out for Beta2 as it does not support the new network. | |
| /* | |
| //if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id)) //if neither root-admin, nor the same account, nor the same project | |
| if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)) //if neither root-admin, nor item owner | |
| || jsonObj.isready == false) | |
| || (jsonObj.bootable == false) | |
| || (jsonObj.domainid == 1 && jsonObj.account == "system") | |
| ) { | |
| //do nothing | |
| } | |
| else { | |
| allowedActions.push("createVm"); | |
| } | |
| */ | |
| // "Download ISO" | |
| //if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account))) | |
| if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id))) //if neither root-admin, nor the same account, nor the same project | |
| || (jsonObj.isready == false) | |
| || (jsonObj.domainid == 1 && jsonObj.account == "system") | |
| ) { | |
| //do nothing | |
| } | |
| else { | |
| allowedActions.push("downloadISO"); | |
| } | |
| // "Delete ISO" | |
| //if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account))) | |
| if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id))) //if neither root-admin, nor the same account, nor the same project | |
| || (jsonObj.isready == false && jsonObj.status != null && jsonObj.status.indexOf("Downloaded") != -1) | |
| || (jsonObj.account == "system") | |
| ) { | |
| //do nothing | |
| } | |
| else { | |
| allowedActions.push("remove"); | |
| } | |
| return allowedActions; | |
| } | |
| })(cloudStack, jQuery); |