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());
                         }
                     }
                 });

Reply via email to