Add support for Gateway service for Netris VPC and network offerings (#39)

* Add support for Gateway service for Netris VPC and network offerings

* Restore UserData service

* add gateway only to vpc service

* Add support for gateway service for external network providers for networks in routed mode

* add support for gateway svc

* Revert "add support for gateway svc"

This reverts commit 06645cd1c6d08a81ede5d1431497ea3f2efdc5dc.

* Fix VPC offering creation

* Fix VR public NIC after Gateway service is set to Netris

---------

Co-authored-by: nvazquez <nicovazquez90@gmail.com>
This commit is contained in:
Pearl Dsilva 2024-12-26 08:33:41 -05:00 committed by GitHub
parent 8659d9691b
commit 610fd911d6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 37 additions and 13 deletions

View File

@ -37,7 +37,7 @@ public interface VpcProvisioningService {
VpcOffering createVpcOffering(String name, String displayText, List<String> supportedServices,
Map<String, List<String>> serviceProviders,
Map serviceCapabilitystList, NetUtils.InternetProtocol internetProtocol,
Long serviceOfferingId, Boolean forNsx, NetworkOffering.NetworkMode networkMode,
Long serviceOfferingId, String externalProvider, NetworkOffering.NetworkMode networkMode,
List<Long> domainIds, List<Long> zoneIds, VpcOffering.State state,
NetworkOffering.RoutingMode routingMode, boolean specifyAsNumber);

View File

@ -394,8 +394,7 @@ public class CreateNetworkOfferingCmd extends BaseCmd {
private void getServiceProviderMapForExternalProvider(Map<String, List<String>> serviceProviderMap, String provider) {
String routerProvider = Boolean.TRUE.equals(getForVpc()) ? VirtualRouterProvider.Type.VPCVirtualRouter.name() :
VirtualRouterProvider.Type.VirtualRouter.name();
List<String> unsupportedServices = new ArrayList<>(List.of("Vpn", "SecurityGroup", "Connectivity",
"Gateway", "BaremetalPxeService"));
List<String> unsupportedServices = new ArrayList<>(List.of("Vpn", "Gateway", "SecurityGroup", "Connectivity", "BaremetalPxeService"));
List<String> routerSupported = List.of("Dhcp", "Dns", "UserData");
List<String> allServices = Service.listAllServices().stream().map(Service::getName).collect(Collectors.toList());
if (routerProvider.equals(VirtualRouterProvider.Type.VPCVirtualRouter.name())) {

View File

@ -60,6 +60,7 @@ import static com.cloud.network.Network.Service.SourceNat;
import static com.cloud.network.Network.Service.PortForwarding;
import static com.cloud.network.Network.Service.NetworkACL;
import static com.cloud.network.Network.Service.UserData;
import static com.cloud.network.Network.Service.Gateway;
@APICommand(name = "createVPCOffering", description = "Creates VPC offering", responseObject = VpcOfferingResponse.class,
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
@ -190,6 +191,9 @@ public class CreateVPCOfferingCmd extends BaseAsyncCreateCmd {
SourceNat.getName(),
PortForwarding.getName()));
}
if (NetworkOffering.NetworkMode.ROUTED.name().equalsIgnoreCase(getNetworkMode())) {
supportedServices.add(Gateway.getName());
}
if (getNsxSupportsLbService()) {
supportedServices.add(Lb.getName());
}
@ -239,8 +243,10 @@ public class CreateVPCOfferingCmd extends BaseAsyncCreateCmd {
}
private void getServiceProviderMapForExternalProvider(Map<String, List<String>> serviceProviderMap, String provider) {
List<String> unsupportedServices = List.of("Vpn", "BaremetalPxeService", "SecurityGroup", "Connectivity",
"Gateway", "Firewall");
List<String> unsupportedServices = Arrays.asList("Vpn", "BaremetalPxeService", "SecurityGroup", "Connectivity", "Firewall");
if (NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMode())) {
unsupportedServices.add("Gateway");
}
List<String> routerSupported = List.of("Dhcp", "Dns", "UserData");
List<String> allServices = Network.Service.listAllServices().stream().map(Network.Service::getName).collect(Collectors.toList());
for (String service : allServices) {
@ -249,7 +255,7 @@ public class CreateVPCOfferingCmd extends BaseAsyncCreateCmd {
if (routerSupported.contains(service))
serviceProviderMap.put(service, List.of(VirtualRouterProvider.Type.VPCVirtualRouter.name()));
else if (NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMode()) ||
Stream.of(NetworkACL.getName()).anyMatch(s -> s.equalsIgnoreCase(service))) {
Stream.of(NetworkACL.getName(), Gateway.getName()).anyMatch(s -> s.equalsIgnoreCase(service))) {
serviceProviderMap.put(service, List.of(provider));
}
}

View File

@ -293,7 +293,7 @@ public class ContrailManagerImpl extends ManagerBase implements ContrailManager
}
serviceProviderMap.put(svc, providerSet);
}
vpcOffer = _vpcProvSvc.createVpcOffering(juniperVPCOfferingName, juniperVPCOfferingDisplayText, services, serviceProviderMap, null, null, null, false, null, null, null, VpcOffering.State.Enabled, null, false);
vpcOffer = _vpcProvSvc.createVpcOffering(juniperVPCOfferingName, juniperVPCOfferingDisplayText, services, serviceProviderMap, null, null, null, null, null, null, null, VpcOffering.State.Enabled, null, false);
long id = vpcOffer.getId();
_vpcOffDao.update(id, (VpcOfferingVO)vpcOffer);
return _vpcOffDao.findById(id);

View File

@ -171,6 +171,7 @@ public class NetrisElement extends AdapterBase implements DhcpServiceProvider, D
Map<Network.Capability, String> sourceNatCapabilities = new HashMap<>();
sourceNatCapabilities.put(Network.Capability.RedundantRouter, "true");
sourceNatCapabilities.put(Network.Capability.SupportedSourceNatTypes, "peraccount");
capabilities.put(Network.Service.Gateway, null);
capabilities.put(Network.Service.SourceNat, sourceNatCapabilities);
return capabilities;
}

View File

@ -196,8 +196,9 @@ public class NetrisGuestNetworkGuru extends GuestNetworkGuru implements Network
dcId);
}
implemented.setBroadcastUri(Networks.BroadcastDomainType.Netris.toUri(vnet));
Long networkId = implemented.getId() > 0 ? implemented.getId() : network.getId();
ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), network.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VXLAN_ASSIGN,
"Assigned Zone vNet: " + vnet + " Network Id: " + implemented.getId(), implemented.getId(), ApiCommandResourceType.Network.toString(), 0);
"Assigned Zone vNet: " + vnet + " Network Id: " + networkId, networkId, ApiCommandResourceType.Network.toString(), 0);
} else {
implemented.setBroadcastUri(network.getBroadcastUri());
}

