Skip to content

Commit 7ec8676

Browse files
committed
Create method isNetworkEligibleForNetworkStats and add unit tests
1 parent b3ee6dc commit 7ec8676

2 files changed

Lines changed: 110 additions & 6 deletions

File tree

‎server/src/main/java/com/cloud/server/StatsCollector.java‎

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1589,12 +1589,7 @@ public void doInTransactionWithoutResult(TransactionStatus status) {
15891589
SearchCriteria<NicVO> sc_nic = _nicDao.createSearchCriteria();
15901590
sc_nic.addAnd("macAddress", SearchCriteria.Op.EQ, vmNetworkStatEntry.getMacAddress());
15911591
NicVO nic = _nicDao.search(sc_nic, null).get(0);
1592-
List<VlanVO> vlan = _vlanDao.listVlansByNetworkId(nic.getNetworkId());
1593-
NetworkVO networkVO = networkDao.findById(nic.getNetworkId());
1594-
boolean isRoutedNetwork = networkVO != null && routedIpv4Manager.isRoutedNetwork(networkVO);
1595-
boolean isDirectAttachedNetwork = CollectionUtils.isNotEmpty(vlan)
1596-
&& vlan.get(0).getVlanType() == VlanType.DirectAttached;
1597-
if (!isRoutedNetwork && !isDirectAttachedNetwork) {
1592+
if (!isNetworkEligibleForNetworkStats(nic.getNetworkId())) {
15981593
continue; // only get network statistics for Shared or Routed network
15991594
}
16001595
UserStatisticsVO previousvmNetworkStats = _userStatsDao.findBy(userVm.getAccountId(), userVm.getDataCenterId(), nic.getNetworkId(),
@@ -2152,6 +2147,27 @@ protected boolean isCurrentVmDiskStatsDifferentFromPrevious(VmDiskStatisticsVO p
21522147
return true;
21532148
}
21542149

2150+
/**
2151+
* Returns {@code true} if the given network is eligible for VM network statistics collection.
2152+
* Only Shared (DirectAttached) networks and Routed networks qualify.
2153+
*
2154+
* @param networkId the network id to evaluate
2155+
* @return {@code true} when the network is routed or direct-attached, {@code false} otherwise
2156+
*/
2157+
protected boolean isNetworkEligibleForNetworkStats(Long networkId) {
2158+
if (networkId == null) {
2159+
return false;
2160+
}
2161+
List<VlanVO> vlans = _vlanDao.listVlansByNetworkId(networkId);
2162+
boolean isDirectAttachedNetwork = CollectionUtils.isNotEmpty(vlans)
2163+
&& vlans.get(0).getVlanType() == VlanType.DirectAttached;
2164+
if (isDirectAttachedNetwork) {
2165+
return true;
2166+
}
2167+
NetworkVO networkVO = networkDao.findById(networkId);
2168+
return networkVO != null && routedIpv4Manager.isRoutedNetwork(networkVO);
2169+
}
2170+
21552171
/**
21562172
* Returns true if all the VmDiskStatsEntry are Zeros (Bytes read, Bytes write, IO read, and IO write must be all equals to zero)
21572173
*/

‎server/src/test/java/com/cloud/server/StatsCollectorTest.java‎

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.text.SimpleDateFormat;
2727
import java.util.ArrayList;
2828
import java.util.Arrays;
29+
import java.util.Collections;
2930
import java.util.Date;
3031
import java.util.HashMap;
3132
import java.util.List;
@@ -38,6 +39,7 @@
3839
import com.cloud.utils.DateUtil;
3940
import com.google.gson.JsonSyntaxException;
4041
import org.apache.cloudstack.framework.config.ConfigKey;
42+
import org.apache.cloudstack.network.RoutedIpv4Manager;
4143
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
4244
import org.apache.commons.collections.CollectionUtils;
4345
import org.influxdb.InfluxDB;
@@ -64,7 +66,12 @@
6466
import com.cloud.agent.api.GetStorageStatsCommand;
6567
import com.cloud.agent.api.VmDiskStatsEntry;
6668
import com.cloud.agent.api.VmStatsEntry;
69+
import com.cloud.dc.Vlan.VlanType;
70+
import com.cloud.dc.VlanVO;
71+
import com.cloud.dc.dao.VlanDao;
6772
import com.cloud.hypervisor.Hypervisor;
73+
import com.cloud.network.dao.NetworkDao;
74+
import com.cloud.network.dao.NetworkVO;
6875
import com.cloud.server.StatsCollector.ExternalStatsProtocol;
6976
import com.cloud.storage.StorageStats;
7077
import com.cloud.storage.VolumeStatsVO;
@@ -118,6 +125,15 @@ public class StatsCollectorTest {
118125
@Mock
119126
private StoragePoolVO mockPool;
120127

128+
@Mock
129+
private RoutedIpv4Manager routedIpv4Manager;
130+
131+
@Mock
132+
private NetworkDao networkDao;
133+
134+
@Mock
135+
private VlanDao vlanDao;
136+
121137
private static Gson gson = new Gson();
122138

123139
private Gson msStatsGson;
@@ -701,6 +717,78 @@ public void testGsonDateFormatDeserializationWithDifferentDateFormat() throws Ex
701717
*/
702718
}
703719

720+
// -----------------------------------------------------------------------
721+
// Tests for isNetworkEligibleForNetworkStats
722+
// -----------------------------------------------------------------------
723+
724+
private VlanVO buildVlan(VlanType type) {
725+
VlanVO vlan = Mockito.mock(VlanVO.class);
726+
Mockito.when(vlan.getVlanType()).thenReturn(type);
727+
return vlan;
728+
}
729+
730+
@Test
731+
public void isNetworkEligibleForNetworkStats_RoutedNetwork_ReturnsTrue() {
732+
Long networkId = 1L;
733+
NetworkVO networkVO = Mockito.mock(NetworkVO.class);
734+
Mockito.when(networkDao.findById(networkId)).thenReturn(networkVO);
735+
Mockito.when(vlanDao.listVlansByNetworkId(networkId)).thenReturn(Collections.emptyList());
736+
Mockito.when(routedIpv4Manager.isRoutedNetwork(networkVO)).thenReturn(true);
737+
738+
Assert.assertTrue(statsCollector.isNetworkEligibleForNetworkStats(networkId));
739+
}
740+
741+
@Test
742+
public void isNetworkEligibleForNetworkStats_DirectAttachedNetwork_ReturnsTrue() {
743+
Long networkId = 1L;
744+
NetworkVO networkVO = Mockito.mock(NetworkVO.class);
745+
Mockito.when(networkDao.findById(networkId)).thenReturn(networkVO);
746+
Mockito.when(routedIpv4Manager.isRoutedNetwork(networkVO)).thenReturn(false);
747+
List<VlanVO> vlans = Collections.singletonList(buildVlan(VlanType.DirectAttached));
748+
Mockito.when(vlanDao.listVlansByNetworkId(networkId)).thenReturn(vlans);
749+
750+
Assert.assertTrue(statsCollector.isNetworkEligibleForNetworkStats(networkId));
751+
}
752+
753+
@Test
754+
public void isNetworkEligibleForNetworkStats_NeitherRoutedNorDirectAttached_ReturnsFalse() {
755+
Long networkId = 1L;
756+
NetworkVO networkVO = Mockito.mock(NetworkVO.class);
757+
Mockito.when(networkDao.findById(networkId)).thenReturn(networkVO);
758+
Mockito.when(routedIpv4Manager.isRoutedNetwork(networkVO)).thenReturn(false);
759+
List<VlanVO> vlans = Collections.singletonList(buildVlan(VlanType.VirtualNetwork));
760+
Mockito.when(vlanDao.listVlansByNetworkId(networkId)).thenReturn(vlans);
761+
762+
Assert.assertFalse(statsCollector.isNetworkEligibleForNetworkStats(networkId));
763+
}
764+
765+
@Test
766+
public void isNetworkEligibleForNetworkStats_NullNetworkAndEmptyVlans_ReturnsFalse() {
767+
Long networkId = 1L;
768+
Mockito.when(networkDao.findById(networkId)).thenReturn(null);
769+
Mockito.when(vlanDao.listVlansByNetworkId(networkId)).thenReturn(Collections.emptyList());
770+
771+
Assert.assertFalse(statsCollector.isNetworkEligibleForNetworkStats(networkId));
772+
}
773+
774+
@Test
775+
public void isNetworkEligibleForNetworkStats_NullNetworkButDirectAttached_ReturnsTrue() {
776+
Long networkId = 1L;
777+
Mockito.when(networkDao.findById(networkId)).thenReturn(null);
778+
List<VlanVO> vlans = Collections.singletonList(buildVlan(VlanType.DirectAttached));
779+
Mockito.when(vlanDao.listVlansByNetworkId(networkId)).thenReturn(vlans);
780+
781+
Assert.assertTrue(statsCollector.isNetworkEligibleForNetworkStats(networkId));
782+
Mockito.verify(routedIpv4Manager, Mockito.never()).isRoutedNetwork(Mockito.any());
783+
}
784+
785+
@Test
786+
public void isNetworkEligibleForNetworkStats_NullNetworkId_ReturnsFalse() {
787+
Assert.assertFalse(statsCollector.isNetworkEligibleForNetworkStats(null));
788+
Mockito.verify(networkDao, Mockito.never()).findById(Mockito.anyLong());
789+
Mockito.verify(vlanDao, Mockito.never()).listVlansByNetworkId(Mockito.anyLong());
790+
}
791+
704792
private static class TestClass {
705793
private String str;
706794
private int num;

0 commit comments

Comments
 (0)