mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			8122 lines
		
	
	
		
			341 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			8122 lines
		
	
	
		
			341 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| (function($, cloudStack, testData) {
 | ||
| 
 | ||
|   var zoneObjs, podObjs, clusterObjs, domainObjs;
 | ||
|   var selectedClusterObj, selectedZoneObj, selectedPhysicalNetworkObj, selectedGuestNetworkObj;
 | ||
|   var publicNetworkObj;
 | ||
|   var naasStatusMap = {};
 | ||
|   var nspMap = {};
 | ||
|   
 | ||
|   cloudStack.sections.system = {
 | ||
|     title: 'System',
 | ||
|     id: 'system',
 | ||
|     // Network-as-a-service configuration
 | ||
|     naas: {
 | ||
|       mainNetworks: {
 | ||
|         'public': {
 | ||
|           detailView: {
 | ||
|             actions: {},
 | ||
|             tabs: {
 | ||
|               details: {
 | ||
|                 title: 'Details',                
 | ||
|                 fields: [
 | ||
|                   {
 | ||
|                     networkofferingdisplaytext:  { label: "Network offering description" }
 | ||
|                   },
 | ||
|                   {
 | ||
|                     id: { label: "ID" },
 | ||
|                     broadcastdomaintype: { label: 'Broadcast domain type' },
 | ||
|                     traffictype: { label: 'Traffic type' },
 | ||
|                     gateway: { label: 'Gateway' },
 | ||
|                     netmask: { label: 'Netmask' },
 | ||
|                     startip: { label: 'Start IP' },
 | ||
|                     endip: { label: 'End IP' },
 | ||
|                     zoneid: { label: 'Zone ID' },
 | ||
|                     networkofferingid: { label: 'Network offering ID' },
 | ||
|                     networkofferingname: { label: 'Network offering name' },
 | ||
|                     networkofferingavailability: { label: 'network offering availability' },
 | ||
|                     isshared: {
 | ||
|                       label: 'Shared',
 | ||
|                       converter: cloudStack.converters.toBooleanText
 | ||
|                     },
 | ||
|                     issystem: {
 | ||
|                       label: 'System',
 | ||
|                       converter: cloudStack.converters.toBooleanText
 | ||
|                     },
 | ||
|                     isdefault: {
 | ||
|                       label: 'Default',
 | ||
|                       converter: cloudStack.converters.toBooleanText
 | ||
|                     },
 | ||
|                     securitygroupenabled: {
 | ||
|                       label: 'Security group enabled',
 | ||
|                       converter: cloudStack.converters.toBooleanText
 | ||
|                     },
 | ||
|                     state: { label: 'State' },
 | ||
|                     related: { label: 'Related' },
 | ||
|                     dns1: { label: 'DNS 1' },
 | ||
|                     dns2: { label: 'DNS 2' },
 | ||
|                     vlan: { label: 'VLAN' },
 | ||
|                     domainid: { label: 'Domain ID' },
 | ||
|                     account: { label: 'Account' }
 | ||
|                   }
 | ||
|                 ],
 | ||
|                                 
 | ||
|                 dataProvider: function(args) {    
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("listNetworks&trafficType=Public&isSystem=true&zoneId="+selectedZoneObj.id),
 | ||
|                     dataType: "json",    
 | ||
|                     async: false,                    
 | ||
|                     success: function(json) {                      
 | ||
|                       var items = json.listnetworksresponse.network;
 | ||
|                       publicNetworkObj = items[0];    
 | ||
|                       args.response.success({data: publicNetworkObj});                      
 | ||
|                     }
 | ||
|                   });                       
 | ||
|                 }               
 | ||
|               },
 | ||
|                            
 | ||
|               ipAddresses: {
 | ||
|                 title: 'IP Addresses',
 | ||
|                 custom: function(args) {                  
 | ||
|                   return $('<div></div>').multiEdit({
 | ||
|                     context: args.context,
 | ||
|                     noSelect: true,
 | ||
|                     fields: {
 | ||
|                       'gateway': { edit: true, label: 'Gateway' },
 | ||
|                       'netmask': { edit: true, label: 'Netmask' },
 | ||
|                       'vlan': { edit: true, label: 'VLAN', isOptional: true },
 | ||
|                       'startip': { edit: true, label: 'Start IP' },
 | ||
|                       'endip': { edit: true, label: 'End IP' },
 | ||
|                       'add-rule': { label: 'Add', addButton: true }
 | ||
|                     },
 | ||
|                     add: {
 | ||
|                       label: 'Add',
 | ||
|                       action: function(args) {                       
 | ||
|                         var array1 = [];
 | ||
|                         array1.push("&zoneId=" + args.context.zones[0].id);
 | ||
| 
 | ||
|                         if (args.data.vlan != null && args.data.vlan.length > 0)
 | ||
|                           array1.push("&vlan=" + todb(args.data.vlan));
 | ||
|                         else
 | ||
|                           array1.push("&vlan=untagged");
 | ||
| 
 | ||
|                           
 | ||
|                         //array1.push("&isshared=true"); //temporary, will add scope, domain, account field, then uncommment the following section later.
 | ||
|                         /*
 | ||
|                         if($form.find('.form-item[rel=domainId]').css("display") != "none") {
 | ||
|                           if($form.find('.form-item[rel=account]').css("display") != "none") {  //account-specific
 | ||
|                             array1.push("&domainId=" + args.data.domainId);
 | ||
|                             array1.push("&account=" + args.data.account);
 | ||
|                           }
 | ||
|                           else {  //domain-specific
 | ||
|                             array1.push("&domainId=" + args.data.domainId);
 | ||
|                             array1.push("&isshared=true");
 | ||
|                           }
 | ||
|                         }
 | ||
|                         else { //zone-wide
 | ||
|                           array1.push("&isshared=true");
 | ||
|                         }
 | ||
|                         */
 | ||
|                         
 | ||
|                         array1.push("&gateway=" + args.data.gateway);
 | ||
|                         array1.push("&netmask=" + args.data.netmask);
 | ||
|                         array1.push("&startip=" + args.data.startip);
 | ||
|                         if(args.data.endip != null && args.data.endip.length > 0)
 | ||
|                           array1.push("&endip=" + args.data.endip);
 | ||
|                        
 | ||
|                         if(args.context.zones[0].securitygroupsenabled == false)
 | ||
|                           array1.push("&forVirtualNetwork=true");
 | ||
|                         else
 | ||
|                           array1.push("&forVirtualNetwork=false");
 | ||
|                        
 | ||
|                         $.ajax({
 | ||
|                           url: createURL("createVlanIpRange" + array1.join("")),
 | ||
|                           dataType: "json",
 | ||
|                           success: function(json) {                            
 | ||
|                             var item = json.createvlaniprangeresponse.vlan;                            
 | ||
|                             args.response.success({
 | ||
|                               data: item,
 | ||
|                               notification: {
 | ||
|                                 label: 'Added IP address',
 | ||
|                                 poll: function(args) {
 | ||
|                                   args.complete();
 | ||
|                                 }
 | ||
|                               }
 | ||
|                             });
 | ||
|                           },
 | ||
|                           error: function(XMLHttpResponse) {
 | ||
|                             var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                             args.response.error(errorMsg);
 | ||
|                           }
 | ||
|                         });                          
 | ||
|                       }
 | ||
|                     },
 | ||
|                     actions: {
 | ||
|                       destroy: {
 | ||
|                         label: 'Delete',
 | ||
|                         action: function(args) {                         
 | ||
|                           $.ajax({
 | ||
|                             url: createURL('deleteVlanIpRange'),
 | ||
|                             data: {
 | ||
|                               id: args.context.multiRule[0].id
 | ||
|                             },
 | ||
|                             dataType: 'json',
 | ||
|                             async: true,
 | ||
|                             success: function(json) {                                                  
 | ||
|                               args.response.success({                                
 | ||
|                                 notification: {
 | ||
|                                   label: 'Remove IP range ' + args.context.multiRule[0].id,
 | ||
|                                   poll: function(args) {                                   
 | ||
|                                     args.complete();
 | ||
|                                   }
 | ||
|                                 }
 | ||
|                               });                              
 | ||
|                             }
 | ||
|                           });                          
 | ||
|                         }
 | ||
|                       }
 | ||
|                     },
 | ||
|                     dataProvider: function(args) {     
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("listVlanIpRanges&zoneid=" + args.context.zones[0].id + "&networkId=" + publicNetworkObj.id),
 | ||
|                         dataType: "json",
 | ||
|                         success: function(json) {                         
 | ||
|                           var items = json.listvlaniprangesresponse.vlaniprange;
 | ||
|                           args.response.success({data: items});
 | ||
|                         }
 | ||
|                       });  
 | ||
|                     }
 | ||
|                   });
 | ||
|                 }
 | ||
|               }              
 | ||
|             }
 | ||
|           }
 | ||
|         },
 | ||
|         'management': { 
 | ||
|           detailView: {
 | ||
|             viewAll: { path: '_zone.pods', label: 'Pods' },
 | ||
|             tabs: {
 | ||
|               details: {
 | ||
|                 title: 'Details',                
 | ||
|                 fields: [
 | ||
|                   {
 | ||
|                     name: { label: 'Zone', isEditable: true }
 | ||
|                   },
 | ||
|                   {
 | ||
|                     id: { label: 'ID' },
 | ||
|                     allocationstate: { label: 'Allocation State' },
 | ||
|                     dns1: { label: 'DNS 1', isEditable: true },
 | ||
|                     dns2: { label: 'DNS 2', isEditable: true },
 | ||
|                     internaldns1: { label: 'Internal DNS 1', isEditable: true },
 | ||
|                     internaldns2: { label: 'Internal DNS 2', isEditable: true },
 | ||
|                     networktype: { label: 'Network Type' },
 | ||
|                     securitygroupsenabled: {
 | ||
|                       label: 'Security Groups Enabled',
 | ||
|                       converter:cloudStack.converters.toBooleanText
 | ||
|                     },
 | ||
|                     domain: { label: 'Domain' },
 | ||
| 
 | ||
|                     //only advanced zones have VLAN and CIDR Address
 | ||
|                     guestcidraddress: { label: 'Guest CIDR Address', isEditable: true },
 | ||
|                     vlan: { label: 'Vlan' },
 | ||
|                     startVlan: { label: 'Start Vlan', isEditable: true },
 | ||
|                     endVlan: { label: 'End Vlan', isEditable: true }
 | ||
|                   }
 | ||
|                 ],                 
 | ||
|                 dataProvider: function(args) {       
 | ||
|                   /*                
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("listTrafficTypes&physicalNetworkId=" + selectedPhysicalNetworkObj.id),
 | ||
|                     dataType: "json",                    
 | ||
|                     success: function(json) {
 | ||
|                       args.response.success({ data: testData.data.networks[0] }); 
 | ||
|                     }
 | ||
|                   });  
 | ||
|                   */                  
 | ||
|                   args.response.success({ data: selectedZoneObj }); 
 | ||
|                 }
 | ||
|               }
 | ||
|             }
 | ||
|           }
 | ||
|         },
 | ||
|         'guest': {
 | ||
|           detailView: {
 | ||
|             actions: {
 | ||
|               edit: {
 | ||
|                 label: 'Edit',
 | ||
|                 action: function(args) {                     
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateZone&id=" + args.context.zones[0].id + "&guestcidraddress=" + todb(args.data.guestcidraddress)),
 | ||
|                     dataType: "json",
 | ||
|                     async: false,
 | ||
|                     success: function(json) {                                         
 | ||
|                       selectedZoneObj = json.updatezoneresponse.zone; //override selectedZoneObj after update zone
 | ||
|                     }
 | ||
|                   });                                
 | ||
|                                                     
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updatePhysicalNetwork&id=" + selectedPhysicalNetworkObj.id + "&vlan=" + todb(args.data.vlan)),                    
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {      
 | ||
|                       var jobId = json.updatephysicalnetworkresponse.jobid;				        
 | ||
|                       args.response.success({ _custom: { jobId: jobId }});
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: { poll: pollAsyncJobResult }
 | ||
|               }
 | ||
|             },
 | ||
|           
 | ||
|             tabs: {
 | ||
|               details: {
 | ||
|                 title: 'Details',                                
 | ||
|                 preFilter: function(args) {                 
 | ||
|                   var hiddenFields = [];
 | ||
|                   if(selectedZoneObj.networktype == "Basic") {
 | ||
|                     hiddenFields.push("vlan");
 | ||
|                     hiddenFields.push("guestcidraddress");
 | ||
|                   }
 | ||
|                   return hiddenFields;
 | ||
|                 },             
 | ||
|                 fields: [
 | ||
|                   {
 | ||
|                     name: { label: 'Name' }
 | ||
|                   },
 | ||
|                   {
 | ||
|                     id: { label: 'ID' },
 | ||
|                     state: { label: 'State' },
 | ||
|                     vlan: { 
 | ||
|                       label: 'VLAN',
 | ||
|                       isEditable: true                      
 | ||
|                     },
 | ||
|                     broadcastdomainrange: { label: 'Broadcast domain range' },                  
 | ||
|                     zoneid: { label: 'Zone ID' },
 | ||
|                     guestcidraddress: { 
 | ||
|                       label: 'CIDR',
 | ||
|                       isEditable: true                             
 | ||
|                     }                    
 | ||
|                   }
 | ||
|                 ],
 | ||
|                 dataProvider: function(args) {  
 | ||
|                   selectedPhysicalNetworkObj["guestcidraddress"] = selectedZoneObj.guestcidraddress;                  									
 | ||
|                   args.response.success({ 
 | ||
|                     actionFilter: function() {                      
 | ||
|                       var allowedActions = [];
 | ||
|                       if(selectedZoneObj.networktype == "Advanced")
 | ||
|                         allowedActions.push("edit");
 | ||
|                       return allowedActions;
 | ||
|                     },
 | ||
|                     data: selectedPhysicalNetworkObj 
 | ||
|                   });                  
 | ||
|                 }
 | ||
|               },
 | ||
| 			        
 | ||
| 			        network: {
 | ||
|                 title: 'Network',
 | ||
|                 listView: {
 | ||
|                   section: 'networks',
 | ||
|                   id: 'networks',
 | ||
|                   fields: {
 | ||
| 									  name: { label: 'Name' },
 | ||
| 									  type: { label: 'Type' },
 | ||
|                     networkofferingdisplaytext: { label: 'Network offering' },
 | ||
| 										account: { label: 'Account' }                    
 | ||
|                   },
 | ||
|                   actions: {									 
 | ||
| 										add: {
 | ||
| 											label: 'Create network',
 | ||
| 
 | ||
| 											messages: {
 | ||
| 												confirm: function(args) {
 | ||
| 													return 'Are you sure you want to create a network?';
 | ||
| 												},
 | ||
| 												success: function(args) {
 | ||
| 													return 'Your new network is being created.';
 | ||
| 												},
 | ||
| 												notification: function(args) {
 | ||
| 													return 'Creating new network';
 | ||
| 												},
 | ||
| 												complete: function(args) {
 | ||
| 													return 'Network has been created successfully!';
 | ||
| 												}
 | ||
| 											},
 | ||
| 
 | ||
| 											createForm: {
 | ||
| 												title: 'Create network',
 | ||
|                         preFilter: function(args) {                        
 | ||
|                           if(selectedZoneObj.networktype == "Basic") {                            
 | ||
|                             args.$form.find('.form-item[rel=isDefault]').hide();
 | ||
|                             args.$form.find('.form-item[rel=vlanTagged]').hide();
 | ||
|                             args.$form.find('.form-item[rel=vlanId]').hide();
 | ||
|                             args.$form.find('.form-item[rel=scope]').hide();
 | ||
|                             args.$form.find('.form-item[rel=domainId]').hide();
 | ||
|                             args.$form.find('.form-item[rel=account]').hide();                           
 | ||
|                             args.$form.find('.form-item[rel=networkdomain]').hide();    
 | ||
| 
 | ||
|                             args.$form.find('.form-item[rel=podId]').css('display', 'inline-block');
 | ||
|                           }
 | ||
|                           else {  //"Advanced"                            
 | ||
|                             args.$form.find('.form-item[rel=isDefault]').css('display', 'inline-block');
 | ||
|                             args.$form.find('.form-item[rel=vlanTagged]').css('display', 'inline-block');
 | ||
|                             args.$form.find('.form-item[rel=vlanId]').css('display', 'inline-block');
 | ||
|                             args.$form.find('.form-item[rel=scope]').css('display', 'inline-block');
 | ||
|                             //args.$form.find('.form-item[rel=domainId]').css('display', 'inline-block'); //depends on scope field
 | ||
|                             //args.$form.find('.form-item[rel=account]').css('display', 'inline-block');  //depends on scope field                            
 | ||
|                             args.$form.find('.form-item[rel=networkdomain]').css('display', 'inline-block');     
 | ||
| 
 | ||
|                             args.$form.find('.form-item[rel=podId]').hide();                            
 | ||
|                           }
 | ||
|                         },
 | ||
| 												fields: {
 | ||
| 													name: {
 | ||
| 														label: 'Name',
 | ||
| 														validation: { required: true }
 | ||
| 													},
 | ||
| 													description: {
 | ||
| 														label: 'Description',
 | ||
| 														validation: { required: true }
 | ||
| 													},
 | ||
| 													isDefault: {
 | ||
| 														label: "Default",
 | ||
| 														isBoolean: true
 | ||
| 													},
 | ||
| 													vlanTagged: {
 | ||
| 														label: 'VLAN',
 | ||
| 														select: function(args) {
 | ||
| 															args.response.success({data: {id: "tagged", description: "tagged"}});
 | ||
| 														}
 | ||
| 													},
 | ||
| 													vlanId: { label: "VLAN ID" },													
 | ||
| 													scope: {
 | ||
| 														label: 'Scope',
 | ||
| 														select: function(args) {	
 | ||
| 															var array1 = [];
 | ||
| 															if(selectedZoneObj.securitygroupsenabled) {
 | ||
| 																array1.push({id: 'account-specific', description: 'account-specific'});
 | ||
| 															}
 | ||
| 															else {
 | ||
| 																array1.push({id: 'zone-wide', description: 'zone-wide'});
 | ||
| 																array1.push({id: 'domain-specific', description: 'domain-specific'});
 | ||
| 																array1.push({id: 'account-specific', description: 'account-specific'});
 | ||
| 															}
 | ||
| 															args.response.success({data: array1});
 | ||
| 
 | ||
| 															args.$select.change(function() {
 | ||
| 																var $form = $(this).closest('form');
 | ||
| 																if($(this).val() == "zone-wide") {
 | ||
| 																	$form.find('.form-item[rel=domainId]').hide();
 | ||
| 																	$form.find('.form-item[rel=account]').hide();
 | ||
| 																}
 | ||
| 																else if ($(this).val() == "domain-specific") {
 | ||
| 																	$form.find('.form-item[rel=domainId]').css('display', 'inline-block');
 | ||
| 																	$form.find('.form-item[rel=account]').hide();
 | ||
| 																}
 | ||
| 																else if($(this).val() == "account-specific") {
 | ||
| 																	$form.find('.form-item[rel=domainId]').css('display', 'inline-block');
 | ||
| 																	$form.find('.form-item[rel=account]').css('display', 'inline-block');
 | ||
| 																}
 | ||
| 															});
 | ||
| 														}
 | ||
| 													},
 | ||
|                           networkOfferingId: {
 | ||
| 													  label: 'Network offering',
 | ||
|                             dependsOn: 'scope', 
 | ||
| 														select: function(args) {			
 | ||
|                               var array1 = [];	                             
 | ||
|                               var apiCmd;                             
 | ||
|                               if(selectedZoneObj.networktype == "Advanced") {  //Advanced zone
 | ||
|                                 if(args.scope == "zone-wide" || args.scope == "domain-specific")
 | ||
|                                   apiCmd = "listNetworkOfferings&guestiptype=Shared";
 | ||
|                                 else  //args.scope == "account-specific"
 | ||
|                                   apiCmd = "listNetworkOfferings&guestiptype=Isolated&sourcenatsupported=false";    
 | ||
|                               }
 | ||
|                               else {  //Basic zone
 | ||
|                                 apiCmd = "listNetworkOfferings&guestiptype=Shared";
 | ||
|                               }                              
 | ||
| 															$.ajax({
 | ||
| 																url: createURL(apiCmd),
 | ||
| 																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++) {						
 | ||
| 																		for (var i = (networkOfferings.length-1); i >= 0; i--) {		
 | ||
|                                       if(nspMap["securityGroups"].state == "Disabled"){ //if security groups provider is disabled, exclude network offerings that has "SecurityGroupProvider" in service
 | ||
|                                         var includingSGP = false;
 | ||
|                                         var serviceObjArray = networkOfferings[i].service;
 | ||
|                                         for(var k = 0; k < serviceObjArray.length; k++) {
 | ||
|                                           if(serviceObjArray[k].name == "SecurityGroup") {
 | ||
|                                             includingSGP = true;
 | ||
|                                             break;
 | ||
|                                           }
 | ||
|                                         }
 | ||
|                                         if(includingSGP == true)
 | ||
|                                           continue; //skip to next network offering
 | ||
|                                       }
 | ||
| 																			array1.push({id: networkOfferings[i].id, description: networkOfferings[i].displaytext});																			
 | ||
| 																		}
 | ||
| 																	}
 | ||
| 																}
 | ||
| 															});															
 | ||
| 															args.response.success({data: array1});															
 | ||
| 														}
 | ||
| 													},
 | ||
|                           
 | ||
|                           podId: {
 | ||
|                             label: 'Pod',
 | ||
|                             validation: { required: true },
 | ||
|                             select: function(args) {
 | ||
|                               var items = [];                             
 | ||
|                               if(selectedZoneObj.networktype == "Basic") {
 | ||
|                                 $.ajax({
 | ||
|                                   url: createURL("listPods&zoneid=" + selectedZoneObj.id),
 | ||
|                                   dataType: "json",
 | ||
|                                   async: false,
 | ||
|                                   success: function(json) {                                                             
 | ||
|                                     var podObjs = json.listpodsresponse.pod;
 | ||
|                                     $(podObjs).each(function(){                                      
 | ||
|                                       items.push({id: this.id, description: this.name});
 | ||
|                                     });                                   
 | ||
|                                   }
 | ||
|                                 });
 | ||
|                                 items.push({id: 0, description: "(create new pod)"});    
 | ||
|                               }                        
 | ||
|                               args.response.success({data: items});                                  
 | ||
|                               
 | ||
|                               args.$select.change(function() {
 | ||
|                                 var $form = $(this).closest('form');                    
 | ||
|                                 if($(this).val() == "0") {
 | ||
|                                   $form.find('.form-item[rel=podname]').css('display', 'inline-block');
 | ||
|                                   $form.find('.form-item[rel=reservedSystemGateway]').css('display', 'inline-block');
 | ||
|                                   $form.find('.form-item[rel=reservedSystemNetmask]').css('display', 'inline-block');
 | ||
|                                   $form.find('.form-item[rel=reservedSystemStartIp]').css('display', 'inline-block');
 | ||
|                                   $form.find('.form-item[rel=reservedSystemEndIp]').css('display', 'inline-block');
 | ||
|                                 }
 | ||
|                                 else {
 | ||
|                                   $form.find('.form-item[rel=podname]').hide();
 | ||
|                                   $form.find('.form-item[rel=reservedSystemGateway]').hide();
 | ||
|                                   $form.find('.form-item[rel=reservedSystemNetmask]').hide();
 | ||
|                                   $form.find('.form-item[rel=reservedSystemStartIp]').hide();
 | ||
|                                   $form.find('.form-item[rel=reservedSystemEndIp]').hide();
 | ||
|                                 }
 | ||
|                               }); 
 | ||
|                             }
 | ||
|                           },
 | ||
|                           
 | ||
|                           //create new pod fields start here
 | ||
|                           podname: {
 | ||
|                             label: 'Pod name',
 | ||
|                             validation: { required: true }
 | ||
|                           },
 | ||
|                           reservedSystemGateway: {
 | ||
|                             label: 'Reserved system gateway',
 | ||
|                             validation: { required: true }
 | ||
|                           },
 | ||
|                           reservedSystemNetmask: {
 | ||
|                             label: 'Reserved system netmask',
 | ||
|                             validation: { required: true }
 | ||
|                           },
 | ||
|                           reservedSystemStartIp: {
 | ||
|                             label: 'Start Reserved system IP',
 | ||
|                             validation: { required: true }
 | ||
|                           },
 | ||
|                           reservedSystemEndIp: {
 | ||
|                             label: 'End Reserved system IP',
 | ||
|                             validation: { required: false }
 | ||
|                           },
 | ||
|                           //create new pod fields ends here
 | ||
|                           
 | ||
| 													domainId: {
 | ||
| 														label: 'Domain',
 | ||
| 														validation: { required: true },
 | ||
| 														select: function(args) {
 | ||
| 															var items = [];													
 | ||
| 															if(selectedZoneObj.domainid != null) { //list only domains under selectedZoneObj.domainid
 | ||
| 																$.ajax({
 | ||
| 																	url: createURL("listDomainChildren&id=" + selectedZoneObj.domainid + "&isrecursive=true"),
 | ||
| 																	dataType: "json",
 | ||
| 																	async: false,
 | ||
| 																	success: function(json) {
 | ||
| 																		var domainObjs = json.listdomainchildrenresponse.domain;
 | ||
| 																		$(domainObjs).each(function() {
 | ||
| 																			items.push({id: this.id, description: this.name});
 | ||
| 																		});
 | ||
| 																	}
 | ||
| 																});
 | ||
| 																$.ajax({
 | ||
| 																	url: createURL("listDomains&id=" + selectedZoneObj.domainid),
 | ||
| 																	dataType: "json",
 | ||
| 																	async: false,
 | ||
| 																	success: function(json) {
 | ||
| 																		var domainObjs = json.listdomainsresponse.domain;
 | ||
| 																		$(domainObjs).each(function() {
 | ||
| 																			items.push({id: this.id, description: this.name});
 | ||
| 																		});
 | ||
| 																	}
 | ||
| 																});
 | ||
| 															}
 | ||
| 															else { //list all domains
 | ||
| 																$.ajax({
 | ||
| 																	url: createURL("listDomains"),
 | ||
| 																	dataType: "json",
 | ||
| 																	async: false,
 | ||
| 																	success: function(json) {
 | ||
| 																		var domainObjs = json.listdomainsresponse.domain;
 | ||
| 																		$(domainObjs).each(function() {
 | ||
| 																			items.push({id: this.id, description: this.name});
 | ||
| 																		});
 | ||
| 																	}
 | ||
| 																});
 | ||
| 															}
 | ||
| 															args.response.success({data: items});
 | ||
| 														}
 | ||
| 													},
 | ||
| 													account: { label: 'Account' },
 | ||
| 													guestGateway: { label: 'Guest gateway' },
 | ||
| 													guestNetmask: { label: 'Guest netmask' },
 | ||
| 													guestStartIp: { label: 'Start guest IP' },
 | ||
| 													guestEndIp: { label: 'End guest IP' },
 | ||
| 													networkdomain: { label: 'Network domain' }
 | ||
| 												}
 | ||
| 											},
 | ||
| 
 | ||
| 											action: function(args) {
 | ||
| 												var array1 = [];		
 | ||
| 												array1.push("&zoneId=" + selectedZoneObj.id);
 | ||
| 												array1.push("&name=" + todb(args.data.name));
 | ||
| 												array1.push("&displayText=" + todb(args.data.description));
 | ||
|                         array1.push("&networkOfferingId=" + args.data.networkOfferingId);  
 | ||
|                         
 | ||
|                         if(selectedZoneObj.networktype == "Basic") {  
 | ||
|                           array1.push("&vlan=untagged");                          
 | ||
|                         }
 | ||
|                         else {  //"Advanced"                          
 | ||
|                           if (args.data.vlanTagged == "tagged")
 | ||
|                             array1.push("&vlan=" + todb(args.data.vlanId));
 | ||
|                           else
 | ||
|                             array1.push("&vlan=untagged");
 | ||
| 
 | ||
|                           var $form = args.$form;
 | ||
| 
 | ||
|                           if($form.find('.form-item[rel=domainId]').css("display") != "none") {
 | ||
|                             if($form.find('.form-item[rel=account]').css("display") != "none") {  //account-specific
 | ||
|                               array1.push("&acltype=account");
 | ||
|                               array1.push("&domainId=" + args.data.domainId);
 | ||
|                               array1.push("&account=" + args.data.account);
 | ||
|                             }
 | ||
|                             else {  //domain-specific
 | ||
|                               array1.push("&acltype=domain");
 | ||
|                               array1.push("&domainId=" + args.data.domainId);														
 | ||
|                             }
 | ||
|                           }
 | ||
|                           else { //zone-wide													
 | ||
|                             array1.push("&acltype=domain"); //server-side will make it Root domain (i.e. domainid=1)
 | ||
|                           }
 | ||
| 
 | ||
|                           array1.push("&isDefault=" + (args.data.isDefault=="on"));
 | ||
|                           array1.push("&gateway=" + args.data.guestGateway);
 | ||
|                           array1.push("&netmask=" + args.data.guestNetmask);
 | ||
|                           array1.push("&startip=" + args.data.guestStartIp);
 | ||
|                           array1.push("&endip=" + args.data.guestEndIp);
 | ||
| 
 | ||
|                           if(args.data.networkdomain != null && args.data.networkdomain.length > 0)
 | ||
|                             array1.push("&networkdomain=" + todb(args.data.networkdomain));
 | ||
|                         } 					
 | ||
| 																								
 | ||
| 												$.ajax({
 | ||
| 													url: createURL("createNetwork" + array1.join("")),
 | ||
| 													dataType: "json",
 | ||
| 													success: function(json) {
 | ||
| 														var item = json.createnetworkresponse.network;
 | ||
| 														args.response.success({data:item});
 | ||
|                                                         
 | ||
|                             if(selectedZoneObj.networktype == "Basic") {   
 | ||
|                               var array2 = [];       
 | ||
|                                                             
 | ||
|                               var podId;
 | ||
|                               if(args.data.podId != "0") {
 | ||
|                                 podId = args.data.podId;                                
 | ||
|                               }
 | ||
|                               else { //args.data.podId==0, create pod first                               
 | ||
|                                 var array1 = [];
 | ||
|                                 array1.push("&zoneId=" + selectedZoneObj.id);
 | ||
|                                 array1.push("&name=" + todb(args.data.podname));
 | ||
|                                 array1.push("&gateway=" + todb(args.data.reservedSystemGateway));
 | ||
|                                 array1.push("&netmask=" + todb(args.data.reservedSystemNetmask));
 | ||
|                                 array1.push("&startIp=" + todb(args.data.reservedSystemStartIp));
 | ||
| 
 | ||
|                                 var endip = args.data.reservedSystemEndIp;      //optional
 | ||
|                                 if (endip != null && endip.length > 0)
 | ||
|                                   array1.push("&endIp=" + todb(endip));                
 | ||
| 
 | ||
|                                 $.ajax({
 | ||
|                                   url: createURL("createPod" + array1.join("")),
 | ||
|                                   dataType: "json",
 | ||
|                                   async: false,
 | ||
|                                   success: function(json) {
 | ||
|                                     var item = json.createpodresponse.pod;                                    
 | ||
|                                     podId = item.id;
 | ||
|                                   },
 | ||
|                                   error: function(XMLHttpResponse) {
 | ||
|                                     //var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                                     //args.response.error(errorMsg);
 | ||
|                                   }
 | ||
|                                 });                                 
 | ||
|                               }                             
 | ||
|                               if(podId == null)  {  
 | ||
|                                 alert("podId is null, so unable to create IP range on pod level");                              
 | ||
|                                 return;           
 | ||
|                               }    
 | ||
|                               array2.push("&podId=" + podId);                              
 | ||
|                               array2.push("&vlan=untagged");
 | ||
|                               array2.push("&zoneid=" + selectedZoneObj.id);                              
 | ||
|                               array2.push("&forVirtualNetwork=false"); //direct VLAN
 | ||
|                               array2.push("&gateway=" + todb(args.data.guestGateway));
 | ||
|                               array2.push("&netmask=" + todb(args.data.guestNetmask));
 | ||
|                               array2.push("&startip=" + todb(args.data.guestStartIp));                      
 | ||
|                               var endip = args.data.guestEndIp;
 | ||
|                               if(endip != null && endip.length > 0)
 | ||
|                                 array2.push("&endip=" + todb(endip));
 | ||
|                               $.ajax({
 | ||
|                                 url: createURL("createVlanIpRange" + array2.join("")),
 | ||
|                                 dataType: "json",
 | ||
|                                 async: false,
 | ||
|                                 success: function(json) {
 | ||
|                                   //var item = json.createvlaniprangeresponse.vlan;
 | ||
|                                 },
 | ||
|                                 error: function(XMLHttpResponse) {
 | ||
|                                   //var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                                   //args.response.error(errorMsg);
 | ||
|                                 }
 | ||
|                               });  
 | ||
|                               
 | ||
|                             }                         
 | ||
| 													},
 | ||
| 													error: function(XMLHttpResponse) {
 | ||
| 														var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
| 														args.response.error(errorMsg);
 | ||
| 													}
 | ||
| 												});		
 | ||
| 											},
 | ||
| 
 | ||
| 											notification: {
 | ||
| 												poll: function(args) {
 | ||
| 													args.complete();
 | ||
| 												}
 | ||
| 											}
 | ||
| 										}										                 
 | ||
|                   },
 | ||
|                   dataProvider: function(args) {		
 | ||
| 										$.ajax({
 | ||
| 										  url: createURL("listNetworks&trafficType=Guest&zoneId=" + selectedZoneObj.id),
 | ||
| 											dataType: "json",
 | ||
| 											success: function(json) {											  
 | ||
| 												var items = json.listnetworksresponse.network;											
 | ||
| 												args.response.success({data: items});		
 | ||
| 											}
 | ||
| 										});									
 | ||
| 									},
 | ||
| 																		
 | ||
| 									detailView: {
 | ||
| 										name: 'Guest network details',
 | ||
|                     viewAll: { path: '_zone.guestIpRanges', label: 'IP ranges' }, 
 | ||
|                     actions: {                      
 | ||
|                       edit: {
 | ||
|                         label: 'Edit',                        
 | ||
|                         messages: {
 | ||
|                           confirm: function(args) {
 | ||
|                             return 'Are you sure you want to edit network?';
 | ||
|                           },
 | ||
|                           success: function(args) {
 | ||
|                             return 'Network is being edited.';
 | ||
|                           },
 | ||
|                           notification: function(args) {
 | ||
|                             return 'Editing network';
 | ||
|                           },
 | ||
|                           complete: function(args) {
 | ||
|                             return 'Network has been edited.';
 | ||
|                           }
 | ||
|                         },                        
 | ||
|                         action: function(args) {
 | ||
|                           var array1 = [];                          
 | ||
|                           array1.push("&name=" + todb(args.data.name));
 | ||
|                           array1.push("&displaytext=" + todb(args.data.displaytext));                                            
 | ||
|                                              
 | ||
|                           //args.data.networkofferingid is null when networkofferingid field is hidden
 | ||
|                           if(args.data.networkofferingid != null && args.data.networkofferingid != selectedGuestNetworkObj.networkofferingid)
 | ||
|                             array1.push("&networkofferingid=" + todb(args.data.networkofferingid));    //??? 
 | ||
|                                                                                
 | ||
|                           //args.data.networkdomain is null when networkdomain field is hidden
 | ||
|                           if(args.data.networkdomain != null && args.data.networkdomain != selectedGuestNetworkObj.networkdomain)
 | ||
|                             array1.push("&networkdomain=" + todb(args.data.networkdomain));      
 | ||
|                             
 | ||
|                           $.ajax({
 | ||
|                             url: createURL("updateNetwork&id=" + args.context.networks[0].id + array1.join("")),
 | ||
|                             dataType: "json",
 | ||
|                             success: function(json) {                              
 | ||
|                               var jid = json.updatenetworkresponse.jobid;
 | ||
|                               args.response.success(
 | ||
|                                 {_custom:
 | ||
|                                  {jobId: jid,
 | ||
|                                   getUpdatedItem: function(json) {
 | ||
|                                     var item = json.queryasyncjobresultresponse.jobresult.network;
 | ||
|                                     return {data: item};
 | ||
|                                   }
 | ||
|                                  }
 | ||
|                                 }
 | ||
|                               );
 | ||
|                             }
 | ||
|                           });
 | ||
|                         },
 | ||
|                         notification: {  //notification in edit action doesn't get picked up (wait until Brian fixes Widget to support async job of Edit action)
 | ||
|                           poll: pollAsyncJobResult  
 | ||
|                         }                          
 | ||
|                       },
 | ||
|                       'delete': {
 | ||
|                         label: 'Delete network',
 | ||
|                         messages: {
 | ||
|                           confirm: function(args) {
 | ||
|                             return 'Are you sure you want to delete network ?';
 | ||
|                           },
 | ||
|                           success: function(args) {
 | ||
|                             return 'Network is being deleted.';
 | ||
|                           },
 | ||
|                           notification: function(args) {
 | ||
|                             return 'Deleting network';
 | ||
|                           },
 | ||
|                           complete: function(args) {
 | ||
|                             return 'Network has been deleted.';
 | ||
|                           }
 | ||
|                         },
 | ||
|                         action: function(args) {                          
 | ||
|                           $.ajax({
 | ||
|                             url: createURL("deleteNetwork&id=" + args.context.networks[0].id),
 | ||
|                             dataType: "json",
 | ||
|                             async: true,
 | ||
|                             success: function(json) {
 | ||
|                               var jid = json.deletenetworkresponse.jobid;
 | ||
|                               args.response.success(
 | ||
|                                 {_custom:
 | ||
|                                  {jobId: jid,
 | ||
|                                   getUpdatedItem: function(json) {
 | ||
|                                     return {}; //nothing in this network needs to be updated, in fact, this whole template has being deleted
 | ||
|                                   }
 | ||
|                                  }
 | ||
|                                 }
 | ||
|                               );
 | ||
|                             }
 | ||
|                           });
 | ||
|                         },
 | ||
|                         notification: {
 | ||
|                           poll: pollAsyncJobResult
 | ||
|                         }
 | ||
|                       }    
 | ||
|                     },
 | ||
| 										tabs: {
 | ||
| 											details: {
 | ||
| 												title: 'Details',                                                
 | ||
|                         preFilter: function(args) { 
 | ||
|                           var hiddenFields = [];                          
 | ||
|                           if(selectedZoneObj.networktype == "Basic") {
 | ||
|                             hiddenFields.push("account");
 | ||
|                             hiddenFields.push("gateway");
 | ||
|                             hiddenFields.push("netmask");
 | ||
|                             hiddenFields.push("startip");
 | ||
|                             hiddenFields.push("endip");                           
 | ||
|                           }  
 | ||
|                           
 | ||
|                           if(selectedGuestNetworkObj.type == "Isolated") {
 | ||
|                             hiddenFields.push("networkofferingdisplaytext");
 | ||
|                             hiddenFields.push("networkdomaintext");
 | ||
|                             hiddenFields.push("gateway");
 | ||
|                             hiddenFields.push("netmask");
 | ||
|                             hiddenFields.push("startip");
 | ||
|                             hiddenFields.push("endip");
 | ||
|                           }
 | ||
|                           else {
 | ||
|                             hiddenFields.push("networkofferingid");
 | ||
|                             hiddenFields.push("networkdomain");
 | ||
|                           }                          
 | ||
|                           return hiddenFields;
 | ||
|                         },                        
 | ||
| 												fields: [
 | ||
| 													{
 | ||
| 														name: { 
 | ||
|                               label: 'Name',
 | ||
|                               isEditable: true
 | ||
|                             }
 | ||
|                           },
 | ||
|                           {
 | ||
|                             id: { label: 'ID' },
 | ||
|                             displaytext: { 
 | ||
|                               label: 'Description',
 | ||
|                               isEditable: true
 | ||
|                             },														
 | ||
| 														isdefault: {  
 | ||
| 															label: 'Default',
 | ||
| 															converter: cloudStack.converters.toBooleanText
 | ||
| 														},
 | ||
|                             vlan: { label: 'VLAN ID' },
 | ||
|                             
 | ||
|                             networkofferingdisplaytext: { label: 'Network offering' },
 | ||
|                             networkofferingid: { 
 | ||
|                               label: 'Network offering',
 | ||
|                               isEditable: true,
 | ||
|                               select: function(args){                                    
 | ||
|                                 var items = [];    
 | ||
|                                 $.ajax({
 | ||
|                                   url: createURL("listNetworkOfferings&networkid=" + selectedGuestNetworkObj.id),                                                                      
 | ||
|                                   dataType: "json",
 | ||
|                                   async: false,
 | ||
|                                   success: function(json) {                                                                       
 | ||
|                                     var networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;                                                                         
 | ||
|                                     $(networkOfferingObjs).each(function() {
 | ||
|                                       items.push({id: this.id, description: this.displaytext});
 | ||
|                                     });                                                                          
 | ||
|                                   }
 | ||
|                                 });   
 | ||
|                                 $.ajax({
 | ||
|                                   url: createURL("listNetworkOfferings&id=" + selectedGuestNetworkObj.networkofferingid),  //include currently selected network offeirng to dropdown                                                          
 | ||
|                                   dataType: "json",
 | ||
|                                   async: false,
 | ||
|                                   success: function(json) {                                                                       
 | ||
|                                     var networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;  
 | ||
|                                     $(networkOfferingObjs).each(function() {
 | ||
|                                       items.push({id: this.id, description: this.displaytext});
 | ||
|                                     });                                                                          
 | ||
|                                   }
 | ||
|                                 });  
 | ||
|                                 args.response.success({data: items});                                    
 | ||
|                               }
 | ||
|                             },
 | ||
|                             
 | ||
|                             domain: { label: 'Domain' },
 | ||
|                             account: { label: 'Account' },                            
 | ||
|                             gateway: { label: 'Gateway' },
 | ||
|                             netmask: { label: 'Netmask' },
 | ||
|                             startip: { label: 'Start IP' },
 | ||
|                             endip: { label: 'End IP' },
 | ||
|                             networkdomaintext: { 
 | ||
|                               label: 'Network domain'
 | ||
|                             },   
 | ||
|                             networkdomain: { 
 | ||
|                               label: 'Network domain',
 | ||
|                               isEditable: true
 | ||
|                             }                                                 
 | ||
| 													}
 | ||
| 												],
 | ||
| 												dataProvider: function(args) {	
 | ||
|                           selectedGuestNetworkObj = args.context.networks[0];  
 | ||
|                           
 | ||
|                           selectedGuestNetworkObj["networkdomaintext"] = selectedGuestNetworkObj.networkdomain;   
 | ||
|                           
 | ||
|                           if(selectedGuestNetworkObj.vlan == null && selectedGuestNetworkObj.broadcasturi != null)
 | ||
|                             selectedGuestNetworkObj["vlan"] = selectedGuestNetworkObj.broadcasturi.replace("vlan://", "");
 | ||
|                           
 | ||
| 												  args.response.success({data: selectedGuestNetworkObj});
 | ||
| 												}
 | ||
| 											},
 | ||
| 										}
 | ||
| 									}									
 | ||
|                 }
 | ||
|               }			  
 | ||
|             }
 | ||
|           }
 | ||
