This is an automated email from the ASF dual-hosted git repository.
nvazquez pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/main by this push:
new 5f29bc2b80 server: publish ip6 assign event with route, always for vpc
(#6389)
5f29bc2b80 is described below
commit 5f29bc2b80d68dbdf17dcf5eadb53d2082abc6fb
Author: Abhishek Kumar <[email protected]>
AuthorDate: Tue May 17 00:59:02 2022 +0530
server: publish ip6 assign event with route, always for vpc (#6389)
* server: publish ip6 assign event for vpc always
Signed-off-by: Abhishek Kumar <[email protected]>
* refactor event message, fix event publish
Signed-off-by: Abhishek Kumar <[email protected]>
* unused import
Signed-off-by: Abhishek Kumar <[email protected]>
* Fix event string
---
.../main/java/com/cloud/network/Ipv6Service.java | 2 -
.../engine/orchestration/NetworkOrchestrator.java | 11 ---
.../java/com/cloud/network/Ipv6ServiceImpl.java | 81 ++++++++++++++--------
3 files changed, 51 insertions(+), 43 deletions(-)
diff --git a/api/src/main/java/com/cloud/network/Ipv6Service.java
b/api/src/main/java/com/cloud/network/Ipv6Service.java
index 4397869629..2b4dff0108 100644
--- a/api/src/main/java/com/cloud/network/Ipv6Service.java
+++ b/api/src/main/java/com/cloud/network/Ipv6Service.java
@@ -70,8 +70,6 @@ public interface Ipv6Service extends PluggableService,
Configurable {
void updateNicIpv6(NicProfile nic, DataCenter dc, Network network) throws
InsufficientAddressCapacityException;
- void releasePublicIpv6ForNic(Network network, String nicIpv6Address);
-
List<String> getPublicIpv6AddressesForNetwork(Network network);
void updateIpv6RoutesForVpcResponse(Vpc vpc, VpcResponse response);
diff --git
a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
index b47232bdcd..3284511e01 100644
---
a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
+++
b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
@@ -55,7 +55,6 @@ import org.apache.cloudstack.framework.messagebus.MessageBus;
import org.apache.cloudstack.framework.messagebus.PublishScope;
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
import org.apache.cloudstack.network.dao.NetworkPermissionDao;
-import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
@@ -173,7 +172,6 @@ import com.cloud.network.element.UserDataServiceProvider;
import com.cloud.network.element.VirtualRouterElement;
import com.cloud.network.guru.NetworkGuru;
import com.cloud.network.guru.NetworkGuruAdditionalFunctions;
-import com.cloud.network.guru.PublicNetworkGuru;
import com.cloud.network.lb.LoadBalancingRulesManager;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.FirewallManager;
@@ -2359,15 +2357,6 @@ public class NetworkOrchestrator extends ManagerBase
implements NetworkOrchestra
s_logger.debug("Removed nic id=" + nic.getId());
// release assigned IPv6 for Isolated Network VR NIC
- if (Type.DomainRouter.equals(vm.getType()) &&
PublicNetworkGuru.class.getSimpleName().equals(nic.getReserver())
- && StringUtils.isNotEmpty(nic.getIPv6Address())) {
- List<Long> routerNetworks =
routerNetworkDao.getRouterNetworks(vm.getId());
- if (CollectionUtils.isNotEmpty(routerNetworks)) {
- Network guestNetwork =
_networksDao.findById(routerNetworks.get(0));
- ipv6Service.releasePublicIpv6ForNic(guestNetwork,
nic.getIPv6Address());
- }
- }
-
if (Type.User.equals(vm.getType()) &&
GuestType.Isolated.equals(network.getGuestType())
&&
_networkOfferingDao.isIpv6Supported(network.getNetworkOfferingId()) &&
StringUtils.isNotEmpty(nic.getIPv6Address())) {
final boolean usageHidden =
networkDetailsDao.isNetworkUsageHidden(network.getId());
diff --git a/server/src/main/java/com/cloud/network/Ipv6ServiceImpl.java
b/server/src/main/java/com/cloud/network/Ipv6ServiceImpl.java
index 72e81419e6..6046d4fc0d 100644
--- a/server/src/main/java/com/cloud/network/Ipv6ServiceImpl.java
+++ b/server/src/main/java/com/cloud/network/Ipv6ServiceImpl.java
@@ -79,6 +79,7 @@ import
com.cloud.network.dao.Ipv6GuestPrefixSubnetNetworkMapDao;
import com.cloud.network.dao.NetworkDetailsDao;
import com.cloud.network.firewall.FirewallService;
import com.cloud.network.guru.PublicNetworkGuru;
+import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.FirewallManager;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.FirewallRuleVO;
@@ -167,19 +168,55 @@ public class Ipv6ServiceImpl extends
ComponentLifecycleBase implements Ipv6Servi
return new Pair<>(nic.getIPv6Address(), vlanOptional.get());
}
+ private void publishPublicIpv6AssignActionEvent(final Network network,
final String ipv6Address) {
+ String event = EventTypes.EVENT_NET_IP6_ASSIGN;
+ final String description = String.format("Assigned public IPv6
address: %1$s for network ID: %2$s. Subnet: %3$s, gateway: %1$s", ipv6Address,
network.getUuid(), network.getIp6Cidr());
+
ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(),
network.getAccountId(), EventVO.LEVEL_INFO, event, description,
network.getId(), ApiCommandResourceType.Network.toString(), 0);
+ final boolean usageHidden =
networkDetailsDao.isNetworkUsageHidden(network.getId());
+ final String guestType = Vlan.VlanType.VirtualNetwork.toString();
+ UsageEventUtils.publishUsageEvent(event, network.getAccountId(),
network.getDataCenterId(), 0L,
+ ipv6Address, false, guestType, false, usageHidden,
+ IPv6Network.class.getName(), null);
+ }
+
+ private void publishPublicIpv6ReleaseActionEvent(Network network, String
nicIpv6Address) {
+ String event = EventTypes.EVENT_NET_IP6_RELEASE;
+ String description = String.format("Released public IPv6 address: %1$s
from network ID: %2$s. Subnet: %3$s, gateway: %1$s", nicIpv6Address,
network.getUuid(), network.getIp6Cidr());
+
ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(),
network.getAccountId(), EventVO.LEVEL_INFO, event, description,
network.getId(), ApiCommandResourceType.Network.toString(), 0);
+ final boolean usageHidden =
networkDetailsDao.isNetworkUsageHidden(network.getId());
+ UsageEventUtils.publishUsageEvent(event, network.getAccountId(),
network.getDataCenterId(), 0L,
+ nicIpv6Address, false,
Vlan.VlanType.VirtualNetwork.toString(), false, usageHidden,
+ IPv6Address.class.getName(), null);
+ }
+
+ private void processPublicIpv6AddressUpdateForVpcTier(final Network
network, final Nic nic) {
+ if (network.getVpcId() == null ||
!Network.State.Implementing.equals(network.getState())) {
+ return;
+ }
+ DomainRouterVO router = domainRouterDao.findById(nic.getInstanceId());
+ if (router == null) {
+ return;
+ }
+ if (router.getIsRedundantRouter() &&
!VirtualRouter.RedundantState.PRIMARY.equals(router.getRedundantState())) {
+ return;
+ }
+ networkOrchestrationService.savePlaceholderNic(network, null,
nic.getIPv6Address(), nic.getIPv6Cidr(), nic.getIPv6Gateway(),
s_publicNetworkReserver, VirtualMachine.Type.DomainRouter);
+ publishPublicIpv6AssignActionEvent(network, nic.getIPv6Address());
+ }
+
private Pair<String, ? extends Vlan>
assignPublicIpv6ToNetworkInternal(Network network, String vlanId, String
nicMacAddress) throws InsufficientAddressCapacityException {
+ final List<VlanVO> ranges =
vlanDao.listIpv6RangeByPhysicalNetworkIdAndVlanId(network.getPhysicalNetworkId(),
vlanId);
+ if (CollectionUtils.isEmpty(ranges)) {
+ s_logger.error(String.format("Unable to find IPv6 address for zone
ID: %d, physical network ID: %d, VLAN: %s", network.getDataCenterId(),
network.getPhysicalNetworkId(), vlanId));
+ InsufficientAddressCapacityException ex = new
InsufficientAddressCapacityException("Insufficient address capacity",
DataCenter.class, network.getDataCenterId());
+
ex.addProxyObject(ApiDBUtils.findZoneById(network.getDataCenterId()).getUuid());
+ throw ex;
+ }
+ Pair<String, ? extends Vlan> placeholderResult =
getPublicIpv6FromNetworkPlaceholder(network, ranges);
+ if (placeholderResult != null) {
+ return placeholderResult;
+ }
Pair<String, ? extends Vlan> result =
Transaction.execute((TransactionCallbackWithException<Pair<String, ? extends
Vlan>, InsufficientAddressCapacityException>) status -> {
- final List<VlanVO> ranges =
vlanDao.listIpv6RangeByPhysicalNetworkIdAndVlanId(network.getPhysicalNetworkId(),
vlanId);
- if (CollectionUtils.isEmpty(ranges)) {
- s_logger.error(String.format("Unable to find IPv6 address for
zone ID: %d, physical network ID: %d, VLAN: %s", network.getDataCenterId(),
network.getPhysicalNetworkId(), vlanId));
- InsufficientAddressCapacityException ex = new
InsufficientAddressCapacityException("Insufficient address capacity",
DataCenter.class, network.getDataCenterId());
-
ex.addProxyObject(ApiDBUtils.findZoneById(network.getDataCenterId()).getUuid());
- throw ex;
- }
- Pair<String, ? extends Vlan> placeholderResult =
getPublicIpv6FromNetworkPlaceholder(network, ranges);
- if (placeholderResult != null) {
- return placeholderResult;
- }
removePublicIpv6PlaceholderNics(network);
Collections.shuffle(ranges);
VlanVO selectedVlan = ranges.get(0);
@@ -195,14 +232,7 @@ public class Ipv6ServiceImpl extends
ComponentLifecycleBase implements Ipv6Servi
return new Pair<>(ipv6Addr.toString(), selectedVlan);
});
final String ipv6Address = result.first();
- final String event = EventTypes.EVENT_NET_IP6_ASSIGN;
- final String description = String.format("Assigned public IPv6
address: %s for network ID: %s", ipv6Address, network.getUuid());
-
ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(),
network.getAccountId(), EventVO.LEVEL_INFO, event, description,
network.getId(), ApiCommandResourceType.Network.toString(), 0);
- final boolean usageHidden =
networkDetailsDao.isNetworkUsageHidden(network.getId());
- final String guestType = result.second().getVlanType().toString();
- UsageEventUtils.publishUsageEvent(event, network.getAccountId(),
network.getDataCenterId(), 0L,
- ipv6Address, false, guestType, false, usageHidden,
- IPv6Network.class.getName(), null);
+ publishPublicIpv6AssignActionEvent(network, ipv6Address);
return result;
}
@@ -380,6 +410,7 @@ public class Ipv6ServiceImpl extends ComponentLifecycleBase
implements Ipv6Servi
@Override
public Nic assignPublicIpv6ToNetwork(Network network, Nic nic) {
if (StringUtils.isNotEmpty(nic.getIPv6Address())) {
+ processPublicIpv6AddressUpdateForVpcTier(network, nic);
return nic;
}
try {
@@ -421,17 +452,6 @@ public class Ipv6ServiceImpl extends
ComponentLifecycleBase implements Ipv6Servi
}
}
- @Override
- public void releasePublicIpv6ForNic(Network network, String
nicIpv6Address) {
- String event = EventTypes.EVENT_NET_IP6_RELEASE;
- String description = String.format("Releasing public IPv6 address: %s
from network ID: %s", nicIpv6Address, network.getUuid());
-
ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(),
network.getAccountId(), EventVO.LEVEL_INFO, event, description,
network.getId(), ApiCommandResourceType.Network.toString(), 0);
- final boolean usageHidden =
networkDetailsDao.isNetworkUsageHidden(network.getId());
- UsageEventUtils.publishUsageEvent(event, network.getAccountId(),
network.getDataCenterId(), 0L,
- nicIpv6Address, false,
Vlan.VlanType.VirtualNetwork.toString(), false, usageHidden,
- IPv6Address.class.getName(), null);
- }
-
@Override
public List<String> getPublicIpv6AddressesForNetwork(Network network) {
List<String> addresses = new ArrayList<>();
@@ -656,6 +676,7 @@ public class Ipv6ServiceImpl extends ComponentLifecycleBase
implements Ipv6Servi
for (Nic nic : nics) {
s_logger.debug("Removing placeholder nic " + nic);
nicDao.remove(nic.getId());
+ publishPublicIpv6ReleaseActionEvent(network,
nic.getIPv6Address());
}
}
});