| // 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)); |