Merge branch 'nsx-integration' of https://github.com/apache/cloudstack into nsx-add-lb-rule

This commit is contained in:
Pearl Dsilva 2023-10-30 19:52:53 -04:00
commit 75342c7200
23 changed files with 138 additions and 44 deletions

View File

@ -1058,6 +1058,8 @@ public class ApiConstants {
public static final String SOURCE_NAT_IP_ID = "sourcenatipaddressid"; public static final String SOURCE_NAT_IP_ID = "sourcenatipaddressid";
public static final String HAS_RULES = "hasrules"; public static final String HAS_RULES = "hasrules";
public static final String NSX_DETAIL_KEY = "forNsx";
/** /**
* This enum specifies IO Drivers, each option controls specific policies on I/O. * This enum specifies IO Drivers, each option controls specific policies on I/O.
* Qemu guests support "threads" and "native" options Since 0.8.8 ; "io_uring" is supported Since 6.3.0 (QEMU 5.0). * Qemu guests support "threads" and "native" options Since 0.8.8 ; "io_uring" is supported Since 6.3.0 (QEMU 5.0).

View File

@ -23,6 +23,7 @@ import java.util.Iterator;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -235,7 +236,7 @@ public class CreateNetworkOfferingCmd extends BaseCmd {
} }
public List<String> getSupportedServices() { public List<String> getSupportedServices() {
if (!forNsx) { if (!isForNsx()) {
return supportedServices == null ? new ArrayList<String>() : supportedServices; return supportedServices == null ? new ArrayList<String>() : supportedServices;
} else { } else {
List<String> services = new ArrayList<>(List.of( List<String> services = new ArrayList<>(List.of(
@ -283,7 +284,7 @@ public class CreateNetworkOfferingCmd extends BaseCmd {
} }
public Boolean isForNsx() { public Boolean isForNsx() {
return forNsx; return !Objects.isNull(forNsx) && forNsx;
} }
public String getNsxMode() { public String getNsxMode() {

View File

@ -114,6 +114,9 @@ public class CreateVlanIpRangeCmd extends BaseCmd {
@Parameter(name = ApiConstants.FOR_SYSTEM_VMS, type = CommandType.BOOLEAN, description = "true if IP range is set to system vms, false if not") @Parameter(name = ApiConstants.FOR_SYSTEM_VMS, type = CommandType.BOOLEAN, description = "true if IP range is set to system vms, false if not")
private Boolean forSystemVms; private Boolean forSystemVms;
@Parameter(name = ApiConstants.FOR_NSX, type = CommandType.BOOLEAN, description = "true if the IP range is used for NSX resource", since = "4.20.0")
private boolean forNsx;
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
/////////////////// Accessors /////////////////////// /////////////////// Accessors ///////////////////////
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
@ -154,8 +157,12 @@ public class CreateVlanIpRangeCmd extends BaseCmd {
return startIp; return startIp;
} }
public boolean isForNsx() {
return forNsx;
}
public String getVlan() { public String getVlan() {
if (vlan == null || vlan.isEmpty()) { if ((vlan == null || vlan.isEmpty()) && !forNsx) {
vlan = "untagged"; vlan = "untagged";
} }
return vlan; return vlan;

View File

@ -145,10 +145,10 @@ public class CreateVPCOfferingCmd extends BaseAsyncCreateCmd {
} }
public List<String> getSupportedServices() { public List<String> getSupportedServices() {
if (!forNsx && CollectionUtils.isEmpty(supportedServices)) { if (!isForNsx() && CollectionUtils.isEmpty(supportedServices)) {
throw new InvalidParameterValueException("Supported services needs to be provided"); throw new InvalidParameterValueException("Supported services needs to be provided");
} }
if (forNsx) { if (isForNsx()) {
return List.of( return List.of(
Dhcp.getName(), Dhcp.getName(),
Dns.getName(), Dns.getName(),

View File

@ -123,6 +123,10 @@ public class VlanIpRangeResponse extends BaseResponse implements ControlledEntit
@Param(description = "indicates whether VLAN IP range is dedicated to system vms or not") @Param(description = "indicates whether VLAN IP range is dedicated to system vms or not")
private Boolean forSystemVms; private Boolean forSystemVms;
@SerializedName(ApiConstants.FOR_NSX)
@Param(description = "indicates whether IP range is dedicated to NSX resources or not")
private Boolean forNsx;
public void setId(String id) { public void setId(String id) {
this.id = id; this.id = id;
} }
@ -235,4 +239,8 @@ public class VlanIpRangeResponse extends BaseResponse implements ControlledEntit
public void setIp6Cidr(String ip6Cidr) { public void setIp6Cidr(String ip6Cidr) {
this.ip6Cidr = ip6Cidr; this.ip6Cidr = ip6Cidr;
} }
public void setForNsx(Boolean forNsx) {
this.forNsx = forNsx;
}
} }

View File

@ -228,7 +228,7 @@ public interface ConfigurationManager {
Boolean forTungsten, Boolean forNsx, String mode, List<Long> domainIds, List<Long> zoneIds, boolean enableOffering, final NetUtils.InternetProtocol internetProtocol); Boolean forTungsten, Boolean forNsx, String mode, List<Long> domainIds, List<Long> zoneIds, boolean enableOffering, final NetUtils.InternetProtocol internetProtocol);
Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, boolean forSystemVms, Long podId, String startIP, String endIP, Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, boolean forSystemVms, Long podId, String startIP, String endIP,
String vlanGateway, String vlanNetmask, String vlanId, boolean bypassVlanOverlapCheck, Domain domain, Account vlanOwner, String startIPv6, String endIPv6, String vlanIp6Gateway, String vlanIp6Cidr) String vlanGateway, String vlanNetmask, String vlanId, boolean bypassVlanOverlapCheck, Domain domain, Account vlanOwner, String startIPv6, String endIPv6, String vlanIp6Gateway, String vlanIp6Cidr, boolean forNsx)
throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException; throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException;
void createDefaultSystemNetworks(long zoneId) throws ConcurrentOperationException; void createDefaultSystemNetworks(long zoneId) throws ConcurrentOperationException;

View File

@ -273,4 +273,3 @@ public class NsxNetworkRule {
} }
} }
} }

View File

@ -37,6 +37,7 @@ import com.vmware.nsx_policy.model.ApiError;
import com.vmware.nsx_policy.model.DhcpRelayConfig; import com.vmware.nsx_policy.model.DhcpRelayConfig;
import com.vmware.nsx_policy.model.EnforcementPointListResult; import com.vmware.nsx_policy.model.EnforcementPointListResult;
import com.vmware.nsx_policy.model.L4PortSetServiceEntry; import com.vmware.nsx_policy.model.L4PortSetServiceEntry;
<<<<<<< HEAD
import com.vmware.nsx_policy.model.LBAppProfileListResult; import com.vmware.nsx_policy.model.LBAppProfileListResult;
import com.vmware.nsx_policy.model.LBPool; import com.vmware.nsx_policy.model.LBPool;
import com.vmware.nsx_policy.model.LBPoolListResult; import com.vmware.nsx_policy.model.LBPoolListResult;
@ -44,6 +45,8 @@ import com.vmware.nsx_policy.model.LBPoolMember;
import com.vmware.nsx_policy.model.LBService; import com.vmware.nsx_policy.model.LBService;
import com.vmware.nsx_policy.model.LBVirtualServer; import com.vmware.nsx_policy.model.LBVirtualServer;
import com.vmware.nsx_policy.model.LBVirtualServerListResult; import com.vmware.nsx_policy.model.LBVirtualServerListResult;
=======
>>>>>>> ce1659e8fcce61e0a6e7c75190af668f75172c87
import com.vmware.nsx_policy.model.LocaleServicesListResult; import com.vmware.nsx_policy.model.LocaleServicesListResult;
import com.vmware.nsx_policy.model.PolicyNatRule; import com.vmware.nsx_policy.model.PolicyNatRule;
import com.vmware.nsx_policy.model.Segment; import com.vmware.nsx_policy.model.Segment;
@ -69,6 +72,7 @@ import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import java.util.List; import java.util.List;
<<<<<<< HEAD
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
@ -82,6 +86,11 @@ import static org.apache.cloudstack.utils.NsxControllerUtils.getVirtualServerNam
import static org.apache.cloudstack.utils.NsxControllerUtils.getServiceEntryName; import static org.apache.cloudstack.utils.NsxControllerUtils.getServiceEntryName;
import static org.apache.cloudstack.utils.NsxControllerUtils.getLoadBalancerName; import static org.apache.cloudstack.utils.NsxControllerUtils.getLoadBalancerName;
import static org.apache.cloudstack.utils.NsxControllerUtils.getLoadBalancerAlgorithm; import static org.apache.cloudstack.utils.NsxControllerUtils.getLoadBalancerAlgorithm;
=======
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
>>>>>>> ce1659e8fcce61e0a6e7c75190af668f75172c87
public class NsxApiClient { public class NsxApiClient {
@ -119,6 +128,7 @@ public class NsxApiClient {
BYPASS BYPASS
} }
<<<<<<< HEAD
public enum LBAlgorithm { public enum LBAlgorithm {
ROUND_ROBIN, ROUND_ROBIN,
LEAST_CONNECTION, LEAST_CONNECTION,
@ -132,6 +142,8 @@ public class NsxApiClient {
XLARGE XLARGE
} }
=======
>>>>>>> ce1659e8fcce61e0a6e7c75190af668f75172c87
public enum RouteAdvertisementType { TIER1_STATIC_ROUTES, TIER1_CONNECTED, TIER1_NAT, public enum RouteAdvertisementType { TIER1_STATIC_ROUTES, TIER1_CONNECTED, TIER1_NAT,
TIER1_LB_VIP, TIER1_LB_SNAT, TIER1_DNS_FORWARDER_IP, TIER1_IPSEC_LOCAL_ENDPOINT TIER1_LB_VIP, TIER1_LB_SNAT, TIER1_DNS_FORWARDER_IP, TIER1_IPSEC_LOCAL_ENDPOINT
} }

View File

@ -105,10 +105,11 @@ import java.util.Set;
import java.util.function.LongFunction; import java.util.function.LongFunction;
@Component @Component
public class NsxElement extends AdapterBase implements DhcpServiceProvider, DnsServiceProvider, VpcProvider, public class NsxElement extends AdapterBase implements DhcpServiceProvider, DnsServiceProvider, VpcProvider,
StaticNatServiceProvider, IpDeployer, PortForwardingServiceProvider, StaticNatServiceProvider, IpDeployer, PortForwardingServiceProvider,
LoadBalancingServiceProvider, ResourceStateAdapter, Listener { LoadBalancingServiceProvider, ResourceStateAdapter, Listener {
@Inject @Inject
AccountManager accountMgr; AccountManager accountMgr;
@Inject @Inject

View File

@ -31,6 +31,7 @@ import java.util.HashSet;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -38,6 +39,8 @@ import java.util.stream.Collectors;
import javax.inject.Inject; import javax.inject.Inject;
import com.cloud.dc.VlanDetailsVO;
import com.cloud.dc.dao.VlanDetailsDao;
import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.acl.ControlledEntity;
import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.acl.ControlledEntity.ACLType;
import org.apache.cloudstack.affinity.AffinityGroup; import org.apache.cloudstack.affinity.AffinityGroup;
@ -467,6 +470,8 @@ public class ApiResponseHelper implements ResponseGenerator {
FirewallRulesDao firewallRulesDao; FirewallRulesDao firewallRulesDao;
@Inject @Inject
UserDataDao userDataDao; UserDataDao userDataDao;
@Inject
VlanDetailsDao vlanDetailsDao;
@Override @Override
public UserResponse createUserResponse(User user) { public UserResponse createUserResponse(User user) {
@ -937,6 +942,8 @@ public class ApiResponseHelper implements ResponseGenerator {
} }
} }
vlanResponse.setForSystemVms(isForSystemVms(vlan.getId())); vlanResponse.setForSystemVms(isForSystemVms(vlan.getId()));
VlanDetailsVO vlanDetail = vlanDetailsDao.findDetail(vlan.getId(), ApiConstants.NSX_DETAIL_KEY);
vlanResponse.setForNsx(Objects.nonNull(vlanDetail) && vlanDetail.getValue().equals("true"));
vlanResponse.setObjectName("vlan"); vlanResponse.setObjectName("vlan");
return vlanResponse; return vlanResponse;
} catch (InstantiationException | IllegalAccessException e) { } catch (InstantiationException | IllegalAccessException e) {

View File

@ -46,6 +46,8 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException; import javax.naming.ConfigurationException;
import com.cloud.dc.VlanDetailsVO;
import com.cloud.dc.dao.VlanDetailsDao;
import com.cloud.hypervisor.HypervisorGuru; import com.cloud.hypervisor.HypervisorGuru;
import com.cloud.network.dao.NsxProviderDao; import com.cloud.network.dao.NsxProviderDao;
import com.cloud.network.element.NsxProviderVO; import com.cloud.network.element.NsxProviderVO;
@ -348,6 +350,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@Inject @Inject
VlanDao _vlanDao; VlanDao _vlanDao;
@Inject @Inject
VlanDetailsDao vlanDetailsDao;
@Inject
IPAddressDao _publicIpAddressDao; IPAddressDao _publicIpAddressDao;
@Inject @Inject
DataCenterIpAddressDao _privateIpAddressDao; DataCenterIpAddressDao _privateIpAddressDao;
@ -4452,7 +4456,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
} else { } else {
network = _networkModel.getNetworkWithSecurityGroupEnabled(zoneId); network = _networkModel.getNetworkWithSecurityGroupEnabled(zoneId);
if (network == null) { if (network == null) {
throw new InvalidParameterValueException("Nework id is required for Direct vlan creation "); throw new InvalidParameterValueException("Network id is required for Direct vlan creation ");
} }
networkId = network.getId(); networkId = network.getId();
zoneId = network.getDataCenterId(); zoneId = network.getDataCenterId();
@ -4517,12 +4521,12 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
} }
return commitVlan(zoneId, podId, startIP, endIP, newVlanGateway, newVlanNetmask, vlanId, forVirtualNetwork, forSystemVms, networkId, physicalNetworkId, startIPv6, endIPv6, ip6Gateway, return commitVlan(zoneId, podId, startIP, endIP, newVlanGateway, newVlanNetmask, vlanId, forVirtualNetwork, forSystemVms, networkId, physicalNetworkId, startIPv6, endIPv6, ip6Gateway,
ip6Cidr, domain, vlanOwner, network, sameSubnet); ip6Cidr, domain, vlanOwner, network, sameSubnet, cmd.isForNsx());
} }
private Vlan commitVlan(final Long zoneId, final Long podId, final String startIP, final String endIP, final String newVlanGatewayFinal, final String newVlanNetmaskFinal, private Vlan commitVlan(final Long zoneId, final Long podId, final String startIP, final String endIP, final String newVlanGatewayFinal, final String newVlanNetmaskFinal,
final String vlanId, final Boolean forVirtualNetwork, final Boolean forSystemVms, final Long networkId, final Long physicalNetworkId, final String startIPv6, final String endIPv6, final String vlanId, final Boolean forVirtualNetwork, final Boolean forSystemVms, final Long networkId, final Long physicalNetworkId, final String startIPv6, final String endIPv6,
final String ip6Gateway, final String ip6Cidr, final Domain domain, final Account vlanOwner, final Network network, final Pair<Boolean, Pair<String, String>> sameSubnet) { final String ip6Gateway, final String ip6Cidr, final Domain domain, final Account vlanOwner, final Network network, final Pair<Boolean, Pair<String, String>> sameSubnet, boolean forNsx) {
final GlobalLock commitVlanLock = GlobalLock.getInternLock("CommitVlan"); final GlobalLock commitVlanLock = GlobalLock.getInternLock("CommitVlan");
commitVlanLock.lock(5); commitVlanLock.lock(5);
s_logger.debug("Acquiring lock for committing vlan"); s_logger.debug("Acquiring lock for committing vlan");
@ -4550,7 +4554,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
newVlanNetmask = sameSubnet.second().second(); newVlanNetmask = sameSubnet.second().second();
} }
final Vlan vlan = createVlanAndPublicIpRange(zoneId, networkId, physicalNetworkId, forVirtualNetwork, forSystemVms, podId, startIP, endIP, newVlanGateway, newVlanNetmask, vlanId, final Vlan vlan = createVlanAndPublicIpRange(zoneId, networkId, physicalNetworkId, forVirtualNetwork, forSystemVms, podId, startIP, endIP, newVlanGateway, newVlanNetmask, vlanId,
false, domain, vlanOwner, startIPv6, endIPv6, ip6Gateway, ip6Cidr); false, domain, vlanOwner, startIPv6, endIPv6, ip6Gateway, ip6Cidr, forNsx);
// create an entry in the nic_secondary table. This will be the new // create an entry in the nic_secondary table. This will be the new
// gateway that will be configured on the corresponding routervm. // gateway that will be configured on the corresponding routervm.
return vlan; return vlan;
@ -4674,7 +4678,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@Override @Override
@DB @DB
public Vlan createVlanAndPublicIpRange(final long zoneId, final long networkId, final long physicalNetworkId, final boolean forVirtualNetwork, final boolean forSystemVms, final Long podId, final String startIP, final String endIP, public Vlan createVlanAndPublicIpRange(final long zoneId, final long networkId, final long physicalNetworkId, final boolean forVirtualNetwork, final boolean forSystemVms, final Long podId, final String startIP, final String endIP,
final String vlanGateway, final String vlanNetmask, String vlanId, boolean bypassVlanOverlapCheck, Domain domain, final Account vlanOwner, final String startIPv6, final String endIPv6, final String vlanIp6Gateway, final String vlanIp6Cidr) { final String vlanGateway, final String vlanNetmask, String vlanId, boolean bypassVlanOverlapCheck, Domain domain, final Account vlanOwner, final String startIPv6, final String endIPv6, final String vlanIp6Gateway, final String vlanIp6Cidr, boolean forNsx) {
final Network network = _networkModel.getNetwork(networkId); final Network network = _networkModel.getNetwork(networkId);
boolean ipv4 = false, ipv6 = false; boolean ipv4 = false, ipv6 = false;
@ -4756,11 +4760,11 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
} else { } else {
vlanId = networkVlanId; vlanId = networkVlanId;
} }
} else if (network.getTrafficType() == TrafficType.Public && vlanId == null) { } else if (network.getTrafficType() == TrafficType.Public && vlanId == null && !forNsx) {
throw new InvalidParameterValueException("Unable to determine vlan id or untagged vlan for public network"); throw new InvalidParameterValueException("Unable to determine vlan id or untagged vlan for public network");
} }
if (vlanId == null) { if (vlanId == null && !forNsx) {
vlanId = Vlan.UNTAGGED; vlanId = Vlan.UNTAGGED;
} }
@ -4857,7 +4861,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
if (isSharedNetworkWithoutSpecifyVlan) { if (isSharedNetworkWithoutSpecifyVlan) {
bypassVlanOverlapCheck = true; bypassVlanOverlapCheck = true;
} }
if (!bypassVlanOverlapCheck && _zoneDao.findVnet(zoneId, physicalNetworkId, BroadcastDomainType.getValue(BroadcastDomainType.fromString(vlanId))).size() > 0) { if (!bypassVlanOverlapCheck && !forNsx && _zoneDao.findVnet(zoneId, physicalNetworkId, BroadcastDomainType.getValue(BroadcastDomainType.fromString(vlanId))).size() > 0) {
throw new InvalidParameterValueException("The VLAN tag " + vlanId + " is already being used for dynamic vlan allocation for the guest network in zone " throw new InvalidParameterValueException("The VLAN tag " + vlanId + " is already being used for dynamic vlan allocation for the guest network in zone "
+ zone.getName()); + zone.getName());
} }
@ -4873,7 +4877,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
// Everything was fine, so persist the VLAN // Everything was fine, so persist the VLAN
final VlanVO vlan = commitVlanAndIpRange(zoneId, networkId, physicalNetworkId, podId, startIP, endIP, vlanGateway, vlanNetmask, vlanId, domain, vlanOwner, vlanIp6Gateway, vlanIp6Cidr, final VlanVO vlan = commitVlanAndIpRange(zoneId, networkId, physicalNetworkId, podId, startIP, endIP, vlanGateway, vlanNetmask, vlanId, domain, vlanOwner, vlanIp6Gateway, vlanIp6Cidr,
ipv4, zone, vlanType, ipv6Range, ipRange, forSystemVms); ipv4, zone, vlanType, ipv6Range, ipRange, forSystemVms, forNsx);
return vlan; return vlan;
} }
@ -4895,9 +4899,11 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
continue; continue;
} }
// from here, subnet overlaps // from here, subnet overlaps
if (vlanId.toLowerCase().contains(Vlan.UNTAGGED) || UriUtils.checkVlanUriOverlap( VlanDetailsVO vlanDetail = vlanDetailsDao.findDetail(vlan.getId(), ApiConstants.NSX_DETAIL_KEY);
if ((Objects.isNull(vlanId) && Objects.nonNull(vlanDetail) && vlanDetail.getValue().equals("true")) || Objects.nonNull(vlanId) &&
(vlanId.toLowerCase().contains(Vlan.UNTAGGED) || UriUtils.checkVlanUriOverlap(
BroadcastDomainType.getValue(BroadcastDomainType.fromString(vlanId)), BroadcastDomainType.getValue(BroadcastDomainType.fromString(vlanId)),
BroadcastDomainType.getValue(BroadcastDomainType.fromString(vlan.getVlanTag())))) { BroadcastDomainType.getValue(BroadcastDomainType.fromString(vlan.getVlanTag()))))) {
// For untagged VLAN Id and overlapping URIs we need to expand and verify IP ranges // For untagged VLAN Id and overlapping URIs we need to expand and verify IP ranges
final String[] otherVlanIpRange = vlan.getIpRange().split("\\-"); final String[] otherVlanIpRange = vlan.getIpRange().split("\\-");
final String otherVlanStartIP = otherVlanIpRange[0]; final String otherVlanStartIP = otherVlanIpRange[0];
@ -4942,13 +4948,14 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
private VlanVO commitVlanAndIpRange(final long zoneId, final long networkId, final long physicalNetworkId, final Long podId, final String startIP, final String endIP, private VlanVO commitVlanAndIpRange(final long zoneId, final long networkId, final long physicalNetworkId, final Long podId, final String startIP, final String endIP,
final String vlanGateway, final String vlanNetmask, final String vlanId, final Domain domain, final Account vlanOwner, final String vlanIp6Gateway, final String vlanIp6Cidr, final String vlanGateway, final String vlanNetmask, final String vlanId, final Domain domain, final Account vlanOwner, final String vlanIp6Gateway, final String vlanIp6Cidr,
final boolean ipv4, final DataCenterVO zone, final VlanType vlanType, final String ipv6Range, final String ipRange, final boolean forSystemVms) { final boolean ipv4, final DataCenterVO zone, final VlanType vlanType, final String ipv6Range, final String ipRange, final boolean forSystemVms, final boolean forNsx) {
return Transaction.execute(new TransactionCallback<VlanVO>() { return Transaction.execute(new TransactionCallback<VlanVO>() {
@Override @Override
public VlanVO doInTransaction(final TransactionStatus status) { public VlanVO doInTransaction(final TransactionStatus status) {
VlanVO vlan = new VlanVO(vlanType, vlanId, vlanGateway, vlanNetmask, zone.getId(), ipRange, networkId, physicalNetworkId, vlanIp6Gateway, vlanIp6Cidr, ipv6Range); VlanVO vlan = new VlanVO(vlanType, vlanId, vlanGateway, vlanNetmask, zone.getId(), ipRange, networkId, physicalNetworkId, vlanIp6Gateway, vlanIp6Cidr, ipv6Range);
s_logger.debug("Saving vlan range " + vlan); s_logger.debug("Saving vlan range " + vlan);
vlan = _vlanDao.persist(vlan); vlan = _vlanDao.persist(vlan);
vlanDetailsDao.addDetail(vlan.getId(), ApiConstants.NSX_DETAIL_KEY, String.valueOf(forNsx), true);
// IPv6 use a used ip map, is different from ipv4, no need to save // IPv6 use a used ip map, is different from ipv4, no need to save
// public ip range // public ip range

View File

@ -2119,7 +2119,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C
if (createVlan && network != null) { if (createVlan && network != null) {
// Create vlan ip range // Create vlan ip range
_configMgr.createVlanAndPublicIpRange(pNtwk.getDataCenterId(), network.getId(), physicalNetworkId, false, false, null, startIP, endIP, gateway, netmask, vlanId, _configMgr.createVlanAndPublicIpRange(pNtwk.getDataCenterId(), network.getId(), physicalNetworkId, false, false, null, startIP, endIP, gateway, netmask, vlanId,
bypassVlanOverlapCheck, null, null, startIPv6, endIPv6, ip6Gateway, ip6Cidr); bypassVlanOverlapCheck, null, null, startIPv6, endIPv6, ip6Gateway, ip6Cidr, ntwkOff.isForNsx());
} }
if (associatedNetwork != null) { if (associatedNetwork != null) {
_networkDetailsDao.persist(new NetworkDetailVO(network.getId(), Network.AssociatedNetworkId, String.valueOf(associatedNetwork.getId()), true)); _networkDetailsDao.persist(new NetworkDetailVO(network.getId(), Network.AssociatedNetworkId, String.valueOf(associatedNetwork.getId()), true));

View File

@ -23,6 +23,7 @@ import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import javax.inject.Inject; import javax.inject.Inject;
@ -789,7 +790,10 @@ public class CommandSetupHelper {
// vlan1, then all ip addresses of vlan2, etc.. // vlan1, then all ip addresses of vlan2, etc..
final Map<String, ArrayList<PublicIpAddress>> vlanIpMap = new HashMap<String, ArrayList<PublicIpAddress>>(); final Map<String, ArrayList<PublicIpAddress>> vlanIpMap = new HashMap<String, ArrayList<PublicIpAddress>>();
for (final PublicIpAddress ipAddress : ips) { for (final PublicIpAddress ipAddress : ips) {
final String vlanTag = ipAddress.getVlanTag(); String vlanTag = ipAddress.getVlanTag();
if (Objects.isNull(vlanTag)) {
vlanTag = "nsx-"+ipAddress.getAddress().addr();
}
ArrayList<PublicIpAddress> ipList = vlanIpMap.get(vlanTag); ArrayList<PublicIpAddress> ipList = vlanIpMap.get(vlanTag);
if (ipList == null) { if (ipList == null) {
ipList = new ArrayList<PublicIpAddress>(); ipList = new ArrayList<PublicIpAddress>();
@ -840,10 +844,18 @@ public class CommandSetupHelper {
for (final PublicIpAddress ipAddr : ipAddrList) { for (final PublicIpAddress ipAddr : ipAddrList) {
final boolean add = ipAddr.getState() == IpAddress.State.Releasing ? false : true; final boolean add = ipAddr.getState() == IpAddress.State.Releasing ? false : true;
String vlanTag = ipAddr.getVlanTag();
String key = null;
if (Objects.isNull(vlanTag)) {
key = "nsx-" + ipAddr.getAddress().addr();
} else {
key = BroadcastDomainType.getValue(BroadcastDomainType.fromString(ipAddr.getVlanTag()));
}
final String macAddress = vlanMacAddress.get(BroadcastDomainType.getValue(BroadcastDomainType.fromString(ipAddr.getVlanTag()))); final String macAddress = vlanMacAddress.get(key);
final IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, ipAddr.isSourceNat(), BroadcastDomainType.fromString(ipAddr.getVlanTag()).toString(), ipAddr.getGateway(), final IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, ipAddr.isSourceNat(),
Objects.isNull(vlanTag) ? null : BroadcastDomainType.fromString(ipAddr.getVlanTag()).toString(), ipAddr.getGateway(),
ipAddr.getNetmask(), macAddress, networkRate, ipAddr.isOneToOneNat()); ipAddr.getNetmask(), macAddress, networkRate, ipAddr.isOneToOneNat());
setIpAddressNetworkParams(ip, network, router); setIpAddressNetworkParams(ip, network, router);
if (network.getPublicMtu() != null) { if (network.getPublicMtu() != null) {
@ -1047,6 +1059,9 @@ public class CommandSetupHelper {
} }
for (IPAddressVO ip : userIps) { for (IPAddressVO ip : userIps) {
String vlanTag = _vlanDao.findById(ip.getVlanId()).getVlanTag(); String vlanTag = _vlanDao.findById(ip.getVlanId()).getVlanTag();
if (Objects.isNull(vlanTag)) {
vlanTag = "nsx-" + ip.getAddress().addr();
}
Boolean lastIp = vlanLastIpMap.get(vlanTag); Boolean lastIp = vlanLastIpMap.get(vlanTag);
if (lastIp != null && !lastIp) { if (lastIp != null && !lastIp) {
continue; continue;

View File

@ -711,8 +711,8 @@ public class NetworkHelperImpl implements NetworkHelper {
defaultNic.setIsolationUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag())); defaultNic.setIsolationUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag()));
} else { } else {
defaultNic.setBroadcastType(BroadcastDomainType.Vlan); defaultNic.setBroadcastType(BroadcastDomainType.Vlan);
defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag())); defaultNic.setBroadcastUri(sourceNatIp.getVlanTag() != null ? BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag()) : null);
defaultNic.setIsolationUri(IsolationType.Vlan.toUri(sourceNatIp.getVlanTag())); defaultNic.setIsolationUri(sourceNatIp.getVlanTag() != null ? IsolationType.Vlan.toUri(sourceNatIp.getVlanTag()) : null);
} }
//If guest nic has already been added we will have 2 devices in the list. //If guest nic has already been added we will have 2 devices in the list.

View File

@ -22,6 +22,7 @@ import java.util.Arrays;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
@ -86,8 +87,11 @@ public class VpcNetworkHelperImpl extends NetworkHelperImpl {
final TreeSet<String> publicVlans = new TreeSet<String>(); final TreeSet<String> publicVlans = new TreeSet<String>();
if (vpcRouterDeploymentDefinition.isPublicNetwork()) { if (vpcRouterDeploymentDefinition.isPublicNetwork()) {
publicVlans.add(vpcRouterDeploymentDefinition.getSourceNatIP() String vlanTag = "";
.getVlanTag()); if (Objects.nonNull(vpcRouterDeploymentDefinition.getSourceNatIP().getVlanTag())) {
vlanTag = vpcRouterDeploymentDefinition.getSourceNatIP().getVlanTag();
}
publicVlans.add(vlanTag);
} }
//1) allocate nic for control and source nat public ip //1) allocate nic for control and source nat public ip

View File

@ -23,6 +23,7 @@ import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import javax.inject.Inject; import javax.inject.Inject;
import javax.naming.ConfigurationException; import javax.naming.ConfigurationException;
@ -351,7 +352,12 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
} else if (network.getTrafficType() == TrafficType.Public) { } else if (network.getTrafficType() == TrafficType.Public) {
final Pair<Nic, Network> publicNic = new Pair<Nic, Network>(routerNic, network); final Pair<Nic, Network> publicNic = new Pair<Nic, Network>(routerNic, network);
publicNics.add(publicNic); publicNics.add(publicNic);
final String vlanTag = BroadcastDomainType.getValue(routerNic.getBroadcastUri()); String vlanTag = null;
if (Objects.nonNull(routerNic.getBroadcastUri())) {
vlanTag = BroadcastDomainType.getValue(routerNic.getBroadcastUri());
} else {
vlanTag = "nsx-"+routerNic.getIPv4Address();
}
vlanMacAddress.put(vlanTag, routerNic.getMacAddress()); vlanMacAddress.put(vlanTag, routerNic.getMacAddress());
} }
} }

View File

@ -556,7 +556,7 @@ public class MockConfigurationManagerImpl extends ManagerBase implements Configu
*/ */
@Override @Override
public Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, boolean forSystemVms, Long podId, String startIP, String endIP, public Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, boolean forSystemVms, Long podId, String startIP, String endIP,
String vlanGateway, String vlanNetmask, String vlanId, boolean bypassVlanOverlapCheck, Domain domain, Account vlanOwner, String startIPv6, String endIPv6, String vlanGatewayv6, String vlanCidrv6) String vlanGateway, String vlanNetmask, String vlanId, boolean bypassVlanOverlapCheck, Domain domain, Account vlanOwner, String startIPv6, String endIPv6, String vlanGatewayv6, String vlanCidrv6, boolean forNsx)
throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException { throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return null; return null;

View File

@ -18,6 +18,7 @@
package org.apache.cloudstack.networkoffering; package org.apache.cloudstack.networkoffering;
import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.ConfigurationManager;
import com.cloud.dc.dao.VlanDetailsDao;
import com.cloud.event.dao.UsageEventDao; import com.cloud.event.dao.UsageEventDao;
import com.cloud.event.dao.UsageEventDetailsDao; import com.cloud.event.dao.UsageEventDetailsDao;
import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.InvalidParameterValueException;
@ -100,6 +101,8 @@ public class CreateNetworkOfferingTest extends TestCase {
@Inject @Inject
AnnotationDao annotationDao; AnnotationDao annotationDao;
@Inject
VlanDetailsDao vlanDetailsDao;
@Override @Override
@Before @Before

View File

@ -73,4 +73,5 @@
<bean id="configurationGroupDaoImpl" class="org.apache.cloudstack.framework.config.dao.ConfigurationGroupDaoImpl" /> <bean id="configurationGroupDaoImpl" class="org.apache.cloudstack.framework.config.dao.ConfigurationGroupDaoImpl" />
<bean id="configurationSubGroupDaoImpl" class="org.apache.cloudstack.framework.config.dao.ConfigurationSubGroupDaoImpl" /> <bean id="configurationSubGroupDaoImpl" class="org.apache.cloudstack.framework.config.dao.ConfigurationSubGroupDaoImpl" />
<bean id="nsxControllerDaoImpl" class="com.cloud.network.dao.NsxProviderDaoImpl" /> <bean id="nsxControllerDaoImpl" class="com.cloud.network.dao.NsxProviderDaoImpl" />
<bean id="vlanDetailsDao" class="com.cloud.dc.dao.VlanDetailsDaoImpl" />
</beans> </beans>

View File

@ -1980,7 +1980,9 @@
"label.systemvm": "System VM", "label.systemvm": "System VM",
"label.systemvmtype": "System VM type", "label.systemvmtype": "System VM type",
"label.tag": "Tag", "label.tag": "Tag",
"label.tag.nsx": "nsx",
"label.tag.key": "Tag key", "label.tag.key": "Tag key",
"label.tag.systemvm": "systemvm",
"label.tag.value": "Tag value", "label.tag.value": "Tag value",
"label.tagged": "Tagged", "label.tagged": "Tagged",
"label.tags": "Tags", "label.tags": "Tags",

View File

@ -31,9 +31,15 @@
:pagination="false" :pagination="false"
style="margin-bottom: 24px; width: 100%" > style="margin-bottom: 24px; width: 100%" >
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'gateway'">
<div> {{ record.gateway }}</div>
<div v-if="record.fornsx"> <a-tag color="processing"> {{ $t('label.tag.nsx') }} </a-tag> </div>
<div v-else-if="isNsxZone"> <a-tag color="processing"> {{ $t('label.tag.systemvm') }} </a-tag> </div>
</template>
<template v-if="column.key === 'actions'"> <template v-if="column.key === 'actions'">
<tooltip-button <tooltip-button
:tooltip="$t('label.delete')" :tooltip="$t('label.delete')"
:disabled="(record.fornsx && !forNsx) || (!record.fornsx && forNsx)"
type="primary" type="primary"
:danger="true" :danger="true"
icon="delete-outlined" icon="delete-outlined"
@ -70,6 +76,7 @@
<a-form-item name="vlan" ref="vlan"> <a-form-item name="vlan" ref="vlan">
<a-input <a-input
v-model:value="form.vlan" v-model:value="form.vlan"
:disabled="forNsx"
:placeholder="$t('label.vlan')" :placeholder="$t('label.vlan')"
/> />
</a-form-item> </a-form-item>
@ -160,6 +167,14 @@ export default {
isFixError: { isFixError: {
type: Boolean, type: Boolean,
default: false default: false
},
forNsx: {
type: Boolean,
default: false
},
isNsxZone: {
type: Boolean,
default: false
} }
}, },
data () { data () {
@ -170,6 +185,7 @@ export default {
ipRanges: [], ipRanges: [],
columns: [ columns: [
{ {
key: 'gateway',
title: this.$t('label.gateway'), title: this.$t('label.gateway'),
dataIndex: 'gateway', dataIndex: 'gateway',
width: 140 width: 140
@ -251,7 +267,9 @@ export default {
netmask: values.netmask, netmask: values.netmask,
vlan: values.vlan, vlan: values.vlan,
startIp: values.startIp, startIp: values.startIp,
endIp: values.endIp endIp: values.endIp,
fornsx: this.forNsx,
forsystemvms: this.isNsxZone && !this.forNsx
}) })
this.formRef.value.resetFields() this.formRef.value.resetFields()
}).catch(error => { }).catch(error => {

View File

@ -927,6 +927,8 @@ export default {
params.zoneId = this.stepData.zoneReturned.id params.zoneId = this.stepData.zoneReturned.id
if (publicVlanIpRange.vlan && publicVlanIpRange.vlan.length > 0) { if (publicVlanIpRange.vlan && publicVlanIpRange.vlan.length > 0) {
params.vlan = publicVlanIpRange.vlan params.vlan = publicVlanIpRange.vlan
} else if (publicVlanIpRange.fornsx) {
params.vlan = null
} else { } else {
params.vlan = 'untagged' params.vlan = 'untagged'
} }
@ -934,6 +936,8 @@ export default {
params.netmask = publicVlanIpRange.netmask params.netmask = publicVlanIpRange.netmask
params.startip = publicVlanIpRange.startIp params.startip = publicVlanIpRange.startIp
params.endip = publicVlanIpRange.endIp params.endip = publicVlanIpRange.endIp
params.fornsx = publicVlanIpRange.fornsx
params.forsystemvms = publicVlanIpRange.forsystemvms
if (this.isBasicZone) { if (this.isBasicZone) {
params.forVirtualNetwork = true params.forVirtualNetwork = true
@ -946,39 +950,29 @@ export default {
} }
try { try {
console.log('is nsx zone: ', this.stepData.isNsxZone)
console.log('value of this.stepData.stepMove.includes(createPublicVlanIpRange)', this.stepData.stepMove.includes('createPublicVlanIpRange' + index))
// for not add vlan ; next phase add the check: && this.stepData.isNsxZone
if (!this.stepData.stepMove.includes('createPublicVlanIpRange' + index)) { if (!this.stepData.stepMove.includes('createPublicVlanIpRange' + index)) {
const vlanIpRangeItem = await this.createVlanIpRange(params) const vlanIpRangeItem = await this.createVlanIpRange(params)
this.stepData.returnedPublicTraffic.push(vlanIpRangeItem) this.stepData.returnedPublicTraffic.push(vlanIpRangeItem)
console.log('create public vlan ip range')
this.stepData.stepMove.push('createPublicVlanIpRange' + index) this.stepData.stepMove.push('createPublicVlanIpRange' + index)
} }
} catch (e) { } catch (e) {
console.log('error')
this.messageError = e this.messageError = e
this.processStatus = STATUS_FAILED this.processStatus = STATUS_FAILED
this.setStepStatus(STATUS_FAILED) this.setStepStatus(STATUS_FAILED)
stopNow = true stopNow = true
} }
console.log('added public vlan range')
if (stopNow) { if (stopNow) {
console.log('stop now - break')
break break
} }
} }
if (stopNow) { if (stopNow) {
console.log('stop now - return')
return return
} }
if (this.stepData.isTungstenZone) { if (this.stepData.isTungstenZone) {
await this.stepCreateTungstenFabricPublicNetwork() await this.stepCreateTungstenFabricPublicNetwork()
} else if (this.stepData.isNsxZone) { } else if (this.stepData.isNsxZone) {
console.log('added nsx controller')
await this.stepAddNsxController() await this.stepAddNsxController()
} else { } else {
await this.stepConfigureStorageTraffic() await this.stepConfigureStorageTraffic()
@ -995,7 +989,6 @@ export default {
if (storageExists && storageExists.length > 0) { if (storageExists && storageExists.length > 0) {
await this.stepConfigureStorageTraffic() await this.stepConfigureStorageTraffic()
} else { } else {
console.log('conf guest traffic')
await this.stepConfigureGuestTraffic() await this.stepConfigureGuestTraffic()
} }
} }

View File

@ -51,7 +51,7 @@
:isFixError="isFixError" :isFixError="isFixError"
/> />
<ip-address-range-form <ip-address-range-form
v-if="steps && steps[currentStep].formKey === 'publicTraffic'" v-if="steps && ['publicTraffic', 'nsxPublicTraffic'].includes(steps[currentStep].formKey)"
@nextPressed="nextPressed" @nextPressed="nextPressed"
@backPressed="handleBack" @backPressed="handleBack"
@fieldsChanged="fieldsChanged" @fieldsChanged="fieldsChanged"
@ -60,6 +60,8 @@
:description="publicTrafficDescription[zoneType.toLowerCase()]" :description="publicTrafficDescription[zoneType.toLowerCase()]"
:prefillContent="prefillContent" :prefillContent="prefillContent"
:isFixError="isFixError" :isFixError="isFixError"
:forNsx="steps[currentStep].formKey === 'nsxPublicTraffic'"
:isNsxZone="isNsxZone"
/> />
<static-inputs-form <static-inputs-form
@ -242,6 +244,13 @@ export default {
formKey: 'publicTraffic', formKey: 'publicTraffic',
trafficType: 'public' trafficType: 'public'
}) })
if (this.isNsxZone) {
steps.push({
title: 'label.public.traffic.nsx',
formKey: 'nsxPublicTraffic',
trafficType: 'public'
})
}
steps.push({ steps.push({
title: 'label.pod', title: 'label.pod',
formKey: 'pod' formKey: 'pod'
@ -544,7 +553,6 @@ export default {
created () { created () {
this.physicalNetworks = this.prefillContent.physicalNetworks this.physicalNetworks = this.prefillContent.physicalNetworks
this.steps = this.filteredSteps() this.steps = this.filteredSteps()
console.log(this.isNsxZone)
this.currentStep = this.prefillContent?.networkStep || 0 this.currentStep = this.prefillContent?.networkStep || 0
if (this.stepChild && this.stepChild !== '') { if (this.stepChild && this.stepChild !== '') {
this.currentStep = this.steps.findIndex(item => item.formKey === this.stepChild) this.currentStep = this.steps.findIndex(item => item.formKey === this.stepChild)