|         }
 | ||
|       },
 | ||
|       networks: {
 | ||
|         actions: {
 | ||
|           add: {
 | ||
|             label: 'Add Network',
 | ||
|             action: function(args) {
 | ||
|               args.response.success();
 | ||
|             }
 | ||
|           }
 | ||
|         },
 | ||
|         dataProvider: function(args) {
 | ||
|           setTimeout(function() {
 | ||
|             args.response.success({
 | ||
|               data: [
 | ||
|                 { id: 1, name: 'Network 1' }//,
 | ||
|                 //{ id: 2, name: 'Network 2' },
 | ||
|                 //{ id: 3, name: 'Network 3' }
 | ||
|               ]
 | ||
|             });
 | ||
|           }, 500);
 | ||
|         }
 | ||
|       },
 | ||
| 
 | ||
|       networkProviders: {
 | ||
|         // Returns state of each network provider type
 | ||
|         statusCheck: function(args) { 
 | ||
|           naasStatusMap = {
 | ||
|             virtualRouter: 'not-configured',
 | ||
|             netscaler: 'not-configured',
 | ||
|             f5: 'not-configured',
 | ||
|             srx: 'not-configured',
 | ||
|             securityGroups: 'not-configured'
 | ||
|           };
 | ||
|                               
 | ||
|           selectedZoneObj = args.context.physicalResources[0];    
 | ||
|           $.ajax({
 | ||
|             url: createURL("listPhysicalNetworks&zoneId=" + selectedZoneObj.id),
 | ||
|             dataType: "json",
 | ||
|             async: false,
 | ||
|             success: function(json) {                      
 | ||
|               var items = json.listphysicalnetworksresponse.physicalnetwork;                           
 | ||
|               selectedPhysicalNetworkObj = items[0];                              
 | ||
|             }
 | ||
|           });     
 | ||
|                 
 | ||
|           $.ajax({
 | ||
|             url: createURL("listNetworkServiceProviders&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
 | ||
|             dataType: "json",
 | ||
|             async: false,
 | ||
|             success: function(json) {    
 | ||
|               var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;    
 | ||
|               nspMap = {}; //empty the map   
 | ||
|               for(var i = 0; i < items.length; i++) {                
 | ||
|                 switch(items[i].name) {
 | ||
|                   case "VirtualRouter":
 | ||
|                     nspMap["virtualRouter"] = items[i];
 | ||
|                     if(items[i].state == "Enabled") {
 | ||
|                       naasStatusMap["virtualRouter"] = "enabled";
 | ||
|                     } 
 | ||
|                     else {
 | ||
|                       naasStatusMap["virtualRouter"] = "disabled";  //VirtualRouter provider is disabled 
 | ||
|                     }                    
 | ||
|                     break;     
 | ||
|                   case "Netscaler":
 | ||
|                     nspMap["netscaler"] = items[i];
 | ||
|                     if(items[i].state == "Enabled") {
 | ||
|                       naasStatusMap["netscaler"] = "enabled";
 | ||
|                     }
 | ||
|                     else { //items[i].state == "Disabled"                                           
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("listNetscalerLoadBalancers&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
 | ||
|                         dataType: "json",
 | ||
|                         async: false,
 | ||
|                         success: function(json) {                                               
 | ||
|                           var items = json.listnetscalerloadbalancerresponse.netscalerloadbalancer;                       
 | ||
|                           if(items != null && items.length > 0) {
 | ||
|                             naasStatusMap["netscaler"] = "disabled";  //NetScaler provider is disabled with device(s)
 | ||
|                           }
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                     break;      
 | ||
|                   case "F5BigIp":
 | ||
|                     nspMap["f5"] = items[i];
 | ||
|                     if(items[i].state == "Enabled") {
 | ||
|                       naasStatusMap["f5"] = "enabled";
 | ||
|                     }
 | ||
|                     else { //items[i].state == "Disabled"                                           
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("listF5LoadBalancers&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
 | ||
|                         dataType: "json",
 | ||
|                         async: false,
 | ||
|                         success: function(json) {    
 | ||
|                           var items = json.listf5loadbalancerresponse.f5loadbalancer;                       
 | ||
|                           if(items != null && items.length > 0) {
 | ||
|                             naasStatusMap["f5"] = "disabled";  //F5 provider is disabled with device(s)
 | ||
|                           }
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                     break;   
 | ||
|                   case "JuniperSRX":
 | ||
|                     nspMap["srx"] = items[i];
 | ||
|                     if(items[i].state == "Enabled") {
 | ||
|                       naasStatusMap["srx"] = "enabled";
 | ||
|                     }
 | ||
|                     else { //items[i].state == "Disabled"                                           
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("listSrxFirewalls&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
 | ||
|                         dataType: "json",
 | ||
|                         async: false,
 | ||
|                         success: function(json) {  
 | ||
|                           var items = json.listsrxfirewallresponse.srxfirewall;                       
 | ||
|                           if(items != null && items.length > 0) {
 | ||
|                             naasStatusMap["srx"] = "disabled";  //SRX provider is disabled with device(s)
 | ||
|                           }
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                     break;   
 | ||
|                   case "SecurityGroupProvider":
 | ||
|                     nspMap["securityGroups"] = items[i];
 | ||
|                     if(items[i].state == "Enabled") {
 | ||
|                       naasStatusMap["securityGroups"] = "enabled";
 | ||
|                     }
 | ||
|                     else {
 | ||
|                       naasStatusMap["securityGroups"] = "disabled";  //SecurityGroup provider is disabled 
 | ||
|                     }
 | ||
|                     break;                     
 | ||
|                 }              
 | ||
|               }              
 | ||
|             }
 | ||
|           });  
 | ||
|           return naasStatusMap;
 | ||
|         },
 | ||
| 
 | ||
|         statusLabels: {
 | ||
|           enabled: 'Enabled',             //having device, network service provider is enabled
 | ||
|           'not-configured': 'Not setup',  //no device
 | ||
|           disabled: 'Disabled'            //having device, network service provider is disabled
 | ||
|         },
 | ||
| 
 | ||
|         // Actions performed on entire net. provider type
 | ||
|         actions: {
 | ||
|           enable: function(args) {
 | ||
|             args.response.success();
 | ||
|           },
 | ||
| 
 | ||
|           disable: function(args) {
 | ||
|             args.response.success();
 | ||
|           }
 | ||
|         },
 | ||
| 
 | ||
|         types: {
 | ||
|           // Virtual router provider
 | ||
|           virtualRouter: {
 | ||
|             id: 'virtualRouterProviders',
 | ||
|             label: 'Virtual Router',                       
 | ||
|             providerActionFilter: function(args) { 
 | ||
|               var allowedActions = [];
 | ||
|               var jsonObj = nspMap["virtualRouter"];              
 | ||
|               if(jsonObj.state == "Enabled") 
 | ||
|                 allowedActions.push("disable");               
 | ||
|               else if(jsonObj.state == "Disabled") 
 | ||
|                 allowedActions.push("enable");                            
 | ||
|               return allowedActions;
 | ||
|             },
 | ||
|             providerActions: {              
 | ||
|               enable: {
 | ||
|                 label: 'Enable',
 | ||
|                 action: function(args) {                  
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateNetworkServiceProvider&id=" + nspMap["virtualRouter"].id + "&state=Enabled"),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {                      
 | ||
|                       var jid = json.updatenetworkserviceproviderresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                           {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {                              
 | ||
|                               var item = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
 | ||
|                               nspMap["virtualRouter"] = item;
 | ||
|                               return item; 
 | ||
|                             }
 | ||
|                           }
 | ||
|                         }
 | ||
|                       );  
 | ||
|                     }
 | ||
|                   }); 
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function() { return 'Enabled Netscaler provider'; }
 | ||
|                 },
 | ||
|                 notification: { poll: pollAsyncJobResult }
 | ||
|               },
 | ||
|               disable: {
 | ||
|                 label: 'Disable',
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateNetworkServiceProvider&id=" + nspMap["virtualRouter"].id + "&state=Disabled"),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {                      
 | ||
|                       var jid = json.updatenetworkserviceproviderresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                           {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {                              
 | ||
|                               var item = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
 | ||
|                               nspMap["virtualRouter"] = item;
 | ||
|                               return item; 
 | ||
|                             }
 | ||
|                           }
 | ||
|                         }
 | ||
|                       );  
 | ||
|                     }
 | ||
|                   }); 
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function() { return 'Disabled Netscaler provider'; }
 | ||
|                 },
 | ||
|                 notification: { poll: pollAsyncJobResult }
 | ||
|               }              
 | ||
|             },  
 | ||
|             fields: {
 | ||
|               id: { label: 'ID' },
 | ||
|               name: { label: 'Name' }//,              
 | ||
|               //state: { label: 'Status' } //comment it for now, since dataProvider below doesn't get called by widget code after action is done
 | ||
|             },
 | ||
|             dataProvider: function(args) {                            
 | ||
|               args.response.success({data: nspMap["virtualRouter"]});            
 | ||
|             }            
 | ||
|           },
 | ||
| 
 | ||
|           // NetScaler list view
 | ||
|           netscaler: {
 | ||
|             id: 'netscalerProviders',
 | ||
|             label: 'NetScaler',
 | ||
|             fields: {             
 | ||
|               ipaddress: { label: 'IP Address' },
 | ||
|               lbdevicestate: { label: 'Status' }
 | ||
|             },     
 | ||
|             providerActionFilter: function(args) {                        
 | ||
|               var allowedActions = [];
 | ||
|               var jsonObj = nspMap["netscaler"];              
 | ||
|               if(jsonObj.state == "Enabled") 
 | ||
|                 allowedActions.push("disable");               
 | ||
|               else if(jsonObj.state == "Disabled") 
 | ||
|                 allowedActions.push("enable"); 
 | ||
|               allowedActions.push("shutdown");                
 | ||
|               return allowedActions;
 | ||
|             },
 | ||
|             providerActions: {              
 | ||
|               enable: {
 | ||
|                 label: 'Enable',
 | ||
|                 action: function(args) {                  
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateNetworkServiceProvider&id=" + nspMap["netscaler"].id + "&state=Enabled"),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {                      
 | ||
|                       var jid = json.updatenetworkserviceproviderresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                           {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {                              
 | ||
|                               var item = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
 | ||
|                               nspMap["netscaler"] = item;
 | ||
|                               return item; 
 | ||
|                             }
 | ||
|                           }
 | ||
|                         }
 | ||
|                       );  
 | ||
|                     }
 | ||
|                   }); 
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function() { return 'Enabled Netscaler provider'; }
 | ||
|                 },
 | ||
|                 notification: { poll: pollAsyncJobResult }
 | ||
|               },
 | ||
|               disable: {
 | ||
|                 label: 'Disable',
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateNetworkServiceProvider&id=" + nspMap["netscaler"].id + "&state=Disabled"),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {                      
 | ||
|                       var jid = json.updatenetworkserviceproviderresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                           {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {                              
 | ||
|                               var item = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
 | ||
|                               nspMap["netscaler"] = item;
 | ||
|                               return item; 
 | ||
|                             }
 | ||
|                           }
 | ||
|                         }
 | ||
|                       );  
 | ||
|                     }
 | ||
|                   }); 
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function() { return 'Disabled Netscaler provider'; }
 | ||
|                 },
 | ||
|                 notification: { poll: pollAsyncJobResult }
 | ||
|               },
 | ||
|               shutdown: {
 | ||
|                 label: 'Shutdown',
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("deleteNetworkServiceProvider&id=" + nspMap["netscaler"].id),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) { 
 | ||
|                       var jid = json.deletenetworkserviceproviderresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                           {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {  
 | ||
|                               nspMap["netscaler"] = null;
 | ||
|                               return {}; //nothing in this network service provider needs to be updated, in fact, this whole network service provider has being deleted
 | ||
|                             }
 | ||
|                           }
 | ||
|                         }
 | ||
|                       );  
 | ||
|                     }
 | ||
|                   }); 
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function() { return 'Shutdown Netscaler provider'; }
 | ||
|                 },
 | ||
|                 notification: { poll: pollAsyncJobResult }
 | ||
|               }              
 | ||
|             },            
 | ||
|             actions: {
 | ||
|               add: {
 | ||
|                 label: 'Add new NetScaler',
 | ||
|                 createForm: {
 | ||
|                   title: 'Add new NetScaler',    
 | ||
|                   fields: {
 | ||
|                     ip: {
 | ||
|                       label: 'IP address'
 | ||
|                     },
 | ||
|                     username: {
 | ||
|                       label: 'Username'
 | ||
|                     },
 | ||
|                     password: {
 | ||
|                       label: 'Password',
 | ||
|                       isPassword: true
 | ||
|                     },
 | ||
|                     networkdevicetype: {
 | ||
|                       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: 'Public interface'
 | ||
|                     },
 | ||
|                     privateinterface: {
 | ||
|                       label: 'Private interface'
 | ||
|                     },
 | ||
|                     numretries: {
 | ||
|                       label: 'Number of retries',
 | ||
|                       defaultValue: '2'
 | ||
|                     },
 | ||
|                     inline: {
 | ||
|                       label: 'Mode',
 | ||
|                       select: function(args) {
 | ||
|                         var items = [];
 | ||
|                         items.push({id: "false", description: "side by side"});  
 | ||
|                         items.push({id: "true", description: "inline"});  
 | ||
|                         args.response.success({data: items});
 | ||
|                       }                      
 | ||
|                     },
 | ||
|                     capacity: {
 | ||
|                       label: 'Capacity',                      
 | ||
|                       validation: { required: false, number: true }                      
 | ||
|                     },
 | ||
|                     dedicated: {
 | ||
|                       label: 'Dedicated',
 | ||
|                       isBoolean: true,
 | ||
|                       isChecked: false
 | ||
|                     }                    
 | ||
|                   }                  
 | ||
|                 },
 | ||
|                 action: function(args) {  
 | ||
|                   if(nspMap["netscaler"] == null) { 
 | ||
|                     $.ajax({
 | ||
|                       url: createURL("addNetworkServiceProvider&name=Netscaler&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
 | ||
|                       dataType: "json",
 | ||
|                       async: true, 
 | ||
|                       success: function(json) {                             
 | ||
|                         var jobId = json.addnetworkserviceproviderresponse.jobid;				        
 | ||
|                         var timerKey = "addNetworkServiceProviderJob_"+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) {  
 | ||
|                                   addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addNetscalerLoadBalancer", "addnetscalerloadbalancerresponse");                                     
 | ||
|                                 } 
 | ||
|                                 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); 
 | ||
|                             }
 | ||
|                           });
 | ||
|                         });
 | ||
|                       }
 | ||
|                     });                    
 | ||
|                   }
 | ||
|                   else { 
 | ||
|                     addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addNetscalerLoadBalancer", "addnetscalerloadbalancerresponse");
 | ||
|                   }                       
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Added new NetScaler';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               }
 | ||
|             },           
 | ||
|             dataProvider: function(args) {                      
 | ||
|               $.ajax({
 | ||
|                 url: createURL("listNetscalerLoadBalancers&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
 | ||
|                 dataType: "json",
 | ||
|                 async: false,
 | ||
|                 success: function(json) {                                   
 | ||
|                   var items = json.listnetscalerloadbalancerresponse.netscalerloadbalancer;            
 | ||
|                   args.response.success({data: items});
 | ||
|                 }
 | ||
|               });              
 | ||
|             },           
 | ||
|             detailView: {
 | ||
|               name: 'NetScaler details',
 | ||
|               actions: {                
 | ||
|                 'delete': {
 | ||
|                   label: 'Delete NetScaler',
 | ||
|                   messages: {
 | ||
|                     confirm: function(args) {
 | ||
|                       return 'Are you sure you want to delete this NetScaler?';
 | ||
|                     },
 | ||
|                     success: function(args) {
 | ||
|                       return 'NetScaler is being deleted.';
 | ||
|                     },
 | ||
|                     notification: function(args) {
 | ||
|                       return 'Deleting NetScaler';
 | ||
|                     },
 | ||
|                     complete: function(args) {
 | ||
|                       return 'NetScaler has been deleted.';
 | ||
|                     }
 | ||
|                   },
 | ||
|                   action: function(args) {                                      
 | ||
|                     $.ajax({
 | ||
|                       url: createURL("deleteNetscalerLoadBalancer&lbdeviceid=" + args.context.netscalerProviders[0].lbdeviceid),
 | ||
|                       dataType: "json",
 | ||
|                       async: true,
 | ||
|                       success: function(json) {                       
 | ||
|                         var jid = json.deletenetscalerloadbalancerresponse.jobid;
 | ||
|                         args.response.success(
 | ||
|                           {_custom:
 | ||
|                            {jobId: jid}
 | ||
|                           }
 | ||
|                         );
 | ||
|                       }
 | ||
|                     });
 | ||
|                   },
 | ||
|                   notification: {
 | ||
|                     poll: pollAsyncJobResult
 | ||
|                   }
 | ||
|                 }               
 | ||
|               },
 | ||
|               tabs: {
 | ||
|                 details: {
 | ||
|                   title: 'Details',
 | ||
|                   fields: [
 | ||
|                     {
 | ||
|                       lbdeviceid: { label: 'ID' },
 | ||
|                       ipaddress: { label: 'IP Address' },
 | ||
|                       lbdevicestate: { label: 'Status' },
 | ||
|                       lbdevicename: { label: 'Type' },
 | ||
|                       lbdevicecapacity: { label: 'Capacity' },
 | ||
|                       lbdevicededicated: { 
 | ||
|                         label: 'Dedicated',
 | ||
|                         converter: cloudStack.converters.toBooleanText                        
 | ||
|                       },
 | ||
|                       inline: { 
 | ||
|                         label: 'Mode',
 | ||
|                         converter: function(args) {
 | ||
|                           if(args == false)
 | ||
|                             return "side by side";
 | ||
|                           else //args == true
 | ||
|                             return "inline";
 | ||
|                         }
 | ||
|                       }                      
 | ||
|                     }
 | ||
|                   ],
 | ||
|                   dataProvider: function(args) {	
 | ||
|                     args.response.success({data: args.context.netscalerProviders[0]}); 
 | ||
|                   }
 | ||
|                 },
 | ||
|               }
 | ||
|             }            
 | ||
|           },
 | ||
| 
 | ||
|           // F5 list view
 | ||
|           f5: {
 | ||
|             id: 'f5Providers',
 | ||
|             label: 'F5',
 | ||
|             fields: {             
 | ||
|               ipaddress: { label: 'IP Address' },
 | ||
|               lbdevicestate: { label: 'Status' }
 | ||
|             },   
 | ||
|             providerActionFilter: function(args) {                        
 | ||
|               var allowedActions = [];
 | ||
|               var jsonObj = nspMap["f5"];              
 | ||
|               if(jsonObj.state == "Enabled") {
 | ||
|                 allowedActions.push("disable");                
 | ||
|               }
 | ||
|               else if(jsonObj.state == "Disabled") {
 | ||
|                 allowedActions.push("enable");                
 | ||
|               }   
 | ||
|               allowedActions.push("shutdown");                   
 | ||
|               return allowedActions;
 | ||
|             },
 | ||
|             providerActions: {              
 | ||
|               enable: {
 | ||
|                 label: 'Enable',
 | ||
|                 action: function(args) {                  
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateNetworkServiceProvider&id=" + nspMap["f5"].id + "&state=Enabled"), 
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {                      
 | ||
|                       var jid = json.updatenetworkserviceproviderresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                           {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {                              
 | ||
|                               var item = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
 | ||
|                               nspMap["f5"] = item;
 | ||
|                               return item; 
 | ||
|                             }
 | ||
|                           }
 | ||
|                         }
 | ||
|                       );  
 | ||
|                     }
 | ||
|                   }); 
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function() { return 'Enabled F5 provider'; }
 | ||
|                 },
 | ||
|                 notification: { poll: pollAsyncJobResult }
 | ||
|               },
 | ||
|               disable: {
 | ||
|                 label: 'Disable',
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateNetworkServiceProvider&id=" + nspMap["f5"].id + "&state=Disabled"),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {                      
 | ||
|                       var jid = json.updatenetworkserviceproviderresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                           {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {                              
 | ||
|                               var item = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
 | ||
|                               nspMap["f5"] = item;
 | ||
|                               return item; 
 | ||
|                             }
 | ||
|                           }
 | ||
|                         }
 | ||
|                       );  
 | ||
|                     }
 | ||
|                   }); 
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function() { return 'Disabled F5 provider'; }
 | ||
|                 },
 | ||
|                 notification: { poll: pollAsyncJobResult }
 | ||
|               },             
 | ||
|               shutdown: {
 | ||
|                 label: 'Shutdown',
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("deleteNetworkServiceProvider&id=" + nspMap["f5"].id),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) { 
 | ||
|                       var jid = json.deletenetworkserviceproviderresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                           {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {  
 | ||
|                               nspMap["f5"] = null;
 | ||
|                               return {}; //nothing in this network service provider needs to be updated, in fact, this whole network service provider has being deleted
 | ||
|                             }
 | ||
|                           }
 | ||
|                         }
 | ||
|                       );  
 | ||
|                     }
 | ||
|                   }); 
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function() { return 'Shutdown F5 provider'; }
 | ||
|                 },
 | ||
|                 notification: { poll: pollAsyncJobResult }
 | ||
|               }    
 | ||
|             },       
 | ||
|             actions: {
 | ||
|               add: {
 | ||
|                 label: 'Add new F5',
 | ||
|                 createForm: {
 | ||
|                   title: 'Add F5',                  
 | ||
|                   fields: {
 | ||
|                     ip: {
 | ||
|                       label: 'IP address'
 | ||
|                     },
 | ||
|                     username: {
 | ||
|                       label: 'Username'
 | ||
|                     },
 | ||
|                     password: {
 | ||
|                       label: 'Password',
 | ||
|                       isPassword: true
 | ||
|                     },
 | ||
|                     networkdevicetype: {
 | ||
|                       label: 'Type',
 | ||
|                       select: function(args) {
 | ||
|                         var items = [];                        
 | ||
|                         items.push({id: "F5BigIpLoadBalancer", description: "F5 Big Ip Load Balancer"});                        
 | ||
|                         args.response.success({data: items});
 | ||
|                       }
 | ||
|                     },
 | ||
|                     publicinterface: {
 | ||
|                       label: 'Public interface'
 | ||
|                     },
 | ||
|                     privateinterface: {
 | ||
|                       label: 'Private interface'
 | ||
|                     },
 | ||
|                     numretries: {
 | ||
|                       label: 'Number of retries',
 | ||
|                       defaultValue: '2'
 | ||
|                     },
 | ||
|                     inline: {
 | ||
|                       label: 'Mode',
 | ||
|                       select: function(args) {
 | ||
|                         var items = [];
 | ||
|                         items.push({id: "false", description: "side by side"});  
 | ||
|                         items.push({id: "true", description: "inline"});  
 | ||
|                         args.response.success({data: items});
 | ||
|                       }                      
 | ||
|                     },
 | ||
|                     capacity: {
 | ||
|                       label: 'Capacity',                      
 | ||
|                       validation: { required: false, number: true }                      
 | ||
|                     },
 | ||
|                     dedicated: {
 | ||
|                       label: 'Dedicated',
 | ||
|                       isBoolean: true,
 | ||
|                       isChecked: false
 | ||
|                     }                    
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {   
 | ||
|                   if(nspMap["f5"]== null) { 
 | ||
|                     $.ajax({
 | ||
|                       url: createURL("addNetworkServiceProvider&name=F5BigIp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
 | ||
|                       dataType: "json",
 | ||
|                       async: true, 
 | ||
|                       success: function(json) {                             
 | ||
|                         var jobId = json.addnetworkserviceproviderresponse.jobid;				        
 | ||
|                         var timerKey = "addNetworkServiceProviderJob_"+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) {
 | ||
|                                   addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addF5LoadBalancer", "addf5bigiploadbalancerresponse");                              
 | ||
|                                 } 
 | ||
|                                 else if (result.jobstatus == 2) {
 | ||
|                                   alert("addNetworkServiceProvider&name=F5BigIp failed. Error: " + fromdb(result.jobresult.errortext));					        							        								   				    
 | ||
|                                 }
 | ||
|                               }
 | ||
|                             },
 | ||
|                             error: function(XMLHttpResponse) {
 | ||
|                               var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                               alert("addNetworkServiceProvider&name=F5BigIpfailed. Error: " + errorMsg); 
 | ||
|                             }
 | ||
|                           });
 | ||
|                         });
 | ||
|                       }
 | ||
|                     });                    
 | ||
|                   }
 | ||
|                   else { 
 | ||
|                     addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addF5LoadBalancer", "addf5bigiploadbalancerresponse");                
 | ||
|                   }                       
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Added new F5';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult 
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
|             dataProvider: function(args) {              
 | ||
|               $.ajax({
 | ||
|                 url: createURL("listF5LoadBalancers&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
 | ||
|                 dataType: "json",
 | ||
|                 async: false,
 | ||
|                 success: function(json) {    
 | ||
|                   var items = json.listf5loadbalancerresponse.f5loadbalancer;  
 | ||
|                   args.response.success({data: items});
 | ||
|                 }
 | ||
|               });              
 | ||
|             },            
 | ||
|             detailView: {
 | ||
|               name: 'F5 details',              
 | ||
|               actions: {                
 | ||
|                 'delete': {
 | ||
|                   label: 'Delete F5',
 | ||
|                   messages: {
 | ||
|                     confirm: function(args) {
 | ||
|                       return 'Are you sure you want to delete this F5?';
 | ||
|                     },
 | ||
|                     success: function(args) {
 | ||
|                       return 'F5 is being deleted.';
 | ||
|                     },
 | ||
|                     notification: function(args) {
 | ||
|                       return 'Deleting F5';
 | ||
|                     },
 | ||
|                     complete: function(args) {
 | ||
|                       return 'F5 has been deleted.';
 | ||
|                     }
 | ||
|                   },
 | ||
|                   action: function(args) {   
 | ||
|                     $.ajax({
 | ||
|                       url: createURL("deleteF5LoadBalancer&lbdeviceid=" + args.context.f5Providers[0].lbdeviceid),
 | ||
|                       dataType: "json",
 | ||
|                       async: true,
 | ||
|                       success: function(json) {     
 | ||
|                         var jid = json.deletef5loadbalancerresponse.jobid;
 | ||
|                         args.response.success(
 | ||
|                           {_custom:
 | ||
|                            {jobId: jid}
 | ||
|                           }
 | ||
|                         );
 | ||
|                       }
 | ||
|                     });
 | ||
|                   },
 | ||
|                   notification: {
 | ||
|                     poll: pollAsyncJobResult
 | ||
|                   }
 | ||
|                 }               
 | ||
|               },             
 | ||
|               tabs: {
 | ||
|                 details: {
 | ||
|                   title: 'Details',
 | ||
|                   fields: [
 | ||
|                     {
 | ||
|                       lbdeviceid: { label: 'ID' },
 | ||
|                       ipaddress: { label: 'IP Address' },
 | ||
|                       lbdevicestate: { label: 'Status' },
 | ||
|                       lbdevicename: { label: 'Type' },
 | ||
|                       lbdevicecapacity: { label: 'Capacity' },
 | ||
|                       lbdevicededicated: { 
 | ||
|                         label: 'Dedicated',
 | ||
|                         converter: cloudStack.converters.toBooleanText                        
 | ||
|                       },
 | ||
|                       inline: { 
 | ||
|                         label: 'Mode',
 | ||
|                         converter: function(args) {
 | ||
|                           if(args == false)
 | ||
|                             return "side by side";
 | ||
|                           else //args == true
 | ||
|                             return "inline";
 | ||
|                         }
 | ||
|                       }                      
 | ||
|                     }
 | ||
|                   ],
 | ||
|                   dataProvider: function(args) {	                    
 | ||
|                     args.response.success({data: args.context.f5Providers[0]}); 
 | ||
|                   }
 | ||
|                 },
 | ||
|               }
 | ||
|             }            
 | ||
|           },
 | ||
