mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
CLOUDSTACK-2319: fix "unable to add egress rules" in SecurityGroup
Signed-off-by: Chip Childers <chip.childers@gmail.com>
This commit is contained in:
parent
599023b61b
commit
af5bf94b43
@ -31,6 +31,8 @@ public interface SecurityGroupRules extends InternalIdentity {
|
|||||||
|
|
||||||
Long getRuleId();
|
Long getRuleId();
|
||||||
|
|
||||||
|
String getRuleUuid();
|
||||||
|
|
||||||
int getStartPort();
|
int getStartPort();
|
||||||
|
|
||||||
int getEndPort();
|
int getEndPort();
|
||||||
|
|||||||
@ -54,6 +54,9 @@ public class SecurityGroupRulesVO implements SecurityGroupRules {
|
|||||||
@Column(name = "id", table = "security_group_rule", insertable = false, updatable = false)
|
@Column(name = "id", table = "security_group_rule", insertable = false, updatable = false)
|
||||||
private Long ruleId;
|
private Long ruleId;
|
||||||
|
|
||||||
|
@Column(name = "uuid", table = "security_group_rule", insertable = false, updatable = false)
|
||||||
|
private String ruleUuid;
|
||||||
|
|
||||||
@Column(name = "start_port", table = "security_group_rule", insertable = false, updatable = false)
|
@Column(name = "start_port", table = "security_group_rule", insertable = false, updatable = false)
|
||||||
private int startPort;
|
private int startPort;
|
||||||
|
|
||||||
@ -75,7 +78,11 @@ public class SecurityGroupRulesVO implements SecurityGroupRules {
|
|||||||
public SecurityGroupRulesVO() {
|
public SecurityGroupRulesVO() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public SecurityGroupRulesVO(long id, String name, String description, Long domainId, Long accountId, Long ruleId, int startPort, int endPort, String protocol, Long allowedNetworkId,
|
public SecurityGroupRulesVO(long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SecurityGroupRulesVO(long id, String name, String description, Long domainId, Long accountId, Long ruleId, String ruleUuid, int startPort, int endPort, String protocol, Long allowedNetworkId,
|
||||||
String allowedSourceIpCidr) {
|
String allowedSourceIpCidr) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
@ -83,6 +90,7 @@ public class SecurityGroupRulesVO implements SecurityGroupRules {
|
|||||||
this.domainId = domainId;
|
this.domainId = domainId;
|
||||||
this.accountId = accountId;
|
this.accountId = accountId;
|
||||||
this.ruleId = ruleId;
|
this.ruleId = ruleId;
|
||||||
|
this.ruleUuid = ruleUuid;
|
||||||
this.startPort = startPort;
|
this.startPort = startPort;
|
||||||
this.endPort = endPort;
|
this.endPort = endPort;
|
||||||
this.protocol = protocol;
|
this.protocol = protocol;
|
||||||
@ -120,6 +128,11 @@ public class SecurityGroupRulesVO implements SecurityGroupRules {
|
|||||||
return ruleId;
|
return ruleId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRuleUuid() {
|
||||||
|
return ruleUuid;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getStartPort() {
|
public int getStartPort() {
|
||||||
return startPort;
|
return startPort;
|
||||||
|
|||||||
@ -84,4 +84,13 @@ public class SecurityGroupRulesDaoImpl extends GenericDaoBase<SecurityGroupRules
|
|||||||
sc.setParameters("groupId", groupId);
|
sc.setParameters("groupId", groupId);
|
||||||
return listBy(sc, searchFilter);
|
return listBy(sc, searchFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SecurityGroupRulesVO findByUuidIncludingRemoved(final String uuid) {
|
||||||
|
SearchCriteria<SecurityGroupRulesVO> sc = createSearchCriteria();
|
||||||
|
sc.addAnd("ruleUuid", SearchCriteria.Op.EQ, uuid);
|
||||||
|
SecurityGroupRulesVO rule = findOneIncludingRemovedBy(sc);
|
||||||
|
SecurityGroupRulesVO newRule = new SecurityGroupRulesVO(rule.getRuleId());
|
||||||
|
return newRule;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3981,13 +3981,12 @@
|
|||||||
account: args.context.securityGroups[0].account
|
account: args.context.securityGroups[0].account
|
||||||
};
|
};
|
||||||
|
|
||||||
// TCP / ICMP
|
|
||||||
if (args.data.icmptype && args.data.icmpcode) { // ICMP
|
if (args.data.icmptype && args.data.icmpcode) { // ICMP
|
||||||
$.extend(data, {
|
$.extend(data, {
|
||||||
icmptype: args.data.icmptype,
|
icmptype: args.data.icmptype,
|
||||||
icmpcode: args.data.icmpcode
|
icmpcode: args.data.icmpcode
|
||||||
});
|
});
|
||||||
} else { // TCP
|
} else { // TCP/UDP
|
||||||
$.extend(data, {
|
$.extend(data, {
|
||||||
startport: args.data.startport,
|
startport: args.data.startport,
|
||||||
endport: args.data.endport
|
endport: args.data.endport
|
||||||
@ -4081,121 +4080,142 @@
|
|||||||
|
|
||||||
egressRules: {
|
egressRules: {
|
||||||
title: 'label.egress.rule',
|
title: 'label.egress.rule',
|
||||||
custom: function(args) {
|
custom: cloudStack.uiCustom.securityRules({
|
||||||
var context = args.context;
|
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');
|
||||||
|
|
||||||
return $('<div>').multiEdit({
|
return $.inArray(name, [
|
||||||
context: context,
|
'icmptype',
|
||||||
noSelect: true,
|
'icmpcode'
|
||||||
noHeaderActionsColumn: true,
|
]) > -1;
|
||||||
fields: {
|
});
|
||||||
'cidrlist': { edit: true, label: 'label.cidr' },
|
var $otherFields = $inputs.filter(function() {
|
||||||
'protocol': {
|
var name = $(this).attr('rel');
|
||||||
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 $.inArray(name, [
|
return name != 'icmptype' &&
|
||||||
'icmptype',
|
name != 'icmpcode' &&
|
||||||
'icmpcode'
|
name != 'protocol' &&
|
||||||
]) > -1;
|
name != 'add-rule' &&
|
||||||
});
|
name != 'cidr' &&
|
||||||
var $otherFields = $inputs.filter(function() {
|
name != 'accountname' &&
|
||||||
var name = $(this).attr('rel');
|
name != 'securitygroup';
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
args.response.success({
|
if ($(this).val() == 'icmp') {
|
||||||
data: [
|
$icmpFields.show();
|
||||||
{ name: 'tcp', description: 'TCP' },
|
$otherFields.hide();
|
||||||
{ name: 'udp', description: 'UDP' },
|
} else {
|
||||||
{ name: 'icmp', description: 'ICMP' }
|
$icmpFields.hide();
|
||||||
]
|
$otherFields.show();
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'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];
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
data.ipaddressid = sourceNATIP.id;
|
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 },
|
||||||
|
'cidr': { edit: true, label: 'label.cidr', isHidden: true },
|
||||||
|
'accountname': {
|
||||||
|
edit: true,
|
||||||
|
label: 'label.account.and.security.group',
|
||||||
|
isHidden: true,
|
||||||
|
range: ['accountname', 'securitygroup']
|
||||||
|
},
|
||||||
|
'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
|
||||||
|
};
|
||||||
|
|
||||||
|
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
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: createURL('authorizeSecurityGroupEgress'),
|
||||||
|
data: data,
|
||||||
|
dataType: 'json',
|
||||||
|
async: true,
|
||||||
|
success: function(data) {
|
||||||
|
var jobId = data.authorizesecuritygroupegressresponse.jobid;
|
||||||
|
|
||||||
|
args.response.success({
|
||||||
|
_custom: {
|
||||||
|
jobId: jobId
|
||||||
|
},
|
||||||
|
notification: {
|
||||||
|
label: 'label.add.egress.rule',
|
||||||
|
poll: pollAsyncJobResult
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
destroy: {
|
||||||
|
label: 'label.remove.rule',
|
||||||
|
action: function(args) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: createURL('createFirewallRule'),
|
url: createURL('revokeSecurityGroupEgress'),
|
||||||
data: data,
|
data: {
|
||||||
|
domainid: args.context.securityGroups[0].domainid,
|
||||||
|
account: args.context.securityGroups[0].account,
|
||||||
|
id: args.context.multiRule[0].id
|
||||||
|
},
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
async: true,
|
async: true,
|
||||||
success: function(json) {
|
success: function(data) {
|
||||||
var jobId = json.createfirewallruleresponse.jobid;
|
var jobID = data.revokesecuritygroupegress.jobid;
|
||||||
|
|
||||||
args.response.success({
|
args.response.success({
|
||||||
_custom: {
|
_custom: {
|
||||||
jobId: jobId
|
jobId: jobID
|
||||||
},
|
},
|
||||||
notification: {
|
notification: {
|
||||||
label: 'label.add.egress.rule',
|
label: 'label.remove.egress.rule',
|
||||||
poll: pollAsyncJobResult
|
poll: pollAsyncJobResult
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -4205,60 +4225,29 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ignoreEmptyFields: true,
|
|
||||||
dataProvider: function(args) {
|
|
||||||
$.ajax({
|
|
||||||
url: createURL('listFirewallRules'),
|
|
||||||
data: {
|
|
||||||
listAll: true,
|
|
||||||
networkid: args.context.networks[0].id,
|
|
||||||
trafficType: 'Egress'
|
|
||||||
},
|
|
||||||
dataType: 'json',
|
|
||||||
async: true,
|
|
||||||
success: function(json) {
|
|
||||||
var response = json.listfirewallrulesresponse.firewallrule;
|
|
||||||
|
|
||||||
args.response.success({
|
|
||||||
data: response
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
}
|
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
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user