You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by nv...@apache.org on 2022/05/16 19:29:11 UTC

[cloudstack] branch main updated: server: publish ip6 assign event with route, always for vpc (#6389)

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 <ab...@gmail.com>
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 <ab...@gmail.com>
    
    * refactor event message, fix event publish
    
    Signed-off-by: Abhishek Kumar <ab...@gmail.com>
    
    * unused import
    
    Signed-off-by: Abhishek Kumar <ab...@gmail.com>
    
    * 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());
                         }
                     }
                 });