(function(cloudStack, $) { var networkOfferingObjs = []; var selectedNetworkOfferingHavingSG = false; var selectedNetworkOfferingHavingEIP = false; var selectedNetworkOfferingHavingELB = false; var returnedPublicVlanIpRanges = []; //public VlanIpRanges returned by API cloudStack.zoneWizard = { customUI: { publicTrafficIPRange: function(args) { var multiEditData = []; var totalIndex = 0; return $('
').multiEdit({ context: args.context, noSelect: true, fields: { 'gateway': { edit: true, label: 'label.gateway' }, 'netmask': { edit: true, label: 'label.netmask' }, 'vlanid': { edit: true, label: 'label.vlan', isOptional: true }, 'startip': { edit: true, label: 'label.start.IP' }, 'endip': { edit: true, label: 'label.end.IP' }, 'add-rule': { label: 'label.add', addButton: true } }, add: { label: 'label.add', action: function(args) { multiEditData.push($.extend(args.data, { index: totalIndex })); totalIndex++; args.response.success(); } }, actions: { destroy: { label: 'label.remove.rule', action: function(args) { multiEditData = $.grep(multiEditData, function(item) { return item.index != args.context.multiRule[0].index; }); args.response.success(); } } }, dataProvider: function(args) { args.response.success({ data: multiEditData }); } }); }, storageTrafficIPRange: function(args) { var multiEditData = []; var totalIndex = 0; return $('
').multiEdit({ context: args.context, noSelect: true, fields: { 'gateway': { edit: true, label: 'label.gateway' }, 'netmask': { edit: true, label: 'label.netmask' }, 'vlanid': { edit: true, label: 'label.vlan', isOptional: true }, 'startip': { edit: true, label: 'label.start.IP' }, 'endip': { edit: true, label: 'label.end.IP' }, 'add-rule': { label: 'label.add', addButton: true } }, add: { label: 'label.add', action: function(args) { multiEditData.push($.extend(args.data, { index: totalIndex })); totalIndex++; args.response.success(); } }, actions: { destroy: { label: 'label.remove.rule', action: function(args) { multiEditData = $.grep(multiEditData, function(item) { return item.index != args.context.multiRule[0].index; }); args.response.success(); } } }, dataProvider: function(args) { args.response.success({ data: multiEditData }); } }); } }, preFilters: { addPublicNetwork: function(args) { var isShown; var $publicTrafficDesc = $('.zone-wizard:visible').find('#add_zone_public_traffic_desc'); if(args.data['network-model'] == 'Basic') { if(selectedNetworkOfferingHavingSG == true && selectedNetworkOfferingHavingEIP == true && selectedNetworkOfferingHavingELB == true) { $('.conditional.elb').show(); isShown = true; } else { $('.conditional.elb').hide(); isShown = false; } $publicTrafficDesc.find('#for_basic_zone').css('display', 'inline'); $publicTrafficDesc.find('#for_advanced_zone').hide(); } else { //args.data['network-model'] == 'Advanced' $('.conditional.elb').hide(); isShown = true; $publicTrafficDesc.find('#for_advanced_zone').css('display', 'inline'); $publicTrafficDesc.find('#for_basic_zone').hide(); } return isShown; }, addNetscalerDevice: function(args) { //add Netscaler var isShown; if(args.data['network-model'] == 'Basic' && (selectedNetworkOfferingHavingSG == true && selectedNetworkOfferingHavingEIP == true && selectedNetworkOfferingHavingELB == true)) { isShown = true; $('.conditional.elb').show(); } else { isShown= false; $('.conditional.elb').hide(); } return isShown; }, setupPhysicalNetwork: function(args) { return args.data['network-model'] == 'Advanced'; }, configureGuestTraffic: function(args) { return args.data['network-model'] == 'Basic' || $.grep(args.groupedData.physicalNetworks, function(network) { return $.inArray('guest', network.trafficTypes) > -1; }).length; }, configureStorageTraffic: function(args) { return args.data['network-model'] == 'Advanced' && $.grep(args.groupedData.physicalNetworks, function(network) { return $.inArray('storage', network.trafficTypes) > -1; }).length; }, addHost: function(args) { return (args.groupedData.cluster.hypervisor != "VMware"); } }, forms: { zone: { preFilter: function(args) { var $form = args.$form; if (args.data['network-model'] == 'Basic') { args.$form.find('[rel=networkOfferingId]').show(); args.$form.find('[rel=guestcidraddress]').hide(); } else { //args.data['network-model'] == 'Advanced' args.$form.find('[rel=networkOfferingId]').hide(); args.$form.find('[rel=guestcidraddress]').show(); } setTimeout(function() { if ($form.find('input[name=ispublic]').is(':checked')) { $form.find('[rel=domain]').hide(); } }); }, fields: { name: { label: 'label.name', validation: { required: true }, desc: 'message.tooltip.zone.name' }, dns1: { label: 'label.dns.1', validation: { required: true }, desc: 'message.tooltip.dns.1' }, dns2: { label: 'label.dns.2', desc: 'message.tooltip.dns.2' }, internaldns1: { label: 'label.internal.dns.1', validation: { required: true }, desc: 'message.tooltip.internal.dns.1' }, internaldns2: { label: 'label.internal.dns.2', desc: 'message.tooltip.internal.dns.2' }, networkOfferingId: { label: 'label.network.offering', select: function(args) { $.ajax({ url: createURL("listNetworkOfferings&state=Enabled&guestiptype=Shared"), dataType: "json", async: false, success: function(json) { networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering; args.response.success({ data: $.map(networkOfferingObjs, function(offering) { return { id: offering.id, description: offering.name }; }) }); } }); args.$select.change(function(){ //reset when different network offering is selected selectedNetworkOfferingHavingSG = false; selectedNetworkOfferingHavingEIP = false; selectedNetworkOfferingHavingELB = false; var selectedNetworkOfferingId = $(this).val(); $(networkOfferingObjs).each(function(){ if(this.id == selectedNetworkOfferingId) { selectedNetworkOfferingObj = this; return false; //break $.each() loop } }); $(selectedNetworkOfferingObj.service).each(function(){ var thisService = this; if(thisService.name == "SecurityGroup") { selectedNetworkOfferingHavingSG = true; } else if(thisService.name == "StaticNat") { $(thisService.capability).each(function(){ if(this.name == "ElasticIp" && this.value == "true") { selectedNetworkOfferingHavingEIP = true; return false; //break $.each() loop } }); } else if(thisService.name == "Lb") { $(thisService.capability).each(function(){ if(this.name == "ElasticLb" && this.value == "true") { selectedNetworkOfferingHavingELB = true; return false; //break $.each() loop } }); } }); }); } }, networkdomain: { label: 'label.network.domain', desc: 'message.tooltip.network.domain' }, guestcidraddress: { label: 'label.guest.cidr', defaultValue: '10.1.1.0/24', validation: { required: false } }, ispublic: { isReverse: true, isBoolean: true, label: 'label.public', isChecked: true //checked by default (public zone) }, domain: { label: 'label.domain', dependsOn: 'ispublic', isHidden: true, select: function(args) { $.ajax({ url: createURL("listDomains&listAll=true"), data: { viewAll: true }, dataType: "json", async: false, success: function(json) { domainObjs = json.listdomainsresponse.domain; args.response.success({ data: $.map(domainObjs, function(domain) { return { id: domain.id, description: domain.path }; }) }); } }); } } } }, pod: { fields: { name: { label: 'label.pod.name', validation: { required: true }, desc: 'message.tooltip.pod.name' }, reservedSystemGateway: { label: 'label.reserved.system.gateway', validation: { required: true }, desc: 'message.tooltip.reserved.system.gateway' }, reservedSystemNetmask: { label: 'label.reserved.system.netmask', validation: { required: true }, desc: 'message.tooltip.reserved.system.netmask' }, reservedSystemStartIp: { label: 'label.start.reserved.system.IP', validation: { required: true } }, reservedSystemEndIp: { label: 'label.end.reserved.system.IP', validation: { required: false } } } }, basicPhysicalNetwork: { //"Netscaler" now fields: { ip: { label: 'label.ip.address' }, username: { label: 'label.username' }, password: { label: 'label.password', isPassword: true }, networkdevicetype: { label: 'label.type', select: function(args) { var items = []; items.push({id: "NetscalerMPXLoadBalancer", description: "NetScaler MPX LoadBalancer"}); items.push({id: "NetscalerVPXLoadBalancer", description: "NetScaler VPX LoadBalancer"}); items.push({id: "NetscalerSDXLoadBalancer", description: "NetScaler SDX LoadBalancer"}); args.response.success({data: items}); } }, publicinterface: { label: 'label.public.interface' }, privateinterface: { label: 'label.private.interface' }, numretries: { label: 'label.numretries', defaultValue: '2' }, capacity: { label: 'label.capacity', validation: { required: false, number: true } }, dedicated: { label: 'label.dedicated', isBoolean: true, isChecked: false } } }, guestTraffic: { preFilter: function(args) { var $guestTrafficDesc = $('.zone-wizard:visible').find('#add_zone_guest_traffic_desc'); if (args.data['network-model'] == 'Basic') { $guestTrafficDesc.find('#for_basic_zone').css('display', 'inline'); $guestTrafficDesc.find('#for_advanced_zone').hide(); } else { //args.data['network-model'] == 'Advanced' $guestTrafficDesc.find('#for_advanced_zone').css('display', 'inline'); $guestTrafficDesc.find('#for_basic_zone').hide(); } var selectedZoneObj = { networktype: args.data['network-model'] }; var advancedFields = ['vlanRange']; $(advancedFields).each(function() { if (selectedZoneObj.networktype == 'Advanced') { args.$form.find('[rel=' + this + ']').show(); } else { args.$form.find('[rel=' + this + ']').hide(); } }); var basicFields = [ 'guestGateway', 'guestNetmask', 'guestStartIp', 'guestEndIp' ]; $(basicFields).each(function() { if (selectedZoneObj.networktype == 'Basic') { args.$form.find('[rel=' + this + ']').show(); } else { args.$form.find('[rel=' + this + ']').hide(); } }); }, fields: { //Basic (start) guestGateway: { label: 'label.guest.gateway' }, guestNetmask: { label: 'label.guest.netmask' }, guestStartIp: { label: 'label.guest.start.ip' }, guestEndIp: { label: 'label.guest.end.ip' }, //Basic (end) //Advanced (start) vlanRange: { label: 'label.vlan.range', range: ['vlanRangeStart', 'vlanRangeEnd'], validation: { required: false, digits: true } //Bug 13517 - AddZone wizard->Configure guest traffic: Vlan is optional } //Advanced (end) } }, cluster: { fields: { hypervisor: { label: 'label.hypervisor', select: function(args) { $.ajax({ url: createURL("listHypervisors"), dataType: "json", async: false, success: function(json) { var hypervisors = json.listhypervisorsresponse.hypervisor; var items = []; $(hypervisors).each(function() { items.push({id: this.name, description: this.name}) }); args.response.success({data: items}); } }); args.$select.bind("change", function(event) { var $form = $(this).closest('form'); if($(this).val() == "VMware") { //$('li[input_sub_group="external"]', $dialogAddCluster).show(); $form.find('[rel=vCenterHost]').css('display', 'block'); $form.find('[rel=vCenterUsername]').css('display', 'block'); $form.find('[rel=vCenterPassword]').css('display', 'block'); $form.find('[rel=vCenterDatacenter]').css('display', 'block'); //$("#cluster_name_label", $dialogAddCluster).text("vCenter Cluster:"); } else { //$('li[input_group="vmware"]', $dialogAddCluster).hide(); $form.find('[rel=vCenterHost]').css('display', 'none'); $form.find('[rel=vCenterUsername]').css('display', 'none'); $form.find('[rel=vCenterPassword]').css('display', 'none'); $form.find('[rel=vCenterDatacenter]').css('display', 'none'); //$("#cluster_name_label", $dialogAddCluster).text("Cluster:"); } }); } }, name: { label: 'label.cluster.name', validation: { required: true } }, //hypervisor==VMWare begins here vCenterHost: { label: 'label.vcenter.host', validation: { required: true } }, vCenterUsername: { label: 'label.vcenter.username', validation: { required: true } }, vCenterPassword: { label: 'label.vcenter.password', validation: { required: true }, isPassword: true }, vCenterDatacenter: { label: 'label.vcenter.datacenter', validation: { required: true } } //hypervisor==VMWare ends here } }, host: { preFilter: function(args) { var selectedClusterObj = { hypervisortype: args.data.hypervisor }; var $form = args.$form; if(selectedClusterObj.hypervisortype == "VMware") { //$('li[input_group="general"]', $dialogAddHost).hide(); $form.find('[rel=hostname]').hide(); $form.find('[rel=username]').hide(); $form.find('[rel=password]').hide(); //$('li[input_group="vmware"]', $dialogAddHost).show(); $form.find('[rel=vcenterHost]').css('display', 'block'); //$('li[input_group="baremetal"]', $dialogAddHost).hide(); $form.find('[rel=baremetalCpuCores]').hide(); $form.find('[rel=baremetalCpu]').hide(); $form.find('[rel=baremetalMemory]').hide(); $form.find('[rel=baremetalMAC]').hide(); //$('li[input_group="Ovm"]', $dialogAddHost).hide(); $form.find('[rel=agentUsername]').hide(); $form.find('[rel=agentPassword]').hide(); } else if (selectedClusterObj.hypervisortype == "BareMetal") { //$('li[input_group="general"]', $dialogAddHost).show(); $form.find('[rel=hostname]').css('display', 'block'); $form.find('[rel=username]').css('display', 'block'); $form.find('[rel=password]').css('display', 'block'); //$('li[input_group="baremetal"]', $dialogAddHost).show(); $form.find('[rel=baremetalCpuCores]').css('display', 'block'); $form.find('[rel=baremetalCpu]').css('display', 'block'); $form.find('[rel=baremetalMemory]').css('display', 'block'); $form.find('[rel=baremetalMAC]').css('display', 'block'); //$('li[input_group="vmware"]', $dialogAddHost).hide(); $form.find('[rel=vcenterHost]').hide(); //$('li[input_group="Ovm"]', $dialogAddHost).hide(); $form.find('[rel=agentUsername]').hide(); $form.find('[rel=agentPassword]').hide(); } else if (selectedClusterObj.hypervisortype == "Ovm") { //$('li[input_group="general"]', $dialogAddHost).show(); $form.find('[rel=hostname]').css('display', 'block'); $form.find('[rel=username]').css('display', 'block'); $form.find('[rel=password]').css('display', 'block'); //$('li[input_group="vmware"]', $dialogAddHost).hide(); $form.find('[rel=vcenterHost]').hide(); //$('li[input_group="baremetal"]', $dialogAddHost).hide(); $form.find('[rel=baremetalCpuCores]').hide(); $form.find('[rel=baremetalCpu]').hide(); $form.find('[rel=baremetalMemory]').hide(); $form.find('[rel=baremetalMAC]').hide(); //$('li[input_group="Ovm"]', $dialogAddHost).show(); $form.find('[rel=agentUsername]').css('display', 'block'); $form.find('[rel=agentUsername]').find('input').val("oracle"); $form.find('[rel=agentPassword]').css('display', 'block'); } else { //$('li[input_group="general"]', $dialogAddHost).show(); $form.find('[rel=hostname]').css('display', 'block'); $form.find('[rel=username]').css('display', 'block'); $form.find('[rel=password]').css('display', 'block'); //$('li[input_group="vmware"]', $dialogAddHost).hide(); $form.find('[rel=vcenterHost]').hide(); //$('li[input_group="baremetal"]', $dialogAddHost).hide(); $form.find('[rel=baremetalCpuCores]').hide(); $form.find('[rel=baremetalCpu]').hide(); $form.find('[rel=baremetalMemory]').hide(); $form.find('[rel=baremetalMAC]').hide(); //$('li[input_group="Ovm"]', $dialogAddHost).hide(); $form.find('[rel=agentUsername]').hide(); $form.find('[rel=agentPassword]').hide(); } }, fields: { hostname: { label: 'label.host.name', validation: { required: true }, isHidden: true }, username: { label: 'label.username', validation: { required: true }, isHidden: true }, password: { label: 'label.password', validation: { required: true }, isHidden: true, isPassword: true }, //input_group="general" ends here //input_group="VMWare" starts here vcenterHost: { label: 'label.esx.host', validation: { required: true }, isHidden: true }, //input_group="VMWare" ends here //input_group="BareMetal" starts here baremetalCpuCores: { label: 'label.num.cpu.cores', validation: { required: true }, isHidden: true }, baremetalCpu: { label: 'label.cpu.mhz', validation: { required: true }, isHidden: true }, baremetalMemory: { label: 'label.memory.mb', validation: { required: true }, isHidden: true }, baremetalMAC: { label: 'label.host.MAC', validation: { required: true }, isHidden: true }, //input_group="BareMetal" ends here //input_group="OVM" starts here agentUsername: { label: 'label.agent.username', validation: { required: false }, isHidden: true }, agentPassword: { label: 'label.agent.password', validation: { required: true }, isHidden: true, isPassword: true }, //input_group="OVM" ends here //always appear (begin) hosttags: { label: 'label.host.tags', validation: { required: false } } //always appear (end) } }, primaryStorage: { preFilter: function(args) {}, fields: { name: { label: 'label.name', validation: { required: false } // Primary storage is not required. User can use local storage instead of primary storage. }, protocol: { label: 'label.protocol', validation: { required: false }, // Primary storage is not required. User can use local storage instead of primary storage. select: function(args) { var selectedClusterObj = { hypervisortype: args.context.zones[0].hypervisor }; if(selectedClusterObj == null) return; if(selectedClusterObj.hypervisortype == "KVM") { var items = []; items.push({id: "nfs", description: "nfs"}); items.push({id: "SharedMountPoint", description: "SharedMountPoint"}); items.push({id: "clvm", description: "CLVM"}); args.response.success({data: items}); } else if(selectedClusterObj.hypervisortype == "XenServer") { var items = []; items.push({id: "nfs", description: "nfs"}); items.push({id: "PreSetup", description: "PreSetup"}); items.push({id: "iscsi", description: "iscsi"}); args.response.success({data: items}); } else if(selectedClusterObj.hypervisortype == "VMware") { var items = []; items.push({id: "nfs", description: "nfs"}); items.push({id: "vmfs", description: "vmfs"}); args.response.success({data: items}); } else if(selectedClusterObj.hypervisortype == "Ovm") { var items = []; items.push({id: "nfs", description: "nfs"}); items.push({id: "ocfs2", description: "ocfs2"}); args.response.success({data: items}); } else { args.response.success({data:[]}); } args.$select.change(function() { var $form = $(this).closest('form'); var protocol = $(this).val(); if(protocol == null) return; if(protocol == "nfs") { //$("#add_pool_server_container", $dialogAddPool).show(); $form.find('[rel=server]').css('display', 'block'); //$dialogAddPool.find("#add_pool_nfs_server").val(""); $form.find('[rel=server]').find(".value").find("input").val(""); //$('li[input_group="nfs"]', $dialogAddPool).show(); $form.find('[rel=path]').css('display', 'block'); //$dialogAddPool.find("#add_pool_path_container").find("label").text(g_dictionary["label.path"]+":"); $form.find('[rel=path]').find(".name").find("label").text("Path:"); //$('li[input_group="iscsi"]', $dialogAddPool).hide(); $form.find('[rel=iqn]').hide(); $form.find('[rel=lun]').hide(); //$('li[input_group="clvm"]', $dialogAddPool).hide(); $form.find('[rel=volumegroup]').hide(); //$('li[input_group="vmfs"]', $dialogAddPool).hide(); $form.find('[rel=vCenterDataCenter]').hide(); $form.find('[rel=vCenterDataStore]').hide(); } else if(protocol == "ocfs2") {//ocfs2 is the same as nfs, except no server field. //$dialogAddPool.find("#add_pool_server_container").hide(); $form.find('[rel=server]').hide(); //$dialogAddPool.find("#add_pool_nfs_server").val(""); $form.find('[rel=server]').find(".value").find("input").val(""); //$('li[input_group="nfs"]', $dialogAddPool).show(); $form.find('[rel=path]').css('display', 'block'); //$dialogAddPool.find("#add_pool_path_container").find("label").text(g_dictionary["label.path"]+":"); $form.find('[rel=path]').find(".name").find("label").text("Path:"); //$('li[input_group="iscsi"]', $dialogAddPool).hide(); $form.find('[rel=iqn]').hide(); $form.find('[rel=lun]').hide(); //$('li[input_group="clvm"]', $dialogAddPool).hide(); $form.find('[rel=volumegroup]').hide(); //$('li[input_group="vmfs"]', $dialogAddPool).hide(); $form.find('[rel=vCenterDataCenter]').hide(); $form.find('[rel=vCenterDataStore]').hide(); } else if(protocol == "PreSetup") { //$dialogAddPool.find("#add_pool_server_container").hide(); $form.find('[rel=server]').hide(); //$dialogAddPool.find("#add_pool_nfs_server").val("localhost"); $form.find('[rel=server]').find(".value").find("input").val("localhost"); //$('li[input_group="nfs"]', $dialogAddPool).show(); $form.find('[rel=path]').css('display', 'block'); //$dialogAddPool.find("#add_pool_path_container").find("label").text(g_dictionary["label.SR.name"]+":"); $form.find('[rel=path]').find(".name").find("label").text("SR Name-Label:"); //$('li[input_group="iscsi"]', $dialogAddPool).hide(); $form.find('[rel=iqn]').hide(); $form.find('[rel=lun]').hide(); //$('li[input_group="clvm"]', $dialogAddPool).hide(); $form.find('[rel=volumegroup]').hide(); //$('li[input_group="vmfs"]', $dialogAddPool).hide(); $form.find('[rel=vCenterDataCenter]').hide(); $form.find('[rel=vCenterDataStore]').hide(); } else if(protocol == "iscsi") { //$dialogAddPool.find("#add_pool_server_container").show(); $form.find('[rel=server]').css('display', 'block'); //$dialogAddPool.find("#add_pool_nfs_server").val(""); $form.find('[rel=server]').find(".value").find("input").val(""); //$('li[input_group="nfs"]', $dialogAddPool).hide(); $form.find('[rel=path]').hide(); //$('li[input_group="iscsi"]', $dialogAddPool).show(); $form.find('[rel=iqn]').css('display', 'block'); $form.find('[rel=lun]').css('display', 'block'); //$('li[input_group="clvm"]', $dialogAddPool).hide(); $form.find('[rel=volumegroup]').hide(); //$('li[input_group="vmfs"]', $dialogAddPool).hide(); $form.find('[rel=vCenterDataCenter]').hide(); $form.find('[rel=vCenterDataStore]').hide(); } else if($(this).val() == "clvm") { //$("#add_pool_server_container", $dialogAddPool).hide(); $form.find('[rel=server]').hide(); //$dialogAddPool.find("#add_pool_nfs_server").val("localhost"); $form.find('[rel=server]').find(".value").find("input").val("localhost"); //$('li[input_group="nfs"]', $dialogAddPool).hide(); $form.find('[rel=path]').hide(); //$('li[input_group="iscsi"]', $dialogAddPool).hide(); $form.find('[rel=iqn]').hide(); $form.find('[rel=lun]').hide(); //$('li[input_group="clvm"]', $dialogAddPool).show(); $form.find('[rel=volumegroup]').css('display', 'inline-block'); //$('li[input_group="vmfs"]', $dialogAddPool).hide(); $form.find('[rel=vCenterDataCenter]').hide(); $form.find('[rel=vCenterDataStore]').hide(); } else if(protocol == "vmfs") { //$dialogAddPool.find("#add_pool_server_container").show(); $form.find('[rel=server]').css('display', 'block'); //$dialogAddPool.find("#add_pool_nfs_server").val(""); $form.find('[rel=server]').find(".value").find("input").val(""); //$('li[input_group="nfs"]', $dialogAddPool).hide(); $form.find('[rel=path]').hide(); //$('li[input_group="iscsi"]', $dialogAddPool).hide(); $form.find('[rel=iqn]').hide(); $form.find('[rel=lun]').hide(); //$('li[input_group="clvm"]', $dialogAddPool).hide(); $form.find('[rel=volumegroup]').hide(); //$('li[input_group="vmfs"]', $dialogAddPool).show(); $form.find('[rel=vCenterDataCenter]').css('display', 'block'); $form.find('[rel=vCenterDataStore]').css('display', 'block'); } else if(protocol == "SharedMountPoint") { //"SharedMountPoint" show the same fields as "nfs" does. //$dialogAddPool.find("#add_pool_server_container").hide(); $form.find('[rel=server]').hide(); //$dialogAddPool.find("#add_pool_nfs_server").val("localhost"); $form.find('[rel=server]').find(".value").find("input").val("localhost"); //$('li[input_group="nfs"]', $dialogAddPool).show(); $form.find('[rel=path]').css('display', 'block'); $form.find('[rel=path]').find(".name").find("label").text("Path:"); //$('li[input_group="iscsi"]', $dialogAddPool).hide(); $form.find('[rel=iqn]').hide(); $form.find('[rel=lun]').hide(); //$('li[input_group="clvm"]', $dialogAddPool).hide(); $form.find('[rel=volumegroup]').hide(); //$('li[input_group="vmfs"]', $dialogAddPool).hide(); $form.find('[rel=vCenterDataCenter]').hide(); $form.find('[rel=vCenterDataStore]').hide(); } else { //$dialogAddPool.find("#add_pool_server_container").show(); $form.find('[rel=server]').css('display', 'block'); //$dialogAddPool.find("#add_pool_nfs_server").val(""); $form.find('[rel=server]').find(".value").find("input").val(""); //$('li[input_group="iscsi"]', $dialogAddPool).hide(); $form.find('[rel=iqn]').hide(); $form.find('[rel=lun]').hide(); //$('li[input_group="clvm"]', $dialogAddPool).hide(); $form.find('[rel=volumegroup]').hide(); //$('li[input_group="vmfs"]', $dialogAddPool).hide(); $form.find('[rel=vCenterDataCenter]').hide(); $form.find('[rel=vCenterDataStore]').hide(); } }); args.$select.trigger("change"); } }, server: { label: 'label.server', validation: { required: false }, // Primary storage is not required. User can use local storage instead of primary storage. isHidden: true }, //nfs path: { label: 'label.path', validation: { required: false }, // Primary storage is not required. User can use local storage instead of primary storage. isHidden: true }, //iscsi iqn: { label: 'label.target.iqn', validation: { required: false }, // Primary storage is not required. User can use local storage instead of primary storage. isHidden: true }, lun: { label: 'label.LUN.number', validation: { required: false }, // Primary storage is not required. User can use local storage instead of primary storage. isHidden: true }, //clvm volumegroup: { label: 'label.volgroup', validation: { required: false }, // Primary storage is not required. User can use local storage instead of primary storage. isHidden: true }, //vmfs vCenterDataCenter: { label: 'label.vcenter.datacenter', validation: { required: false }, // Primary storage is not required. User can use local storage instead of primary storage. isHidden: true }, vCenterDataStore: { label: 'label.vcenter.datastore', validation: { required: false }, // Primary storage is not required. User can use local storage instead of primary storage. isHidden: true }, //always appear (begin) storageTags: { label: 'label.storage.tags', validation: { required: false } // Primary storage is not required. User can use local storage instead of primary storage. } //always appear (end) } }, secondaryStorage: { fields: { nfsServer: { label: 'label.nfs.server', validation: { required: true } }, path: { label: 'label.path', validation: { required: true } } } } }, action: function(args) { var advZoneConfiguredPhysicalNetworkCount = 0; //for multiple physical networks in advanced zone var success = args.response.success; var error = args.response.error; var message = args.response.message; //var data = args.data; var startFn = args.startFn; var data = args.data; var stepFns = { addZone: function() { message(dictionary['message.creating.zone']); var array1 = []; var networkType = args.data.zone.networkType; //"Basic", "Advanced" array1.push("&networktype=" + todb(networkType)); if(networkType == "Advanced") { if(args.data.zone.guestcidraddress != null && args.data.zone.guestcidraddress.length > 0) array1.push("&guestcidraddress=" + todb(args.data.zone.guestcidraddress)); } array1.push("&name=" + todb(args.data.zone.name)); array1.push("&dns1=" + todb(args.data.zone.dns1)); var dns2 = args.data.zone.dns2; if (dns2 != null && dns2.length > 0) array1.push("&dns2=" + todb(dns2)); array1.push("&internaldns1="+todb(args.data.zone.internaldns1)); var internaldns2 = args.data.zone.internaldns2; if (internaldns2 != null && internaldns2.length > 0) array1.push("&internaldns2=" + todb(internaldns2)); if(args.data.zone.ispublic == null) //public checkbox is unchecked array1.push("&domainid=" + args.data.zone.domain); if(args.data.zone.networkdomain != null && args.data.zone.networkdomain.length > 0) array1.push("&domain=" + todb(args.data.zone.networkdomain)); $.ajax({ url: createURL("createZone" + array1.join("")), dataType: "json", async: false, success: function(json) { stepFns.addPhysicalNetworks({ data: $.extend(args.data, { returnedZone: json.createzoneresponse.zone }) }); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); error('addZone', errorMsg, { fn: 'addZone', args: args }); } }); }, addPhysicalNetworks: function(args) { message(dictionary['message.creating.physical.networks']); var returnedPhysicalNetworks = []; if(args.data.zone.networkType == "Basic") { var requestedTrafficTypeCount = 2; //request guest traffic type, management traffic type if(selectedNetworkOfferingHavingSG == true && selectedNetworkOfferingHavingEIP == true && selectedNetworkOfferingHavingELB == true) requestedTrafficTypeCount++; //request public traffic type $.ajax({ url: createURL("createPhysicalNetwork&zoneid=" + args.data.returnedZone.id + "&name=PhysicalNetworkInBasicZone"), dataType: "json", success: function(json) { var jobId = json.createphysicalnetworkresponse.jobid; var timerKey = "createPhysicalNetworkJob_" + jobId; $("body").everyTime(2000, timerKey, function(){ $.ajax({ url: createURL("queryAsyncJobResult&jobid=" + jobId), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { $("body").stopTime(timerKey); if (result.jobstatus == 1) { var returnedBasicPhysicalNetwork = result.jobresult.physicalnetwork; var returnedTrafficTypes = []; $.ajax({ url: createURL("addTrafficType&trafficType=Guest&physicalnetworkid=" + returnedBasicPhysicalNetwork.id), dataType: "json", success: function(json) { var jobId = json.addtraffictyperesponse.jobid; var timerKey = "addTrafficTypeJob_" + jobId; $("body").everyTime(2000, timerKey, function() { $.ajax({ url: createURL("queryAsyncJobResult&jobid=" + jobId), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { $("body").stopTime(timerKey); if (result.jobstatus == 1) { returnedTrafficTypes.push(result.jobresult.traffictype); if(returnedTrafficTypes.length == requestedTrafficTypeCount) { //all requested traffic types have been added returnedBasicPhysicalNetwork.returnedTrafficTypes = returnedTrafficTypes; stepFns.configurePhysicalNetwork({ data: $.extend(args.data, { returnedBasicPhysicalNetwork: returnedBasicPhysicalNetwork }) }); } } else if (result.jobstatus == 2) { alert("Failed to add Guest traffic type to basic zone. Error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("Failed to add Guest traffic type to basic zone. Error: " + errorMsg); } }); }); } }); $.ajax({ url: createURL("addTrafficType&trafficType=Management&physicalnetworkid=" + returnedBasicPhysicalNetwork.id), dataType: "json", success: function(json) { var jobId = json.addtraffictyperesponse.jobid; var timerKey = "addTrafficTypeJob_" + jobId; $("body").everyTime(2000, timerKey, function() { $.ajax({ url: createURL("queryAsyncJobResult&jobid=" + jobId), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { $("body").stopTime(timerKey); if (result.jobstatus == 1) { returnedTrafficTypes.push(result.jobresult.traffictype); if(returnedTrafficTypes.length == requestedTrafficTypeCount) { //all requested traffic types have been added returnedBasicPhysicalNetwork.returnedTrafficTypes = returnedTrafficTypes; stepFns.configurePhysicalNetwork({ data: $.extend(args.data, { returnedBasicPhysicalNetwork: returnedBasicPhysicalNetwork }) }); } } else if (result.jobstatus == 2) { alert("Failed to add Management traffic type to basic zone. Error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("Failed to add Management traffic type to basic zone. Error: " + errorMsg); } }); }); } }); if(selectedNetworkOfferingHavingSG == true && selectedNetworkOfferingHavingEIP == true && selectedNetworkOfferingHavingELB == true) { $.ajax({ url: createURL("addTrafficType&trafficType=Public&physicalnetworkid=" + returnedBasicPhysicalNetwork.id), dataType: "json", success: function(json) { var jobId = json.addtraffictyperesponse.jobid; var timerKey = "addTrafficTypeJob_" + jobId; $("body").everyTime(2000, timerKey, function() { $.ajax({ url: createURL("queryAsyncJobResult&jobid=" + jobId), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { $("body").stopTime(timerKey); if (result.jobstatus == 1) { returnedTrafficTypes.push(result.jobresult.traffictype); if(returnedTrafficTypes.length == requestedTrafficTypeCount) { //all requested traffic types have been added returnedBasicPhysicalNetwork.returnedTrafficTypes = returnedTrafficTypes; stepFns.configurePhysicalNetwork({ data: $.extend(args.data, { returnedBasicPhysicalNetwork: returnedBasicPhysicalNetwork }) }); } } else if (result.jobstatus == 2) { alert("Failed to add Public traffic type to basic zone. Error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("Failed to add Public traffic type to basic zone. Error: " + errorMsg); } }); }); } }); } } else if (result.jobstatus == 2) { alert("createPhysicalNetwork failed. Error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("createPhysicalNetwork failed. Error: " + errorMsg); } }); }); } }); } else if(args.data.zone.networkType == "Advanced") { $(args.data.physicalNetworks).each(function(){ var thisPhysicalNetwork = this; $.ajax({ url: createURL("createPhysicalNetwork&zoneid=" + args.data.returnedZone.id + "&name=" + todb(thisPhysicalNetwork.name)), dataType: "json", success: function(json) { var jobId = json.createphysicalnetworkresponse.jobid; var timerKey = "createPhysicalNetworkJob_" + jobId; $("body").everyTime(2000, timerKey, function(){ $.ajax({ url: createURL("queryAsyncJobResult&jobid=" + jobId), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { $("body").stopTime(timerKey); if (result.jobstatus == 1) { var returnedPhysicalNetwork = result.jobresult.physicalnetwork; returnedPhysicalNetwork.originalId = thisPhysicalNetwork.id; var returnedTrafficTypes = []; $(thisPhysicalNetwork.trafficTypes).each(function(){ var thisTrafficType = this; var apiCmd = "addTrafficType&physicalnetworkid=" + returnedPhysicalNetwork.id; if(thisTrafficType == "public") apiCmd += "&trafficType=Public"; else if(thisTrafficType == "management") apiCmd += "&trafficType=Management"; else if(thisTrafficType == "guest") apiCmd += "&trafficType=Guest"; else if(thisTrafficType == "storage") apiCmd += "&trafficType=Storage"; $.ajax({ url: createURL(apiCmd), dataType: "json", success: function(json) { var jobId = json.addtraffictyperesponse.jobid; var timerKey = "addTrafficTypeJob_" + jobId; $("body").everyTime(2000, timerKey, function() { $.ajax({ url: createURL("queryAsyncJobResult&jobid=" + jobId), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { $("body").stopTime(timerKey); if (result.jobstatus == 1) { returnedTrafficTypes.push(result.jobresult.traffictype); if(returnedTrafficTypes.length == thisPhysicalNetwork.trafficTypes.length) { //this physical network is complete (specified traffic types are added) returnedPhysicalNetwork.returnedTrafficTypes = returnedTrafficTypes; returnedPhysicalNetworks.push(returnedPhysicalNetwork); if(returnedPhysicalNetworks.length == args.data.physicalNetworks.length) { //all physical networks are complete stepFns.configurePhysicalNetwork({ data: $.extend(args.data, { returnedPhysicalNetworks: returnedPhysicalNetworks }) }); } } } else if (result.jobstatus == 2) { alert(apiCmd + " failed. Error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert(apiCmd + " failed. Error: " + errorMsg); } }); }); } }); }); } else if (result.jobstatus == 2) { alert("createPhysicalNetwork failed. Error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("createPhysicalNetwork failed. Error: " + errorMsg); } }); }); } }); }); } }, //afterCreateZonePhysicalNetworkTrafficTypes: enable physical network, enable virtual router element, enable network service provider configurePhysicalNetwork: function(args) { message(dictionary['message.configuring.physical.networks']); if(args.data.zone.networkType == "Basic") { $.ajax({ url: createURL("updatePhysicalNetwork&state=Enabled&id=" + args.data.returnedBasicPhysicalNetwork.id), dataType: "json", success: function(json) { //var jobId = json.updatephysicalnetworkresponse.jobid; var updatePhysicalNetworkTimer = "updatePhysicalNetworkJob_" + json.updatephysicalnetworkresponse.jobid; $("body").everyTime(2000, updatePhysicalNetworkTimer, function() { $.ajax({ url: createURL("queryAsyncJobResult&jobId=" + json.updatephysicalnetworkresponse.jobid), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { $("body").stopTime(updatePhysicalNetworkTimer); if (result.jobstatus == 1) { //alert("updatePhysicalNetwork succeeded."); // get network service provider ID of Virtual Router var virtualRouterProviderId; $.ajax({ url: createURL("listNetworkServiceProviders&name=VirtualRouter&physicalNetworkId=" + args.data.returnedBasicPhysicalNetwork.id), dataType: "json", async: false, success: function(json) { var items = json.listnetworkserviceprovidersresponse.networkserviceprovider; if(items != null && items.length > 0) { virtualRouterProviderId = items[0].id; } } }); if(virtualRouterProviderId == null) { alert("error: listNetworkServiceProviders API doesn't return VirtualRouter provider ID"); return; } var virtualRouterElementId; $.ajax({ url: createURL("listVirtualRouterElements&nspid=" + virtualRouterProviderId), dataType: "json", async: false, success: function(json) { var items = json.listvirtualrouterelementsresponse.virtualrouterelement; if(items != null && items.length > 0) { virtualRouterElementId = items[0].id; } } }); if(virtualRouterElementId == null) { alert("error: listVirtualRouterElements API doesn't return Virtual Router Element Id"); return; } $.ajax({ url: createURL("configureVirtualRouterElement&enabled=true&id=" + virtualRouterElementId), dataType: "json", async: false, success: function(json) { //var jobId = json.configurevirtualrouterelementresponse.jobid; var configureVirtualRouterElementTimer = "configureVirtualRouterElementJob_" + json.configurevirtualrouterelementresponse.jobid; $("body").everyTime(2000, configureVirtualRouterElementTimer, function() { $.ajax({ url: createURL("queryAsyncJobResult&jobId=" + json.configurevirtualrouterelementresponse.jobid), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { $("body").stopTime(configureVirtualRouterElementTimer); if (result.jobstatus == 1) { //alert("configureVirtualRouterElement succeeded."); $.ajax({ url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + virtualRouterProviderId), dataType: "json", async: false, success: function(json) { //var jobId = json.updatenetworkserviceproviderresponse.jobid; var updateNetworkServiceProviderTimer = "updateNetworkServiceProviderJob_" + json.updatenetworkserviceproviderresponse.jobid; $("body").everyTime(2000, updateNetworkServiceProviderTimer, function() { $.ajax({ url: createURL("queryAsyncJobResult&jobId=" + json.updatenetworkserviceproviderresponse.jobid), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { $("body").stopTime(updateNetworkServiceProviderTimer); if (result.jobstatus == 1) { //alert("Virtual Router Provider is enabled"); if(selectedNetworkOfferingHavingSG == true) { //need to Enable security group provider first // get network service provider ID of Security Group var securityGroupProviderId; $.ajax({ url: createURL("listNetworkServiceProviders&name=SecurityGroupProvider&physicalNetworkId=" + args.data.returnedBasicPhysicalNetwork.id), dataType: "json", async: false, success: function(json) { var items = json.listnetworkserviceprovidersresponse.networkserviceprovider; if(items != null && items.length > 0) { securityGroupProviderId = items[0].id; } } }); if(securityGroupProviderId == null) { alert("error: listNetworkServiceProviders API doesn't return security group provider ID"); return; } $.ajax({ url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + securityGroupProviderId), dataType: "json", async: false, success: function(json) { var updateNetworkServiceProviderTimer = "asyncJob_" + json.updatenetworkserviceproviderresponse.jobid; $("body").everyTime(2000, updateNetworkServiceProviderTimer, function() { $.ajax({ url: createURL("queryAsyncJobResult&jobId=" + json.updatenetworkserviceproviderresponse.jobid), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { $("body").stopTime(updateNetworkServiceProviderTimer); if (result.jobstatus == 1) { //Security group provider has been enabled successfully //"ElasticIP + ElasticLB" if(selectedNetworkOfferingHavingEIP == true && selectedNetworkOfferingHavingELB == true) { //inside "selectedNetworkOfferingHavingSG == true" section //add netscaler provider (start) $.ajax({ url: createURL("addNetworkServiceProvider&name=Netscaler&physicalnetworkid=" + args.data.returnedBasicPhysicalNetwork.id), dataType: "json", async: false, success: function(json) { var addNetworkServiceProviderTimer = "asyncJob_" + json.addnetworkserviceproviderresponse.jobid; $("body").everyTime(2000, addNetworkServiceProviderTimer, function() { $.ajax({ url: createURL("queryAsyncJobResult&jobId=" + json.addnetworkserviceproviderresponse.jobid), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { $("body").stopTime(addNetworkServiceProviderTimer); if (result.jobstatus == 1) { args.data.returnedNetscalerProvider = result.jobresult.networkserviceprovider; stepFns.addNetscalerDevice({ data: args.data }); } else if (result.jobstatus == 2) { alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + errorMsg); } }); }); } }); //add netscaler provider (end) } else { //no "ElasticIP + ElasticLB" //create a guest network for basic zone var array2 = []; array2.push("&zoneid=" + args.data.returnedZone.id); array2.push("&name=guestNetworkForBasicZone"); array2.push("&displaytext=guestNetworkForBasicZone"); array2.push("&networkofferingid=" + args.data.zone.networkOfferingId); $.ajax({ url: createURL("createNetwork" + array2.join("")), dataType: "json", async: false, success: function(json) { //basic zone has only one physical network => addPod() will be called only once => so don't need to double-check before calling addPod() stepFns.addPod({ data: $.extend(args.data, { returnedGuestNetwork: json.createnetworkresponse.network }) }); } }); } } else if (result.jobstatus == 2) { alert("failed to enable security group provider. Error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("failed to enable security group provider. Error: " + errorMsg); } }); }); } }); } else { //selectedNetworkOfferingHavingSG == false //create a guest network for basic zone var array2 = []; array2.push("&zoneid=" + args.data.returnedZone.id); array2.push("&name=guestNetworkForBasicZone"); array2.push("&displaytext=guestNetworkForBasicZone"); array2.push("&networkofferingid=" + args.data.zone.networkOfferingId); $.ajax({ url: createURL("createNetwork" + array2.join("")), dataType: "json", async: false, success: function(json) { //basic zone has only one physical network => addPod() will be called only once => so don't need to double-check before calling addPod() stepFns.addPod({ data: $.extend(args.data, { returnedGuestNetwork: json.createnetworkresponse.network }) }); } }); } } else if (result.jobstatus == 2) { alert("failed to enable Virtual Router Provider. Error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("failed to enable Virtual Router Provider. Error: " + errorMsg); } }); }); } }); } else if (result.jobstatus == 2) { alert("configureVirtualRouterElement failed. Error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("configureVirtualRouterElement failed. Error: " + errorMsg); } }); }); } }); } else if (result.jobstatus == 2) { alert("updatePhysicalNetwork failed. Error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("updatePhysicalNetwork failed. Error: " + errorMsg); } }); }); } }); } else if(args.data.zone.networkType == "Advanced") { $(args.data.returnedPhysicalNetworks).each(function(){ var thisPhysicalNetwork = this; $.ajax({ url: createURL("updatePhysicalNetwork&state=Enabled&id=" + thisPhysicalNetwork.id), dataType: "json", success: function(json) { var jobId = json.updatephysicalnetworkresponse.jobid; var timerKey = "updatePhysicalNetworkJob_"+jobId; $("body").everyTime(2000, timerKey, function() { $.ajax({ url: createURL("queryAsyncJobResult&jobId="+jobId), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { $("body").stopTime(timerKey); if (result.jobstatus == 1) { //alert("updatePhysicalNetwork succeeded."); // get network service provider ID of Virtual Router var virtualRouterProviderId; $.ajax({ url: createURL("listNetworkServiceProviders&name=VirtualRouter&physicalNetworkId=" + thisPhysicalNetwork.id), dataType: "json", async: false, success: function(json) { var items = json.listnetworkserviceprovidersresponse.networkserviceprovider; if(items != null && items.length > 0) { virtualRouterProviderId = items[0].id; } } }); if(virtualRouterProviderId == null) { alert("error: listNetworkServiceProviders API doesn't return VirtualRouter provider ID"); return; } var virtualRouterElementId; $.ajax({ url: createURL("listVirtualRouterElements&nspid=" + virtualRouterProviderId), dataType: "json", async: false, success: function(json) { var items = json.listvirtualrouterelementsresponse.virtualrouterelement; if(items != null && items.length > 0) { virtualRouterElementId = items[0].id; } } }); if(virtualRouterElementId == null) { alert("error: listVirtualRouterElements API doesn't return Virtual Router Element Id"); return; } $.ajax({ url: createURL("configureVirtualRouterElement&enabled=true&id=" + virtualRouterElementId), dataType: "json", async: false, success: function(json) { var jobId = json.configurevirtualrouterelementresponse.jobid; var timerKey = "configureVirtualRouterElementJob_"+jobId; $("body").everyTime(2000, timerKey, function() { $.ajax({ url: createURL("queryAsyncJobResult&jobId="+jobId), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { $("body").stopTime(timerKey); if (result.jobstatus == 1) { //configureVirtualRouterElement succeeded $.ajax({ url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + virtualRouterProviderId), dataType: "json", async: false, success: function(json) { var jobId = json.updatenetworkserviceproviderresponse.jobid; var timerKey = "updateNetworkServiceProviderJob_"+jobId; $("body").everyTime(2000, timerKey, function() { $.ajax({ url: createURL("queryAsyncJobResult&jobId="+jobId), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if (result.jobstatus == 0) { return; //Job has not completed } else { $("body").stopTime(timerKey); if (result.jobstatus == 1) { //Virtual Router Provider has been enabled successfully advZoneConfiguredPhysicalNetworkCount++; if(advZoneConfiguredPhysicalNetworkCount == args.data.returnedPhysicalNetworks.length) { //not call addPod() until all physical networks get configured stepFns.addPod({ data: args.data }); } } else if (result.jobstatus == 2) { alert("failed to enable Virtual Router Provider. Error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("updateNetworkServiceProvider failed. Error: " + errorMsg); } }); }); } }); } else if (result.jobstatus == 2) { alert("configureVirtualRouterElement failed. Error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("configureVirtualRouterElement failed. Error: " + errorMsg); } }); }); } }); } else if (result.jobstatus == 2) { alert("updatePhysicalNetwork failed. Error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("updatePhysicalNetwork failed. Error: " + errorMsg); } }); }); } }); }); } }, addNetscalerDevice: function(args) { message(dictionary['message.adding.Netscaler.device']); var array1 = []; array1.push("&physicalnetworkid=" + args.data.returnedBasicPhysicalNetwork.id); array1.push("&username=" + todb(args.data.basicPhysicalNetwork.username)); array1.push("&password=" + todb(args.data.basicPhysicalNetwork.password)); array1.push("&networkdevicetype=" + todb(args.data.basicPhysicalNetwork.networkdevicetype)); //construct URL starts here var url = []; var ip = args.data.basicPhysicalNetwork.ip; url.push("https://" + ip); var isQuestionMarkAdded = false; var publicInterface = args.data.basicPhysicalNetwork.publicinterface; if(publicInterface != null && publicInterface.length > 0) { if(isQuestionMarkAdded == false) { url.push("?"); isQuestionMarkAdded = true; } else { url.push("&"); } url.push("publicinterface=" + publicInterface); } var privateInterface = args.data.basicPhysicalNetwork.privateinterface; if(privateInterface != null && privateInterface.length > 0) { if(isQuestionMarkAdded == false) { url.push("?"); isQuestionMarkAdded = true; } else { url.push("&"); } url.push("privateinterface=" + privateInterface); } var numretries = args.data.basicPhysicalNetwork.numretries; if(numretries != null && numretries.length > 0) { if(isQuestionMarkAdded == false) { url.push("?"); isQuestionMarkAdded = true; } else { url.push("&"); } url.push("numretries=" + numretries); } var isInline = args.data.basicPhysicalNetwork.inline; if(isInline != null && isInline.length > 0) { if(isQuestionMarkAdded == false) { url.push("?"); isQuestionMarkAdded = true; } else { url.push("&"); } url.push("inline=" + isInline); } var capacity = args.data.basicPhysicalNetwork.capacity; if(capacity != null && capacity.length > 0) { if(isQuestionMarkAdded == false) { url.push("?"); isQuestionMarkAdded = true; } else { url.push("&"); } url.push("lbdevicecapacity=" + capacity); } var dedicated = (args.data.basicPhysicalNetwork.dedicated == "on"); //boolean (true/false) if(isQuestionMarkAdded == false) { url.push("?"); isQuestionMarkAdded = true; } else { url.push("&"); } url.push("lbdevicededicated=" + dedicated.toString()); array1.push("&url=" + todb(url.join(""))); //construct URL ends here $.ajax({ url: createURL("addNetscalerLoadBalancer" + array1.join("")), dataType: "json", success: function(json) { var addNetscalerLoadBalancerTimer = "asyncJob_" + json.addnetscalerloadbalancerresponse.jobid; $("body").everyTime(2000, addNetscalerLoadBalancerTimer, function() { $.ajax({ url: createURL("queryAsyncJobResult&jobid=" + json.addnetscalerloadbalancerresponse.jobid), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if(result.jobstatus == 0) { return; } else { $("body").stopTime(addNetscalerLoadBalancerTimer); if(result.jobstatus == 1) { args.data.returnedNetscalerProvider.returnedNetscalerloadbalancer = result.jobresult.netscalerloadbalancer; $.ajax({ url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + args.data.returnedNetscalerProvider.id), dataType: "json", success: function(json) { var updateNetworkServiceProviderTimer = "asyncJob_" + json.updatenetworkserviceproviderresponse.jobid; $("body").everyTime(2000, updateNetworkServiceProviderTimer, function() { $.ajax({ url: createURL("queryAsyncJobResult&jobid=" + json.updatenetworkserviceproviderresponse.jobid), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if(result.jobstatus == 0) { return; } else { $("body").stopTime(updateNetworkServiceProviderTimer); if(result.jobstatus == 1) { //create a guest network for basic zone var array2 = []; array2.push("&zoneid=" + args.data.returnedZone.id); array2.push("&name=guestNetworkForBasicZone"); array2.push("&displaytext=guestNetworkForBasicZone"); array2.push("&networkofferingid=" + args.data.zone.networkOfferingId); $.ajax({ url: createURL("createNetwork" + array2.join("")), dataType: "json", async: false, success: function(json) { //basic zone has only one physical network => addPod() will be called only once => so don't need to double-check before calling addPod() stepFns.addPod({ data: $.extend(args.data, { returnedGuestNetwork: json.createnetworkresponse.network }) }); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("failed to create a guest network for basic zone. Error: " + errorMsg); } }); } else if(result.jobstatus == 2) { alert("failed to enable Netscaler provider. Error: " + fromdb(result.jobresult.errortext)); } } } }); }); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); alert("failed to enable Netscaler provider. Error: " + errorMsg); } }); } else if(result.jobstatus == 2) { //addNetscalerLoadBalancer failed error('addNetscalerDevice', fromdb(result.jobresult.errortext), { fn: 'addNetscalerDevice', args: args }); } } } }); }); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); error('addNetscalerDevice', errorMsg, { fn: 'addNetscalerDevice', args: args }); } }); }, addPod: function(args) { message(dictionary['message.creating.pod']); var array3 = []; array3.push("&zoneId=" + args.data.returnedZone.id); array3.push("&name=" + todb(args.data.pod.name)); array3.push("&gateway=" + todb(args.data.pod.reservedSystemGateway)); array3.push("&netmask=" + todb(args.data.pod.reservedSystemNetmask)); array3.push("&startIp=" + todb(args.data.pod.reservedSystemStartIp)); var endip = args.data.pod.reservedSystemEndIp; //optional if (endip != null && endip.length > 0) array3.push("&endIp=" + todb(endip)); $.ajax({ url: createURL("createPod" + array3.join("")), dataType: "json", async: false, success: function(json) { stepFns.configurePublicTraffic({ data: $.extend(args.data, { returnedPod: json.createpodresponse.pod }) }); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); error('addPod', errorMsg, { fn: 'addPod', args: args }); } }); }, configurePublicTraffic: function(args) { if((args.data.zone.networkType == "Basic" && (selectedNetworkOfferingHavingSG == true && selectedNetworkOfferingHavingEIP == true && selectedNetworkOfferingHavingELB == true)) ||(args.data.zone.networkType == "Advanced")) { message(dictionary['message.configuring.public.traffic']); var stopNow = false; $(args.data.publicTraffic).each(function(){ var thisPublicVlanIpRange = this; //check whether the VlanIpRange exists or not (begin) var isExisting = false; $(returnedPublicVlanIpRanges).each(function() { if(this.vlan == thisPublicVlanIpRange.vlanid && this.startip == thisPublicVlanIpRange.startip && this.netmask == thisPublicVlanIpRange.netmask && this.gateway == thisPublicVlanIpRange.gateway) { isExisting = true; return false; //break each loop } }); if(isExisting == true) return; //skip current item to next item (continue each loop) //check whether the VlanIpRange exists or not (end) var array1 = []; array1.push("&zoneId=" + args.data.returnedZone.id); if (this.vlanid != null && this.vlanid.length > 0) array1.push("&vlan=" + todb(this.vlanid)); else array1.push("&vlan=untagged"); array1.push("&gateway=" + this.gateway); array1.push("&netmask=" + this.netmask); array1.push("&startip=" + this.startip); if(this.endip != null && this.endip.length > 0) array1.push("&endip=" + this.endip); array1.push("&forVirtualNetwork=true"); $.ajax({ url: createURL("createVlanIpRange" + array1.join("")), dataType: "json", async: false, success: function(json) { var item = json.createvlaniprangeresponse.vlan; returnedPublicVlanIpRanges.push(item); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); error('configurePublicTraffic', errorMsg, { fn: 'configurePublicTraffic', args: args }); stopNow = true; } }); if(stopNow == true) return false; //break each loop, don't create next VlanIpRange }); if(stopNow == true) return; //stop the whole process stepFns.configureStorageTraffic({ data: $.extend(args.data, { returnedPublicTraffic: returnedPublicVlanIpRanges }) }); } else { //basic zone without public traffic type , skip to next step stepFns.configureGuestTraffic({ data: args.data }); } }, configureStorageTraffic: function(args) { var complete = function(data) { stepFns.configureGuestTraffic({ data: $.extend(args.data, data) }); }; var targetNetwork = $.grep(args.data.physicalNetworks, function(net) { return $.inArray('storage', net.trafficTypes) > -1; }); if (args.data.zone.networkType == 'Basic' || !targetNetwork.length) { return complete({}); } message(dictionary['message.configuring.storage.traffic']); var storageIPRanges = args.data.storageTraffic; var tasks = []; var taskTimer; $(storageIPRanges).each(function() { var item = this; $.ajax({ url: createURL('createStorageNetworkIpRange'), data: $.extend(true, {}, item, { zoneid: args.data.returnedZone.id, podid: args.data.returnedPod.id }), success: function(json) { tasks.push({ jobid: json.createstoragenetworkiprangeresponse.jobid, complete: false }); }, error: function(json) { tasks.push({ error: true, message: parseXMLHttpResponse(json) }); } }); }); taskTimer = setInterval(function() { var completedTasks = $.grep(tasks, function(task) { return task.complete || task.error; }); var errorTasks = $.grep(tasks, function(task) { return task.error; }); if (completedTasks.length == storageIPRanges.length) { clearInterval(taskTimer); if (errorTasks.length) { return error('configureStorageTraffic', errorTasks[0].message, { fn: 'configureStorageTraffic', args: args }); } return complete({}); } if (tasks.length == storageIPRanges.length) { $(tasks).each(function() { var task = this; if (task.error) return true; pollAsyncJobResult({ _custom: { jobId: task.jobid }, complete: function() { task.complete = true; }, error: function(args) { task.error = true; task.message = args.message; } }); return true; }); } return true; }, 1000); return true; }, configureGuestTraffic: function(args) { message(dictionary['message.configuring.guest.traffic']); if(args.data.returnedZone.networktype == "Basic") { //create an VlanIpRange for guest network in basic zone var array1 = []; array1.push("&podid=" + args.data.returnedPod.id); array1.push("&networkid=" + args.data.returnedGuestNetwork.id); array1.push("&gateway=" + args.data.guestTraffic.guestGateway); array1.push("&netmask=" + args.data.guestTraffic.guestNetmask); array1.push("&startip=" + args.data.guestTraffic.guestStartIp); if(args.data.guestTraffic.guestEndIp != null && args.data.guestTraffic.guestEndIp.length > 0) array1.push("&endip=" + args.data.guestTraffic.guestEndIp); array1.push("&forVirtualNetwork=false"); //indicates this new IP range is for guest network, not public network $.ajax({ url: createURL("createVlanIpRange" + array1.join("")), dataType: "json", success: function(json) { args.data.returnedGuestNetwork.returnedVlanIpRange = json.createvlaniprangeresponse.vlan; stepFns.addCluster({ data: args.data }); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); error('configureGuestTraffic', errorMsg, { fn: 'configureGuestTraffic', args: args }); } }); } else if(args.data.returnedZone.networktype == "Advanced") { //update VLAN in physical network(s) in advanced zone var physicalNetworksHavingGuestIncludingVlan = []; $(args.data.physicalNetworks).each(function(){ if(this.guestConfiguration != null && this.guestConfiguration.vlanRangeStart != null && this.guestConfiguration.vlanRangeStart.length > 0) { physicalNetworksHavingGuestIncludingVlan.push(this); } }); if(physicalNetworksHavingGuestIncludingVlan.length == 0) { stepFns.addCluster({ data: args.data }); } else { var updatedCount = 0; $(physicalNetworksHavingGuestIncludingVlan).each(function(){ var vlan; if(this.guestConfiguration.vlanRangeEnd == null || this.guestConfiguration.vlanRangeEnd.length == 0) vlan = this.guestConfiguration.vlanRangeStart; else vlan = this.guestConfiguration.vlanRangeStart + "-" + this.guestConfiguration.vlanRangeEnd; var originalId = this.id; var returnedId; $(args.data.returnedPhysicalNetworks).each(function(){ if(this.originalId == originalId) { returnedId = this.id; return false; //break the loop } }); $.ajax({ url: createURL("updatePhysicalNetwork&id=" + returnedId + "&vlan=" + todb(vlan)), dataType: "json", success: function(json) { var jobId = json.updatephysicalnetworkresponse.jobid; var timerKey = "asyncJob_" + jobId; $("body").everyTime(2000, timerKey, function(){ $.ajax({ url: createURL("queryAsyncJobResult&jobid=" + jobId), dataType: "json", success: function(json) { var result = json.queryasyncjobresultresponse; if(result.jobstatus == 0) { return; } else { $("body").stopTime(timerKey); if(result.jobstatus == 1) { updatedCount++; if(updatedCount == physicalNetworksHavingGuestIncludingVlan.length) { stepFns.addCluster({ data: args.data }); } } else if(result.jobstatus == 2){ alert("error: " + fromdb(result.jobresult.errortext)); } } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); error('configureGuestTraffic', errorMsg, { fn: 'configureGuestTraffic', args: args }); } }); }); } }); }); } } }, addCluster: function(args) { message(dictionary['message.creating.cluster']); var array1 = []; array1.push("&zoneId=" + args.data.returnedZone.id); array1.push("&hypervisor=" + args.data.cluster.hypervisor); var clusterType; if(args.data.cluster.hypervisor == "VMware") clusterType="ExternalManaged"; else clusterType="CloudManaged"; array1.push("&clustertype=" + clusterType); array1.push("&podId=" + args.data.returnedPod.id); var clusterName = args.data.cluster.name; if(args.data.cluster.hypervisor == "VMware") { array1.push("&username=" + todb(args.data.cluster.vCenterUsername)); array1.push("&password=" + todb(args.data.cluster.vCenterPassword)); var hostname = args.data.cluster.vCenterHost; var dcName = args.data.cluster.vCenterDatacenter; var url; if(hostname.indexOf("http://") == -1) url = "http://" + hostname; else url = hostname; url += "/" + dcName + "/" + clusterName; array1.push("&url=" + todb(url)); clusterName = hostname + "/" + dcName + "/" + clusterName; //override clusterName } array1.push("&clustername=" + todb(clusterName)); $.ajax({ url: createURL("addCluster" + array1.join("")), dataType: "json", async: true, success: function(json) { if(args.data.cluster.hypervisor != "VMware") { stepFns.addHost({ data: $.extend(args.data, { returnedCluster: json.addclusterresponse.cluster[0] }) }); } else { //args.groupedData.cluster.hypervisor == "VMware", skip add host step stepFns.addPrimaryStorage({ data: $.extend(args.data, { returnedCluster: json.addclusterresponse.cluster[0] }) }); } }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); error('addCluster', errorMsg, { fn: 'addCluster', args: args }); } }); }, addHost: function(args) { message(dictionary['message.adding.host']); var array1 = []; array1.push("&zoneid=" + args.data.returnedZone.id); array1.push("&podid=" + args.data.returnedPod.id); array1.push("&clusterid=" + args.data.returnedCluster.id); array1.push("&hypervisor=" + todb(args.data.cluster.hypervisor)); var clustertype = args.data.returnedCluster.clustertype; array1.push("&clustertype=" + todb(clustertype)); array1.push("&hosttags=" + todb(args.data.host.hosttags)); if(args.data.cluster.hypervisor == "VMware") { array1.push("&username="); array1.push("&password="); var hostname = args.data.host.vcenterHost; var url; if(hostname.indexOf("http://")==-1) url = "http://" + hostname; else url = hostname; array1.push("&url=" + todb(url)); } else { array1.push("&username=" + todb(args.data.host.username)); array1.push("&password=" + todb(args.data.host.password)); var hostname = args.data.host.hostname; var url; if(hostname.indexOf("http://")==-1) url = "http://" + hostname; else url = hostname; array1.push("&url="+todb(url)); if (args.data.cluster.hypervisor == "BareMetal") { array1.push("&cpunumber=" + todb(args.data.host.baremetalCpuCores)); array1.push("&cpuspeed=" + todb(args.data.host.baremetalCpu)); array1.push("&memory=" + todb(args.data.host.baremetalMemory)); array1.push("&hostmac=" + todb(args.data.host.baremetalMAC)); } else if(args.data.cluster.hypervisor == "Ovm") { array1.push("&agentusername=" + todb(args.data.host.agentUsername)); array1.push("&agentpassword=" + todb(args.data.host.agentPassword)); } } $.ajax({ url: createURL("addHost" + array1.join("")), dataType: "json", success: function(json) { stepFns.addPrimaryStorage({ data: $.extend(args.data, { returnedHost: json.addhostresponse.host[0] }) }); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); error('addHost', errorMsg, { fn: 'addHost', args: args }); } }); }, addPrimaryStorage: function(args) { var server = args.data.primaryStorage.server; if(server == null || server.length == 0) { stepFns.addSecondaryStorage({ data: args.data }); return; } message(dictionary['message.creating.primary.storage']); var array1 = []; array1.push("&zoneid=" + args.data.returnedZone.id); array1.push("&podId=" + args.data.returnedPod.id); array1.push("&clusterid=" + args.data.returnedCluster.id); array1.push("&name=" + todb(args.data.primaryStorage.name)); var url = null; if (args.data.primaryStorage.protocol == "nfs") { //var path = trim($thisDialog.find("#add_pool_path").val()); var path = args.data.primaryStorage.path; if(path.substring(0,1) != "/") path = "/" + path; url = nfsURL(server, path); } else if (args.data.primaryStorage.protocol == "PreSetup") { //var path = trim($thisDialog.find("#add_pool_path").val()); var path = args.data.primaryStorage.path; if(path.substring(0,1) != "/") path = "/" + path; url = presetupURL(server, path); } else if (args.data.primaryStorage.protocol == "ocfs2") { //var path = trim($thisDialog.find("#add_pool_path").val()); var path = args.data.primaryStorage.path; if(path.substring(0,1) != "/") path = "/" + path; url = ocfs2URL(server, path); } else if (args.data.primaryStorage.protocol == "SharedMountPoint") { //var path = trim($thisDialog.find("#add_pool_path").val()); var path = args.data.primaryStorage.path; if(path.substring(0,1) != "/") path = "/" + path; url = SharedMountPointURL(server, path); } else if (args.data.primaryStorage.protocol == "clvm") { //var vg = trim($thisDialog.find("#add_pool_clvm_vg").val()); var vg = args.data.primaryStorage.volumegroup; if(vg.substring(0,1) != "/") vg = "/" + vg; url = clvmURL(vg); } else if (args.data.primaryStorage.protocol == "vmfs") { //var path = trim($thisDialog.find("#add_pool_vmfs_dc").val()); var path = args.data.primaryStorage.vCenterDataCenter; if(path.substring(0,1) != "/") path = "/" + path; path += "/" + args.data.primaryStorage.vCenterDataStore; url = vmfsURL("dummy", path); } else { //var iqn = trim($thisDialog.find("#add_pool_iqn").val()); var iqn = args.data.primaryStorage.iqn; if(iqn.substring(0,1) != "/") iqn = "/" + iqn; var lun = args.data.primaryStorage.lun; url = iscsiURL(server, iqn, lun); } array1.push("&url=" + todb(url)); if(args.data.primaryStorage.storageTags != null && args.data.primaryStorage.storageTags.length > 0) array1.push("&tags=" + todb(args.data.primaryStorage.storageTags)); $.ajax({ url: createURL("createStoragePool" + array1.join("")), dataType: "json", success: function(json) { stepFns.addSecondaryStorage({ data: $.extend(args.data, { returnedPrimaryStorage: json.createstoragepoolresponse.storagepool }) }); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); error('addPrimaryStorage', errorMsg, { fn: 'addPrimaryStorage', args: args }); } }); }, addSecondaryStorage: function(args) { message(dictionary['message.creating.secondary.storage']); var nfs_server = args.data.secondaryStorage.nfsServer; var path = args.data.secondaryStorage.path; var url = nfsURL(nfs_server, path); $.ajax({ url: createURL("addSecondaryStorage&zoneId=" + args.data.returnedZone.id + "&url=" + todb(url)), dataType: "json", success: function(json) { complete({ data: $.extend(args.data, { returnedSecondaryStorage: json.addsecondarystorageresponse.secondarystorage }) }); }, error: function(XMLHttpResponse) { var errorMsg = parseXMLHttpResponse(XMLHttpResponse); error('addSecondaryStorage', errorMsg, { fn: 'addSecondaryStorage', args: args }); } }); } }; var complete = function(args) { message(dictionary['message.Zone.creation.complete']); success(args); }; if (startFn) { stepFns[startFn.fn]({ data: $.extend(startFn.args.data, data) }); } else { stepFns.addZone({}); } }, enableZoneAction: function(args) { $.ajax({ url: createURL("updateZone&allocationstate=Enabled&id=" + args.launchData.returnedZone.id), dataType: "json", success: function(json) { args.formData.returnedZone = json.updatezoneresponse.zone; args.response.success(); } }); } }; }(cloudStack, jQuery));