This is an automated email from the ASF dual-hosted git repository. pearl11594 pushed a commit to branch netris-tier-regression in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit f56b1b6f4fbd1ec4e50310fcb4905dd917a0209f Author: Pearl Dsilva <pearl1...@gmail.com> AuthorDate: Thu Jun 26 12:27:53 2025 -0400 Support ACLs for IPv6 addresses (#95) * Support ACLs for IPv6 addresses * Allow list of source CIDRs * delete acls with list of cidrs * use enums --- .../cloudstack/service/NetrisServiceImpl.java | 88 +++++++++++++--------- 1 file changed, 54 insertions(+), 34 deletions(-) diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java index e915730bd1a..b04e5de2145 100644 --- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java +++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java @@ -34,6 +34,7 @@ import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkVO; import com.cloud.network.element.NetrisProviderVO; import com.cloud.network.netris.NetrisService; +import com.cloud.network.rules.FirewallRule; import com.cloud.network.vpc.StaticRoute; import com.cloud.network.vpc.Vpc; import com.cloud.network.vpc.dao.VpcDao; @@ -74,6 +75,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.inject.Inject; + +import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Objects; @@ -399,37 +402,46 @@ public class NetrisServiceImpl implements NetrisService, Configurable { String networkName = network.getName(); NetrisNetworkRule rule = firewallRules.get(0); SDNProviderNetworkRule baseNetworkRule = rule.getBaseRule(); - String trafficType = baseNetworkRule.getTrafficType().toUpperCase(Locale.ROOT); + String trafficType = baseNetworkRule.getTrafficType(); String sourcePrefix; String destinationPrefix; - if ("INGRESS".equals(trafficType)) { - sourcePrefix = baseNetworkRule.getSourceCidrList().get(0); - destinationPrefix = network.getCidr(); - } else { - sourcePrefix = network.getCidr(); - destinationPrefix = baseNetworkRule.getSourceCidrList().get(0); - } - String srcPort; - String dstPort; - if (baseNetworkRule.getPrivatePort().contains("-")) { - srcPort = baseNetworkRule.getPrivatePort().split("-")[0]; - dstPort = baseNetworkRule.getPrivatePort().split("-")[1]; - } else { - srcPort = dstPort = baseNetworkRule.getPrivatePort(); - } - CreateOrUpdateNetrisACLCommand cmd = new CreateOrUpdateNetrisACLCommand(zoneId, accountId, domainId, networkName, networkId, - vpcName, vpcId, Objects.nonNull(vpcId), rule.getAclAction().name().toLowerCase(Locale.ROOT), getPrefix(sourcePrefix), getPrefix(destinationPrefix), - "null".equals(srcPort) ? 1 : Integer.parseInt(srcPort), - "null".equals(dstPort) ? 65535 : Integer.parseInt(dstPort), baseNetworkRule.getProtocol()); - String aclName = String.format("V%s-N%s-ACL%s", vpcId, networkId, rule.getBaseRule().getRuleId()); - String netrisAclName = NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.ACL, aclName); - cmd.setNetrisAclName(netrisAclName); - cmd.setReason(rule.getReason()); - if ("ICMP".equals(baseNetworkRule.getProtocol())) { - cmd.setIcmpType(baseNetworkRule.getIcmpType()); + boolean result = true; + List<String> sourceCidrs = baseNetworkRule.getSourceCidrList(); + int index = 1; + for (String sourceCidr : sourceCidrs) { + if (FirewallRule.TrafficType.Ingress.name().equalsIgnoreCase(trafficType)) { + sourcePrefix = sourceCidr; + destinationPrefix = NetUtils.isValidIp4Cidr(sourcePrefix) ? network.getCidr() : network.getIp6Cidr(); + } else { + destinationPrefix = sourceCidr; + sourcePrefix = NetUtils.isValidIp4Cidr(destinationPrefix) ? network.getCidr() : network.getIp6Cidr(); + } + String srcPort; + String dstPort; + if (baseNetworkRule.getPrivatePort().contains("-")) { + srcPort = baseNetworkRule.getPrivatePort().split("-")[0]; + dstPort = baseNetworkRule.getPrivatePort().split("-")[1]; + } else { + srcPort = dstPort = baseNetworkRule.getPrivatePort(); + } + CreateOrUpdateNetrisACLCommand cmd = new CreateOrUpdateNetrisACLCommand(zoneId, accountId, domainId, networkName, networkId, + vpcName, vpcId, Objects.nonNull(vpcId), rule.getAclAction().name().toLowerCase(Locale.ROOT), getPrefix(sourcePrefix), getPrefix(destinationPrefix), + "null".equals(srcPort) ? 1 : Integer.parseInt(srcPort), + "null".equals(dstPort) ? 65535 : Integer.parseInt(dstPort), baseNetworkRule.getProtocol()); + String aclName = String.format("V%s-N%s-ACL%s", vpcId, networkId, rule.getBaseRule().getRuleId()); + if (sourceCidrs.size() > 1) { + aclName = aclName + "-" + index++; + } + String netrisAclName = NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.ACL, aclName); + cmd.setNetrisAclName(netrisAclName); + cmd.setReason(rule.getReason()); + if (NetUtils.ICMP_PROTO.equals(baseNetworkRule.getProtocol().toLowerCase(Locale.ROOT))) { + cmd.setIcmpType(baseNetworkRule.getIcmpType()); + } + NetrisAnswer answer = sendNetrisCommand(cmd, zoneId); + result = result && answer.getResult(); } - NetrisAnswer answer = sendNetrisCommand(cmd, zoneId); - return answer.getResult(); + return result; } public static String getPrefix(String prefix) { @@ -452,12 +464,20 @@ public class NetrisServiceImpl implements NetrisService, Configurable { vpcName = vpcDao.findById(vpcId).getName(); } DeleteNetrisACLCommand cmd = new DeleteNetrisACLCommand(zoneId, accountId, domainId, networkName, networkId, Objects.nonNull(network.getVpcId()), vpcId, vpcName); - List<String> aclRuleNames = firewallRules.stream() - .map(rule -> { - String aclName = String.format("V%s-N%s-ACL%s", vpcId, networkId, rule.getBaseRule().getRuleId()); - return NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.ACL, aclName); - }) - .collect(Collectors.toList()); + List<String> aclRuleNames = new ArrayList<>(); + for (NetrisNetworkRule rule : firewallRules) { + List<String> sourceCidrs = rule.getBaseRule().getSourceCidrList(); + int cidrCount = sourceCidrs.size(); + if (cidrCount > 1) { + for (int i = 0; i < cidrCount; i++) { + String aclName = String.format("V%s-N%s-ACL%s-%d", vpcId, networkId, rule.getBaseRule().getRuleId(), (i + 1)); + aclRuleNames.add(NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.ACL, aclName)); + } + } else { + String aclName = String.format("V%s-N%s-ACL%s", vpcId, networkId, rule.getBaseRule().getRuleId()); + aclRuleNames.add(NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, NetrisResourceObjectUtils.NetrisObjectType.ACL, aclName)); + } + } cmd.setAclRuleNames(aclRuleNames); NetrisAnswer answer = sendNetrisCommand(cmd, zoneId);