mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
-Split 'dictionary.jsp' into two files -> 'dictionary.jsp' and 'dictionary2.jsp' -- this is due to JSP file constraints as the localization object is getting quite long -Per change above, 'dictionary' object is now split into an additonal 'dictionary2' object, which is merged with the main dict object on page load -All new dictionary mappings should be added to 'dictionary2' now. Signed-off-by: Brian Federle <brian.federle@citrix.com>
1497 lines
80 KiB
JavaScript
1497 lines
80 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: '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: '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: 'label.min.instances',
|
|
defaultValue: '3',
|
|
validation: {
|
|
required: true,
|
|
number: true
|
|
}
|
|
},
|
|
|
|
maxInstance: {
|
|
label: 'label.max.instances',
|
|
defaultValue: '10',
|
|
validation: {
|
|
required: true,
|
|
number: true
|
|
}
|
|
}
|
|
},
|
|
|
|
bottomFields: {
|
|
isAdvanced: {
|
|
isBoolean: true,
|
|
label: 'label.show.advanced.settings'
|
|
},
|
|
interval: {
|
|
label: 'label.polling.interval.sec',
|
|
defaultValue: '30',
|
|
validation: {
|
|
required: true,
|
|
number: true
|
|
}
|
|
},
|
|
|
|
quietTime: {
|
|
label: 'label.quiet.time.sec',
|
|
defaultValue: '300',
|
|
validation: {
|
|
required: true,
|
|
number: true
|
|
}
|
|
},
|
|
|
|
destroyVMgracePeriod: {
|
|
label: 'label.destroy.vm.graceperiod',
|
|
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: 'label.SNMP.community',
|
|
defaultValue: 'public',
|
|
validation: {
|
|
required: true
|
|
}
|
|
},
|
|
|
|
snmpPort: {
|
|
isHidden: true,
|
|
dependsOn: 'isAdvanced',
|
|
label: 'label.SNMP.port',
|
|
defaultValue: '161',
|
|
validation: {
|
|
required: true,
|
|
number: true
|
|
}
|
|
},
|
|
|
|
username: {
|
|
isHidden: true,
|
|
dependsOn: 'isAdvanced',
|
|
label: '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: 'label.scale.up.policy',
|
|
noSelect: true,
|
|
noHeaderActionsColumn: true,
|
|
ignoreEmptyFields: true,
|
|
fields: {
|
|
'counterid': {
|
|
label: '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: '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: '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: '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: '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: '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, //get zoneid from args.context.networks[0] instead of args.context.ipAddresses[0] because args.context.ipAddresses is null when adding AutoScale rule from Add Load Balancer tab in Network page
|
|
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: 'message.tier.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));
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
// Get hypervisor;
|
|
// if VMware, show notification to user about additional configuration required
|
|
$.ajax({
|
|
url: createURL('listTemplates'),
|
|
data: {
|
|
id: args.data.templateNames,
|
|
templatefilter: 'executable'
|
|
},
|
|
async: false,
|
|
success: function(json) {
|
|
var template = json.listtemplatesresponse.template;
|
|
|
|
if (template && template[0].hypervisor === 'VMware') {
|
|
cloudStack.dialog.confirm({
|
|
message: 'message.admin.guide.read',
|
|
action: function() {
|
|
//*** API calls start!!! ********
|
|
scaleUp(args);
|
|
},
|
|
cancelAction: function() {
|
|
$('.loading-overlay').remove();
|
|
}
|
|
});
|
|
} else {
|
|
//*** 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));
|