Skip to content

Commit b0603c1

Browse files
committed
Support ACLs for IPv6 addresses
* Support ACLs for IPv6 addresses * Allow list of source CIDRs * delete acls with list of cidrs * use enums
1 parent a7adaee commit b0603c1

File tree

1 file changed

+54
-34
lines changed

1 file changed

+54
-34
lines changed

plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java

Lines changed: 54 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.cloud.network.dao.PhysicalNetworkVO;
3535
import com.cloud.network.element.NetrisProviderVO;
3636
import com.cloud.network.netris.NetrisService;
37+
import com.cloud.network.rules.FirewallRule;
3738
import com.cloud.network.vpc.StaticRoute;
3839
import com.cloud.network.vpc.Vpc;
3940
import com.cloud.network.vpc.dao.VpcDao;
@@ -74,6 +75,8 @@
7475
import org.apache.logging.log4j.Logger;
7576

7677
import javax.inject.Inject;
78+
79+
import java.util.ArrayList;
7780
import java.util.List;
7881
import java.util.Locale;
7982
import java.util.Objects;
@@ -399,37 +402,46 @@ public boolean addFirewallRules(Network network, List<NetrisNetworkRule> firewal
399402
String networkName = network.getName();
400403
NetrisNetworkRule rule = firewallRules.get(0);
401404
SDNProviderNetworkRule baseNetworkRule = rule.getBaseRule();
402-
String trafficType = baseNetworkRule.getTrafficType().toUpperCase(Locale.ROOT);
405+
String trafficType = baseNetworkRule.getTrafficType();
403406
String sourcePrefix;
404407
String destinationPrefix;
405-
if ("INGRESS".equals(trafficType)) {
406-
sourcePrefix = baseNetworkRule.getSourceCidrList().get(0);
407-
destinationPrefix = network.getCidr();
408-
} else {
409-
sourcePrefix = network.getCidr();
410-
destinationPrefix = baseNetworkRule.getSourceCidrList().get(0);
411-
}
412-
String srcPort;
413-
String dstPort;
414-
if (baseNetworkRule.getPrivatePort().contains("-")) {
415-
srcPort = baseNetworkRule.getPrivatePort().split("-")[0];
416-
dstPort = baseNetworkRule.getPrivatePort().split("-")[1];
417-
} else {
418-
srcPort = dstPort = baseNetworkRule.getPrivatePort();
419-
}
420-
CreateOrUpdateNetrisACLCommand cmd = new CreateOrUpdateNetrisACLCommand(zoneId, accountId, domainId, networkName, networkId,
421-
vpcName, vpcId, Objects.nonNull(vpcId), rule.getAclAction().name().toLowerCase(Locale.ROOT), getPrefix(sourcePrefix), getPrefix(destinationPrefix),
422-
"null".equals(srcPort) ? 1 : Integer.parseInt(srcPort),
423-
"null".equals(dstPort) ? 65535 : Integer.parseInt(dstPort), baseNetworkRule.getProtocol());
424-
String aclName = String.format("V%s-N%s-ACL%s", vpcId, networkId, rule.getBaseRule().getRuleId());
425-
String netrisAclName = NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.ACL, aclName);
426-
cmd.setNetrisAclName(netrisAclName);
427-
cmd.setReason(rule.getReason());
428-
if ("ICMP".equals(baseNetworkRule.getProtocol())) {
429-
cmd.setIcmpType(baseNetworkRule.getIcmpType());
408+
boolean result = true;
409+
List<String> sourceCidrs = baseNetworkRule.getSourceCidrList();
410+
int index = 1;
411+
for (String sourceCidr : sourceCidrs) {
412+
if (FirewallRule.TrafficType.Ingress.name().equalsIgnoreCase(trafficType)) {
413+
sourcePrefix = sourceCidr;
414+
destinationPrefix = NetUtils.isValidIp4Cidr(sourcePrefix) ? network.getCidr() : network.getIp6Cidr();
415+
} else {
416+
destinationPrefix = sourceCidr;
417+
sourcePrefix = NetUtils.isValidIp4Cidr(destinationPrefix) ? network.getCidr() : network.getIp6Cidr();
418+
}
419+
String srcPort;
420+
String dstPort;
421+
if (baseNetworkRule.getPrivatePort().contains("-")) {
422+
srcPort = baseNetworkRule.getPrivatePort().split("-")[0];
423+
dstPort = baseNetworkRule.getPrivatePort().split("-")[1];
424+
} else {
425+
srcPort = dstPort = baseNetworkRule.getPrivatePort();
426+
}
427+
CreateOrUpdateNetrisACLCommand cmd = new CreateOrUpdateNetrisACLCommand(zoneId, accountId, domainId, networkName, networkId,
428+
vpcName, vpcId, Objects.nonNull(vpcId), rule.getAclAction().name().toLowerCase(Locale.ROOT), getPrefix(sourcePrefix), getPrefix(destinationPrefix),
429+
"null".equals(srcPort) ? 1 : Integer.parseInt(srcPort),
430+
"null".equals(dstPort) ? 65535 : Integer.parseInt(dstPort), baseNetworkRule.getProtocol());
431+
String aclName = String.format("V%s-N%s-ACL%s", vpcId, networkId, rule.getBaseRule().getRuleId());
432+
if (sourceCidrs.size() > 1) {
433+
aclName = aclName + "-" + index++;
434+
}
435+
String netrisAclName = NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.ACL, aclName);
436+
cmd.setNetrisAclName(netrisAclName);
437+
cmd.setReason(rule.getReason());
438+
if (NetUtils.ICMP_PROTO.equals(baseNetworkRule.getProtocol().toLowerCase(Locale.ROOT))) {
439+
cmd.setIcmpType(baseNetworkRule.getIcmpType());
440+
}
441+
NetrisAnswer answer = sendNetrisCommand(cmd, zoneId);
442+
result = result && answer.getResult();
430443
}
431-
NetrisAnswer answer = sendNetrisCommand(cmd, zoneId);
432-
return answer.getResult();
444+
return result;
433445
}
434446

