cloudstack-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jessicaw...@apache.org
Subject git commit: cloudstack 3.0 UI - autoscale - implement edit mode.
Date Wed, 01 Aug 2012 21:07:15 GMT
Updated Branches:
  refs/heads/autoscale ee672846a -> 58266c727


cloudstack 3.0 UI - autoscale - implement edit mode.


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/58266c72
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/58266c72
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/58266c72

Branch: refs/heads/autoscale
Commit: 58266c72775f8aacee4cf0cbae44b07d946d0ba2
Parents: ee67284
Author: Jessica Wang <jessica.wang@citrix.com>
Authored: Wed Aug 1 14:06:03 2012 -0700
Committer: Jessica Wang <jessica.wang@citrix.com>
Committed: Wed Aug 1 14:06:03 2012 -0700

----------------------------------------------------------------------
 ui/scripts/autoscaler.js           |  694 +++++++++++++++++++++----------
 ui/scripts/ui-custom/autoscaler.js |   27 +-
 2 files changed, 492 insertions(+), 229 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/58266c72/ui/scripts/autoscaler.js
----------------------------------------------------------------------
diff --git a/ui/scripts/autoscaler.js b/ui/scripts/autoscaler.js
index ff5c542..b960ece 100644
--- a/ui/scripts/autoscaler.js
+++ b/ui/scripts/autoscaler.js
@@ -28,65 +28,96 @@
       totalScaleUpCondition = 0;
       scaleDownData = [];
       totalScaleDownCondition = 0;
-
-      var sampleData = null;
-      /*
-       var sampleData = {
-       templateNames: '58d3f4b2-e847-4f93-993d-1ab1505129b6', //(will set this value to dropdown)
-       serviceOfferingId: '4aa823f3-27ec-46af-9e07-b023d7a7a6f1', //(will set this value
to dropdown)
-       minInstance: 1,
-       maxInstance: 10,
-       scaleUpPolicy: {
-       id: 12345,
-       duration: 1000,
-       conditions: [
-       {
-       id: 1,
-       counterid: 'cpu',
-       relationaloperator: "GE",
-       threshold: 100
-       },
-       {
-       id: 2,
-       counterid: 'memory',
-       relationaloperator: "LT",
-       threshold: 200
-       }
-
-       ]
-       },
-       scaleDownPolicy: {
-       id: 6789,
-       duration: 500,
-       conditions: [
-       {
-       id: 1,
-       counterid: 'cpu',
-       relationaloperator: "LT",
-       threshold: 30
-       },
-       {
-       id: 2,
-       counterid: 'cpu',
-       relationaloperator: "LT",
-       threshold: 50
-       }
-
-       ]
-       },
-       interval: 200,
-       quietTime: 300,
-       destroyVMgracePeriod: null,
-       securityGroups: null, // (will set this value to dropdown)
-       diskOfferingId: 'a21c9aa4-ef7e-41dd-91eb-70b2182816b0', // (will set this value to
dropdown)
-       snmpCommunity: 1,
-       snmpPort: 225,
-
-       isAdvanced: false // Set this to true if any advanced field data is present
-       };
-       */
-
-      args.response.success({ data: sampleData });
+      
+			if(!('multiRules' in args.context)) { //from a new LB 			
+			  args.response.success({ data: null });		
+      }				
+			else { //from an existing LB
+				$.ajax({
+				  url: createURL('listAutoScaleVmGroups'),
+					data: {
+					  lbruleid: args.context.multiRules[0].id
+					},					
+					success: function(json) {					  
+						var autoscaleVmGroup = json.listautoscalevmgroupsresponse.autoscalevmgroup[0];
+						
+						$.ajax({
+						  url: createURL('listAutoScaleVmProfiles'),
+							data: {
+							  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.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.id,										
+										relationaloperator: this.relationaloperator,
+										threshold: this.threshold.toString()
+									};
+									scaleDownPolicy.conditions.push(condition);
+								});
+																							
+								var diskOfferingId, securityGroups;
+                var otherdeployparams = autoscaleVmProfile.otherdeployparams;
+								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.snmpcommunity,
+									snmpPort: autoscaleVmProfile.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 });								
+							}						
+						});						
+					}				  
+				});		
+			}         		
     },
 
     // --
