Skip to content

Commit f053803

Browse files
author
Pearl Dsilva
committed
Added additional marvin tests + defensive checks
1 parent 9856b81 commit f053803

File tree

2 files changed

+65
-17
lines changed

2 files changed

+65
-17
lines changed

engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1850,10 +1850,12 @@ private void orchestrateStop(final String vmUuid, final boolean cleanUpEvenIfUna
18501850

18511851
private void getPersistenceMap(Map<String, Boolean> vlanToPersistenceMap, NetworkVO networkVO) {
18521852
NetworkOfferingVO offeringVO = networkOfferingDao.findById(networkVO.getNetworkOfferingId());
1853-
Pair<String, Boolean> data = getVMNetworkDetails(networkVO, offeringVO.isPersistent());
1854-
Boolean shouldDeleteNwResource = MapUtils.isNotEmpty(vlanToPersistenceMap) ? vlanToPersistenceMap.get(data.first()) : null;
1855-
if (shouldDeleteNwResource == null || shouldDeleteNwResource){
1856-
vlanToPersistenceMap.put(data.first(), data.second());
1853+
if (offeringVO != null) {
1854+
Pair<String, Boolean> data = getVMNetworkDetails(networkVO, offeringVO.isPersistent());
1855+
Boolean shouldDeleteNwResource = (MapUtils.isNotEmpty(vlanToPersistenceMap) && data != null) ? vlanToPersistenceMap.get(data.first()) : null;
1856+
if (data != null && (shouldDeleteNwResource == null || shouldDeleteNwResource)) {
1857+
vlanToPersistenceMap.put(data.first(), data.second());
1858+
}
18571859
}
18581860
}
18591861

@@ -1866,7 +1868,7 @@ private Map<String, Boolean> getVlanToPersistenceMapForVM(long vmId) {
18661868
}
18671869
if (userVmJoinVOS.isEmpty()) {
18681870
VMInstanceVO vmInstanceVO = _vmDao.findById(vmId);
1869-
if (vmInstanceVO.getType() == VirtualMachine.Type.DomainRouter) {
1871+
if (vmInstanceVO != null && vmInstanceVO.getType() == VirtualMachine.Type.DomainRouter) {
18701872
DomainRouterJoinVO routerVO = domainRouterJoinDao.findById(vmId);
18711873
NetworkVO networkVO = _networkDao.findById(routerVO.getNetworkId());
18721874
getPersistenceMap(vlanToPersistenceMap, networkVO);
@@ -1886,18 +1888,21 @@ private Map<String, Boolean> getVlanToPersistenceMapForVM(long vmId) {
18861888
*/
18871889
private Pair<String, Boolean> getVMNetworkDetails(NetworkVO networkVO, boolean isPersistent) {
18881890
URI broadcastUri = networkVO.getBroadcastUri();
1889-
String scheme = broadcastUri.getScheme();
1890-
String vlanId = Networks.BroadcastDomainType.getValue(broadcastUri);
1891-
boolean shouldDelete = !((networkVO.getGuestType() == Network.GuestType.L2 || networkVO.getGuestType() == Network.GuestType.Isolated) &&
1892-
(scheme.equalsIgnoreCase("vlan"))
1893-
&& isPersistent);
1894-
if (shouldDelete) {
1895-
int persistentNetworksCount = _networkDao.getOtherPersistentNetworksCount(networkVO.getId(), networkVO.getBroadcastUri().toString(), true);
1896-
if (persistentNetworksCount > 0) {
1897-
shouldDelete = false;
1898-
}
1899-
}
1900-
return new Pair<>(vlanId, shouldDelete);
1891+
if (broadcastUri != null) {
1892+
String scheme = broadcastUri.getScheme();
1893+
String vlanId = Networks.BroadcastDomainType.getValue(broadcastUri);
1894+
boolean shouldDelete = !((networkVO.getGuestType() == Network.GuestType.L2 || networkVO.getGuestType() == Network.GuestType.Isolated) &&
1895+
(scheme != null && scheme.equalsIgnoreCase("vlan"))
1896+
&& isPersistent);
1897+
if (shouldDelete) {
1898+
int persistentNetworksCount = _networkDao.getOtherPersistentNetworksCount(networkVO.getId(), networkVO.getBroadcastUri().toString(), true);
1899+
if (persistentNetworksCount > 0) {
1900+
shouldDelete = false;
1901+
}
1902+
}
1903+
return new Pair<>(vlanId, shouldDelete);
1904+
}
1905+
return null;
19011906
}
19021907

19031908
private void advanceStop(final VMInstanceVO vm, final boolean cleanUpEvenIfUnableToStop) throws AgentUnavailableException, OperationTimedoutException,

test/integration/smoke/test_persistent_network.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,49 @@ def test_02_L2_persistent_network(self):
330330
network_vlan,
331331
"vlan must not be null for persistent network")
332332

333+
self.validate_persistent_network_resources_created_on_host(network_vlan)
334+
335+
@attr(tags=["advanced", "l2", "persistent", "network"], required_hardware="false")
336+
def test_03_deploy_and_destroy_VM_and_verify_network_resources_persist(self):
337+
network_vlan = 99
338+
network = Network.create(
339+
self.apiclient,
340+
self.services["l2_network"],
341+
networkofferingid=self.l2_persistent_network_offering.id,
342+
zoneid=self.zone.id,
343+
vlan=network_vlan)
344+
self.cleanup.append(network)
345+
response = verifyNetworkState(
346+
self.apiclient,
347+
network.id,
348+
"implemented")
349+
logger.debug(response)
350+
exceptionOccured = response[0]
351+
isNetworkInDesiredState = response[1]
352+
exceptionMessage = response[2]
353+
354+
if (exceptionOccured or (not isNetworkInDesiredState)):
355+
self.fail(exceptionMessage)
356+
self.assertIsNotNone(
357+
network_vlan,
358+
"vlan must not be null for persistent network")
359+
try:
360+
virtual_machine = VirtualMachine.create(
361+
self.apiclient,
362+
self.services["virtual_machine"],
363+
networkids=[
364+
network.id],
365+
serviceofferingid=self.service_offering.id)
366+
367+
VirtualMachine.delete(virtual_machine, self.apiclient, expunge=True)
368+
369+
self.validate_persistent_network_resources_created_on_host(network_vlan)
370+
except Exception as e:
371+
self.fail("Exception occurred: %s" % e)
372+
return
373+
374+
375+
def validate_persistent_network_resources_created_on_host(self, network_vlan):
333376
hosts = self.list_all_hosts_in_zone(self.zone.id)
334377
if self.hypervisor.lower() in "kvm":
335378
for host in hosts:

0 commit comments

Comments
 (0)