From 5f29bc2b80d68dbdf17dcf5eadb53d2082abc6fb Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Tue, 17 May 2022 00:59:02 +0530 Subject: [PATCH] server: publish ip6 assign event with route, always for vpc (#6389) * server: publish ip6 assign event for vpc always Signed-off-by: Abhishek Kumar * refactor event message, fix event publish Signed-off-by: Abhishek Kumar * unused import Signed-off-by: Abhishek Kumar * Fix event string --- .../java/com/cloud/network/Ipv6Service.java | 2 - .../orchestration/NetworkOrchestrator.java | 11 --- .../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 43978696298..2b4dff01086 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 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 b47232bdcda..3284511e01a 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 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 72e81419e64..6046d4fc0dc 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 assignPublicIpv6ToNetworkInternal(Network network, String vlanId, String nicMacAddress) throws InsufficientAddressCapacityException { + final List 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 placeholderResult = getPublicIpv6FromNetworkPlaceholder(network, ranges); + if (placeholderResult != null) { + return placeholderResult; + } Pair result = Transaction.execute((TransactionCallbackWithException, InsufficientAddressCapacityException>) status -> { - final List 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 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 getPublicIpv6AddressesForNetwork(Network network) { List 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()); } } });