add upgrade path and daos

\n add nsx controller command
This commit is contained in:
Pearl Dsilva 2023-08-16 14:34:53 -04:00
parent 94bdc33993
commit 0aafa68a66
22 changed files with 505 additions and 32 deletions

View File

@ -128,7 +128,8 @@ public class Networks {
},
UnDecided(null, null),
OpenDaylight("opendaylight", String.class),
TUNGSTEN("tf", String.class);
TUNGSTEN("tf", String.class),
NSX("nsx", String.class);
private final String scheme;
private final Class<?> type;
@ -342,6 +343,7 @@ public class Networks {
}
},
Vswitch("vs", String.class), Undecided(null, null), Vnet("vnet", Long.class);
// NSX("nsx", String.class);
private final String scheme;
private final Class<?> type;

View File

@ -0,0 +1,11 @@
package com.cloud.network;
import org.apache.cloudstack.api.Identity;
import org.apache.cloudstack.api.InternalIdentity;
public interface NsxProvider extends InternalIdentity, Identity {
String getHostname();
String getProviderName();
String getUsername();
long getZoneId();
}

View File

@ -91,6 +91,8 @@ public interface NetworkOffering extends InfrastructureEntity, InternalIdentity,
boolean isForTungsten();
boolean isForNsx();
TrafficType getTrafficType();
boolean isSpecifyVlan();

View File

