|
21 | 21 | import java.util.Comparator; |
22 | 22 | import java.util.List; |
23 | 23 | import java.util.Map; |
| 24 | +import java.util.Objects; |
24 | 25 |
|
25 | 26 | import javax.inject.Inject; |
26 | 27 |
|
| 28 | +import com.cloud.dc.DataCenter; |
27 | 29 | import com.cloud.exception.PermissionDeniedException; |
| 30 | +import com.cloud.network.dao.NsxProviderDao; |
| 31 | +import com.cloud.network.element.NsxProviderVO; |
28 | 32 | import org.apache.cloudstack.api.ApiErrorCode; |
29 | 33 | import org.apache.cloudstack.api.ServerApiException; |
30 | 34 | import org.apache.cloudstack.api.command.user.network.CreateNetworkACLCmd; |
@@ -99,6 +103,10 @@ public class NetworkACLServiceImpl extends ManagerBase implements NetworkACLServ |
99 | 103 | private VpcDao _vpcDao; |
100 | 104 | @Inject |
101 | 105 | private VpcService _vpcSvc; |
| 106 | + @Inject |
| 107 | + private NsxProviderDao nsxProviderDao; |
| 108 | + @Inject |
| 109 | + private NetworkACLDao networkACLDao; |
102 | 110 |
|
103 | 111 | private String supportedProtocolsForAclRules = "tcp,udp,icmp,all"; |
104 | 112 |
|
@@ -338,6 +346,7 @@ public NetworkACLItem createNetworkACLItem(CreateNetworkACLCmd createNetworkACLC |
338 | 346 | if (isGlobalAcl(acl.getVpcId()) && !Account.Type.ADMIN.equals(caller.getType())) { |
339 | 347 | throw new PermissionDeniedException("Only Root Admins can create rules for a global ACL."); |
340 | 348 | } |
| 349 | + validateNsxConstraints(acl.getVpcId(), icmpType); |
341 | 350 | validateAclRuleNumber(createNetworkACLCmd, acl); |
342 | 351 |
|
343 | 352 | NetworkACLItem.Action ruleAction = validateAndCreateNetworkAclRuleAction(action); |
@@ -428,6 +437,18 @@ protected void validateNetworkAcl(NetworkACL acl) { |
428 | 437 | } |
429 | 438 | } |
430 | 439 |
|
| 440 | + private void validateNsxConstraints(Long vpcId, Integer icpmType) { |
| 441 | + VpcVO vpc = _vpcDao.findById(vpcId); |
| 442 | + final DataCenter dc = _entityMgr.findById(DataCenter.class, vpc.getZoneId()); |
| 443 | + final NsxProviderVO nsxProvider = nsxProviderDao.findByZoneId(dc.getId()); |
| 444 | + if (Objects.isNull(nsxProvider)) { |
| 445 | + return; |
| 446 | + } |
| 447 | + if (icpmType == -1) { |
| 448 | + throw new InvalidParameterValueException("Passing -1 for ICMP type is not supported for NSX enabled zones"); |
| 449 | + } |
| 450 | + } |
| 451 | + |
431 | 452 | /** |
432 | 453 | * This methods will simply return the ACL rule list ID if it has been provided by the parameter 'createNetworkACLCmd'. |
433 | 454 | * If no ACL rule List ID has been provided the method behave as follows: |
@@ -817,7 +838,7 @@ public NetworkACLItem updateNetworkACLItem(UpdateNetworkACLItemCmd updateNetwork |
817 | 838 |
|
818 | 839 | NetworkACL acl = _networkAclMgr.getNetworkACL(networkACLItemVo.getAclId()); |
819 | 840 | validateNetworkAcl(acl); |
820 | | - |
| 841 | + validateNsxConstraints(acl.getVpcId(), networkACLItemVo.getIcmpType()); |
821 | 842 | Account account = CallContext.current().getCallingAccount(); |
822 | 843 | validateGlobalAclPermissionAndAclAssociatedToVpc(acl, account, "Only Root Admins can update global ACLs."); |
823 | 844 |
|
|
0 commit comments