diff --git a/ui/scripts/network.js b/ui/scripts/network.js
index dae4dfb23b5..a7482f81f40 100644
--- a/ui/scripts/network.js
+++ b/ui/scripts/network.js
@@ -3416,172 +3416,184 @@
},
egressRules: {
title: 'label.egress.rule',
- custom: cloudStack.uiCustom.securityRules({
- noSelect: true,
- noHeaderActionsColumn: true,
- fields: {
- 'protocol': {
- label: 'label.protocol',
- select: function(args) {
- args.$select.change(function() {
- var $inputs = args.$form.find('th, td');
- var $icmpFields = $inputs.filter(function() {
- var name = $(this).attr('rel');
+ custom: function(args) {
+ var context = args.context;
- return $.inArray(name, [
- 'icmptype',
- 'icmpcode'
- ]) > -1;
- });
- var $otherFields = $inputs.filter(function() {
- var name = $(this).attr('rel');
+ return $('
').multiEdit({
+ context: context,
+ noSelect: true,
+ noHeaderActionsColumn: true,
+ fields: {
+ 'cidrlist': { edit: true, label: 'label.cidr' },
+ 'protocol': {
+ label: 'label.protocol',
+ select: function(args) {
+ args.$select.change(function() {
+ var $inputs = args.$form.find('th, td');
+ var $icmpFields = $inputs.filter(function() {
+ var name = $(this).attr('rel');
- return name != 'icmptype' &&
- name != 'icmpcode' &&
- name != 'protocol' &&
- name != 'add-rule' &&
- name != 'cidr' &&
- name != 'accountname' &&
- name != 'securitygroup';
+ return $.inArray(name, [
+ 'icmptype',
+ 'icmpcode'
+ ]) > -1;
+ });
+ var $otherFields = $inputs.filter(function() {
+ var name = $(this).attr('rel');
+
+ return name != 'cidrlist' &&
+ name != 'icmptype' &&
+ name != 'icmpcode' &&
+ name != 'protocol' &&
+ name != 'add-rule';
+ });
+
+ if ($(this).val() == 'icmp') {
+ $icmpFields.show();
+ $otherFields.hide();
+ } else {
+ $icmpFields.hide();
+ $otherFields.show();
+ }
});
- if ($(this).val() == 'icmp') {
- $icmpFields.show();
- $otherFields.hide();
- } else {
- $icmpFields.hide();
- $otherFields.show();
+ args.response.success({
+ data: [
+ { name: 'tcp', description: 'TCP' },
+ { name: 'udp', description: 'UDP' },
+ { name: 'icmp', description: 'ICMP' }
+ ]
+ });
+ }
+ },
+ 'startport': { edit: true, label: 'label.start.port' },
+ 'endport': { edit: true, label: 'label.end.port' },
+ 'icmptype': { edit: true, label: 'ICMP.type', isHidden: true },
+ 'icmpcode': { edit: true, label: 'ICMP.code', isHidden: true },
+ 'add-rule': {
+ label: 'label.add',
+ addButton: true
+ }
+ },
+ add: {
+ label: 'label.add',
+ action: function(args) {
+ var data = {
+ protocol: args.data.protocol,
+ cidrlist: args.data.cidrlist,
+ trafficType: 'Egress'
+ };
+
+ if (args.data.icmptype && args.data.icmpcode) { // ICMP
+ $.extend(data, {
+ icmptype: args.data.icmptype,
+ icmpcode: args.data.icmpcode
+ });
+ } else { // TCP/UDP
+ $.extend(data, {
+ startport: args.data.startport,
+ endport: args.data.endport
+ });
+ }
+
+ // Get Source NAT IP
+ var sourceNATIP;
+
+ $.ajax({
+ url: createURL('listPublicIpAddresses'),
+ data: {
+ listAll: true,
+ associatednetworkid: args.context.networks[0].id
+ },
+ async: false,
+ success: function(json) {
+ var ipAddresses = json.listpublicipaddressesresponse.publicipaddress;
+
+ sourceNATIP = $.grep(ipAddresses, function(ipAddress) {
+ return ipAddress.issourcenat;
+ })[0];
}
});
- args.response.success({
- data: [
- { name: 'tcp', description: 'TCP' },
- { name: 'udp', description: 'UDP' },
- { name: 'icmp', description: 'ICMP' }
- ]
+ data.ipaddressid = sourceNATIP.id;
+
+ $.ajax({
+ url: createURL('createFirewallRule'),
+ data: data,
+ dataType: 'json',
+ async: true,
+ success: function(json) {
+ var jobId = json.createfirewallruleresponse.jobid;
+
+ args.response.success({
+ _custom: {
+ jobId: jobId
+ },
+ notification: {
+ label: 'label.add.egress.rule',
+ poll: pollAsyncJobResult
+ }
+ });
+ },
+ error: function(json) {
+ args.response.error(parseXMLHttpResponse(json));
+ }
});
}
},
- 'startport': { edit: true, label: 'label.start.port' },
- 'endport': { edit: true, label: 'label.end.port' },
- 'icmptype': { edit: true, label: 'ICMP.type', isHidden: true },
- 'icmpcode': { edit: true, label: 'ICMP.code', isHidden: true },
- 'cidr': { edit: true, label: 'label.cidr', isHidden: true },
- 'accountname': {
- edit: true,
- label: 'label.account.and.security.group',
- isHidden: true,
- range: ['accountname', 'securitygroup']
+ actions: {
+ destroy: {
+ label: 'label.remove.rule',
+ action: function(args) {
+ $.ajax({
+ url: createURL('deleteFirewallRule'),
+ data: {
+ id: args.context.multiRule[0].id
+ },
+ dataType: 'json',
+ async: true,
+ success: function(data) {
+ var jobID = data.deletefirewallruleresponse.jobid;
+
+ args.response.success({
+ _custom: {
+ jobId: jobID
+ },
+ notification: {
+ label: 'label.remove.egress.rule',
+ poll: pollAsyncJobResult
+ }
+ });
+ },
+ error: function(json) {
+ args.response.error(parseXMLHttpResponse(json));
+ }
+ });
+ }
+ }
},
- 'add-rule': {
- label: 'label.add',
- addButton: true
- }
- },
- add: {
- label: 'label.add',
- action: function(args) {
- var data = {
- securitygroupid: args.context.securityGroups[0].id,
- protocol: args.data.protocol,
- domainid: args.context.securityGroups[0].domainid,
- account: args.context.securityGroups[0].account
- };
-
- // TCP / ICMP
- if (args.data.icmptype && args.data.icmpcode) { // ICMP
- $.extend(data, {
- icmptype: args.data.icmptype,
- icmpcode: args.data.icmpcode
- });
- } else { // TCP
- $.extend(data, {
- startport: args.data.startport,
- endport: args.data.endport
- });
- }
-
- // CIDR / account
- if (args.data.cidr) {
- data.cidrlist = args.data.cidr;
- } else {
- data['usersecuritygrouplist[0].account'] = args.data.accountname;
- data['usersecuritygrouplist[0].group'] = args.data.securitygroup;
- }
-
+ ignoreEmptyFields: true,
+ dataProvider: function(args) {
$.ajax({
- url: createURL('authorizeSecurityGroupEgress'),
- data: data,
+ url: createURL('listFirewallRules'),
+ data: {
+ listAll: true,
+ networkid: args.context.networks[0].id,
+ trafficType: 'Egress'
+ },
dataType: 'json',
async: true,
- success: function(data) {
- var jobId = data.authorizesecuritygroupegressresponse.jobid;
-
+ success: function(json) {
+ var response = json.listfirewallrulesresponse.firewallrule;
+
args.response.success({
- _custom: {
- jobId: jobId
- },
- notification: {
- label: 'label.add.egress.rule',
- poll: pollAsyncJobResult
- }
+ data: response
});
}
});
}
- },
- actions: {
- destroy: {
- label: 'label.remove.rule',
- action: function(args) {
- $.ajax({
- url: createURL('revokeSecurityGroupEgress'),
- data: {
- domainid: args.context.securityGroups[0].domainid,
- account: args.context.securityGroups[0].account,
- id: args.context.multiRule[0].id
- },
- dataType: 'json',
- async: true,
- success: function(data) {
- var jobID = data.revokesecuritygroupegress.jobid;
-
- args.response.success({
- _custom: {
- jobId: jobID
- },
- notification: {
- label: 'label.remove.egress.rule',
- poll: pollAsyncJobResult
- }
- });
- }
- });
- }
- }
- },
- ignoreEmptyFields: true,
- dataProvider: function(args) {
- $.ajax({
- url: createURL('listSecurityGroups'),
- data: {
- id: args.context.securityGroups[0].id
- },
- dataType: 'json',
- async: true,
- success: function(data) {
- args.response.success({
- data: $.map(
- data.listsecuritygroupsresponse.securitygroup[0].egressrule ?
- data.listsecuritygroupsresponse.securitygroup[0].egressrule : [],
- ingressEgressDataMap
- )
- });
- }
- });
- }
- })
+ });
+ }
}
},