Merge branch '3.0.x' of ssh://git.cloud.com/var/lib/git/cloudstack-oss into 3.0.x

This commit is contained in:
Vijayendra Bhamidipati 2012-08-07 19:50:23 -04:00
commit d9ffd743f0
10 changed files with 317 additions and 86 deletions

View File

@ -1,4 +1,5 @@
#new labels (begin) **********************************************************************************************
label.tier.details=Tier details
label.edit.tags=Edit tags
label.network.rate.megabytes=Network Rate (MB/s)
label.action.enable.physical.network=Enable physical network

View File

@ -229,7 +229,7 @@ public class Site2SiteVpnManagerImpl implements Site2SiteVpnManager, Manager {
}
_accountMgr.checkAccess(caller, null, false, vpnGateway);
if (customerGateway.getAccountId() != vpnGateway.getAccountId() || customerGateway.getDomainId() != vpnGateway.getAccountId()) {
if (customerGateway.getAccountId() != vpnGateway.getAccountId() || customerGateway.getDomainId() != vpnGateway.getDomainId()) {
throw new InvalidParameterValueException("VPN connection can only be esitablished between same account's VPN gateway and customer gateway!", null);
}

View File

@ -9647,7 +9647,7 @@ div.panel.ui-dialog div.list-view div.fixed-header {
float: left;
}
/*Configure ACL dialog*/
/*Configure ACL dialog / VM tier list view dialog*/
.ui-dialog.configure-acl .multi-edit {
width: 866px;
}
@ -9657,12 +9657,16 @@ div.panel.ui-dialog div.list-view div.fixed-header {
}
.ui-dialog.configure-acl .ui-dialog-buttonpane {
/*+placement:shift 798px -2px;*/
/*+placement:shift 722px -2px;*/
position: relative;
left: 798px;
left: 722px;
top: -2px;
}
.ui-dialog.configure-acl div.view.list-view {
max-height: 474px;
}
.ui-dialog.configure-acl .multi-edit .data {
width: 901px;
padding: 0;
@ -9677,12 +9681,30 @@ div.panel.ui-dialog div.list-view div.fixed-header {
max-width: none !important;
}
.ui-dialog.configure-acl .view.list-view table.body tr td.actions {
width: 184px !important;
max-width: 184px !important;
}
/*Autoscaler*/
.ui-dialog div.autoscaler {
overflow: auto;
max-height: 600px;
}
.ui-dialog div.autoscaler .detail-actions {
}
.ui-dialog div.autoscaler .detail-actions .buttons {
float: right;
margin-right: 6px;
}
.ui-dialog div.autoscaler .detail-actions .buttons .action {
width: 32px;
float: left;
}
.ui-dialog div.autoscaler div.form-container div.form-item[rel=securityGroups] {
display: block;
width: 370px;

View File

@ -5,7 +5,6 @@
</c:if>
<fmt:setBundle basename="resources/messages"/>
<% long now = System.currentTimeMillis(); %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
@ -17,7 +16,6 @@
<c:if test="${!empty cookie.lang && cookie.lang.value != 'en'}">
<link type="text/css" rel="stylesheet" href="css/cloudstack3.${cookie.lang.value}.css" />
</c:if>
<!--[if IE 7]>
<link type="text/css" rel="stylesheet" href="css/cloudstack3-ie7.css" />
<![endif]-->
@ -37,22 +35,18 @@
<label for="username"><fmt:message key="label.username"/></label>
<input type="text" name="username" class="required" />
</div>
<!-- Password -->
<div class="field password">
<label for="password"><fmt:message key="label.password"/></label>
<input type="password" name="password" class="required" />
</div>
<!-- Domain -->
<div class="field domain">
<label for="domain"><fmt:message key="label.domain"/></label>
<input type="text" name="domain" />
</div>
<!-- Submit (login) -->
<input type="submit" value="<fmt:message key="label.login"/>" />
<!-- Select language -->
<div class="select-language">
<select name="language">
@ -65,7 +59,6 @@
</div>
</form>
</div>
<!-- Instance wizard -->
<div class="multi-wizard instance-wizard">
<div class="progress">
@ -94,7 +87,6 @@
</select>
</div>
</div>
<!-- Select template -->
<div class="section select-template">
<h3><fmt:message key="label.select.iso.or.template" /></h3>
@ -282,7 +274,6 @@
</div>
</div>
</div>
<!-- Step 5c: Select security group -->
<div class="wizard-step-conditional select-security-group">
<div class="main-desc">
@ -294,7 +285,6 @@
</div>
</div>
</div>
<!-- Step 6: Review -->
<div class="step review" wizard-step-id="review">
<div class="main-desc">
@ -311,7 +301,6 @@
<input type="text" name="displayname" />
</div>
</div>
<!-- Add to group -->
<div class="select odd">
<div class="name">
@ -321,7 +310,6 @@
<input type="text" name="groupname" />
</div>
</div>
<!-- Zone -->
<div class="select">
<div class="name">
@ -334,7 +322,6 @@
<a href="1"><fmt:message key="label.edit"/></a>
</div>
</div>
<!-- Hypervisor -->
<div class="select odd">
<div class="name">
@ -347,7 +334,6 @@
<a href="1"><fmt:message key="label.edit"/></a>
</div>
</div>
<!-- Template -->
<div class="select">
<div class="name">
@ -360,7 +346,6 @@
<a href="2"><fmt:message key="label.edit"/></a>
</div>
</div>
<!-- Service offering -->
<div class="select odd">
<div class="name">
@ -373,7 +358,6 @@
<a href="3"><fmt:message key="label.edit"/></a>
</div>
</div>
<!-- Data disk offering -->
<div class="select">
<div class="name">
@ -386,7 +370,6 @@
<a href="4"><fmt:message key="label.edit"/></a>
</div>
</div>
<!-- Primary network -->
<div class="select odd">
<div class="name">
@ -404,7 +387,6 @@
</div>
</div>
</form>
<!-- Computer diagram -->
<div class="diagram">
<div>
@ -417,7 +399,6 @@
<div class="part hd"></div>
<div class="part network-card"></div>
</div>
<!-- Buttons -->
<div class="buttons">
<div class="button previous"><span><fmt:message key="label.previous"/></span></div>
@ -425,7 +406,6 @@
<div class="button next"><span><fmt:message key="label.next"/></span></div>
</div>
</div>
<!-- Zone wizard -->
<div class="multi-wizard zone-wizard">
<div class="progress">
@ -471,7 +451,6 @@
</div>
</form>
</div>
<!-- Step 2: Add zone -->
<div class="setup-zone" zone-wizard-form="zone"
zone-wizard-step-id="addZone">
@ -482,7 +461,6 @@
<div class="select-container"></div>
</div>
</div>
<!-- Step 3.1: Setup Physical Network -->
<div class="setup-physical-network"
zone-wizard-step-id="setupPhysicalNetwork"
@ -501,7 +479,6 @@
<fmt:message key="message.setup.physical.network.during.zone.creation.basic"/>
</div>
<div class="button add new-physical-network"><span class="icon">&nbsp;</span><span><fmt:message key="label.add.physical.network"/></span></div>
<!-- Traffic types drag area -->
<div class="traffic-types-drag-area">
<div class="header"><fmt:message key="label.traffic.types"/></div>
@ -576,13 +553,11 @@
</li>
</ul>
</div>
<div class="drag-helper-icon"></div>
<div class="content input-area">
<form></form>
</div>
</div>
<!-- Step 3.1b: Add Netscaler device -->
<div class="setup-physical-network-basic"
zone-wizard-step-id="addNetscalerDevice"
@ -595,13 +570,11 @@
<li class="guest-traffic"><fmt:message key="label.guest.traffic"/></li>
<li class="conditional storage-traffic"><fmt:message key="label.storage.traffic"/></li>
</ul>
<div class="info-desc"><fmt:message key="label.please.specify.netscaler.info"/></div>
<div class="content input-area">
<div class="select-container"></div>
</div>
</div>
<!-- Step 3.2: Configure public traffic -->
<div class="setup-public-traffic" zone-wizard-prefilter="addPublicNetwork"
zone-wizard-step-id="configurePublicTraffic">
@ -612,14 +585,12 @@
<li class="guest-traffic"><fmt:message key="label.guest.traffic"/></li>
<li class="conditional storage-traffic"><fmt:message key="label.storage.traffic"/></li>
</ul>
<div class="info-desc" id="add_zone_public_traffic_desc">
<span id="for_basic_zone" style="display:none"><fmt:message key="message.public.traffic.in.basic.zone"/></span>
<span id="for_advanced_zone" style="display:none"><fmt:message key="message.public.traffic.in.advanced.zone"/></span>
</div>
<div ui-custom="publicTrafficIPRange"></div>
</div>
<!-- Step 3.3: Add pod -->
<div class="add-pod" zone-wizard-form="pod"
zone-wizard-step-id="addPod">
@ -630,7 +601,6 @@
<li class="guest-traffic"><fmt:message key="label.guest.traffic"/></li>
<li class="conditional storage-traffic"><fmt:message key="label.storage.traffic"/></li>
</ul>
<div class="info-desc">
<fmt:message key="message.add.pod.during.zone.creation"/>
</div>
@ -638,7 +608,6 @@
<div class="select-container"></div>
</div>
</div>
<!-- Step 3.4: Configure guest traffic -->
<div class="setup-guest-traffic"
zone-wizard-form="guestTraffic"
@ -651,7 +620,6 @@
<li class="guest-traffic active"><fmt:message key="label.guest.traffic"/></li>
<li class="conditional storage-traffic"><fmt:message key="label.storage.traffic"/></li>
</ul>
<div class="info-desc" id="add_zone_guest_traffic_desc">
<span id="for_basic_zone" style="display:none"><fmt:message key="message.guest.traffic.in.basic.zone"/></span>
<span id="for_advanced_zone" style="display:none"><fmt:message key="message.guest.traffic.in.advanced.zone"/></span>
@ -660,7 +628,6 @@
<div class="select-container"></div>
</div>
</div>
<!-- Step 3.5: Configure storage traffic -->
<div class="setup-storage-traffic" zone-wizard-prefilter="configureStorageTraffic"
zone-wizard-step-id="configureStorageTraffic">
@ -671,13 +638,11 @@
<li class="guest-traffic"><fmt:message key="label.guest.traffic"/></li>
<li class="storage-traffic active"><fmt:message key="label.storage.traffic"/></li>
</ul>
<div class="info-desc">
<fmt:message key="message.storage.traffic"/>
</div>
<div ui-custom="storageTrafficIPRange"></div>
</div>
<!-- Step 4.1: Add cluster -->
<div class="add-cluster" zone-wizard-form="cluster"
zone-wizard-step-id="addCluster">
@ -695,7 +660,6 @@
<div class="select-container"></div>
</div>
</div>
<!-- Step 4.2: Add host -->
<div class="add-cluster" zone-wizard-form="host"
zone-wizard-step-id="addHost" zone-wizard-prefilter="addHost">
@ -712,7 +676,6 @@
<div class="select-container"></div>
</div>
</div>
<!-- Step 4.3: Add primary storage -->
<div class="add-cluster" zone-wizard-form="primaryStorage" zone-wizard-prefilter="addPrimaryStorage"
zone-wizard-step-id="addPrimaryStorage">
@ -729,7 +692,6 @@
<div class="select-container"></div>
</div>
</div>
<!-- Step 4.4: Add secondary storage -->
<div class="add-cluster" zone-wizard-form="secondaryStorage"
zone-wizard-step-id="addSecondaryStorage">
@ -746,7 +708,6 @@
<div class="select-container"></div>
</div>
</div>
<!-- Step 5: Launch -->
<div class="review" zone-wizard-step-id="launch">
<div class="main-desc pre-setup"><fmt:message key="message.launch.zone"/></div>
@ -760,7 +721,6 @@
</div>
</div>
</div>
<!-- Buttons -->
<div class="buttons">
<div class="button previous"><span><fmt:message key="label.previous"/></span></div>
@ -768,7 +728,6 @@
<div class="button next"><span><fmt:message key="label.next"/></span></div>
</div>
</div>
<!-- Network chart -->
<div class="network-chart normal">
<ul>
@ -786,7 +745,6 @@
</li>
</ul>
</div>
<!-- Static NAT network chart -->
<div class="network-chart static-nat">
<ul>
@ -801,7 +759,6 @@
</li>
</ul>
</div>
<!-- Project dashboard -->
<div class="project-dashboard-view">
<div class="overview-area">
@ -869,7 +826,6 @@
</div>
</div>
</div>
<div class="info-boxes">
<!-- Networking and security -->
<div class="info-box networking-and-security">
@ -913,7 +869,6 @@
</li>
</ul>
</div>
<!-- Events -->
<div class="info-box events">
<div class="title">
@ -932,7 +887,6 @@
</div>
</div>
</div>
<!-- System dashboard -->
<div class="system-dashboard-view">
<div class="toolbar">
@ -1652,6 +1606,7 @@
</html>
<script language="javascript">
dictionary = {
'label.tier.details': '<fmt:message key="label.tier.details"/>',
'label.edit.tags': '<fmt:message key="label.edit.tags"/>',
'label.network.rate.megabytes': '<fmt:message key="label.network.rate.megabytes"/>',
'message.setup.physical.network.during.zone.creation.basic': '<fmt:message key="message.setup.physical.network.during.zone.creation.basic"/>',

View File

@ -17,6 +17,78 @@
var totalScaleDownCondition = 0;
cloudStack.autoscaler = {
// UI actions to appear in dialog
autoscaleActions: {
enable: {
label: 'Enable Autoscale VM Group',
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 VM Group',
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].context.autoscaleVmGroup.state == 'disabled')
allowedActions.push('enable');
else if(args.context.originalAutoscaleData[0].context.autoscaleVmGroup.state == 'enabled')
allowedActions.push('disable');
}
return allowedActions;
},
dataProvider: function(args) {
// Reset data
scaleUpData = [];
@ -31,6 +103,7 @@
$.ajax({
url: createURL('listAutoScaleVmGroups'),
data: {
listAll: true,
lbruleid: args.context.multiRules[0].id
},
success: function(json) {
@ -39,6 +112,7 @@
$.ajax({
url: createURL('listAutoScaleVmProfiles'),
data: {
listAll: true,
id: autoscaleVmGroup.vmprofileid
},
success: function(json) {
@ -76,15 +150,17 @@
var diskOfferingId, securityGroups;
var otherdeployparams = autoscaleVmProfile.otherdeployparams;
var array1 = otherdeployparams.split('&');
$(array1).each(function(){
var array2 = this.split('=');
if(array2[0] == 'diskofferingid')
diskOfferingId= array2[1];
if(array2[0] == 'securitygroupids')
securityGroups = array2[1];
});
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,
@ -337,25 +413,50 @@
label: 'User',
select: function(args) {
var items = [];
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: ""});
}
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 });
}
}
}
}
},
@ -1005,7 +1106,7 @@
array1.push("&destroyvmgraceperiod=" + args.data.destroyVMgracePeriod);
array1.push("&snmpcommunity=" + args.data.snmpCommunity);
array1.push("&snmpport=" + args.data.snmpPort);
if(args.data.username != "")
if(args.data.username != null && args.data.username.length > 0)
array1.push("&autoscaleuserid=" + args.data.username);
$.ajax({
@ -1156,7 +1257,9 @@
id: args.context.originalAutoscaleData.context.autoscaleVmGroup.id,
minmembers: args.data.minInstance,
maxmembers: args.data.maxInstance,
interval: args.data.interval
interval: args.data.interval,
scaleuppolicyids: args.context.originalAutoscaleData.scaleUpPolicy.id,
scaledownpolicyids: args.context.originalAutoscaleData.scaleDownPolicy.id
};
$.ajax({

View File

@ -2279,6 +2279,7 @@
'autoScale': {
label: 'AutoScale',
custom: {
requireValidation: true,
buttonLabel: 'label.configure',
action: cloudStack.uiCustom.autoscaler(cloudStack.autoscaler)
}

View File

@ -18,6 +18,8 @@
var scaleuppolicy = forms.scaleUpPolicy;
var scaledownpolicy = forms.scaleDownPolicy;
var dataProvider = cloudStack.autoscaler.dataProvider;
var actions = cloudStack.autoscaler.autoscaleActions;
var actionFilter = cloudStack.autoscaler.actionFilter;
return function(args) {
var context = args.data ?
@ -51,6 +53,91 @@
scaleDownPolicyTitleForm, $scaleDownPolicyTitleForm,
scaleUpPolicyForm, scaleDownPolicyForm;
var renderActions = function(args) {
var data = args.data;
var context = args.context;
var $actions = $('<div>').addClass('detail-group');
var $actionsTable = $('<table>').append('<tr>');
var $detailActions = $('<td>').addClass('detail-actions');
var $buttons = $('<div>').addClass('buttons');
var visibleActions = actionFilter ?
actionFilter({
context: $.extend(true, {}, context, {
originalAutoscaleData: data ? [data] : null
})
}) :
$.map(actions, function(value, key) { return key; });
$detailActions.append($buttons);
$actionsTable.find('tr').append($detailActions);
$actions.append($actionsTable);
$(visibleActions).map(function(index, actionID) {
var action = actions[actionID];
var label = _l(action.label);
var $action = $('<div>').addClass('action').addClass(actionID);
var $icon = $('<a>')
.attr({ href: '#', title: label })
.append($('<span>').addClass('icon'));
if (visibleActions.length == 1) $action.addClass('single');
else if (!index) $action.addClass('first');
else if (index == visibleActions.length - 1) $action.addClass('last');
// Perform action event
$action.click(function() {
var $loading = $('<div>').addClass('loading-overlay').appendTo($autoscalerDialog);
var success = function(args) {
$loading.remove();
cloudStack.dialog.notice({
message: _l('label.task.completed') + ': ' + label
});
// Reload actions
var $newActions = renderActions({
data: data ? $.extend(data, args.data) : args.data,
context: context
});
$actions.after($newActions);
$actions.remove();
};
var error = function(message) {
$loading.remove();
cloudStack.dialog.notice({ message: message });
};
action.action({
context: {
originalAutoscaleData: args.data,
},
response: {
success: function(args) {
var notification = $.extend(args.notification, {
_custom: args._custom,
desc: label
});
cloudStack.ui.notifications.add(
notification,
success, {},
error, {}
);
},
error: error
}
});
});
$action.append($icon);
$action.appendTo($buttons);
});
if (!visibleActions || !visibleActions.length) $actions.hide();
return $actions;
};
var renderDialogContent = function(args) {
var data = args.data ? args.data : {};
@ -69,7 +156,7 @@
$.extend(context, {
originalAutoscaleData: args.data
})
});
// Create and append top fields
// -- uses create form to generate fields
@ -207,6 +294,9 @@
$autoscalerDialog.dialog('option', 'position', 'center');
$autoscalerDialog.dialog('option', 'height', 'auto');
// Setup actions
renderActions(args).prependTo($autoscalerDialog);
};
var $loading = $('<div>').addClass('loading-overlay').appendTo($autoscalerDialog);

View File

@ -62,7 +62,26 @@
listViewArgs.activeSection
] = [$instanceRow.data('jsonObj')];
if (action.custom && !action.noAdd) {
var externalLinkAction = action.externalLink;
if (externalLinkAction) {
// Show popup immediately, do not proceed through normal action process
window.open(
// URL
externalLinkAction.url({
context: context
}),
// Title
externalLinkAction.title({
context: context
}),
// Window options
'menubar=0,resizable=0,'
+ 'width=' + externalLinkAction.width + ','
+ 'height=' + externalLinkAction.height
);
} else if (action.custom && !action.noAdd) {
action.custom({
data: data,
ref: options.ref,
@ -250,7 +269,8 @@
listViewArgs.activeSection
] = [$instanceRow.data('jsonObj')];
if (!args.action.createForm &&
if (!args.action.action.externalLink &&
!args.action.createForm &&
args.action.addRow != 'true' &&
!action.custom && !action.uiCustom)
cloudStack.dialog.confirm({
@ -270,7 +290,26 @@
var isHeader = args.action.isHeader;
var createFormContext = $.extend({}, context);
if (args.action.createForm) {
var externalLinkAction = action.externalLink;
if (externalLinkAction) {
// Show popup immediately, do not proceed through normal action process
window.open(
// URL
externalLinkAction.url({
context: context
}),
// Title
externalLinkAction.title({
context: context
}),
// Window options
'menubar=0,resizable=0,'
+ 'width=' + externalLinkAction.width + ','
+ 'height=' + externalLinkAction.height
);
} else if (args.action.createForm) {
cloudStack.dialog.createForm({
form: args.action.createForm,
after: function(args) {

View File

@ -804,6 +804,9 @@
$('<div>').addClass('button add-vm custom-action')
.html(_l(field.custom.buttonLabel))
.click(function() {
if (field.custom.requireValidation &&
!$multiForm.valid()) return false;
var formData = getMultiData($multi);
field.custom.action({
@ -816,6 +819,8 @@
}
}
});
return false;
}).appendTo($td);
} else if (field.addButton) {
$addVM = $('<div>').addClass('button add-vm').html(

View File

@ -12,7 +12,7 @@
var aclMultiEdit = {
noSelect: true,
fields: {
'cidrlist': { edit: true, label: 'label.cidr.list' },
'cidrlist': { edit: true, label: 'label.cidr' },
'protocol': {
label: 'label.protocol',
select: function(args) {
@ -369,6 +369,21 @@
}
});
}
},
viewConsole: {
label: 'label.view.console',
action: {
externalLink: {
url: function(args) {
return clientConsoleUrl + '?cmd=access&vm=' + args.context.vpcTierInstances[0].id;
},
title: function(args) {
return args.context.vpcTierInstances[0].id.substr(0,8); //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
},
width: 820,
height: 640
}
}
}
},
dataProvider: function(args) {
@ -1376,7 +1391,7 @@
isMaximized: true,
tabs: {
details: {
title: 'label.details',
title: 'label.tier.details',
preFilter: function(args) {
var hiddenFields = [];
var zone;