Updated Branches: refs/heads/add_remove_nics 77da8856f -> aff919eab
Summary: Add tests, streamline code by removing custom addUserVmToNetwork Submitted-by: Brian Angus <[email protected]> Submitted-by: Ryan Dietrich <[email protected]> Signed-off-by: Marcus Sorensen <[email protected]> 1359494800 -0700 Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/aff919ea Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/aff919ea Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/aff919ea Branch: refs/heads/add_remove_nics Commit: aff919eab3bda9fa7a51da5a966b678dae3d3c4c Parents: 77da885 Author: Marcus Sorensen <[email protected]> Authored: Tue Jan 29 14:26:40 2013 -0700 Committer: Marcus Sorensen <[email protected]> Committed: Tue Jan 29 14:26:40 2013 -0700 ---------------------------------------------------------------------- server/src/com/cloud/network/NetworkManager.java | 2 +- .../src/com/cloud/network/NetworkManagerImpl.java | 6 +- server/src/com/cloud/vm/UserVmManagerImpl.java | 20 +- server/src/com/cloud/vm/VirtualMachineManager.java | 12 - .../com/cloud/vm/VirtualMachineManagerImpl.java | 59 +--- .../com/cloud/network/MockNetworkManagerImpl.java | 2 +- .../cloud/vm/MockVirtualMachineManagerImpl.java | 9 - .../test/com/cloud/vpc/MockNetworkManagerImpl.java | 2 +- test/integration/smoke/test_nic.py | 324 +++++++++++++++ 9 files changed, 357 insertions(+), 79 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aff919ea/server/src/com/cloud/network/NetworkManager.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 695a8f0..c0065dd 100755 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -262,7 +262,7 @@ public interface NetworkManager { * @throws InsufficientCapacityException * @throws ResourceUnavailableException */ - NicProfile createNicForVm(Network network, NicProfile requested, ReservationContext context, VirtualMachineProfile<? extends VMInstanceVO> vmProfile, boolean prepare, boolean alwayscreate) throws InsufficientVirtualNetworkCapcityException, + NicProfile createNicForVm(Network network, NicProfile requested, ReservationContext context, VirtualMachineProfile<? extends VMInstanceVO> vmProfile, boolean prepare) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException; http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aff919ea/server/src/com/cloud/network/NetworkManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index d1c3181..2dd6818 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -3355,7 +3355,7 @@ public class NetworkManagerImpl implements NetworkManager, Manager, Listener { } @Override - public NicProfile createNicForVm(Network network, NicProfile requested, ReservationContext context, VirtualMachineProfile<? extends VMInstanceVO> vmProfile, boolean prepare, boolean alwayscreate) + public NicProfile createNicForVm(Network network, NicProfile requested, ReservationContext context, VirtualMachineProfile<? extends VMInstanceVO> vmProfile, boolean prepare) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { @@ -3366,8 +3366,8 @@ public class NetworkManagerImpl implements NetworkManager, Manager, Listener { NicProfile nic = getNicProfileForVm(network, requested, vm); - //1) allocate nic (if needed) - if (nic == null || alwayscreate) { + //1) allocate nic (if needed) Always allocate if it is a user vm + if (nic == null || (vmProfile.getType() == VirtualMachine.Type.User)) { int deviceId = _nicDao.countNics(vm.getId()); nic = allocateNic(requested, network, false, http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aff919ea/server/src/com/cloud/vm/UserVmManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 692cf4a..e00da92 100644 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -944,6 +944,12 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager // Perform permission check on VM _accountMgr.checkAccess(caller, null, true, vmInstance); + // Verify that zone is not Basic + DataCenterVO dc = _dcDao.findById(vmInstance.getDataCenterIdToDeployIn()); + if (dc.getNetworkType() == DataCenter.NetworkType.Basic) { + throw new CloudRuntimeException("Zone " + vmInstance.getDataCenterIdToDeployIn() + ", has a NetworkType of Basic. Can't add a new NIC to a VM on a Basic Network"); + } + // Perform account permission check on network if (network.getGuestType() != Network.GuestType.Shared) { // Check account permissions @@ -975,7 +981,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager NicProfile guestNic = null; try { - guestNic = _itMgr.addUserVmToNetwork(vmInstance,_vmDao.findById(vmInstance.getId()), network, profile); + guestNic = _itMgr.addVmToNetwork(vmInstance, network, profile); } catch (ResourceUnavailableException e) { throw new CloudRuntimeException("Unable to add NIC to " + vmInstance + ": " + e); } catch (InsufficientCapacityException e) { @@ -1013,6 +1019,12 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager // Perform permission check on VM _accountMgr.checkAccess(caller, null, true, vmInstance); + // Verify that zone is not Basic + DataCenterVO dc = _dcDao.findById(vmInstance.getDataCenterIdToDeployIn()); + if (dc.getNetworkType() == DataCenter.NetworkType.Basic) { + throw new CloudRuntimeException("Zone " + vmInstance.getDataCenterIdToDeployIn() + ", has a NetworkType of Basic. Can't remove a NIC from a VM on a Basic Network"); + } + //check to see if nic is attached to VM if (nic.getInstanceId() != vmId) { throw new InvalidParameterValueException(nic + " is not a nic on " + vmInstance); @@ -1070,6 +1082,12 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager // Perform permission check on VM _accountMgr.checkAccess(caller, null, true, vmInstance); + // Verify that zone is not Basic + DataCenterVO dc = _dcDao.findById(vmInstance.getDataCenterIdToDeployIn()); + if (dc.getNetworkType() == DataCenter.NetworkType.Basic) { + throw new CloudRuntimeException("Zone " + vmInstance.getDataCenterIdToDeployIn() + ", has a NetworkType of Basic. Can't change default NIC on a Basic Network"); + } + // no need to check permissions for network, we'll enumerate the ones they already have access to Network existingdefaultnet = _networkModel.getDefaultNetworkForVm(vmId); http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aff919ea/server/src/com/cloud/vm/VirtualMachineManager.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/vm/VirtualMachineManager.java b/server/src/com/cloud/vm/VirtualMachineManager.java index 2d70166..53bd442 100644 --- a/server/src/com/cloud/vm/VirtualMachineManager.java +++ b/server/src/com/cloud/vm/VirtualMachineManager.java @@ -154,18 +154,6 @@ public interface VirtualMachineManager extends Manager { /** * @param vm - * @param network - * @param requested TODO - * @return - * @throws ConcurrentOperationException - * @throws ResourceUnavailableException - * @throws InsufficientCapacityException - */ - NicProfile addUserVmToNetwork(VirtualMachine vm,UserVmVO vmVO, Network network, NicProfile requested) throws ConcurrentOperationException, - ResourceUnavailableException, InsufficientCapacityException; - - /** - * @param vm * @param nic * @return * @throws ResourceUnavailableException http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aff919ea/server/src/com/cloud/vm/VirtualMachineManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 7ab9309..19756ad 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -2462,7 +2462,12 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene ResourceUnavailableException, InsufficientCapacityException { s_logger.debug("Adding vm " + vm + " to network " + network + "; requested nic profile " + requested); - VMInstanceVO vmVO = _vmDao.findById(vm.getId()); + VMInstanceVO vmVO; + if (vm.getType() == VirtualMachine.Type.User) { + vmVO = _userVmDao.findById(vm.getId()); + } else { + vmVO = _vmDao.findById(vm.getId()); + } ReservationContext context = new ReservationContextImpl(null, null, _accountMgr.getActiveUser(User.UID_SYSTEM), _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM)); @@ -2476,7 +2481,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene //check vm state if (vm.getState() == State.Running) { //1) allocate and prepare nic - NicProfile nic = _networkMgr.createNicForVm(network, requested, context, vmProfile, true, false); + NicProfile nic = _networkMgr.createNicForVm(network, requested, context, vmProfile, true); //2) Convert vmProfile to vmTO HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vmProfile.getVirtualMachine().getHypervisorType()); @@ -2498,55 +2503,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene } } else if (vm.getState() == State.Stopped) { //1) allocate nic - return _networkMgr.createNicForVm(network, requested, context, vmProfile, false, false); - } else { - s_logger.warn("Unable to add vm " + vm + " to network " + network); - throw new ResourceUnavailableException("Unable to add vm " + vm + " to network, is not in the right state", - DataCenter.class, vm.getDataCenterIdToDeployIn()); - } - } - - @Override - public NicProfile addUserVmToNetwork(VirtualMachine vm, UserVmVO vmVO, Network network, NicProfile requested) throws ConcurrentOperationException, - ResourceUnavailableException, InsufficientCapacityException { - - s_logger.debug("Adding vm " + vm + " to network " + network + "; requested nic profile " + requested); - ReservationContext context = new ReservationContextImpl(null, null, _accountMgr.getActiveUser(User.UID_SYSTEM), - _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM)); - - VirtualMachineProfileImpl<UserVmVO> vmProfile = new VirtualMachineProfileImpl<UserVmVO>(vmVO, null, - null, null, null); - - DataCenter dc = _configMgr.getZone(network.getDataCenterId()); - Host host = _hostDao.findById(vm.getHostId()); - DeployDestination dest = new DeployDestination(dc, null, null, host); - - //check vm state - if (vm.getState() == State.Running) { - //1) allocate and prepare nic - NicProfile nic = _networkMgr.createNicForVm(network, requested, context, vmProfile, true, true); - - //2) Convert vmProfile to vmTO - HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vmProfile.getVirtualMachine().getHypervisorType()); - VirtualMachineTO vmTO = hvGuru.implement(vmProfile); - - //3) Convert nicProfile to NicTO - NicTO nicTO = toNicTO(nic, vmProfile.getVirtualMachine().getHypervisorType()); - - //4) plug the nic to the vm - VirtualMachineGuru<UserVmVO> vmGuru = getVmGuru(vmVO); - - s_logger.debug("Plugging nic for vm " + vm + " in network " + network); - if (vmGuru.plugNic(network, nicTO, vmTO, context, dest)) { - s_logger.debug("Nic is plugged successfully for vm " + vm + " in network " + network + ". Vm is a part of network now"); - return nic; - } else { - s_logger.warn("Failed to plug nic to the vm " + vm + " in network " + network); - return null; - } - } else if (vm.getState() == State.Stopped) { - //1) allocate nic - return _networkMgr.createNicForVm(network, requested, context, vmProfile, false, true); + return _networkMgr.createNicForVm(network, requested, context, vmProfile, false); } else { s_logger.warn("Unable to add vm " + vm + " to network " + network); throw new ResourceUnavailableException("Unable to add vm " + vm + " to network, is not in the right state", http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aff919ea/server/test/com/cloud/network/MockNetworkManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java index 850d92a..c9446bb 100755 --- a/server/test/com/cloud/network/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java @@ -733,7 +733,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS */ @Override public NicProfile createNicForVm(Network network, NicProfile requested, ReservationContext context, - VirtualMachineProfile<? extends VMInstanceVO> vmProfile, boolean prepare, boolean alwayscreate) + VirtualMachineProfile<? extends VMInstanceVO> vmProfile, boolean prepare) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { // TODO Auto-generated method stub http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aff919ea/server/test/com/cloud/vm/MockVirtualMachineManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/test/com/cloud/vm/MockVirtualMachineManagerImpl.java b/server/test/com/cloud/vm/MockVirtualMachineManagerImpl.java index 403055b..862bb25 100755 --- a/server/test/com/cloud/vm/MockVirtualMachineManagerImpl.java +++ b/server/test/com/cloud/vm/MockVirtualMachineManagerImpl.java @@ -271,15 +271,6 @@ public class MockVirtualMachineManagerImpl implements VirtualMachineManager { } /* (non-Javadoc) - * @see com.cloud.vm.VirtualMachineManager#addVmToNetwork(com.cloud.vm.VirtualMachine, com.cloud.network.Network, com.cloud.vm.NicProfile) - */ - @Override - public NicProfile addUserVmToNetwork(VirtualMachine vm, UserVmVO vmVO, Network network, NicProfile requested) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { - // TODO Auto-generated method stub - return null; - } - - /* (non-Javadoc) * @see com.cloud.vm.VirtualMachineManager#removeVmFromNetwork(com.cloud.vm.VirtualMachine, com.cloud.network.Network, java.net.URI) */ @Override http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aff919ea/server/test/com/cloud/vpc/MockNetworkManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java index c55b4c0..a5a9938 100644 --- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java @@ -1127,7 +1127,7 @@ public class MockNetworkManagerImpl implements NetworkManager, NetworkService, M */ @Override public NicProfile createNicForVm(Network network, NicProfile requested, ReservationContext context, - VirtualMachineProfile<? extends VMInstanceVO> vmProfile, boolean prepare, boolean alwayscreate) + VirtualMachineProfile<? extends VMInstanceVO> vmProfile, boolean prepare) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { // TODO Auto-generated method stub http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aff919ea/test/integration/smoke/test_nic.py ---------------------------------------------------------------------- diff --git a/test/integration/smoke/test_nic.py b/test/integration/smoke/test_nic.py new file mode 100644 index 0000000..4b31b34 --- /dev/null +++ b/test/integration/smoke/test_nic.py @@ -0,0 +1,324 @@ +""" NIC tests for VM """ +import marvin +from marvin.cloudstackTestCase import * +from marvin.cloudstackAPI import * +from marvin.remoteSSHClient import remoteSSHClient +from marvin.integration.lib.utils import * +from marvin.integration.lib.base import * +from marvin.integration.lib.common import * +from nose.plugins.attrib import attr + +import signal +import sys +import time + +class Services: + def __init__(self): + self.services = { + "disk_offering":{ + "displaytext": "Small", + "name": "Small", + "disksize": 1 + }, + "account": { + "email": "[email protected]", + "firstname": "Test", + "lastname": "User", + "username": "test", + # Random characters are appended in create account to + # ensure unique username generated each time + "password": "password", + }, + # Create a small virtual machine instance with disk offering + "small": { + "displayname": "testserver", + "username": "root", # VM creds for SSH + "password": "password", + "ssh_port": 22, + "hypervisor": 'XenServer', + "privateport": 22, + "publicport": 22, + "protocol": 'TCP', + }, + "service_offerings": { + "tiny": { + "name": "Tiny Instance", + "displaytext": "Tiny Instance", + "cpunumber": 1, + "cpuspeed": 100, # in MHz + "memory": 128, # In MBs + }, + }, + "network_offering": { + "name": 'Test Network offering', + "displaytext": 'Test Network offering', + "guestiptype": 'Isolated', + "supportedservices": 'Dhcp,Dns,SourceNat,PortForwarding', + "traffictype": 'GUEST', + "availability": 'Optional', + "serviceProviderList" : { + "Dhcp": 'VirtualRouter', + "Dns": 'VirtualRouter', + "SourceNat": 'VirtualRouter', + "PortForwarding": 'VirtualRouter', + }, + }, + "network": { + "name": "Test Network", + "displaytext": "Test Network", + "acltype": "Account", + }, + # ISO settings for Attach/Detach ISO tests + "iso": { + "displaytext": "Test ISO", + "name": "testISO", + "url": "http://iso.linuxquestions.org/download/504/1819/http/gd4.tuwien.ac.at/dsl-4.4.10.iso", + # Source URL where ISO is located + "ostype": 'CentOS 5.3 (64-bit)', + "mode": 'HTTP_DOWNLOAD', # Downloading existing ISO + }, + "template": { + "displaytext": "Cent OS Template", + "name": "Cent OS Template", + "passwordenabled": True, + }, + "diskdevice": '/dev/xvdd', + # Disk device where ISO is attached to instance + "mount_dir": "/mnt/tmp", + "sleep": 60, + "timeout": 10, + #Migrate VM to hostid + "ostype": 'CentOS 5.3 (64-bit)', + # CentOS 5.3 (64-bit) + } + +class TestDeployVM(cloudstackTestCase): + + def setUp(self): + self.cleanup = [] + self.cleaning_up = 0 + + def signal_handler(signal, frame): + self.tearDown() + sys.exit(0) + + # assign the signal handler immediately + signal.signal(signal.SIGINT, signal_handler) + + try: + self.apiclient = self.testClient.getApiClient() + self.dbclient = self.testClient.getDbConnection() + self.services = Services().services + + # Get Zone, Domain and templates + domain = get_domain(self.apiclient, self.services) + zone = get_zone(self.apiclient, self.services) + self.services['mode'] = zone.networktype + + #if local storage is enabled, alter the offerings to use localstorage + #this step is needed for devcloud + if zone.localstorageenabled == True: + self.services["service_offerings"]["tiny"]["storagetype"] = 'local' + + template = get_template( + self.apiclient, + zone.id, + self.services["ostype"] + ) + # Set Zones and disk offerings + self.services["small"]["zoneid"] = zone.id + self.services["small"]["template"] = template.id + + self.services["iso"]["zoneid"] = zone.id + self.services["network"]["zoneid"] = zone.id + + # Create Account, VMs, NAT Rules etc + self.account = Account.create( + self.apiclient, + self.services["account"], + domainid=domain.id + ) + self.cleanup.insert(0, self.account) + + self.service_offering = ServiceOffering.create( + self.apiclient, + self.services["service_offerings"]["tiny"] + ) + self.cleanup.insert(0, self.service_offering) + + #################### + ### Network offering + self.network_offering = NetworkOffering.create( + self.apiclient, + self.services["network_offering"], + ) + self.cleanup.insert(0, self.network_offering) + self.network_offering.update(self.apiclient, state='Enabled') # Enable Network offering + self.services["network"]["networkoffering"] = self.network_offering.id + + ################ + ### Test Network + self.test_network = Network.create( + self.apiclient, + self.services["network"], + self.account.account.name, + self.account.account.domainid, + ) + self.cleanup.insert(0, self.test_network) + except Exception as ex: + self.debug("Exception during NIC test SETUP!: " + str(ex)) + self.assertEqual(True, False, "Exception during NIC test SETUP!: " + str(ex)) + + @attr(tags = ["devcloud", "advanced", "advancedns", "smoke", "basic", "sg"]) + def test_01_nic(self): + try: + self.virtual_machine = VirtualMachine.create( + self.apiclient, + self.services["small"], + accountid=self.account.account.name, + domainid=self.account.account.domainid, + serviceofferingid=self.service_offering.id, + mode=self.services['mode'] + ) + self.cleanup.insert(0, self.virtual_machine) + + list_vm_response = list_virtual_machines( + self.apiclient, + id=self.virtual_machine.id + ) + + self.debug( + "Verify listVirtualMachines response for virtual machine: %s" \ + % self.virtual_machine.id + ) + + self.assertEqual( + isinstance(list_vm_response, list), + True, + "Check list response returns a valid list" + ) + + self.assertNotEqual( + len(list_vm_response), + 0, + "Check VM available in List Virtual Machines" + ) + vm_response = list_vm_response[0] + + self.assertEqual( + + vm_response.id, + self.virtual_machine.id, + "Check virtual machine id in listVirtualMachines" + ) + + self.assertEqual( + vm_response.name, + self.virtual_machine.name, + "Check virtual machine name in listVirtualMachines" + ) + + self.assertEqual( + len(vm_response.nic), + 1, + "Verify we only start with one nic" + ) + + self.assertEqual( + vm_response.nic[0].isdefault, + True, + "Verify initial adapter is set to default" + ) + existing_nic_ip = vm_response.nic[0].ipaddress + existing_nic_id = vm_response.nic[0].id + + # 1. add a nic + add_response = self.virtual_machine.add_nic(self.apiclient, self.test_network.id) + + time.sleep(5) + # now go get the vm list? + + list_vm_response = list_virtual_machines( + self.apiclient, + id=self.virtual_machine.id + ) + + self.assertEqual( + len(list_vm_response[0].nic), + 2, + "Verify we have 2 NIC's now" + ) + + new_nic_id = "" + for nc in list_vm_response[0].nic: + if nc.ipaddress != existing_nic_ip: + new_nic_id = nc.id + + self.virtual_machine.update_default_nic(self.apiclient, new_nic_id) + + time.sleep(5) + + list_vm_response = list_virtual_machines( + self.apiclient, + id=self.virtual_machine.id + ) + + # iterate as we don't know for sure what order our NIC's will be returned to us. + for nc in list_vm_response[0].nic: + if nc.ipaddress == existing_nic_ip: + self.assertEqual( + nc.isdefault, + False, + "Verify initial adapter is NOT set to default" + ) + else: + self.assertEqual( + nc.isdefault, + True, + "Verify second adapter is set to default" + ) + + sawException = False + try: + self.virtual_machine.remove_nic(self.apiclient, new_nic_id) + except Exception as ex: + sawException = True + + self.assertEqual(sawException, True, "Make sure we cannot delete the default NIC") + + self.virtual_machine.remove_nic(self.apiclient, existing_nic_id) + time.sleep(5) + + list_vm_response = list_virtual_machines( + self.apiclient, + id=self.virtual_machine.id + ) + + self.assertEqual( + len(list_vm_response[0].nic), + 1, + "Verify we are back to a signle NIC" + ) + + return + except Exception as ex: + self.debug("Exception during NIC test!: " + str(ex)) + self.assertEqual(True, False, "Exception during NIC test!: " + str(ex)) + + def tearDown(self): + if self.cleaning_up == 1: + return + + self.cleaning_up = 1 + try: + for obj in self.cleanup: + try: + obj.delete(self.apiclient) + time.sleep(10) + except Exception as ex: + self.debug("Error deleting: " + str(obj) + ", exception: " + str(ex)) + + except Exception as e: + self.debug("Warning! Exception in tearDown: %s" % e) + self.cleaning_up = 0 +
