diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxOpObject.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxOpObject.java new file mode 100644 index 00000000000..57ca02e45d2 --- /dev/null +++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxOpObject.java @@ -0,0 +1,113 @@ +package org.apache.cloudstack.resource; + +import com.cloud.network.dao.NetworkVO; +import com.cloud.network.vpc.VpcVO; + +import java.util.Objects; + +public class NsxOpObject { + VpcVO vpcVO; + NetworkVO networkVO; + long accountId; + long domainId; + long zoneId; + + public VpcVO getVpcVO() { + return vpcVO; + } + + public void setVpcVO(VpcVO vpcVO) { + this.vpcVO = vpcVO; + } + + public NetworkVO getNetworkVO() { + return networkVO; + } + + public void setNetworkVO(NetworkVO networkVO) { + this.networkVO = networkVO; + } + + public long getAccountId() { + return accountId; + } + + public void setAccountId(long accountId) { + this.accountId = accountId; + } + + public long getDomainId() { + return domainId; + } + + public void setDomainId(long domainId) { + this.domainId = domainId; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(long zoneId) { + this.zoneId = zoneId; + } + + public String getNetworkResourceName() { + return Objects.nonNull(vpcVO) ? vpcVO.getName() : networkVO.getName(); + } + + public boolean isVpcResource() { + return Objects.nonNull(vpcVO); + } + + public long getNetworkResourceId() { + return Objects.nonNull(vpcVO) ? vpcVO.getId() : networkVO.getId(); + } + + public static final class Builder { + VpcVO vpcVO; + NetworkVO networkVO; + long accountId; + long domainId; + long zoneId; + + public Builder() { + // Default constructor + } + + public Builder vpcVO(VpcVO vpcVO) { + this.vpcVO = vpcVO; + return this; + } + + public Builder networkVO(NetworkVO networkVO) { + this.networkVO = networkVO; + return this; + } + + public Builder domainId(long domainId) { + this.domainId = domainId; + return this; + } + + public Builder accountId(long accountId) { + this.accountId = accountId; + return this; + } + + public Builder zoneId(long zoneId) { + this.zoneId = zoneId; + return this; + } + + public NsxOpObject build() { + NsxOpObject object = new NsxOpObject(); + object.setVpcVO(this.vpcVO); + object.setNetworkVO(this.networkVO); + object.setDomainId(this.domainId); + object.setAccountId(this.accountId); + object.setZoneId(this.zoneId); + return object; + } + } +} diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java index 901e26e145e..01af992019f 100644 --- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java +++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java @@ -92,6 +92,7 @@ import net.sf.ehcache.config.InvalidConfigurationException; import org.apache.cloudstack.StartupNsxCommand; import org.apache.cloudstack.resource.NsxLoadBalancerMember; import org.apache.cloudstack.resource.NsxNetworkRule; +import org.apache.cloudstack.resource.NsxOpObject; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -510,26 +511,18 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, Dns if (vm == null || networkModel.getNicInNetwork(vm.getId(), network.getId()) == null) { continue; } - Pair vpcOrNetwork = getVpcOrNetwork(network.getVpcId(), network.getId()); - VpcVO vpc = vpcOrNetwork.first(); - NetworkVO networkVO = vpcOrNetwork.second(); - Long networkResourceId = Objects.nonNull(vpc) ? vpc.getId() : networkVO.getId(); - String networkResourceName = Objects.nonNull(vpc) ? vpc.getName() : networkVO.getName(); - boolean isVpcResource = Objects.nonNull(vpc); - long domainId = Objects.nonNull(vpc) ? vpc.getDomainId() : networkVO.getDomainId(); - long accountId = Objects.nonNull(vpc) ? vpc.getAccountId() : networkVO.getAccountId(); - long zoneId = Objects.nonNull(vpc) ? vpc.getZoneId() : networkVO.getDataCenterId(); + NsxOpObject nsxObject = getNsxOpObject(network); String publicPort = getPublicPortRange(rule); String privatePort = getPrivatePFPortRange(rule); NsxNetworkRule networkRule = new NsxNetworkRule.Builder() - .setDomainId(domainId) - .setAccountId(accountId) - .setZoneId(zoneId) - .setNetworkResourceId(networkResourceId) - .setNetworkResourceName(networkResourceName) - .setVpcResource(isVpcResource) + .setDomainId(nsxObject.getDomainId()) + .setAccountId(nsxObject.getAccountId()) + .setZoneId(nsxObject.getZoneId()) + .setNetworkResourceId(nsxObject.getNetworkResourceId()) + .setNetworkResourceName(nsxObject.getNetworkResourceName()) + .setVpcResource(nsxObject.isVpcResource()) .setVmId(vm.getId()) .setVmIp(vm.getPrivateIpAddress()) .setPublicIp(publicIp.getAddress().addr()) @@ -588,6 +581,35 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, Dns String.valueOf(rule.getSourcePortStart()).concat("-").concat(String.valueOf(rule.getSourcePortEnd())); } + private long getResourceId(String resource, VpcVO vpc, NetworkVO network) { + switch (resource) { + case "domain": + return Objects.nonNull(vpc) ? vpc.getDomainId() : network.getDomainId(); + case "account": + return Objects.nonNull(vpc) ? vpc.getAccountId() : network.getAccountId(); + case "zone": + return Objects.nonNull(vpc) ? vpc.getZoneId() : network.getDataCenterId(); + } + return 0; + } + + private NsxOpObject getNsxOpObject(Network network) { + Pair vpcOrNetwork = getVpcOrNetwork(network.getVpcId(), network.getId()); + VpcVO vpc = vpcOrNetwork.first(); + NetworkVO networkVO = vpcOrNetwork.second(); + long domainId = getResourceId("domain", vpc, networkVO); + long accountId = getResourceId("account", vpc, networkVO); + long zoneId = getResourceId("zone", vpc, networkVO); + + return new NsxOpObject.Builder() + .vpcVO(vpc) + .networkVO(networkVO) + .domainId(domainId) + .accountId(accountId) + .zoneId(zoneId) + .build(); + } + @Override public boolean applyLBRules(Network network, List rules) throws ResourceUnavailableException { for (LoadBalancingRule loadBalancingRule : rules) { @@ -596,24 +618,16 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, Dns } IPAddressVO publicIp = ipAddressDao.findByIpAndDcId(network.getDataCenterId(), loadBalancingRule.getSourceIp().addr()); + NsxOpObject nsxObject = getNsxOpObject(network); - Pair vpcOrNetwork = getVpcOrNetwork(network.getVpcId(), network.getId()); - VpcVO vpc = vpcOrNetwork.first(); - NetworkVO networkVO = vpcOrNetwork.second(); - Long networkResourceId = Objects.nonNull(vpc) ? vpc.getId() : networkVO.getId(); - String networkResourceName = Objects.nonNull(vpc) ? vpc.getName() : networkVO.getName(); - boolean isVpcResource = Objects.nonNull(vpc); - long domainId = Objects.nonNull(vpc) ? vpc.getDomainId() : networkVO.getDomainId(); - long accountId = Objects.nonNull(vpc) ? vpc.getAccountId() : networkVO.getAccountId(); - long zoneId = Objects.nonNull(vpc) ? vpc.getZoneId() : networkVO.getDataCenterId(); List lbMembers = getLoadBalancerMembers(loadBalancingRule); NsxNetworkRule networkRule = new NsxNetworkRule.Builder() - .setDomainId(domainId) - .setAccountId(accountId) - .setZoneId(zoneId) - .setNetworkResourceId(networkResourceId) - .setNetworkResourceName(networkResourceName) - .setVpcResource(isVpcResource) + .setDomainId(nsxObject.getDomainId()) + .setAccountId(nsxObject.getAccountId()) + .setZoneId(nsxObject.getZoneId()) + .setNetworkResourceId(nsxObject.getNetworkResourceId()) + .setNetworkResourceName(nsxObject.getNetworkResourceName()) + .setVpcResource(nsxObject.isVpcResource()) .setMemberList(lbMembers) .setPublicIp(publicIp.getAddress().addr()) .setPublicPort(String.valueOf(loadBalancingRule.getSourcePortStart()))