mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			1432 lines
		
	
	
		
			51 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			1432 lines
		
	
	
		
			51 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Licensed to the Apache Software Foundation (ASF) under one
 | |
| // or more contributor license agreements.  See the NOTICE file
 | |
| // distributed with this work for additional information
 | |
| // regarding copyright ownership.  The ASF licenses this file
 | |
| // to you under the Apache License, Version 2.0 (the
 | |
| // "License"); you may not use this file except in compliance
 | |
| // with the License.  You may obtain a copy of the License at
 | |
| //
 | |
| //   http://www.apache.org/licenses/LICENSE-2.0
 | |
| //
 | |
| // Unless required by applicable law or agreed to in writing,
 | |
| // software distributed under the License is distributed on an
 | |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 | |
| // KIND, either express or implied.  See the License for the
 | |
| // specific language governing permissions and limitations
 | |
| // under the License.
 | |
| 
 | |
| (function($,cloudstack) {
 | |
|   var scaleUpData = [];
 | |
|   var totalScaleUpCondition = 0;
 | |
|   var scaleDownData = [];
 | |
|   var totalScaleDownCondition = 0;
 | |
| 
 | |
|   cloudStack.autoscaler = {
 | |
|     // UI actions to appear in dialog
 | |
|     autoscaleActions: {
 | |
|       enable: {
 | |
|         label: 'Enable Autoscale',
 | |
|         action: function(args) {				
 | |
| 				  $.ajax({
 | |
| 					  url: createURL('enableAutoScaleVmGroup'),
 | |
| 						data: {
 | |
| 						  id: args.context.originalAutoscaleData.context.autoscaleVmGroup.id
 | |
| 						},
 | |
| 						success: function(json) {						  				
 | |
| 							var jid = json.enableautoscalevmGroupresponse.jobid;
 | |
| 							args.response.success({
 | |
| 							  _custom: {
 | |
| 								  jobId: jid,
 | |
| 									getUpdatedItem: function(json) {									  
 | |
| 										return json.queryasyncjobresultresponse.jobresult.autoscalevmgroup;
 | |
| 									},
 | |
| 									getActionFilter: function() {									  
 | |
| 										return cloudStack.autoscaler.actionFilter;										
 | |
| 									}
 | |
| 								},								
 | |
| 								notification: {
 | |
| 									poll: pollAsyncJobResult
 | |
| 								}								
 | |
| 							});															
 | |
| 						}
 | |
| 					});          
 | |
|         }
 | |
|       },
 | |
|       disable: {
 | |
|         label: 'Disable Autoscale',
 | |
|         action: function(args) {				  
 | |
| 				  $.ajax({
 | |
| 					  url: createURL('disableAutoScaleVmGroup'),
 | |
| 						data: {
 | |
| 						  id: args.context.originalAutoscaleData.context.autoscaleVmGroup.id
 | |
| 						},
 | |
| 						success: function(json) {						  			
 | |
| 							var jid = json.disableautoscalevmGroupresponse.jobid;
 | |
| 							args.response.success({
 | |
| 							  _custom: {
 | |
| 								  jobId: jid,
 | |
| 									getUpdatedItem: function(json) {									  
 | |
| 										return json.queryasyncjobresultresponse.jobresult.autoscalevmgroup;
 | |
| 									},
 | |
| 									getActionFilter: function() {									  
 | |
| 										return cloudStack.autoscaler.actionFilter;										
 | |
| 									}
 | |
| 								},								
 | |
| 								notification: {
 | |
| 									poll: pollAsyncJobResult
 | |
| 								}								
 | |
| 							});															
 | |
| 						}
 | |
| 					});          
 | |
|         }
 | |
|       }
 | |
|     },
 | |
|     actionFilter: function(args) {		  
 | |
| 			var allowedActions = [];		
 | |
| 			if(args.context.originalAutoscaleData == null) { //new LB rule
 | |
| 			  //no actions  for new LB rule
 | |
| 			}
 | |
| 			else { //existing LB rule			  
 | |
|         if(args.context.originalAutoscaleData[0].afterActionIsComplete == null) {	
 | |
| 					if(args.context.originalAutoscaleData[0].context.autoscaleVmGroup.state == 'disabled')
 | |
| 						allowedActions.push('enable');
 | |
| 					else if(args.context.originalAutoscaleData[0].context.autoscaleVmGroup.state == 'enabled')
 | |
| 						allowedActions.push('disable');		
 | |
|         }			
 | |
|         else {
 | |
|           if(args.context.originalAutoscaleData[0].afterActionIsComplete.state == 'disabled')
 | |
| 						allowedActions.push('enable');
 | |
| 					else if(args.context.originalAutoscaleData[0].afterActionIsComplete.state == 'enabled')
 | |
| 						allowedActions.push('disable');		
 | |
|         }				
 | |
| 			}	
 | |
| 			return allowedActions;      
 | |
|     },
 | |
|     dataProvider: function(args) {
 | |
|       // Reset data
 | |
|       scaleUpData = [];
 | |
|       totalScaleUpCondition = 0;
 | |
|       scaleDownData = [];
 | |
|       totalScaleDownCondition = 0;
 | |
|       
 | |
| 			if(!('multiRules' in args.context)) { //from a new LB 			
 | |
| 			  args.response.success({ data: null });		
 | |
|       }				
 | |
| 			else { //from an existing LB
 | |
| 				$.ajax({
 | |
| 				  url: createURL('listAutoScaleVmGroups'),
 | |
| 					data: {
 | |
| 					  listAll: true,
 | |
| 					  lbruleid: args.context.multiRules[0].id
 | |
| 					},					
 | |
| 					success: function(json) {					  
 | |
| 						var autoscaleVmGroup = json.listautoscalevmgroupsresponse.autoscalevmgroup[0];
 | |
| 						
 | |
| 						$.ajax({
 | |
| 						  url: createURL('listAutoScaleVmProfiles'),
 | |
| 							data: {
 | |
| 							  listAll: true,
 | |
| 							  id: autoscaleVmGroup.vmprofileid
 | |
| 							}, 
 | |
| 							success: function(json) {							  
 | |
| 								var autoscaleVmProfile = json.listautoscalevmprofilesresponse.autoscalevmprofile[0];
 | |
| 																
 | |
| 								var scaleUpPolicy = {
 | |
| 								  id: autoscaleVmGroup.scaleuppolicies[0].id,
 | |
| 									duration: autoscaleVmGroup.scaleuppolicies[0].duration,
 | |
| 									conditions: []
 | |
| 								};								
 | |
| 								$(autoscaleVmGroup.scaleuppolicies[0].conditions).each(function(){								  
 | |
| 									var condition = {
 | |
| 									  id: this.id,
 | |
| 										counterid: this.counter[0].id,										
 | |
| 										relationaloperator: this.relationaloperator,
 | |
| 										threshold: this.threshold
 | |
| 									};
 | |
| 									scaleUpPolicy.conditions.push(condition);
 | |
| 								});
 | |
| 										
 | |
|                 var scaleDownPolicy = {
 | |
| 								  id: autoscaleVmGroup.scaledownpolicies[0].id,
 | |
| 									duration: autoscaleVmGroup.scaledownpolicies[0].duration,
 | |
| 									conditions: []
 | |
| 								};								
 | |
| 								$(autoscaleVmGroup.scaledownpolicies[0].conditions).each(function(){								  
 | |
| 									var condition = {
 | |
| 									  id: this.id,
 | |
| 										counterid: this.counter[0].id,										
 | |
| 										relationaloperator: this.relationaloperator,
 | |
| 										threshold: this.threshold.toString()
 | |
| 									};
 | |
| 									scaleDownPolicy.conditions.push(condition);
 | |
| 								});
 | |
| 																							
 | |
| 								var diskOfferingId, securityGroups;
 | |
|                 var otherdeployparams = autoscaleVmProfile.otherdeployparams;
 | |
| 								if(otherdeployparams != null && otherdeployparams.length > 0) {
 | |
| 									var array1 = otherdeployparams.split('&');
 | |
| 									$(array1).each(function(){								 
 | |
| 										var array2 = this.split('=');
 | |
| 										if(array2[0] == 'diskofferingid')
 | |
| 											diskOfferingId= array2[1];
 | |
| 										if(array2[0] == 'securitygroupids')
 | |
| 											securityGroups = array2[1];									
 | |
| 									});								                				
 | |
| 								}
 | |
| 								
 | |
| 								var originalAutoscaleData = {
 | |
| 									templateNames: autoscaleVmProfile.templateid,
 | |
| 									serviceOfferingId: autoscaleVmProfile.serviceofferingid,
 | |
| 									minInstance: autoscaleVmGroup.minmembers, 
 | |
| 									maxInstance: autoscaleVmGroup.maxmembers, 
 | |
| 									scaleUpPolicy: scaleUpPolicy,
 | |
| 									scaleDownPolicy: scaleDownPolicy,
 | |
| 									interval: autoscaleVmGroup.interval, 
 | |
| 									quietTime: autoscaleVmGroup.scaleuppolicies[0].quiettime, 
 | |
| 									destroyVMgracePeriod: autoscaleVmProfile.destroyvmgraceperiod,
 | |
| 									securityGroups: securityGroups, 
 | |
| 									diskOfferingId: diskOfferingId, 
 | |
| 									snmpCommunity: autoscaleVmProfile.counterparam.snmpcommunity,
 | |
| 									snmpPort: autoscaleVmProfile.counterparam.snmpport,
 | |
| 									username: autoscaleVmProfile.autoscaleuserid,
 | |
| 									context: {
 | |
| 									  autoscaleVmGroup: autoscaleVmGroup,
 | |
| 										autoscaleVmProfile: autoscaleVmProfile
 | |
| 									}
 | |
| 									//isAdvanced: false // Set this to true if any advanced field data is present
 | |
| 								};
 | |
| 								
 | |
| 								args.response.success({ data: originalAutoscaleData });								
 | |
| 							}						
 | |
| 						});						
 | |
| 					}				  
 | |
| 				});		
 | |
| 			}         		
 | |
|     },
 | |
| 
 | |
|     // --
 | |
|     // Add the following object blocks:
 | |
|     //
 | |
|     // topFields: { <standard createForm field format> }
 | |
|     // bottomFields: { <standard createForm field format> },
 | |
|     // scaleUpPolicy: { <standard multiEdit field format> },
 | |
|     // scaleDownPolicy: { <standard multiEdit field format> }
 | |
|     // --
 | |
|     //
 | |
|     forms: {
 | |
|       topFields: {
 | |
|         //**
 | |
|         //** Disabled due to UI issues
 | |
|         //**
 | |
|         // templateCategory: {
 | |
|         //   label: 'Template',
 | |
|         //   id: 'templatecategory',
 | |
|         //   select: function(args) {
 | |
|         //     args.response.success({
 | |
|         //       data: [
 | |
|         //         { id: 'all', description: _l('ui.listView.filters.all') },
 | |
|         //         { id: 'featured', description: _l('label.featured') },
 | |
|         //         { id: 'Community', description: _l('label.menu.community.templates') },
 | |
|         //         { id: 'self', description: _l('ui.listView.filters.mine') }
 | |
|         //       ]
 | |
|         //     });
 | |
|         //   }
 | |
|         // },
 | |
|         //**
 | |
| 
 | |
|         templateNames: {
 | |
|           label: 'label.template',
 | |
|           id: 'templatename',
 | |
|           select: function(args) {
 | |
|             var templates;
 | |
|             var templateIdMap = {};
 | |
|             $.ajax({
 | |
|               url: createURL('listTemplates'),
 | |
|               data: {
 | |
|                 templatefilter: 'featured',
 | |
|                 zoneid: args.context.networks[0].zoneid
 | |
|               },
 | |
|               async: false,
 | |
|               success: function(json) {
 | |
|                 templates = json.listtemplatesresponse.template;
 | |
|                 if (templates == null)
 | |
|                   templates = [];
 | |
|                 $(templates).each(function() {
 | |
|                   templateIdMap[this.id] = 1;
 | |
|                 });
 | |
|               }
 | |
|             });
 | |
| 
 | |
|             $.ajax({
 | |
|               url: createURL('listTemplates'),
 | |
|               data: {
 | |
|                 templatefilter: 'community',
 | |
|                 zoneid: args.context.networks[0].zoneid
 | |
|               },
 | |
|               async: false,
 | |
|               success: function(json) {
 | |
|                 var items = json.listtemplatesresponse.template;
 | |
|                 $(items).each(function() {
 | |
|                   if(!(this.id in templateIdMap)) {
 | |
|                     templates.push(this);
 | |
|                     templateIdMap[this.id] = 1;
 | |
|                   }
 | |
|                 });
 | |
|               }
 | |
|             });
 | |
| 
 | |
|             $.ajax({
 | |
|               url: createURL('listTemplates'),
 | |
|               data: {
 | |
|                 templatefilter: 'selfexecutable',
 | |
|                 zoneid: args.context.networks[0].zoneid
 | |
|               },
 | |
|               async: false,
 | |
|               success: function(json) {
 | |
|                 var items = json.listtemplatesresponse.template;
 | |
|                 $(items).each(function() {
 | |
|                   if(!(this.id in templateIdMap)) {
 | |
|                     templates.push(this);
 | |
|                     templateIdMap[this.id] = 1;
 | |
|                   }
 | |
|                 });
 | |
|               }
 | |
|             });
 | |
| 
 | |
|             args.response.success({
 | |
|               data: $.map(templates, function(template) {
 | |
|                 return {
 | |
|                   id: template.id,
 | |
|                   description: template.name
 | |
|                 };
 | |
|               })
 | |
|             });
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         serviceOfferingId: {
 | |
|           label: 'label.compute.offering',
 | |
|           select: function(args) {
 | |
|             $.ajax({
 | |
|               url: createURL("listServiceOfferings&issystem=false"),
 | |
|               dataType: "json",
 | |
|               async: true,
 | |
|               success: function(json) {
 | |
|                 var serviceofferings = json.listserviceofferingsresponse.serviceoffering;
 | |
|                 args.response.success({
 | |
|                   data: $.map(serviceofferings, function(serviceoffering) {
 | |
|                     return {
 | |
|                       id: serviceoffering.id,
 | |
|                       description: serviceoffering.name
 | |
|                     };
 | |
|                   })
 | |
|                 });
 | |
|               }
 | |
|             });
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         minInstance: {
 | |
|           label: 'Min Instances',
 | |
|           defaultValue: '3',
 | |
|           validation: { 
 | |
| 					  required: true,
 | |
| 						number: true
 | |
| 					}
 | |
|         },
 | |
| 
 | |
|         maxInstance: {
 | |
|           label: 'Max Instances',
 | |
|           defaultValue: '10',
 | |
|           validation: { 
 | |
| 					  required: true,
 | |
| 						number: true
 | |
| 					}
 | |
|         }
 | |
|       },
 | |
| 
 | |
|       bottomFields: {
 | |
|         isAdvanced: { isBoolean: true, label: 'Show advanced settings' },
 | |
|         interval: {
 | |
|           label: 'Polling Interval (in sec)',
 | |
|           defaultValue: '30',
 | |
|           validation: { 
 | |
| 					  required: true,
 | |
| 						number: true
 | |
| 					}
 | |
|         },
 | |
| 
 | |
|         quietTime: {
 | |
|           label: 'Quiet Time (in sec)',
 | |
|           defaultValue: '300',
 | |
|           validation: { 
 | |
| 					  required: true,
 | |
|             number: true						
 | |
| 					}
 | |
|         },
 | |
| 
 | |
|         destroyVMgracePeriod: {
 | |
|           label: 'Destroy VM Grace Period',
 | |
|           defaultValue: '30',
 | |
|           isHidden:true,
 | |
|           dependsOn:'isAdvanced',
 | |
|           validation: { 
 | |
| 					  required: true,
 | |
| 						number: true
 | |
| 					}
 | |
|         },
 | |
|         securityGroups: {
 | |
|           label: 'label.menu.security.groups',
 | |
|           isHidden: true,
 | |
|           dependsOn: 'isAdvanced',
 | |
|           select: function(args) {
 | |
|             $.ajax({
 | |
|               url: createURL("listSecurityGroups&listAll=true"),
 | |
|               dataType: "json",
 | |
|               async: true,
 | |
|               success: function(json) {
 | |
|                 var securitygroups = json.listsecuritygroupsresponse.securitygroup;
 | |
|                 var items = [];
 | |
|                 items.push({id: "", description: ""});
 | |
|                 $(securitygroups).each(function(){
 | |
|                   items.push({id: this.id, description: this.name});
 | |
|                 });
 | |
|                 args.response.success({ data: items });
 | |
|               }
 | |
|             });
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         diskOfferingId: {
 | |
|           label: 'label.menu.disk.offerings',
 | |
|           isHidden: true,
 | |
|           dependsOn: 'isAdvanced',
 | |
|           select: function(args) {
 | |
|             $.ajax({
 | |
|               url: createURL("listDiskOfferings&listAll=true"),
 | |
|               dataType: "json",
 | |
|               async: true,
 | |
|               success: function(json) {
 | |
|                 var diskofferings = json.listdiskofferingsresponse.diskoffering;
 | |
|                 var items = [];
 | |
|                 items.push({id: "", description: ""});
 | |
|                 $(diskofferings).each(function(){
 | |
|                   items.push({id: this.id, description: this.name});
 | |
|                 });
 | |
|                 args.response.success({ data: items });
 | |
|               }
 | |
|             });
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         snmpCommunity: {
 | |
|           isHidden: true,
 | |
|           dependsOn: 'isAdvanced',
 | |
|           label: 'SNMP Community',
 | |
|           defaultValue: 'public',
 | |
|           validation: { required: true }
 | |
|         },
 | |
| 
 | |
|         snmpPort: {
 | |
|           isHidden: true,
 | |
|           dependsOn: 'isAdvanced',
 | |
|           label: 'SNMP Port',
 | |
|           defaultValue: '161',
 | |
|           validation: { 
 | |
| 					  required: true,
 | |
| 						number: true
 | |
| 					}
 | |
|         },
 | |
| 
 | |
|         username: {
 | |
|           isHidden: true,
 | |
|           dependsOn: 'isAdvanced',
 | |
|           label: 'User',
 | |
|           select: function(args) {
 | |
|             var items = [];
 | |
| 						if(args.context.originalAutoscaleData == null) { //new LB rule
 | |
| 							if(isAdmin() || isDomainAdmin()) {
 | |
| 								$.ajax({
 | |
| 									url: createURL('listUsers'),
 | |
| 									data: {
 | |
| 										domainid: g_domainid,
 | |
| 										account: g_account
 | |
| 									},
 | |
| 									success: function(json) {
 | |
| 										var users = json.listusersresponse.user;
 | |
| 										$(users).each(function(){
 | |
| 											items.push({id: this.id, description: this.username});
 | |
| 										});
 | |
| 										args.response.success({ data: items });
 | |
| 									}
 | |
| 								});
 | |
| 							}
 | |
| 							else { //regular user doesn't have access to listUers API call.
 | |
| 								items.push({id: "", description: ""});
 | |
| 								args.response.success({ data: items });
 | |
| 							}
 | |
| 						}
 | |
| 						else { //existing LB rule
 | |
| 						  if(isAdmin() || isDomainAdmin()) {
 | |
| 								$.ajax({
 | |
| 									url: createURL('listUsers'),
 | |
| 									data: {
 | |
| 										domainid: args.context.originalAutoscaleData.context.autoscaleVmProfile.domainid,
 | |
| 										account: args.context.originalAutoscaleData.context.autoscaleVmProfile.account
 | |
| 									},
 | |
| 									success: function(json) {
 | |
| 										var users = json.listusersresponse.user;
 | |
| 										$(users).each(function(){
 | |
| 											items.push({id: this.id, description: this.username});
 | |
| 										});
 | |
| 										args.response.success({ data: items });
 | |
| 									}
 | |
| 								});
 | |
| 							}
 | |
| 							else { //regular user doesn't have access to listUers API call.
 | |
| 								items.push({id: "", description: ""});
 | |
| 								args.response.success({ data: items });
 | |
| 							}
 | |
| 						}
 | |
|           }
 | |
|         }
 | |
|       },
 | |
|       scaleUpPolicy: {
 | |
|         title: 'ScaleUp Policy',
 | |
|         label: 'SCALE UP POLICY',
 | |
|         noSelect: true,
 | |
|         noHeaderActionsColumn: true,
 | |
|         ignoreEmptyFields: true,
 | |
|         fields: {
 | |
|           'counterid': {
 | |
|             label: 'Counter',
 | |
|             select: function(args) {
 | |
|               $.ajax({
 | |
|                 url: createURL("listCounters"),
 | |
|                 dataType: "json",
 | |
|                 async: false,
 | |
|                 success: function(json) {
 | |
|                   var counters = json.counterresponse.counter;
 | |
| 
 | |
|                   args.response.success({
 | |
|                     data: $.map(counters, function(counter) {
 | |
|                       return {
 | |
|                         name: counter.id,
 | |
|                         description: counter.name
 | |
|                       };
 | |
|                     })
 | |
|                   });
 | |
|                 }
 | |
|               });
 | |
|             }
 | |
|           },
 | |
|           'relationaloperator': {
 | |
|             label: 'Operator',
 | |
|             select: function(args) {
 | |
|               args.response.success({
 | |
|                 data: [
 | |
|                   { name: 'GT', description: 'greater-than' },
 | |
|                   { name: 'GE', description: 'greater-than or equals to' },
 | |
|                   { name: 'LT', description: 'less-than' },
 | |
|                   { name: 'LE', description: 'less-than or equals to' },
 | |
|                   { name: 'EQ', description: 'equals-to' }
 | |
|                 ]
 | |
|               });
 | |
|             }
 | |
|           },
 | |
|           'threshold': { edit: true, label: 'Threshold' },
 | |
|           'add-scaleUpcondition': {
 | |
|             label: 'label.add',
 | |
|             addButton: true
 | |
|           }
 | |
|         },
 | |
|         add: {
 | |
|           label: 'label.add',
 | |
|           action: function(args) {
 | |
|             scaleUpData.push($.extend(args.data, {
 | |
|               index: totalScaleUpCondition
 | |
|             }));
 | |
| 
 | |
|             totalScaleUpCondition++;
 | |
|             args.response.success();
 | |
|           }
 | |
|         },
 | |
|         actions: {
 | |
|           destroy: {
 | |
|             label: '',
 | |
|             action: function(args) {
 | |
|               scaleUpData = $.grep(scaleUpData, function(item) {
 | |
|                 return item.index != args.context.multiRule[0].index;
 | |
|               });
 | |
|               totalScaleUpCondition--;
 | |
|               args.response.success();
 | |
|             }
 | |
|           }
 | |
|         },
 | |
|         dataProvider: function(args) {
 | |
|           var data = scaleUpData;
 | |
|           var $autoscaler = $('.ui-dialog .autoscaler');
 | |
|           var initialData = $autoscaler.data('autoscaler-scale-up-data');
 | |
| 
 | |
|           if ($.isArray(initialData)) {
 | |
|             $(initialData).each(function() {
 | |
|               this.index = totalScaleUpCondition;
 | |
|               totalScaleUpCondition++;
 | |
|               scaleUpData.push(this);
 | |
|             });
 | |
| 
 | |
|             $autoscaler.data('autoscaler-scale-up-data', null);
 | |
|           }
 | |
| 
 | |
|           args.response.success({
 | |
|             data: scaleUpData
 | |
|           });
 | |
|         }       
 | |
|       },
 | |
| 
 | |
|       scaleDownPolicy: {
 | |
|         title: 'ScaleDown Policy',
 | |
|         noSelect: true,
 | |
|         noHeaderActionsColumn: true,
 | |
|         ignoreEmptyFields: true,
 | |
|         fields: {
 | |
|           'counterid': {
 | |
|             label: 'Counter',
 | |
|             select: function(args) {
 | |
|               $.ajax({
 | |
|                 url: createURL("listCounters"),
 | |
|                 dataType: "json",
 | |
|                 async: false,
 | |
|                 success: function(json) {
 | |
|                   var counters = json.counterresponse.counter;
 | |
| 
 | |
|                   args.response.success({
 | |
|                     data: $.map(counters, function(counter) {
 | |
|                       return {
 | |
|                         name: counter.id,
 | |
|                         description: counter.name
 | |
|                       };
 | |
|                     })
 | |
|                   });
 | |
|                 }
 | |
|               });
 | |
|             }
 | |
|           },
 | |
|           'relationaloperator': {
 | |
|             label: 'Operator',
 | |
|             select: function(args) {
 | |
|               args.response.success({
 | |
|                 data: [
 | |
|                   { name: 'GT', description: 'greater-than' },
 | |
|                   { name: 'GE', description: 'greater-than or equals to' },
 | |
|                   { name: 'LT', description: 'less-than' },
 | |
|                   { name: 'LE', description: 'less-than or equals to' },
 | |
|                   { name: 'EQ', description: 'equals-to' }
 | |
|                 ]
 | |
|               });
 | |
|             }
 | |
|           },
 | |
|           'threshold': { edit: true, label: 'Threshold'},
 | |
|           'add-scaleDowncondition': {
 | |
|             label: 'label.add',
 | |
|             addButton: true
 | |
|           }
 | |
|         },
 | |
|         add: {
 | |
|           label: 'label.add',
 | |
|           action: function(args) {
 | |
|             scaleDownData.push($.extend(args.data, {
 | |
|               index: totalScaleDownCondition
 | |
|             }));
 | |
|             totalScaleDownCondition++;
 | |
|             args.response.success();
 | |
|           }
 | |
|         },
 | |
|         actions: {
 | |
|           destroy: {
 | |
|             label: '',
 | |
|             action: function(args) {
 | |
|               scaleDownData = $.grep(scaleDownData, function(item) {
 | |
|                 return item.index != args.context.multiRule[0].index;
 | |
|               });
 | |
|               totalScaleDownCondition--;
 | |
|               args.response.success();
 | |
|             }
 | |
|           }
 | |
|         },
 | |
|         dataProvider: function(args) {
 | |
|           var data = scaleDownData;
 | |
|           var $autoscaler = $('.ui-dialog .autoscaler');
 | |
|           var initialData = $autoscaler.data('autoscaler-scale-down-data');
 | |
| 
 | |
|           if ($.isArray(initialData)) {
 | |
|             $(initialData).each(function() {
 | |
|               this.index = totalScaleDownCondition;
 | |
|               totalScaleDownCondition++;
 | |
|               scaleDownData.push(this);
 | |
|             });
 | |
| 
 | |
|             $autoscaler.data('autoscaler-scale-down-data', null);
 | |
|           }
 | |
| 
 | |
|           args.response.success({
 | |
|             data: scaleDownData
 | |
|           });
 | |
|         }        
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     actions: {
 | |
|       apply: function(args) {
 | |
|         //validation (begin) *****		        	
 | |
| 				if(!('multiRules' in args.context)) { //from a new LB 			
 | |
| 				  if(args.formData.name == '' || args.formData.publicport == '' || args.formData.privateport == '') {
 | |
| 					  args.response.error('Name, Public Port, Private Port of Load Balancing are required. Please close this dialog box and fill Name, Public Port, Private Port first.');
 | |
|             return;
 | |
| 					}
 | |
| 				}			
 | |
|         else { //from an existing LB				  
 | |
| 					if(args.context.originalAutoscaleData.afterActionIsComplete == null) {	
 | |
| 						if(args.context.originalAutoscaleData.context.autoscaleVmGroup.state != 'disabled') {
 | |
| 						  args.response.error('An Autoscale VM Group can be updated only if it is in disabled state. Please disable the Autoscale VM Group first.');
 | |
|               return;
 | |
| 						}               
 | |
| 					}			
 | |
| 					else {
 | |
| 						if(args.context.originalAutoscaleData.afterActionIsComplete.state != 'disabled') {
 | |
| 						  args.response.error('An Autoscale VM Group can be updated only if it is in disabled state. Please disable the Autoscale VM Group first.');
 | |
|               return;
 | |
| 						}
 | |
| 					}		
 | |
|         }				
 | |
| 				
 | |
|         if(isAdmin() || isDomainAdmin()) { //only admin and domain-admin has access to listUers API
 | |
|           var havingApiKeyAndSecretKey = false;
 | |
|           $.ajax({
 | |
|             url: createURL('listUsers'),
 | |
|             data: {
 | |
|               id: args.data.username
 | |
|             },
 | |
|             async: false,
 | |
|             success: function(json) {
 | |
|               if(json.listusersresponse.user[0].apikey != null && json.listusersresponse.user[0].secretkey != null) {
 | |
|                 havingApiKeyAndSecretKey = true;
 | |
|               }
 | |
|             }
 | |
|           });
 | |
|           if(havingApiKeyAndSecretKey == false) {
 | |
|             args.response.error('The selected user in advanced settings does not have API key or secret key');
 | |
|             return;
 | |
|           }
 | |
|         }
 | |
| 
 | |
|         if(isAdmin()) { //only admin has access to listConfigurations API
 | |
|           var hasValidEndpointeUrl = false;
 | |
|           $.ajax({
 | |
|             url: createURL('listConfigurations'),
 | |
|             data: {
 | |
|               name: 'endpointe.url'
 | |
|             },
 | |
|             async: false,
 | |
|             success: function(json) {
 | |
|               if(json.listconfigurationsresponse.configuration != null) {
 | |
|                 if(json.listconfigurationsresponse.configuration[0].value.indexOf('localhost') == -1) {
 | |
|                   hasValidEndpointeUrl = true;
 | |
|                 }
 | |
|               }
 | |
|             }
 | |
|           });
 | |
|           if(hasValidEndpointeUrl == false) {
 | |
|             args.response.error("Global setting endpointe.url has to be set to the Management Server's API end point");
 | |
|             return;
 | |
|           }
 | |
|         }
 | |
| 				
 | |
|         //Scale Up Policy				
 | |
| 				if(args.data.scaleUpDuration == null || args.data.scaleUpDuration.length == 0) {
 | |
| 				  args.response.error("Duration of Scale Up Policy is required.");
 | |
| 				  return;
 | |
| 				}				
 | |
| 				if(isNaN(args.data.scaleUpDuration)) {
 | |
| 				  args.response.error("Duration of Scale Up Policy should be a number.");
 | |
| 				  return;
 | |
| 				}				
 | |
| 				if(parseInt(args.data.scaleUpDuration) < parseInt(args.data.interval)) {
 | |
| 				  args.response.error("Duration of Scale Up Policy must be greater than or equal to Polling Interval.");
 | |
| 				  return;
 | |
| 				}				
 | |
| 				if(scaleUpData.length == 0) {
 | |
| 				  args.response.error("At least one condition is required in Scale Up Policy.");
 | |
| 				  return;
 | |
| 				}
 | |
| 					
 | |
|         //Scale Down Policy					
 | |
| 				if(args.data.scaleDownDuration == null || args.data.scaleDownDuration.length == 0) {
 | |
| 				  args.response.error("Duration of Scale Down Policy is required.");
 | |
| 				  return;
 | |
| 				}
 | |
| 				if(isNaN(args.data.scaleDownDuration)) {
 | |
| 				  args.response.error("Duration of Scale Down Policy should be a number.");
 | |
| 				  return;
 | |
| 				}			
 | |
| 				if(parseInt(args.data.scaleDownDuration) < parseInt(args.data.interval)) {
 | |
| 				  args.response.error("Duration of Scale Down Policy must be greater than or equal to Polling Interval.");
 | |
| 				  return;
 | |
| 				}				
 | |
| 				if(scaleDownData.length == 0) {
 | |
| 				  args.response.error("At least one condition is required in Scale Down Policy.");
 | |
| 				  return;
 | |
| 				}		        
 | |
|         //validation (end) *****
 | |
|     
 | |
|         var scaleVmProfileResponse = [];
 | |
|         var loadBalancerResponse  = [];
 | |
|         var scaleVmGroupResponse = [];
 | |
|         var scaleUpConditionIds = [];
 | |
|         var scaleDownConditionIds = [];
 | |
| 
 | |
|         var scaleUp = function(args){
 | |
|           var scaleUpConditionIds = [];					
 | |
|           $(scaleUpData).each(function(){
 | |
|             var data = {
 | |
|               counterid: this.counterid,
 | |
|               relationaloperator: this.relationaloperator,
 | |
|               threshold: this.threshold
 | |
|             };
 | |
|             $.ajax({
 | |
|               url: createURL('createCondition'),
 | |
|               data: data,
 | |
|               success: function(json) {
 | |
|                 var createConditionIntervalID = setInterval(function() {
 | |
|                   $.ajax({
 | |
|                     url: createURL("queryAsyncJobResult&jobid=" + json.conditionresponse.jobid),
 | |
|                     dataType: "json",
 | |
|                     success: function(json) {
 | |
|                       var result = json.queryasyncjobresultresponse;
 | |
|                       if(result.jobstatus == 0) {
 | |
|                         return;
 | |
|                       }
 | |
|                       else {
 | |
|                         clearInterval(createConditionIntervalID);
 | |
|                         if(result.jobstatus == 1) {
 | |
|                           var item  = json.queryasyncjobresultresponse.jobresult.condition;
 | |
|                           scaleUpConditionIds.push(item.id);
 | |
|                           if (scaleUpConditionIds.length == scaleUpData.length) {										
 | |
| 														if(!('multiRules' in args.context)) { //from a new LB 			
 | |
| 															var data = {
 | |
| 																action: 'scaleup',
 | |
| 																conditionids: scaleUpConditionIds.join(","),
 | |
| 																duration: args.data.scaleUpDuration,
 | |
| 																quiettime: args.data.quietTime
 | |
| 															};
 | |
| 															$.ajax({
 | |
| 																url: createURL('createAutoScalePolicy'),
 | |
| 																data: data,
 | |
| 																success: function(json) {
 | |
| 																	var jobId = json.autoscalepolicyresponse.jobid;
 | |
| 																	var createAutoScalePolicyInterval = setInterval(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 {
 | |
| 																					clearInterval(createAutoScalePolicyInterval);
 | |
| 																					if (result.jobstatus == 1) { //AutoScalePolicy successfully created
 | |
| 																						var item = result.jobresult.autoscalepolicy;
 | |
| 																						scaleDown($.extend(args, {
 | |
| 																							scaleUpPolicyResponse: item
 | |
| 																						}));
 | |
| 																					}
 | |
| 																					else if (result.jobstatus == 2) {
 | |
| 																						args.response.error(_s(result.jobresult.errortext));
 | |
| 																					}
 | |
| 																				}
 | |
| 																			}
 | |
| 																		});
 | |
| 																	}, g_queryAsyncJobResultInterval);
 | |
| 																},
 | |
| 																error: function(XMLHttpResponse) {
 | |
| 																	args.response.error(parseXMLHttpResponse(XMLHttpResponse));
 | |
| 																}
 | |
| 															});
 | |
| 														}
 | |
| 														else { //from an existing LB																											
 | |
| 															var data = {
 | |
|                                 id: args.context.originalAutoscaleData.scaleUpPolicy.id,															
 | |
| 																conditionids: scaleUpConditionIds.join(","),
 | |
| 																duration: args.data.scaleUpDuration,
 | |
| 																quiettime: args.data.quietTime
 | |
| 															};
 | |
| 														
 | |
| 														  $.ajax({
 | |
| 																url: createURL('updateAutoScalePolicy'),
 | |
| 																data: data,
 | |
| 																success: function(json) {																  															
 | |
| 																	var updateAutoScalePolicyInterval = setInterval(function(){
 | |
| 																		$.ajax({
 | |
| 																			url: createURL("queryAsyncJobResult&jobId=" + json.updateautoscalepolicyresponse.jobid),
 | |
| 																			dataType: "json",
 | |
| 																			success: function(json) {																			  
 | |
| 																				var result = json.queryasyncjobresultresponse;
 | |
| 																				if (result.jobstatus == 0) {
 | |
| 																					return; //Job has not completed
 | |
| 																				}
 | |
| 																				else {
 | |
| 																					clearInterval(updateAutoScalePolicyInterval);
 | |
| 																					if (result.jobstatus == 1) { 
 | |
| 																						var item = result.jobresult.autoscalepolicy;
 | |
| 																			
 | |
| 																						//delete old conditions which are orphans now. Don't need to call queryAsyncJobResult because subsequent API calls have no dependency on deleteCondition.
 | |
| 																						$(args.context.originalAutoscaleData.scaleUpPolicy.conditions).each(function(){
 | |
| 																						  $.ajax({
 | |
| 																							  url: createURL('deleteCondition'),
 | |
| 																								data: {
 | |
| 																								  id: this.id
 | |
| 																								}
 | |
| 																							});																							
 | |
| 																						});														
 | |
| 																						
 | |
| 																						scaleDown($.extend(args, {
 | |
| 																							scaleUpPolicyResponse: item
 | |
| 																						}));
 | |
| 																					}
 | |
| 																					else if (result.jobstatus == 2) {
 | |
| 																						args.response.error(_s(result.jobresult.errortext));
 | |
| 																					}
 | |
| 																				}
 | |
| 																			}
 | |
| 																		});
 | |
| 																	}, g_queryAsyncJobResultInterval);
 | |
| 																},
 | |
| 																error: function(XMLHttpResponse) {
 | |
| 																	args.response.error(parseXMLHttpResponse(XMLHttpResponse));
 | |
| 																}
 | |
| 															});
 | |
| 														}														
 | |
|                           }
 | |
|                         }
 | |
|                         else if(result.jobstatus == 2) {
 | |
|                           args.response.error(_s(result.jobresult.errortext));
 | |
|                         }
 | |
|                       }
 | |
|                     }
 | |
|                   });
 | |
|                 }, g_queryAsyncJobResultInterval);
 | |
|               },
 | |
|               error: function(XMLHttpResponse) {
 | |
|                 args.response.error(parseXMLHttpResponse(XMLHttpResponse));
 | |
|               }
 | |
|             });
 | |
|           });
 | |
|         };
 | |
| 
 | |
|         var scaleDown = function(args){
 | |
|           var scaleDownConditionIds = [];
 | |
|           $(scaleDownData).each(function(){
 | |
|             var data = {
 | |
|               counterid: this.counterid,
 | |
|               relationaloperator: this.relationaloperator,
 | |
|               threshold: this.threshold
 | |
|             };
 | |
|             $.ajax({
 | |
|               url: createURL('createCondition'),
 | |
|               data: data,
 | |
|               success: function(json) {
 | |
|                 var createConditionIntervalID = setInterval(function() {
 | |
|                   $.ajax({
 | |
|                     url: createURL("queryAsyncJobResult&jobid=" + json.conditionresponse.jobid),
 | |
|                     dataType: "json",
 | |
|                     success: function(json) {
 | |
|                       var result = json.queryasyncjobresultresponse;
 | |
|                       if(result.jobstatus == 0) {
 | |
|                         return;
 | |
|                       }
 | |
|                       else {
 | |
|                         clearInterval(createConditionIntervalID);
 | |
|                         if(result.jobstatus == 1) {
 | |
|                           var item  = json.queryasyncjobresultresponse.jobresult.condition;
 | |
|                           scaleDownConditionIds.push(item.id);
 | |
|                           if (scaleDownConditionIds.length == scaleDownData.length) {													  
 | |
| 														if(!('multiRules' in args.context)) { //from a new LB 
 | |
| 															var data = {
 | |
| 																action: 'scaledown',
 | |
| 																conditionids: scaleDownConditionIds.join(","),
 | |
| 																duration: args.data.scaleDownDuration,
 | |
| 																quiettime: args.data.quietTime
 | |
| 															};
 | |
| 															$.ajax({
 | |
| 																url: createURL('createAutoScalePolicy'),
 | |
| 																data: data,
 | |
| 																success: function(json) {
 | |
| 																	var jobId = json.autoscalepolicyresponse.jobid;
 | |
| 																	var createAutoScalePolicyInterval = setInterval(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 {
 | |
| 																					clearInterval(createAutoScalePolicyInterval);
 | |
| 																					if (result.jobstatus == 1) { //AutoScalePolicy successfully created
 | |
| 																						var item = result.jobresult.autoscalepolicy;
 | |
| 																						createOrUpdateVmProfile($.extend(args, {
 | |
| 																							scaleDownPolicyResponse: item
 | |
| 																						}));
 | |
| 																					}
 | |
| 																					else if (result.jobstatus == 2) {
 | |
| 																						args.response.error(_s(result.jobresult.errortext));
 | |
| 																					}
 | |
| 																				}
 | |
| 																			}
 | |
| 																		});
 | |
| 																	}, g_queryAsyncJobResultInterval);
 | |
| 																},
 | |
| 																error: function(XMLHttpResponse) {
 | |
| 																	args.response.error(parseXMLHttpResponse(XMLHttpResponse));
 | |
| 																}
 | |
| 															});
 | |
| 														}
 | |
| 														else { //from an existing LB														  
 | |
| 															var data = {
 | |
|                                 id: args.context.originalAutoscaleData.scaleDownPolicy.id,															
 | |
| 																conditionids: scaleDownConditionIds.join(","),
 | |
| 																duration: args.data.scaleDownDuration,
 | |
| 																quiettime: args.data.quietTime
 | |
| 															};
 | |
| 														
 | |
| 														  $.ajax({
 | |
| 																url: createURL('updateAutoScalePolicy'),
 | |
| 																data: data,
 | |
| 																success: function(json) {
 | |
| 																	var jobId = json.updateautoscalepolicyresponse.jobid;
 | |
| 																	var updateAutoScalePolicyInterval = setInterval(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 {
 | |
| 																					clearInterval(updateAutoScalePolicyInterval);
 | |
| 																					if (result.jobstatus == 1) { 
 | |
| 																						var item = result.jobresult.autoscalepolicy;
 | |
| 																						
 | |
| 																						//delete old conditions which are orphans now. Don't need to call queryAsyncJobResult because subsequent API calls have no dependency on deleteCondition.
 | |
| 																						$(args.context.originalAutoscaleData.scaleDownPolicy.conditions).each(function(){                                            
 | |
| 																							$.ajax({
 | |
| 																							  url: createURL('deleteCondition'),
 | |
| 																								data: {
 | |
| 																								  id: this.id
 | |
| 																								}
 | |
| 																							});		
 | |
| 																						});														
 | |
| 																																												
 | |
| 																						createOrUpdateVmProfile($.extend(args, {
 | |
| 																							scaleDownPolicyResponse: item
 | |
| 																						}));
 | |
| 																					}
 | |
| 																					else if (result.jobstatus == 2) {
 | |
| 																						args.response.error(_s(result.jobresult.errortext));
 | |
| 																					}
 | |
| 																				}
 | |
| 																			}
 | |
| 																		});
 | |
| 																	}, g_queryAsyncJobResultInterval);
 | |
| 																},
 | |
| 																error: function(XMLHttpResponse) {
 | |
| 																	args.response.error(parseXMLHttpResponse(XMLHttpResponse));
 | |
| 																}
 | |
| 															});															
 | |
| 														}														
 | |
|                           }
 | |
|                         }
 | |
|                         else if(result.jobstatus == 2) {
 | |
|                           args.response.error(_s(result.jobresult.errortext));
 | |
|                         }
 | |
|                       }
 | |
|                     },
 | |
|                     error: function(XMLHttpResponse) {
 | |
|                       args.response.error(parseXMLHttpResponse(XMLHttpResponse));
 | |
|                     }
 | |
|                   });
 | |
|                 }, g_queryAsyncJobResultInterval);
 | |
|               }
 | |
|             });
 | |
|           });
 | |
|         };
 | |
| 
 | |
|         var createOrUpdateVmProfile = function(args){
 | |
|           var array1 = [];
 | |
| 					var apiCmd, apiCmdRes;							
 | |
| 					if(!('multiRules' in args.context)) { //from a new LB 	
 | |
|             var data = {
 | |
| 						  zoneid: args.context.networks[0].zoneid,
 | |
| 							serviceofferingid: args.data.serviceOfferingId,
 | |
| 							templateid: args.data.templateNames,
 | |
| 							destroyvmgraceperiod: args.data.destroyVMgracePeriod,
 | |
| 							snmpcommunity: args.data.snmpCommunity,
 | |
| 							snmpport: args.data.snmpPort							
 | |
| 						};
 | |
| 
 | |
|             var allParamNames=$.map(data,function(value,key){
 | |
|                              return key;
 | |
|                           });
 | |
| 
 | |
|             var notParams =['zoneid','serviceofferingid','templateid','destroyvmgraceperiod'];
 | |
|             var index=0;
 | |
|             $(allParamNames).each(function() {
 | |
|                  var param='counterparam[' + index + ']';
 | |
|                  var name = this.toString();
 | |
|                  var value = data[name];
 | |
|                  if(!value || $.inArray(name,notParams) >-1 ) return true;
 | |
|                  data[param+ '.name']=name;
 | |
|                  data[param+ '.value']=value;
 | |
|                  index++;
 | |
|                  delete data[name];
 | |
| 
 | |
|                  return true;
 | |
|                });
 | |
| 	
 | |
| 
 | |
|             if(args.data.username != null && args.data.username.length > 0) {
 | |
| 						  $.extend(data, {
 | |
| 							  autoscaleuserid: args.data.username
 | |
| 							});
 | |
| 						}						
 | |
| 																				
 | |
| 						var array2 = [];					
 | |
| 						if(args.data.diskOfferingId != null && args.data.diskOfferingId.length > 0)
 | |
| 							array2.push("diskofferingid=" + args.data.diskOfferingId);
 | |
| 						if(args.data.securityGroups != null && args.data.securityGroups.length > 0){
 | |
| 							if(array2.length > 0)
 | |
| 								array2.push("&securitygroupids=" + args.data.securityGroups);
 | |
| 							else
 | |
| 								array2.push("securitygroupids=" + args.data.securityGroups);
 | |
| 						}		
 | |
|             if(array2.length > 0) {						
 | |
| 							$.extend(data, {
 | |
| 								otherdeployparams: array2.join("")
 | |
| 							});
 | |
| 						}
 | |
| 										 
 | |
| 						$.ajax({
 | |
| 							url: createURL('createAutoScaleVmProfile'),							
 | |
| 							data: data,
 | |
| 							success: function(json) {						 
 | |
| 								var jobId = json.autoscalevmprofileresponse.jobid;
 | |
| 								var autoscaleVmProfileTimer = setInterval(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 {
 | |
| 												clearInterval(autoscaleVmProfileTimer);
 | |
| 												if (result.jobstatus == 1) { 
 | |
| 													scaleVmProfileResponse = result.jobresult.autoscalevmprofile;													
 | |
| 													loadBalancer(args); //create a load balancer rule																										
 | |
| 												}
 | |
| 												else if (result.jobstatus == 2) {
 | |
| 													args.response.error(_s(result.jobresult.errortext));
 | |
| 												}
 | |
| 											}
 | |
| 										}
 | |
| 									});
 | |
| 								}, g_queryAsyncJobResultInterval);
 | |
| 							},
 | |
| 							error: function(XMLHttpResponse) {
 | |
| 								args.response.error(parseXMLHttpResponse(XMLHttpResponse));
 | |
| 							}
 | |
| 						});            			
 | |
| 					}
 | |
