(function($, cloudStack, testData) { var zoneObjs, hypervisorObjs, featuredTemplateObjs, communityTemplateObjs, myTemplateObjs, isoObjs, serviceOfferingObjs, diskOfferingObjs; var selectedZoneObj, selectedTemplateObj, selectedHypervisor, selectedDiskOfferingObj; var step5ContainerType = 'nothing-to-select'; //'nothing-to-select', 'select-network', 'select-security-group' cloudStack.sections.instances = { title: 'Instances', id: 'instances', listView: { section: 'instances', filters: { mine: { label: 'Mine' }, running: { label: 'Running' }, stopped: { label: 'Stopped' }, destroyed: { label: 'Destroyed' } }, fields: { name: { label: 'Name', editable: true }, displayname: { label: 'Display Name' }, zonename: { label: 'Zone' }, state: { label: 'Status', indicator: { 'Running': 'on', 'Stopped': 'off', 'Error': 'off' } } }, // List view actions actions: { // Add instance wizard add: { label: 'Add instance', action: { custom: cloudStack.instanceWizard({ steps: [ // Step 1: Setup function(args) { $.ajax({ url: createURL("listZones&available=true"), dataType: "json", async: true, success: function(json) { zoneObjs = json.listzonesresponse.zone; args.response.success({ data: {zones: zoneObjs}}); } }); }, // Step 2: Select template function(args) { $(zoneObjs).each(function(){ if(this.id == args.currentData.zoneid) { selectedZoneObj = this; return false; //break the $.each() loop } }); if(selectedZoneObj == null) { alert("error: can't find matched zone object"); return; } $.ajax({ url: createURL("listHypervisors&zoneid="+args.currentData.zoneid), dataType: "json", async: false, success: function(json) { hypervisorObjs = json.listhypervisorsresponse.hypervisor; } }); $.ajax({ url: createURL("listTemplates&templatefilter=featured&zoneid="+args.currentData.zoneid), dataType: "json", async: false, success: function(json) { featuredTemplateObjs = json.listtemplatesresponse.template; } }); $.ajax({ url: createURL("listTemplates&templatefilter=community&zoneid="+args.currentData.zoneid), dataType: "json", async: false, success: function(json) { communityTemplateObjs = json.listtemplatesresponse.template; } }); $.ajax({ url: createURL("listTemplates&templatefilter=selfexecutable&zoneid="+args.currentData.zoneid), dataType: "json", async: false, success: function(json) { myTemplateObjs = json.listtemplatesresponse.template; } }); $.ajax({ url: createURL("listIsos&isReady=true&bootable=true&isofilter=executable&zoneid="+args.currentData.zoneid), dataType: "json", async: false, success: function(json) { isoObjs = json.listisosresponse.iso; } }); args.response.success({ hypervisor: { idField: 'name', nameField: 'name' }, data: { templates: { featuredtemplates: featuredTemplateObjs, communitytemplates: communityTemplateObjs, mytemplates: myTemplateObjs, isos: isoObjs }, hypervisors: hypervisorObjs } }); }, // Step 3: Service offering function(args) { if(args.currentData["select-template"] == "select-template") { for(var i=0; i < featuredTemplateObjs.length; i++) { if(featuredTemplateObjs[i].id == args.currentData.templateid) { selectedTemplateObj = featuredTemplateObjs[i]; break; } } if(selectedTemplateObj == null) { for(var i=0; i < communityTemplateObjs.length; i++) { if(communityTemplateObjs[i].id == args.currentData.templateid) { selectedTemplateObj = communityTemplateObjs[i]; break; } } } if(selectedTemplateObj == null) { for(var i=0; i < myTemplateObjs.length; i++) { if(myTemplateObjs[i].id == args.currentData.templateid) { selectedTemplateObj = myTemplateObjs[i]; break; } } } if(selectedTemplateObj == null) alert("unable to find matched template object"); else selectedHypervisor = selectedTemplateObj.hypervisor; } else { //(args.currentData["select-template"] == "select-iso" selectedHypervisor = args.currentData.hypervisorid; } $.ajax({ url: createURL("listServiceOfferings&issystem=false"), dataType: "json", async: true, success: function(json) { serviceOfferingObjs = json.listserviceofferingsresponse.serviceoffering; args.response.success({ data: {serviceOfferings: serviceOfferingObjs} }); } }); }, // Step 4: Data disk offering function(args) { var isRequred = (args.currentData["select-template"] == "select-iso"? true: false); $.ajax({ url: createURL("listDiskOfferings"), dataType: "json", async: true, success: function(json) { diskOfferingObjs = json.listdiskofferingsresponse.diskoffering; args.response.success({ required: isRequred, customFlag: 'iscustomized', // Field determines if custom slider is shown data: {diskOfferings: diskOfferingObjs} }); } }); }, // Step 5: Network function(args) { if(diskOfferingObjs != null && diskOfferingObjs.length > 0) { for(var i=0; i < diskOfferingObjs.length; i++) { if(diskOfferingObjs[i].id == args.currentData.diskofferingid) { selectedDiskOfferingObj = diskOfferingObjs[i]; break; } } } if (selectedZoneObj.securitygroupsenabled == false) { //show network container //vmWizardShowNetworkContainer($thisPopup); step5ContainerType = 'select-network'; } else if (selectedZoneObj.securitygroupsenabled == true) { // if security group is enabled var hasDedicatedDirectTaggedDefaultNetwork = false; $.ajax({ url: createURL("listNetworks&type=Direct&domainid="+g_domainid+"&account="+g_account+"&zoneId="+args.currentData.zoneid), dataType: "json", async: false, success: function(json) { var items = json.listnetworksresponse.network; if (items != null && items.length > 0) { for (var i = 0; i < items.length; i++) { if(items[i].isshared == false && items[i].isdefault == true) { //dedicated, is default one. var broadcasturi = items[i].broadcasturi; //e.g. "vlan://53" if(broadcasturi != null && broadcasturi.length > 0) { var vlanIdString = broadcasturi.substring(7); //e.g. "53" if(isNaN(vlanIdString) == false) hasDedicatedDirectTaggedDefaultNetwork = true; } } } } } }); //hasDedicatedDirectTaggedDefaultNetwork = true; //for testing only, comment it out before checking in!!!!!!!!!!!! if(hasDedicatedDirectTaggedDefaultNetwork == true) { if(confirm("Do you wish to launch your instance on your own private dedicated network?")) { step5ContainerType = 'select-network'; } else { if(selectedHypervisor == "VMware" || g_directAttachSecurityGroupsEnabled != "true") step5ContainerType = 'nothing-to-select'; else step5ContainerType = 'select-security-group'; } } else { if(selectedHypervisor == "VMware" || g_directAttachSecurityGroupsEnabled != "true") step5ContainerType = 'nothing-to-select'; else step5ContainerType = 'select-security-group'; } } //step5ContainerType = 'nothing-to-select'; //for testing only, comment it out before checking in!!!!!!!!!!!! if(step5ContainerType == 'select-network') { var defaultNetworkArray = [], optionalNetworkArray = []; $.ajax({ url: createURL("listNetworks&domainid="+g_domainid+"&account="+g_account+"&zoneId="+args.currentData.zoneid), dataType: "json", async: false, success: function(json) { var networks = json.listnetworksresponse.network; //***** Setup Virtual Network (begin) ***** //virtualNetwork is first radio button in required network section. Show virtualNetwork when its networkofferingavailability is 'Required' or'Optional' var virtualNetwork = null; if(selectedZoneObj.securitygroupsenabled == false) { if (networks != null && networks.length > 0) { for (var i = 0; i < networks.length; i++) { if (networks[i].type == 'Virtual') { virtualNetwork = networks[i]; break; } } } if (virtualNetwork == null) { //if there is no virtualNetwork $.ajax({ url: createURL("listNetworkOfferings&guestiptype=Virtual"), //check DefaultVirtualizedNetworkOffering dataType: "json", async: false, success: function(json) { var networkOfferings = json.listnetworkofferingsresponse.networkoffering; if (networkOfferings != null && networkOfferings.length > 0) { for (var i = 0; i < networkOfferings.length; i++) { if (networkOfferings[i].isdefault == true && (networkOfferings[i].availability == "Required" || networkOfferings[i].availability == "Optional") ) { // Create a virtual network var networkName = "Virtual Network"; var networkDesc = "A dedicated virtualized network for your account. The broadcast domain is contained within a VLAN and all public network access is routed out by a virtual router."; $.ajax({ url: createURL("createNetwork&networkOfferingId="+networkOfferings[i].id+"&name="+todb(networkName)+"&displayText="+todb(networkDesc)+"&zoneId="+args.currentData.zoneid), dataType: "json", async: false, success: function(json) { virtualNetwork = json.createnetworkresponse.network; defaultNetworkArray.push(virtualNetwork); } }); } } } } }); } else { //virtualNetwork != null (there is already a virtualNetwork) if (virtualNetwork.networkofferingavailability == 'Required' || virtualNetwork.networkofferingavailability == 'Optional') { defaultNetworkArray.push(virtualNetwork); } else { //virtualNetwork.networkofferingavailability == 'Unavailable' //do not show virtualNetwork } } } //***** Setup Virtual Network (end) ***** //***** Setup Direct Networks (begin) ***** //direct networks whose isdefault==true is 2nd~Nth radio buttons in required network section //direct networks whose isdefault==false is a bunch of checkboxes in optional network section if (networks != null && networks.length > 0) { for (var i = 0; i < networks.length; i++) { //if selectedZoneObj.securitygroupsenabled is true and users still choose to select network instead of security group (from dialog), then UI won't show networks whose securitygroupenabled is true. if(selectedZoneObj.securitygroupsenabled == true && networks[i].securitygroupenabled == true) { continue; } if (networks[i].type != 'Direct') { continue; } if (networks[i].isdefault) { if (virtualNetwork.networkofferingavailability == 'Required') { continue; //don't display 2nd~Nth radio buttons in required network section when networkofferingavailability == 'Required' } defaultNetworkArray.push(networks[i]); } else { optionalNetworkArray.push(networks[i]); } } } //***** Setup Direct Networks (end) ***** } }); args.response.success({ type: 'select-network', data: { defaultNetworks: defaultNetworkArray, optionalNetworks: optionalNetworkArray, securityGroups: [] } }); } else if(step5ContainerType == 'select-security-group') { var securityGroupArray = []; $.ajax({ url: createURL("listSecurityGroups"+"&domainid="+g_domainid+"&account="+g_account), dataType: "json", async: false, success: function(json) { var items = json.listsecuritygroupsresponse.securitygroup; if (items != null && items.length > 0) { for (var i = 0; i < items.length; i++) { if(items[i].name != "default") //exclude default security group because it is always applied securityGroupArray.push(items[i]); } } } }); args.response.success({ type: 'select-security-group', data: { defaultNetworks: [], optionalNetworks: [], securityGroups: securityGroupArray } }); } else if(step5ContainerType == 'nothing-to-select') { args.response.success({ type: 'nothing-to-select', data: { defaultNetworks: [], optionalNetworks: [], securityGroups: [] } }); } }, // Step 6: Review function(args) { return false; } ], action: function(args) { /* var isValid = true; isValid &= validateString("Name", $thisPopup.find("#wizard_vm_name"), $thisPopup.find("#wizard_vm_name_errormsg"), true); //optional isValid &= validateString("Group", $thisPopup.find("#wizard_vm_group"), $thisPopup.find("#wizard_vm_group_errormsg"), true); //optional if (!isValid) return; */ // Create a new VM!!!! var array1 = []; //step 1 : select zone array1.push("&zoneId=" + args.data.zoneid); //step 2: select template array1.push("&templateId=" + args.data.templateid); array1.push("&hypervisor=" + selectedHypervisor); //step 3: select service offering array1.push("&serviceOfferingId=" + args.data.serviceofferingid); //step 4: select disk offering if(args.data.diskofferingid != null && args.data.diskofferingid != "0") { array1.push("&diskOfferingId=" + args.data.diskofferingid); if(selectedDiskOfferingObj.iscustomized == true) array1.push("&size=" + args.data.size); } //step 5: select network if (step5ContainerType == 'select-network') { var array2 = []; var defaultNetwork = args.data["default-network"]; if(defaultNetwork != null && defaultNetwork.length > 0) array2.push(defaultNetwork); var optionalNetworks = args.data["optional-networks"]; //optionalNetworks might be: (1) an array of string, e.g. ["203", "202"], if(typeof(optionalNetworks) == "object" && optionalNetworks.length != null) { if(optionalNetworks != null && optionalNetworks.length > 0) { for(var i=0; i < optionalNetworks.length; i++) { array2.push(optionalNetworks[i]); } } } //optionalNetworks might be: (2) just an string, e.g. "202" else if(typeof(optionalNetworks) == "string" && optionalNetworks.length > 0) { array2.push(optionalNetworks); } array1.push("&networkIds=" + array2.join(",")); } else if (step5ContainerType == 'select-security-group') { var securityGroupList; var groups = args.data["security-groups"]; if(groups != null && groups.length > 0) { for(var i=0; i < groups.length; i++) { if(i == 0) securityGroupList = groups[i]; else securityGroupList += ("," + groups[i]); } } if(securityGroupList != null) array1.push("&securitygroupids=" + securityGroupList); } var displayname = args.data.displayname; if(displayname != null && displayname.length > 0) array1.push("&displayname="+todb(displayname)); var group = args.data.groupname; if (group != null && group.length > 0) array1.push("&group="+todb(group)); $.ajax({ url: createURL("deployVirtualMachine"+array1.join("")), dataType: "json", success: function(json) { var jid = json.deployvirtualmachineresponse.jobid; args.response.success( {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; }, getActionFilter: function() { return vmActionfilter; } } } ); }, error: function(XMLHttpResponse) { //args.response.error(); //wait for Brian to implement alert("Failed to deploy VM."); } }); } }) }, messages: { confirm: function(args) { //never being called return 'Are you sure you want to deploy an instance?'; }, success: function(args) { //never being called return args.name + ' is being created.'; }, notification: function(args) { //return 'Creating new VM: ' + args.name; //args.name is not available return 'Creating new VM'; }, complete: function(args) { //never being called return args.name + ' has been created successfully!'; } }, notification: { poll: pollAsyncJobResult } }, start: { label: 'Start instance' , action: function(args) { $.ajax({ url: createURL("startVirtualMachine&id=" + args.data.id), dataType: "json", async: true, success: function(json) { var jid = json.startvirtualmachineresponse.jobid; args.response.success( {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; }, getActionFilter: function() { return vmActionfilter; } } } ); } }); }, messages: { confirm: function(args) { return 'Are you sure you want to start ' + args.name + '?'; }, success: function(args) { return args.name + ' is being started.'; }, notification: function(args) { return 'Starting VM: ' + args.name; }, complete: function(args) { return args.name + ' has been started.'; } }, notification: { poll: pollAsyncJobResult } }, stop: { label: 'Stop instance', action: function(args) { $.ajax({ url: createURL("stopVirtualMachine&id=" + args.data.id), dataType: "json", async: true, success: function(json) { var jid = json.stopvirtualmachineresponse.jobid; args.response.success( {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; }, getActionFilter: function() { return vmActionfilter; } } } ); } }); }, messages: { confirm: function(args) { return 'Are you sure you want to stop ' + args.name + '?'; }, success: function(args) { return args.name + ' is being stopped.'; }, notification: function(args) { return 'Stopping VM: ' + args.name; }, complete: function(args) { return args.name + ' has been stopped.'; } }, notification: { //poll: testData.notifications.testPoll poll: pollAsyncJobResult } }, restart: { label: 'Reboot instance', action: function(args) { $.ajax({ url: createURL("rebootVirtualMachine&id=" + args.data.id), dataType: "json", async: true, success: function(json) { var jid = json.rebootvirtualmachineresponse.jobid; args.response.success( {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; }, getActionFilter: function() { return vmActionfilter; } } } ); } }); }, messages: { confirm: function(args) { return 'Are you sure you want to reboot ' + args.name + '?'; }, success: function(args) { return args.name + ' is being rebooted.'; }, notification: function(args) { return 'Rebooting VM: ' + args.name; }, complete: function(args) { return args.name + ' has been rebooted successfully.'; } }, notification: { poll: pollAsyncJobResult } }, destroy: { label: 'Destroy instance', messages: { confirm: function(args) { return 'Are you sure you want to destroy ' + args.name + '?'; }, success: function(args) { return args.name + ' is being destroyed.'; }, notification: function(args) { return 'Destroying VM: ' + args.name; }, complete: function(args) { return args.name + ' has been destroyed.'; } }, action: function(args) { $.ajax({ url: createURL("destroyVirtualMachine&id=" + args.data.id), dataType: "json", async: true, success: function(json) { var jid = json.destroyvirtualmachineresponse.jobid; args.response.success( {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; }, getActionFilter: function() { return vmActionfilter; } } } ); } }); }, notification: { poll: pollAsyncJobResult } }, restore: { label: 'Restore instance', messages: { confirm: function(args) { return 'Are you sure you want to restore ' + args.name + '?'; }, success: function(args) { return args.name + ' is being restored.'; }, notification: function(args) { return 'Restoring VM: ' + args.name; }, complete: function(args) { return args.name + ' has been restored.'; } }, action: function(args) { $.ajax({ url: createURL("recoverVirtualMachine&id=" + args.data.id), dataType: "json", async: true, success: function(json) { var item = json.recovervirtualmachineresponse.virtualmachine; args.response.success({data:item}); } }); }, notification: { poll: function(args) { args.complete(); } } } }, dataProvider: function(args) { var array1 = []; if(args.filterBy != null) { if(args.filterBy.kind != null) { switch(args.filterBy.kind) { case "mine": array1.push("&domainid=" + g_domainid + "&account=" + g_account); break; case "running": array1.push("&state=Running"); break; case "stopped": array1.push("&state=Stopped"); break; case "destroyed": array1.push("&state=Destroyed"); break; } } if(args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) { switch(args.filterBy.search.by) { case "name": array1.push("&keyword=" + args.filterBy.search.value); break; } } } $.ajax({ url: createURL("listVirtualMachines&page=" + args.page + "&pagesize=" + pageSize + array1.join("")), dataType: "json", async: true, success: function(json) { var items = json.listvirtualmachinesresponse.virtualmachine; args.response.success({ actionFilter: vmActionfilter, data: items }); } }); }, detailView: { name: 'Instance details', viewAll: { path: 'storage.volumes', label: 'Volumes' }, tabFilter: function(args) { var hiddenTabs = []; if(g_directAttachSecurityGroupsEnabled != "true") hiddenTabs.push("securityGroups"); return hiddenTabs; }, actions: { start: { label: 'Start instance' , action: function(args) { $.ajax({ url: createURL("startVirtualMachine&id=" + args.data.id), dataType: "json", async: true, success: function(json) { var jid = json.startvirtualmachineresponse.jobid; args.response.success( {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; }, getActionFilter: function() { return vmActionfilter; } } } ); } }); }, messages: { confirm: function(args) { return 'Are you sure you want to start ' + args.name + '?'; }, success: function(args) { return args.name + ' is being started.'; }, notification: function(args) { return 'Starting VM: ' + args.name; }, complete: function(args) { return args.name + ' has been started.'; } }, notification: { poll: pollAsyncJobResult } }, stop: { label: 'Stop instance', action: function(args) { $.ajax({ url: createURL("stopVirtualMachine&id=" + args.data.id), dataType: "json", async: true, success: function(json) { var jid = json.stopvirtualmachineresponse.jobid; args.response.success( {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; }, getActionFilter: function() { return vmActionfilter; } } } ); } }); }, messages: { confirm: function(args) { return 'Are you sure you want to stop ' + args.name + '?'; }, success: function(args) { return args.name + ' is being stopped.'; }, notification: function(args) { return 'Stopping VM: ' + args.name; }, complete: function(args) { return args.name + ' has been stopped.'; } }, notification: { poll: pollAsyncJobResult } }, restart: { label: 'Reboot instance', action: function(args) { $.ajax({ url: createURL("rebootVirtualMachine&id=" + args.data.id), dataType: "json", async: true, success: function(json) { var jid = json.rebootvirtualmachineresponse.jobid; args.response.success( {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; }, getActionFilter: function() { return vmActionfilter; } } } ); } }); }, messages: { confirm: function(args) { return 'Are you sure you want to reboot ' + args.name + '?'; }, success: function(args) { return args.name + ' is being rebooted.'; }, notification: function(args) { return 'Rebooting VM: ' + args.name; }, complete: function(args) { return args.name + ' has been rebooted successfully.'; } }, notification: { poll: pollAsyncJobResult } }, destroy: { label: 'Destroy instance', messages: { confirm: function(args) { return 'Are you sure you want to destroy ' + args.name + '?'; }, success: function(args) { return args.name + ' is being destroyed.'; }, notification: function(args) { return 'Destroying VM: ' + args.name; }, complete: function(args) { return args.name + ' has been destroyed.'; } }, action: function(args) { $.ajax({ url: createURL("destroyVirtualMachine&id=" + args.data.id), dataType: "json", async: true, success: function(json) { var jid = json.destroyvirtualmachineresponse.jobid; args.response.success( {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; }, getActionFilter: function() { return vmActionfilter; } } } ); } }); }, notification: { poll: pollAsyncJobResult } }, restore: { label: 'Restore instance', messages: { confirm: function(args) { return 'Are you sure you want to restore ' + args.name + '?'; }, success: function(args) { return args.name + ' is being restored.'; }, notification: function(args) { return 'Restoring VM: ' + args.name; }, complete: function(args) { return args.name + ' has been restored.'; } }, action: function(args) { $.ajax({ url: createURL("recoverVirtualMachine&id=" + args.data.id), dataType: "json", async: true, success: function(json) { var item = json.recovervirtualmachineresponse.virtualmachine; args.response.success({data:item}); } }); }, notification: { poll: function(args) { args.complete(); } } }, edit: { label: 'Edit', action: function(args) { var array1 = []; array1.push("&displayName=" + args.response.data.displayname); array1.push("&group=" + args.response.data.group); array1.push("&ostypeid=" + args.response.data.guestosid); //array1.push("&haenable=" + haenable); $.ajax({ url: createURL("updateVirtualMachine&id=" + args.context.instances[0].id + array1.join("")), dataType: "json", success: function(json) { var item = json.updatevirtualmachineresponse.virtualmachine; args.response.success({data:item}); } }); } }, attachISO: { label: 'Attach ISO', createForm: { title: 'Attach ISO', desc: 'Attach ISO to instance', fields: { iso: { label: 'ISO', select: function(args) { $.ajax({ url: createURL("listIsos&isReady=true&isofilter=executable"), dataType: "json", async: true, success: function(json) { var isos = json.listisosresponse.iso; var items = []; $(isos).each(function() { items.push({id: this.id, description: this.displaytext}); }); args.response.success({data: items}); } }); } } } }, action: function(args) { $.ajax({ url: createURL("attachIso&virtualmachineid=" + args.context.instances[0].id + "&id=" + args.data.iso), dataType: "json", async: true, success: function(json) { var jid = json.attachisoresponse.jobid; args.response.success( {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; }, getActionFilter: function() { return vmActionfilter; } } } ); } }); }, messages: { confirm: function(args) { return 'Are you sure you want to attach ISO to instance ' + args.name + '?'; }, success: function(args) { return 'ISO is being attached to instance ' + args.name; }, notification: function(args) { return 'Attaching ISO to instance ' + args.name; }, complete: function(args) { return 'ISO has been attached to instance ' + args.name; } }, notification: { poll: pollAsyncJobResult } }, detachISO: { label: 'Detach instance', messages: { confirm: function(args) { return 'Are you sure you want to detach ISO ?'; }, success: function(args) { return 'ISO is being detached.'; }, notification: function(args) { return 'Detaching ISO'; }, complete: function(args) { return 'ISO has been detached.'; } }, action: function(args) { $.ajax({ url: createURL("detachIso&virtualmachineid=" + args.context.instances[0].id), dataType: "json", async: true, success: function(json) { var jid = json.detachisoresponse.jobid; args.response.success( {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; }, getActionFilter: function() { return vmActionfilter; } } } ); } }); }, notification: { poll: pollAsyncJobResult } }, resetPassword: { label: 'Reset password', messages: { confirm: function(args) { /* if (jsonObj.passwordenabled == false) { $("#dialog_info") .text(dictionary["message.action.reset.password.off"]) .dialog('option', 'buttons', { "OK": function() { $(this).dialog("close"); } }).dialog("open"); return; } else if (jsonObj.state != 'Stopped') { $("#dialog_info") .text(dictionary["message.action.reset.password.warning"]) .dialog('option', 'buttons', { "OK": function() { $(this).dialog("close"); } }).dialog("open"); return; } */ return 'Are you sure you want to reset password?'; }, success: function(args) { return 'Password is being reset.'; }, notification: function(args) { return 'Resetting password'; }, complete: function(args) { return 'Password has been reset to ' + args.password; } }, action: function(args) { $.ajax({ url: createURL("resetPasswordForVirtualMachine&id=" + args.data.id), dataType: "json", async: true, success: function(json) { var jid = json.resetpasswordforvirtualmachineresponse.jobid; args.response.success( {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; }, getActionFilter: function() { return vmActionfilter; } } } ); } }); }, notification: { poll: pollAsyncJobResult } }, changeService: { label: 'Change service offering', messages: { confirm: function(args) { return 'Are you sure you want to change service offering?'; }, success: function(args) { return 'Service offering is being changed.'; }, notification: function(args) { return 'Changing service offering'; }, complete: function(args) { return 'Service offering has been changed.'; } }, createForm: { title: 'Change Service Offering', desc: '', fields: { serviceOffering: { label: 'Service offering', select: function(args) { $.ajax({ url: createURL("listServiceOfferings&VirtualMachineId=" + args.context.instances[0].id), dataType: "json", async: true, success: function(json) { var serviceofferings = json.listserviceofferingsresponse.serviceoffering; var items = []; $(serviceofferings).each(function() { items.push({id: this.id, description: this.displaytext}); }); args.response.success({data: items}); } }); } } } }, action: function(args) { $.ajax({ url: createURL("changeServiceForVirtualMachine&id=" + args.context.instances[0].id + "&serviceOfferingId=" + args.data.serviceOffering), dataType: "json", async: true, success: function(json) { var jsonObj = json.changeserviceforvirtualmachineresponse.virtualmachine; args.response.success({data: jsonObj}); } }); }, notification: { poll: function(args) { args.complete(); } } }, createTemplate: { label: 'Create template', messages: { confirm: function(args) { /* if (getUserPublicTemplateEnabled() == "true" || isAdmin()) { $dialogCreateTemplate.find("#create_template_public_container").show(); } */ return 'Are you sure you want to create template?'; }, success: function(args) { return 'Template is being created.'; }, notification: function(args) { return 'Creating template'; }, complete: function(args) { return 'Template has been created.'; } }, createForm: { title: 'Create Template', desc: '', preFilter: cloudStack.preFilter.createTemplate, fields: { name: { label: 'Name', validation: { required: true }}, displayText: { label: 'Description', validation: { required: true }}, osTypeId: { label: 'OS Type', 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}); } }); } }, isPublic: { label: 'Public', isBoolean: true }, url: { label: 'Image directory', validation: { required: true } } } }, action: function(args) { /* var isValid = true; isValid &= validateString("Name", $thisDialog.find("#create_template_name"), $thisDialog.find("#create_template_name_errormsg")); isValid &= validateString("Display Text", $thisDialog.find("#create_template_desc"), $thisDialog.find("#create_template_desc_errormsg")); isValid &= validateString("Image Directory", $thisDialog.find("#image_directory"), $thisDialog.find("#image_directory_errormsg"), false); //image directory is required when creating template from VM whose hypervisor is BareMetal if (!isValid) return; $thisDialog.dialog("close"); */ var array1 = []; array1.push("&name=" + todb(args.data.name)); array1.push("&displayText=" + todb(args.data.displayText)); array1.push("&osTypeId=" + args.data.osTypeId); //array1.push("&isPublic=" + args.data.isPublic); array1.push("&isPublic=" + (args.data.isPublic=="on")); //temporary, before Brian fixes it. array1.push("&url=" + todb(args.data.url)); $.ajax({ url: createURL("createTemplate&virtualmachineid=" + args.context.instances[0].id + array1.join("")), dataType: "json", async: true, success: function(json) { var jid = json.createtemplateresponse.jobid; args.response.success( {_custom: {jobId: jid, getUpdatedItem: function(json) { return {}; //no properties in this VM needs to be updated }, getActionFilter: function() { return vmActionfilter; } } } ); } }); }, notification: { poll: pollAsyncJobResult } }, viewConsole: { label: 'View VM console', action: { externalLink: { url: function(args) { return clientConsoleUrl + '?cmd=access&vm=' + args.context.instances[0].id; }, title: function(args) { return getVmName(args.context.instances[0].name, args.context.instances[0].displayname) + ' console'; }, width: 820, height: 640 } } }, migrate: { label: 'Migrate instance', messages: { confirm: function(args) { return 'Are you sure you want to migrate instance?'; }, success: function(args) { return 'Instance is being migrated.'; }, notification: function(args) { return 'Migrating instance'; }, complete: function(args) { return 'Instance has been migrated.'; } }, createForm: { title: 'Migrate instance', desc: '', fields: { hostId: { label: 'Host', validation: { required: true }, select: function(args) { $.ajax({ url: createURL("listHosts&VirtualMachineId=" + args.context.instances[0].id), //url: createURL("listHosts"), //for testing only, comment it out before checking in. dataType: "json", async: true, success: function(json) { var hosts = json.listhostsresponse.host; var items = []; $(hosts).each(function() { items.push({id: this.id, description: this.name}); }); args.response.success({data: items}); } }); } } } }, action: function(args) { $.ajax({ url: createURL("migrateVirtualMachine&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.instances[0].id), dataType: "json", async: true, success: function(json) { var jid = json.migratevirtualmachineresponse.jobid; args.response.success( {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; /* var vmObj; $.ajax({ url: createURL("listVirtualMachines&id=" + args.context.instances[0].id), dataType: "json", async: false, success: function(json) { var items = json.listvirtualmachinesresponse.virtualmachine; if(items != null && items.length > 0) { vmObj = items[0]; } } }); return vmObj; */ }, getActionFilter: function() { return vmActionfilter; } } } ); } }); }, notification: { poll: pollAsyncJobResult } } }, tabs: { // Details tab details: { title: 'Details', fields: [ { name: { label: 'Name', isEditable: false } }, { id: { label: 'ID', isEditable: false }, displayname: { label: 'Display Name', isEditable: true }, state: { label: 'State', isEditable: false }, zonename: { label: 'Zone', isEditable: false }, hypervisor: { label: 'Hypervisor', isEditable: false }, templatename: { label: 'Template', isEditable: false }, templateid: { label: 'Template type', isEditable: false /* , select: function(args) { var items = []; $(testData.data.templates).each(function() { items.push({ id: this.id, description: this.name }); }); args.response.success({ data: items }); } */ }, guestosid: { 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}); } }); } }, serviceofferingname: { label: 'Service offering', isEditable: false }, group: { label: 'Group', isEditable: true }, hostname: { label: 'Host', isEditable: false}, haenable: { label: 'HA Enable', isEditable: false, converter:cloudStack.converters.toBooleanText }, isoid: { label: 'Attached ISO', isEditable: false, converter: function(isoid) { return cloudStack.converters.toBooleanText(isoid != null); } }, domain: { label: 'Domain', isEditable: false }, account: { label: 'Account', isEditable: false }, created: { label: 'Created', isEditable: false } } ], dataProvider: function(args) { args.response.success( { actionFilter: vmActionfilter, data: args.context.instances[0] } ); } }, /** * NICs tab */ nics: { title: 'NICs', multiple: true, fields: [ { id: { label: 'ID' }, ipaddress: { label: 'IP Address' }, type: { label: 'Type' }, gateway: { label: 'Default gateway' }, netmask: { label: 'Netmask' } } ], dataProvider: function(args) { args.response.success({data: args.context.instances[0].nic}); } }, /** * Security Groups tab */ securityGroups: { title: 'Security groups', multiple: true, fields: [ { id: { label: 'ID' }, name: { label: 'Name' }, description: { label: 'Description' } } ], dataProvider: function(args) { args.response.success({data: args.context.instances[0].securitygroup}); } }, /** * Statistics tab */ stats: { title: 'Statistics', fields: { totalCPU: { label: 'Total CPU' }, cpuused: { label: 'CPU Utilized' }, networkkbsread: { label: 'Network Read' }, networkkbswrite: { label: 'Network Write' } }, //dataProvider: testData.dataProvider.detailView('instances') dataProvider: function(args) { var jsonObj = args.context.instances[0]; args.response.success({ data: { totalCPU: fromdb(jsonObj.cpunumber) + " x " + cloudStack.converters.convertHz(jsonObj.cpuspeed), cpuused: jsonObj.cpuused, networkkbsread: (jsonObj.networkkbsread == null || jsonObj.networkkbsread == 0)? "N/A": cloudStack.converters.convertBytes(jsonObj.networkkbsread * 1024), networkkbswrite: (jsonObj.networkkbswrite == null || jsonObj.networkkbswrite == 0)? "N/A": cloudStack.converters.convertBytes(jsonObj.networkkbswrite * 1024) } }); } } } } } }; var vmActionfilter = function(args) { var jsonObj = args.context.item; var allowedActions = []; if (jsonObj.state == 'Destroyed') { if(isAdmin() || isDomainAdmin()) { allowedActions.push("restore"); } } else if (jsonObj.state == 'Running') { allowedActions.push("edit"); allowedActions.push("stop"); allowedActions.push("restart"); allowedActions.push("destroy"); if (isAdmin() && (jsonObj.rootdevicetype == 'NetworkFilesystem' || jsonObj.rootdevicetype == 'IscsiLUN' || jsonObj.rootdevicetype == 'PreSetup' || jsonObj.rootdevicetype == 'OCFS2') //&& (jsonObj.hypervisor == 'XenServer' || jsonObj.hypervisor == 'VMware') ) { allowedActions.push("migrate"); } if (jsonObj.isoid == null) { allowedActions.push("attachISO"); } else { allowedActions.push("detachISO"); } allowedActions.push("resetPassword"); allowedActions.push("changeService"); if(jsonObj.hypervisor == "BareMetal") { allowedActions.push("createTemplate"); } allowedActions.push("viewConsole"); } else if (jsonObj.state == 'Stopped') { allowedActions.push("edit"); allowedActions.push("start"); allowedActions.push("destroy"); if (jsonObj.isoid == null) { allowedActions.push("attachISO"); } else { allowedActions.push("detachISO"); } allowedActions.push("resetPassword"); allowedActions.push("changeService"); if(jsonObj.hypervisor == "BareMetal") { allowedActions.push("createTemplate"); } } else if (jsonObj.state == 'Starting') { allowedActions.push("stop"); } else if (jsonObj.state == 'Error') { allowedActions.push("destroy"); } return allowedActions; } })(jQuery, cloudStack, testData);