435447
public static String getPrefix(String prefix) {
@@ -452,12 +464,20 @@ public boolean deleteFirewallRules(Network network, List<NetrisNetworkRule> fire
452464
vpcName = vpcDao.findById(vpcId).getName();
453465
}
454466
DeleteNetrisACLCommand cmd = new DeleteNetrisACLCommand(zoneId, accountId, domainId, networkName, networkId, Objects.nonNull(network.getVpcId()), vpcId, vpcName);
455-
List<String> aclRuleNames = firewallRules.stream()
456-
.map(rule -> {
457-
String aclName = String.format("V%s-N%s-ACL%s", vpcId, networkId, rule.getBaseRule().getRuleId());
458-
return NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.ACL, aclName);
459-
})
460-
.collect(Collectors.toList());
467+
List<String> aclRuleNames = new ArrayList<>();
468+
for (NetrisNetworkRule rule : firewallRules) {
469+
List<String> sourceCidrs = rule.getBaseRule().getSourceCidrList();
470+
int cidrCount = sourceCidrs.size();
471+
if (cidrCount > 1) {
472+
for (int i = 0; i < cidrCount; i++) {
473+
String aclName = String.format("V%s-N%s-ACL%s-%d", vpcId, networkId, rule.getBaseRule().getRuleId(), (i + 1));
474+
aclRuleNames.add(NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.ACL, aclName));
475+
}
476+
} else {
477+
String aclName = String.format("V%s-N%s-ACL%s", vpcId, networkId, rule.getBaseRule().getRuleId());
478+
aclRuleNames.add(NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.ACL, aclName));
479+
}
480+
}
461481
cmd.setAclRuleNames(aclRuleNames);
462482

463483
NetrisAnswer answer = sendNetrisCommand(cmd, zoneId);

0 commit comments

Comments
 (0)