@@ -346,7 +377,7 @@
               $.ajax({
                 url: createURL("listCounters"),
                 dataType: "json",
-                async: true,
+                async: false,
                 success: function(json) {
                   var counters = json.counterresponse.counter;
 
@@ -482,7 +513,7 @@
               $.ajax({
                 url: createURL("listCounters"),
                 dataType: "json",
-                async: true,
+                async: false,
                 success: function(json) {
                   var counters = json.counterresponse.counter;
 
@@ -608,8 +639,15 @@
     },
 
     actions: {
-      add: function(args) {
+      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;
+					}
+				}				
+				
         if(isAdmin() || isDomainAdmin()) { //only admin and domain-admin has access to listUers
API
           var havingApiKeyAndSecretKey = false;
           $.ajax({
@@ -652,8 +690,7 @@
           }
         }
         //validation (end) *****
-
-
+    
         var scaleVmProfileResponse = [];
         var loadBalancerResponse  = [];
         var scaleVmGroupResponse = [];
@@ -661,7 +698,7 @@
         var scaleDownConditionIds = [];
 
         var scaleUp = function(args){
-          var scaleUpConditionIds = [];
+          var scaleUpConditionIds = [];					
           $(scaleUpData).each(function(){
             var data = {
               counterid: this.counterid,
@@ -686,51 +723,106 @@
                         if(result.jobstatus == 1) {
                           var item  = json.queryasyncjobresultresponse.jobresult.condition;
                           scaleUpConditionIds.push(item.id);
-                          if (scaleUpConditionIds.length == scaleUpData.length) {
-                            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({ message: _s(result.jobresult.errortext)
});
-                                        }
-                                      }
-                                    }
-                                  });
-                                }, 3000);
-                              },
-                              error: function(XMLHttpResponse) {
-                                args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                              }
-                            });
+                          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));
+																					}
+																				}
+																			}
+																		});
+																	}, 3000);
+																},
+																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));
+																					}
+																				}
+																			}
+																		});
+																	}, 3000);
+																},
+																error: function(XMLHttpResponse) {
+																	args.response.error(parseXMLHttpResponse(XMLHttpResponse));
+																}
+															});
+														}														
                           }
                         }
                         else if(result.jobstatus == 2) {
-                          args.response.error({ message: _s(result.jobresult.errortext) });
+                          args.response.error(_s(result.jobresult.errortext));
                         }
                       }
                     }
@@ -770,51 +862,107 @@
                         if(result.jobstatus == 1) {
                           var item  = json.queryasyncjobresultresponse.jobresult.condition;
                           scaleDownConditionIds.push(item.id);
-                          if (scaleDownConditionIds.length == scaleDownData.length) {
-                            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;
-                                          createVmProfile($.extend(args, {
-                                            scaleDownPolicyResponse: item
-                                          }));
-                                        }
-                                        else if (result.jobstatus == 2) {
-                                          args.response.error({ message: _s(result.jobresult.errortext)
});
-                                        }
-                                      }
-                                    }
-                                  });
-                                }, 3000);
-                              },
-                              error: function(XMLHttpResponse) {
-                                args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-                              }
-                            });
+                          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));
+																					}
+																				}
+																			}
+																		});
+																	}, 3000);
+																},
+																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));
+																					}
+																				}
+																			}
+																		});
+																	}, 3000);
+																},
+																error: function(XMLHttpResponse) {
+																	args.response.error(parseXMLHttpResponse(XMLHttpResponse));
+																}
+															});															
+														}														
                           }
                         }
                         else if(result.jobstatus == 2) {
-                          args.response.error({ message: _s(result.jobresult.errortext) });
+                          args.response.error(_s(result.jobresult.errortext));
                         }
                       }
                     },
@@ -828,37 +976,49 @@
           });
         };
 