| 					else { //from an existing LB		
 | |
|             var data = {
 | |
|               id: args.context.originalAutoscaleData.context.autoscaleVmProfile.id,
 | |
| 							templateid: args.data.templateNames,
 | |
| 							destroyvmgraceperiod: args.data.destroyVMgracePeriod,
 | |
| 							snmpcommunity: args.data.snmpCommunity,
 | |
| 							snmpport: args.data.snmpPort							
 | |
|             };					
 | |
| 
 | |
|             var allParamNames=$.map(data,function(value,key){
 | |
|                              return key;
 | |
|                           });
 | |
| 
 | |
|             var notParams =['id','templateid','destroyvmgraceperiod'];
 | |
|             var index=0;
 | |
|             $(allParamNames).each(function() {
 | |
|                  var param='counterparam[' + index + ']';
 | |
|                  var name = this.toString();
 | |
|                  var value = data[name];
 | |
|                  if(!value || $.inArray(name,notParams) >-1 ) return true;
 | |
|                  data[param+ '.name']=name;
 | |
|                  data[param+ '.value']=value;
 | |
|                  index++;
 | |
|                  delete data[name];
 | |
| 
 | |
|                  return true;
 | |
|                });
 | |
| 
 | |
| 
 | |
| 		
 | |
| 								
 | |
| 						if(args.data.username != null && args.data.username.length > 0) {
 | |
| 						  $.extend(data, {
 | |
| 							  autoscaleuserid: args.data.username
 | |
| 							});
 | |
| 						}						
 | |
| 								
 | |
| 						$.ajax({
 | |
| 							url: createURL('updateAutoScaleVmProfile'),
 | |
| 							data: data,
 | |
| 							success: function(json) {						 
 | |
| 								var jobId = json.updateautoscalevmprofileresponse.jobid;
 | |
| 								var autoscaleVmProfileTimer = setInterval(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 {
 | |
| 												clearInterval(autoscaleVmProfileTimer);
 | |
| 												if (result.jobstatus == 1) { 
 | |
| 													scaleVmProfileResponse = result.jobresult.autoscalevmprofile;		
 | |
| 													autoScaleVmGroup(args); //update autoScaleVmGroup													
 | |
| 												}
 | |
| 												else if (result.jobstatus == 2) {
 | |
| 													args.response.error(_s(result.jobresult.errortext));
 | |
| 												}
 | |
| 											}
 | |
| 										}
 | |
| 									});
 | |
| 								}, g_queryAsyncJobResultInterval);
 | |