@ -679,6 +679,10 @@ public class ApiConstants {
public static final String VSWITCH_TYPE_PUBLIC_TRAFFIC = "publicvswitchtype";
public static final String VSWITCH_NAME_GUEST_TRAFFIC = "guestvswitchname";
public static final String VSWITCH_NAME_PUBLIC_TRAFFIC = "publicvswitchname";
// NSX
public static final String EDGE_CLUSTER = "edgecluster";
public static final String TIER0_GATEWAY = "tier0gateway";
// Tungsten-Fabric
public static final String TUNGSTEN_VIRTUAL_ROUTER_UUID = "tungstenvirtualrouteruuid";
public static final String TUNGSTEN_PROVIDER_HOSTNAME = "tungstenproviderhostname";
@ -796,6 +800,7 @@ public class ApiConstants {
public static final String FORCE_ENCAP = "forceencap";
public static final String SPLIT_CONNECTIONS = "splitconnections";
public static final String FOR_VPC = "forvpc";
public static final String FOR_NSX = "fornsx";
public static final String FOR_TUNGSTEN = "fortungsten";
public static final String SHRINK_OK = "shrinkok";
public static final String NICIRA_NVP_DEVICE_ID = "nvpdeviceid";

View File

@ -99,6 +99,10 @@ public class NetworkOfferingResponse extends BaseResponseWithAnnotations {
@Param(description = "true if network offering can be used by VPC networks only")
private Boolean forVpc;
@SerializedName(ApiConstants.FOR_NSX)
@Param(description = "true if network offering can be used by NSX networks only")
private Boolean forNsx;
@SerializedName(ApiConstants.FOR_TUNGSTEN)
@Param(description = "true if network offering can be used by Tungsten-Fabric networks only")
private Boolean forTungsten;
@ -215,6 +219,10 @@ public class NetworkOfferingResponse extends BaseResponseWithAnnotations {
this.forVpc = forVpc;
}
public void setForNsx(Boolean forNsx) {
this.forNsx = forNsx;
}
public void setForTungsten(Boolean forTungsten) {
this.forTungsten = forTungsten;
}

View File

@ -0,0 +1,14 @@
package com.cloud.network.dao;
import com.cloud.network.element.NsxProviderVO;
import com.cloud.utils.db.GenericDao;
import java.util.List;
public interface NsxProviderDao extends GenericDao<NsxProviderVO, Long> {
NsxProviderVO findByZoneId(long zoneId);
NsxProviderVO findByUuid(String uuid);
List<NsxProviderVO> findAll();
}

View File

@ -0,0 +1,19 @@
package com.cloud.network.dao;
import com.cloud.network.element.NsxProviderVO;
import com.cloud.utils.db.GenericDaoBase;
import java.util.List;
public class NsxProviderDaoImpl extends GenericDaoBase<NsxProviderVO, Long>
implements NsxProviderDao {
@Override
public NsxProviderVO findByZoneId(long zoneId) {
return null;
}
@Override
public List<NsxProviderVO> findAll() {
return null;
}
}

View File

@ -0,0 +1,137 @@
package com.cloud.network.element;
import com.cloud.network.NsxProvider;
import com.cloud.utils.db.Encrypt;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.UUID;
@Entity
@Table(name = "nsx_providers")
public class NsxProviderVO implements NsxProvider {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
long id;
@Column(name = "zone_id")
private long zoneId;
@Column(name = "uuid")
private String uuid;
@Column(name = "provider_name")
private String providerName;
@Column(name = "hostname")
private String hostname;
@Column(name = "username")
private String username;
@Encrypt
@Column(name = "password")
private String password;
@Column(name = "tier0_gateway")
private String tier0Gateway;
@Column(name = "edge_cluster")
private String edgeCluster;
public NsxProviderVO( long zoneId,String providerName, String hostname, String username, String password, String tier0Gateway, String edgeCluster) {
this.zoneId = zoneId;
this.uuid = UUID.randomUUID().toString();
this.providerName = providerName;
this.hostname = hostname;
this.username = username;
this.password = password;
this.tier0Gateway = tier0Gateway;
this.edgeCluster = edgeCluster;
}
@Override
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Override
public long getZoneId() {
return zoneId;
}
public void setZoneId(long zoneId) {
this.zoneId = zoneId;
}
@Override
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
@Override
public String getProviderName() {
return providerName;
}
public void setProviderName(String providerName) {
this.providerName = providerName;
}
@Override
public String getHostname() {
return hostname;
}
public void setHostname(String hostname) {
this.hostname = hostname;
}
@Override
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTier0Gateway() {
return tier0Gateway;
}
public void setTier0Gateway(String tier0Gateway) {
this.tier0Gateway = tier0Gateway;
}
public String getEdgeCluster() {
return edgeCluster;
}
public void setEdgeCluster(String edgeCluster) {
this.edgeCluster = edgeCluster;
}
}

View File

@ -136,6 +136,9 @@ public class NetworkOfferingVO implements NetworkOffering {
@Column(name = "for_tungsten")
boolean forTungsten = false;
@Column(name = "for_nsx")
boolean forNsx = false;
@Column(name = "egress_default_policy")
boolean egressdefaultpolicy;
@ -195,6 +198,15 @@ public class NetworkOfferingVO implements NetworkOffering {
this.forTungsten = forTungsten;
}
@Override
public boolean isForNsx() {
return forNsx;
}
public void setForNsx(boolean forNsx) {
this.forNsx = forNsx;
}
@Override
public long getId() {
return id;

View File

@ -180,3 +180,15 @@ CREATE TABLE `cloud`.`vm_scheduled_job` (
-- Add support for different cluster types for kubernetes
ALTER TABLE `cloud`.`kubernetes_cluster` ADD COLUMN `cluster_type` varchar(64) DEFAULT 'CloudManaged' COMMENT 'type of cluster';
ALTER TABLE `cloud`.`kubernetes_cluster` MODIFY COLUMN `kubernetes_version_id` bigint unsigned NULL COMMENT 'the ID of the Kubernetes version of this Kubernetes cluster';
CREATE TABLE `cloud`.`nsx_providers` (
`id` bigint unsigned NOT NULL auto_increment COMMENT 'id',
`uuid` varchar(40),
`zone_id` bigint unsigned NOT NULL COMMENT 'Zone ID',
`provider_name` varchar(40),
`hostname` varchar(255) NOT NULL ,
`username` varchar(255) NOT NULL ,
`password` varchar(255) NOT NULL,
`tier0_gateway` varchar(255),
`edge_cluster` varchar(255)
)

View File

@ -29,4 +29,17 @@
<version>4.19.0.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>com.vmware</groupId>
<artifactId>nsx-java-sdk</artifactId>
<version>4.1.0.2.0</version>
</dependency>
<dependency>
<groupId>com.vmware</groupId>
<artifactId>nsx-gpm-java-sdk</artifactId>
<version>4.1.0.2.0</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,99 @@
package org.apache.cloudstack.api.command;
import com.cloud.network.NsxProvider;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.BaseCmd;
import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.response.NsxControllerResponse;
import org.apache.cloudstack.api.response.ZoneResponse;
import org.apache.cloudstack.service.NsxProviderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
@APICommand(name = AddNsxControllerCmd.APINAME, description = "Add NSX Controller to CloudStack",
responseObject = NsxControllerResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
public class AddNsxControllerCmd extends BaseCmd {
public static final String APINAME = "addNsxController";
public static final Logger LOGGER = LoggerFactory.getLogger(AddNsxControllerCmd.class.getName());
@Inject
NsxProviderService nsxProviderService;
@Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true,
description = "the ID of zone")
private Long zoneId;
@Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "NSX controller / provider name")
private String name;
@Parameter(name = ApiConstants.TUNGSTEN_PROVIDER_HOSTNAME, type = CommandType.STRING, required = true, description = "NSX controller hostname / IP address")
private String hostname;
@Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, required = true, description = "Username to log into NSX controller")
private String username;
@Parameter(name = ApiConstants.PASSWORD, type = CommandType.STRING, required = true, description = "Password to login into NSX controller")
private String password;
@Parameter(name = ApiConstants.TIER0_GATEWAY, type = CommandType.STRING, required = true, description = "Tier-0 Gateway address")
private String tier0Gateway;
@Parameter(name = ApiConstants.EDGE_CLUSTER, type = CommandType.STRING, required = true, description = "Edge Cluster name")
private String edgeCluster;
public NsxProviderService getNsxProviderService() {
return nsxProviderService;
}
public Long getZoneId() {
return zoneId;
}
public String getName() {
return name;
}
public String getHostname() {
return hostname;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getTier0Gateway() {
return tier0Gateway;
}
public String getEdgeCluster() {
return edgeCluster;
}
@Override
public void execute() throws ServerApiException {
NsxProvider nsxProvider = nsxProviderService.addProvider(this);
NsxControllerResponse nsxControllerResponse =
nsxProviderService.createNsxControllerResponse(
nsxProvider);
if (nsxControllerResponse == null)
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add NSX controller");
else {
nsxControllerResponse.setResponseName(getCommandName());
setResponseObject(nsxControllerResponse);
}
}
@Override
public long getEntityOwnerId() {
return 0;
}
}

View File

@ -0,0 +1,11 @@
package org.apache.cloudstack.api.response;
import com.cloud.network.NsxProvider;
import org.apache.cloudstack.api.BaseResponse;
import org.apache.cloudstack.api.EntityReference;
@EntityReference(value = {NsxProvider.class})
public class NsxControllerResponse extends BaseResponse {
}

View File

@ -133,36 +133,6 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, DnsS
return false;
}
@Override
public String getName() {
return null;
}
@Override
public void setName(String name) {
}
@Override
public void setConfigParams(Map<String, Object> params) {
}
@Override
public Map<String, Object> getConfigParams() {
return null;
}
@Override
public int getRunLevel() {
return 0;
}
@Override
public void setRunLevel(int level) {
}
@Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
return false;

View File

@ -0,0 +1,55 @@
package org.apache.cloudstack.service;
import com.cloud.dc.DataCenter;
import com.cloud.deploy.DeployDestination;
import com.cloud.network.Network;
import com.cloud.network.NetworkMigrationResponder;
import com.cloud.network.Networks;
import com.cloud.network.PhysicalNetwork;
import com.cloud.network.guru.GuestNetworkGuru;
import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
import com.cloud.vm.NicProfile;
import com.cloud.vm.ReservationContext;
import com.cloud.vm.VirtualMachineProfile;
import org.apache.log4j.Logger;
import javax.inject.Inject;
public class NsxGuestNetworkGuru extends GuestNetworkGuru implements NetworkMigrationResponder {
private static final Logger LOGGER = Logger.getLogger(NsxGuestNetworkGuru.class);
@Inject
NetworkOfferingServiceMapDao networkOfferingServiceMapDao;
private static final Networks.TrafficType[] TrafficTypes = {Networks.TrafficType.Guest};
public NsxGuestNetworkGuru() {
super();
_isolationMethods = new PhysicalNetwork.IsolationMethod[] {new PhysicalNetwork.IsolationMethod("NSX")};
}
@Override
public boolean prepareMigration(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) {
return false;
}
@Override
public void rollbackMigration(NicProfile nic, Network network, VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
}
@Override
public void commitMigration(NicProfile nic, Network network, VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
}
@Override
public boolean canHandle(NetworkOffering offering, DataCenter.NetworkType networkType,
PhysicalNetwork physicalNetwork) {
return networkType == DataCenter.NetworkType.Advanced && isMyTrafficType(offering.getTrafficType())
&& isMyIsolationMethod(physicalNetwork) && networkOfferingServiceMapDao.isProviderForNetworkOffering(
offering.getId(), Network.Provider.Tungsten);
}
}

View File

@ -0,0 +1,17 @@
package org.apache.cloudstack.service;
import com.cloud.network.NsxProvider;
import com.cloud.utils.component.PluggableService;
import org.apache.cloudstack.api.BaseResponse;
import org.apache.cloudstack.api.command.AddNsxControllerCmd;
import org.apache.cloudstack.api.response.NsxControllerResponse;
import java.util.List;
public interface NsxProviderService extends PluggableService {
NsxProvider addProvider(AddNsxControllerCmd cmd);
NsxControllerResponse createNsxControllerResponse(NsxProvider tungstenProvider);
List<BaseResponse> listTungstenProvider(Long zoneId);
}

View File

@ -0,0 +1,51 @@
package org.apache.cloudstack.service;
import com.cloud.host.DetailVO;
import com.cloud.network.NsxProvider;
import com.cloud.network.dao.NsxProviderDao;
import com.cloud.network.element.NsxProviderVO;
import com.cloud.network.element.TungstenProviderVO;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.db.TransactionCallback;
import com.cloud.utils.exception.CloudRuntimeException;
import org.apache.cloudstack.api.BaseResponse;
import org.apache.cloudstack.api.command.AddNsxControllerCmd;
import org.apache.cloudstack.api.response.NsxControllerResponse;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
import java.util.List;
public class NsxProviderServiceImpl implements NsxProviderService {
@Inject
NsxProviderDao nsxProviderDao;
@Override
public NsxProvider addProvider(AddNsxControllerCmd cmd) {
NsxProviderVO nsxProvider = Transaction.execute((TransactionCallback<NsxProviderVO>) status -> {
NsxProviderVO nsxProviderVO = new NsxProviderVO(cmd.getZoneId(), cmd.getName(), cmd.getHostname(),
cmd.getUsername(), cmd.getPassword(),
cmd.getTier0Gateway(), cmd.getEdgeCluster());
nsxProviderDao.persist(nsxProviderVO);
return nsxProviderVO;
});
return null;
}
@Override
public NsxControllerResponse createNsxControllerResponse(NsxProvider tungstenProvider) {
return null;
}
@Override
public List<BaseResponse> listTungstenProvider(Long zoneId) {
return null;
}
@Override
public List<Class<?>> getCommands() {
return null;
}
}

View File

@ -26,7 +26,10 @@
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="Nsx" class="org.apache.cloudstack.service.NsxElement">
<property name="name" value="NsxElement"/>
<property name="name" value="Nsx"/>
</bean>
<bean id="NsxGuestNetworkGuru" class="org.apache.cloudstack.service.NsxGuestNetworkGuru">
<property name="name" value="NsxGuestNetworkGuru" />
</bean>
</beans>

View File

@ -2314,6 +2314,7 @@ public class ApiResponseHelper implements ResponseGenerator {
}
response.setForVpc(_configMgr.isOfferingForVpc(offering));
response.setForTungsten(offering.isForTungsten());
response.setForNsx(offering.isForNsx());
response.setServices(serviceResponses);
//set network offering details
Map<Detail, String> details = _ntwkModel.getNtwkOffDetails(offering.getId());

View File

@ -157,6 +157,8 @@ public class NetworkOfferingJoinVO extends BaseViewVO implements NetworkOffering
@Column(name = "for_tungsten")
boolean forTungsten;
@Column(name = "for_nsx")
boolean forNsx;
@Column(name = "service_package_id")
private String servicePackageUuid = null;
@ -349,6 +351,15 @@ public class NetworkOfferingJoinVO extends BaseViewVO implements NetworkOffering
public void setForVpc(boolean forVpc) { this.forVpc = forVpc; }
@Override
public boolean isForNsx() {
return forNsx;
}
public void setForNsx(boolean forNsx) {
this.forNsx = forNsx;
}
public String getServicePackage() {
return servicePackageUuid;
}

View File

@ -999,6 +999,11 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
defaultTungstenSharedSGNetworkOfferingProviders.put(Service.Dns, Provider.Tungsten);
defaultTungstenSharedSGNetworkOfferingProviders.put(Service.SecurityGroup, Provider.Tungsten);
final Map<Network.Service, Network.Provider> defaultNSXNetworkOfferingProviders = new HashMap<>();
defaultNSXNetworkOfferingProviders.put(Service.Connectivity, Provider.Nsx);
defaultNSXNetworkOfferingProviders.put(Service.Dhcp, Provider.Nsx);
defaultNSXNetworkOfferingProviders.put(Service.Dns, Provider.Nsx);
final Map<Network.Service, Network.Provider> defaultIsolatedSourceNatEnabledNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Dhcp, Provider.VirtualRouter);
defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Dns, Provider.VirtualRouter);
@ -1200,6 +1205,20 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
}
_networkOfferingDao.persistDefaultL2NetworkOfferings();
// Offering #9 - network offering for nsx provider
NetworkOfferingVO defaultNSXNetworkOffering =
new NetworkOfferingVO(NetworkOffering.DEFAULT_NSX_OFFERING, "Offering for NSX enabled networks",
TrafficType.Guest, false, true, null, null, true, Availability.Optional, null, GuestType.Isolated, true, true, false, false, false, false);
defaultNSXNetworkOffering.setState(NetworkOffering.State.Enabled);
defaultNSXNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultTungstenSharedSGNetworkOffering);
for (Map.Entry<Network.Service, Network.Provider> service : defaultNSXNetworkOfferingProviders.entrySet()) {
NetworkOfferingServiceMapVO offService =
new NetworkOfferingServiceMapVO(defaultNSXNetworkOffering.getId(), service.getKey(), service.getValue());
_ntwkOfferingServiceMapDao.persist(offService);
s_logger.trace("Added service for the network offering: " + offService);
}
}
});
}

View File

@ -66,6 +66,7 @@
<a-select-option value="VSP"> VSP </a-select-option>
<a-select-option value="VCS"> VCS </a-select-option>
<a-select-option value="TF"> TF </a-select-option>
<a-select-option value="NSX"> NSX </a-select-option>
<template #suffixIcon>
<a-tooltip