You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by pe...@apache.org on 2025/02/24 22:36:41 UTC
(cloudstack) 18/46: Pass VXLAN ID during creation of Netris vNets (#16)
This is an automated email from the ASF dual-hosted git repository.
pearl11594 pushed a commit to branch netris-integration-upstream
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit b038bc6a65fb18ba43001ecc651ec9636afd0671
Author: Pearl Dsilva <pe...@gmail.com>
AuthorDate: Thu Nov 7 10:21:09 2024 -0500
Pass VXLAN ID during creation of Netris vNets (#16)
* add zone params to accepts management vnet
* Release vxlan associated to the netris broadcast domain type
* handle update network broadcast uri
---
api/src/main/java/com/cloud/event/EventTypes.java | 2 ++
.../cloudstack/service/NetrisApiClientImpl.java | 8 ++++--
.../cloudstack/service/NetrisGuestNetworkGuru.java | 32 ++++++++++++++++++++--
.../cloudstack/service/NetrisServiceImpl.java | 8 ++++++
.../com/cloud/network/guru/GuestNetworkGuru.java | 11 ++++++--
5 files changed, 53 insertions(+), 8 deletions(-)
diff --git a/api/src/main/java/com/cloud/event/EventTypes.java b/api/src/main/java/com/cloud/event/EventTypes.java
index 81ed185dae5..54d97a7754a 100644
--- a/api/src/main/java/com/cloud/event/EventTypes.java
+++ b/api/src/main/java/com/cloud/event/EventTypes.java
@@ -496,6 +496,8 @@ public class EventTypes {
public static final String EVENT_ZONE_VLAN_ASSIGN = "ZONE.VLAN.ASSIGN";
public static final String EVENT_ZONE_VLAN_RELEASE = "ZONE.VLAN.RELEASE";
+ public static final String EVENT_ZONE_VXLAN_ASSIGN = "ZONE.VXLAN.ASSIGN";
+ public static final String EVENT_ZONE_VXLAN_RELEASE = "ZONE.VXLAN.RELEASE";
// Projects
public static final String EVENT_PROJECT_CREATE = "PROJECT.CREATE";
diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java
index b61c84e0110..a140f171f64 100644
--- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java
+++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java
@@ -281,7 +281,7 @@ public class NetrisApiClientImpl implements NetrisApiClient {
List<VPCListing> vpcs = vpcListings.stream()
.filter(x -> x.getName().equals(vpcName) && x.getAdminTenant().getId().equals(tenantId))
.collect(Collectors.toList());
- return vpcs.get(0);
+ return vpcs.isEmpty() ? null : vpcs.get(0);
} catch (Exception e) {
throw new CloudRuntimeException(String.format("Error getting VPC %s information: %s", vpcName, e.getMessage()), e);
}
@@ -319,6 +319,7 @@ public class NetrisApiClientImpl implements NetrisApiClient {
String networkName = cmd.getName();
Long networkId = cmd.getId();
String vnetCidr = cmd.getCidr();
+ Integer vxlanId = cmd.getVxlanId();
boolean isVpc = cmd.isVpc();
String suffix = getNetrisVpcNameSuffix(vpcId, vpcName, networkId, networkName, isVpc);
@@ -341,7 +342,7 @@ public class NetrisApiClientImpl implements NetrisApiClient {
createIpamSubnetInternal(netrisSubnetName, vnetCidr, SubnetBody.PurposeEnum.COMMON, associatedVpc);
logger.debug("Successfully created IPAM Subnet {} for network {} on Netris", netrisSubnetName, networkName);
- VnetResAddBody vnetResponse = createVnetInternal(associatedVpc, netrisVnetName, vnetCidr);
+ VnetResAddBody vnetResponse = createVnetInternal(associatedVpc, netrisVnetName, vnetCidr, vxlanId);
if (vnetResponse == null || !vnetResponse.isIsSuccess()) {
String reason = vnetResponse == null ? "Empty response" : "Operation failed on Netris";
logger.debug("The Netris vNet creation {} failed: {}", vNetName, reason);
@@ -535,7 +536,7 @@ public class NetrisApiClientImpl implements NetrisApiClient {
}
}
- VnetResAddBody createVnetInternal(VPCListing associatedVpc, String netrisVnetName, String vNetCidr) {
+ VnetResAddBody createVnetInternal(VPCListing associatedVpc, String netrisVnetName, String vNetCidr, Integer vxlanId) {
logger.debug("Creating Netris VPC vNet {} for CIDR {}", netrisVnetName, vNetCidr);
try {
VnetAddBody vnetBody = new VnetAddBody();
@@ -558,6 +559,7 @@ public class NetrisApiClientImpl implements NetrisApiClient {
vnetBody.setL3vpn(false);
vnetBody.setName(netrisVnetName);
vnetBody.setNativeVlan(0);
+ vnetBody.setVxlanID(vxlanId);
vnetBody.setPorts(new ArrayList<>());
IpTreeSubnetSites subnetSites = new IpTreeSubnetSites();
diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisGuestNetworkGuru.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisGuestNetworkGuru.java
index 95056c95460..2a4891eb28c 100644
--- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisGuestNetworkGuru.java
+++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisGuestNetworkGuru.java
@@ -20,6 +20,9 @@ import com.cloud.dc.DataCenter;
import com.cloud.deploy.DeployDestination;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.domain.DomainVO;
+import com.cloud.event.ActionEventUtils;
+import com.cloud.event.EventTypes;
+import com.cloud.event.EventVO;
import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.InsufficientVirtualNetworkCapacityException;
import com.cloud.exception.InvalidParameterValueException;
@@ -41,6 +44,8 @@ import com.cloud.vm.NicProfile;
import com.cloud.vm.ReservationContext;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
+import org.apache.cloudstack.api.ApiCommandResourceType;
+import org.apache.cloudstack.context.CallContext;
import javax.inject.Inject;
import java.util.Objects;
@@ -132,6 +137,12 @@ public class NetrisGuestNetworkGuru extends GuestNetworkGuru implements Network
if (isNull(zone)) {
throw new CloudRuntimeException(String.format("Failed to find zone with id: %s", zoneId));
}
+ try {
+ allocateVnet(network, designedNetwork, network.getDataCenterId(), network.getPhysicalNetworkId(), network.getReservationId());
+ } catch (Exception e) {
+ throw new CloudRuntimeException(String.format("Failed to allocate VXLAN for Netris guest Network %s", network.getName()));
+ }
+ _networkDao.update(designedNetwork.getId(), designedNetwork);
createNetrisVnet(designedNetwork, zone);
} catch (Exception ex) {
throw new CloudRuntimeException("unable to create Netris network " + network.getUuid() + "due to: " + ex.getMessage());
@@ -146,7 +157,7 @@ public class NetrisGuestNetworkGuru extends GuestNetworkGuru implements Network
@Override
public Network implement(Network network, NetworkOffering offering, DeployDestination dest,
- ReservationContext context) {
+ ReservationContext context) throws InsufficientVirtualNetworkCapacityException {
NetworkVO implemented = new NetworkVO(network.getTrafficType(), network.getMode(),
network.getBroadcastDomainType(), network.getNetworkOfferingId(), Network.State.Implemented,
network.getDataCenterId(), network.getPhysicalNetworkId(), offering.isRedundantRouter());
@@ -167,10 +178,27 @@ public class NetrisGuestNetworkGuru extends GuestNetworkGuru implements Network
if (network.getName() != null) {
implemented.setName(network.getName());
}
- implemented.setBroadcastUri(Networks.BroadcastDomainType.Netris.toUri("netris"));
+ allocateVnet(network, implemented, network.getDataCenterId(), network.getPhysicalNetworkId(), network.getReservationId());
return implemented;
}
+ @Override
+ protected void allocateVnet(Network network, NetworkVO implemented, long dcId, long physicalNetworkId, String reservationId)
+ throws InsufficientVirtualNetworkCapacityException {
+ if (network.getBroadcastUri() == null) {
+ String vnet = _dcDao.allocateVnet(dcId, physicalNetworkId, network.getAccountId(), reservationId, UseSystemGuestVlans.valueIn(network.getAccountId()));
+ if (vnet == null) {
+ throw new InsufficientVirtualNetworkCapacityException("Unable to allocate vnet as a " + "part of network " + network + " implement ", DataCenter.class,
+ dcId);
+ }
+ implemented.setBroadcastUri(Networks.BroadcastDomainType.Netris.toUri(vnet));
+ 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);
+ } else {
+ implemented.setBroadcastUri(network.getBroadcastUri());
+ }
+ }
+
@Override
public NicProfile allocate(Network network, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException {
NicProfile nicProfile = super.allocate(network, nic, vm);
diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java
index eb2046718c2..90c80ddabf1 100644
--- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java
+++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java
@@ -19,7 +19,10 @@ package org.apache.cloudstack.service;
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.Answer;
import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.network.Networks;
import com.cloud.network.dao.NetrisProviderDao;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkVO;
import com.cloud.network.element.NetrisProviderVO;
import com.cloud.network.netris.NetrisService;
import com.cloud.network.vpc.Vpc;
@@ -44,6 +47,8 @@ public class NetrisServiceImpl implements NetrisService, Configurable {
@Inject
private NetrisProviderDao netrisProviderDao;
@Inject
+ private NetworkDao networkDao;
+ @Inject
private AgentManager agentMgr;
@Override
@@ -91,7 +96,10 @@ public class NetrisServiceImpl implements NetrisService, Configurable {
@Override
public boolean createVnetResource(Long zoneId, long accountId, long domainId, String vpcName, Long vpcId, String networkName, Long networkId, String cidr) {
+ NetworkVO network = networkDao.findById(networkId);
+ String vxlanId = Networks.BroadcastDomainType.getValue(network.getBroadcastUri());
CreateNetrisVnetCommand cmd = new CreateNetrisVnetCommand(zoneId, accountId, domainId, vpcName, vpcId, networkName, networkId, cidr, !Objects.isNull(vpcId));
+ cmd.setVxlanId(Integer.parseInt(vxlanId));
NetrisAnswer answer = sendNetrisCommand(cmd, zoneId);
return answer.getResult();
}
diff --git a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java
index 1d7eb359a79..342d145dfbc 100644
--- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java
+++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java
@@ -17,6 +17,7 @@
package com.cloud.network.guru;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Random;
@@ -524,12 +525,16 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur
return; // Nothing to do here if the uri is null already
}
- if ((profile.getBroadcastDomainType() == BroadcastDomainType.Vlan || profile.getBroadcastDomainType() == BroadcastDomainType.Vxlan) && !offering.isSpecifyVlan()) {
+ if ((profile.getBroadcastDomainType() == BroadcastDomainType.Vlan || profile.getBroadcastDomainType() == BroadcastDomainType.Vxlan || profile.getBroadcastDomainType() == BroadcastDomainType.Netris) && !offering.isSpecifyVlan()) {
logger.debug("Releasing vnet for the network: {}", profile);
_dcDao.releaseVnet(BroadcastDomainType.getValue(profile.getBroadcastUri()), profile.getDataCenterId(), profile.getPhysicalNetworkId(), profile.getAccountId(),
profile.getReservationId());
- ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), profile.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_RELEASE,
- String.format("Released Zone Vnet: %s for Network: %s", BroadcastDomainType.getValue(profile.getBroadcastUri()), profile),
+ String eventType = EventTypes.EVENT_ZONE_VLAN_RELEASE;
+ if (Arrays.asList(BroadcastDomainType.Vxlan, BroadcastDomainType.Netris).contains(profile.getBroadcastDomainType())) {
+ eventType = EventTypes.EVENT_ZONE_VXLAN_RELEASE;
+ }
+ ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), profile.getAccountId(), EventVO.LEVEL_INFO, eventType,
+ "Released Zone Vnet: " + BroadcastDomainType.getValue(profile.getBroadcastUri()) + " for Network: " + profile.getId(),
profile.getDataCenterId(), ApiCommandResourceType.Zone.toString(), 0);
}