| 							},
 | |
| 							error: function(XMLHttpResponse) {
 | |
| 								args.response.error(parseXMLHttpResponse(XMLHttpResponse));
 | |
| 							}
 | |
| 						});						
 | |
| 					}	
 | |
|         };
 | |
| 
 | |
|         var loadBalancer = function(args){
 | |
|           var networkid;
 | |
|           if('vpc' in args.context) { //from VPC section
 | |
|             if(args.data.tier == null) {
 | |
|               cloudStack.dialog.notice({ message: 'Tier is required' });
 | |
|               return;
 | |
|             }
 | |
|             networkid = args.data.tier;
 | |
|           }
 | |
|           else if('networks' in args.context) {	//from Guest Network section
 | |
|             networkid = args.context.networks[0].id;
 | |
|           }
 | |
|           var data = {
 | |
|             algorithm: args.formData.algorithm,
 | |
|             name: args.formData.name,
 | |
|             privateport: args.formData.privateport,
 | |
|             publicport: args.formData.publicport,
 | |
|             openfirewall: false,
 | |
|             networkid: networkid
 | |
|           };
 | |
|           if(args.context.ipAddresses != null) {
 | |
|             data = $.extend(data, {
 | |
| 						  publicipid: args.context.ipAddresses[0].id
 | |
| 						});
 | |
| 					}
 | |
| 					else {
 | |
| 					  data = $.extend(data, {
 | |
| 						  domainid: g_domainid,
 | |
|               account: g_account
 | |
| 						});
 | |
| 					}
 | |
| 
 | |
|           $.ajax({
 | |
|             url: createURL('createLoadBalancerRule'),
 | |
|             dataType: 'json',
 | |
|             data: data,
 | |
|             async: true,
 | |
|             success: function(json) {
 | |
|               var jobId = json.createloadbalancerruleresponse.jobid;
 | |
|               var loadBalancerTimer = setInterval(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 {
 | |
|                       clearInterval(loadBalancerTimer);
 | |
|                       if (result.jobstatus == 1) { //LoadBalancerRule successfully created
 | |
|                         loadBalancerResponse = result.jobresult.loadbalancer;
 | |
|                         autoScaleVmGroup(args);
 | |
|                       }
 | |
|                       else if (result.jobstatus == 2) {
 | |
|                         args.response.error(_s(result.jobresult.errortext));
 | |
|                       }
 | |
|                     }
 | |
|                   }
 | |
|                 });
 | |
|               }, g_queryAsyncJobResultInterval);
 | |