-        var createVmProfile = function(args){
+        var createOrUpdateVmProfile = function(args){
           var array1 = [];
-          array1.push("&zoneid=" + args.context.networks[0].zoneid);
+					var apiCmd, apiCmdRes;							
+					if(!('multiRules' in args.context)) { //from a new LB 	
+					  apiCmd = 'createAutoScaleVmProfile';
+						apiCmdRes = 'autoscalevmprofileresponse';
+					
+						array1.push("&zoneid=" + args.context.networks[0].zoneid);
+						array1.push("&serviceofferingid=" + args.data.serviceOfferingId);          
+						var array2 = [];
+						if(args.data.diskOfferingId != "")
+							array2.push("diskofferingid=" + args.data.diskOfferingId);
+						if(args.data.securityGroups != ""){
+							if(array2.join("") != "")
+								array2.push("&securitygroupids=" + args.data.securityGroups);
+							else
+								array2.push("securitygroupids=" + args.data.securityGroups);
+						}
+						array2 = array2.join("");
+						if(array2 != "")
+							array1.push("&otherdeployparams=" + encodeURIComponent(array2));
+					}
+					else { //from an existing LB
+					  apiCmd = 'updateAutoScaleVmProfile';
+						apiCmdRes = 'updateautoscalevmprofileresponse';
+						
+						array1.push("&id=" + args.context.originalAutoscaleData.context.autoscaleVmProfile.id);
+					}
+					
+					//apply to both create and update
           array1.push("&templateid=" + args.data.templateNames);
-          array1.push("&serviceofferingid=" + args.data.serviceOfferingId);
-          array1.push("&snmpcommunity=" + args.data.snmpCommunity);
-          array1.push("&snmpport=" + args.data.snmpPort);
-          array1.push("&destroyvmgraceperiod=" + args.data.destroyVMgracePeriod);
-
-          if(args.data.username != "")
+					array1.push("&destroyvmgraceperiod=" + args.data.destroyVMgracePeriod);
+					array1.push("&snmpcommunity=" + args.data.snmpCommunity);
+					array1.push("&snmpport=" + args.data.snmpPort);
+					 if(args.data.username != "")
             array1.push("&autoscaleuserid=" + args.data.username);
-
-          var array2 = [];
-          if(args.data.diskOfferingId != "")
-            array2.push("diskofferingid=" + args.data.diskOfferingId);
-          if(args.data.securityGroups != ""){
-            if(array2.join("") != "")
-              array2.push("&securitygroupids=" + args.data.securityGroups);
-            else
-              array2.push("securitygroupids=" + args.data.securityGroups);
-          }
-          array2 = array2.join("");
-          if(array2 != "")
-            array1.push("&otherdeployparams=" + encodeURIComponent(array2));
-
+         
           $.ajax({
-            url: createURL('createAutoScaleVmProfile' + array1.join("")),
+            url: createURL(apiCmd + array1.join("")),
             dataType: 'json',
             async: true,
-            success: function(data) {
-              var jobId = data.autoscalevmprofileresponse.jobid;
+            success: function(json) {						 
+              var jobId = json[apiCmdRes].jobid;
               var autoscaleVmProfileTimer = setInterval(function(){
                 $.ajax({
                   url: createURL("queryAsyncJobResult&jobId="+jobId),
@@ -870,12 +1030,17 @@
                     }
                     else {
                       clearInterval(autoscaleVmProfileTimer);
-                      if (result.jobstatus == 1) { //VM Profile successfully created
+                      if (result.jobstatus == 1) { 
                         scaleVmProfileResponse = result.jobresult.autoscalevmprofile;
-                        loadBalancer(args);
+												if(!('multiRules' in args.context)) { //from a new LB 	
+                          loadBalancer(args); //create a load balancer rule
+												}
+												else { //from an existing LB		
+													autoScaleVmGroup(args); //update autoScaleVmGroup
+												}
                       }
                       else if (result.jobstatus == 2) {
-                        args.response.error({message: _s(result.jobresult.errortext)});
+                        args.response.error(_s(result.jobresult.errortext));
                       }
                     }
                   }
@@ -906,9 +1071,10 @@
             privateport: args.formData.privateport,
             publicport: args.formData.publicport,
             openfirewall: false,
-            networkid: networkid,
-            publicipid: args.context.ipAddresses[0].id
+            networkid: networkid
           };
+          if(args.context.ipAddresses != undefined)
+            data = $.extend(data, {publicipid: args.context.ipAddresses[0].id});
 
           $.ajax({
             url: createURL('createLoadBalancerRule'),
@@ -933,7 +1099,7 @@
                         autoScaleVmGroup(args);
                       }
                       else if (result.jobstatus == 2) {
-                        args.response.error({message: _s(result.jobresult.errortext)});
+                        args.response.error(_s(result.jobresult.errortext));
                       }
                     }
                   }
@@ -947,50 +1113,132 @@
         };
 
         var autoScaleVmGroup = function(args){
-          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({message: _s(result.jobresult.errortext)});
-                      }
-                    }
-                  }
-                });
-              }, 3000);
-            },
-            error: function(XMLHttpResponse) {
-              args.response.error(parseXMLHttpResponse(XMLHttpResponse));
-            }
-          });
+				  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));
+												}
+											}
+										}
+									});
+								}, 3000);
+							},
+							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
+						};
+						
+						$.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));
+												}
+											}
+										}
+									});
+								}, 3000);
+							},
+							error: function(XMLHttpResponse) {
+								args.response.error(parseXMLHttpResponse(XMLHttpResponse));
+							}
+						});						
+					}					
         };
 
