VPC UI: New ACL flow

-Remove the ACL action from the tier chart item

-Adds an ACL overview list view under the VPC configure menu which
 displays each tier and their total # of ACLs.

-Add ACL edit to tier detail view

- (misc) Also add IP address tab to tier detail view
This commit is contained in:
Brian Federle 2012-08-10 12:58:17 -07:00
parent ccac505944
commit 42a9fd641e
4 changed files with 324 additions and 48 deletions

View File

@ -9698,6 +9698,43 @@ div.panel.ui-dialog div.list-view div.fixed-header {
max-width: 184px !important;
}
div.ui-dialog div.acl div.multi-edit table.multi-edit thead tr th,
div.ui-dialog div.acl div.multi-edit table.multi-edit tbody tr td {
min-width: 75px;
}
div.ui-dialog div.acl div.multi-edit div.data div.data-body div.data-item table tbody tr td {
width: 100%;
min-width: 77px;
}
.detail-view .acl .multi-edit {
}
.detail-view .acl .multi-edit th,
.detail-view .acl .multi-edit td {
padding-right: 0px !important;
min-width: 25px !important;
}
.detail-view .acl .multi-edit th {
font-size: 10px;
}
.detail-view .acl .multi-edit input {
width: 50px;
}
.detail-view .acl .multi-edit .add-vm {
width: 51px;
text-indent: 0px;
padding-right: 0px;
}
.detail-view .acl .multi-edit td.multi-actions {
width: 65px;
}
/*Autoscaler*/
.ui-dialog div.autoscaler {
overflow: auto;

View File

@ -16,21 +16,53 @@
// under the License.
(function($, cloudStack) {
var elems = {
aclDialog: function(args) {
var isDialog = args.isDialog;
var actionArgs = args.actionArgs;
var context = args.context;
var $acl = $('<div>').addClass('acl').multiEdit(
$.extend(true, {}, actionArgs.multiEdit, {
context: context
})
);
// Show ACL dialog
if (isDialog) {
$acl.dialog({
title: 'Configure ACL',
dialogClass: 'configure-acl',
width: 900,
height: 600,
buttons: {
'Done': function() {
$(':ui-dialog').remove();
$('.overlay').remove();
}
}
});
}
return $acl;
},
vpcConfigureTooltip: function(args) {
var context = args.context;
var $browser = args.$browser;
var $chart = args.$chart;
var ipAddresses = args.ipAddresses;
var acl = args.acl;
var gateways = args.gateways;
var siteToSiteVPN = args.siteToSiteVPN;
var links = {
'ip-addresses': 'IP Addresses',
'gateways': 'Private Gateway',
'site-to-site-vpn': 'Site-to-site VPN'
'site-to-site-vpn': 'Site-to-site VPN',
'network-acls': 'ACLs'
};
var $links = $('<ul>').addClass('links');
var $tooltip = $('<div>').addClass('vpc-configure-tooltip').append(
$('<div>').addClass('arrow')
);
var tierDetailView = args.tierDetailView;
// Make links
$.map(links, function(label, id) {
@ -43,6 +75,37 @@
// Link event
$link.click(function() {
switch (id) {
case 'network-acls':
$browser.cloudBrowser('addPanel', {
title: 'Network ACLs',
maximizeIfSelected: true,
complete: function($panel) {
$panel.listView(
$.extend(true, {}, acl.listView, {
listView: {
actions: {
add: {
label: 'Add network ACL',
action: {
custom: function() {
elems.aclDialog({
isDialog: true,
actionArgs: acl,
context: context
});
}
}
}
},
detailView: tierDetailView
}
}),
{ context: acl.context }
);
}
});
break;
case 'ip-addresses':
$browser.cloudBrowser('addPanel', {
title: 'IP Addresses',
@ -200,24 +263,30 @@
return $tooltip;
},
vpcConfigureArea: function(args) {
var context = args.context;
var $browser = args.$browser;
var $chart = args.$chart;
var ipAddresses = args.ipAddresses;
var acl = args.acl;
var gateways = args.gateways;
var siteToSiteVPN = args.siteToSiteVPN;
var $config = $('<div>').addClass('config-area');
var $configIcon = $('<span>').addClass('icon').html('&nbsp');
var tierDetailView = args.tierDetailView;
$config.append($configIcon);
// Tooltip event
$configIcon.mouseover(function() {
var $tooltip = elems.vpcConfigureTooltip({
context: context,
$browser: $browser,
$chart: $chart,
ipAddresses: ipAddresses,
gateways: gateways,
siteToSiteVPN: siteToSiteVPN
acl: acl,
siteToSiteVPN: siteToSiteVPN,
tierDetailView: tierDetailView
});
// Make sure tooltip is center aligned with icon
@ -240,6 +309,8 @@
return $router;
},
tier: function(args) {
var ipAddresses = args.ipAddresses;
var acl = args.acl;
var name = args.name;
var cidr = args.cidr;
var context = args.context;
@ -316,7 +387,7 @@
if (isPlaceholder) {
$tier.addClass('placeholder');
$title.html('Create Tier');
} else {
} else {
$title.html(
cloudStack.concat(name, 8)
);
@ -385,6 +456,7 @@
},
chart: function(args) {
var $browser = args.$browser;
var acl = args.acl;
var ipAddresses = args.ipAddresses;
var gateways = args.gateways;
var siteToSiteVPN = args.siteToSiteVPN;
@ -404,11 +476,14 @@
)
.append(
elems.vpcConfigureArea({
context: context,
$browser: $browser,
$chart: $chart,
ipAddresses: $.extend(ipAddresses, {context: context}),
gateways: $.extend(gateways, {context: context}),
siteToSiteVPN: $.extend(siteToSiteVPN, {context: context})
siteToSiteVPN: $.extend(siteToSiteVPN, {context: context}),
acl: $.extend(acl, {context: context}),
tierDetailView: tierDetailView
})
);
@ -418,9 +493,11 @@
}
addTierDialog({
ipAddresses: ipAddresses,
$browser: $browser,
tierDetailView: tierDetailView,
$tiers: $tiers,
acl: acl,
context: context,
actions: actions,
vmListView: vmListView,
@ -433,6 +510,8 @@
if (tiers != null && tiers.length > 0) {
$(tiers).map(function(index, tier) {
var $tier = elems.tier({
ipAddresses: ipAddresses,
acl: acl,
$browser: $browser,
detailView: tierDetailView,
name: tier.name,
@ -596,22 +675,10 @@
});
break;
case 'acl':
// Show ACL dialog
$('<div>').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 $('<div>').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,

View File

@ -893,6 +893,7 @@
context: context,
data: data,
itemData: itemData,
$multi: $multi,
response: {
success: function(successArgs) {
var notification = successArgs ? successArgs.notification : null;

View File

@ -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 $('<div>');
}
},
ipAddresses: {
title: 'label.menu.ipaddresses',
custom: function(args) {
// Widget renders IP addresses, overriding this fn
return $('<div>');
}
},
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) {