|             },
 | |
|             error: function(XMLHttpResponse) {
 | |
|               args.response.error(parseXMLHttpResponse(XMLHttpResponse));
 | |
|             }
 | |
|           });
 | |
|         };
 | |
| 
 | |
|         var autoScaleVmGroup = function(args){
 | |
| 				  if(!('multiRules' in args.context)) { //from a new LB 
 | |
| 						var array1 = [];
 | |
| 						array1.push("&lbruleid=" + loadBalancerResponse.id);
 | |
| 						array1.push("&minMembers=" + args.data.minInstance);
 | |
| 						array1.push("&maxMembers=" + args.data.maxInstance );
 | |
| 						array1.push("&vmprofileid=" + scaleVmProfileResponse.id);
 | |
| 						array1.push("&interval=" + args.data.interval);
 | |
| 						array1.push("&scaleuppolicyids=" + args.scaleUpPolicyResponse.id);
 | |
| 						array1.push("&scaledownpolicyids=" + args.scaleDownPolicyResponse.id );
 | |
| 						$.ajax({
 | |
| 							url: createURL('createAutoScaleVmGroup' + array1.join("")),
 | |
| 							dataType: 'json',
 | |
| 							async: true,
 | |
| 							success: function(json) {
 | |
| 								var jobId = json.autoscalevmgroupresponse.jobid;
 | |
| 								var scaleVmGroupTimer = setInterval(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 {
 | |
| 												clearInterval(scaleVmGroupTimer);
 | |
| 												if (result.jobstatus == 1) { //autoscale Vm group successfully created
 | |
| 													scaleVmGroupResponse = result.jobresult.autoscalevmgroup;
 | |
| 													args.response.success();
 | |
| 												}
 | |
| 												else if (result.jobstatus == 2) {
 | |
| 													args.response.error(_s(result.jobresult.errortext));
 | |
| 												}
 | |
| 											}
 | |
| 										}
 | |
| 									});
 | |
| 								}, g_queryAsyncJobResultInterval);
 | |
| 							},
 | |