| 
 | ||
|           // SRX list view
 | ||
|           srx: {
 | ||
|             id: 'srxProviders',
 | ||
|             label: 'SRX',
 | ||
|             fields: {             
 | ||
|               ipaddress: { label: 'IP Address' },
 | ||
|               fwdevicestate: { label: 'Status' }
 | ||
|             },  
 | ||
|             providerActionFilter: function(args) {                        
 | ||
|               var allowedActions = [];
 | ||
|               var jsonObj = nspMap["srx"];              
 | ||
|               if(jsonObj.state == "Enabled") {
 | ||
|                 allowedActions.push("disable");                
 | ||
|               }
 | ||
|               else if(jsonObj.state == "Disabled") {
 | ||
|                 allowedActions.push("enable");                
 | ||
|               }       
 | ||
|               allowedActions.push("shutdown");               
 | ||
|               return allowedActions;
 | ||
|             },
 | ||
|             providerActions: {              
 | ||
|               enable: {
 | ||
|                 label: 'Enable',
 | ||
|                 action: function(args) {                  
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateNetworkServiceProvider&id=" + nspMap["srx"].id + "&state=Enabled"), 
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {                      
 | ||
|                       var jid = json.updatenetworkserviceproviderresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                           {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {                              
 | ||
|                               var item = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
 | ||
|                               nspMap["srx"] = item;
 | ||
|                               return item; 
 | ||
|                             }
 | ||
|                           }
 | ||
|                         }
 | ||
|                       );  
 | ||
|                     }
 | ||
|                   }); 
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function() { return 'Enabled SRX provider'; }
 | ||
|                 },
 | ||
|                 notification: { poll: pollAsyncJobResult }
 | ||
|               },
 | ||
|               disable: {
 | ||
|                 label: 'Disable',
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateNetworkServiceProvider&id=" + nspMap["srx"].id + "&state=Disabled"),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {                      
 | ||
|                       var jid = json.updatenetworkserviceproviderresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                           {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {                              
 | ||
|                               var item = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
 | ||
|                               nspMap["srx"] = item;
 | ||
|                               return item; 
 | ||
|                             }
 | ||
|                           }
 | ||
|                         }
 | ||
|                       );  
 | ||
|                     }
 | ||
|                   }); 
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function() { return 'Disabled SRX provider'; }
 | ||
|                 },
 | ||
|                 notification: { poll: pollAsyncJobResult }
 | ||
|               },              
 | ||
|               shutdown: {
 | ||
|                 label: 'Shutdown',
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("deleteNetworkServiceProvider&id=" + nspMap["srx"].id),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) { 
 | ||
|                       var jid = json.deletenetworkserviceproviderresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                           {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {  
 | ||
|                               nspMap["srx"] = null;
 | ||
|                               return {}; //nothing in this network service provider needs to be updated, in fact, this whole network service provider has being deleted
 | ||
|                             }
 | ||
|                           }
 | ||
|                         }
 | ||
|                       );  
 | ||
|                     }
 | ||
|                   }); 
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function() { return 'Shutdown SRX provider'; }
 | ||
|                 },
 | ||
|                 notification: { poll: pollAsyncJobResult }
 | ||
|               }   
 | ||
|             },   
 | ||
|             actions: {
 | ||
|               add: {
 | ||
|                 label: 'Add new SRX',
 | ||
|                 createForm: {
 | ||
|                   title: 'Add new SRX',   
 | ||
|                   fields: {
 | ||
|                     ip: {
 | ||
|                       label: 'IP address'
 | ||
|                     },
 | ||
|                     username: {
 | ||
|                       label: 'Username'
 | ||
|                     },
 | ||
|                     password: {
 | ||
|                       label: 'Password',
 | ||
|                       isPassword: true
 | ||
|                     },
 | ||
|                     networkdevicetype: {
 | ||
|                       label: 'Type',
 | ||
|                       select: function(args) {
 | ||
|                         var items = [];                        
 | ||
|                         items.push({id: "JuniperSRXFirewall", description: "Juniper SRX Firewall"});                        
 | ||
|                         args.response.success({data: items});
 | ||
|                       }
 | ||
|                     },          
 | ||
|                     publicinterface: {
 | ||
|                       label: 'Public interface'
 | ||
|                     },
 | ||
|                     privateinterface: {
 | ||
|                       label: 'Private interface'
 | ||
|                     },
 | ||
|                     usageinterface: {
 | ||
|                       label: 'Usage interface'
 | ||
|                     },
 | ||
|                     numretries: {
 | ||
|                       label: 'Number of retries',
 | ||
|                       defaultValue: '2'
 | ||
|                     },
 | ||
|                     timeout: {
 | ||
|                       label: 'Timeout',
 | ||
|                       defaultValue: '300'
 | ||
|                     },
 | ||
|                     inline: {
 | ||
|                       label: 'Mode',
 | ||
|                       select: function(args) {
 | ||
|                         var items = [];
 | ||
|                         items.push({id: "false", description: "side by side"});  
 | ||
|                         items.push({id: "true", description: "inline"});  
 | ||
|                         args.response.success({data: items});
 | ||
|                       }                      
 | ||
|                     },                    
 | ||
|                     publicnetwork: {
 | ||
|                       label: 'Public network',
 | ||
|                       defaultValue: 'untrusted'
 | ||
|                     },
 | ||
|                     privatenetwork: {
 | ||
|                       label: 'Private network',
 | ||
|                       defaultValue: 'trusted'
 | ||
|                     },                    
 | ||
|                     capacity: {
 | ||
|                       label: 'Capacity',                      
 | ||
|                       validation: { required: false, number: true }                      
 | ||
|                     },
 | ||
|                     dedicated: {
 | ||
|                       label: 'Dedicated',
 | ||
|                       isBoolean: true,
 | ||
|                       isChecked: false
 | ||
|                     }   
 | ||
|                   }                  
 | ||
|                 },
 | ||
|                 action: function(args) { 
 | ||
|                   if(nspMap["srx"]== null) { 
 | ||
|                     $.ajax({
 | ||
|                       url: createURL("addNetworkServiceProvider&name=JuniperSRX&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
 | ||
|                       dataType: "json",
 | ||
|                       async: true, 
 | ||
|                       success: function(json) {                             
 | ||
|                         var jobId = json.addnetworkserviceproviderresponse.jobid;				        
 | ||
|                         var timerKey = "addNetworkServiceProviderJob_"+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("addNetworkServiceProvider&name=JuniperSRX succeeded.");   
 | ||
|                                   addExternalFirewall(args, selectedPhysicalNetworkObj, "addSrxFirewall", "addsrxfirewallresponse");                                                                                            
 | ||
|                                 } 
 | ||
|                                 else if (result.jobstatus == 2) {
 | ||
|                                   alert("addNetworkServiceProvider&name=JuniperSRX failed. Error: " + fromdb(result.jobresult.errortext));					        							        								   				    
 | ||
|                                 }
 | ||
|                               }
 | ||
|                             },
 | ||
|                             error: function(XMLHttpResponse) {
 | ||
|                               var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                               alert("addNetworkServiceProvider&name=JuniperSRX failed. Error: " + errorMsg); 
 | ||
|                             }
 | ||
|                           });
 | ||
|                         });
 | ||
|                       }
 | ||
|                     });                    
 | ||
|                   }
 | ||
|                   else {  
 | ||
|                     addExternalFirewall(args, selectedPhysicalNetworkObj, "addSrxFirewall", "addsrxfirewallresponse"); 
 | ||
|                   }                       
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Added new SRX';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
|             dataProvider: function(args) {
 | ||
|               $.ajax({
 | ||
|                 url: createURL("listSrxFirewalls&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
 | ||
|                 dataType: "json",
 | ||
|                 async: false,
 | ||
|                 success: function(json) {  
 | ||
|                   var items = json.listsrxfirewallresponse.srxfirewall;                       
 | ||
|                   args.response.success({data: items});
 | ||
|                 }
 | ||
|               });
 | ||
|             },           
 | ||
|             detailView: {
 | ||
|               name: 'SRX details',             
 | ||
|               actions: {                
 | ||
|                 'delete': {
 | ||
|                   label: 'Delete SRX',
 | ||
|                   messages: {
 | ||
|                     confirm: function(args) {
 | ||
|                       return 'Are you sure you want to delete this SRX?';
 | ||
|                     },
 | ||
|                     success: function(args) {
 | ||
|                       return 'SRX is being deleted.';
 | ||
|                     },
 | ||
|                     notification: function(args) {
 | ||
|                       return 'Deleting SRX';
 | ||
|                     },
 | ||
|                     complete: function(args) {
 | ||
|                       return 'SRX has been deleted.';
 | ||
|                     }
 | ||
|                   },
 | ||
|                   action: function(args) {                       
 | ||
|                     $.ajax({
 | ||
|                       url: createURL("deleteSrcFirewall&fwdeviceid=" + args.context.srxProviders[0].fwdeviceid),
 | ||
|                       dataType: "json",
 | ||
|                       async: true,
 | ||
|                       success: function(json) { 
 | ||
|                         var jid = json.deletesrxfirewallresponse.jobid;
 | ||
|                         args.response.success(
 | ||
|                           {_custom:
 | ||
|                            {jobId: jid}
 | ||
|                           }
 | ||
|                         );
 | ||
|                       }
 | ||
|                     });
 | ||
|                   },
 | ||
|                   notification: {
 | ||
|                     poll: pollAsyncJobResult
 | ||
|                   }
 | ||
|                 }               
 | ||
|               },  
 | ||
|               tabs: {
 | ||
|                 details: {
 | ||
|                   title: 'Details',
 | ||
|                   fields: [
 | ||
|                     {
 | ||
|                       fwdeviceid: { label: 'ID' },
 | ||
|                       ipaddress: { label: 'IP Address' },
 | ||
|                       fwdevicestate: { label: 'Status' },
 | ||
|                       fwdevicename: { label: 'Type' },
 | ||
|                       fwdevicecapacity: { label: 'Capacity' },
 | ||
|                       timeout: { label: 'Timeout' }                              
 | ||
|                     }
 | ||
|                   ],
 | ||
|                   dataProvider: function(args) {	                    
 | ||
|                     args.response.success({data: args.context.srxProviders[0]}); 
 | ||
|                   }
 | ||
|                 },
 | ||
|               }
 | ||
|             }            
 | ||
|           },
 | ||
| 
 | ||
|           // Security groups provider
 | ||
|           securityGroups: {
 | ||
|             id: 'securityGroup-providers',
 | ||
|             label: 'Security Groups',   
 | ||
|             providerActionFilter: function(args) { 
 | ||
|               var allowedActions = [];
 | ||
|               var jsonObj = nspMap["securityGroups"];              
 | ||
|               if(jsonObj.state == "Enabled") 
 | ||
|                 allowedActions.push("disable");               
 | ||
|               else if(jsonObj.state == "Disabled") 
 | ||
|                 allowedActions.push("enable");                            
 | ||
|               return allowedActions;
 | ||
|             },
 | ||
|             providerActions: {              
 | ||
|               enable: {
 | ||
|                 label: 'Enable',
 | ||
|                 action: function(args) {                  
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateNetworkServiceProvider&id=" + nspMap["securityGroups"].id + "&state=Enabled"),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {                      
 | ||
|                       var jid = json.updatenetworkserviceproviderresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                           {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {                              
 | ||
|                               var item = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
 | ||
|                               nspMap["securityGroups"] = item;
 | ||
|                               return item; 
 | ||
|                             }
 | ||
|                           }
 | ||
|                         }
 | ||
|                       );  
 | ||
|                     }
 | ||
|                   }); 
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function() { return 'Enabled Netscaler provider'; }
 | ||
|                 },
 | ||
|                 notification: { poll: pollAsyncJobResult }
 | ||
|               },
 | ||
|               disable: {
 | ||
|                 label: 'Disable',
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateNetworkServiceProvider&id=" + nspMap["securityGroups"].id + "&state=Disabled"),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {                      
 | ||
|                       var jid = json.updatenetworkserviceproviderresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                           {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {                              
 | ||
|                               var item = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
 | ||
|                               nspMap["securityGroups"] = item;
 | ||
|                               return item; 
 | ||
|                             }
 | ||
|                           }
 | ||
|                         }
 | ||
|                       );  
 | ||
|                     }
 | ||
|                   }); 
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   notification: function() { return 'Disabled Netscaler provider'; }
 | ||
|                 },
 | ||
|                 notification: { poll: pollAsyncJobResult }
 | ||
|               }              
 | ||
|             },   
 | ||
|             
 | ||
|             fields: {
 | ||
|               id: { label: 'ID' },
 | ||
|               name: { label: 'Name' }//,              
 | ||
|               //state: { label: 'Status' } //comment it for now, since dataProvider below doesn't get called by widget code after action is done
 | ||
|             },
 | ||
|             dataProvider: function(args) {                            
 | ||
|               args.response.success({data: nspMap["securityGroups"]});            
 | ||
|             }
 | ||
|           }
 | ||
|         }
 | ||
|       }
 | ||
|     },
 | ||
