cloudstack/ui/scripts/sharedFunctions.js

1462 lines
60 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.
var g_mySession = null;
var g_sessionKey = null;
var g_role = null; // roles - root, domain-admin, ro-admin, user
var g_username = null;
var g_account = null;
var g_domainid = null;
var g_loginCmdText = null;
var g_enableLogging = false;
var g_timezoneoffset = null;
var g_timezone = null;
var g_supportELB = null;
var g_KVMsnapshotenabled = null;
var g_regionsecondaryenabled = null;
var g_userPublicTemplateEnabled = "true";
var g_cloudstackversion = null;
var g_queryAsyncJobResultInterval = 3000;
//keyboard keycode
var keycode_Enter = 13;
//XMLHttpResponse.status
var ERROR_ACCESS_DENIED_DUE_TO_UNAUTHORIZED = 401;
var ERROR_INTERNET_NAME_NOT_RESOLVED = 12007;
var ERROR_INTERNET_CANNOT_CONNECT = 12029;
var ERROR_VMOPS_ACCOUNT_ERROR = 531;
// Default password is MD5 hashed. Set the following variable to false to disable this.
var md5Hashed = false;
var md5HashedLogin = false;
//page size for API call (e.g."listXXXXXXX&pagesize=N" )
var pageSize = 20;
var rootAccountId = 1;
//async action
var pollAsyncJobResult = function(args) {
$.ajax({
url: createURL("queryAsyncJobResult&jobId=" + args._custom.jobId),
dataType: "json",
async: false,
success: function(json) {
var result = json.queryasyncjobresultresponse;
if (result.jobstatus == 0) {
return; //Job has not completed
} else {
if (result.jobstatus == 1) { // Succeeded
if (args._custom.getUpdatedItem != null && args._custom.getActionFilter != null) {
args.complete({
data: args._custom.getUpdatedItem(json),
actionFilter: args._custom.getActionFilter()
});
} else if (args._custom.getUpdatedItem != null && args._custom.getActionFilter == null) {
args.complete({
data: args._custom.getUpdatedItem(json)
});
} else {
args.complete({
data: json.queryasyncjobresultresponse.jobresult
});
}
if (args._custom.fullRefreshAfterComplete == true) {
setTimeout(function() {
$(window).trigger('cloudStack.fullRefresh');
}, 500);
}
if (args._custom.onComplete) {
args._custom.onComplete(json, args._custom);
}
} else if (result.jobstatus == 2) { // Failed
var msg = (result.jobresult.errortext == null) ? "" : result.jobresult.errortext;
if (args._custom.getUpdatedItemWhenAsyncJobFails != null && args._custom.getActionFilter != null) {
args.error({
message: msg,
updatedData: args._custom.getUpdatedItemWhenAsyncJobFails(),
actionFilter: args._custom.getActionFilter()
});
} else if (args._custom.getUpdatedItemWhenAsyncJobFails != null && args._custom.getActionFilter == null) {
args.error({
message: msg,
updatedData: args._custom.getUpdatedItemWhenAsyncJobFails()
});
} else {
args.error({
message: msg
});
}
}
}
},
error: function(XMLHttpResponse) {
args.error();
}
});
}
//API calls
function createURL(apiName, options) {
if (!options) options = {};
var urlString = clientApiUrl + "?" + "command=" + apiName + "&response=json&sessionkey=" + g_sessionKey;
if (cloudStack.context && cloudStack.context.projects && !options.ignoreProject) {
urlString = urlString + '&projectid=' + cloudStack.context.projects[0].id;
}
return urlString;
}
function todb(val) {
return encodeURIComponent(val);
}
//LB provider map
var lbProviderMap = {
"publicLb": {
"non-vpc": ["VirtualRouter", "Netscaler", "F5"],
"vpc": ["VpcVirtualRouter", "Netscaler"]
},
"internalLb": {
"non-vpc": [],
"vpc": ["InternalLbVm"]
}
};
//Add Guest Network in Advanced zone (for root-admin only)
var addGuestNetworkDialog = {
zoneObjs: [],
physicalNetworkObjs: [],
networkOfferingObjs: [],
def: {
label: 'label.add.guest.network',
messages: {
notification: function(args) {
return 'label.add.guest.network';
}
},
preFilter: function(args) {
if (isAdmin())
return true;
else
return false;
},
createForm: {
title: 'label.add.guest.network', //Add Shared Network in advanced zone
preFilter: function(args) {
if ('zones' in args.context) { //Infrastructure menu > zone detail > guest traffic type > network tab (only shown in advanced zone) > add guest network dialog
args.$form.find('.form-item[rel=zoneId]').hide();
args.$form.find('.form-item[rel=physicalNetworkId]').hide();
} else { //Network menu > guest network section > add guest network dialog
args.$form.find('.form-item[rel=zoneId]').css('display', 'inline-block');
args.$form.find('.form-item[rel=physicalNetworkId]').css('display', 'inline-block');
}
},
fields: {
name: {
docID: 'helpGuestNetworkZoneName',
label: 'label.name',
validation: {
required: true
}
},
description: {
label: 'label.description',
docID: 'helpGuestNetworkZoneDescription',
validation: {
required: true
}
},
zoneId: {
label: 'label.zone',
validation: {
required: true
},
docID: 'helpGuestNetworkZone',
select: function(args) {
if ('zones' in args.context) { //Infrastructure menu > zone detail > guest traffic type > network tab (only shown in advanced zone) > add guest network dialog
addGuestNetworkDialog.zoneObjs = args.context.zones; //i.e. only one zone entry
} else { //Network menu > guest network section > add guest network dialog
$.ajax({
url: createURL('listZones'),
async: false,
success: function(json) {
addGuestNetworkDialog.zoneObjs = []; //reset
var items = json.listzonesresponse.zone;
if (items != null) {
for (var i = 0; i < items.length; i++) {
if (items[i].networktype == 'Advanced') {
addGuestNetworkDialog.zoneObjs.push(items[i]);
}
}
}
}
});
}
args.response.success({
data: $.map(addGuestNetworkDialog.zoneObjs, function(zone) {
return {
id: zone.id,
description: zone.name
};
})
});
},
isHidden: true
},
physicalNetworkId: {
label: 'label.physical.network',
dependsOn: 'zoneId',
select: function(args) {
if ('physicalNetworks' in args.context) {
addGuestNetworkDialog.physicalNetworkObjs = args.context.physicalNetworks;
} else {
var selectedZoneId = args.$form.find('.form-item[rel=zoneId]').find('select').val();
$.ajax({
url: createURL('listPhysicalNetworks'),
data: {
zoneid: selectedZoneId
},
async: false,
success: function(json) {
addGuestNetworkDialog.physicalNetworkObjs = json.listphysicalnetworksresponse.physicalnetwork;
}
});
}
var items = [];
if (addGuestNetworkDialog.physicalNetworkObjs != null) {
for (var i = 0; i < addGuestNetworkDialog.physicalNetworkObjs.length; i++) {
items.push({
id: addGuestNetworkDialog.physicalNetworkObjs[i].id,
description: addGuestNetworkDialog.physicalNetworkObjs[i].name
});
}
}
args.response.success({
data: items
});
},
isHidden: true
},
vlanId: {
label: 'label.vlan.id',
docID: 'helpGuestNetworkZoneVLANID'
},
isolatedpvlanId: {
label: 'Secondary Isolated VLAN ID'
},
scope: {
label: 'label.scope',
docID: 'helpGuestNetworkZoneScope',
select: function(args) {
var selectedZoneId = args.$form.find('.form-item[rel=zoneId]').find('select').val();
var selectedZoneObj = {};
if (addGuestNetworkDialog.zoneObjs != null && selectedZoneId != "") {
for (var i = 0; i < addGuestNetworkDialog.zoneObjs.length; i++) {
if (addGuestNetworkDialog.zoneObjs[i].id == selectedZoneId) {
selectedZoneObj = addGuestNetworkDialog.zoneObjs[i];
break;
}
}
}
var array1 = [];
if (selectedZoneObj.networktype == "Advanced" && selectedZoneObj.securitygroupsenabled == true) {
array1.push({
id: 'zone-wide',
description: 'All'
});
} else {
array1.push({
id: 'zone-wide',
description: 'All'
});
array1.push({
id: 'domain-specific',
description: 'Domain'
});
array1.push({
id: 'account-specific',
description: 'Account'
});
array1.push({
id: 'project-specific',
description: 'Project'
});
}
args.response.success({
data: array1
});
args.$select.change(function() {
var $form = $(this).closest('form');
if ($(this).val() == "zone-wide") {
$form.find('.form-item[rel=domainId]').hide();
$form.find('.form-item[rel=subdomainaccess]').hide();
$form.find('.form-item[rel=account]').hide();
$form.find('.form-item[rel=projectId]').hide();
} else if ($(this).val() == "domain-specific") {
$form.find('.form-item[rel=domainId]').css('display', 'inline-block');
$form.find('.form-item[rel=subdomainaccess]').css('display', 'inline-block');
$form.find('.form-item[rel=account]').hide();
$form.find('.form-item[rel=projectId]').hide();
} else if ($(this).val() == "account-specific") {
$form.find('.form-item[rel=domainId]').css('display', 'inline-block');
$form.find('.form-item[rel=subdomainaccess]').hide();
$form.find('.form-item[rel=account]').css('display', 'inline-block');
$form.find('.form-item[rel=projectId]').hide();
} else if ($(this).val() == "project-specific") {
$form.find('.form-item[rel=domainId]').css('display', 'inline-block');
$form.find('.form-item[rel=subdomainaccess]').hide();
$form.find('.form-item[rel=account]').hide();
$form.find('.form-item[rel=projectId]').css('display', 'inline-block');
}
});
}
},
domainId: {
label: 'label.domain',
validation: {
required: true
},
select: function(args) {
var items = [];
var selectedZoneId = args.$form.find('.form-item[rel=zoneId]').find('select').val();
var selectedZoneObj = {};
if (addGuestNetworkDialog.zoneObjs != null && selectedZoneId != "") {
for (var i = 0; i < addGuestNetworkDialog.zoneObjs.length; i++) {
if (addGuestNetworkDialog.zoneObjs[i].id == selectedZoneId) {
selectedZoneObj = addGuestNetworkDialog.zoneObjs[i];
break;
}
}
}
if (selectedZoneObj.domainid != null) { //list only domains under selectedZoneObj.domainid
$.ajax({
url: createURL("listDomainChildren&id=" + selectedZoneObj.domainid + "&isrecursive=true"),
dataType: "json",
async: false,
success: function(json) {
var domainObjs = json.listdomainchildrenresponse.domain;
$(domainObjs).each(function() {
items.push({
id: this.id,
description: this.path
});
});
}
});
$.ajax({
url: createURL("listDomains&id=" + selectedZoneObj.domainid),
dataType: "json",
async: false,
success: function(json) {
var domainObjs = json.listdomainsresponse.domain;
$(domainObjs).each(function() {
items.push({
id: this.id,
description: this.path
});
});
}
});
} else { //list all domains
$.ajax({
url: createURL("listDomains&listAll=true"),
dataType: "json",
async: false,
success: function(json) {
var domainObjs = json.listdomainsresponse.domain;
$(domainObjs).each(function() {
items.push({
id: this.id,
description: this.path
});
});
}
});
}
args.response.success({
data: items
});
}
},
subdomainaccess: {
label: 'label.subdomain.access',
isBoolean: true,
isHidden: true,
},
account: {
label: 'label.account'
},
projectId: {
label: 'label.project',
validation: {
required: true
},
select: function(args) {
var items = [];
$.ajax({
url: createURL("listProjects&listAll=true"),
dataType: "json",
async: false,
success: function(json) {
projectObjs = json.listprojectsresponse.project;
$(projectObjs).each(function() {
items.push({
id: this.id,
description: this.name
});
});
}
});
args.response.success({
data: items
});
}
},
networkOfferingId: {
label: 'label.network.offering',
docID: 'helpGuestNetworkZoneNetworkOffering',
dependsOn: ['zoneId', 'scope'],
select: function(args) {
var data = {
state: 'Enabled',
zoneid: args.$form.find('.form-item[rel=zoneId]').find('select').val()
};
var selectedPhysicalNetworkObj = [];
var selectedPhysicalNetworkId = args.$form.find('.form-item[rel=physicalNetworkId]').find('select').val();
if (addGuestNetworkDialog.physicalNetworkObjs != null) {
for (var i = 0; i < addGuestNetworkDialog.physicalNetworkObjs.length; i++) {
if (addGuestNetworkDialog.physicalNetworkObjs[i].id == selectedPhysicalNetworkId) {
selectedPhysicalNetworkObj = addGuestNetworkDialog.physicalNetworkObjs[i];
break;
}
}
}
if (selectedPhysicalNetworkObj.tags != null && selectedPhysicalNetworkObj.tags.length > 0) {
$.extend(data, {
tags: selectedPhysicalNetworkObj.tags
});
}
//Network tab in Guest Traffic Type in Infrastructure menu is only available when it's under Advanced zone.
//zone dropdown in add guest network dialog includes only Advanced zones.
if (args.scope == "zone-wide" || args.scope == "domain-specific") {
$.extend(data, {
guestiptype: 'Shared'
});
}
var items = [];
$.ajax({
url: createURL('listNetworkOfferings'),
data: data,
async: false,
success: function(json) {
addGuestNetworkDialog.networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;
if (addGuestNetworkDialog.networkOfferingObjs != null && addGuestNetworkDialog.networkOfferingObjs.length > 0) {
var selectedZoneId = args.$form.find('.form-item[rel=zoneId]').find('select').val();
var selectedZoneObj = {};
if (addGuestNetworkDialog.zoneObjs != null && selectedZoneId != "") {
for (var i = 0; i < addGuestNetworkDialog.zoneObjs.length; i++) {
if (addGuestNetworkDialog.zoneObjs[i].id == selectedZoneId) {
selectedZoneObj = addGuestNetworkDialog.zoneObjs[i];
break;
}
}
}
for (var i = 0; i < addGuestNetworkDialog.networkOfferingObjs.length; i++) {
//for zone-wide network in Advanced SG-enabled zone, list only SG network offerings
if (selectedZoneObj.networktype == 'Advanced' && selectedZoneObj.securitygroupsenabled == true) {
if (args.scope == "zone-wide") {
var includingSecurityGroup = false;
var serviceObjArray = addGuestNetworkDialog.networkOfferingObjs[i].service;
for (var k = 0; k < serviceObjArray.length; k++) {
if (serviceObjArray[k].name == "SecurityGroup") {
includingSecurityGroup = true;
break;
}
}
if (includingSecurityGroup == false)
continue; //skip to next network offering
}
}
items.push({
id: addGuestNetworkDialog.networkOfferingObjs[i].id,
description: addGuestNetworkDialog.networkOfferingObjs[i].displaytext
});
}
}
}
});
args.response.success({
data: items
});
args.$select.change(function() {
var $form = $(this).closest("form");
var selectedNetworkOfferingId = $(this).val();
$(addGuestNetworkDialog.networkOfferingObjs).each(function() {
if (this.id == selectedNetworkOfferingId) {
if (this.specifyvlan == false) {
$form.find('.form-item[rel=vlanId]').hide();
cloudStack.dialog.createFormField.validation.required.remove($form.find('.form-item[rel=vlanId]')); //make vlanId optional
$form.find('.form-item[rel=isolatedpvlanId]').hide();
} else {
$form.find('.form-item[rel=vlanId]').css('display', 'inline-block');
cloudStack.dialog.createFormField.validation.required.add($form.find('.form-item[rel=vlanId]')); //make vlanId required
$form.find('.form-item[rel=isolatedpvlanId]').css('display', 'inline-block');
}
return false; //break each loop
}
});
});
}
},
//IPv4 (begin)
ip4gateway: {
label: 'IPv4 Gateway',
docID: 'helpGuestNetworkZoneGateway'
},
ip4Netmask: {
label: 'IPv4 Netmask',
docID: 'helpGuestNetworkZoneNetmask'
},
startipv4: {
label: 'IPv4 Start IP',
docID: 'helpGuestNetworkZoneStartIP'
},
endipv4: {
label: 'IPv4 End IP',
docID: 'helpGuestNetworkZoneEndIP'
},
//IPv4 (end)
//IPv6 (begin)
ip6gateway: {
label: 'IPv6 Gateway',
docID: 'helpGuestNetworkZoneGateway'
},
ip6cidr: {
label: 'IPv6 CIDR'
},
startipv6: {
label: 'IPv6 Start IP',
docID: 'helpGuestNetworkZoneStartIP'
},
endipv6: {
label: 'IPv6 End IP',
docID: 'helpGuestNetworkZoneEndIP'
},
//IPv6 (end)
networkdomain: {
label: 'label.network.domain',
docID: 'helpGuestNetworkZoneNetworkDomain'
}
}
},
action: function(args) { //Add guest network in advanced zone
if (
((args.data.ip4gateway.length == 0) && (args.data.ip4Netmask.length == 0) && (args.data.startipv4.length == 0) && (args.data.endipv4.length == 0)) &&
((args.data.ip6gateway.length == 0) && (args.data.ip6cidr.length == 0) && (args.data.startipv6.length == 0) && (args.data.endipv6.length == 0))
) {
args.response.error("Either IPv4 fields or IPv6 fields need to be filled when adding a guest network");
return;
}
var $form = args.$form;
var array1 = [];
array1.push("&zoneId=" + args.data.zoneId);
array1.push("&networkOfferingId=" + args.data.networkOfferingId);
//Pass physical network ID to createNetwork API only when network offering's guestiptype is Shared.
var selectedNetworkOfferingObj;
if (addGuestNetworkDialog.networkOfferingObjs != null) {
for (var i = 0; i < addGuestNetworkDialog.networkOfferingObjs.length; i++) {
if (addGuestNetworkDialog.networkOfferingObjs[i].id == args.data.networkOfferingId) {
selectedNetworkOfferingObj = addGuestNetworkDialog.networkOfferingObjs[i]
break;
}
}
}
if (selectedNetworkOfferingObj.guestiptype == "Shared")
array1.push("&physicalnetworkid=" + args.data.physicalNetworkId);
array1.push("&name=" + todb(args.data.name));
array1.push("&displayText=" + todb(args.data.description));
if (($form.find('.form-item[rel=vlanId]').css("display") != "none") && (args.data.vlanId != null && args.data.vlanId.length > 0))
array1.push("&vlan=" + todb(args.data.vlanId));
if (($form.find('.form-item[rel=isolatedpvlanId]').css("display") != "none") && (args.data.isolatedpvlanId != null && args.data.isolatedpvlanId.length > 0))
array1.push("&isolatedpvlan=" + todb(args.data.isolatedpvlanId));
if ($form.find('.form-item[rel=domainId]').css("display") != "none") {
array1.push("&domainId=" + args.data.domainId);
if ($form.find('.form-item[rel=account]').css("display") != "none") { //account-specific
array1.push("&account=" + args.data.account);
array1.push("&acltype=account");
} else if ($form.find('.form-item[rel=projectId]').css("display") != "none") { //project-specific
array1.push("&projectid=" + args.data.projectId);
array1.push("&acltype=account");
} else { //domain-specific
array1.push("&acltype=domain");
if ($form.find('.form-item[rel=subdomainaccess]:visible input:checked').size())
array1.push("&subdomainaccess=true");
else
array1.push("&subdomainaccess=false");
}
} else { //zone-wide
array1.push("&acltype=domain"); //server-side will make it Root domain (i.e. domainid=1)
}
//IPv4 (begin)
if (args.data.ip4gateway != null && args.data.ip4gateway.length > 0)
array1.push("&gateway=" + args.data.ip4gateway);
if (args.data.ip4Netmask != null && args.data.ip4Netmask.length > 0)
array1.push("&netmask=" + args.data.ip4Netmask);
if (($form.find('.form-item[rel=startipv4]').css("display") != "none") && (args.data.startipv4 != null && args.data.startipv4.length > 0))
array1.push("&startip=" + args.data.startipv4);
if (($form.find('.form-item[rel=endipv4]').css("display") != "none") && (args.data.endipv4 != null && args.data.endipv4.length > 0))
array1.push("&endip=" + args.data.endipv4);
//IPv4 (end)
//IPv6 (begin)
if (args.data.ip6gateway != null && args.data.ip6gateway.length > 0)
array1.push("&ip6gateway=" + args.data.ip6gateway);
if (args.data.ip6cidr != null && args.data.ip6cidr.length > 0)
array1.push("&ip6cidr=" + args.data.ip6cidr);
if (($form.find('.form-item[rel=startipv6]').css("display") != "none") && (args.data.startipv6 != null && args.data.startipv6.length > 0))
array1.push("&startipv6=" + args.data.startipv6);
if (($form.find('.form-item[rel=endipv6]').css("display") != "none") && (args.data.endipv6 != null && args.data.endipv6.length > 0))
array1.push("&endipv6=" + args.data.endipv6);
//IPv6 (end)
if (args.data.networkdomain != null && args.data.networkdomain.length > 0)
array1.push("&networkdomain=" + todb(args.data.networkdomain));
$.ajax({
url: createURL("createNetwork" + array1.join("")),
dataType: "json",
success: function(json) {
var item = json.createnetworkresponse.network;
args.response.success({
data: item
});
},
error: function(XMLHttpResponse) {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
args.response.error(errorMsg);
}
});
},
notification: {
poll: function(args) {
args.complete();
}
}
}
}
// Role Functions
function isAdmin() {
return (g_role == 1);
}
function isDomainAdmin() {
return (g_role == 2);
}
function isUser() {
return (g_role == 0);
}
function isSelfOrChildDomainUser(username, useraccounttype, userdomainid, iscallerchilddomain) {
if (username == g_username) { //is self
return true;
} else if (isDomainAdmin() && iscallerchilddomain && (useraccounttype == 0)) { //domain admin to user
return true;
} else if (isDomainAdmin() && iscallerchilddomain && (userdomainid != g_domainid)) { //domain admin to subdomain admin and user
return true;
} else {
return false;
}
}
// FUNCTION: Handles AJAX error callbacks. You can pass in an optional function to
// handle errors that are not already handled by this method.
function handleError(XMLHttpResponse, handleErrorCallback) {
// User Not authenticated
if (XMLHttpResponse.status == ERROR_ACCESS_DENIED_DUE_TO_UNAUTHORIZED) {
$("#dialog_session_expired").dialog("open");
} else if (XMLHttpResponse.status == ERROR_INTERNET_NAME_NOT_RESOLVED) {
$("#dialog_error_internet_not_resolved").dialog("open");
} else if (XMLHttpResponse.status == ERROR_INTERNET_CANNOT_CONNECT) {
$("#dialog_error_management_server_not_accessible").dialog("open");
} else if (XMLHttpResponse.status == ERROR_VMOPS_ACCOUNT_ERROR && handleErrorCallback != undefined) {
handleErrorCallback();
} else if (handleErrorCallback != undefined) {
handleErrorCallback();
} else {
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
$("#dialog_error").text(_s(errorMsg)).dialog("open");
}
}
function parseXMLHttpResponse(XMLHttpResponse) {
if (isValidJsonString(XMLHttpResponse.responseText) == false) {
return "";
}
//var json = jQuery.parseJSON(XMLHttpResponse.responseText);
var json = JSON.parse(XMLHttpResponse.responseText);
if (json != null) {
var property;
for (property in json) {
var errorObj = json[property];
if (errorObj.errorcode == 401 && errorObj.errortext == "unable to verify user credentials and/or request signature")
return _l('label.session.expired');
else
return _s(errorObj.errortext);
}
} else {
return "";
}
}
function isValidJsonString(str) {
try {
JSON.parse(str);
} catch (e) {
return false;
}
return true;
}
cloudStack.validate = {
vmHostName: function(args) {
// 1 ~ 63 characters long
// ASCII letters 'a' through 'z', 'A' through 'Z', digits '0' through '9', hyphen ('-')
// must start with a letter
// must end with a letter or a digit (must not end with a hyphen)
var regexp = /^[a-zA-Z]{1}[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]{0,1}$/;
var b = regexp.test(args); //true or false
if (b == false)
cloudStack.dialog.notice({
message: 'message.validate.instance.name'
});
return b;
}
}
cloudStack.preFilter = {
createTemplate: function(args) {
if (isAdmin()) {
args.$form.find('.form-item[rel=isPublic]').css('display', 'inline-block');
args.$form.find('.form-item[rel=isFeatured]').css('display', 'inline-block');
args.$form.find('.form-item[rel=isrouting]').css('display', 'inline-block');
} else {
if (g_userPublicTemplateEnabled == "true") {
args.$form.find('.form-item[rel=isPublic]').css('display', 'inline-block');
} else {
args.$form.find('.form-item[rel=isPublic]').hide();
}
args.$form.find('.form-item[rel=isFeatured]').hide();
}
},
addLoadBalancerDevice: function(args) { //add netscaler device OR add F5 device
args.$form.find('.form-item[rel=dedicated]').bind('change', function() {
var $dedicated = args.$form.find('.form-item[rel=dedicated]');
var $capacity = args.$form.find('.form-item[rel=capacity]');
if ($dedicated.find('input[type=checkbox]:checked').length > 0) {
$capacity.hide();
$capacity.find('input[type=text]').val('1');
} else if ($dedicated.find('input[type=checkbox]:unchecked').length > 0) {
$capacity.css('display', 'inline-block');
$capacity.find('input[type=text]').val('');
}
});
args.$form.change();
}
}
cloudStack.actionFilter = {
guestNetwork: function(args) {
var jsonObj = args.context.item;
var allowedActions = [];
allowedActions.push('replaceacllist');
if (jsonObj.type == 'Isolated') {
allowedActions.push('edit'); //only Isolated network is allowed to upgrade to a different network offering (Shared network is not allowed to)
allowedActions.push('restart');
allowedActions.push('remove');
} else if (jsonObj.type == 'Shared') {
if (isAdmin()) {
allowedActions.push('restart');
allowedActions.push('remove');
}
}
return allowedActions;
}
}
var roleTypeUser = "0";
var roleTypeAdmin = "1";
var roleTypeDomainAdmin = "2";
cloudStack.converters = {
convertBytes: function(bytes) {
if (bytes < 1024 * 1024) {
return (bytes / 1024).toFixed(2) + " KB";
} else if (bytes < 1024 * 1024 * 1024) {
return (bytes / 1024 / 1024).toFixed(2) + " MB";
} else if (bytes < 1024 * 1024 * 1024 * 1024) {
return (bytes / 1024 / 1024 / 1024).toFixed(2) + " GB";
} else {
return (bytes / 1024 / 1024 / 1024 / 1024).toFixed(2) + " TB";
}
},
toLocalDate: function(UtcDate) {
var localDate = "";
if (UtcDate != null && UtcDate.length > 0) {
var disconnected = new Date();
disconnected.setISO8601(UtcDate);
if (g_timezoneoffset != null)
localDate = disconnected.getTimePlusTimezoneOffset(g_timezoneoffset);
else
localDate = disconnected.toUTCString();
// localDate = disconnected.getTimePlusTimezoneOffset(0);
}
return localDate;
},
toBooleanText: function(booleanValue) {
if (booleanValue == true)
return "Yes";
return "No";
},
convertHz: function(hz) {
if (hz == null)
return "";
if (hz < 1000) {
return hz + " MHz";
} else {
return (hz / 1000).toFixed(2) + " GHz";
}
},
toDayOfWeekDesp: function(dayOfWeek) {
if (dayOfWeek == "1")
return "Sunday";
else if (dayOfWeek == "2")
return "Monday";
else if (dayOfWeek == "3")
return "Tuesday";
else if (dayOfWeek == "4")
return "Wednesday";
else if (dayOfWeek == "5")
return "Thursday"
else if (dayOfWeek == "6")
return "Friday";
else if (dayOfWeek == "7")
return "Saturday";
},
toDayOfWeekDesp: function(dayOfWeek) {
if (dayOfWeek == "1")
return "Sunday";
else if (dayOfWeek == "2")
return "Monday";
else if (dayOfWeek == "3")
return "Tuesday";
else if (dayOfWeek == "4")
return "Wednesday";
else if (dayOfWeek == "5")
return "Thursday"
else if (dayOfWeek == "6")
return "Friday";
else if (dayOfWeek == "7")
return "Saturday";
},
toNetworkType: function(usevirtualnetwork) {
if (usevirtualnetwork == true || usevirtualnetwork == "true")
return "Public";
else
return "Direct";
},
toRole: function(type) {
if (type == roleTypeUser) {
return "User";
} else if (type == roleTypeAdmin) {
return "Admin";
} else if (type == roleTypeDomainAdmin) {
return "Domain-Admin";
}
},
toAlertType: function(alertCode) {
switch (alertCode) {
case 0:
return _l('label.memory');
case 1:
return _l('label.cpu');
case 2:
return _l('label.storage');
case 3:
return _l('label.primary.storage');
case 4:
return _l('label.public.ips');
case 5:
return _l('label.management.ips');
case 6:
return _l('label.secondary.storage');
case 7:
return _l('label.host');
case 9:
return _l('label.domain.router');
case 10:
return _l('label.console.proxy');
// These are old values -- can be removed in the future
case 8:
return "User VM";
case 11:
return "Routing Host";
case 12:
return "Storage";
case 13:
return "Usage Server";
case 14:
return "Management Server";
case 15:
return "Domain Router";
case 16:
return "Console Proxy";
case 17:
return "User VM";
case 18:
return "VLAN";
case 19:
return "Secondary Storage VM";
case 20:
return "Usage Server";
case 21:
return "Storage";
case 22:
return "Update Resource Count";
case 23:
return "Usage Sanity Result";
case 24:
return "Direct Attached Public IP";
case 25:
return "Local Storage";
case 26:
return "Resource Limit Exceeded";
}
},
toCapacityCountType: function(capacityCode) {
switch (capacityCode) {
case 0:
return _l('label.memory');
case 1:
return _l('label.cpu');
case 2:
return _l('label.storage');
case 3:
return _l('label.primary.storage');
case 4:
return _l('label.public.ips');
case 5:
return _l('label.management.ips');
case 6:
return _l('label.secondary.storage');
case 7:
return _l('label.vlan');
case 8:
return _l('label.direct.ips');
case 9:
return _l('label.local.storage');
case 10:
return "Routing Host";
case 11:
return "Storage";
case 12:
return "Usage Server";
case 13:
return "Management Server";
case 14:
return "Domain Router";
case 15:
return "Console Proxy";
case 16:
return "User VM";
case 17:
return "VLAN";
case 18:
return "Secondary Storage VM";
}
},
convertByType: function(alertCode, value) {
switch (alertCode) {
case 0:
return cloudStack.converters.convertBytes(value);
case 1:
return cloudStack.converters.convertHz(value);
case 2:
return cloudStack.converters.convertBytes(value);
case 3:
return cloudStack.converters.convertBytes(value);
case 6:
return cloudStack.converters.convertBytes(value);
case 9:
return cloudStack.converters.convertBytes(value);
case 11:
return cloudStack.converters.convertBytes(value);
}
return value;
}
}
//data parameter passed to API call in listView
function listViewDataProvider(args, data) {
//search
if (args.filterBy != null) {
if (args.filterBy.advSearch != null && typeof(args.filterBy.advSearch) == "object") { //advanced search
for (var key in args.filterBy.advSearch) {
if (key == 'tagKey' && args.filterBy.advSearch[key].length > 0) {
$.extend(data, {
'tags[0].key': args.filterBy.advSearch[key]
});
} else if (key == 'tagValue' && args.filterBy.advSearch[key].length > 0) {
$.extend(data, {
'tags[0].value': args.filterBy.advSearch[key]
});
} else if (args.filterBy.advSearch[key] != null && args.filterBy.advSearch[key].length > 0) {
data[key] = args.filterBy.advSearch[key]; //do NOT use $.extend(data, { key: args.filterBy.advSearch[key] }); which will treat key variable as "key" string
}
}
} else if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) { //basic search
switch (args.filterBy.search.by) {
case "name":
if (args.filterBy.search.value.length > 0) {
$.extend(data, {
keyword: args.filterBy.search.value
});
}
break;
}
}
}
//pagination
$.extend(data, {
listAll: true,
page: args.page,
pagesize: pageSize
});
}
//used by infrastruct page and network page
var addExtraPropertiesToGuestNetworkObject = function(jsonObj) {
jsonObj.networkdomaintext = jsonObj.networkdomain;
jsonObj.networkofferingidText = jsonObj.networkofferingid;
if (jsonObj.acltype == "Domain") {
if (jsonObj.domainid == rootAccountId)
jsonObj.scope = "All";
else
jsonObj.scope = "Domain (" + jsonObj.domain + ")";
} else if (jsonObj.acltype == "Account") {
if (jsonObj.project != null)
jsonObj.scope = "Account (" + jsonObj.domain + ", " + jsonObj.project + ")";
else
jsonObj.scope = "Account (" + jsonObj.domain + ", " + jsonObj.account + ")";
}
if (jsonObj.vlan == null && jsonObj.broadcasturi != null) {
jsonObj.vlan = jsonObj.broadcasturi.replace("vlan://", "");
}
}
//find service object in network object
function ipFindNetworkServiceByName(pName, networkObj) {
if (networkObj == null)
return null;
if (networkObj.service != null) {
for (var i = 0; i < networkObj.service.length; i++) {
var networkServiceObj = networkObj.service[i];
if (networkServiceObj.name == pName)
return networkServiceObj;
}
}
return null;
}
//find capability object in service object in network object
function ipFindCapabilityByName(pName, networkServiceObj) {
if (networkServiceObj == null)
return null;
if (networkServiceObj.capability != null) {
for (var i = 0; i < networkServiceObj.capability.length; i++) {
var capabilityObj = networkServiceObj.capability[i];
if (capabilityObj.name == pName)
return capabilityObj;
}
}
return null;
}
//compose URL for adding primary storage
function nfsURL(server, path) {
var url;
if (server.indexOf("://") == -1)
url = "nfs://" + server + path;
else
url = server + path;
return url;
}
function presetupURL(server, path) {
var url;
if (server.indexOf("://") == -1)
url = "presetup://" + server + path;
else
url = server + path;
return url;
}
function ocfs2URL(server, path) {
var url;
if (server.indexOf("://") == -1)
url = "ocfs2://" + server + path;
else
url = server + path;
return url;
}
function SharedMountPointURL(server, path) {
var url;
if (server.indexOf("://") == -1)
url = "SharedMountPoint://" + server + path;
else
url = server + path;
return url;
}
function rbdURL(monitor, pool, id, secret) {
var url;
/*
Replace the + and / symbols by - and _ to have URL-safe base64 going to the API
It's hacky, but otherwise we'll confuse java.net.URI which splits the incoming URI
*/
secret = secret.replace("+", "-");
secret = secret.replace("/", "_");
if (id != null && secret != null) {
monitor = id + ":" + secret + "@" + monitor;
}
if (pool.substring(0, 1) != "/")
pool = "/" + pool;
if (monitor.indexOf("://") == -1)
url = "rbd://" + monitor + pool;
else
url = monitor + pool;
return url;
}
function clvmURL(vgname) {
var url;
if (vgname.indexOf("://") == -1)
url = "clvm://localhost/" + vgname;
else
url = vgname;
return url;
}
function vmfsURL(server, path) {
var url;
if (server.indexOf("://") == -1)
url = "vmfs://" + server + path;
else
url = server + path;
return url;
}
function iscsiURL(server, iqn, lun) {
var url;
if (server.indexOf("://") == -1)
url = "iscsi://" + server + iqn + "/" + lun;
else
url = server + iqn + "/" + lun;
return url;
}
//VM Instance
function getVmName(p_vmName, p_vmDisplayname) {
if (p_vmDisplayname == null)
return _s(p_vmName);
var vmName = null;
if (p_vmDisplayname != p_vmName) {
vmName = _s(p_vmName) + " (" + _s(p_vmDisplayname) + ")";
} else {
vmName = _s(p_vmName);
}
return vmName;
}
var timezoneMap = new Object();
timezoneMap['Etc/GMT+12'] = '[UTC-12:00] GMT-12:00';
timezoneMap['Etc/GMT+11'] = '[UTC-11:00] GMT-11:00';
timezoneMap['Pacific/Samoa'] = '[UTC-11:00] Samoa Standard Time';
timezoneMap['Pacific/Honolulu'] = '[UTC-10:00] Hawaii Standard Time';
timezoneMap['US/Alaska'] = '[UTC-09:00] Alaska Standard Time';
timezoneMap['America/Los_Angeles'] = '[UTC-08:00] Pacific Standard Time';
timezoneMap['Mexico/BajaNorte'] = '[UTC-08:00] Baja California';
timezoneMap['US/Arizona'] = '[UTC-07:00] Arizona';
timezoneMap['US/Mountain'] = '[UTC-07:00] Mountain Standard Time';
timezoneMap['America/Chihuahua'] = '[UTC-07:00] Chihuahua, La Paz';
timezoneMap['America/Chicago'] = '[UTC-06:00] Central Standard Time';
timezoneMap['America/Costa_Rica'] = '[UTC-06:00] Central America';
timezoneMap['America/Mexico_City'] = '[UTC-06:00] Mexico City, Monterrey';
timezoneMap['Canada/Saskatchewan'] = '[UTC-06:00] Saskatchewan';
timezoneMap['America/Bogota'] = '[UTC-05:00] Bogota, Lima';
timezoneMap['America/New_York'] = '[UTC-05:00] Eastern Standard Time';
timezoneMap['America/Caracas'] = '[UTC-04:00] Venezuela Time';
timezoneMap['America/Asuncion'] = '[UTC-04:00] Paraguay Time';
timezoneMap['America/Cuiaba'] = '[UTC-04:00] Amazon Time';
timezoneMap['America/Halifax'] = '[UTC-04:00] Atlantic Standard Time';
timezoneMap['America/La_Paz'] = '[UTC-04:00] Bolivia Time';
timezoneMap['America/Santiago'] = '[UTC-04:00] Chile Time';
timezoneMap['America/St_Johns'] = '[UTC-03:30] Newfoundland Standard Time';
timezoneMap['America/Araguaina'] = '[UTC-03:00] Brasilia Time';
timezoneMap['America/Argentina/Buenos_Aires'] = '[UTC-03:00] Argentine Time';
timezoneMap['America/Cayenne'] = '[UTC-03:00] French Guiana Time';
timezoneMap['America/Godthab'] = '[UTC-03:00] Greenland Time';
timezoneMap['America/Montevideo'] = '[UTC-03:00] Uruguay Time]';
timezoneMap['Etc/GMT+2'] = '[UTC-02:00] GMT-02:00';
timezoneMap['Atlantic/Azores'] = '[UTC-01:00] Azores Time';
timezoneMap['Atlantic/Cape_Verde'] = '[UTC-01:00] Cape Verde Time';
timezoneMap['Africa/Casablanca'] = '[UTC] Casablanca';
timezoneMap['Etc/UTC'] = '[UTC] Coordinated Universal Time';
timezoneMap['Atlantic/Reykjavik'] = '[UTC] Reykjavik';
timezoneMap['Europe/London'] = '[UTC] Western European Time';
timezoneMap['CET'] = '[UTC+01:00] Central European Time';
timezoneMap['Europe/Bucharest'] = '[UTC+02:00] Eastern European Time';
timezoneMap['Africa/Johannesburg'] = '[UTC+02:00] South Africa Standard Time';
timezoneMap['Asia/Beirut'] = '[UTC+02:00] Beirut';
timezoneMap['Africa/Cairo'] = '[UTC+02:00] Cairo';
timezoneMap['Asia/Jerusalem'] = '[UTC+02:00] Israel Standard Time';
timezoneMap['Europe/Minsk'] = '[UTC+02:00] Minsk';
timezoneMap['Europe/Moscow'] = '[UTC+03:00] Moscow Standard Time';
timezoneMap['Africa/Nairobi'] = '[UTC+03:00] Eastern African Time';
timezoneMap['Asia/Karachi'] = '[UTC+05:00] Pakistan Time';
timezoneMap['Asia/Kolkata'] = '[UTC+05:30] India Standard Time';
timezoneMap['Asia/Bangkok'] = '[UTC+05:30] Indochina Time';
timezoneMap['Asia/Shanghai'] = '[UTC+08:00] China Standard Time';
timezoneMap['Asia/Kuala_Lumpur'] = '[UTC+08:00] Malaysia Time';
timezoneMap['Australia/Perth'] = '[UTC+08:00] Western Standard Time (Australia)';
timezoneMap['Asia/Taipei'] = '[UTC+08:00] Taiwan';
timezoneMap['Asia/Tokyo'] = '[UTC+09:00] Japan Standard Time';
timezoneMap['Asia/Seoul'] = '[UTC+09:00] Korea Standard Time';
timezoneMap['Australia/Adelaide'] = '[UTC+09:30] Central Standard Time (South Australia)';
timezoneMap['Australia/Darwin'] = '[UTC+09:30] Central Standard Time (Northern Territory)';
timezoneMap['Australia/Brisbane'] = '[UTC+10:00] Eastern Standard Time (Queensland)';
timezoneMap['Australia/Canberra'] = '[UTC+10:00] Eastern Standard Time (New South Wales)';
timezoneMap['Pacific/Guam'] = '[UTC+10:00] Chamorro Standard Time';
timezoneMap['Pacific/Auckland'] = '[UTC+12:00] New Zealand Standard Time';
// CloudStack common API helpers
cloudStack.api = {
actions: {
sort: function(updateCommand, objType) {
var action = function(args) {
$.ajax({
url: createURL(updateCommand),
data: {
id: args.context[objType].id,
sortKey: args.index
},
success: function(json) {
args.response.success();
},
error: function(json) {
args.response.error(parseXMLHttpResponse(json));
}
});
};
return {
moveTop: {
action: action
},
moveBottom: {
action: action
},
moveUp: {
action: action
},
moveDown: {
action: action
},
moveDrag: {
action: action
}
}
}
},
tags: function(args) {
var resourceType = args.resourceType;
var contextId = args.contextId;
return {
actions: {
add: function(args) {
var data = args.data;
var resourceId = args.context[contextId][0].id;
$.ajax({
url: createURL('createTags'),
data: {
'tags[0].key': data.key,
'tags[0].value': data.value,
resourceIds: resourceId,
resourceType: resourceType
},
success: function(json) {
args.response.success({
_custom: {
jobId: json.createtagsresponse.jobid
},
notification: {
desc: 'Add tag for ' + resourceType,
poll: pollAsyncJobResult
}
});
}
});
},
remove: function(args) {
var data = args.context.tagItems[0];
var resourceId = args.context[contextId][0].id;
$.ajax({
url: createURL('deleteTags'),
data: {
'tags[0].key': data.key,
'tags[0].value': data.value,
resourceIds: resourceId,
resourceType: resourceType
},
success: function(json) {
args.response.success({
_custom: {
jobId: json.deletetagsresponse.jobid
},
notification: {
desc: 'Remove tag for ' + resourceType,
poll: pollAsyncJobResult
}
});
}
});
}
},
dataProvider: function(args) {
var resourceId = args.context[contextId][0].id;
var data = {
resourceId: resourceId,
resourceType: resourceType
};
if (isAdmin() || isDomainAdmin()) {
data.listAll = true;
}
if (args.context.projects) {
data.projectid = args.context.projects[0].id;
}
if (args.jsonObj != null && args.jsonObj.projectid != null && data.projectid == null) {
data.projectid = args.jsonObj.projectid;
}
$.ajax({
url: createURL('listTags'),
data: data,
success: function(json) {
args.response.success({
data: json.listtagsresponse ? json.listtagsresponse.tag : []
});
},
error: function(json) {
args.response.error(parseXMLHttpResponse(json));
}
});
}
};
}
};
function strOrFunc(arg, args) {
if (typeof arg === 'function')
return arg(args);
return arg;
}