-        scaleUp(args);
+				//*** API calls start!!! ********
+				if(!('multiRules' in args.context)) { //from a new LB 
+          scaleUp(args);
+				}
+				else { //from an existing LB			
+					if(args.context.originalAutoscaleData.context.autoscaleVmGroup.state == 'disabled')
{
+					  scaleUp(args);
+					}
+					else {					
+						$.ajax({
+							url: createURL('disableAutoScaleVmGroup'),
+							data: {
+								id: args.context.originalAutoscaleData.context.autoscaleVmGroup.id
+							},
+							success: function(json) {								
+								var disableAutoScaleVmGroupIntervalID = setInterval(function() { 	
+									$.ajax({
+										url: createURL("queryAsyncJobResult&jobid=" + json.disableautoscalevmGroupresponse.jobid),
+										dataType: "json",
+										success: function(json) {
+											var result = json.queryasyncjobresultresponse;
+											if(result.jobstatus == 0) {
+												return;
+											}
+											else {                                    
+												clearInterval(disableAutoScaleVmGroupIntervalID); 											
+												if(result.jobstatus == 1) {																		 
+													//json.queryasyncjobresultresponse.jobresult.autoscalevmgroup //do NOT update
args.context.originalAutoscaleData.context.autoscaleVmGroup. So, we have original data before
making API calls.
+									        scaleUp(args);
+												}
+												else if(result.jobstatus == 2) {
+													args.response.error(_s(result.jobresult.errortext));
+												}
+											}
+										}
+									});                            
+								}, 3000); 									
+							}
+						});
+					}					
+				}
 
         //setTimeout(function() { args.response.success(); }, 1000);
         //setTimeout(function() { args.response.error('Error!'); }, 1000);
@@ -1040,4 +1288,4 @@
       }
     }
   }
-} (jQuery,cloudStack));
+} (jQuery,cloudStack));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/58266c72/ui/scripts/ui-custom/autoscaler.js
----------------------------------------------------------------------
diff --git a/ui/scripts/ui-custom/autoscaler.js b/ui/scripts/ui-custom/autoscaler.js
index 4412a51..7b0df18 100644
--- a/ui/scripts/ui-custom/autoscaler.js
+++ b/ui/scripts/ui-custom/autoscaler.js
@@ -73,7 +73,11 @@
         };
         $.each(topfields, setDefaultFields);
         $.each(bottomfields, setDefaultFields);
-
+				
+				$.extend(context, {
+				  originalAutoscaleData: args.data
+				})
+								
         // Create and append top fields
         // -- uses create form to generate fields
         topFieldForm = cloudStack.dialog.createForm({
@@ -241,7 +245,7 @@
               var data = cloudStack.serializeForm($('.ui-dialog .autoscaler form'));
 
               $loading.appendTo($autoscalerDialog);
-              cloudStack.autoscaler.actions.add({
+              cloudStack.autoscaler.actions.apply({
                 formData: formData,
                 context: context,
                 data: data,
@@ -273,10 +277,21 @@
             $loading.remove();
             renderDialogContent(args);
 
-            if (args.data && args.data.isAdvanced) {
-              $autoscalerDialog.find('input[type=checkbox]').trigger('click');
-              $autoscalerDialog.find('input[type=checkbox]').attr('checked', 'checked');
-            }
+            if (args.data == null) { //from a new LB rule						  
+							$autoscalerDialog.find('select[name=serviceOfferingId]').removeAttr('disabled');
+							$autoscalerDialog.find('select[name=securityGroups]').removeAttr('disabled');
+							$autoscalerDialog.find('select[name=diskOfferingId]').removeAttr('disabled');
+						}
+						else { //from an existing LB rule
+						  $autoscalerDialog.find('select[name=serviceOfferingId]').attr('disabled', true);
+							$autoscalerDialog.find('select[name=securityGroups]').attr('disabled', true);
+							$autoscalerDialog.find('select[name=diskOfferingId]').attr('disabled', true);
+						
+						  if(args.data.isAdvanced != null) {
+								$autoscalerDialog.find('input[type=checkbox]').trigger('click');
+								$autoscalerDialog.find('input[type=checkbox]').attr('checked', 'checked');
+							}
+            }						
           }
         }
       });


Mime
View raw message