| 							error: function(XMLHttpResponse) {
 | |
| 								args.response.error(parseXMLHttpResponse(XMLHttpResponse));
 | |
| 							}
 | |
| 						});
 | |
| 					}
 | |
| 					else { //from an existing LB	
 | |
|             var data = {
 | |
| 						  id: args.context.originalAutoscaleData.context.autoscaleVmGroup.id,
 | |
| 							minmembers: args.data.minInstance,
 | |
| 							maxmembers: args.data.maxInstance,
 | |
| 							interval: args.data.interval,
 | |
| 							scaleuppolicyids: args.context.originalAutoscaleData.scaleUpPolicy.id,
 | |
| 							scaledownpolicyids: args.context.originalAutoscaleData.scaleDownPolicy.id
 | |
| 						};
 | |
| 						
 | |
| 						$.ajax({
 | |
| 							url: createURL('updateAutoScaleVmGroup'),
 | |
| 							data: data,
 | |
| 							success: function(json) {
 | |
| 								var jobId = json.updateautoscalevmgroupresponse.jobid;
 | |
| 								var updateAutoScaleVmGroupTimer = setInterval(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 {
 | |
| 												clearInterval(updateAutoScaleVmGroupTimer);
 | |
| 												if (result.jobstatus == 1) { //autoscale Vm group successfully created													
 | |
| 													args.response.success();
 | |
| 												}
 | |
| 												else if (result.jobstatus == 2) {
 | |
| 													args.response.error(_s(result.jobresult.errortext));
 | |
| 												}
 | |
| 											}
 | |
| 										}
 | |
| 									});
 | |
| 								}, g_queryAsyncJobResultInterval);
 | |
