// 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.domains = { title: 'label.menu.domains', id: 'domains', // Domain tree treeView: { overflowScroll: true, // Details detailView: { name: 'label.domain.details', viewAll: { label: 'label.accounts', path: 'accounts' }, // Detail actions actions: { 'delete': { label: 'label.action.delete.domain', messages: { notification: function(args) { return 'label.action.delete.domain'; } }, createForm: { title: 'label.action.delete.domain', desc: 'message.action.delete.domain', createLabel: 'label.delete', preFilter: function(args) { if (isAdmin()) { args.$form.find('.form-item[rel=isForced]').css('display', 'inline-block'); } }, fields: { isForced: { label: 'force.delete', isBoolean: true, isHidden: true } } }, action: function(args) { var array1 = []; if (args.$form.find('.form-item[rel=isForced]').css("display") != "none") //uncomment after Brian fix it to include $form in args array1.push("&cleanup=" + (args.data.isForced == "on")); $.ajax({ url: createURL("deleteDomain&id=" + args.context.domains[0].id + array1.join("")), dataType: "json", async: false, success: function(json) { var jid = json.deletedomainresponse.jobid; var wasDomainDeletedWithSuccess = false; $.ajax({ url: createURL("queryAsyncJobResult&jobId=" + jid), dataType: "json", async: false, success: function(json) { wasDomainDeletedWithSuccess = json.queryasyncjobresultresponse.jobresultcode == 0; } }); args.response.success({ _custom: { jobId: jid } }); if(!wasDomainDeletedWithSuccess){ return; } // Quick fix for proper UI reaction to delete domain var $item = $('.name.selected').closest('li'); var $itemParent = $item.closest('li'); $itemParent.parent().parent().find('.name:first').click(); $item.remove(); } }); }, notification: { poll: pollAsyncJobResult } }, // Edit domain edit: { label: 'label.action.edit.domain', messages: { notification: function(args) { return 'label.action.edit.domain'; } }, action: function(args) { var domainObj; var data = { id: args.context.domains[0].id }; if (args.data.name != null) { //args.data.name == undefined means name field is not editable (when log in as normal user or domain admin) $.extend(data, { name: args.data.name }); } if (args.data.networkdomain != null) { //args.data.networkdomain == undefined means networkdomain field is not editable (when log in as normal user or domain admin) $.extend(data, { networkdomain: args.data.networkdomain }); } if('name' in data || 'networkdomain' in data) { $.ajax({ url: createURL("updateDomain"), async: false, data: data, success: function(json) { domainObj = json.updatedomainresponse.domain; } }); } if (args.data.vmLimit != null) { $.ajax({ url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=0&max=" + args.data.vmLimit), dataType: "json", async: false, success: function(json) { domainObj["vmLimit"] = args.data.vmLimit; } }); } if (args.data.ipLimit != null) { $.ajax({ url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=1&max=" + args.data.ipLimit), dataType: "json", async: false, success: function(json) { domainObj["ipLimit"] = args.data.ipLimit; } }); } if (args.data.volumeLimit != null) { $.ajax({ url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=2&max=" + args.data.volumeLimit), dataType: "json", async: false, success: function(json) { domainObj["volumeLimit"] = args.data.volumeLimit; } }); } if (args.data.snapshotLimit != null) { $.ajax({ url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=3&max=" + args.data.snapshotLimit), dataType: "json", async: false, success: function(json) { domainObj["snapshotLimit"] = args.data.snapshotLimit; } }); } if (args.data.templateLimit != null) { $.ajax({ url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=4&max=" + args.data.templateLimit), dataType: "json", async: false, success: function(json) { domainObj["templateLimit"] = args.data.templateLimit; } }); } if (args.data.vpcLimit != null) { $.ajax({ url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=7&max=" + args.data.vpcLimit), dataType: "json", async: false, success: function(json) { domainObj["vpcLimit"] = args.data.vpcLimit; } }); } if (args.data.cpuLimit != null) { $.ajax({ url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=8&max=" + args.data.cpuLimit), dataType: "json", async: false, success: function(json) { domainObj["cpuLimit"] = args.data.cpuLimit; } }); } if (args.data.memoryLimit != null) { $.ajax({ url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=9&max=" + args.data.memoryLimit), dataType: "json", async: false, success: function(json) { domainObj["memoryLimit"] = args.data.memoryLimit; } }); } if (args.data.networkLimit != null) { $.ajax({ url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=6&max=" + args.data.networkLimit), dataType: "json", async: false, success: function(json) { domainObj["networkLimit"] = args.data.networkLimit; } }); } if (args.data.primaryStorageLimit != null) { $.ajax({ url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=10&max=" + args.data.primaryStorageLimit), dataType: "json", async: false, success: function(json) { domainObj["primaryStorageLimit"] = args.data.primaryStorageLimit; } }); } if (args.data.secondaryStorageLimit != null) { $.ajax({ url: createURL("updateResourceLimit&domainid=" + args.context.domains[0].id + "&resourceType=11&max=" + args.data.secondaryStorageLimit), dataType: "json", async: false, success: function(json) { domainObj["secondaryStorageLimit"] = args.data.secondaryStorageLimit; } }); } args.response.success({ data: domainObj }); } }, // Add domain create: { label: 'label.add.domain', action: function(args) { var data = { parentdomainid: args.context.domains[0].id, name: args.data.name }; if (args.data.networkdomain != null && args.data.networkdomain.length > 0) { $.extend(data, { networkdomain: args.data.networkdomain }); } if (args.data.domainid != null && args.data.domainid.length > 0) { $.extend(data, { domainid: args.data.domainid }); } $.ajax({ url: createURL('createDomain'), data: data, success: function(json) { var item = json.createdomainresponse.domain; args.response.success({ data: item }); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); args.response.error(errorMsg); } }); }, messages: { notification: function(args) { return 'label.add.domain'; } }, createForm: { title: 'label.add.domain', desc: 'message.add.domain', fields: { name: { label: 'label.name', docID: 'helpDomainName', validation: { required: true } }, networkdomain: { label: 'label.network.domain', docID: 'helpDomainNetworkDomain', validation: { required: false } }, domainid: { label: 'label.domain.id', docID: 'helpDomainId', validation: { required: false } } } } }, linktoldap: { label: 'label.link.domain.to.ldap', action: function(args) { var data = { domainid: args.context.domains[0].id, type: args.data.type, name: args.data.name, accounttype: args.data.accounttype }; if (args.data.admin != null && args.data.admin.length > 0) { $.extend(data, { admin: args.data.admin }); } $.ajax({ url: createURL('linkDomainToLdap'), data: data, success: function(json) { var item = json.linkdomaintoldapresponse.LinkDomainToLdap.domainid; args.response.success({ data: item }); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); args.response.error(errorMsg); } }); }, messages: { notification: function(args) { return 'label.link.domain.to.ldap'; } }, createForm: { title: 'label.link.domain.to.ldap', desc: 'message.link.domain.to.ldap', fields: { type: { label: 'label.ldap.link.type', docID: 'helpLdapGroupType', validation: { required: true }, select: function(args) { var items = []; items.push({ id: "GROUP", description: "GROUP" }); //regular-user items.push({ id: "OU", description: "OU" }); //root-admin args.response.success({ data: items }); } }, name: { label: 'label.name', docID: 'helpLdapGroupName', validation: { required: true } }, accounttype: { label: 'label.account.type', docID: 'helpAccountType', validation: { required: true }, select: function(args) { var items = []; items.push({ id: 0, description: "Normal User" }); //regular-user items.push({ id: 2, description: "Domain Admin" }); //root-admin args.response.success({ data: items }); } }, admin: { label: 'label.domain.admin', docID: 'helpLdapLinkDomainAdmin', validation: { required: false } } } } }, updateResourceCount: { label: 'label.action.update.resource.count', messages: { confirm: function(args) { return 'message.update.resource.count'; }, notification: function(args) { return 'label.action.update.resource.count'; } }, action: function(args) { $.ajax({ url: createURL("updateResourceCount&domainid=" + args.context.domains[0].id), dataType: "json", async: true, success: function(json) { //var resourcecounts= json.updateresourcecountresponse.resourcecount; //do nothing args.response.success(); } }); }, notification: { poll: function(args) { args.complete(); } } } }, tabFilter: function(args) { var hiddenTabs = []; if(!isAdmin()) { hiddenTabs.push('settings'); } return hiddenTabs; }, tabs: { details: { title: 'label.details', fields: [{ name: { label: 'label.name', isEditable: function(args) { if (isAdmin() && args.domains[0].level != 0) //ROOT domain (whose level is 0) is not allowed to change domain name return true; else return false; } } }, { id: { label: 'label.id' }, path: { label: 'label.full.path' }, networkdomain: { label: 'label.network.domain', isEditable: function(args) { if (isAdmin()) return true; else return false; } }, vmLimit: { label: 'label.instance.limits', isEditable: function(args) { if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as return false; else return true; } }, ipLimit: { label: 'label.ip.limits', isEditable: function(args) { if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as return false; else return true; } }, volumeLimit: { label: 'label.volume.limits', isEditable: function(args) { if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as return false; else return true; } }, snapshotLimit: { label: 'label.snapshot.limits', isEditable: function(args) { if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as return false; else return true; } }, templateLimit: { label: 'label.template.limits', isEditable: function(args) { if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as return false; else return true; } }, vpcLimit: { label: 'label.VPC.limits', isEditable: function(args) { if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as return false; else return true; } }, cpuLimit: { label: 'label.cpu.limits', isEditable: function(args) { if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as return false; else return true; } }, memoryLimit: { label: 'label.memory.limits', isEditable: function(args) { if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as return false; else return true; } }, networkLimit: { label: 'label.network.limits', isEditable: function(args) { if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as return false; else return true; } }, primaryStorageLimit: { label: 'label.primary.storage.limits', isEditable: function(args) { if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as return false; else return true; } }, secondaryStorageLimit: { label: 'label.secondary.storage.limits', isEditable: function(args) { if (args.domains[0].id == g_domainid) //disallow to update the field on the domain you log in as return false; else return true; } }, accountTotal: { label: 'label.accounts' }, vmTotal: { label: 'label.instances' }, volumeTotal: { label: 'label.volumes' } }], dataProvider: function(args) { var domainObj = args.context.domains[0]; var totalVMs = 0; var totalVolumes = 0; $.ajax({ url: createURL("listAccounts&domainid=" + domainObj.id), async: false, data: {}, success: function(json) { var items = json.listaccountsresponse.account; if (items != null) { domainObj["accountTotal"] = items.length; for (var i = 0; i < items.length; i++) { totalVMs += items[i].vmtotal; totalVolumes += items[i].volumetotal; } } else { domainObj["accountTotal"] = 0; } } }); $.ajax({ url: createURL("listProjects&domainid=" + domainObj.id), async: false, data: {}, success: function(json) { var items = json.listprojectsresponse.project; if (items != null) { for (var i = 0; i < items.length; i++) { totalVMs += items[i].vmtotal; totalVolumes += items[i].volumetotal; } } } }); domainObj["vmTotal"] = totalVMs; domainObj["volumeTotal"] = totalVolumes; $.ajax({ url: createURL("listResourceLimits&domainid=" + domainObj.id), async: false, dataType: "json", success: function(json) { var limits = json.listresourcelimitsresponse.resourcelimit; if (limits != null) { for (var i = 0; i < limits.length; i++) { var limit = limits[i]; switch (limit.resourcetype) { case "0": domainObj["vmLimit"] = limit.max; break; case "1": domainObj["ipLimit"] = limit.max; break; case "2": domainObj["volumeLimit"] = limit.max; break; case "3": domainObj["snapshotLimit"] = limit.max; break; case "4": domainObj["templateLimit"] = limit.max; break; case "6": domainObj["networkLimit"] = limit.max; break; case "7": domainObj["vpcLimit"] = limit.max; break; case "8": domainObj["cpuLimit"] = limit.max; break; case "9": domainObj["memoryLimit"] = limit.max; break; case "10": domainObj["primaryStorageLimit"] = limit.max; break; case "11": domainObj["secondaryStorageLimit"] = limit.max; break; } } } } }); args.response.success({ data: domainObj, actionFilter: domainActionfilter }); } }, // Granular settings for domains settings: { title: 'label.settings', custom: cloudStack.uiCustom.granularSettings({ dataProvider: function(args) { $.ajax({ url: createURL('listConfigurations&domainid=' + args.context.domains[0].id), data: listViewDataProvider(args, {}, { searchBy: 'name' }), success: function(json) { args.response.success({ data: json.listconfigurationsresponse.configuration }); }, error: function(json) { args.response.error(parseXMLHttpResponse(json)); } }); }, actions: { edit: function(args) { // call updateDomainLevelParameters var data = { name: args.data.jsonObj.name, value: args.data.value }; $.ajax({ url: createURL('updateConfiguration&domainid=' + args.context.domains[0].id), data: data, success: function(json) { var item = json.updateconfigurationresponse.configuration; args.response.success({ data: item }); }, error: function(json) { args.response.error(parseXMLHttpResponse(json)); } }); } } }) } } }, labelField: 'name', dataProvider: function(args) { var parentDomain = args.context.parentDomain; if (parentDomain == null) { //draw root node $.ajax({ url: createURL("listDomains&id=" + g_domainid + '&listAll=true'), dataType: "json", async: false, success: function(json) { var domainObjs = json.listdomainsresponse.domain; if (domainObjs != null && domainObjs.length > 0) { domainObjs.sort(function(a, b) { return a.name.localeCompare(b.name); }); } args.response.success({ actionFilter: domainActionfilter, data: domainObjs }); } }); } else { $.ajax({ url: createURL("listDomainChildren&id=" + parentDomain.id), dataType: "json", async: false, success: function(json) { var domainObjs = json.listdomainchildrenresponse.domain; if (domainObjs != null && domainObjs.length > 0) { domainObjs.sort(function(a, b) { return a.name.localeCompare(b.name); }); } args.response.success({ actionFilter: domainActionfilter, data: domainObjs }); } }); } } } }; var domainActionfilter = function(args) { var jsonObj = args.context.item; var allowedActions = []; if (isAdmin()) { allowedActions.push("create"); allowedActions.push("edit"); //merge updateResourceLimit into edit if (jsonObj.level != 0) { //ROOT domain (whose level is 0) is not allowed to delete allowedActions.push("delete"); } if(isLdapEnabled()) { allowedActions.push("linktoldap") } } else if (isDomainAdmin()) { if (args.context.domains[0].id != g_domainid) { allowedActions.push("edit"); //merge updateResourceLimit into edit allowedActions.push("delete"); } allowedActions.push("create"); } allowedActions.push("updateResourceCount"); return allowedActions; } })(cloudStack);