View File

@ -6741,6 +6741,9 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
} else {
serviceProviderMap.put(Service.Gateway, Sets.newHashSet(Provider.VirtualRouter));
}
} else {
Set<Provider> providers = serviceProviderMap.get(Service.NetworkACL);
serviceProviderMap.put(Service.Gateway, Sets.newHashSet(providers.iterator().next()));
}
}
}

View File

@ -32,6 +32,7 @@ import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
@ -5084,11 +5085,14 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C
// validate Services
boolean addGatewayService = false;
boolean isRoutedMode = enabledServices.stream().noneMatch(svc -> svc.equalsIgnoreCase(Service.SourceNat.getName()));
for (String serviceName : enabledServices) {
Network.Service service = Network.Service.getService(serviceName);
if (service == null || service == Service.Gateway) {
throw new InvalidParameterValueException("Invalid Network Service specified=" + serviceName);
} else if (service == Service.SourceNat) {
} else if (service == Service.SourceNat ||
(isRoutedMode && Arrays.asList(Provider.Nsx.getName().toLowerCase(Locale.ROOT),
Provider.Netris.getName().toLowerCase(Locale.ROOT)).contains(providerName.toLowerCase(Locale.ROOT)))) {
addGatewayService = true;
}

View File

@ -605,7 +605,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
}
return createVpcOffering(vpcOfferingName, displayText, supportedServices,
serviceProviderList, serviceCapabilityList, internetProtocol, serviceOfferingId, forNsx, networkMode,
serviceProviderList, serviceCapabilityList, internetProtocol, serviceOfferingId, provider, networkMode,
domainIds, zoneIds, (enable ? State.Enabled : State.Disabled), routingMode, specifyAsNumber);
}
@ -613,7 +613,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
@ActionEvent(eventType = EventTypes.EVENT_VPC_OFFERING_CREATE, eventDescription = "creating vpc offering", create = true)
public VpcOffering createVpcOffering(final String name, final String displayText, final List<String> supportedServices, final Map<String, List<String>> serviceProviders,
final Map serviceCapabilityList, final NetUtils.InternetProtocol internetProtocol, final Long serviceOfferingId,
final Boolean forNsx, final NetworkOffering.NetworkMode networkMode, List<Long> domainIds, List<Long> zoneIds, State state,
final String externalProvider, final NetworkOffering.NetworkMode networkMode, List<Long> domainIds, List<Long> zoneIds, State state,
NetworkOffering.RoutingMode routingMode, boolean specifyAsNumber) {
if (!Ipv6Service.Ipv6OfferingCreationEnabled.value() && !(internetProtocol == null || NetUtils.InternetProtocol.IPv4.equals(internetProtocol))) {
@ -697,7 +697,8 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
Service redundantRouterService = Service.SourceNat;
if (CollectionUtils.isNotEmpty(sourceNatServiceProviders)) {
svcProviderMap.put(Service.Gateway, sourceNatServiceProviders);
} else if (NetworkOffering.NetworkMode.ROUTED.equals(networkMode)) {
} else if (NetworkOffering.NetworkMode.ROUTED.equals(networkMode) && org.apache.commons.lang3.StringUtils.isBlank(externalProvider)) {
// For Routed mode, add the Gateway service except for external providers such as NSX, Netris to not override the svcProviderMap mapping
svcProviderMap.put(Service.Gateway, Sets.newHashSet(Provider.VPCVirtualRouter));
redundantRouterService = Service.Gateway;
}
@ -3540,7 +3541,9 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
|| vpcOffSvcProvidersMap.get(Service.SourceNat).contains(Provider.Nsx)
|| vpcOffSvcProvidersMap.get(Service.SourceNat).contains(Provider.Netris)))
|| (Objects.nonNull(vpcOffSvcProvidersMap.get(Network.Service.Gateway))
&& vpcOffSvcProvidersMap.get(Service.Gateway).contains(Network.Provider.VPCVirtualRouter));
&& (vpcOffSvcProvidersMap.get(Service.Gateway).contains(Network.Provider.VPCVirtualRouter)
|| vpcOffSvcProvidersMap.get(Service.Gateway).contains(Provider.Nsx)
|| vpcOffSvcProvidersMap.get(Service.Gateway).contains(Network.Provider.Netris)));
}
@Override

View File

@ -572,6 +572,13 @@ export default {
services = services.filter(service => {
return !['SourceNat', 'StaticNat', 'Lb', 'PortForwarding', 'Vpn'].includes(service.name)
})
if (['NSX', 'Netris'].includes(this.provider)) {
services.push({
name: 'Gateway',
enabled: true,
provider: [{ name: this.provider }]
})
}
}
for (var i in services) {
services[i].description = services[i].name