| 							},
 | |
| 							error: function(XMLHttpResponse) {
 | |
| 								args.response.error(parseXMLHttpResponse(XMLHttpResponse));
 | |
| 							}
 | |
| 						});						
 | |
| 					}					
 | |
|         };
 | |
| 
 | |
| 				//*** API calls start!!! ********
 | |
| 				scaleUp(args);
 | |
| 				
 | |
|       },
 | |
|       destroy: function(args) {
 | |
|         $.ajax({
 | |
|           url: createURL('')
 | |
|         });
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     dialog: function(args) {
 | |
|       return function(args) {
 | |
|         var context = args.context;
 | |
| 
 | |
|         var $dialog= $('<div>');
 | |
|         $dialog.dialog ({
 | |
|           title: 'AutoScale Configuration Wizard',
 | |
|           closeonEscape: false,
 | |
| 
 | |
|           draggable:true,
 | |
|           width:  825 ,
 | |
|           height :600,
 | |
|           buttons: {
 | |
|             'Cancel': function() {
 | |
|               $(this).dialog("close");
 | |
|               $('.overlay').remove();
 | |
|             },
 | |
| 
 | |
| 
 | |
|             'Apply': function() {
 | |
|               $(':ui-dialog').remove();
 | |
|               $('.overlay').remove();
 | |
|             }
 | |
|           }
 | |
|         }).closest('.ui-dialog').overlay();
 | |
| 
 | |
|         $("buttons").each(function() {
 | |
|           $(this).attr('style','float: right');
 | |
|         });
 | |
|         var $field = $('<div>').addClass('field username');
 | |
|         var $input = $('<input>').attr({ name: 'username' });
 | |
|         var $inputLabel = $('<label>').html('Username');
 | |
| 
 | |
|         $field.append($input, $inputLabel);
 | |
|         $field.appendTo($dialog);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| } (jQuery,cloudStack));
 |