').addClass('acl').multiEdit(
- $.extend(true, {}, actionArgs.multiEdit, {
- context: context
- })
- ).dialog({
- title: 'Configure ACL for tier: ' + $tier.find('.title').attr('title'),
- dialogClass: 'configure-acl',
- width: 900,
- height: 600,
- buttons: {
- 'Done': function() {
- $(':ui-dialog').remove();
- $('.overlay').remove();
- }
- }
+ elems.aclDialog({
+ isDialog: true,
+ actionArgs: actionArgs,
+ context: context
}).closest('.ui-dialog').overlay();
break;
default:
@@ -629,6 +696,8 @@
// Appends a new tier to chart
var addNewTier = function(args) {
+ var ipAddresses = args.ipAddresses;
+ var acl = args.acl;
var actions = args.actions;
var vmListView = args.vmListView;
var actionPreFilter = args.actionPreFilter;
@@ -636,12 +705,14 @@
var $browser = args.$browser;
var tierDetailView = args.tierDetailView;
var tier = $.extend(args.tier, {
+ ipAddresses: ipAddresses,
$browser: $browser,
detailView: tierDetailView,
context: context,
vmListView: vmListView,
actions: actions,
actionPreFilter: actionPreFilter,
+ acl: acl,
virtualMachines: []
});
var $tiers = args.$tiers;
@@ -656,6 +727,7 @@
// Renders the add tier form, in a dialog
var addTierDialog = function(args) {
+ var ipAddresses = args.ipAddresses;
var actions = args.actions;
var context = args.context;
var vmListView = args.vmListView;
@@ -663,6 +735,7 @@
var $tiers = args.$tiers;
var $browser = args.$browser;
var tierDetailView = args.tierDetailView;
+ var acl = args.acl;
cloudStack.dialog.createForm({
context: context,
@@ -686,12 +759,14 @@
function(args) {
$loading.remove();
addNewTier({
+ ipAddresses: ipAddresses,
$browser: $browser,
tierDetailView: tierDetailView,
context: $.extend(true, {}, context, {
networks: [tier]
}),
tier: tier,
+ acl: acl,
$tiers: $tiers,
actions: actions,
actionPreFilter: actionPreFilter,
@@ -722,6 +797,7 @@
var tierArgs = args.tiers;
var ipAddresses = args.ipAddresses;
var gateways = args.gateways;
+ var acl = args.acl;
var siteToSiteVPN = args.siteToSiteVPN;
return function(args) {
@@ -743,12 +819,36 @@
context: context,
response: {
success: function(args) {
+ // Setup detail view tabs
+ var tierDetailView = $.extend(true, {}, tierArgs.detailView, {
+ tabs: {
+ acl: {
+ custom: function(args) {
+ var $acl = elems.aclDialog({
+ isDialog: false,
+ actionArgs: acl,
+ context: args.context
+ });
+
+ return $acl;
+ }
+ },
+ ipAddresses: {
+ custom: function(args) {
+ return $('
').listView(ipAddresses.listView(),
+ {context: args.context});
+ }
+ }
+ }
+ });
+
var tiers = args.tiers;
var $chart = elems.chart({
$browser: $browser,
ipAddresses: ipAddresses,
gateways: gateways,
- tierDetailView: tierArgs.detailView,
+ acl: acl,
+ tierDetailView: tierDetailView,
siteToSiteVPN: siteToSiteVPN,
vmListView: vmListView,
context: context,
diff --git a/ui/scripts/ui/widgets/multiEdit.js b/ui/scripts/ui/widgets/multiEdit.js
index 870d0856ab4..cece45e56c9 100644
--- a/ui/scripts/ui/widgets/multiEdit.js
+++ b/ui/scripts/ui/widgets/multiEdit.js
@@ -893,6 +893,7 @@
context: context,
data: data,
itemData: itemData,
+ $multi: $multi,
response: {
success: function(successArgs) {
var notification = successArgs ? successArgs.notification : null;
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index a9f01ab3b9a..234818e08da 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -65,6 +65,42 @@
},
'startport': { edit: true, label: 'label.start.port' },
'endport': { edit: true, label: 'label.end.port' },
+ 'networkid': {
+ label: 'Select Tier',
+ select: function(args) {
+ var data = {
+ listAll: true,
+ vpcid: args.context.vpc[0].id
+ };
+
+ // Only show selected tier, if viewing from detail view
+ if (args.context.networks &&
+ args.context.networks[0] &&
+ args.context.networks[0].vpcid) {
+ $.extend(data, {
+ id: args.context.networks[0].id
+ });
+ }
+
+ // Ajax Call to display the Tiers
+ $.ajax({
+ url: createURL('listNetworks'),
+ data: data,
+ success: function(json) {
+ var networks = json.listnetworksresponse.network;
+
+ args.response.success({
+ data: $(networks).map(function(index, network) {
+ return {
+ name: network.id,
+ description: network.name
+ };
+ })
+ });
+ }
+ });
+ }
+ },
'icmptype': { edit: true, label: 'ICMP.type', isDisabled: true },
'icmpcode': { edit: true, label: 'ICMP.code', isDisabled: true },
'traffictype' : {
@@ -89,16 +125,31 @@
add: {
label: 'Add',
action: function(args) {
+ var $multi = args.$multi;
+
$.ajax({
url: createURL('createNetworkACL'),
data: $.extend(args.data, {
- networkid: args.context.networks[0].id
+ networkid: args.data.networkid
}),
dataType: 'json',
success: function(data) {
args.response.success({
_custom: {
- jobId: data.createnetworkaclresponse.jobid
+ jobId: data.createnetworkaclresponse.jobid,
+ getUpdatedItem: function(json) {
+ var networkName = $multi.find('select[name=networkid] option[value=' + args.data.networkid + ']').html();
+ var data = $.extend(json.queryasyncjobresultresponse.jobresult.networkacl, {
+ networkid: networkName
+ });
+ var aclRules = $multi.data('acl-rules');
+
+ aclRules.push(data);
+ $multi.data('acl-rules', aclRules);
+ $(window).trigger('cloudStack.fullRefresh');
+
+ return data;
+ }
},
notification: {
label: 'Add ACL',
@@ -127,7 +178,10 @@
var jobID = data.deletenetworkaclresponse.jobid;
args.response.success({
_custom: {
- jobId: jobID
+ jobId: jobID,
+ getUpdatedItem: function() {
+ $(window).trigger('cloudStack.fullRefresh');
+ }
},
notification: {
label: 'Remove ACL',
@@ -143,23 +197,42 @@
}
},
dataProvider: function(args) {
- $.ajax({
- url: createURL('listNetworkACLs'),
- data: {
- listAll: true,
- networkid: args.context.networks[0].id
- },
- dataType: 'json',
- async: true,
- success: function(json) {
- args.response.success({
- data: json.listnetworkaclsresponse.networkacl
- });
- },
- error: function(XMLHttpResponse) {
- args.response.error(parseXMLHttpResponse(XMLHttpResponse));
- }
- });
+ var $multi = args.$multi;
+ var data = {
+ vpcid: args.context.vpc[0].id,
+ listAll: true
+ };
+
+ if (!$multi.data('acl-rules')) {
+ $multi.data('acl-rules', []);
+ }
+
+ if (args.context.networks &&
+ args.context.networks[0] &&
+ args.context.networks[0].vpcid) {
+ data.networkid = args.context.networks[0].id;
+
+ $.ajax({
+ url: createURL('listNetworkACLs'),
+ data: data,
+ dataType: 'json',
+ async: true,
+ success: function(json) {
+ args.response.success({
+ data: $(json.listnetworkaclsresponse.networkacl).map(function(index, acl) {
+ return $.extend(acl, {
+ networkid: args.context.networks[0].name
+ });
+ })
+ });
+ },
+ error: function(XMLHttpResponse) {
+ args.response.error(parseXMLHttpResponse(XMLHttpResponse));
+ }
+ });
+ } else {
+ args.response.success({ data: $multi.data('acl-rules') });
+ }
}
};
@@ -443,6 +516,54 @@
return cloudStack.sections.network.sections.ipAddresses;
}
},
+ acl: {
+ multiEdit: aclMultiEdit,
+
+ listView: {
+ listView: {
+ id: 'networks',
+ fields: {
+ tierName: { label: 'Tier' },
+ aclTotal: { label: 'ACL Total' }
+ },
+ dataProvider: function(args) {
+ $.ajax({
+ url: createURL('listNetworks'),
+ data: {
+ listAll: true,
+ vpcid: args.context.vpc[0].id
+ },
+ success: function(json) {
+ args.response.success({
+ data: $.map(json.listnetworksresponse.network, function(tier) {
+ var aclTotal = 0;
+
+ // Get ACL total
+ $.ajax({
+ url: createURL('listNetworkACLs'),
+ async: false,
+ data: {
+ listAll: true,
+ networkid: tier.id
+ },
+ success: function(json) {
+ aclTotal = json.listnetworkaclsresponse.networkacl ?
+ json.listnetworkaclsresponse.networkacl.length : 0;
+ }
+ });
+
+ return $.extend(tier, {
+ tierName: tier.name,
+ aclTotal: aclTotal
+ });
+ })
+ });
+ }
+ });
+ }
+ }
+ }
+ },
gateways: {
add: {
preCheck: function(args) {
@@ -1433,7 +1554,7 @@
isMaximized: true,
tabs: {
details: {
- title: 'label.tier.details',
+ title: 'Network Details',
preFilter: function(args) {
var hiddenFields = [];
var zone;
@@ -1575,6 +1696,22 @@
}
},
+ acl: {
+ title: 'Network ACL',
+ custom: function(args) {
+ // Widget renders ACL multi-edit, overriding this fn
+ return $('
');
+ }
+ },
+
+ ipAddresses: {
+ title: 'label.menu.ipaddresses',
+ custom: function(args) {
+ // Widget renders IP addresses, overriding this fn
+ return $('
');
+ }
+ },
+
addloadBalancer: {
title: 'label.add.load.balancer',
custom: function(args) {
@@ -1931,13 +2068,14 @@
poll: pollAsyncJobResult
}
},
-
- acl: {
+
+ // Removing ACL buttons from the tier chart
+ /* acl: {
label: 'Configure ACL for tier',
shortLabel: 'ACL',
- multiEdit: aclMultiEdit
- },
-
+ multiEdit: aclMultiEdit
+ }, */
+
remove: {
label: 'Remove tier',
action: function(args) {