|     show: cloudStack.uiCustom.physicalResources({
 | ||
|       sectionSelect: {
 | ||
|         label: 'Select view'
 | ||
|       },
 | ||
|       sections: {
 | ||
|         physicalResources: {
 | ||
|           type: 'select',
 | ||
|           title: 'Physical Resources',
 | ||
|           listView: {
 | ||
|             id: 'zones',
 | ||
|             label: 'Physical Resources',
 | ||
|             fields: {
 | ||
|               name: { label: 'Zone' },
 | ||
|               networktype: { label: 'Network Type' },
 | ||
|               allocationstate: { label: 'Allocation State' },
 | ||
|               domainid: {
 | ||
|                 label: 'Public',
 | ||
|                 converter: function(args) {                 
 | ||
|                   if(args == null)
 | ||
|                     return "Yes";
 | ||
|                   else
 | ||
|                     return "No";
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
|             actions: {
 | ||
|               add: {
 | ||
|                 label: 'Add zone',
 | ||
|                 action: {
 | ||
|                   custom: cloudStack.zoneWizard({
 | ||
|                     steps: [
 | ||
|                       // Step 1: Setup
 | ||
|                       null,
 | ||
| 
 | ||
|                       // Step 2: Setup Zone
 | ||
|                       function(args) {
 | ||
|                         $.ajax({
 | ||
|                           url: createURL("listDomains"),
 | ||
|                           dataType: "json",
 | ||
|                           async: false,
 | ||
|                           success: function(json) {
 | ||
|                             domainObjs = json.listdomainsresponse.domain;
 | ||
|                           }
 | ||
|                         });
 | ||
|                         args.response.success({domains: domainObjs});
 | ||
|                       },
 | ||
| 
 | ||
|                       // Step 3: Setup Pod
 | ||
|                       null,
 | ||
| 
 | ||
|                       // Step 4: Setup IP Range
 | ||
|                       function(args) {
 | ||
|                         args.response.success({domains: domainObjs});
 | ||
|                       }
 | ||
|                     ],
 | ||
| 
 | ||
|                     action: function(args) {                 
 | ||
|                       var array1 = [];
 | ||
| 
 | ||
|                       //var networktype = $thisWizard.find("#step1").find("input:radio[name=basic_advanced]:checked").val();  //"Basic", "Advanced"
 | ||
|                       var networktype = args.data["network-model"];
 | ||
|                       array1.push("&networktype=" + todb(networktype));
 | ||
| 
 | ||
|                       array1.push("&name=" + todb(args.data.name));
 | ||
| 
 | ||
|                       array1.push("&dns1=" + todb(args.data.dns1));
 | ||
| 
 | ||
|                       var dns2 = args.data.dns2;
 | ||
|                       if (dns2 != null && dns2.length > 0)
 | ||
|                         array1.push("&dns2=" + todb(dns2));
 | ||
| 
 | ||
|                       array1.push("&internaldns1="+todb(args.data.internaldns1));
 | ||
| 
 | ||
|                       var internaldns2 = args.data.internaldns2;
 | ||
|                       if (internaldns2 != null && internaldns2.length > 0)
 | ||
|                         array1.push("&internaldns2=" + todb(internaldns2));
 | ||
| 
 | ||
|                       if(networktype == "Advanced") {
 | ||
|                         //if(args.data["isolation-mode"] == "security-groups") {
 | ||
|                         //  array1.push("&securitygroupenabled=true");
 | ||
|                         //}
 | ||
|                         //else { //args.data["isolation-mode"] == "vlan"
 | ||
|                           array1.push("&securitygroupenabled=false");
 | ||
| 
 | ||
|                           var guestcidraddress = args.data["guest-cidr"];
 | ||
|                           if(guestcidraddress != null && guestcidraddress.length > 0) {
 | ||
|                             array1.push("&guestcidraddress="+todb(guestcidraddress));
 | ||
|                           }
 | ||
|                         //}
 | ||
|                       }
 | ||
| 
 | ||
|                       if(args.data["public"] == null) //public checkbox is unchecked
 | ||
|                         array1.push("&domainid=" + args.data["zone-domain"]);
 | ||
| 
 | ||
|                       var zoneId;
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("createZone" + array1.join("")),
 | ||
|                         dataType: "json",
 | ||
|                         async: false,
 | ||
|                         success: function(json) {												  
 | ||
|                           var zoneObj = json.createzoneresponse.zone; 
 | ||
|                           args.response.success({
 | ||
|                             data: zoneObj,
 | ||
|                             _custom: { zone: zoneObj }
 | ||
|                           }); //spinning wheel appears from this moment
 | ||
|                           zoneId = zoneObj.id;
 | ||
|                           
 | ||
|                           //NaaS (begin)                          
 | ||
|                           var physicalNetworkId;
 | ||
|                           $.ajax({
 | ||
|                             url: createURL("listPhysicalNetworks&zoneId=" + zoneId),
 | ||
|                             dataType: "json",
 | ||
|                             async: false,
 | ||
|                             success: function(json) {
 | ||
|                               var items = json.listphysicalnetworksresponse.physicalnetwork;
 | ||
|                               if(items != null && items.length > 0)
 | ||
|                                 physicalNetworkId = items[0].id
 | ||
|                             }
 | ||
|                           });                          													
 | ||
| 													if(physicalNetworkId == null) {     
 | ||
| 													  alert("error: listPhysicalNetworks API doesn't return Physical Network ID");
 | ||
| 													  return;
 | ||
| 													}
 | ||
| 													                             
 | ||
| 													$.ajax({
 | ||
| 														url: createURL("updatePhysicalNetwork&state=Enabled&id=" + physicalNetworkId),                    
 | ||
| 														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 networkServiceProviderId;																				
 | ||
| 																				$.ajax({
 | ||
| 																					url: createURL("listNetworkServiceProviders&name=VirtualRouter&physicalNetworkId=" + physicalNetworkId),
 | ||
| 																					dataType: "json",
 | ||
| 																					async: false,
 | ||
| 																					success: function(json) {
 | ||
| 																						var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
 | ||
| 																						if(items != null && items.length > 0) {
 | ||
| 																							networkServiceProviderId = items[0].id;		
 | ||
|                                             }
 | ||
| 																					}
 | ||
| 																				});
 | ||
| 																				if(networkServiceProviderId == null) {     
 | ||
| 																					alert("error: listNetworkServiceProviders API doesn't return Network Service Provider ID");
 | ||
| 																					return;
 | ||
| 																				}																				
 | ||
| 																				
 | ||
| 																				var virtualRouterElementId;
 | ||
| 																				$.ajax({
 | ||
| 																					url: createURL("listVirtualRouterElements&nspid=" + networkServiceProviderId),
 | ||
| 																					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) {																						    							   
 | ||
| 																											//alert("configureVirtualRouterElement succeeded.");  
 | ||
| 																																																
 | ||
| 																											$.ajax({
 | ||
| 																												url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + networkServiceProviderId),
 | ||
| 																												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) {																						    							   
 | ||
| 																																		//alert("updateNetworkServiceProvider succeeded.");  
 | ||
|                                                                                                                                        
 | ||
|                                                                     /*
 | ||
|                                                                     $.ajax({
 | ||
|                                                                       url: createURL("listCapabilities"),
 | ||
|                                                                       dataType: "json",
 | ||
|                                                                       async: false,
 | ||
|                                                                       success: function(json) {                                                                        
 | ||
|                                                                         // g_supportELB: "guest"   <20> ips are allocated on guest network (so use 'forvirtualnetwork' = false)
 | ||
|                                                                         // g_supportELB: "public"  - ips are allocated on public network (so use 'forvirtualnetwork' = true)
 | ||
|                                                                         // g_supportELB: "false"   <20> no ELB support                              
 | ||
|                                                                         g_supportELB = json.listcapabilitiesresponse.capability.supportELB.toString(); //convert boolean to string if it's boolean
 | ||
|                                                                         $.cookie('supportELB', g_supportELB, { expires: 1});
 | ||
| 
 | ||
|                                                                         g_firewallRuleUiEnabled = json.listcapabilitiesresponse.capability.firewallRuleUiEnabled.toString(); //convert boolean to string if it's boolean
 | ||
|                                                                         $.cookie('firewallRuleUiEnabled', g_firewallRuleUiEnabled, { expires: 1});
 | ||
| 
 | ||
|                                                                         if (json.listcapabilitiesresponse.capability.userpublictemplateenabled != null) {
 | ||
|                                                                           g_userPublicTemplateEnabled = json.listcapabilitiesresponse.capability.userpublictemplateenabled.toString(); //convert boolean to string if it's boolean
 | ||
|                                                                           $.cookie('userpublictemplateenabled', g_userPublicTemplateEnabled, { expires: 1});
 | ||
|                                                                         }
 | ||
| 
 | ||
|                                                                         if (json.listcapabilitiesresponse.capability.securitygroupsenabled != null) {
 | ||
|                                                                           g_directAttachSecurityGroupsEnabled = json.listcapabilitiesresponse.capability.securitygroupsenabled.toString(); //convert boolean to string if it's boolean
 | ||
|                                                                           $.cookie('directattachsecuritygroupsenabled', g_directAttachSecurityGroupsEnabled, { expires: 1});
 | ||
|                                                                         }
 | ||
|                                                                       }
 | ||
|                                                                     });  
 | ||
|                                                                     */   
 | ||
|                                                                     
 | ||
| 																																	} 
 | ||
| 																																	else if (result.jobstatus == 2) {
 | ||
| 																																		alert("updateNetworkServiceProvider failed. 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); 
 | ||
| 																	}
 | ||
| 																});
 | ||
| 															});
 | ||
| 														}
 | ||
| 													});													
 | ||
|                           //NaaS (end) 
 | ||
|                         },
 | ||
|                         error: function(XMLHttpResponse) {
 | ||
|                           var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                           args.response.error(errorMsg);
 | ||
|                         }
 | ||
|                       });                      
 | ||
|                     }
 | ||
|                   })
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to add a zone?';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Created new zone';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) {
 | ||
|                     args.complete({
 | ||
|                       actionFilter: zoneActionfilter,
 | ||
|                       data: args._custom.zone
 | ||
|                     });
 | ||
|                   }
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               enable: {
 | ||
|                 label: 'Enable zone',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to enable this zone?';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'This zone is being enabled.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Enabling zone';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Zone has been enabled.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateZone&id=" + args.context.physicalResources[0].id + "&allocationstate=Enabled"),  //embedded objects in listView is called physicalResources while embedded objects in detailView is called zones
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var item = json.updatezoneresponse.zone;
 | ||
|                       args.response.success({
 | ||
|                         actionFilter: zoneActionfilter,
 | ||
|                         data:item
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) {
 | ||
|                     args.complete();
 | ||
|                   }
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               disable: {
 | ||
|                 label: 'Disable zone',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to disable this zone?';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'This zone is being disabled.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Disabling zone';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Zone has been disabled.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateZone&id=" + args.context.physicalResources[0].id + "&allocationstate=Disabled"),  //embedded objects in listView is called physicalResources while embedded objects in detailView is called zones
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var item = json.updatezoneresponse.zone;
 | ||
|                       args.response.success({
 | ||
|                         actionFilter: zoneActionfilter,
 | ||
|                         data:item
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) {
 | ||
|                     args.complete();
 | ||
|                   }
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               'delete': {
 | ||
|                 label: 'Delete' ,
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Please confirm that you want to delete this zone.';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'Zone is being deleted.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Deleting zone';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Zone has been deleted.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("deleteZone&id=" + args.context.physicalResources[0].id),  //embedded objects in listView is called physicalResources while embedded objects in detailView is called zones
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       args.response.success({data:{}});
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) { args.complete(); }
 | ||
|                 }
 | ||
|               }
 | ||
| 
 | ||
|             },
 | ||
| 
 | ||
|             dataProvider: function(args) {
 | ||
|               $.ajax({
 | ||
|                 url: createURL("listZones&page=" + args.page + "&pagesize=" + pageSize),
 | ||
|                 dataType: "json",
 | ||
|                 async: true,
 | ||
|                 success: function(json) {
 | ||
|                   zoneObjs = json.listzonesresponse.zone;
 | ||
|                   args.response.success({
 | ||
|                     actionFilter: zoneActionfilter,
 | ||
|                     data:zoneObjs
 | ||
|                   });
 | ||
|                 }
 | ||
|               });
 | ||
|             },
 | ||
|             detailView: {
 | ||
|               isMaximized: true,
 | ||
|               pageGenerator: cloudStack.zoneChart({
 | ||
|                 dataProvider: function(args) {
 | ||
|                   args.response.success({data:args.jsonObj});
 | ||
|                 },
 | ||
|                 detailView: {
 | ||
|                   name: 'Zone details',
 | ||
|                   viewAll: { path: '_zone.pods', label: 'Pods' },
 | ||
|                   actions: {
 | ||
|                     edit: {
 | ||
|                       label: 'Edit',
 | ||
|                       action: function(args) {
 | ||
|                         var array1 = [];
 | ||
|                         array1.push("&name="  +todb(args.data.name));
 | ||
|                         array1.push("&dns1=" + todb(args.data.dns1));
 | ||
|                         array1.push("&dns2=" + todb(args.data.dns2));  //dns2 can be empty ("") when passed to API
 | ||
|                         array1.push("&internaldns1=" + todb(args.data.internaldns1));
 | ||
|                         array1.push("&internaldns2=" + todb(args.data.internaldns2));  //internaldns2 can be empty ("") when passed to API
 | ||
| 
 | ||
|                         if(args.context.zones[0].networktype == "Advanced") {  //remove this after Brian fixes it to include $form in args
 | ||
|                           var vlan;
 | ||
|                           //if(args.$form.find('.form-item[rel=startVlan]').css("display") != "none") {  //comment out until Brian fixes it to include $form in args
 | ||
|                           var vlanStart = args.data.startVlan;
 | ||
|                           if(vlanStart != null && vlanStart.length > 0) {
 | ||
|                             var vlanEnd = args.data.endVlan;
 | ||
|                             if (vlanEnd != null && vlanEnd.length > 0)
 | ||
|                               vlan = vlanStart + "-" + vlanEnd;
 | ||
|                             else
 | ||
|                               vlan = vlanStart;
 | ||
|                             array1.push("&vlan=" + todb(vlan));
 | ||
|                           }
 | ||
|                           //}
 | ||
| 
 | ||
|                           //if(args.$form.find('.form-item[rel=guestcidraddress]').css("display") != "none") {  //comment out until Brian fixes it to include $form in args
 | ||
|                           array1.push("&guestcidraddress=" + todb(args.data.guestcidraddress));
 | ||
|                           //}
 | ||
|                         }  //remove this after Brian fixes it to include $form in args
 | ||
| 
 | ||
|                         $.ajax({
 | ||
|                           url: createURL("updateZone&id=" + args.context.zones[0].id + array1.join("")),
 | ||
|                           dataType: "json",
 | ||
|                           success: function(json) {
 | ||
|                             var item = json.updatezoneresponse.zone;
 | ||
|                             args.response.success({
 | ||
|                               actionFilter: zoneActionfilter,
 | ||
|                               data:item
 | ||
|                             });
 | ||
|                           }
 | ||
|                         });
 | ||
|                       }
 | ||
|                     },
 | ||
| 
 | ||
|                     enable: {
 | ||
|                       label: 'Enable zone',
 | ||
|                       messages: {
 | ||
|                         confirm: function(args) {
 | ||
|                           return 'Are you sure you want to enable this zone?';
 | ||
|                         },
 | ||
|                         success: function(args) {
 | ||
|                           return 'This zone is being enabled.';
 | ||
|                         },
 | ||
|                         notification: function(args) {
 | ||
|                           return 'Enabling zone';
 | ||
|                         },
 | ||
|                         complete: function(args) {
 | ||
|                           return 'Zone has been enabled.';
 | ||
|                         }
 | ||
|                       },
 | ||
|                       action: function(args) {
 | ||
|                         $.ajax({
 | ||
|                           url: createURL("updateZone&id=" + args.context.zones[0].id + "&allocationstate=Enabled"),
 | ||
|                           dataType: "json",
 | ||
|                           async: true,
 | ||
|                           success: function(json) {
 | ||
|                             var item = json.updatezoneresponse.zone;
 | ||
|                             args.response.success({
 | ||
|                               actionFilter: zoneActionfilter,
 | ||
|                               data:item
 | ||
|                             });
 | ||
|                           }
 | ||
|                         });
 | ||
|                       },
 | ||
|                       notification: {
 | ||
|                         poll: function(args) {
 | ||
|                           args.complete();
 | ||
|                         }
 | ||
|                       }
 | ||
|                     },
 | ||
| 
 | ||
|                     disable: {
 | ||
|                       label: 'Disable zone',
 | ||
|                       messages: {
 | ||
|                         confirm: function(args) {
 | ||
|                           return 'Are you sure you want to disable this zone?';
 | ||
|                         },
 | ||
|                         success: function(args) {
 | ||
|                           return 'This zone is being disabled.';
 | ||
|                         },
 | ||
|                         notification: function(args) {
 | ||
|                           return 'Disabling zone';
 | ||
|                         },
 | ||
|                         complete: function(args) {
 | ||
|                           return 'Zone has been disabled.';
 | ||
|                         }
 | ||
|                       },
 | ||
|                       action: function(args) {
 | ||
|                         $.ajax({
 | ||
|                           url: createURL("updateZone&id=" + args.context.zones[0].id + "&allocationstate=Disabled"),
 | ||
|                           dataType: "json",
 | ||
|                           async: true,
 | ||
|                           success: function(json) {
 | ||
|                             var item = json.updatezoneresponse.zone;
 | ||
|                             args.response.success({
 | ||
|                               actionFilter: zoneActionfilter,
 | ||
|                               data:item
 | ||
|                             });
 | ||
|                           }
 | ||
|                         });
 | ||
|                       },
 | ||
|                       notification: {
 | ||
|                         poll: function(args) {
 | ||
|                           args.complete();
 | ||
|                         }
 | ||
|                       }
 | ||
|                     },
 | ||
| 
 | ||
|                     'delete': {
 | ||
|                       label: 'Delete' ,
 | ||
|                       messages: {
 | ||
|                         confirm: function(args) {
 | ||
|                           return 'Please confirm that you want to delete this zone.';
 | ||
|                         },
 | ||
|                         success: function(args) {
 | ||
|                           return 'Zone is being deleted.';
 | ||
|                         },
 | ||
|                         notification: function(args) {
 | ||
|                           return 'Deleting zone';
 | ||
|                         },
 | ||
|                         complete: function(args) {
 | ||
|                           return 'Zone has been deleted.';
 | ||
|                         }
 | ||
|                       },
 | ||
|                       action: function(args) {
 | ||
|                         $.ajax({
 | ||
|                           url: createURL("deleteZone&id=" + args.context.zones[0].id),
 | ||
|                           dataType: "json",
 | ||
|                           async: true,
 | ||
|                           success: function(json) {
 | ||
|                             args.response.success({data:{}});
 | ||
|                           }
 | ||
|                         });
 | ||
|                       },
 | ||
|                       notification: {
 | ||
|                         poll: function(args) { args.complete(); }
 | ||
|                       }
 | ||
|                     }
 | ||
|                   },
 | ||
|                   tabs: {
 | ||
|                     details: {
 | ||
|                       title: 'Details',
 | ||
| 
 | ||
|                       preFilter: function(args) {
 | ||
|                         /*
 | ||
|                          var hiddenFields;
 | ||
|                          if(args.context.zones[0].networktype == "Basic")
 | ||
|                          hiddenFields = ["guestcidraddress", "startVlan", "endVlan"];
 | ||
|                          else if(args.context.zones[0].networktype == "Advanced")
 | ||
|                          hiddenFields = [];
 | ||
|                          return hiddenFields;
 | ||
|                          */
 | ||
|                         //comment out the above section until Brian fix it to include context in args
 | ||
|                         return [];
 | ||
|                       },
 | ||
| 
 | ||
|                       fields: [
 | ||
|                         {
 | ||
|                           name: { label: 'Zone', isEditable: true }
 | ||
|                         },
 | ||
|                         {
 | ||
|                           id: { label: 'ID' },
 | ||
|                           allocationstate: { label: 'Allocation State' },
 | ||
|                           dns1: { label: 'DNS 1', isEditable: true },
 | ||
|                           dns2: { label: 'DNS 2', isEditable: true },
 | ||
|                           internaldns1: { label: 'Internal DNS 1', isEditable: true },
 | ||
|                           internaldns2: { label: 'Internal DNS 2', isEditable: true },
 | ||
|                           networktype: { label: 'Network Type' },
 | ||
|                           securitygroupsenabled: {
 | ||
|                             label: 'Security Groups Enabled',
 | ||
|                             converter:cloudStack.converters.toBooleanText
 | ||
|                           },
 | ||
|                           domain: { label: 'Domain' },
 | ||
| 
 | ||
|                           //only advanced zones have VLAN and CIDR Address
 | ||
|                           guestcidraddress: { label: 'Guest CIDR Address', isEditable: true },
 | ||
|                           vlan: { label: 'Vlan' },
 | ||
|                           startVlan: { label: 'Start Vlan', isEditable: true },
 | ||
|                           endVlan: { label: 'End Vlan', isEditable: true }
 | ||
|                         }
 | ||
|                       ],
 | ||
| 
 | ||
|                       dataProvider: function(args) {
 | ||
|                         args.response.success({
 | ||
|                           actionFilter: zoneActionfilter,
 | ||
|                           data: args.context.zones[0]
 | ||
|                         });
 | ||
|                       }
 | ||
|                     }
 | ||
|                   }
 | ||
|                 }
 | ||
|               })
 | ||
|             }
 | ||
|           }
 | ||
|         },
 | ||
|         routers: {
 | ||
|           type: 'select',
 | ||
|           title: 'Virtual Appliances',
 | ||
|           id: 'routers',
 | ||
|           listView: {
 | ||
|             label: 'Virtual Appliances',
 | ||
|             fields: {
 | ||
|               name: { label: 'Name' },
 | ||
|               zonename: { label: 'Zone' },
 | ||
|               state: {
 | ||
|                 label: 'Status',
 | ||
|                 indicator: {
 | ||
|                   'Running': 'on',
 | ||
|                   'Stopped': 'off',
 | ||
|                   'Error': 'off'
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
|             actions: {
 | ||
|               start: {
 | ||
|                 label: 'Start router',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to start router?';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Starting router';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL('startRouter&id=' + args.context.routers[0].id),
 | ||
|                     dataType: 'json',
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jid = json.startrouterresponse.jobid;
 | ||
|                       args.response.success({
 | ||
|                         _custom: {
 | ||
|                           jobId: jid,
 | ||
|                           getUpdatedItem: function(json) {
 | ||
|                             return json.queryasyncjobresultresponse.jobresult.domainrouter;
 | ||
|                           },
 | ||
|                           getActionFilter: function() {
 | ||
|                             return routerActionfilter;
 | ||
|                           }
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               stop: {
 | ||
|                 label: 'Stop router',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to stop router?';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Stopping router';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL('stopRouter&id=' + args.context.routers[0].id),
 | ||
|                     dataType: 'json',
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jid = json.stoprouterresponse.jobid;
 | ||
|                       args.response.success({
 | ||
|                         _custom: {
 | ||
|                           jobId: jid,
 | ||
|                           getUpdatedItem: function(json) {
 | ||
|                             return json.queryasyncjobresultresponse.jobresult.domainrouter;
 | ||
|                           },
 | ||
|                           getActionFilter: function() {
 | ||
|                             return routerActionfilter;
 | ||
|                           }
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               restart: {
 | ||
|                 label: 'reboot router',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to reboot router?';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'rebooting router';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL('rebootRouter&id=' + args.context.routers[0].id),
 | ||
|                     dataType: 'json',
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jid = json.rebootrouterresponse.jobid;
 | ||
|                       args.response.success({
 | ||
|                         _custom: {
 | ||
|                           jobId: jid,
 | ||
|                           getUpdatedItem: function(json) {
 | ||
|                             return json.queryasyncjobresultresponse.jobresult.domainrouter;
 | ||
|                           },
 | ||
|                           getActionFilter: function() {
 | ||
|                             return routerActionfilter;
 | ||
|                           }
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 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: {
 | ||
|                     serviceOfferingId: {
 | ||
|                       label: 'Service offering',
 | ||
|                       select: function(args) {
 | ||
|                         $.ajax({
 | ||
|                           url: createURL("listServiceOfferings&issystem=true&systemvmtype=domainrouter"),
 | ||
|                           dataType: "json",
 | ||
|                           async: true,
 | ||
|                           success: function(json) {
 | ||
|                             var serviceofferings = json.listserviceofferingsresponse.serviceoffering;
 | ||
|                             var items = [];
 | ||
|                             $(serviceofferings).each(function() {
 | ||
|                               if(this.id != args.context.routers[0].serviceofferingid) {
 | ||
|                                 items.push({id: this.id, description: this.displaytext});
 | ||
|                               }
 | ||
|                             });
 | ||
|                             args.response.success({data: items});
 | ||
|                           }
 | ||
|                         });
 | ||
|                       }
 | ||
|                     }
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("changeServiceForRouter&id=" + args.context.routers[0].id + "&serviceofferingid=" + args.data.serviceOfferingId),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jsonObj = json.changeserviceforrouterresponse.domainrouter;
 | ||
|                       args.response.success({data: jsonObj});
 | ||
|                     },
 | ||
|                     error: function(XMLHttpResponse) {
 | ||
|                       var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                       args.response.error(errorMsg);
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) {
 | ||
|                     args.complete();
 | ||
|                   }
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               migrate: {
 | ||
|                 label: 'Migrate router',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to migrate router?';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'Router is being migrated.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Migrating router';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Router has been migrated.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 createForm: {
 | ||
|                   title: 'Migrate router',
 | ||
|                   desc: '',
 | ||
|                   fields: {
 | ||
|                     hostId: {
 | ||
|                       label: 'Host',
 | ||
|                       validation: { required: true },
 | ||
|                       select: function(args) {
 | ||
|                         $.ajax({
 | ||
|                           url: createURL("listHosts&VirtualMachineId=" + args.context.routers[0].id),
 | ||
|                           //url: createURL("listHosts"),	//for testing only, comment it out before checking in.
 | ||
|                           dataType: "json",
 | ||
|                           async: true,
 | ||
|                           success: function(json) {
 | ||
|                             var hostObjs = json.listhostsresponse.host;
 | ||
|                             var items = [];
 | ||
|                             $(hostObjs).each(function() {
 | ||
|                               items.push({id: this.id, description: (this.name + ": " +(this.hasEnoughCapacity? "Available" : "Full"))});
 | ||
|                             });
 | ||
|                             args.response.success({data: items});
 | ||
|                           }
 | ||
|                         });
 | ||
|                       },
 | ||
|                       error: function(XMLHttpResponse) {
 | ||
|                         var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                         args.response.error(errorMsg);
 | ||
|                       }
 | ||
|                     }
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   if(args.data.hostId == null) {
 | ||
|                     args.response.error("Host field is required");
 | ||
|                     return;
 | ||
|                   }
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.routers[0].id),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jid = json.migratesystemvmresponse.jobid;
 | ||
|                       args.response.success({
 | ||
|                         _custom: {
 | ||
|                           jobId: jid,
 | ||
|                           getUpdatedItem: function(json) {
 | ||
|                             //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
 | ||
|                             $.ajax({
 | ||
|                               url: createURL("listRouters&id=" + json.queryasyncjobresultresponse.jobresult.systemvminstance.id),
 | ||
|                               dataType: "json",
 | ||
|                               async: false,
 | ||
|                               success: function(json) {
 | ||
|                                 var items = json.listroutersresponse.router;
 | ||
|                                 if(items != null && items.length > 0) {
 | ||
|                                   return items[0];
 | ||
|                                 }
 | ||
|                               }
 | ||
|                             });
 | ||
|                           },
 | ||
|                           getActionFilter: function() {
 | ||
|                             return routerActionfilter;
 | ||
|                           }
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
|             dataProvider: function(args) {
 | ||
|               $.ajax({
 | ||
|                 url: createURL('listRouters&page=' + args.page + '&pagesize=' + pageSize),
 | ||
|                 dataType: 'json',
 | ||
|                 async: true,
 | ||
|                 success: function(json) {
 | ||
|                   var items = json.listroutersresponse.router;
 | ||
|                   args.response.success({
 | ||
|                     actionFilter: routerActionfilter,
 | ||
|                     data: items
 | ||
|                   });
 | ||
|                 }
 | ||
|               });
 | ||
|             },            
 | ||
|             detailView: {
 | ||
|               name: 'Virtual applicance details',             
 | ||
|               actions: {
 | ||
|                 start: {
 | ||
|                   label: 'Start router',
 | ||
|                   messages: {
 | ||
|                     confirm: function(args) {
 | ||
|                       return 'Are you sure you want to start router?';
 | ||
|                     },
 | ||
|                     notification: function(args) {
 | ||
|                       return 'Starting router';
 | ||
|                     }
 | ||
|                   },
 | ||
|                   action: function(args) {
 | ||
|                     $.ajax({
 | ||
|                       url: createURL('startRouter&id=' + args.context.routers[0].id),
 | ||
|                       dataType: 'json',
 | ||
|                       async: true,
 | ||
|                       success: function(json) {
 | ||
|                         var jid = json.startrouterresponse.jobid;
 | ||
|                         args.response.success({
 | ||
|                           _custom: {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {
 | ||
|                               return json.queryasyncjobresultresponse.jobresult.domainrouter;
 | ||
|                             },
 | ||
|                             getActionFilter: function() {
 | ||
|                               return routerActionfilter;
 | ||
|                             }
 | ||
|                           }
 | ||
|                         });
 | ||
|                       }
 | ||
|                     });
 | ||
|                   },
 | ||
|                   notification: {
 | ||
|                     poll: pollAsyncJobResult
 | ||
|                   }
 | ||
|                 },
 | ||
| 
 | ||
|                 stop: {
 | ||
|                   label: 'Stop router',
 | ||
|                   messages: {
 | ||
|                     confirm: function(args) {
 | ||
|                       return 'Are you sure you want to stop router?';
 | ||
|                     },
 | ||
|                     notification: function(args) {
 | ||
|                       return 'Stopping router';
 | ||
|                     }
 | ||
|                   },
 | ||
|                   action: function(args) {
 | ||
|                     $.ajax({
 | ||
|                       url: createURL('stopRouter&id=' + args.context.routers[0].id),
 | ||
|                       dataType: 'json',
 | ||
|                       async: true,
 | ||
|                       success: function(json) {
 | ||
|                         var jid = json.stoprouterresponse.jobid;
 | ||
|                         args.response.success({
 | ||
|                           _custom: {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {
 | ||
|                               return json.queryasyncjobresultresponse.jobresult.domainrouter;
 | ||
|                             },
 | ||
|                             getActionFilter: function() {
 | ||
|                               return routerActionfilter;
 | ||
|                             }
 | ||
|                           }
 | ||
|                         });
 | ||
|                       }
 | ||
|                     });
 | ||
|                   },
 | ||
|                   notification: {
 | ||
|                     poll: pollAsyncJobResult
 | ||
|                   }
 | ||
|                 },
 | ||
| 
 | ||
|                 restart: {
 | ||
|                   label: 'reboot router',
 | ||
|                   messages: {
 | ||
|                     confirm: function(args) {
 | ||
|                       return 'Are you sure you want to reboot router?';
 | ||
|                     },
 | ||
|                     notification: function(args) {
 | ||
|                       return 'rebooting router';
 | ||
|                     }
 | ||
|                   },
 | ||
|                   action: function(args) {
 | ||
|                     $.ajax({
 | ||
|                       url: createURL('rebootRouter&id=' + args.context.routers[0].id),
 | ||
|                       dataType: 'json',
 | ||
|                       async: true,
 | ||
|                       success: function(json) {
 | ||
|                         var jid = json.rebootrouterresponse.jobid;
 | ||
|                         args.response.success({
 | ||
|                           _custom: {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {
 | ||
|                               return json.queryasyncjobresultresponse.jobresult.domainrouter;
 | ||
|                             },
 | ||
|                             getActionFilter: function() {
 | ||
|                               return routerActionfilter;
 | ||
|                             }
 | ||
|                           }
 | ||
|                         });
 | ||
|                       }
 | ||
|                     });
 | ||
|                   },
 | ||
|                   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: {
 | ||
|                       serviceOfferingId: {
 | ||
|                         label: 'Service offering',
 | ||
|                         select: function(args) {
 | ||
|                           $.ajax({
 | ||
|                             url: createURL("listServiceOfferings&issystem=true&systemvmtype=domainrouter"),
 | ||
|                             dataType: "json",
 | ||
|                             async: true,
 | ||
|                             success: function(json) {
 | ||
|                               var serviceofferings = json.listserviceofferingsresponse.serviceoffering;
 | ||
|                               var items = [];
 | ||
|                               $(serviceofferings).each(function() {
 | ||
|                                 if(this.id != args.context.routers[0].serviceofferingid) {
 | ||
|                                   items.push({id: this.id, description: this.displaytext});
 | ||
|                                 }
 | ||
|                               });
 | ||
|                               args.response.success({data: items});
 | ||
|                             }
 | ||
|                           });
 | ||
|                         }
 | ||
|                       }
 | ||
|                     }
 | ||
|                   },
 | ||
|                   action: function(args) {
 | ||
|                     $.ajax({
 | ||
|                       url: createURL("changeServiceForRouter&id=" + args.context.routers[0].id + "&serviceofferingid=" + args.data.serviceOfferingId),
 | ||
|                       dataType: "json",
 | ||
|                       async: true,
 | ||
|                       success: function(json) {
 | ||
|                         var jsonObj = json.changeserviceforrouterresponse.domainrouter;
 | ||
|                         args.response.success({data: jsonObj});
 | ||
|                       },
 | ||
|                       error: function(XMLHttpResponse) {
 | ||
|                         var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                         args.response.error(errorMsg);
 | ||
|                       }
 | ||
|                     });
 | ||
|                   },
 | ||
|                   notification: {
 | ||
|                     poll: function(args) {
 | ||
|                       args.complete();
 | ||
|                     }
 | ||
|                   }
 | ||
|                 },
 | ||
| 
 | ||
|                 migrate: {
 | ||
|                   label: 'Migrate router',
 | ||
|                   messages: {
 | ||
|                     confirm: function(args) {
 | ||
|                       return 'Are you sure you want to migrate router?';
 | ||
|                     },
 | ||
|                     success: function(args) {
 | ||
|                       return 'Router is being migrated.';
 | ||
|                     },
 | ||
|                     notification: function(args) {
 | ||
|                       return 'Migrating router';
 | ||
|                     },
 | ||
|                     complete: function(args) {
 | ||
|                       return 'Router has been migrated.';
 | ||
|                     }
 | ||
|                   },
 | ||
|                   createForm: {
 | ||
|                     title: 'Migrate router',
 | ||
|                     desc: '',
 | ||
|                     fields: {
 | ||
|                       hostId: {
 | ||
|                         label: 'Host',
 | ||
|                         validation: { required: true },
 | ||
|                         select: function(args) {
 | ||
|                           $.ajax({
 | ||
|                             url: createURL("listHosts&VirtualMachineId=" + args.context.routers[0].id),
 | ||
|                             //url: createURL("listHosts"),	//for testing only, comment it out before checking in.
 | ||
|                             dataType: "json",
 | ||
|                             async: true,
 | ||
|                             success: function(json) {
 | ||
|                               var hostObjs = json.listhostsresponse.host;
 | ||
|                               var items = [];
 | ||
|                               $(hostObjs).each(function() {
 | ||
|                                 items.push({id: this.id, description: (this.name + ": " +(this.hasEnoughCapacity? "Available" : "Full"))});
 | ||
|                               });
 | ||
|                               args.response.success({data: items});
 | ||
|                             }
 | ||
|                           });
 | ||
|                         },
 | ||
|                         error: function(XMLHttpResponse) {
 | ||
|                           var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                           args.response.error(errorMsg);
 | ||
|                         }
 | ||
|                       }
 | ||
|                     }
 | ||
|                   },
 | ||
|                   action: function(args) {
 | ||
|                     if(args.data.hostId == null) {
 | ||
|                       args.response.error("Host field is required");
 | ||
|                       return;
 | ||
|                     }
 | ||
|                     $.ajax({
 | ||
|                       url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.routers[0].id),
 | ||
|                       dataType: "json",
 | ||
|                       async: true,
 | ||
|                       success: function(json) {
 | ||
|                         var jid = json.migratesystemvmresponse.jobid;
 | ||
|                         args.response.success({
 | ||
|                           _custom: {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {
 | ||
|                               //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
 | ||
|                               $.ajax({
 | ||
|                                 url: createURL("listRouters&id=" + json.queryasyncjobresultresponse.jobresult.systemvminstance.id),
 | ||
|                                 dataType: "json",
 | ||
|                                 async: false,
 | ||
|                                 success: function(json) {
 | ||
|                                   var items = json.listroutersresponse.router;
 | ||
|                                   if(items != null && items.length > 0) {
 | ||
|                                     return items[0];
 | ||
|                                   }
 | ||
|                                 }
 | ||
|                               });
 | ||
|                             },
 | ||
|                             getActionFilter: function() {
 | ||
|                               return routerActionfilter;
 | ||
|                             }
 | ||
|                           }
 | ||
|                         });
 | ||
|                       }
 | ||
|                     });
 | ||
|                   },
 | ||
|                   notification: {
 | ||
|                     poll: pollAsyncJobResult
 | ||
|                   }
 | ||
|                 },
 | ||
|                                 
 | ||
|                 viewConsole: {
 | ||
|                   label: 'View console',
 | ||
|                   action: {
 | ||
|                     externalLink: {
 | ||
|                       url: function(args) { 
 | ||
|                         return clientConsoleUrl + '?cmd=access&vm=' + args.context.routers[0].id;                  
 | ||
|                       },
 | ||
|                       title: function(args) {                         
 | ||
|                         return args.context.routers[0].name + ' console';                  
 | ||
|                       },
 | ||
|                       width: 820,
 | ||
|                       height: 640
 | ||
|                     }
 | ||
|                   }
 | ||
|                 }                  
 | ||
|               },              
 | ||
|               tabs: {
 | ||
|                 details: {
 | ||
|                   title: 'Details',
 | ||
|                   fields: [
 | ||
|                     {
 | ||
|                       name: { label: 'Name' }
 | ||
|                     },
 | ||
|                     {
 | ||
|                       id: { label: 'ID' },
 | ||
|                       state: { label: 'State' },                      
 | ||
|                       publicip: { label: 'Public IP' },
 | ||
|                       guestipaddress: { label: 'Guest IP' },
 | ||
|                       linklocalip: { label: 'Link local IP' },
 | ||
|                       hostname: { label: 'Host' },
 | ||
|                       serviceofferingname: { label: 'Service offering' },
 | ||
|                       networkdomain: { label: 'Network domain' },
 | ||
|                       domain: { label: 'Domain' },
 | ||
|                       account: { label: 'Account' },
 | ||
|                       created: { label: 'Created' },
 | ||
|                       isredundantrouter: { 
 | ||
|                         label: 'Redundant router',
 | ||
|                         converter: cloudStack.converters.toBooleanText                        
 | ||
|                       },
 | ||
|                       redundantRouterState: { label: 'Redundant state' } 
 | ||
|                     }
 | ||
|                   ],
 | ||
|                   dataProvider: function(args) {	
 | ||
|                     var item = args.context.routers[0];                    
 | ||
|                     if(item.isredundantrouter == true)
 | ||
|                       item["redundantRouterState"] = item.redundantstate;
 | ||
|                     else
 | ||
|                       item["redundantRouterState"] = "";                    
 | ||
|                     args.response.success({
 | ||
|                       actionFilter: routerActionfilter,
 | ||
|                       data: item
 | ||
|                     });
 | ||
|                   }
 | ||
|                 },
 | ||
|               }
 | ||
|             }            
 | ||
|           }
 | ||
|         },
 | ||
|         systemvms: {
 | ||
|           type: 'select',
 | ||
|           title: 'System VMs',
 | ||
|           listView: {
 | ||
|             label: 'System VMs',
 | ||
|             fields: {
 | ||
|               name: { label: 'Name' },    
 | ||
|               systemvmtype: { 
 | ||
|                 label: 'Type',
 | ||
|                 converter: function(args) {
 | ||
|                   if(args == "consoleproxy")
 | ||
|                     return "Console Proxy VM";
 | ||
|                   else if(args == "secondarystoragevm")
 | ||
|                     return "Secondary Storage VM";
 | ||
|                 }
 | ||
|               },  
 | ||
|               zonename: { label: 'Zone' },
 | ||
|               state: {
 | ||
|                 label: 'Status',
 | ||
|                 indicator: {
 | ||
|                   'Running': 'on',
 | ||
|                   'Stopped': 'off',
 | ||
|                   'Error': 'off'
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
|             dataProvider: function(args) {
 | ||
|               $.ajax({
 | ||
|                 url: createURL("listSystemVms&page=" + args.page + "&pagesize=" + pageSize),
 | ||
|                 dataType: "json",
 | ||
|                 async: true,
 | ||
|                 success: function(json) {
 | ||
|                   var items = json.listsystemvmsresponse.systemvm;
 | ||
|                   args.response.success({
 | ||
|                     actionFilter: systemvmActionfilter,
 | ||
|                     data: items
 | ||
|                   });
 | ||
|                 }
 | ||
|               });
 | ||
|             },
 | ||
| 
 | ||
|             actions: {
 | ||
|               start: {
 | ||
|                 label: 'Start system VM',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to start system VM?';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Starting system VM';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL('startSystemVm&id=' + args.context.systemvms[0].id),
 | ||
|                     dataType: 'json',
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jid = json.startsystemvmresponse.jobid;
 | ||
|                       args.response.success({
 | ||
|                         _custom: {
 | ||
|                           jobId: jid,
 | ||
|                           getUpdatedItem: function(json) {
 | ||
|                             return json.queryasyncjobresultresponse.jobresult.systemvm;
 | ||
|                           },
 | ||
|                           getActionFilter: function() {
 | ||
|                             return systemvmActionfilter;
 | ||
|                           }
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               stop: {
 | ||
|                 label: 'Stop system VM',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to stop system VM?';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Stopping system VM';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL('stopSystemVm&id=' + args.context.systemvms[0].id),
 | ||
|                     dataType: 'json',
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jid = json.stopsystemvmresponse.jobid;
 | ||
|                       args.response.success({
 | ||
|                         _custom: {
 | ||
|                           jobId: jid,
 | ||
|                           getUpdatedItem: function(json) {
 | ||
|                             return json.queryasyncjobresultresponse.jobresult.systemvm;
 | ||
|                           },
 | ||
|                           getActionFilter: function() {
 | ||
|                             return systemvmActionfilter;
 | ||
|                           }
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               restart: {
 | ||
|                 label: 'reboot system VM',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to reboot system VM?';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'rebooting system VM';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL('rebootSystemVm&id=' + args.context.systemvms[0].id),
 | ||
|                     dataType: 'json',
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jid = json.rebootsystemvmresponse.jobid;
 | ||
|                       args.response.success({
 | ||
|                         _custom: {
 | ||
|                           jobId: jid,
 | ||
|                           getUpdatedItem: function(json) {
 | ||
|                             return json.queryasyncjobresultresponse.jobresult.systemvm;
 | ||
|                           },
 | ||
|                           getActionFilter: function() {
 | ||
|                             return systemvmActionfilter;
 | ||
|                           }
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               'delete': {
 | ||
|                 label: 'Destroy system VM',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to destroy this system VM?';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Destroyed system VM';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL('destroySystemVm&id=' + args.context.systemvms[0].id),
 | ||
|                     dataType: 'json',
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jid = json.destroysystemvmresponse.jobid;
 | ||
|                       args.response.success({
 | ||
|                         _custom: {
 | ||
|                           jobId: jid,
 | ||
|                           getUpdatedItem: function(json) {
 | ||
|                             //return {}; //nothing in this systemVM needs to be updated, in fact, this whole systemVM has being destroyed
 | ||
|                           },
 | ||
|                           getActionFilter: function() {
 | ||
|                             return systemvmActionfilter;
 | ||
|                           }
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               migrate: {
 | ||
|                 label: 'Migrate system VM',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to migrate system VM?';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'System VM is being migrated.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Migrating system VM';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'System VM has been migrated.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 createForm: {
 | ||
|                   title: 'Migrate system VM',
 | ||
|                   desc: '',
 | ||
|                   fields: {
 | ||
|                     hostId: {
 | ||
|                       label: 'Host',
 | ||
|                       validation: { required: true },
 | ||
|                       select: function(args) {
 | ||
|                         $.ajax({
 | ||
|                           url: createURL("listHosts&VirtualMachineId=" + args.context.systemvms[0].id),
 | ||
|                           //url: createURL("listHosts"),	//for testing only, comment it out before checking in.
 | ||
|                           dataType: "json",
 | ||
|                           async: true,
 | ||
|                           success: function(json) {
 | ||
|                             var hostObjs = json.listhostsresponse.host;
 | ||
|                             var items = [];
 | ||
|                             $(hostObjs).each(function() {
 | ||
|                               items.push({id: this.id, description: (this.name + ": " +(this.hasEnoughCapacity? "Available" : "Full"))});
 | ||
|                             });
 | ||
|                             args.response.success({data: items});
 | ||
|                           }
 | ||
|                         });
 | ||
|                       },
 | ||
|                       error: function(XMLHttpResponse) {
 | ||
|                         var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                         args.response.error(errorMsg);
 | ||
|                       }
 | ||
|                     }
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   if(args.data.hostId == null) {
 | ||
|                     args.response.error("Host field is required");
 | ||
|                     return;
 | ||
|                   }
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.systemvms[0].id),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jid = json.migratesystemvmresponse.jobid;
 | ||
|                       args.response.success({
 | ||
|                         _custom: {
 | ||
|                           jobId: jid,
 | ||
|                           getUpdatedItem: function(json) {
 | ||
|                             //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
 | ||
|                             $.ajax({
 | ||
|                               url: createURL("listSystemVms&id=" + json.queryasyncjobresultresponse.jobresult.systemvminstance.id),
 | ||
|                               dataType: "json",
 | ||
|                               async: false,
 | ||
|                               success: function(json) {
 | ||
|                                 var items = json.listsystemvmsresponse.systemvm;
 | ||
|                                 if(items != null && items.length > 0) {
 | ||
|                                   return items[0];
 | ||
|                                 }
 | ||
|                               }
 | ||
|                             });
 | ||
|                           },
 | ||
|                           getActionFilter: function() {
 | ||
|                             return systemvmActionfilter;
 | ||
|                           }
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               }
 | ||
|             },           
 | ||
|             detailView: {
 | ||
|               name: 'System VM details',    
 | ||
|               actions: {
 | ||
|                 start: {
 | ||
|                   label: 'Start system VM',
 | ||
|                   messages: {
 | ||
|                     confirm: function(args) {
 | ||
|                       return 'Are you sure you want to start system VM?';
 | ||
|                     },
 | ||
|                     notification: function(args) {
 | ||
|                       return 'Starting system VM';
 | ||
|                     }
 | ||
|                   },
 | ||
|                   action: function(args) {
 | ||
|                     $.ajax({
 | ||
|                       url: createURL('startSystemVm&id=' + args.context.systemvms[0].id),
 | ||
|                       dataType: 'json',
 | ||
|                       async: true,
 | ||
|                       success: function(json) {
 | ||
|                         var jid = json.startsystemvmresponse.jobid;
 | ||
|                         args.response.success({
 | ||
|                           _custom: {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {
 | ||
|                               return json.queryasyncjobresultresponse.jobresult.systemvm;
 | ||
|                             },
 | ||
|                             getActionFilter: function() {
 | ||
|                               return systemvmActionfilter;
 | ||
|                             }
 | ||
|                           }
 | ||
|                         });
 | ||
|                       }
 | ||
|                     });
 | ||
|                   },
 | ||
|                   notification: {
 | ||
|                     poll: pollAsyncJobResult
 | ||
|                   }
 | ||
|                 },
 | ||
| 
 | ||
|                 stop: {
 | ||
|                   label: 'Stop system VM',
 | ||
|                   messages: {
 | ||
|                     confirm: function(args) {
 | ||
|                       return 'Are you sure you want to stop system VM?';
 | ||
|                     },
 | ||
|                     notification: function(args) {
 | ||
|                       return 'Stopping system VM';
 | ||
|                     }
 | ||
|                   },
 | ||
|                   action: function(args) {
 | ||
|                     $.ajax({
 | ||
|                       url: createURL('stopSystemVm&id=' + args.context.systemvms[0].id),
 | ||
|                       dataType: 'json',
 | ||
|                       async: true,
 | ||
|                       success: function(json) {
 | ||
|                         var jid = json.stopsystemvmresponse.jobid;
 | ||
|                         args.response.success({
 | ||
|                           _custom: {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {
 | ||
|                               return json.queryasyncjobresultresponse.jobresult.systemvm;
 | ||
|                             },
 | ||
|                             getActionFilter: function() {
 | ||
|                               return systemvmActionfilter;
 | ||
|                             }
 | ||
|                           }
 | ||
|                         });
 | ||
|                       }
 | ||
|                     });
 | ||
|                   },
 | ||
|                   notification: {
 | ||
|                     poll: pollAsyncJobResult
 | ||
|                   }
 | ||
|                 },
 | ||
| 
 | ||
|                 restart: {
 | ||
|                   label: 'reboot system VM',
 | ||
|                   messages: {
 | ||
|                     confirm: function(args) {
 | ||
|                       return 'Are you sure you want to reboot system VM?';
 | ||
|                     },
 | ||
|                     notification: function(args) {
 | ||
|                       return 'rebooting system VM';
 | ||
|                     }
 | ||
|                   },
 | ||
|                   action: function(args) {
 | ||
|                     $.ajax({
 | ||
|                       url: createURL('rebootSystemVm&id=' + args.context.systemvms[0].id),
 | ||
|                       dataType: 'json',
 | ||
|                       async: true,
 | ||
|                       success: function(json) {
 | ||
|                         var jid = json.rebootsystemvmresponse.jobid;
 | ||
|                         args.response.success({
 | ||
|                           _custom: {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {
 | ||
|                               return json.queryasyncjobresultresponse.jobresult.systemvm;
 | ||
|                             },
 | ||
|                             getActionFilter: function() {
 | ||
|                               return systemvmActionfilter;
 | ||
|                             }
 | ||
|                           }
 | ||
|                         });
 | ||
|                       }
 | ||
|                     });
 | ||
|                   },
 | ||
|                   notification: {
 | ||
|                     poll: pollAsyncJobResult
 | ||
|                   }
 | ||
|                 },
 | ||
| 
 | ||
|                 'delete': {
 | ||
|                   label: 'Destroy system VM',
 | ||
|                   messages: {
 | ||
|                     confirm: function(args) {
 | ||
|                       return 'Are you sure you want to destroy this system VM?';
 | ||
|                     },
 | ||
|                     notification: function(args) {
 | ||
|                       return 'Destroyping system VM';
 | ||
|                     }
 | ||
|                   },
 | ||
|                   action: function(args) {
 | ||
|                     $.ajax({
 | ||
|                       url: createURL('destroySystemVm&id=' + args.context.systemvms[0].id),
 | ||
|                       dataType: 'json',
 | ||
|                       async: true,
 | ||
|                       success: function(json) {
 | ||
|                         var jid = json.destroysystemvmresponse.jobid;
 | ||
|                         args.response.success({
 | ||
|                           _custom: {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {
 | ||
|                               //return {}; //nothing in this systemVM needs to be updated, in fact, this whole systemVM has being destroyed
 | ||
|                             },
 | ||
|                             getActionFilter: function() {
 | ||
|                               return systemvmActionfilter;
 | ||
|                             }
 | ||
|                           }
 | ||
|                         });
 | ||
|                       }
 | ||
|                     });
 | ||
|                   },
 | ||
|                   notification: {
 | ||
|                     poll: pollAsyncJobResult
 | ||
|                   }
 | ||
|                 },
 | ||
| 
 | ||
|                 migrate: {
 | ||
|                   label: 'Migrate system VM',
 | ||
|                   messages: {
 | ||
|                     confirm: function(args) {
 | ||
|                       return 'Are you sure you want to migrate system VM?';
 | ||
|                     },
 | ||
|                     success: function(args) {
 | ||
|                       return 'System VM is being migrated.';
 | ||
|                     },
 | ||
|                     notification: function(args) {
 | ||
|                       return 'Migrating system VM';
 | ||
|                     },
 | ||
|                     complete: function(args) {
 | ||
|                       return 'System VM has been migrated.';
 | ||
|                     }
 | ||
|                   },
 | ||
|                   createForm: {
 | ||
|                     title: 'Migrate system VM',
 | ||
|                     desc: '',
 | ||
|                     fields: {
 | ||
|                       hostId: {
 | ||
|                         label: 'Host',
 | ||
|                         validation: { required: true },
 | ||
|                         select: function(args) {
 | ||
|                           $.ajax({
 | ||
|                             url: createURL("listHosts&VirtualMachineId=" + args.context.systemvms[0].id),
 | ||
|                             //url: createURL("listHosts"),	//for testing only, comment it out before checking in.
 | ||
|                             dataType: "json",
 | ||
|                             async: true,
 | ||
|                             success: function(json) {
 | ||
|                               var hostObjs = json.listhostsresponse.host;
 | ||
|                               var items = [];
 | ||
|                               $(hostObjs).each(function() {
 | ||
|                                 items.push({id: this.id, description: (this.name + ": " +(this.hasEnoughCapacity? "Available" : "Full"))});
 | ||
|                               });
 | ||
|                               args.response.success({data: items});
 | ||
|                             }
 | ||
|                           });
 | ||
|                         },
 | ||
|                         error: function(XMLHttpResponse) {
 | ||
|                           var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                           args.response.error(errorMsg);
 | ||
|                         }
 | ||
|                       }
 | ||
|                     }
 | ||
|                   },
 | ||
|                   action: function(args) {
 | ||
|                     if(args.data.hostId == null) {
 | ||
|                       args.response.error("Host field is required");
 | ||
|                       return;
 | ||
|                     }
 | ||
|                     $.ajax({
 | ||
|                       url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.systemvms[0].id),
 | ||
|                       dataType: "json",
 | ||
|                       async: true,
 | ||
|                       success: function(json) {
 | ||
|                         var jid = json.migratesystemvmresponse.jobid;
 | ||
|                         args.response.success({
 | ||
|                           _custom: {
 | ||
|                             jobId: jid,
 | ||
|                             getUpdatedItem: function(json) {
 | ||
|                               //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
 | ||
|                               $.ajax({
 | ||
|                                 url: createURL("listSystemVms&id=" + json.queryasyncjobresultresponse.jobresult.systemvminstance.id),
 | ||
|                                 dataType: "json",
 | ||
|                                 async: false,
 | ||
|                                 success: function(json) {
 | ||
|                                   var items = json.listsystemvmsresponse.systemvm;
 | ||
|                                   if(items != null && items.length > 0) {
 | ||
|                                     return items[0];
 | ||
|                                   }
 | ||
|                                 }
 | ||
|                               });
 | ||
|                             },
 | ||
|                             getActionFilter: function() {
 | ||
|                               return systemvmActionfilter;
 | ||
|                             }
 | ||
|                           }
 | ||
|                         });
 | ||
|                       }
 | ||
|                     });
 | ||
|                   },
 | ||
|                   notification: {
 | ||
|                     poll: pollAsyncJobResult
 | ||
|                   }
 | ||
|                 },
 | ||
|                 
 | ||
|                 viewConsole: {
 | ||
|                   label: 'View console',
 | ||
|                   action: {
 | ||
|                     externalLink: {
 | ||
|                       url: function(args) {    
 | ||
|                         return clientConsoleUrl + '?cmd=access&vm=' + args.context.systemvms[0].id;                  
 | ||
|                       },
 | ||
|                       title: function(args) { 
 | ||
|                         return args.context.systemvms[0].systemvmtype + ' console';                  
 | ||
|                       },
 | ||
|                       width: 820,
 | ||
|                       height: 640
 | ||
|                     }
 | ||
|                   }
 | ||
|                 }  
 | ||
|               },                             
 | ||
|               tabs: {
 | ||
|                 details: {
 | ||
|                   title: 'Details',
 | ||
|                   fields: [
 | ||
|                     {
 | ||
|                       name: { label: 'Name' }
 | ||
|                     },
 | ||
|                     {
 | ||
|                       id: { label: 'ID' },                      
 | ||
|                       state: { label: 'State' },
 | ||
|                       systemvmtype: { 
 | ||
|                         label: 'Type',
 | ||
|                         converter: function(args) {
 | ||
|                           if(args == "consoleproxy")
 | ||
|                             return "Console Proxy VM";
 | ||
|                           else if(args == "secondarystoragevm")
 | ||
|                             return "Secondary Storage VM";
 | ||
|                         }
 | ||
|                       },
 | ||
|                       zonename: { label: 'Zone' },
 | ||
|                       publicip: { label: 'Public IP' },
 | ||
|                       privateip: { label: 'Private IP' },
 | ||
|                       linklocalip: { label: 'Link local IP' },
 | ||
|                       hostname: { label: 'Host' },
 | ||
|                       gateway: { label: 'Gateway' },
 | ||
|                       created: { label: 'Created' },
 | ||
|                       activeviewersessions: { label: 'Active sessions' }
 | ||
|                     }
 | ||
|                   ],
 | ||
|                   dataProvider: function(args) {	
 | ||
|                     args.response.success({
 | ||
|                       actionFilter: systemvmActionfilter,
 | ||
|                       data: args.context.systemvms[0]
 | ||
|                     });
 | ||
|                   }
 | ||
|                 },
 | ||
|               }
 | ||
|             }            
 | ||
|           }
 | ||
|         }
 | ||
|       }
 | ||
|     }),
 | ||
|     subsections: {
 | ||
|       networks: {
 | ||
|         sectionSelect: { label: 'Network type' },
 | ||
|         sections: {
 | ||
|           publicNetworks: {
 | ||
|             type: 'select',
 | ||
|             title: 'Public network',
 | ||
|             listView: {
 | ||
|               section: 'networks',
 | ||
|               id: 'networks',
 | ||
|               fields: {
 | ||
|                 //id: { label: "ID" },
 | ||
|                 traffictype:  { label: "Traffic type" },
 | ||
|                 broadcastdomaintype:  { label: "Broadcast domain type" }
 | ||
|               },
 | ||
| 
 | ||
|               dataProvider: function(args) {  //public network
 | ||
|                 var showPublicNetwork = true;
 | ||
|                        
 | ||
|                 if(selectedZoneObj.networktype == "Basic") {
 | ||
|                   //$("#add_network_button").hide();
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("listExternalFirewalls&zoneid=" + selectedZoneObj.id),
 | ||
|                     dataType: "json",
 | ||
|                     async: false,
 | ||
|                     success: function(json) {
 | ||
|                       var items = json.listexternalfirewallsresponse.externalfirewall;
 | ||
|                       if(items != null && items.length > 0) {
 | ||
|                         showPublicNetwork = true;
 | ||
|                         //$("#add_iprange_button,#tab_ipallocation").show();
 | ||
|                       }
 | ||
|                       else {
 | ||
|                         showPublicNetwork = false;
 | ||
|                         //$("#add_iprange_button,#tab_ipallocation").hide();
 | ||
|                       }
 | ||
|                     }
 | ||
|                   });
 | ||
|                 }
 | ||
|                 else { // Advanced zone
 | ||
|                   showPublicNetwork = true;
 | ||
|                   //$("#add_network_button,#add_iprange_button,#tab_ipallocation").show();
 | ||
|                   //listMidMenuItems2(("listNetworks&type=Direct&zoneId="+selectedZoneObj.id), networkGetSearchParams, "listnetworksresponse", "network", directNetworkToMidmenu, directNetworkToRightPanel, directNetworkGetMidmenuId, false, 1);
 | ||
|                 }
 | ||
|                 
 | ||
|                 if(showPublicNetwork == true && selectedZoneObj.securitygroupsenabled == false) { //public network
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("listNetworks&trafficType=Public&isSystem=true&zoneId="+selectedZoneObj.id),
 | ||
|                     dataType: "json",
 | ||
|                     async: false,
 | ||
|                     success: function(json) {
 | ||
|                       var items = json.listnetworksresponse.network;
 | ||
|                       args.response.success({data: items});
 | ||
|                     }
 | ||
|                   });
 | ||
|                 }
 | ||
|                 else if (showPublicNetwork == true && selectedZoneObj.securitygroupsenabled == true){
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("listNetworks&type=Direct&trafficType=Guest&isSystem=true&zoneId="+selectedZoneObj.id),
 | ||
|                     dataType: "json",
 | ||
|                     async: false,
 | ||
|                     success: function(json) {
 | ||
|                       var items = json.listnetworksresponse.network;
 | ||
|                       args.response.success({data: items});
 | ||
|                     }
 | ||
|                   });
 | ||
|                 }
 | ||
|                 else {
 | ||
|                   args.response.success({data: null});
 | ||
|                 }
 | ||
|               }	,
 | ||
| 
 | ||
|               detailView: {
 | ||
|                 //viewAll: { label: 'Hosts', path: 'instances' },
 | ||
| 
 | ||
|                 actions: {
 | ||
|                   addIpRange: {
 | ||
|                     label: 'Add IP range',
 | ||
|                     messages: {
 | ||
|                       confirm: function(args) {
 | ||
|                         return 'Are you sure you want to add IP range?';
 | ||
|                       },
 | ||
|                       success: function(args) {
 | ||
|                         return 'IP range is being added.';
 | ||
|                       },
 | ||
|                       notification: function(args) {
 | ||
|                         return 'Adding IP range';
 | ||
|                       },
 | ||
|                       complete: function(args) {
 | ||
|                         return 'IP range has been added.';
 | ||
|                       }
 | ||
|                     },
 | ||
|                     createForm: {
 | ||
|                       title: 'Add IP range',
 | ||
|                       fields: {
 | ||
|                         vlanTagged: {
 | ||
|                           label: 'VLAN',
 | ||
|                           dependsOn: 'isBootable',
 | ||
|                           select: function(args) {
 | ||
|                             var items = [];
 | ||
|                             items.push({id: "untagged", description: "untagged"});
 | ||
|                             items.push({id: "tagged", description: "tagged"});
 | ||
|                             args.response.success({data: items});
 | ||
|                             args.$select.change(function() {
 | ||
|                               var $form = $(this).closest('form');
 | ||
|                               if($(this).val() == "tagged")
 | ||
|                                 $form.find('.form-item[rel=vlanId]').css('display', 'inline-block');
 | ||
|                               else //"untagged"
 | ||
|                                 $form.find('.form-item[rel=vlanId]').hide();
 | ||
|                             });
 | ||
|                           }
 | ||
|                         },
 | ||
|                         vlanId: { label: "VLAN ID" },
 | ||
| 
 | ||
|                         scope: {
 | ||
|                           label: 'Scope',
 | ||
|                           select: function(args) {                       
 | ||
|                             var array1 = [];
 | ||
|                             if(selectedZoneObj.securitygroupsenabled) {
 | ||
|                               array1.push({id: 'account-specific', description: 'account-specific'});
 | ||
|                             }
 | ||
|                             else {
 | ||
|                               array1.push({id: 'zone-wide', description: 'zone-wide'});
 | ||
|                               array1.push({id: 'domain-specific', description: 'domain-specific'});
 | ||
|                               array1.push({id: 'account-specific', description: 'account-specific'});
 | ||
|                             }
 | ||
|                             args.response.success({data: array1});
 | ||
| 
 | ||
|                             args.$select.change(function() {
 | ||
|                               var $form = $(this).closest('form');
 | ||
|                               if($(this).val() == "zone-wide") {
 | ||
|                                 $form.find('.form-item[rel=domainId]').hide();
 | ||
|                                 $form.find('.form-item[rel=account]').hide();
 | ||
|                               }
 | ||
|                               else if ($(this).val() == "domain-specific") {
 | ||
|                                 $form.find('.form-item[rel=domainId]').css('display', 'inline-block');
 | ||
|                                 $form.find('.form-item[rel=account]').hide();
 | ||
|                               }
 | ||
|                               else if($(this).val() == "account-specific") {
 | ||
|                                 $form.find('.form-item[rel=domainId]').css('display', 'inline-block');
 | ||
|                                 $form.find('.form-item[rel=account]').css('display', 'inline-block');
 | ||
|                               }
 | ||
|                             });
 | ||
|                           }
 | ||
|                         },
 | ||
|                         domainId: {
 | ||
|                           label: 'Domain',
 | ||
|                           validation: { required: true },
 | ||
|                           select: function(args) {
 | ||
|                             var items = [];                       
 | ||
|                             if(selectedZoneObj.domainid != null) { //list only domains under selectedZoneObj.domainid
 | ||
|                               $.ajax({
 | ||
|                                 url: createURL("listDomainChildren&id=" + selectedZoneObj.domainid + "&isrecursive=true"),
 | ||
|                                 dataType: "json",
 | ||
|                                 async: false,
 | ||
|                                 success: function(json) {
 | ||
|                                   var domainObjs = json.listdomainchildrenresponse.domain;
 | ||
|                                   $(domainObjs).each(function() {
 | ||
|                                     items.push({id: this.id, description: this.name});
 | ||
|                                   });
 | ||
|                                 }
 | ||
|                               });
 | ||
|                               $.ajax({
 | ||
|                                 url: createURL("listDomains&id=" + selectedZoneObj.domainid),
 | ||
|                                 dataType: "json",
 | ||
|                                 async: false,
 | ||
|                                 success: function(json) {
 | ||
|                                   var domainObjs = json.listdomainsresponse.domain;
 | ||
|                                   $(domainObjs).each(function() {
 | ||
|                                     items.push({id: this.id, description: this.name});
 | ||
|                                   });
 | ||
|                                 }
 | ||
|                               });
 | ||
|                             }
 | ||
|                             else { //list all domains
 | ||
|                               $.ajax({
 | ||
|                                 url: createURL("listDomains"),
 | ||
|                                 dataType: "json",
 | ||
|                                 async: false,
 | ||
|                                 success: function(json) {
 | ||
|                                   var domainObjs = json.listdomainsresponse.domain;
 | ||
|                                   $(domainObjs).each(function() {
 | ||
|                                     items.push({id: this.id, description: this.name});
 | ||
|                                   });
 | ||
|                                 }
 | ||
|                               });
 | ||
|                             }
 | ||
|                             args.response.success({data: items});
 | ||
|                           }
 | ||
|                         },
 | ||
|                         account: { label: 'Account' },
 | ||
| 
 | ||
|                         gateway: { label: 'Gateway' },
 | ||
|                         netmask: { label: 'Netmask' },
 | ||
|                         startip: { label: 'Start IP' },
 | ||
|                         endip: { label: 'End IP' }
 | ||
|                       }
 | ||
|                     },
 | ||
|                     action: function(args) {
 | ||
|                       var $form = args.$form;
 | ||
|                       var array1 = [];
 | ||
|                       array1.push("&zoneId=" + args.context.zones[0].id);
 | ||
| 
 | ||
|                       if (args.data.vlanTagged == "tagged")
 | ||
|                         array1.push("&vlan=" + todb(args.data.vlanId));
 | ||
|                       else
 | ||
|                         array1.push("&vlan=untagged");
 | ||
| 
 | ||
|                       if($form.find('.form-item[rel=domainId]').css("display") != "none") {
 | ||
|                         if($form.find('.form-item[rel=account]').css("display") != "none") {  //account-specific
 | ||
|                           array1.push("&domainId=" + args.data.domainId);
 | ||
|                           array1.push("&account=" + args.data.account);
 | ||
|                         }
 | ||
|                         else {  //domain-specific
 | ||
|                           array1.push("&domainId=" + args.data.domainId);
 | ||
|                           array1.push("&isshared=true");
 | ||
|                         }
 | ||
|                       }
 | ||
|                       else { //zone-wide
 | ||
|                         array1.push("&isshared=true");
 | ||
|                       }
 | ||
| 
 | ||
|                       array1.push("&gateway=" + args.data.gateway);
 | ||
|                       array1.push("&netmask=" + args.data.netmask);
 | ||
|                       array1.push("&startip=" + args.data.startip);
 | ||
|                       if(args.data.endip != null && args.data.endip.length > 0)
 | ||
|                         array1.push("&endip=" + args.data.endip);
 | ||
| 
 | ||
|                       if(args.context.zones[0].securitygroupsenabled == false)
 | ||
|                         array1.push("&forVirtualNetwork=true");
 | ||
|                       else
 | ||
|                         array1.push("&forVirtualNetwork=false");
 | ||
| 
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("createVlanIpRange" + array1.join("")),
 | ||
|                         dataType: "json",
 | ||
|                         success: function(json) {
 | ||
|                           var item = json.createvlaniprangeresponse.vlan;
 | ||
|                           args.response.success({data: item});
 | ||
|                         },
 | ||
|                         error: function(XMLHttpResponse) {
 | ||
|                           var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                           args.response.error(errorMsg);
 | ||
|                         }
 | ||
|                       });
 | ||
|                     },
 | ||
|                     notification: {
 | ||
|                       poll: function(args) {
 | ||
|                         args.complete();
 | ||
|                       }
 | ||
|                     }
 | ||
|                   }
 | ||
|                 },
 | ||
| 
 | ||
|                 tabs: {
 | ||
|                   details: {
 | ||
|                     title: 'Details',
 | ||
|                     fields: [
 | ||
|                       {
 | ||
|                         networkofferingdisplaytext:  { label: "Network offering description" }
 | ||
|                       },
 | ||
|                       {
 | ||
|                         id: { label: "ID" },
 | ||
|                         broadcastdomaintype: { label: 'Broadcast domain type' },
 | ||
|                         traffictype: { label: 'Traffic type' },
 | ||
|                         gateway: { label: 'Gateway' },
 | ||
|                         netmask: { label: 'Netmask' },
 | ||
|                         startip: { label: 'Start IP' },
 | ||
|                         endip: { label: 'End IP' },
 | ||
|                         zoneid: { label: 'Zone ID' },
 | ||
|                         networkofferingid: { label: 'Network offering ID' },
 | ||
|                         networkofferingname: { label: 'Network offering name' },
 | ||
|                         networkofferingavailability: { label: 'network offering availability' },
 | ||
|                         isshared: {
 | ||
|                           label: 'Shared',
 | ||
|                           converter: cloudStack.converters.toBooleanText
 | ||
|                         },
 | ||
|                         issystem: {
 | ||
|                           label: 'System',
 | ||
|                           converter: cloudStack.converters.toBooleanText
 | ||
|                         },
 | ||
|                         isdefault: {
 | ||
|                           label: 'Default',
 | ||
|                           converter: cloudStack.converters.toBooleanText
 | ||
|                         },
 | ||
|                         securitygroupenabled: {
 | ||
|                           label: 'Security group enabled',
 | ||
|                           converter: cloudStack.converters.toBooleanText
 | ||
|                         },
 | ||
|                         state: { label: 'State' },
 | ||
|                         related: { label: 'Related' },
 | ||
|                         dns1: { label: 'DNS 1' },
 | ||
|                         dns2: { label: 'DNS 2' },
 | ||
|                         vlan: { label: 'VLAN' },
 | ||
|                         domainid: { label: 'Domain ID' },
 | ||
|                         account: { label: 'Account' }
 | ||
|                       }
 | ||
|                     ],
 | ||
|                     dataProvider: function(args) {
 | ||
|                       args.response.success({data: args.context.publicNetworks[0]});
 | ||
|                     }
 | ||
|                   },
 | ||
|                   ipAllocations: {
 | ||
|                     title: 'IP Allocations',
 | ||
|                     multiple: true,
 | ||
|                     fields: [
 | ||
|                       {
 | ||
|                         id: { label: 'ID' },
 | ||
|                         vlan: { label: 'VLAN' },
 | ||
|                         gateway: { label: 'Gateway' },
 | ||
|                         netmask: { label: 'Netmask' },
 | ||
|                         startip: { label: 'Start IP' },
 | ||
|                         endip: { label: 'End IP' },
 | ||
|                         domain: { label: 'Domain' },
 | ||
|                         account: { label: 'Account' }
 | ||
|                       }
 | ||
|                     ],
 | ||
|                     dataProvider: function(args) {
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("listVlanIpRanges&zoneid=" + args.context.zones[0].id + "&networkId=" + args.context.publicNetworks[0].id),
 | ||
|                         dataType: "json",
 | ||
|                         success: function(json) {
 | ||
|                           var items = json.listvlaniprangesresponse.vlaniprange;
 | ||
|                           args.response.success({
 | ||
|                             actionFilter: publicNetworkActionfilter,
 | ||
|                             data: items});
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   }
 | ||
|                 }
 | ||
|               }
 | ||
|             }
 | ||
|           },
 | ||
|           directNetworks: {
 | ||
|             title: 'Direct network',
 | ||
|             type: 'select',
 | ||
|             listView: {
 | ||
|               section: 'networks',
 | ||
|               id: 'networks',
 | ||
|               fields: {
 | ||
|                 //id: { label: "ID" },
 | ||
|                 vlan:  { label: "VLAN ID" },
 | ||
|                 traffictype:  { label: "Traffic type" }
 | ||
|               },
 | ||
|               actions: {
 | ||
|                 //create direct network action has moved to Guest network
 | ||
|               },
 | ||
|               dataProvider: function(args) { //direct netwoerk            
 | ||
|                 if(selectedZoneObj.networktype == "Basic") {
 | ||
|                   args.response.success({data: null});
 | ||
|                 }
 | ||
|                 else { // Advanced zone
 | ||
|                   //$("#add_network_button,#add_iprange_button,#tab_ipallocation").show();
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("listNetworks&type=Direct&zoneId="+selectedZoneObj.id),
 | ||
|                     dataType: "json",
 | ||
|                     async: false,
 | ||
|                     success: function(json) {
 | ||
|                       var items = json.listnetworksresponse.network;
 | ||
|                       args.response.success({
 | ||
|                         actionFilter: directNetworkActionfilter,
 | ||
|                         data: items});
 | ||
|                     }
 | ||
|                   });
 | ||
|                 }
 | ||
|               }	,
 | ||
| 
 | ||
|               detailView: {
 | ||
|                 //viewAll: { label: 'Hosts', path: 'instances' },
 | ||
|                 actions: {
 | ||
|                   addIpRange: {
 | ||
|                     label: 'Add IP range',
 | ||
|                     messages: {
 | ||
|                       confirm: function(args) {
 | ||
|                         return 'Are you sure you want to add IP range?';
 | ||
|                       },
 | ||
|                       success: function(args) {
 | ||
|                         return 'IP range is being added.';
 | ||
|                       },
 | ||
|                       notification: function(args) {
 | ||
|                         return 'Adding IP range';
 | ||
|                       },
 | ||
|                       complete: function(args) {
 | ||
|                         return 'IP range has been added.';
 | ||
|                       }
 | ||
|                     },
 | ||
|                     createForm: {
 | ||
|                       title: 'Add IP range',
 | ||
|                       preFilter: function(args) {
 | ||
|                         if(args.context.zones[0].securitygroupsenabled) {
 | ||
|                           args.$form.find('.form-item[rel=vlanId]').css('display', 'inline-block');
 | ||
|                           args.$form.find('.form-item[rel=gateway]').css('display', 'inline-block');
 | ||
|                           args.$form.find('.form-item[rel=netmask]').css('display', 'inline-block');
 | ||
|                         }
 | ||
|                         else {
 | ||
|                           args.$form.find('.form-item[rel=vlanId]').hide();
 | ||
|                           args.$form.find('.form-item[rel=gateway]').hide();
 | ||
|                           args.$form.find('.form-item[rel=netmask]').hide();
 | ||
|                         }
 | ||
|                       },
 | ||
|                       fields: {
 | ||
|                         vlanId: { label: 'VLAN ID' },
 | ||
|                         gateway: { label: 'Gateway' },
 | ||
|                         netmask: { label: 'Netmask' },
 | ||
|                         startip: { label: 'Start IP' },
 | ||
|                         endip: { label: 'End IP' }
 | ||
|                       }
 | ||
|                     },
 | ||
|                     action: function(args) {
 | ||
|                       var $form = args.$form;
 | ||
|                       var array1 = [];
 | ||
|                       if($form.find('.form-item[rel=vlanId]').css("display") != "none") {
 | ||
|                         array1.push("&vlan="+todb(args.data.vlanId));
 | ||
|                       }
 | ||
|                       //else {   //Bug 8950 (don't specify "vlan=untagged" if vlanId is not available when Adding Ip Range to Direct Network)
 | ||
|                       //  array1.push("&vlan=untagged");
 | ||
|                       //}
 | ||
| 
 | ||
|                       if($form.find('.form-item[rel=gateway]').css("display") != "none") {
 | ||
|                         array1.push("&gateway=" + todb(args.data.gateway));
 | ||
|                       }
 | ||
| 
 | ||
|                       if($form.find('.form-item[rel=netmask]').css("display") != "none") {
 | ||
|                         array1.push("&netmask=" + todb(args.data.netmask));
 | ||
|                       }
 | ||
| 
 | ||
|                       array1.push("&startip=" + todb(args.data.startip));
 | ||
| 
 | ||
|                       if(args.data.endip != null && args.data.endip.length > 0)
 | ||
|                         array1.push("&endip=" + todb(args.data.endip));
 | ||
| 
 | ||
| 
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("createVlanIpRange&forVirtualNetwork=false&networkid=" + args.context.directNetworks[0].id + array1.join("")),
 | ||
|                         dataType: "json",
 | ||
|                         success: function(json) {
 | ||
|                           var item = json.createvlaniprangeresponse.vlan;
 | ||
|                           args.response.success({data: item});
 | ||
|                         },
 | ||
|                         error: function(XMLHttpResponse) {
 | ||
|                           var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                           args.response.error(errorMsg);
 | ||
|                         }
 | ||
|                       });
 | ||
|                     },
 | ||
|                     notification: {
 | ||
|                       poll: function(args) {
 | ||
|                         args.complete();
 | ||
|                       }
 | ||
|                     }
 | ||
|                   },
 | ||
| 
 | ||
|                   edit: {
 | ||
|                     label: 'Edit',
 | ||
| 
 | ||
|                     messages: {
 | ||
|                       confirm: function(args) {
 | ||
|                         return 'Are you sure you want to edit network?';
 | ||
|                       },
 | ||
|                       success: function(args) {
 | ||
|                         return 'Network is being edited.';
 | ||
|                       },
 | ||
|                       notification: function(args) {
 | ||
|                         return 'Editing network';
 | ||
|                       },
 | ||
|                       complete: function(args) {
 | ||
|                         return 'Network has been edited.';
 | ||
|                       }
 | ||
|                     },
 | ||
| 
 | ||
|                     action: function(args) {
 | ||
|                       var array1 = [];
 | ||
|                       array1.push("&name=" + todb(args.data.name));
 | ||
|                       array1.push("&displayText=" + todb(args.data.displaytext));
 | ||
|                       array1.push("&networkdomain=" + todb(args.data.networkdomain));
 | ||
|                       array1.push("&tags=" + todb(args.data.tags));
 | ||
| 
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("updateNetwork&id=" + args.context.directNetworks[0].id + array1.join("")),
 | ||
|                         dataType: "json",
 | ||
|                         success: function(json) {
 | ||
|                           var jid = json.updatenetworkresponse.jobid;
 | ||
|                           args.response.success(
 | ||
|                             {_custom:
 | ||
|                              {jobId: jid,
 | ||
|                               getUpdatedItem: function(json) {
 | ||
|                                 var item = json.queryasyncjobresultresponse.jobresult.network;
 | ||
|                                 return {data: item};
 | ||
|                               },
 | ||
|                               getActionFilter: function() {
 | ||
|                                 return directNetworkActionfilter;
 | ||
|                               }
 | ||
|                              }
 | ||
|                             }
 | ||
|                           );
 | ||
|                         }
 | ||
|                       });
 | ||
|                     },
 | ||
|                     notification: {
 | ||
|                       poll: pollAsyncJobResult
 | ||
|                     }
 | ||
|                   },
 | ||
| 
 | ||
|                   'delete': {
 | ||
|                     label: 'Delete network',
 | ||
|                     messages: {
 | ||
|                       confirm: function(args) {
 | ||
|                         return 'Are you sure you want to delete network ?';
 | ||
|                       },
 | ||
|                       success: function(args) {
 | ||
|                         return 'Network is being deleted.';
 | ||
|                       },
 | ||
|                       notification: function(args) {
 | ||
|                         return 'Deleting network';
 | ||
|                       },
 | ||
|                       complete: function(args) {
 | ||
|                         return 'Network has been deleted.';
 | ||
|                       }
 | ||
|                     },
 | ||
|                     action: function(args) {
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("deleteNetwork&id=" + args.context.directNetworks[0].id),
 | ||
|                         dataType: "json",
 | ||
|                         async: true,
 | ||
|                         success: function(json) {
 | ||
|                           var jid = json.deletenetworkresponse.jobid;
 | ||
|                           args.response.success(
 | ||
|                             {_custom:
 | ||
|                              {jobId: jid,
 | ||
|                               getUpdatedItem: function(json) {
 | ||
|                                 return {}; //nothing in this template needs to be updated, in fact, this whole template has being deleted
 | ||
|                               },
 | ||
|                               getActionFilter: function() {
 | ||
|                                 return directNetworkActionfilter;
 | ||
|                               }
 | ||
|                              }
 | ||
|                             }
 | ||
|                           );
 | ||
|                         }
 | ||
|                       });
 | ||
|                     },
 | ||
|                     notification: {
 | ||
|                       poll: pollAsyncJobResult
 | ||
|                     }
 | ||
|                   }
 | ||
|                 },
 | ||
| 
 | ||
|                 tabs: {
 | ||
|                   details: {
 | ||
|                     title: 'Details', //direct network details
 | ||
|                     fields: [
 | ||
|                       {
 | ||
|                         name:  {
 | ||
|                           label: 'Name',
 | ||
|                           isEditable: true
 | ||
|                         }
 | ||
|                       },
 | ||
|                       {
 | ||
|                         id: { label: "ID" },
 | ||
|                         displaytext: {
 | ||
|                           label: 'Description',
 | ||
|                           isEditable: true
 | ||
|                         },
 | ||
|                         isdefault: {
 | ||
|                           label: 'Default',
 | ||
|                           converter: cloudStack.converters.toBooleanText
 | ||
|                         },
 | ||
|                         vlan: { label: 'VLAN ID' },
 | ||
|                         domain: { label: 'Domain' },
 | ||
|                         account: { label: 'Account' },
 | ||
|                         gateway: { label: 'Gateway' },
 | ||
|                         netmask: { label: 'Netmask' },
 | ||
|                         startip: { label: 'Start IP' },
 | ||
|                         endip: { label: 'End IP' },
 | ||
|                         networkdomain: {
 | ||
|                           label: 'Network domain',
 | ||
|                           isEditable: true
 | ||
|                         },
 | ||
|                         tags: {
 | ||
|                           label: 'Tags',
 | ||
|                           isEditable: true
 | ||
|                         }
 | ||
|                       }
 | ||
|                     ],
 | ||
|                     dataProvider: function(args) {
 | ||
|                       args.response.success({data: args.context.directNetworks[0]});
 | ||
|                     }
 | ||
|                   },
 | ||
|                   ipAllocations: {
 | ||
|                     title: 'IP Allocations',
 | ||
|                     multiple: true,
 | ||
|                     fields: [
 | ||
|                       {
 | ||
|                         id: { label: 'ID' },
 | ||
|                         vlan: { label: 'VLAN' },
 | ||
|                         startip: { label: 'Start IP' },
 | ||
|                         endip: { label: 'End IP' }
 | ||
|                       }
 | ||
|                     ],
 | ||
|                     dataProvider: function(args) {
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("listVlanIpRanges&zoneid="+ args.context.zones[0].id + "&networkid="+ args.context.directNetworks[0].id),
 | ||
|                         dataType: "json",
 | ||
|                         success: function(json) {
 | ||
|                           var items = json.listvlaniprangesresponse.vlaniprange;
 | ||
|                           args.response.success({data: items});
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   }
 | ||
|                 }
 | ||
|               }
 | ||
|             }
 | ||
|           }
 | ||
|         }
 | ||
|       },
 | ||
| 
 | ||
|       pods: {
 | ||
|         title: 'Pods',
 | ||
|         listView: {
 | ||
|           id: 'pods',
 | ||
|           section: 'pods',
 | ||
|           fields: {
 | ||
|             name: { label: 'Name' },
 | ||
|             gateway: { label: 'Gateway' },
 | ||
|             netmask: { label: 'Netmask' },
 | ||
|             allocationstate: { label: 'Allocation Status' }
 | ||
|           },
 | ||
| 
 | ||
|           dataProvider: function(args) {           
 | ||
|             $.ajax({
 | ||
|               url: createURL("listPods&zoneid=" + args.context.zones[0].id + "&page=" + args.page + "&pagesize=" + pageSize),
 | ||
|               dataType: "json",
 | ||
|               async: true,
 | ||
|               success: function(json) {
 | ||
|                 var items = json.listpodsresponse.pod;
 | ||
|                 args.response.success({
 | ||
|                   actionFilter: podActionfilter,
 | ||
|                   data:items
 | ||
|                 });
 | ||
|               }
 | ||
|             });
 | ||
|           },
 | ||
| 
 | ||
|           actions: {
 | ||
|             add: {
 | ||
|               label: 'Add pod',
 | ||
| 
 | ||
|               createForm: {
 | ||
|                 title: 'Add new pod',  
 | ||
|                 fields: {
 | ||
|                   podname: {
 | ||
|                     label: 'Pod name',
 | ||
|                     validation: { required: true }
 | ||
|                   },
 | ||
|                   reservedSystemGateway: {
 | ||
|                     label: 'Reserved system gateway',
 | ||
|                     validation: { required: true }
 | ||
|                   },
 | ||
|                   reservedSystemNetmask: {
 | ||
|                     label: 'Reserved system netmask',
 | ||
|                     validation: { required: true }
 | ||
|                   },
 | ||
|                   reservedSystemStartIp: {
 | ||
|                     label: 'Start Reserved system IP',
 | ||
|                     validation: { required: true }
 | ||
|                   },
 | ||
|                   reservedSystemEndIp: {
 | ||
|                     label: 'End Reserved system IP',
 | ||
|                     validation: { required: false }
 | ||
|                   }
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               action: function(args) {
 | ||
|                 var array1 = [];
 | ||
|                 array1.push("&zoneId=" + args.context.zones[0].id);
 | ||
|                 array1.push("&name=" + todb(args.data.podname));
 | ||
|                 array1.push("&gateway=" + todb(args.data.reservedSystemGateway));
 | ||
|                 array1.push("&netmask=" + todb(args.data.reservedSystemNetmask));
 | ||
|                 array1.push("&startIp=" + todb(args.data.reservedSystemStartIp));
 | ||
| 
 | ||
|                 var endip = args.data.reservedSystemEndIp;      //optional
 | ||
|                 if (endip != null && endip.length > 0)
 | ||
|                   array1.push("&endIp=" + todb(endip));                
 | ||
| 
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("createPod" + array1.join("")),
 | ||
|                   dataType: "json",
 | ||
|                   success: function(json) {
 | ||
|                     var item = json.createpodresponse.pod;
 | ||
|                     args.response.success({data:item});
 | ||
|                   },
 | ||
|                   error: function(XMLHttpResponse) {
 | ||
|                     var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                     args.response.error(errorMsg);
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
| 
 | ||
|               notification: {
 | ||
|                 poll: function(args) {
 | ||
|                   args.complete();
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               messages: {
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Added new pod';
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             enable: {
 | ||
|               label: 'Enable pod',
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Are you sure you want to enable this pod?';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'This pod is being enabled.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Enabling pod';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Pod has been enabled.';
 | ||
|                 }
 | ||
|               },
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("updatePod&id=" + args.context.pods[0].id + "&allocationstate=Enabled"),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     var item = json.updatepodresponse.pod;
 | ||
|                     args.response.success({
 | ||
|                       actionFilter: podActionfilter,
 | ||
|                       data:item
 | ||
|                     });
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: function(args) {
 | ||
|                   args.complete();
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             disable: {
 | ||
|               label: 'Disable pod',
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Are you sure you want to disable this pod?';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'This pod is being disabled.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Disabling pod';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Pod has been disabled.';
 | ||
|                 }
 | ||
|               },
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("updatePod&id=" + args.context.pods[0].id + "&allocationstate=Disabled"),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     var item = json.updatepodresponse.pod;
 | ||
|                     args.response.success({
 | ||
|                       actionFilter: podActionfilter,
 | ||
|                       data:item
 | ||
|                     });
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: function(args) {
 | ||
|                   args.complete();
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             'delete': {
 | ||
|               label: 'Delete' ,
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Please confirm that you want to delete this pod.';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'pod is being deleted.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Deleting pod';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Pod has been deleted.';
 | ||
|                 }
 | ||
|               },
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("deletePod&id=" + args.context.pods[0].id),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     args.response.success({data:{}});
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: function(args) { args.complete(); }
 | ||
|               }
 | ||
|             }
 | ||
|           },
 | ||
| 
 | ||
|           detailView: {
 | ||
|             viewAll: { path: '_zone.clusters', label: 'Clusters' },
 | ||
|             tabFilter: function(args) {
 | ||
|               var hiddenTabs = [];   
 | ||
|               if(selectedZoneObj.networktype == "Basic") { //basic-mode network (pod-wide VLAN)
 | ||
|                 //$("#tab_ipallocation, #add_iprange_button, #tab_network_device, #add_network_device_button").show();
 | ||
|               }
 | ||
|               else if(selectedZoneObj.networktype == "Advanced") { //advanced-mode network (zone-wide VLAN)
 | ||
|                 //$("#tab_ipallocation, #add_iprange_button, #tab_network_device, #add_network_device_button").hide();
 | ||
|                 hiddenTabs.push("ipAllocations");
 | ||
|                 //hiddenTabs.push("networkDevices"); //network devices tab is moved out of pod page at 3.0 UI. It will go to new network page.
 | ||
|               }
 | ||
|               return hiddenTabs;
 | ||
|             },
 | ||
|             actions: {
 | ||
|               edit: {
 | ||
|                 label: 'Edit',
 | ||
|                 action: function(args) {
 | ||
|                   var array1 = [];
 | ||
|                   array1.push("&name="  +todb(args.data.name));
 | ||
|                   array1.push("&netmask=" + todb(args.data.netmask));
 | ||
|                   array1.push("&startIp=" + todb(args.data.startip));
 | ||
|                   if(args.data.endip != null && args.data.endip.length > 0)
 | ||
|                     array1.push("&endIp=" + todb(args.data.endip));
 | ||
|                   if(args.data.gateway != null && args.data.gateway.length > 0)
 | ||
|                     array1.push("&gateway=" + todb(args.data.gateway));
 | ||
| 
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updatePod&id=" + args.context.pods[0].id + array1.join("")),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {
 | ||
|                       var item = json.updatepodresponse.pod;
 | ||
|                       args.response.success({
 | ||
|                         actionFilter: podActionfilter,
 | ||
|                         data:item
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               enable: {
 | ||
|                 label: 'Enable pod',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to enable this pod?';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'This pod is being enabled.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Enabling pod';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Pod has been enabled.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updatePod&id=" + args.context.pods[0].id + "&allocationstate=Enabled"),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var item = json.updatepodresponse.pod;
 | ||
|                       args.response.success({
 | ||
|                         actionFilter: podActionfilter,
 | ||
|                         data:item
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) {
 | ||
|                     args.complete();
 | ||
|                   }
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               disable: {
 | ||
|                 label: 'Disable pod',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to disable this pod?';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'This pod is being disabled.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Disabling pod';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Pod has been disabled.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updatePod&id=" + args.context.pods[0].id + "&allocationstate=Disabled"),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var item = json.updatepodresponse.pod;
 | ||
|                       args.response.success({
 | ||
|                         actionFilter: podActionfilter,
 | ||
|                         data:item
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) {
 | ||
|                     args.complete();
 | ||
|                   }
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               'delete': {
 | ||
|                 label: 'Delete' ,
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Please confirm that you want to delete this pod.';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'pod is being deleted.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Deleting pod';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Pod has been deleted.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("deletePod&id=" + args.context.pods[0].id),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       args.response.success({data:{}});
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) { args.complete(); }
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               //Add IP range has been moved from pod page to guest network in zone chart
 | ||
|               /*
 | ||
|               addIpRange: {
 | ||
|                 label: 'Add IP range' ,
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Please confirm that you want to add IP range to this pod';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'IP range is being added.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Adding IP range';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'IP range has been added.';
 | ||
|                   }
 | ||
|                 },
 | ||
| 
 | ||
|                 createForm: {
 | ||
|                   title: 'Add IP range',
 | ||
|                   fields: {
 | ||
|                     gateway: { label: 'Guest gateway' },
 | ||
|                     netmask: { label: 'Guest netmask' },
 | ||
|                     startip: { label: 'Guest start IP' },
 | ||
|                     endip: { label: 'Guest end IP' }
 | ||
|                   }
 | ||
|                 },
 | ||
| 
 | ||
|                 action: function(args) {
 | ||
|                   var array1 = [];
 | ||
|                   array1.push("&vlan=untagged");
 | ||
|                   array1.push("&zoneid=" + args.context.zones[0].id);
 | ||
|                   array1.push("&podId=" + args.context.pods[0].id);
 | ||
|                   array1.push("&forVirtualNetwork=false"); //direct VLAN
 | ||
|                   array1.push("&gateway=" + todb(args.data.gateway));
 | ||
|                   array1.push("&netmask=" + todb(args.data.netmask));
 | ||
|                   array1.push("&startip=" + todb(args.data.startip));
 | ||
|                   if(args.data.endip != null && args.data.endip.length > 0)
 | ||
|                     array1.push("&endip=" + todb(args.data.endip));
 | ||
| 
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("createVlanIpRange" + array1.join("")),
 | ||
|                     dataType: "json",
 | ||
|                     async: false,
 | ||
|                     success: function(json) {
 | ||
|                       var item = json.createvlaniprangeresponse.vlan;
 | ||
|                       args.response.success({data: item});
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) { args.complete(); }
 | ||
|                 }
 | ||
|               }
 | ||
|               */
 | ||
| 
 | ||
|             },
 | ||
|             tabs: {
 | ||
|               details: {
 | ||
|                 title: 'Details',
 | ||
|                 fields: [
 | ||
|                   {
 | ||
|                     name: { label: 'Name', isEditable: true },
 | ||
|                   },
 | ||
|                   {
 | ||
|                     id: { label: 'ID' },
 | ||
|                     netmask: { label: 'Netmask', isEditable: true },
 | ||
|                     startip: { label: 'Start IP Range', isEditable: true },
 | ||
|                     endip: { label: 'End IP Range', isEditable: true },
 | ||
|                     gateway: { label: 'Gateway', isEditable: true },
 | ||
|                     allocationstate: { label: 'Allocation Status' }
 | ||
|                   }
 | ||
|                 ],
 | ||
| 
 | ||
|                 dataProvider: function(args) {
 | ||
|                   args.response.success({
 | ||
|                     actionFilter: podActionfilter,
 | ||
|                     data: args.context.pods[0]
 | ||
|                   });
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               ipAllocations: {
 | ||
|                 title: 'IP Allocations',
 | ||
|                 multiple: true,
 | ||
|                 fields: [
 | ||
|                   {
 | ||
|                     id: { label: 'ID' },                    
 | ||
|                     gateway: { label: 'Gateway' },
 | ||
|                     netmask: { label: 'Netmask' },
 | ||
|                     startip: { label: 'Start IP range' },
 | ||
|                     endip: { label: 'End IP range' }
 | ||
|                   }
 | ||
|                 ],
 | ||
|                 dataProvider: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("listVlanIpRanges&zoneid=" + args.context.zones[0].id + "&podid=" + args.context.pods[0].id),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {
 | ||
|                       var items = json.listvlaniprangesresponse.vlaniprange;
 | ||
|                       args.response.success({data: items});
 | ||
|                     }
 | ||
|                   });
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               //network devices tab is moved out of pod page at 3.0 UI. It will go to new network page.
 | ||
|               /*
 | ||
|               networkDevices: {
 | ||
|                 title: 'Network devices',
 | ||
|                 multiple: true,
 | ||
| 
 | ||
|                 //preFilter won't work until Brian fix Bug #155
 | ||
|                 preFilter: function(args) {
 | ||
|                   var networkDeviceObj = args.context.networkDevices[0];
 | ||
| 
 | ||
|                   var hiddenFields;
 | ||
|                   if(networkDeviceObj.pingstorageserverip == null || networkDeviceObj.pingstorageserverip.length == 0)
 | ||
|                     hiddenFields.push("pingstorageserverip");
 | ||
|                   if(networkDeviceObj.pingdir == null || networkDeviceObj.pingdir.length == 0)
 | ||
|                     hiddenFields.push("pingdir");
 | ||
|                   if(networkDeviceObj.tftpdir == null || networkDeviceObj.tftpdir.length == 0)
 | ||
|                     hiddenFields.push("tftpdir");
 | ||
| 
 | ||
|                   return hiddenFields;
 | ||
|                 },
 | ||
| 
 | ||
| 
 | ||
|                 fields: [
 | ||
|                   {
 | ||
|                     id: { label: 'ID' },
 | ||
|                     url: { label: 'URL' },
 | ||
|                     type: { label: 'Type' },
 | ||
|                     pingstorageserverip: { label: 'PING storage IP' },
 | ||
|                     pingdir: { label: 'PING directory' },
 | ||
|                     tftpdir: { label: 'TFTP directory' }
 | ||
|                   }
 | ||
|                 ],
 | ||
|                 dataProvider: function(args) {
 | ||
|                   var array1 = [];
 | ||
|                   array1.push("&networkdeviceparameterlist[0].zoneid=" + args.context.pods[0].zoneid);
 | ||
| 	                array1.push("&networkdeviceparameterlist[0].podid=" + args.context.pods[0].id);
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("listNetworkDevice" + array1.join("")),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {
 | ||
|                       var items = json.listnetworkdevice.networkdevice;
 | ||
|                       args.response.success({
 | ||
|                         actionFilter: networkDeviceActionfilter,
 | ||
|                         data: items
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 }
 | ||
|               }
 | ||
|               */
 | ||
|             }
 | ||
|           }
 | ||
|         }
 | ||
|       },
 | ||
|       clusters: {
 | ||
|         title: 'Clusters',
 | ||
|         listView: {
 | ||
|           id: 'clusters',
 | ||
|           section: 'clusters',
 | ||
|           fields: {
 | ||
|             name: { label: 'Name' },
 | ||
|             podname: { label: 'Pod' },
 | ||
|             hypervisortype: { label: 'Hypervisor' },
 | ||
|             allocationstate: { label: 'Allocation State' },
 | ||
|             managedstate: { label: 'Managed State' }
 | ||
|           },
 | ||
|          
 | ||
|           dataProvider: function(args) {  
 | ||
|             var array1 = [];
 | ||
|             array1.push("&zoneid=" + args.context.zones[0].id);
 | ||
|             if("pods" in args.context)
 | ||
|               array1.push("&podid=" + args.context.pods[0].id);            
 | ||
|             $.ajax({
 | ||
|               url: createURL("listClusters" + array1.join("") + "&page=" + args.page + "&pagesize=" + pageSize),
 | ||
|               dataType: "json",
 | ||
|               async: true,
 | ||
|               success: function(json) {
 | ||
|                 var items = json.listclustersresponse.cluster;
 | ||
|                 args.response.success({
 | ||
|                   actionFilter: clusterActionfilter,
 | ||
|                   data:items
 | ||
|                 });
 | ||
|               }
 | ||
|             });
 | ||
|           },
 | ||
| 
 | ||
|           actions: {
 | ||
|             add: {
 | ||
|               label: 'Add cluster',
 | ||
| 
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Are you sure you want to add a cluster?';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'Your new cluster is being created.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Creating new cluster';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Cluster has been created successfully!';
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               createForm: {
 | ||
|                 title: 'Add cluster',
 | ||
|                 desc: 'Please fill in the following data to add a new cluster.',
 | ||
|                 fields: {
 | ||
|                   hypervisor: {
 | ||
|                     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('.form-item[rel=vCenterHost]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=vCenterUsername]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=vCenterPassword]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=vCenterDatacenter]').css('display', 'inline-block');
 | ||
| 
 | ||
|                           //$("#cluster_name_label", $dialogAddCluster).text("vCenter Cluster:");
 | ||
|                         }
 | ||
|                         else {
 | ||
|                           //$('li[input_group="vmware"]', $dialogAddCluster).hide();
 | ||
|                           $form.find('.form-item[rel=vCenterHost]').css('display', 'none');
 | ||
|                           $form.find('.form-item[rel=vCenterUsername]').css('display', 'none');
 | ||
|                           $form.find('.form-item[rel=vCenterPassword]').css('display', 'none');
 | ||
|                           $form.find('.form-item[rel=vCenterDatacenter]').css('display', 'none');
 | ||
| 
 | ||
|                           //$("#cluster_name_label", $dialogAddCluster).text("Cluster:");
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   },
 | ||
|                   podId: {
 | ||
|                     label: 'Pod',
 | ||
|                     select: function(args) {
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("listPods&zoneid=" + args.context.zones[0].id),
 | ||
|                         dataType: "json",
 | ||
|                         async: true,
 | ||
|                         success: function(json) {
 | ||
|                           var pods = json.listpodsresponse.pod;
 | ||
|                           var items = [];
 | ||
|                           $(pods).each(function() {
 | ||
|                             items.push({id: this.id, description: this.name});
 | ||
|                           });
 | ||
|                           args.response.success({data: items});
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   },
 | ||
|                   name: {
 | ||
|                     label: 'Cluster Name',
 | ||
|                     validation: { required: true }
 | ||
|                   },
 | ||
| 
 | ||
|                   //hypervisor==VMWare begins here
 | ||
|                   vCenterHost: {
 | ||
|                     label: 'vCenter Host',
 | ||
|                     validation: { required: true }
 | ||
|                   },
 | ||
|                   vCenterUsername: {
 | ||
|                     label: 'vCenter Username',
 | ||
|                     validation: { required: true }
 | ||
|                   },
 | ||
|                   vCenterPassword: {
 | ||
|                     label: 'vCenter Password',
 | ||
|                     validation: { required: true },
 | ||
|                     isPassword: true
 | ||
|                   },
 | ||
|                   vCenterDatacenter: {
 | ||
|                     label: 'vCenter Datacenter',
 | ||
|                     validation: { required: true }
 | ||
|                   }
 | ||
|                   //hypervisor==VMWare ends here
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               action: function(args) {
 | ||
|                 var array1 = [];
 | ||
|                 array1.push("&zoneId=" + args.context.zones[0].id);
 | ||
|                 array1.push("&hypervisor=" + args.data.hypervisor);
 | ||
|                 array1.push("&clustertype=CloudManaged");
 | ||
|                 array1.push("&podId=" + args.data.podId);
 | ||
| 
 | ||
|                 var clusterName = args.data.name;
 | ||
|                 if(args.data.hypervisor == "VMware") {
 | ||
|                   array1.push("&username=" + todb(args.data.vCenterUsername));
 | ||
|                   array1.push("&password=" + todb(args.data.vCenterPassword));
 | ||
| 
 | ||
|                   var hostname = args.data.vCenterHost;
 | ||
|                   var dcName = args.data.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) {
 | ||
|                     var item = json.addclusterresponse.cluster[0];
 | ||
|                     args.response.success({data: item});
 | ||
|                   },
 | ||
|                   error: function(XMLHttpResponse) {
 | ||
|                     var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                     args.response.error(errorMsg);
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
| 
 | ||
|               notification: {
 | ||
|                 poll: function(args) {
 | ||
|                   args.complete();
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             enable: {
 | ||
|               label: 'Enable cluster',
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Are you sure you want to enable this cluster?';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'This cluster is being enabled.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Enabling cluster';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Cluster has been enabled.';
 | ||
|                 }
 | ||
|               },
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&allocationstate=Enabled"),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     var item = json.updateclusterresponse.cluster;
 | ||
|                     args.response.success({
 | ||
|                       actionFilter: clusterActionfilter,
 | ||
|                       data:item
 | ||
|                     });
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: function(args) {
 | ||
|                   args.complete();
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             disable: {
 | ||
|               label: 'Disable cluster',
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Are you sure you want to disable this cluster?';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'This cluster is being disabled.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Disabling cluster';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Cluster has been disabled.';
 | ||
|                 }
 | ||
|               },
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&allocationstate=Disabled"),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     var item = json.updateclusterresponse.cluster;
 | ||
|                     args.response.success({
 | ||
|                       actionFilter: clusterActionfilter,
 | ||
|                       data:item
 | ||
|                     });
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: function(args) {
 | ||
|                   args.complete();
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             manage: {
 | ||
|               label: 'Manage cluster',
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Are you sure you want to manage this cluster?';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'This cluster is being managed.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Managing cluster';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Cluster has been managed.';
 | ||
|                 }
 | ||
|               },
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&managedstate=Managed"),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     var item = json.updateclusterresponse.cluster;
 | ||
|                     args.response.success({
 | ||
|                       actionFilter: clusterActionfilter,
 | ||
|                       data:item
 | ||
|                     });
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: function(args) {
 | ||
|                   args.complete();
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             unmanage: {
 | ||
|               label: 'Unmanage cluster',
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Are you sure you want to unmanage this cluster?';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'This cluster is being unmanaged.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Unmanaging cluster';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Cluster has been unmanaged.';
 | ||
|                 }
 | ||
|               },
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&managedstate=Unmanaged"),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     var item = json.updateclusterresponse.cluster;
 | ||
|                     args.response.success({
 | ||
|                       actionFilter: clusterActionfilter,
 | ||
|                       data:item
 | ||
|                     });
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: function(args) {
 | ||
|                   args.complete();
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             'delete': {
 | ||
|               label: 'Delete' ,
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Please confirm that you want to delete this cluster.';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'Cluster is being deleted.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Deleting cluster';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Cluster has been deleted.';
 | ||
|                 }
 | ||
|               },
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("deleteCluster&id=" + args.context.clusters[0].id),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     args.response.success({data:{}});
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: function(args) { args.complete(); }
 | ||
|               }
 | ||
|             }
 | ||
| 
 | ||
|           },
 | ||
|           detailView: {
 | ||
|             viewAll: { path: '_zone.hosts', label: 'Hosts' },
 | ||
| 
 | ||
|             actions: {
 | ||
|               enable: {
 | ||
|                 label: 'Enable cluster',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to enable this cluster?';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'This cluster is being enabled.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Enabling cluster';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Cluster has been enabled.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&allocationstate=Enabled"),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var item = json.updateclusterresponse.cluster;
 | ||
|                       args.response.success({
 | ||
|                         actionFilter: clusterActionfilter,
 | ||
|                         data:item
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) {
 | ||
|                     args.complete();
 | ||
|                   }
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               disable: {
 | ||
|                 label: 'Disable cluster',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to disable this cluster?';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'This cluster is being disabled.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Disabling cluster';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Cluster has been disabled.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&allocationstate=Disabled"),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var item = json.updateclusterresponse.cluster;
 | ||
|                       args.response.success({
 | ||
|                         actionFilter: clusterActionfilter,
 | ||
|                         data:item
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) {
 | ||
|                     args.complete();
 | ||
|                   }
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               manage: {
 | ||
|                 label: 'Manage cluster',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to manage this cluster?';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'This cluster is being managed.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Managing cluster';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Cluster has been managed.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&managedstate=Managed"),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var item = json.updateclusterresponse.cluster;
 | ||
|                       args.response.success({
 | ||
|                         actionFilter: clusterActionfilter,
 | ||
|                         data:item
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) {
 | ||
|                     args.complete();
 | ||
|                   }
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               unmanage: {
 | ||
|                 label: 'Unmanage cluster',
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Are you sure you want to unmanage this cluster?';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'This cluster is being unmanaged.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Unmanaging cluster';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Cluster has been unmanaged.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&managedstate=Unmanaged"),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var item = json.updateclusterresponse.cluster;
 | ||
|                       args.response.success({
 | ||
|                         actionFilter: clusterActionfilter,
 | ||
|                         data:item
 | ||
|                       });
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) {
 | ||
|                     args.complete();
 | ||
|                   }
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               'delete': {
 | ||
|                 label: 'Delete' ,
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Please confirm that you want to delete this cluster.';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'Cluster is being deleted.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Deleting cluster';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Cluster has been deleted.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("deleteCluster&id=" + args.context.clusters[0].id),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       args.response.success({data:{}});
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) { args.complete(); }
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             tabs: {
 | ||
|               details: {
 | ||
|                 title: 'Details',
 | ||
|                 fields: [
 | ||
|                   {
 | ||
|                     name: { label: 'Name' },
 | ||
|                   },
 | ||
|                   {
 | ||
|                     id: { label: 'ID' },
 | ||
|                     zonename: { label: 'Zone' },
 | ||
|                     podname: { label: 'Pod' },
 | ||
|                     hypervisortype: { label: 'Hypervisor' },
 | ||
|                     clustertype: { label: 'Clulster type' },
 | ||
|                     allocationstate: { label: 'Allocation State' },
 | ||
|                     managedstate: { label: 'Managed State' }
 | ||
|                   }
 | ||
|                 ],
 | ||
| 
 | ||
|                 //dataProvider: testData.dataProvider.detailView('clusters')
 | ||
|                 dataProvider: function(args) {
 | ||
|                   args.response.success({
 | ||
|                     actionFilter: clusterActionfilter,
 | ||
|                     data: args.context.clusters[0]
 | ||
|                   });
 | ||
|                 }
 | ||
|               }
 | ||
|             }
 | ||
|           }
 | ||
|         }
 | ||
|       },
 | ||
|       hosts: {
 | ||
|         title: 'Hosts',
 | ||
|         id: 'hosts',
 | ||
|         listView: {
 | ||
|           section: 'hosts',
 | ||
|           id: 'hosts',
 | ||
|           fields: {
 | ||
|             name: { label: 'Name' },
 | ||
|             zonename: { label: 'Zone' },
 | ||
|             podname: { label: 'Pod' },
 | ||
|             clustername: { label: 'Cluster' }
 | ||
|           },
 | ||
|           
 | ||
|           dataProvider: function(args) { 
 | ||
|             var array1 = [];
 | ||
|             array1.push("&zoneid=" + args.context.zones[0].id);            
 | ||
|             if("pods" in args.context)
 | ||
|               array1.push("&podid=" + args.context.pods[0].id);
 | ||
|             if("clusters" in args.context)
 | ||
|               array1.push("&clusterid=" + args.context.clusters[0].id);          
 | ||
|             $.ajax({
 | ||
|               url: createURL("listHosts&type=Routing" + array1.join("") + "&page=" + args.page + "&pagesize=" + pageSize),
 | ||
|               dataType: "json",
 | ||
|               async: true,
 | ||
|               success: function(json) {
 | ||
|                 var items = json.listhostsresponse.host;
 | ||
|                 args.response.success({
 | ||
|                   actionFilter: hostActionfilter,
 | ||
|                   data: items
 | ||
|                 });
 | ||
|               }
 | ||
|             });
 | ||
|           },
 | ||
| 
 | ||
|           actions: {
 | ||
|             add: {
 | ||
|               label: 'Add host',
 | ||
| 
 | ||
|               createForm: {
 | ||
|                 title: 'Add new host',
 | ||
|                 desc: 'Please fill in the following information to add a new host fro the specified zone configuration.',
 | ||
|                 fields: {
 | ||
|                   //always appear (begin)
 | ||
|                   podId: {
 | ||
|                     label: 'Pod',
 | ||
|                     validation: { required: true },
 | ||
|                     select: function(args) {
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("listPods&zoneid=" + args.context.zones[0].id),
 | ||
|                         dataType: "json",
 | ||
|                         async: true,
 | ||
|                         success: function(json) {
 | ||
|                           var pods = json.listpodsresponse.pod;
 | ||
|                           var items = [];
 | ||
|                           $(pods).each(function() {
 | ||
|                             items.push({id: this.id, description: this.name});
 | ||
|                           });
 | ||
|                           args.response.success({data: items});
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   },
 | ||
| 
 | ||
|                   clusterId: {
 | ||
|                     label: 'Cluster',
 | ||
|                     validation: { required: true },
 | ||
|                     dependsOn: 'podId',
 | ||
|                     select: function(args) {
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("listClusters&podid=" + args.podId),
 | ||
|                         dataType: "json",
 | ||
|                         async: false,
 | ||
|                         success: function(json) {
 | ||
|                           clusterObjs = json.listclustersresponse.cluster;
 | ||
|                           var items = [];
 | ||
|                           $(clusterObjs).each(function() {
 | ||
|                             items.push({id: this.id, description: this.name});
 | ||
|                           });
 | ||
|                           args.response.success({data: items});
 | ||
|                         }
 | ||
|                       });
 | ||
| 
 | ||
|                       args.$select.change(function() {
 | ||
|                         var $form = $(this).closest('form');
 | ||
| 
 | ||
|                         var clusterId = $(this).val();
 | ||
|                         if(clusterId == null)
 | ||
|                           return;
 | ||
| 
 | ||
|                         var items = [];
 | ||
|                         $(clusterObjs).each(function(){
 | ||
|                           if(this.id == clusterId){
 | ||
|                             selectedClusterObj = this;
 | ||
|                             return false; //break the $.each() loop
 | ||
|                           }
 | ||
|                         });
 | ||
|                         if(selectedClusterObj == null)
 | ||
|                           return;
 | ||
| 
 | ||
|                         if(selectedClusterObj.hypervisortype == "VMware") {
 | ||
|                           //$('li[input_group="general"]', $dialogAddHost).hide();
 | ||
|                           $form.find('.form-item[rel=hostname]').hide();
 | ||
|                           $form.find('.form-item[rel=username]').hide();
 | ||
|                           $form.find('.form-item[rel=password]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="vmware"]', $dialogAddHost).show();
 | ||
|                           $form.find('.form-item[rel=vcenterHost]').css('display', 'inline-block');
 | ||
| 
 | ||
|                           //$('li[input_group="baremetal"]', $dialogAddHost).hide();
 | ||
|                           $form.find('.form-item[rel=baremetalCpuCores]').hide();
 | ||
|                           $form.find('.form-item[rel=baremetalCpu]').hide();
 | ||
|                           $form.find('.form-item[rel=baremetalMemory]').hide();
 | ||
|                           $form.find('.form-item[rel=baremetalMAC]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="Ovm"]', $dialogAddHost).hide();
 | ||
|                           $form.find('.form-item[rel=agentUsername]').hide();
 | ||
|                           $form.find('.form-item[rel=agentPassword]').hide();
 | ||
|                         }
 | ||
|                         else if (selectedClusterObj.hypervisortype == "BareMetal") {
 | ||
|                           //$('li[input_group="general"]', $dialogAddHost).show();
 | ||
|                           $form.find('.form-item[rel=hostname]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=username]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=password]').css('display', 'inline-block');
 | ||
| 
 | ||
|                           //$('li[input_group="baremetal"]', $dialogAddHost).show();
 | ||
|                           $form.find('.form-item[rel=baremetalCpuCores]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=baremetalCpu]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=baremetalMemory]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=baremetalMAC]').css('display', 'inline-block');
 | ||
| 
 | ||
|                           //$('li[input_group="vmware"]', $dialogAddHost).hide();
 | ||
|                           $form.find('.form-item[rel=vcenterHost]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="Ovm"]', $dialogAddHost).hide();
 | ||
|                           $form.find('.form-item[rel=agentUsername]').hide();
 | ||
|                           $form.find('.form-item[rel=agentPassword]').hide();
 | ||
|                         }
 | ||
|                         else if (selectedClusterObj.hypervisortype == "Ovm") {
 | ||
|                           //$('li[input_group="general"]', $dialogAddHost).show();
 | ||
|                           $form.find('.form-item[rel=hostname]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=username]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=password]').css('display', 'inline-block');
 | ||
| 
 | ||
|                           //$('li[input_group="vmware"]', $dialogAddHost).hide();
 | ||
|                           $form.find('.form-item[rel=vcenterHost]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="baremetal"]', $dialogAddHost).hide();
 | ||
|                           $form.find('.form-item[rel=baremetalCpuCores]').hide();
 | ||
|                           $form.find('.form-item[rel=baremetalCpu]').hide();
 | ||
|                           $form.find('.form-item[rel=baremetalMemory]').hide();
 | ||
|                           $form.find('.form-item[rel=baremetalMAC]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="Ovm"]', $dialogAddHost).show();
 | ||
|                           $form.find('.form-item[rel=agentUsername]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=agentUsername]').find('input').val("oracle");
 | ||
|                           $form.find('.form-item[rel=agentPassword]').css('display', 'inline-block');
 | ||
|                         }
 | ||
|                         else {
 | ||
|                           //$('li[input_group="general"]', $dialogAddHost).show();
 | ||
|                           $form.find('.form-item[rel=hostname]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=username]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=password]').css('display', 'inline-block');
 | ||
| 
 | ||
|                           //$('li[input_group="vmware"]', $dialogAddHost).hide();
 | ||
|                           $form.find('.form-item[rel=vcenterHost]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="baremetal"]', $dialogAddHost).hide();
 | ||
|                           $form.find('.form-item[rel=baremetalCpuCores]').hide();
 | ||
|                           $form.find('.form-item[rel=baremetalCpu]').hide();
 | ||
|                           $form.find('.form-item[rel=baremetalMemory]').hide();
 | ||
|                           $form.find('.form-item[rel=baremetalMAC]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="Ovm"]', $dialogAddHost).hide();
 | ||
|                           $form.find('.form-item[rel=agentUsername]').hide();
 | ||
|                           $form.find('.form-item[rel=agentPassword]').hide();
 | ||
|                         }
 | ||
|                       });
 | ||
| 
 | ||
|                       args.$select.trigger("change");
 | ||
|                     }
 | ||
|                   },
 | ||
|                   //always appear (end)
 | ||
| 
 | ||
|                   //input_group="general" starts here
 | ||
|                   hostname: {
 | ||
|                     label: 'Host name',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true
 | ||
|                   },
 | ||
| 
 | ||
|                   username: {
 | ||
|                     label: 'User name',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true
 | ||
|                   },
 | ||
| 
 | ||
|                   password: {
 | ||
|                     label: 'Password',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true,
 | ||
|                     isPassword: true
 | ||
|                   },
 | ||
|                   //input_group="general" ends here
 | ||
| 
 | ||
|                   //input_group="VMWare" starts here
 | ||
|                   vcenterHost: {
 | ||
|                     label: 'ESX/ESXi Host',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true
 | ||
|                   },
 | ||
|                   //input_group="VMWare" ends here
 | ||
| 
 | ||
|                   //input_group="BareMetal" starts here
 | ||
|                   baremetalCpuCores: {
 | ||
|                     label: '# of CPU Cores',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true
 | ||
|                   },
 | ||
|                   baremetalCpu: {
 | ||
|                     label: 'CPU (in MHz)',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true
 | ||
|                   },
 | ||
|                   baremetalMemory: {
 | ||
|                     label: 'Memory (in MB)',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true
 | ||
|                   },
 | ||
|                   baremetalMAC: {
 | ||
|                     label: 'Host MAC',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true
 | ||
|                   },
 | ||
|                   //input_group="BareMetal" ends here
 | ||
| 
 | ||
|                   //input_group="OVM" starts here
 | ||
|                   agentUsername: {
 | ||
|                     label: 'Agent Username',
 | ||
|                     validation: { required: false },
 | ||
|                     isHidden: true
 | ||
|                   },
 | ||
|                   agentPassword: {
 | ||
|                     label: 'Agent Password',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true,
 | ||
|                     isPassword: true
 | ||
|                   },
 | ||
|                   //input_group="OVM" ends here
 | ||
| 
 | ||
|                   //always appear (begin)
 | ||
|                   hosttags: {
 | ||
|                     label: 'Host tags',
 | ||
|                     validation: { required: false }
 | ||
|                   }
 | ||
|                   //always appear (end)
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               action: function(args) {
 | ||
|                 var array1 = [];
 | ||
|                 array1.push("&zoneid=" + args.context.zones[0].id);
 | ||
|                 array1.push("&podid=" + args.data.podId);
 | ||
|                 array1.push("&clusterid=" + args.data.clusterId);
 | ||
|                 array1.push("&hypervisor=" + todb(selectedClusterObj.hypervisortype));
 | ||
|                 var clustertype = selectedClusterObj.clustertype;
 | ||
|                 array1.push("&clustertype=" + todb(clustertype));
 | ||
|                 array1.push("&hosttags=" + todb(args.data.hosttags));
 | ||
| 
 | ||
|                 if(selectedClusterObj.hypervisortype == "VMware") {
 | ||
|                   array1.push("&username=");
 | ||
|                   array1.push("&password=");
 | ||
|                   var hostname = args.data.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.username));
 | ||
|                   array1.push("&password=" + todb(args.data.password));
 | ||
| 
 | ||
|                   var hostname = args.data.hostname;
 | ||
| 
 | ||
|                   var url;
 | ||
|                   if(hostname.indexOf("http://")==-1)
 | ||
|                     url = "http://" + hostname;
 | ||
|                   else
 | ||
|                     url = hostname;
 | ||
|                   array1.push("&url="+todb(url));
 | ||
| 
 | ||
|                   if (selectedClusterObj.hypervisortype == "BareMetal") {
 | ||
|                     array1.push("&cpunumber=" + todb(args.data.baremetalCpuCores));
 | ||
|                     array1.push("&cpuspeed=" + todb(args.data.baremetalCpu));
 | ||
|                     array1.push("&memory=" + todb(args.data.baremetalMemory));
 | ||
|                     array1.push("&hostmac=" + todb(args.data.baremetalMAC));
 | ||
|                   }
 | ||
|                   else if(selectedClusterObj.hypervisortype == "Ovm") {
 | ||
|                     array1.push("&agentusername=" + todb(args.data.agentUsername));
 | ||
|                     array1.push("&agentpassword=" + todb(args.data.agentPassword));
 | ||
|                   }
 | ||
|                 }
 | ||
| 
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("addHost" + array1.join("")),
 | ||
|                   dataType: "json",
 | ||
|                   success: function(json) {
 | ||
|                     var item = json.addhostresponse.host[0];
 | ||
|                     args.response.success({data: item});
 | ||
|                   },
 | ||
|                   error: function(XMLHttpResponse) {
 | ||
|                     var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                     args.response.error(errorMsg);
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
| 
 | ||
|               notification: {
 | ||
|                 poll: function(args){
 | ||
|                   args.complete();
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               messages: {
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Added new host';
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             enableMaintenanceMode: {
 | ||
|               label: 'Enable Maintenace' ,
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("prepareHostForMaintenance&id=" + args.context.hosts[0].id),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     var jid = json.preparehostformaintenanceresponse.jobid;
 | ||
|                     args.response.success(
 | ||
|                       {_custom:
 | ||
|                        {jobId: jid,
 | ||
|                         getUpdatedItem: function(json) {
 | ||
|                           return json.queryasyncjobresultresponse.jobresult.host;
 | ||
|                         },
 | ||
|                         getActionFilter: function() {
 | ||
|                           return hostActionfilter;
 | ||
|                         }
 | ||
|                        }
 | ||
|                       }
 | ||
|                     );
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Enabling maintenance mode will cause a live migration of all running instances on this host to any available host.';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'Maintenance is being enabled.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Enabling maintenance';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Maintenance has been enabled.';
 | ||
|                 }
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: pollAsyncJobResult
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             cancelMaintenanceMode: {
 | ||
|               label: 'Cancel Maintenace' ,
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("cancelHostMaintenance&id=" + args.context.hosts[0].id),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     var jid = json.cancelhostmaintenanceresponse.jobid;
 | ||
|                     args.response.success(
 | ||
|                       {_custom:
 | ||
|                        {jobId: jid,
 | ||
|                         getUpdatedItem: function(json) {
 | ||
|                           return json.queryasyncjobresultresponse.jobresult.host;
 | ||
|                         },
 | ||
|                         getActionFilter: function() {
 | ||
|                           return hostActionfilter;
 | ||
|                         }
 | ||
|                        }
 | ||
|                       }
 | ||
|                     );
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Please confirm that you want to cancel this maintenance.';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'Maintenance is being cancelled.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Cancelling maintenance';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Maintenance has been cancelled.';
 | ||
|                 }
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: pollAsyncJobResult
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             forceReconnect: {
 | ||
|               label: 'Force Reconnect' ,
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("reconnectHost&id=" + args.context.hosts[0].id),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     var jid = json.reconnecthostresponse.jobid;
 | ||
|                     args.response.success(
 | ||
|                       {_custom:
 | ||
|                        {jobId: jid,
 | ||
|                         getUpdatedItem: function(json) {
 | ||
|                           return json.queryasyncjobresultresponse.jobresult.host;
 | ||
|                         },
 | ||
|                         getActionFilter: function() {
 | ||
|                           return hostActionfilter;
 | ||
|                         }
 | ||
|                        }
 | ||
|                       }
 | ||
|                     );
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Please confirm that you want to force reconnect this host.';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'Host is being force reconnected.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Force reconnecting host';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Host has been force reconnected.';
 | ||
|                 }
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: pollAsyncJobResult
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             'delete': {
 | ||
|               label: 'Remove host' ,
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Please confirm that you want to remove this host.';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'Host is being removed.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Removing host';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Host has been removed.';
 | ||
|                 }
 | ||
|               },
 | ||
|               preFilter: function(args) {
 | ||
|                 if(isAdmin()) {
 | ||
|                   args.$form.find('.form-item[rel=isForced]').css('display', 'inline-block');
 | ||
|                 }
 | ||
|               },
 | ||
|               createForm: {
 | ||
|                 title: 'Remove host',
 | ||
|                 fields: {
 | ||
|                   isForced: {
 | ||
|                     label: 'Force Remove',
 | ||
|                     isBoolean: true,
 | ||
|                     isHidden: true
 | ||
|                   }
 | ||
|                 }
 | ||
|               },
 | ||
|               action: function(args) {
 | ||
|                 var array1 = [];
 | ||
|                 //if(args.$form.find('.form-item[rel=isForced]').css("display") != "none") //uncomment after Brian fix it to include $form in args
 | ||
|                 array1.push("&forced=" + (args.data.isForced == "on"));
 | ||
| 
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("deleteHost&id=" + args.context.hosts[0].id + array1.join("")),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     //{ "deletehostresponse" : { "success" : "true"}  }
 | ||
|                     args.response.success({data:{}});
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: function(args) { args.complete(); }
 | ||
|               }
 | ||
|             }
 | ||
| 
 | ||
|           },
 | ||
|           detailView: {
 | ||
|             name: "Host details",
 | ||
|             actions: {
 | ||
|               edit: {
 | ||
|                 label: 'Edit',
 | ||
|                 action: function(args) {
 | ||
|                   var array1 = [];
 | ||
|                   array1.push("&hosttags=" + todb(args.data.hosttags));
 | ||
| 
 | ||
|                   if (args.data.oscategoryid != null)
 | ||
|                     array1.push("&osCategoryId=" + args.data.oscategoryid);
 | ||
|                   else //OS is none
 | ||
|                     array1.push("&osCategoryId=0");
 | ||
| 
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("updateHost&id=" + args.context.hosts[0].id + array1.join("")),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {
 | ||
|                       var item = json.updatehostresponse.host;
 | ||
|                       args.response.success({
 | ||
|                         actionFilter: hostActionfilter,
 | ||
|                         data:item});
 | ||
|                     }
 | ||
|                   });
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               enableMaintenanceMode: {
 | ||
|                 label: 'Enable Maintenace' ,
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("prepareHostForMaintenance&id=" + args.context.hosts[0].id),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jid = json.preparehostformaintenanceresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                          {jobId: jid,
 | ||
|                           getUpdatedItem: function(json) {
 | ||
|                             return json.queryasyncjobresultresponse.jobresult.host;
 | ||
|                           },
 | ||
|                           getActionFilter: function() {
 | ||
|                             return hostActionfilter;
 | ||
|                           }
 | ||
|                          }
 | ||
|                         }
 | ||
|                       );
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Enabling maintenance mode will cause a live migration of all running instances on this host to any available host.';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'Maintenance is being enabled.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Enabling maintenance';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Maintenance has been enabled.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               cancelMaintenanceMode: {
 | ||
|                 label: 'Cancel Maintenace' ,
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("cancelHostMaintenance&id=" + args.context.hosts[0].id),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jid = json.cancelhostmaintenanceresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                          {jobId: jid,
 | ||
|                           getUpdatedItem: function(json) {
 | ||
|                             return json.queryasyncjobresultresponse.jobresult.host;
 | ||
|                           },
 | ||
|                           getActionFilter: function() {
 | ||
|                             return hostActionfilter;
 | ||
|                           }
 | ||
|                          }
 | ||
|                         }
 | ||
|                       );
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Please confirm that you want to cancel this maintenance.';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'Maintenance is being cancelled.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Cancelling maintenance';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Maintenance has been cancelled.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               forceReconnect: {
 | ||
|                 label: 'Force Reconnect' ,
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("reconnectHost&id=" + args.context.hosts[0].id),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jid = json.reconnecthostresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                          {jobId: jid,
 | ||
|                           getUpdatedItem: function(json) {
 | ||
|                             return json.queryasyncjobresultresponse.jobresult.host;
 | ||
|                           },
 | ||
|                           getActionFilter: function() {
 | ||
|                             return hostActionfilter;
 | ||
|                           }
 | ||
|                          }
 | ||
|                         }
 | ||
|                       );
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Please confirm that you want to force reconnect this host.';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'Host is being force reconnected.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Force reconnecting host';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Host has been force reconnected.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               'delete': {
 | ||
|                 label: 'Remove host' ,
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Please confirm that you want to remove this host.';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'Host is being removed.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Removing host';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Host has been removed.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 preFilter: function(args) {
 | ||
|                   if(isAdmin()) {
 | ||
|                     args.$form.find('.form-item[rel=isForced]').css('display', 'inline-block');
 | ||
|                   }
 | ||
|                 },
 | ||
|                 createForm: {
 | ||
|                   title: 'Remove host',
 | ||
|                   fields: {
 | ||
|                     isForced: {
 | ||
|                       label: 'Force Remove',
 | ||
|                       isBoolean: true,
 | ||
|                       isHidden: true
 | ||
|                     }
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   var array1 = [];
 | ||
|                   //if(args.$form.find('.form-item[rel=isForced]').css("display") != "none") //uncomment after Brian fix it to include $form in args
 | ||
|                   array1.push("&forced=" + (args.data.isForced == "on"));
 | ||
| 
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("deleteHost&id=" + args.context.hosts[0].id + array1.join("")),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       //{ "deletehostresponse" : { "success" : "true"}  }
 | ||
|                       args.response.success({data:{}});
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) { args.complete(); }
 | ||
|                 }
 | ||
|               }
 | ||
| 
 | ||
|             },
 | ||
|             tabs: {
 | ||
|               details: {
 | ||
|                 title: 'Details',
 | ||
|                 fields: [
 | ||
|                   {
 | ||
|                     name: { label: 'Name' },
 | ||
|                   },
 | ||
|                   {
 | ||
|                     id: { label: 'ID' },
 | ||
|                     state: { label: 'State' },
 | ||
|                     type: { label: 'Type' },
 | ||
|                     zonename: { label: 'Zone' },
 | ||
|                     podname: { label: 'Pod' },
 | ||
|                     clustername: { label: 'Cluster' },
 | ||
|                     ipaddress: { label: 'IP Address' },
 | ||
|                     version: { label: 'Version' },
 | ||
|                     hosttags: {
 | ||
|                       label: 'Host tags',
 | ||
|                       isEditable: true
 | ||
|                     },
 | ||
|                     oscategoryid: {
 | ||
|                       label: 'OS Preference',
 | ||
|                       isEditable: true,
 | ||
|                       select: function(args) {
 | ||
|                         $.ajax({
 | ||
|                           url: createURL("listOsCategories"),
 | ||
|                           dataType: "json",
 | ||
|                           async: true,
 | ||
|                           success: function(json) {
 | ||
|                             var oscategoryObjs = json.listoscategoriesresponse.oscategory;
 | ||
|                             var items = [];
 | ||
|                             $(oscategoryObjs).each(function() {
 | ||
|                               items.push({id: this.id, description: this.name});
 | ||
|                             });
 | ||
|                             args.response.success({data: items});
 | ||
|                           }
 | ||
|                         });
 | ||
|                       }
 | ||
|                     },
 | ||
|                     disconnected: { label: 'Last disconnected' }
 | ||
|                   }
 | ||
|                 ],
 | ||
| 
 | ||
|                 dataProvider: function(args) {
 | ||
|                   args.response.success({
 | ||
|                     actionFilter: hostActionfilter,
 | ||
|                     data: args.context.hosts[0]
 | ||
|                   });
 | ||
|                 }
 | ||
| 
 | ||
|               },
 | ||
|             }
 | ||
|           }
 | ||
|         }
 | ||
|       },
 | ||
|       'primary-storage': {
 | ||
|         title: 'Primary Storage',
 | ||
|         id: 'primarystorages',
 | ||
|         listView: {
 | ||
|           section: 'primary-storage',
 | ||
|           fields: {
 | ||
|             name: { label: 'Name' },
 | ||
|             zonename: { label: 'Zone' },
 | ||
|             podname: { label: 'Pod' }
 | ||
|           },
 | ||
|           
 | ||
|           dataProvider: function(args) {   
 | ||
|             var array1 = [];
 | ||
|             array1.push("&zoneid=" + args.context.zones[0].id);            
 | ||
|             if("pods" in args.context)
 | ||
|               array1.push("&podid=" + args.context.pods[0].id);
 | ||
|             if("clusters" in args.context)
 | ||
|               array1.push("&clusterid=" + args.context.clusters[0].id);  
 | ||
|             $.ajax({
 | ||
|               url: createURL("listStoragePools&zoneid=" + args.context.zones[0].id + "&page=" + args.page + "&pagesize=" + pageSize),
 | ||
|               dataType: "json",
 | ||
|               async: true,
 | ||
|               success: function(json) {
 | ||
|                 var items = json.liststoragepoolsresponse.storagepool;
 | ||
|                 args.response.success({
 | ||
|                   actionFilter: primarystorageActionfilter,
 | ||
|                   data:items
 | ||
|                 });
 | ||
|               }
 | ||
|             });
 | ||
|           },
 | ||
| 
 | ||
|           actions: {
 | ||
|             add: {
 | ||
|               label: 'Add primary storage',
 | ||
| 
 | ||
|               createForm: {
 | ||
|                 title: 'Add new primary storage',
 | ||
|                 desc: 'Please fill in the following information to add a new primary storage',
 | ||
|                 fields: {
 | ||
|                   //always appear (begin)
 | ||
|                   podId: {
 | ||
|                     label: 'Pod',
 | ||
|                     validation: { required: true },
 | ||
|                     select: function(args) {
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("listPods&zoneid=" + args.context.zones[0].id),
 | ||
|                         dataType: "json",
 | ||
|                         async: true,
 | ||
|                         success: function(json) {
 | ||
|                           var pods = json.listpodsresponse.pod;
 | ||
|                           var items = [];
 | ||
|                           $(pods).each(function() {
 | ||
|                             items.push({id: this.id, description: this.name});
 | ||
|                           });
 | ||
|                           args.response.success({data: items});
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   },
 | ||
| 
 | ||
|                   clusterId: {
 | ||
|                     label: 'Cluster',
 | ||
|                     validation: { required: true },
 | ||
|                     dependsOn: 'podId',
 | ||
|                     select: function(args) {
 | ||
|                       $.ajax({
 | ||
|                         url: createURL("listClusters&podid=" + args.podId),
 | ||
|                         dataType: "json",
 | ||
|                         async: false,
 | ||
|                         success: function(json) {
 | ||
|                           clusterObjs = json.listclustersresponse.cluster;
 | ||
|                           var items = [];
 | ||
|                           $(clusterObjs).each(function() {
 | ||
|                             items.push({id: this.id, description: this.name});
 | ||
|                           });
 | ||
|                           args.response.success({
 | ||
|                             actionFilter: clusterActionfilter,
 | ||
|                             data: items
 | ||
|                           });
 | ||
|                         }
 | ||
|                       });
 | ||
|                     }
 | ||
|                   },
 | ||
| 
 | ||
|                   name: {
 | ||
|                     label: 'Name',
 | ||
|                     validation: { required: true }
 | ||
|                   },
 | ||
| 
 | ||
|                   protocol: {
 | ||
|                     label: 'Protocol',
 | ||
|                     validation: { required: true },
 | ||
|                     dependsOn: 'clusterId',
 | ||
|                     select: function(args) {
 | ||
|                       var clusterId = args.clusterId;
 | ||
|                       if(clusterId == null)
 | ||
|                         return;
 | ||
|                       var items = [];
 | ||
|                       $(clusterObjs).each(function(){
 | ||
|                         if(this.id == clusterId){
 | ||
|                           selectedClusterObj = this;
 | ||
|                           return false; //break the $.each() loop
 | ||
|                         }
 | ||
|                       });
 | ||
|                       if(selectedClusterObj == null)
 | ||
|                         return;
 | ||
| 
 | ||
|                       if(selectedClusterObj.hypervisortype == "KVM") {
 | ||
|                         var items = [];
 | ||
|                         items.push({id: "nfs", description: "nfs"});
 | ||
|                         items.push({id: "SharedMountPoint", description: "SharedMountPoint"});
 | ||
|                         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('.form-item[rel=server]').css('display', 'inline-block');
 | ||
|                           //$dialogAddPool.find("#add_pool_nfs_server").val("");
 | ||
|                           $form.find('.form-item[rel=server]').find(".value").find("input").val("");
 | ||
| 
 | ||
|                           //$('li[input_group="nfs"]', $dialogAddPool).show();
 | ||
|                           $form.find('.form-item[rel=path]').css('display', 'inline-block');
 | ||
|                           //$dialogAddPool.find("#add_pool_path_container").find("label").text(g_dictionary["label.path"]+":");
 | ||
|                           $form.find('.form-item[rel=path]').find(".name").find("label").text("Path:");
 | ||
| 
 | ||
|                           //$('li[input_group="iscsi"]', $dialogAddPool).hide();
 | ||
|                           $form.find('.form-item[rel=iqn]').hide();
 | ||
|                           $form.find('.form-item[rel=lun]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="vmfs"]', $dialogAddPool).hide();
 | ||
|                           $form.find('.form-item[rel=vCenterDataCenter]').hide();
 | ||
|                           $form.find('.form-item[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('.form-item[rel=server]').hide();
 | ||
|                           //$dialogAddPool.find("#add_pool_nfs_server").val("");
 | ||
|                           $form.find('.form-item[rel=server]').find(".value").find("input").val("");
 | ||
| 
 | ||
|                           //$('li[input_group="nfs"]', $dialogAddPool).show();
 | ||
|                           $form.find('.form-item[rel=path]').css('display', 'inline-block');
 | ||
|                           //$dialogAddPool.find("#add_pool_path_container").find("label").text(g_dictionary["label.path"]+":");
 | ||
|                           $form.find('.form-item[rel=path]').find(".name").find("label").text("Path:");
 | ||
| 
 | ||
|                           //$('li[input_group="iscsi"]', $dialogAddPool).hide();
 | ||
|                           $form.find('.form-item[rel=iqn]').hide();
 | ||
|                           $form.find('.form-item[rel=lun]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="vmfs"]', $dialogAddPool).hide();
 | ||
|                           $form.find('.form-item[rel=vCenterDataCenter]').hide();
 | ||
|                           $form.find('.form-item[rel=vCenterDataStore]').hide();
 | ||
|                         }
 | ||
|                         else if(protocol == "PreSetup") {
 | ||
|                           //$dialogAddPool.find("#add_pool_server_container").hide();
 | ||
|                           $form.find('.form-item[rel=server]').hide();
 | ||
|                           //$dialogAddPool.find("#add_pool_nfs_server").val("localhost");
 | ||
|                           $form.find('.form-item[rel=server]').find(".value").find("input").val("localhost");
 | ||
| 
 | ||
|                           //$('li[input_group="nfs"]', $dialogAddPool).show();
 | ||
|                           $form.find('.form-item[rel=path]').css('display', 'inline-block');
 | ||
|                           //$dialogAddPool.find("#add_pool_path_container").find("label").text(g_dictionary["label.SR.name"]+":");
 | ||
|                           $form.find('.form-item[rel=path]').find(".name").find("label").text("SR Name-Label:");
 | ||
| 
 | ||
|                           //$('li[input_group="iscsi"]', $dialogAddPool).hide();
 | ||
|                           $form.find('.form-item[rel=iqn]').hide();
 | ||
|                           $form.find('.form-item[rel=lun]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="vmfs"]', $dialogAddPool).hide();
 | ||
|                           $form.find('.form-item[rel=vCenterDataCenter]').hide();
 | ||
|                           $form.find('.form-item[rel=vCenterDataStore]').hide();
 | ||
|                         }
 | ||
|                         else if(protocol == "iscsi") {
 | ||
|                           //$dialogAddPool.find("#add_pool_server_container").show();
 | ||
|                           $form.find('.form-item[rel=server]').css('display', 'inline-block');
 | ||
|                           //$dialogAddPool.find("#add_pool_nfs_server").val("");
 | ||
|                           $form.find('.form-item[rel=server]').find(".value").find("input").val("");
 | ||
| 
 | ||
|                           //$('li[input_group="nfs"]', $dialogAddPool).hide();
 | ||
|                           $form.find('.form-item[rel=path]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="iscsi"]', $dialogAddPool).show();
 | ||
|                           $form.find('.form-item[rel=iqn]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=lun]').css('display', 'inline-block');
 | ||
| 
 | ||
|                           //$('li[input_group="vmfs"]', $dialogAddPool).hide();
 | ||
|                           $form.find('.form-item[rel=vCenterDataCenter]').hide();
 | ||
|                           $form.find('.form-item[rel=vCenterDataStore]').hide();
 | ||
|                         }
 | ||
|                         else if(protocol == "vmfs") {
 | ||
|                           //$dialogAddPool.find("#add_pool_server_container").show();
 | ||
|                           $form.find('.form-item[rel=server]').css('display', 'inline-block');
 | ||
|                           //$dialogAddPool.find("#add_pool_nfs_server").val("");
 | ||
|                           $form.find('.form-item[rel=server]').find(".value").find("input").val("");
 | ||
| 
 | ||
|                           //$('li[input_group="nfs"]', $dialogAddPool).hide();
 | ||
|                           $form.find('.form-item[rel=path]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="iscsi"]', $dialogAddPool).hide();
 | ||
|                           $form.find('.form-item[rel=iqn]').hide();
 | ||
|                           $form.find('.form-item[rel=lun]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="vmfs"]', $dialogAddPool).show();
 | ||
|                           $form.find('.form-item[rel=vCenterDataCenter]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=vCenterDataStore]').css('display', 'inline-block');
 | ||
|                         }
 | ||
|                         else if(protocol == "SharedMountPoint") {  //"SharedMountPoint" show the same fields as "nfs" does.
 | ||
|                           //$dialogAddPool.find("#add_pool_server_container").hide();
 | ||
|                           $form.find('.form-item[rel=server]').hide();
 | ||
|                           //$dialogAddPool.find("#add_pool_nfs_server").val("localhost");
 | ||
|                           $form.find('.form-item[rel=server]').find(".value").find("input").val("localhost");
 | ||
| 
 | ||
|                           //$('li[input_group="nfs"]', $dialogAddPool).show();
 | ||
|                           $form.find('.form-item[rel=path]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=path]').find(".name").find("label").text("Path:");
 | ||
| 
 | ||
|                           //$('li[input_group="iscsi"]', $dialogAddPool).hide();
 | ||
|                           $form.find('.form-item[rel=iqn]').hide();
 | ||
|                           $form.find('.form-item[rel=lun]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="vmfs"]', $dialogAddPool).hide();
 | ||
|                           $form.find('.form-item[rel=vCenterDataCenter]').hide();
 | ||
|                           $form.find('.form-item[rel=vCenterDataStore]').hide();
 | ||
|                         }
 | ||
|                         else {
 | ||
|                           //$dialogAddPool.find("#add_pool_server_container").show();
 | ||
|                           $form.find('.form-item[rel=server]').css('display', 'inline-block');
 | ||
|                           //$dialogAddPool.find("#add_pool_nfs_server").val("");
 | ||
|                           $form.find('.form-item[rel=server]').find(".value").find("input").val("");
 | ||
| 
 | ||
|                           //$('li[input_group="iscsi"]', $dialogAddPool).hide();
 | ||
|                           $form.find('.form-item[rel=iqn]').hide();
 | ||
|                           $form.find('.form-item[rel=lun]').hide();
 | ||
| 
 | ||
|                           //$('li[input_group="vmfs"]', $dialogAddPool).hide();
 | ||
|                           $form.find('.form-item[rel=vCenterDataCenter]').hide();
 | ||
|                           $form.find('.form-item[rel=vCenterDataStore]').hide();
 | ||
|                         }
 | ||
|                       });
 | ||
| 
 | ||
|                       args.$select.trigger("change");
 | ||
|                     }
 | ||
|                   },
 | ||
|                   //always appear (end)
 | ||
| 
 | ||
|                   server: {
 | ||
|                     label: 'Server',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true
 | ||
|                   },
 | ||
| 
 | ||
|                   //nfs
 | ||
|                   path: {
 | ||
|                     label: 'Path',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true
 | ||
|                   },
 | ||
| 
 | ||
|                   //iscsi
 | ||
|                   iqn: {
 | ||
|                     label: 'Target IQN',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true
 | ||
|                   },
 | ||
|                   lun: {
 | ||
|                     label: 'LUN #',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true
 | ||
|                   },
 | ||
| 
 | ||
|                   //vmfs
 | ||
|                   vCenterDataCenter: {
 | ||
|                     label: 'vCenter Datacenter',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true
 | ||
|                   },
 | ||
|                   vCenterDataStore: {
 | ||
|                     label: 'vCenter Datastore',
 | ||
|                     validation: { required: true },
 | ||
|                     isHidden: true
 | ||
|                   },
 | ||
| 
 | ||
|                   //always appear (begin)
 | ||
|                   storageTags: {
 | ||
|                     label: 'Storage Tags',
 | ||
|                     validation: { required: false }
 | ||
|                   }
 | ||
|                   //always appear (end)
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               action: function(args) {
 | ||
|                 var array1 = [];
 | ||
|                 array1.push("&zoneid=" + args.context.zones[0].id);
 | ||
|                 array1.push("&podId=" + args.data.podId);
 | ||
|                 array1.push("&clusterid=" + args.data.clusterId);
 | ||
|                 array1.push("&name=" + todb(args.data.name));
 | ||
| 
 | ||
|                 var server = args.data.server;
 | ||
|                 var url = null;
 | ||
|                 if (args.data.protocol == "nfs") {
 | ||
|                   //var path = trim($thisDialog.find("#add_pool_path").val());
 | ||
|                   var path = args.data.path;
 | ||
| 
 | ||
|                   if(path.substring(0,1) != "/")
 | ||
|                     path = "/" + path;
 | ||
|                   url = nfsURL(server, path);
 | ||
|                 }
 | ||
|                 else if (args.data.protocol == "PreSetup") {
 | ||
|                   //var path = trim($thisDialog.find("#add_pool_path").val());
 | ||
|                   var path = args.data.path;
 | ||
| 
 | ||
|                   if(path.substring(0,1) != "/")
 | ||
|                     path = "/" + path;
 | ||
|                   url = presetupURL(server, path);
 | ||
|                 }
 | ||
|                 else if (args.data.protocol == "ocfs2") {
 | ||
|                   //var path = trim($thisDialog.find("#add_pool_path").val());
 | ||
|                   var path = args.data.path;
 | ||
| 
 | ||
|                   if(path.substring(0,1) != "/")
 | ||
|                     path = "/" + path;
 | ||
|                   url = ocfs2URL(server, path);
 | ||
|                 }
 | ||
|                 else if (args.data.protocol == "SharedMountPoint") {
 | ||
|                   //var path = trim($thisDialog.find("#add_pool_path").val());
 | ||
|                   var path = args.data.path;
 | ||
| 
 | ||
|                   if(path.substring(0,1) != "/")
 | ||
|                     path = "/" + path;
 | ||
|                   url = SharedMountPointURL(server, path);
 | ||
|                 }
 | ||
|                 else if (args.data.protocol == "vmfs") {
 | ||
|                   //var path = trim($thisDialog.find("#add_pool_vmfs_dc").val());
 | ||
|                   var path = args.data.vCenterDataCenter;
 | ||
| 
 | ||
|                   if(path.substring(0,1) != "/")
 | ||
|                     path = "/" + path;
 | ||
|                   path += "/" + args.data.vCenterDataStore;
 | ||
|                   url = vmfsURL("dummy", path);
 | ||
|                 }
 | ||
|                 else {
 | ||
|                   //var iqn = trim($thisDialog.find("#add_pool_iqn").val());
 | ||
|                   var iqn = args.data.iqn;
 | ||
| 
 | ||
|                   if(iqn.substring(0,1) != "/")
 | ||
|                     iqn = "/" + iqn;
 | ||
|                   var lun = args.data.lun;
 | ||
|                   url = iscsiURL(server, iqn, lun);
 | ||
|                 }
 | ||
|                 array1.push("&url=" + todb(url));
 | ||
| 
 | ||
|                 if(args.data.storageTags != null && args.data.storageTags.length > 0)
 | ||
|                   array1.push("&tags=" + todb(args.data.storageTags));
 | ||
| 
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("createStoragePool" + array1.join("")),
 | ||
|                   dataType: "json",
 | ||
|                   success: function(json) {
 | ||
|                     var item = json.createstoragepoolresponse.storagepool[0];
 | ||
|                     args.response.success({data: item});
 | ||
|                   },
 | ||
|                   error: function(XMLHttpResponse) {
 | ||
|                     var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                     args.response.error(errorMsg);
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
| 
 | ||
|               notification: {
 | ||
|                 poll: function(args){
 | ||
|                   args.complete();
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               messages: {
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Added new primary storage';
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             enableMaintenanceMode: {
 | ||
|               label: 'Enable Maintenace' ,
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("enableStorageMaintenance&id=" + args.context.primarystorages[0].id),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     var jid = json.prepareprimarystorageformaintenanceresponse.jobid;
 | ||
|                     args.response.success(
 | ||
|                       {_custom:
 | ||
|                        {jobId: jid,
 | ||
|                         getUpdatedItem: function(json) {
 | ||
|                           return json.queryasyncjobresultresponse.jobresult.storagepool;
 | ||
|                         },
 | ||
|                         getActionFilter: function() {
 | ||
|                           return primarystorageActionfilter;
 | ||
|                         }
 | ||
|                        }
 | ||
|                       }
 | ||
|                     );
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Warning: placing the primary storage into maintenance mode will cause all VMs using volumes from it to be stopped.  Do you want to continue?';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'Maintenance is being enabled.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Enabling maintenance';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Maintenance has been enabled.';
 | ||
|                 }
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: pollAsyncJobResult
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             cancelMaintenanceMode: {
 | ||
|               label: 'Cancel Maintenace' ,
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("cancelStorageMaintenance&id=" + args.context.primarystorages[0].id),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     var jid = json.cancelprimarystoragemaintenanceresponse.jobid;
 | ||
|                     args.response.success(
 | ||
|                       {_custom:
 | ||
|                        {jobId: jid,
 | ||
|                         getUpdatedItem: function(json) {
 | ||
|                           return json.queryasyncjobresultresponse.jobresult.storagepool;
 | ||
|                         },
 | ||
|                         getActionFilter: function() {
 | ||
|                           return primarystorageActionfilter;
 | ||
|                         }
 | ||
|                        }
 | ||
|                       }
 | ||
|                     );
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Please confirm that you want to cancel this maintenance.';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'Maintenance is being cancelled.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Cancelling maintenance';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Maintenance has been cancelled.';
 | ||
|                 }
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: pollAsyncJobResult
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             'delete': {
 | ||
|               label: 'Delete' ,
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Please confirm that you want to delete this primary storage.';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'Primary storage is being deleted.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Deleting primary storage';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Primary storage has been deleted.';
 | ||
|                 }
 | ||
|               },
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("deleteStoragePool&id=" + args.context.primarystorages[0].id),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     args.response.success({data:{}});
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: function(args) { args.complete(); }
 | ||
|               }
 | ||
|             }
 | ||
| 
 | ||
|           },
 | ||
| 
 | ||
|           detailView: {
 | ||
|             name: "Primary storage details",
 | ||
|             actions: {
 | ||
|               enableMaintenanceMode: {
 | ||
|                 label: 'Enable Maintenace' ,
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("enableStorageMaintenance&id=" + args.context.primarystorages[0].id),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jid = json.prepareprimarystorageformaintenanceresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                          {jobId: jid,
 | ||
|                           getUpdatedItem: function(json) {
 | ||
|                             return json.queryasyncjobresultresponse.jobresult.storagepool;
 | ||
|                           },
 | ||
|                           getActionFilter: function() {
 | ||
|                             return primarystorageActionfilter;
 | ||
|                           }
 | ||
|                          }
 | ||
|                         }
 | ||
|                       );
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Warning: placing the primary storage into maintenance mode will cause all VMs using volumes from it to be stopped.  Do you want to continue?';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'Maintenance is being enabled.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Enabling maintenance';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Maintenance has been enabled.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               cancelMaintenanceMode: {
 | ||
|                 label: 'Cancel Maintenace' ,
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("cancelStorageMaintenance&id=" + args.context.primarystorages[0].id),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       var jid = json.cancelprimarystoragemaintenanceresponse.jobid;
 | ||
|                       args.response.success(
 | ||
|                         {_custom:
 | ||
|                          {jobId: jid,
 | ||
|                           getUpdatedItem: function(json) {
 | ||
|                             return json.queryasyncjobresultresponse.jobresult.storagepool;
 | ||
|                           },
 | ||
|                           getActionFilter: function() {
 | ||
|                             return primarystorageActionfilter;
 | ||
|                           }
 | ||
|                          }
 | ||
|                         }
 | ||
|                       );
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Please confirm that you want to cancel this maintenance.';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'Maintenance is being cancelled.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Cancelling maintenance';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Maintenance has been cancelled.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: pollAsyncJobResult
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               'delete': {
 | ||
|                 label: 'Delete' ,
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Please confirm that you want to delete this primary storage.';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'Primary storage is being deleted.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Deleting primary storage';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Primary storage has been deleted.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("deleteStoragePool&id=" + args.context.primarystorages[0].id),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       args.response.success({data:{}});
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) { args.complete(); }
 | ||
|                 }
 | ||
|               }
 | ||
| 
 | ||
|             },
 | ||
| 
 | ||
|             tabs: {
 | ||
|               details: {
 | ||
|                 title: 'Details',
 | ||
|                 fields: [
 | ||
|                   {
 | ||
|                     name: { label: 'Name' },
 | ||
|                   },
 | ||
|                   {
 | ||
|                     id: { label: 'ID' },
 | ||
|                     state: { label: 'State' },
 | ||
|                     zonename: { label: 'Zone' },
 | ||
|                     podname: { label: 'Pod' },
 | ||
|                     clustername: { label: 'Cluster' },
 | ||
|                     type: { label: 'Type' },
 | ||
|                     ipaddress: { label: 'IP Address' },
 | ||
|                     path: { label: 'Path' },
 | ||
|                     disksizetotal: {
 | ||
|                       label: 'Disk total',
 | ||
|                       converter: function(args) {
 | ||
|                         if (args == null || args == 0)
 | ||
|                           return "";
 | ||
|                         else
 | ||
|                           return cloudStack.converters.convertBytes(args);
 | ||
|                       }
 | ||
|                     },
 | ||
|                     disksizeallocated: {
 | ||
|                       label: 'Disk Allocated',
 | ||
|                       converter: function(args) {
 | ||
|                         if (args == null || args == 0)
 | ||
|                           return "";
 | ||
|                         else
 | ||
|                           return cloudStack.converters.convertBytes(args);
 | ||
|                       }
 | ||
|                     },
 | ||
|                     tags: { label: 'Primary tags' }
 | ||
|                   }
 | ||
|                 ],
 | ||
| 
 | ||
|                 //dataProvider: testData.dataProvider.detailView('primaryStorage')
 | ||
|                 dataProvider: function(args) {
 | ||
|                   args.response.success({
 | ||
|                     actionFilter: primarystorageActionfilter,
 | ||
|                     data: args.context.primarystorages[0]
 | ||
|                   });
 | ||
|                 }
 | ||
| 
 | ||
|               }
 | ||
|             }
 | ||
|           }
 | ||
|         }
 | ||
|       },
 | ||
| 
 | ||
|       'secondary-storage': {
 | ||
|         title: 'Secondary Storage',
 | ||
|         id: 'secondarystorages',
 | ||
|         listView: {
 | ||
|           section: 'seconary-storage',
 | ||
|           fields: {
 | ||
|             name: { label: 'Name' },
 | ||
|             zonename: { label: 'Zone' }
 | ||
|           },
 | ||
|           
 | ||
|           dataProvider: function(args) {   
 | ||
|             var array1 = [];
 | ||
|             array1.push("&zoneid=" + args.context.zones[0].id);            
 | ||
|             if("pods" in args.context)
 | ||
|               array1.push("&podid=" + args.context.pods[0].id);
 | ||
|             if("clusters" in args.context)
 | ||
|               array1.push("&clusterid=" + args.context.clusters[0].id);                    
 | ||
|             $.ajax({
 | ||
|               url: createURL("listHosts&type=SecondaryStorage&zoneid=" + args.context.zones[0].id + "&page=" + args.page + "&pagesize=" + pageSize),
 | ||
|               dataType: "json",
 | ||
|               async: true,
 | ||
|               success: function(json) {
 | ||
|                 var items = json.listhostsresponse.host;
 | ||
|                 args.response.success({
 | ||
|                   actionFilter: secondarystorageActionfilter,
 | ||
|                   data:items
 | ||
|                 });
 | ||
|               }
 | ||
|             });
 | ||
|           },
 | ||
| 
 | ||
|           actions: {
 | ||
|             add: {
 | ||
|               label: 'Add secondary storage',
 | ||
| 
 | ||
|               createForm: {
 | ||
|                 title: 'Add new secondary storage',
 | ||
|                 desc: 'Please fill in the following information to add a new secondary storage',
 | ||
|                 fields: {
 | ||
|                   nfsServer: {
 | ||
|                     label: 'NFS Server',
 | ||
|                     validation: { required: true }
 | ||
|                   },
 | ||
|                   path: {
 | ||
|                     label: 'Path',
 | ||
|                     validation: { required: true }
 | ||
|                   }
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               action: function(args) {
 | ||
|                 var zoneId = args.context.zones[0].id;
 | ||
|                 var nfs_server = args.data.nfsServer;
 | ||
|                 var path = args.data.path;
 | ||
|                 var url = nfsURL(nfs_server, path);
 | ||
| 
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("addSecondaryStorage&zoneId=" + zoneId + "&url=" + todb(url)),
 | ||
|                   dataType: "json",
 | ||
|                   success: function(json) {
 | ||
|                     var item = json.addsecondarystorageresponse.secondarystorage;
 | ||
|                     args.response.success({data:item});
 | ||
|                   },
 | ||
|                   error: function(XMLHttpResponse) {
 | ||
|                     var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                     args.response.error(errorMsg);
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
| 
 | ||
|               notification: {
 | ||
|                 poll: function(args) {
 | ||
|                   args.complete();
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               messages: {
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Added new secondary storage';
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             'delete': {
 | ||
|               label: 'Delete' ,
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Please confirm that you want to delete this secondary storage.';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'Secondary storage is being deleted.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Deleting secondary storage';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'Secondary storage has been deleted.';
 | ||
|                 }
 | ||
|               },
 | ||
|               action: function(args) {
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("deleteHost&id=" + args.context.secondarystorages[0].id),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     args.response.success({data:{}});
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: function(args) { args.complete(); }
 | ||
|               }
 | ||
|             }
 | ||
| 
 | ||
|           },
 | ||
| 
 | ||
|           detailView: {
 | ||
|             name: 'Secondary storage details',
 | ||
|             actions: {
 | ||
|               'delete': {
 | ||
|                 label: 'Delete' ,
 | ||
|                 messages: {
 | ||
|                   confirm: function(args) {
 | ||
|                     return 'Please confirm that you want to delete this secondary storage.';
 | ||
|                   },
 | ||
|                   success: function(args) {
 | ||
|                     return 'Secondary storage is being deleted.';
 | ||
|                   },
 | ||
|                   notification: function(args) {
 | ||
|                     return 'Deleting secondary storage';
 | ||
|                   },
 | ||
|                   complete: function(args) {
 | ||
|                     return 'Secondary storage has been deleted.';
 | ||
|                   }
 | ||
|                 },
 | ||
|                 action: function(args) {
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("deleteHost&id=" + args.context.secondarystorages[0].id),
 | ||
|                     dataType: "json",
 | ||
|                     async: true,
 | ||
|                     success: function(json) {
 | ||
|                       args.response.success({data:{}});
 | ||
|                     }
 | ||
|                   });
 | ||
|                 },
 | ||
|                 notification: {
 | ||
|                   poll: function(args) { args.complete(); }
 | ||
|                 }
 | ||
|               }
 | ||
| 
 | ||
|             },
 | ||
|             tabs: {
 | ||
|               details: {
 | ||
|                 title: 'Details',
 | ||
|                 fields: [
 | ||
|                   {
 | ||
|                     name: { label: 'Name' },
 | ||
|                   },
 | ||
|                   {
 | ||
|                     id: { label: 'ID' },
 | ||
|                     zonename: { label: 'Zone' },
 | ||
|                     type: { label: 'Type' },
 | ||
|                     ipaddress: { label: 'IP Address' }
 | ||
|                   }
 | ||
|                 ],
 | ||
| 
 | ||
|                 //dataProvider: testData.dataProvider.detailView('secondaryStorage')
 | ||
|                 dataProvider: function(args) {
 | ||
|                   args.response.success({
 | ||
|                     actionFilter: secondarystorageActionfilter,
 | ||
|                     data: args.context.secondarystorages[0]
 | ||
|                   });
 | ||
|                 }
 | ||
|               }
 | ||
|             }
 | ||
|           }
 | ||
|         }
 | ||
|       },
 | ||
|             
 | ||
|       guestIpRanges: {
 | ||
|         title: 'Guest IP Range',
 | ||
|         id: 'guestIpRanges',
 | ||
|         listView: {
 | ||
|           section: 'guest-IP-range',
 | ||
|           fields: {
 | ||
|             //id: { label: 'ID' },
 | ||
|             podname: { label: 'Pod' },
 | ||
|             vlan: { label: 'VLAN' },
 | ||
|             startip: { label: 'Start IP' },
 | ||
|             endip: { label: 'End IP' }          
 | ||
|           },
 | ||
|           
 | ||
|           dataProvider: function(args) {   
 | ||
|             $.ajax({
 | ||
|               url: createURL("listVlanIpRanges&zoneid=" + selectedZoneObj.id + "&networkid=" + args.context.networks[0].id + "&page=" + args.page + "&pagesize=" + pageSize),
 | ||
|               dataType: "json",
 | ||
|               async: true,
 | ||
|               success: function(json) {
 | ||
|                 var items = json.listvlaniprangesresponse.vlaniprange;               
 | ||
|                 args.response.success({data: items});
 | ||
|               }
 | ||
|             });
 | ||
|           },
 | ||
| 
 | ||
|           actions: {
 | ||
|             add: {
 | ||
|               label: 'Add IP range',
 | ||
| 
 | ||
|               createForm: { 
 | ||
|                 title: 'Add IP range',  
 | ||
|                
 | ||
|                 preFilter: function(args) {                        
 | ||
|                   if(selectedZoneObj.networktype == "Basic") {   
 | ||
|                     args.$form.find('.form-item[rel=podId]').css('display', 'inline-block');
 | ||
|                     args.$form.find('.form-item[rel=guestGateway]').css('display', 'inline-block');
 | ||
|                     args.$form.find('.form-item[rel=guestNetmask]').css('display', 'inline-block');
 | ||
|                   }
 | ||
|                   else {  //"Advanced"  
 | ||
|                     args.$form.find('.form-item[rel=podId]').hide();  
 | ||
|                     args.$form.find('.form-item[rel=guestGateway]').hide();    
 | ||
|                     args.$form.find('.form-item[rel=guestNetmask]').hide();                         
 | ||
|                   }
 | ||
|                 },
 | ||
|                 
 | ||
|                 fields: {                  
 | ||
|                   podId: {
 | ||
|                     label: 'Pod',
 | ||
|                     validation: { required: true },
 | ||
|                     select: function(args) {
 | ||
|                       var items = [];                             
 | ||
|                       if(selectedZoneObj.networktype == "Basic") {
 | ||
|                         $.ajax({
 | ||
|                           url: createURL("listPods&zoneid=" + selectedZoneObj.id),
 | ||
|                           dataType: "json",
 | ||
|                           async: false,
 | ||
|                           success: function(json) {                                                             
 | ||
|                             var podObjs = json.listpodsresponse.pod;
 | ||
|                             $(podObjs).each(function(){                                      
 | ||
|                               items.push({id: this.id, description: this.name});
 | ||
|                             });                                   
 | ||
|                           }
 | ||
|                         });
 | ||
|                         items.push({id: 0, description: "(create new pod)"});    
 | ||
|                       }                        
 | ||
|                       args.response.success({data: items});                                  
 | ||
|                       
 | ||
|                       args.$select.change(function() {
 | ||
|                         var $form = $(this).closest('form');                    
 | ||
|                         if($(this).val() == "0") {
 | ||
|                           $form.find('.form-item[rel=podname]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=reservedSystemGateway]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=reservedSystemNetmask]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=reservedSystemStartIp]').css('display', 'inline-block');
 | ||
|                           $form.find('.form-item[rel=reservedSystemEndIp]').css('display', 'inline-block');
 | ||
|                         }
 | ||
|                         else {
 | ||
|                           $form.find('.form-item[rel=podname]').hide();
 | ||
|                           $form.find('.form-item[rel=reservedSystemGateway]').hide();
 | ||
|                           $form.find('.form-item[rel=reservedSystemNetmask]').hide();
 | ||
|                           $form.find('.form-item[rel=reservedSystemStartIp]').hide();
 | ||
|                           $form.find('.form-item[rel=reservedSystemEndIp]').hide();
 | ||
|                         }
 | ||
|                       }); 
 | ||
|                     }
 | ||
|                   },
 | ||
|                   
 | ||
|                   //create new pod fields start here
 | ||
|                   podname: {
 | ||
|                     label: 'Pod name',
 | ||
|                     validation: { required: true }
 | ||
|                   },
 | ||
|                   reservedSystemGateway: {
 | ||
|                     label: 'Reserved system gateway',
 | ||
|                     validation: { required: true }
 | ||
|                   },
 | ||
|                   reservedSystemNetmask: {
 | ||
|                     label: 'Reserved system netmask',
 | ||
|                     validation: { required: true }
 | ||
|                   },
 | ||
|                   reservedSystemStartIp: {
 | ||
|                     label: 'Start Reserved system IP',
 | ||
|                     validation: { required: true }
 | ||
|                   },
 | ||
|                   reservedSystemEndIp: {
 | ||
|                     label: 'End Reserved system IP',
 | ||
|                     validation: { required: false }
 | ||
|                   },
 | ||
|                   //create new pod fields ends here
 | ||
|                             
 | ||
|                   guestGateway: { label: 'Guest gateway' },
 | ||
| 									guestNetmask: { label: 'Guest netmask' },
 | ||
| 									guestStartIp: { label: 'Start guest IP' },
 | ||
| 									guestEndIp: { label: 'End guest IP' } 
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               action: function(args) {                  
 | ||
|                 if(selectedZoneObj.networktype == "Basic") {   
 | ||
|                   var array2 = [];       
 | ||
|                                                 
 | ||
|                   var podId;
 | ||
|                   if(args.data.podId != "0") {
 | ||
|                     podId = args.data.podId;                                
 | ||
|                   }
 | ||
|                   else { //args.data.podId==0, create pod first                               
 | ||
|                     var array1 = [];
 | ||
|                     array1.push("&zoneId=" + selectedZoneObj.id);
 | ||
|                     array1.push("&name=" + todb(args.data.podname));
 | ||
|                     array1.push("&gateway=" + todb(args.data.reservedSystemGateway));
 | ||
|                     array1.push("&netmask=" + todb(args.data.reservedSystemNetmask));
 | ||
|                     array1.push("&startIp=" + todb(args.data.reservedSystemStartIp));
 | ||
| 
 | ||
|                     var endip = args.data.reservedSystemEndIp;      //optional
 | ||
|                     if (endip != null && endip.length > 0)
 | ||
|                       array1.push("&endIp=" + todb(endip));                
 | ||
| 
 | ||
|                     $.ajax({
 | ||
|                       url: createURL("createPod" + array1.join("")),
 | ||
|                       dataType: "json",
 | ||
|                       async: false,
 | ||
|                       success: function(json) {
 | ||
|                         var item = json.createpodresponse.pod;  
 | ||
|                         podId = item.id;
 | ||
|                       },
 | ||
|                       error: function(XMLHttpResponse) {
 | ||
|                         //var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                         //args.response.error(errorMsg);
 | ||
|                       }
 | ||
|                     });                                 
 | ||
|                   }            
 | ||
|                   if(podId == null)  {  
 | ||
|                     alert("podId is null, so unable to create IP range on pod level");                              
 | ||
|                     return;           
 | ||
|                   }    
 | ||
|                   array2.push("&podId=" + podId);                              
 | ||
|                   array2.push("&vlan=untagged");
 | ||
|                   array2.push("&zoneid=" + selectedZoneObj.id);                              
 | ||
|                   array2.push("&forVirtualNetwork=false"); //direct VLAN
 | ||
|                   array2.push("&gateway=" + todb(args.data.guestGateway));
 | ||
|                   array2.push("&netmask=" + todb(args.data.guestNetmask));
 | ||
|                   array2.push("&startip=" + todb(args.data.guestStartIp));                      
 | ||
|                   var endip = args.data.guestEndIp;
 | ||
|                   if(endip != null && endip.length > 0)
 | ||
|                     array2.push("&endip=" + todb(endip));
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("createVlanIpRange" + array2.join("")),
 | ||
|                     dataType: "json",
 | ||
|                     async: false,
 | ||
|                     success: function(json) {
 | ||
|                       var item = json.createvlaniprangeresponse.vlan;	
 | ||
|                       args.response.success({data:item});
 | ||
|                     },
 | ||
|                     error: function(XMLHttpResponse) {
 | ||
|                       var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                       args.response.error(errorMsg);
 | ||
|                     }
 | ||
|                   });                    
 | ||
|                 }      
 | ||
|                 else {   //selectedZoneObj.networktype == "Advanced"             
 | ||
|                   var array2 = [];
 | ||
|                   array2.push("&startip=" + args.data.guestStartIp);
 | ||
|                   var endip = args.data.guestEndIp;
 | ||
|                   if(endip != null && endip.length > 0)
 | ||
|                     array2.push("&endip=" + endip);		
 | ||
|                   $.ajax({
 | ||
|                     url: createURL("createVlanIpRange&forVirtualNetwork=false&networkid=" + args.context.networks[0].id + array2.join("")),
 | ||
|                     dataType: "json",
 | ||
|                     success: function(json) {
 | ||
|                       var item = json.createvlaniprangeresponse.vlan;	
 | ||
|                       args.response.success({data:item});
 | ||
|                     },
 | ||
|                     error: function(XMLHttpResponse) {
 | ||
|                       var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
 | ||
|                       args.response.error(errorMsg);
 | ||
|                     }
 | ||
|                   });
 | ||
|                 }                
 | ||
|               },
 | ||
| 
 | ||
|               notification: {
 | ||
|                 poll: function(args) {
 | ||
|                   args.complete();
 | ||
|                 }
 | ||
|               },
 | ||
| 
 | ||
|               messages: {
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Added new IP range';
 | ||
|                 }
 | ||
|               }
 | ||
|             },
 | ||
| 
 | ||
|             'delete': {
 | ||
|               label: 'Delete' ,
 | ||
|               messages: {
 | ||
|                 confirm: function(args) {
 | ||
|                   return 'Please confirm that you want to delete this IP range.';
 | ||
|                 },
 | ||
|                 success: function(args) {
 | ||
|                   return 'IP range is being deleted.';
 | ||
|                 },
 | ||
|                 notification: function(args) {
 | ||
|                   return 'Deleting IP range';
 | ||
|                 },
 | ||
|                 complete: function(args) {
 | ||
|                   return 'IP range has been deleted.';
 | ||
|                 }
 | ||
|               },
 | ||
|               action: function(args) {                
 | ||
|                 $.ajax({
 | ||
|                   url: createURL("deleteVlanIpRange&id=" + args.data.id),
 | ||
|                   dataType: "json",
 | ||
|                   async: true,
 | ||
|                   success: function(json) {
 | ||
|                     args.response.success({data:{}});
 | ||
|                   }
 | ||
|                 });
 | ||
|               },
 | ||
|               notification: {
 | ||
|                 poll: function(args) { args.complete(); }
 | ||
|               }
 | ||
|             }
 | ||
|           },
 | ||
| 
 | ||
|           /*
 | ||
|           detailView: {
 | ||
|             name: 'Event details',
 | ||
|             tabs: {
 | ||
|               details: {
 | ||
|                 title: 'Details',
 | ||
|                 fields: [
 | ||
|                   {
 | ||
|                     id: { label: 'ID' },
 | ||
|                     podname: { label: 'Pod' },
 | ||
|                     vlan: { label: 'VLAN' },
 | ||
|                     startip: { label: 'Start IP' },
 | ||
|                     endip: { label: 'End IP' }      
 | ||
|                   }
 | ||
|                 ],
 | ||
|                 dataProvider: function(args) {	                              
 | ||
| 								  args.response.success({data: args.context.guestIpRanges[0]});  //guestIpRanges should be included in args.context. Wait for Brian to fix it.
 | ||
| 								}
 | ||
|               }
 | ||
|             }
 | ||
|           }
 | ||
|           */
 | ||
|           
 | ||
|         }
 | ||
|       }     
 | ||
|     }
 | ||
|   };
 | ||
| 
 | ||
|   function nfsURL(server, path) {
 | ||
|     var url;
 | ||
|     if(server.indexOf("://")==-1)
 | ||
|       url = "nfs://" + server + path;
 | ||
|     else
 | ||
|       url = server + path;
 | ||
|     return url;
 | ||
|   }
 | ||
| 
 | ||
|   function presetupURL(server, path) {
 | ||
|     var url;
 | ||
|     if(server.indexOf("://")==-1)
 | ||
|       url = "presetup://" + server + path;
 | ||
|     else
 | ||
|       url = server + path;
 | ||
|     return url;
 | ||
|   }
 | ||
| 
 | ||
|   function ocfs2URL(server, path) {
 | ||
|     var url;
 | ||
|     if(server.indexOf("://")==-1)
 | ||
|       url = "ocfs2://" + server + path;
 | ||
|     else
 | ||
|       url = server + path;
 | ||
|     return url;
 | ||
|   }
 | ||
| 
 | ||
|   function SharedMountPointURL(server, path) {
 | ||
|     var url;
 | ||
|     if(server.indexOf("://")==-1)
 | ||
|       url = "SharedMountPoint://" + server + path;
 | ||
|     else
 | ||
|       url = server + path;
 | ||
|     return url;
 | ||
|   }
 | ||
| 
 | ||
|   function vmfsURL(server, path) {
 | ||
|     var url;
 | ||
|     if(server.indexOf("://")==-1)
 | ||
|       url = "vmfs://" + server + path;
 | ||
|     else
 | ||
|       url = server + path;
 | ||
|     return url;
 | ||
|   }
 | ||
| 
 | ||
|   function iscsiURL(server, iqn, lun) {
 | ||
|     var url;
 | ||
|     if(server.indexOf("://")==-1)
 | ||
|       url = "iscsi://" + server + iqn + "/" + lun;
 | ||
|     else
 | ||
|       url = server + iqn + "/" + lun;
 | ||
|     return url;
 | ||
|   }
 | ||
| 
 | ||
|   function addExternalLoadBalancer(args, physicalNetworkObj, apiCmd, apiCmdRes) {    
 | ||
|     var array1 = [];
 | ||
|     array1.push("&physicalnetworkid=" + physicalNetworkObj.id);                                 
 | ||
|     array1.push("&username=" + todb(args.data.username));
 | ||
|     array1.push("&password=" + todb(args.data.password));
 | ||
|     array1.push("&networkdevicetype=" + todb(args.data.networkdevicetype));
 | ||
|                                                                        
 | ||
|     //construct URL starts here
 | ||
|     var url = [];
 | ||
|     
 | ||
|     var ip = args.data.ip;
 | ||
|     url.push("https://" + ip);	 
 | ||
|     
 | ||
|     var isQuestionMarkAdded = false;
 | ||
|     
 | ||
|     var publicInterface = args.data.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.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.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.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.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.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(apiCmd + array1.join("")),
 | ||
|       dataType: "json",
 | ||
|       success: function(json) {         
 | ||
|         var jid = json[apiCmdRes].jobid;                                                                          
 | ||
|         args.response.success(
 | ||
|           {_custom:
 | ||
|            {jobId: jid,
 | ||
|             getUpdatedItem: function(json) {                           
 | ||
|               var item = json.queryasyncjobresultresponse.jobresult.loadbalancer;
 | ||
|               return {data: item};
 | ||
|             }
 | ||
|            }
 | ||
|           }
 | ||
|         );           
 | ||
|       }
 | ||
|     });    
 | ||
|   }
 | ||
|   
 | ||
|   function addExternalFirewall(args, physicalNetworkObj, apiCmd, apiCmdRes){   
 | ||
|     var array1 = [];
 | ||
|     array1.push("&physicalnetworkid=" + physicalNetworkObj.id);                                 
 | ||
|     array1.push("&username=" + todb(args.data.username));
 | ||
|     array1.push("&password=" + todb(args.data.password));
 | ||
|     array1.push("&networkdevicetype=" + todb(args.data.networkdevicetype));
 | ||
|                                                                        
 | ||
|     //construct URL starts here
 | ||
|     var url = [];
 | ||
|     
 | ||
|     var ip = args.data.ip;
 | ||
|     url.push("https://" + ip);	 
 | ||
|    
 | ||
|     var isQuestionMarkAdded = false;
 | ||
|     
 | ||
|     var publicInterface = args.data.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.privateinterface;
 | ||
|     if(privateInterface != null && privateInterface.length > 0) {
 | ||
|         if(isQuestionMarkAdded == false) {
 | ||
|             url.push("?");
 | ||
|             isQuestionMarkAdded = true;
 | ||
|         }
 | ||
|         else {
 | ||
|             url.push("&");
 | ||
|         }  		
 | ||
|         url.push("privateinterface=" + privateInterface); 
 | ||
|     }
 | ||
|     
 | ||
|     var usageInterface = args.data.usageinterface;
 | ||
|     if(usageInterface != null && usageInterface.length > 0) {
 | ||
|         if(isQuestionMarkAdded == false) {
 | ||
|             url.push("?");
 | ||
|             isQuestionMarkAdded = true;
 | ||
|         }
 | ||
|         else {
 | ||
|             url.push("&");
 | ||
|         }  		
 | ||
|         url.push("usageinterface=" + usageInterface); 
 | ||
|     }
 | ||
|     
 | ||
|     var numretries = args.data.numretries;
 | ||
|     if(numretries != null && numretries.length > 0) {
 | ||
|         if(isQuestionMarkAdded == false) {
 | ||
|             url.push("?");
 | ||
|             isQuestionMarkAdded = true;
 | ||
|         }
 | ||
|         else {
 | ||
|             url.push("&");
 | ||
|         }  		
 | ||
|         url.push("numretries=" + numretries); 	
 | ||
|     }		
 | ||
|     
 | ||
|     var timeout = args.data.timeout;
 | ||
|     if(timeout != null && timeout.length > 0) {
 | ||
|         if(isQuestionMarkAdded == false) {
 | ||
|             url.push("?");
 | ||
|             isQuestionMarkAdded = true;
 | ||
|         }
 | ||
|         else {
 | ||
|             url.push("&");
 | ||
|         }  		
 | ||
|         url.push("timeout=" + timeout); 	
 | ||
|     }		
 | ||
|     
 | ||
|     var isInline = args.data.inline;				
 | ||
|     if(isInline != null && isInline.length > 0) {
 | ||
|         if(isQuestionMarkAdded == false) {
 | ||
|             url.push("?");
 | ||
|             isQuestionMarkAdded = true;
 | ||
|         }
 | ||
|         else {
 | ||
|             url.push("&");
 | ||
|         }  		
 | ||
|         url.push("inline=" + isInline); 
 | ||
|     }
 | ||
|                                      
 | ||
|     var publicNetwork = args.data.publicnetwork;
 | ||
|     if(publicNetwork != null && publicNetwork.length > 0) {
 | ||
|         if(isQuestionMarkAdded == false) {
 | ||
|             url.push("?");
 | ||
|             isQuestionMarkAdded = true;
 | ||
|         }
 | ||
|         else {
 | ||
|             url.push("&");
 | ||
|         }  				    
 | ||
|         url.push("publicnetwork=" + publicNetwork); 
 | ||
|     }
 | ||
|         
 | ||
|     var privateNetwork = args.data.privatenetwork;
 | ||
|     if(privateNetwork != null && privateNetwork.length > 0) {
 | ||
|         if(isQuestionMarkAdded == false) {
 | ||
|             url.push("?");
 | ||
|             isQuestionMarkAdded = true;
 | ||
|         }
 | ||
|         else {
 | ||
|             url.push("&");
 | ||
|         }  		
 | ||
|         url.push("privatenetwork=" + privateNetwork); 
 | ||
|     }
 | ||
|                                     
 | ||
|     var capacity = args.data.capacity;				
 | ||
|     if(capacity != null && capacity.length > 0) {
 | ||
|         if(isQuestionMarkAdded == false) {
 | ||
|             url.push("?");
 | ||
|             isQuestionMarkAdded = true;
 | ||
|         }
 | ||
|         else {
 | ||
|             url.push("&");
 | ||
|         } 
 | ||
|         url.push("fwdevicecapacity=" + capacity);    
 | ||
|     }
 | ||
|    
 | ||
|     var dedicated = (args.data.dedicated == "on");	//boolean	(true/false)			    
 | ||
|     if(isQuestionMarkAdded == false) {
 | ||
|         url.push("?");
 | ||
|         isQuestionMarkAdded = true;
 | ||
|     }
 | ||
|     else {
 | ||
|         url.push("&");
 | ||
|     }  
 | ||
|     url.push("fwdevicededicated=" + dedicated.toString());       
 | ||
|          
 | ||
|     array1.push("&url=" + todb(url.join("")));	                                                                   
 | ||
|     //construct URL ends here		
 | ||
|                                       
 | ||
|     $.ajax({
 | ||
|       url: createURL(apiCmd + array1.join("")),
 | ||
|       dataType: "json",
 | ||
|       success: function(json) {  
 | ||
|         var jid = json[apiCmdRes].jobid;                                                                          
 | ||
|         args.response.success(
 | ||
|           {_custom:
 | ||
|            {jobId: jid,
 | ||
|             getUpdatedItem: function(json) {                           
 | ||
|               var item = json.queryasyncjobresultresponse.jobresult.firewall;
 | ||
|               return {data: item};
 | ||
|             }
 | ||
|            }
 | ||
|           }
 | ||
|         );           
 | ||
|       }
 | ||
|     });    
 | ||
|   }
 | ||
|   
 | ||
|   //action filters (begin)
 | ||
|   var zoneActionfilter = function(args) {
 | ||
|     var jsonObj = args.context.item;
 | ||
|     var allowedActions = [];
 | ||
|     allowedActions.push("edit");
 | ||
|     if(jsonObj.allocationstate == "Disabled")
 | ||
|       allowedActions.push("enable");
 | ||
|     else if(jsonObj.allocationstate == "Enabled")
 | ||
|       allowedActions.push("disable");
 | ||
|     allowedActions.push("delete");
 | ||
|     return allowedActions;
 | ||
|   }
 | ||
| 
 | ||
|   var podActionfilter = function(args) {
 | ||
|     var podObj = args.context.item;
 | ||
|     var allowedActions = [];
 | ||
|     allowedActions.push("edit");
 | ||
|     if(podObj.allocationstate == "Disabled")
 | ||
|       allowedActions.push("enable");
 | ||
|     else if(podObj.allocationstate == "Enabled")
 | ||
|       allowedActions.push("disable");
 | ||
|     allowedActions.push("delete");
 | ||
| 
 | ||
|     /*
 | ||
|     var selectedZoneObj;
 | ||
|     $(zoneObjs).each(function(){
 | ||
|       if(this.id == podObj.zoneid) {
 | ||
|         selectedZoneObj = this;
 | ||
|         return false;  //break the $.each() loop
 | ||
|       }
 | ||
|     });
 | ||
|     */
 | ||
|   
 | ||
|     if(selectedZoneObj.networktype == "Basic") { //basic-mode network (pod-wide VLAN)
 | ||
|       //$("#tab_ipallocation, #add_iprange_button, #tab_network_device, #add_network_device_button").show();
 | ||
|       allowedActions.push("addIpRange");
 | ||
|       allowedActions.push("addNetworkDevice");
 | ||
|     }
 | ||
|     else if(selectedZoneObj.networktype == "Advanced") { //advanced-mode network (zone-wide VLAN)
 | ||
|       //$("#tab_ipallocation, #add_iprange_button, #tab_network_device, #add_network_device_button").hide();
 | ||
|     }
 | ||
| 
 | ||
|     return allowedActions;
 | ||
|   }
 | ||
| 
 | ||
|   var networkDeviceActionfilter = function(args) {
 | ||
|     var jsonObj = args.context.item;
 | ||
|     var allowedActions = [];
 | ||
|     return allowedActions;
 | ||
|   }
 | ||
| 
 | ||
|   var clusterActionfilter = function(args) {
 | ||
|     var jsonObj = args.context.item;
 | ||
|     var allowedActions = [];
 | ||
| 
 | ||
|     if(jsonObj.allocationstate == "Disabled")
 | ||
|       allowedActions.push("enable");
 | ||
|     else if(jsonObj.allocationstate == "Enabled")
 | ||
|       allowedActions.push("disable");
 | ||
| 
 | ||
|     if(jsonObj.managedstate == "Managed")
 | ||
|       allowedActions.push("unmanage");
 | ||
|     else //PrepareUnmanaged , PrepareUnmanagedError, Unmanaged
 | ||
|       allowedActions.push("manage");
 | ||
| 
 | ||
|     allowedActions.push("delete");
 | ||
| 
 | ||
|     return allowedActions;
 | ||
|   }
 | ||
| 
 | ||
|   var hostActionfilter = function(args) {
 | ||
|     var jsonObj = args.context.item;
 | ||
|     var allowedActions = [];
 | ||
| 
 | ||
|     if (jsonObj.state == 'Up' || jsonObj.state == "Connecting") {
 | ||
|       allowedActions.push("edit");
 | ||
|       allowedActions.push("enableMaintenanceMode");
 | ||
|       allowedActions.push("forceReconnect");
 | ||
|     }
 | ||
|     else if(jsonObj.state == 'Down') {
 | ||
|       allowedActions.push("edit");
 | ||
|       allowedActions.push("enableMaintenanceMode");
 | ||
|       allowedActions.push("delete");
 | ||
|     }
 | ||
|     else if(jsonObj.state == "Alert") {
 | ||
|       allowedActions.push("edit");
 | ||
|       allowedActions.push("delete");
 | ||
|     }
 | ||
|     else if (jsonObj.state == "ErrorInMaintenance") {
 | ||
|       allowedActions.push("edit");
 | ||
|       allowedActions.push("enableMaintenanceMode");
 | ||
|       allowedActions.push("cancelMaintenanceMode");
 | ||
|     }
 | ||
|     else if (jsonObj.state == "PrepareForMaintenance") {
 | ||
|       allowedActions.push("edit");
 | ||
|       allowedActions.push("cancelMaintenanceMode");
 | ||
|     }
 | ||
|     else if (jsonObj.state == "Maintenance") {
 | ||
|       allowedActions.push("edit");
 | ||
|       allowedActions.push("cancelMaintenanceMode");
 | ||
|       allowedActions.push("delete");
 | ||
|     }
 | ||
|     else if (jsonObj.state == "Disconnected"){
 | ||
|       allowedActions.push("edit");
 | ||
|       allowedActions.push("delete");
 | ||
|     }
 | ||
|     return allowedActions;
 | ||
|   }
 | ||
| 
 | ||
|   var primarystorageActionfilter = function(args) {
 | ||
|     var jsonObj = args.context.item;
 | ||
|     var allowedActions = [];
 | ||
| 
 | ||
|     if (jsonObj.state == 'Up' || jsonObj.state == "Connecting") {
 | ||
|       allowedActions.push("enableMaintenanceMode");
 | ||
|     }
 | ||
|     else if(jsonObj.state == 'Down') {
 | ||
|       allowedActions.push("enableMaintenanceMode");
 | ||
|       allowedActions.push("delete");
 | ||
|     }
 | ||
|     else if(jsonObj.state == "Alert") {
 | ||
|       allowedActions.push("delete");
 | ||
|     }
 | ||
|     else if (jsonObj.state == "ErrorInMaintenance") {
 | ||
|       allowedActions.push("enableMaintenanceMode");
 | ||
|       allowedActions.push("cancelMaintenanceMode");
 | ||
|     }
 | ||
|     else if (jsonObj.state == "PrepareForMaintenance") {
 | ||
|       allowedActions.push("cancelMaintenanceMode");
 | ||
|     }
 | ||
|     else if (jsonObj.state == "Maintenance") {
 | ||
|       allowedActions.push("cancelMaintenanceMode");
 | ||
|       allowedActions.push("delete");
 | ||
|     }
 | ||
|     else if (jsonObj.state == "Disconnected"){
 | ||
|       allowedActions.push("delete");
 | ||
|     }
 | ||
|     return allowedActions;
 | ||
|   }
 | ||
| 
 | ||
|   var secondarystorageActionfilter = function(args) {
 | ||
|     var jsonObj = args.context.item;
 | ||
|     var allowedActions = [];
 | ||
|     allowedActions.push("delete");
 | ||
|     return allowedActions;
 | ||
|   }
 | ||
| 
 | ||
|   var publicNetworkActionfilter = function(args) {
 | ||
|     var jsonObj = args.context.item;
 | ||
|     var allowedActions = [];
 | ||
|     allowedActions.push("addIpRange");
 | ||
|     return allowedActions;
 | ||
|   }
 | ||
| 
 | ||
|   var directNetworkActionfilter = function(args) {
 | ||
|     var jsonObj = args.context.item;
 | ||
|     var allowedActions = [];
 | ||
|     allowedActions.push("addIpRange");
 | ||
|     allowedActions.push("edit");
 | ||
|     allowedActions.push("delete");
 | ||
|     return allowedActions;
 | ||
|   }
 | ||
| 
 | ||
|   var routerActionfilter = function(args) {
 | ||
|     var jsonObj = args.context.item;
 | ||
|     var allowedActions = [];
 | ||
| 
 | ||
|     if (jsonObj.state == 'Running') {
 | ||
|       allowedActions.push("stop");
 | ||
|       allowedActions.push("restart");
 | ||
|       allowedActions.push("changeService");
 | ||
|       allowedActions.push("viewConsole");
 | ||
|       if (isAdmin())
 | ||
|         allowedActions.push("migrate");
 | ||
|     }
 | ||
|     else if (jsonObj.state == 'Stopped') {
 | ||
|       allowedActions.push("start");
 | ||
|       allowedActions.push("changeService");
 | ||
|     }
 | ||
|     return allowedActions;
 | ||
|   }
 | ||
| 
 | ||
|   var systemvmActionfilter = function(args) {
 | ||
|     var jsonObj = args.context.item;
 | ||
|     var allowedActions = [];
 | ||
| 
 | ||
|     if (jsonObj.state == 'Running') {
 | ||
|       allowedActions.push("stop");
 | ||
|       allowedActions.push("restart");
 | ||
|       allowedActions.push("delete");  //destroy
 | ||
|       allowedActions.push("viewConsole");
 | ||
|       if (isAdmin())
 | ||
|         allowedActions.push("migrate");
 | ||
|     }
 | ||
|     else if (jsonObj.state == 'Stopped') {
 | ||
|       allowedActions.push("start");
 | ||
|       allowedActions.push("delete");  //destroy
 | ||
|     }
 | ||
|     else if (jsonObj.state == 'Error') {
 | ||
|       allowedActions.push("delete");  //destroy
 | ||
|     }
 | ||
|     return allowedActions;
 | ||
|   }
 | ||
|   //action filters (end)
 | ||
| 
 | ||
| })($, cloudStack, testData);
 |