From 194e768007327ecfaa43d603cf44d22d8756555c Mon Sep 17 00:00:00 2001 From: Fabricio Duarte Date: Mon, 21 Apr 2025 01:28:12 -0300 Subject: [PATCH 1/4] Network Usage event model adjustments --- .../service/NetworkOrchestrationService.java | 6 ++++ .../orchestration/NetworkOrchestrator.java | 31 +++++++++++++++---- .../com/cloud/network/NetworkServiceImpl.java | 10 ++---- .../com/cloud/vpc/MockNetworkManagerImpl.java | 12 +++++++ 4 files changed, 45 insertions(+), 14 deletions(-) diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java index 953727f9b347..b73983173aae 100644 --- a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java +++ b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java @@ -348,4 +348,10 @@ void implementNetworkElementsAndResources(DeployDestination dest, ReservationCon Pair importNic(final String macAddress, int deviceId, final Network network, final Boolean isDefaultNic, final VirtualMachine vm, final Network.IpAddresses ipAddresses, final DataCenter datacenter, boolean forced) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException; void unmanageNics(VirtualMachineProfile vm); + + void publishNetworkCreation(Network network); + + void publishNetworkUpdate(Network network); + + void publishNetworkDeletion(Network network); } 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 26b63d2d728b..15e4f0883cd4 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 @@ -1461,8 +1461,6 @@ public Pair implementNetwork(final long networkId, final if (isNetworkImplemented(network)) { s_logger.debug("Network id=" + networkId + " is already implemented"); implemented.set(guru, network); - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_UPDATE, network.getAccountId(), network.getDataCenterId(), network.getId(), - network.getName(), network.getNetworkOfferingId(), null, network.getState().name(), Network.class.getName(), network.getUuid(), true); return implemented; } @@ -1522,9 +1520,8 @@ public Pair implementNetwork(final long networkId, final network.setRestartRequired(false); _networksDao.update(network.getId(), network); + publishNetworkUpdate(network); implemented.set(guru, network); - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_CREATE, network.getAccountId(), network.getDataCenterId(), network.getId(), - network.getName(), network.getNetworkOfferingId(), null, null, null, network.getState().name(), network.getUuid()); return implemented; } catch (final NoTransitionException e) { s_logger.error(e.getMessage()); @@ -3005,6 +3002,7 @@ public Network doInTransaction(final TransactionStatus status) { if (updateResourceCount) { _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.network, isDisplayNetworkEnabled); } + publishNetworkCreation(network); return network; } @@ -3141,6 +3139,7 @@ public Boolean doInTransaction(final TransactionStatus status) { } _networksDao.update(networkFinal.getId(), networkFinal); _networksDao.clearCheckForGc(networkId); + publishNetworkUpdate(networkFinal); result = true; } else { try { @@ -3393,8 +3392,7 @@ public List doInTransaction(TransactionStatus status) { final Pair, Long> networkMsg = new Pair, Long>(Network.class, networkFinal.getId()); _messageBus.publish(_name, EntityManager.MESSAGE_REMOVE_ENTITY_EVENT, PublishScope.LOCAL, networkMsg); } - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_DELETE, network.getAccountId(), network.getDataCenterId(), network.getId(), - network.getName(), network.getNetworkOfferingId(), null, null, null, Network.class.getName(), network.getUuid()); + publishNetworkDeletion(network); return true; } catch (final CloudRuntimeException e) { s_logger.error("Failed to delete network", e); @@ -4780,6 +4778,27 @@ public void unmanageNics(VirtualMachineProfile vm) { } } + @Override + public void publishNetworkCreation(Network network) { + UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_CREATE, network.getAccountId(), network.getDataCenterId(), + network.getId(), network.getName(), network.getNetworkOfferingId(), null, null, null, network.getState().name(), + network.getUuid()); + } + + @Override + public void publishNetworkUpdate(Network network) { + UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_UPDATE, network.getAccountId(), network.getDataCenterId(), + network.getId(), network.getName(), network.getNetworkOfferingId(), null, network.getState().name(), + Network.class.getName(), network.getUuid(), true); + } + + @Override + public void publishNetworkDeletion(Network network) { + UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_DELETE, network.getAccountId(), network.getDataCenterId(), + network.getId(), network.getName(), network.getNetworkOfferingId(), null, null, null, + Network.class.getName(), network.getUuid()); + } + @Override public String getConfigComponentName() { return NetworkOrchestrationService.class.getSimpleName(); diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index bdb928ae919d..2b8ef211bc35 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -1997,12 +1997,7 @@ private Network implementedNetworkInCreation(final Account caller, final DataCen if (implementedNetwork == null || implementedNetwork.first() == null) { s_logger.warn("Failed to provision the network " + network); } - Network implemented = implementedNetwork.second(); - if (implemented != null) { - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_CREATE, implemented.getAccountId(), implemented.getDataCenterId(), implemented.getId(), - implemented.getName(), implemented.getNetworkOfferingId(), null, null, null, Network.class.getName(), implemented.getUuid()); - } - return implemented; + return implementedNetwork.second(); } catch (ResourceUnavailableException ex) { s_logger.warn("Failed to implement persistent guest network " + network + "due to ", ex); CloudRuntimeException e = new CloudRuntimeException("Failed to implement persistent guest network"); @@ -3398,8 +3393,7 @@ public void doInTransactionWithoutResult(TransactionStatus status) { } } Network updatedNetwork = getNetwork(network.getId()); - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_UPDATE, updatedNetwork.getAccountId(), updatedNetwork.getDataCenterId(), updatedNetwork.getId(), - updatedNetwork.getName(), updatedNetwork.getNetworkOfferingId(), null, updatedNetwork.getState().name(), Network.class.getName(), updatedNetwork.getUuid(), true); + _networkMgr.publishNetworkUpdate(updatedNetwork); return updatedNetwork; } diff --git a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java index c6762b2a2a15..a07344e3feab 100644 --- a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java +++ b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java @@ -1052,6 +1052,18 @@ public Pair importNic(String macAddress, int deviceId, Netw public void unmanageNics(VirtualMachineProfile vm) { } + @Override + public void publishNetworkCreation(Network network) { + } + + @Override + public void publishNetworkUpdate(Network network) { + } + + @Override + public void publishNetworkDeletion(Network network) { + } + @Override public Pair, Integer> listGuestVlans(ListGuestVlansCmd cmd) { return null; From 9882d7f8685fc9a2a123adc80ab42993baeaf8a9 Mon Sep 17 00:00:00 2001 From: Fabricio Duarte Date: Mon, 21 Apr 2025 12:40:21 -0300 Subject: [PATCH 2/4] Fix unnecessary UPDATE on implementation fail --- .../engine/orchestration/NetworkOrchestrator.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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 15e4f0883cd4..dcbbd53b159c 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 @@ -3087,12 +3087,13 @@ public boolean shutdownNetwork(final long networkId, final ReservationContext co s_logger.debug("Lock is acquired for network " + network + " as a part of network shutdown"); } - if (network.getState() == Network.State.Allocated) { + final Network.State initialState = network.getState(); + if (initialState == Network.State.Allocated) { s_logger.debug(String.format("Network [%s] is in Allocated state, no need to shutdown.", network)); return true; } - if (network.getState() != Network.State.Implemented && network.getState() != Network.State.Shutdown) { + if (initialState != Network.State.Implemented && initialState != Network.State.Shutdown) { s_logger.debug("Network is not implemented: " + network); return false; } @@ -3139,7 +3140,9 @@ public Boolean doInTransaction(final TransactionStatus status) { } _networksDao.update(networkFinal.getId(), networkFinal); _networksDao.clearCheckForGc(networkId); - publishNetworkUpdate(networkFinal); + if (initialState == Network.State.Implemented) { + publishNetworkUpdate(networkFinal); + } result = true; } else { try { From 513e2c0db26af44aeeede4c709eb6817f59eac16 Mon Sep 17 00:00:00 2001 From: Fabricio Duarte Date: Mon, 21 Apr 2025 15:32:57 -0300 Subject: [PATCH 3/4] Fix test failure --- .../engine/orchestration/NetworkOrchestratorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java b/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java index 2d016d03f2e5..c0e1c0c69907 100644 --- a/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java +++ b/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java @@ -894,7 +894,7 @@ public void testShutdownNetworkInImplementingState() { boolean shutdownNetworkStatus = testOrchestrator.shutdownNetwork(networkId, reservationContext, false); Assert.assertFalse(shutdownNetworkStatus); - verify(network, times(3)).getState(); + verify(network).getState(); verify(testOrchestrator._networksDao, times(1)).acquireInLockTable(networkId, NetworkLockTimeout.value()); verify(testOrchestrator._networksDao, times(1)).releaseFromLockTable(networkId); } From 2ce77d37680d194a87dc1c495a122cb662507f09 Mon Sep 17 00:00:00 2001 From: Fabricio Duarte Date: Thu, 24 Apr 2025 23:49:09 -0300 Subject: [PATCH 4/4] Move Usage network event publishing methods to UsageEventUtils --- .../service/NetworkOrchestrationService.java | 6 ---- .../java/com/cloud/event/UsageEventUtils.java | 19 ++++++++++++ .../orchestration/NetworkOrchestrator.java | 29 +++---------------- .../com/cloud/network/NetworkServiceImpl.java | 2 +- .../com/cloud/vpc/MockNetworkManagerImpl.java | 12 -------- 5 files changed, 24 insertions(+), 44 deletions(-) diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java index b73983173aae..953727f9b347 100644 --- a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java +++ b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java @@ -348,10 +348,4 @@ void implementNetworkElementsAndResources(DeployDestination dest, ReservationCon Pair importNic(final String macAddress, int deviceId, final Network network, final Boolean isDefaultNic, final VirtualMachine vm, final Network.IpAddresses ipAddresses, final DataCenter datacenter, boolean forced) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException; void unmanageNics(VirtualMachineProfile vm); - - void publishNetworkCreation(Network network); - - void publishNetworkUpdate(Network network); - - void publishNetworkDeletion(Network network); } diff --git a/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java b/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java index 1a2fab150a7b..547663fd1b9b 100644 --- a/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java +++ b/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java @@ -25,6 +25,7 @@ import javax.annotation.PostConstruct; import javax.inject.Inject; +import com.cloud.network.Network; import org.apache.commons.collections.MapUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.NoSuchBeanDefinitionException; @@ -246,4 +247,22 @@ private static void publishUsageEvent(String usageEventType, Long accountId, Lon static final String Name = "management-server"; + public static void publishNetworkCreation(Network network) { + publishUsageEvent(EventTypes.EVENT_NETWORK_CREATE, network.getAccountId(), network.getDataCenterId(), + network.getId(), network.getName(), network.getNetworkOfferingId(), null, null, null, network.getState().name(), + network.getUuid()); + } + + public static void publishNetworkUpdate(Network network) { + publishUsageEvent(EventTypes.EVENT_NETWORK_UPDATE, network.getAccountId(), network.getDataCenterId(), + network.getId(), network.getName(), network.getNetworkOfferingId(), null, network.getState().name(), + Network.class.getName(), network.getUuid(), true); + } + + public static void publishNetworkDeletion(Network network) { + publishUsageEvent(EventTypes.EVENT_NETWORK_DELETE, network.getAccountId(), network.getDataCenterId(), + network.getId(), network.getName(), network.getNetworkOfferingId(), null, null, null, + Network.class.getName(), network.getUuid()); + } + } 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 dcbbd53b159c..2ec79bc80f1b 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 @@ -1520,7 +1520,7 @@ public Pair implementNetwork(final long networkId, final network.setRestartRequired(false); _networksDao.update(network.getId(), network); - publishNetworkUpdate(network); + UsageEventUtils.publishNetworkUpdate(network); implemented.set(guru, network); return implemented; } catch (final NoTransitionException e) { @@ -3002,7 +3002,7 @@ public Network doInTransaction(final TransactionStatus status) { if (updateResourceCount) { _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.network, isDisplayNetworkEnabled); } - publishNetworkCreation(network); + UsageEventUtils.publishNetworkCreation(network); return network; } @@ -3141,7 +3141,7 @@ public Boolean doInTransaction(final TransactionStatus status) { _networksDao.update(networkFinal.getId(), networkFinal); _networksDao.clearCheckForGc(networkId); if (initialState == Network.State.Implemented) { - publishNetworkUpdate(networkFinal); + UsageEventUtils.publishNetworkUpdate(networkFinal); } result = true; } else { @@ -3395,7 +3395,7 @@ public List doInTransaction(TransactionStatus status) { final Pair, Long> networkMsg = new Pair, Long>(Network.class, networkFinal.getId()); _messageBus.publish(_name, EntityManager.MESSAGE_REMOVE_ENTITY_EVENT, PublishScope.LOCAL, networkMsg); } - publishNetworkDeletion(network); + UsageEventUtils.publishNetworkDeletion(network); return true; } catch (final CloudRuntimeException e) { s_logger.error("Failed to delete network", e); @@ -4781,27 +4781,6 @@ public void unmanageNics(VirtualMachineProfile vm) { } } - @Override - public void publishNetworkCreation(Network network) { - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_CREATE, network.getAccountId(), network.getDataCenterId(), - network.getId(), network.getName(), network.getNetworkOfferingId(), null, null, null, network.getState().name(), - network.getUuid()); - } - - @Override - public void publishNetworkUpdate(Network network) { - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_UPDATE, network.getAccountId(), network.getDataCenterId(), - network.getId(), network.getName(), network.getNetworkOfferingId(), null, network.getState().name(), - Network.class.getName(), network.getUuid(), true); - } - - @Override - public void publishNetworkDeletion(Network network) { - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_DELETE, network.getAccountId(), network.getDataCenterId(), - network.getId(), network.getName(), network.getNetworkOfferingId(), null, null, null, - Network.class.getName(), network.getUuid()); - } - @Override public String getConfigComponentName() { return NetworkOrchestrationService.class.getSimpleName(); diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index 2b8ef211bc35..c79388f2578d 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -3393,7 +3393,7 @@ public void doInTransactionWithoutResult(TransactionStatus status) { } } Network updatedNetwork = getNetwork(network.getId()); - _networkMgr.publishNetworkUpdate(updatedNetwork); + UsageEventUtils.publishNetworkUpdate(updatedNetwork); return updatedNetwork; } diff --git a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java index a07344e3feab..c6762b2a2a15 100644 --- a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java +++ b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java @@ -1052,18 +1052,6 @@ public Pair importNic(String macAddress, int deviceId, Netw public void unmanageNics(VirtualMachineProfile vm) { } - @Override - public void publishNetworkCreation(Network network) { - } - - @Override - public void publishNetworkUpdate(Network network) { - } - - @Override - public void publishNetworkDeletion(Network network) { - } - @Override public Pair, Integer> listGuestVlans(ListGuestVlansCmd cmd) { return null;