CLOUDSTACK-8324: Added integration tests for dhcp dns offload feature
diff --git a/test/integration/component/test_dhcp_dns_offload.py b/test/integration/component/test_dhcp_dns_offload.py
new file mode 100755
index 0000000..dc44f09
--- /dev/null
+++ b/test/integration/component/test_dhcp_dns_offload.py
@@ -0,0 +1,2126 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+""" Tests for DHCP DNS offload feature
+"""
+from marvin.cloudstackTestCase import cloudstackTestCase, unittest
+from marvin.lib.utils import (random_gen, validateList, cleanup_resources, get_hypervisor_type)
+from marvin.lib.base import (Account,
+ NIC,
+ ServiceOffering,
+ DiskOffering,
+ VirtualMachine,
+ Network,
+ NetworkOffering,
+ Configurations,
+ Host,
+ Template,
+ SSHKeyPair,
+ Router)
+from marvin.lib.common import (get_zone,
+ get_template,
+ get_domain
+ )
+from nose.plugins.attrib import attr
+from marvin.codes import PASS,FAIL
+from random import randint
+import random,string,time,tempfile,os,re
+
+@unittest.skip("Skipping dhcp-dns-offload tests for now, since it requires external dhcp server")
+class TestDeployVMs(cloudstackTestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ cls.testClient = super(TestDeployVMs, cls).getClsTestClient()
+ cls.api_client = cls.testClient.getApiClient()
+ cls.services = cls.testClient.getParsedTestDataConfig()
+ cls.hypervisor = (get_hypervisor_type(cls.api_client)).lower()
+ cls._cleanup = []
+ cls.unsupportedHypervisor = False
+ if cls.hypervisor not in ["xenserver", "kvm"]:
+ cls.unsupportedHypervisor = True
+ return
+ cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
+ cls.domain = get_domain(cls.api_client)
+ cls.services['mode'] = cls.zone.networktype
+ cls.userdata = "Deploy vm with userdata in shared network"
+ cls.template = get_template(
+ cls.api_client,
+ cls.zone.id,
+ cls.services["ostype"]
+ )
+ cls.services["virtual_machine"]["zoneid"] = cls.zone.id
+ cls.services["virtual_machine"]["template"] = cls.template.id
+ try:
+ cls.service_offering = ServiceOffering.create(
+ cls.api_client,
+ cls.services["service_offering"]
+ )
+ cls._cleanup.append(cls.service_offering)
+ cls.disk_offering = DiskOffering.create(
+ cls.api_client,
+ cls.services["disk_offering"]
+ )
+ cls._cleanup.append(cls.disk_offering)
+ cls.network_offering1 = NetworkOffering.create(
+ cls.api_client,
+ cls.services["nw_off_no_services"],
+ )
+ cls._cleanup.append(cls.network_offering1)
+ # Enable Network offering
+ cls.network_offering1.update(cls.api_client, state='Enabled')
+ cls.network_offering3 = NetworkOffering.create(
+ cls.api_client,
+ cls.services["network_offering_shared"],
+ )
+ cls._cleanup.append(cls.network_offering3)
+ # Enable Network offering
+ cls.network_offering3.update(cls.api_client, state='Enabled')
+ #Create shared network without any services
+ cls.shared_network = Network.create(
+ cls.api_client,
+ cls.services["network2"],
+ networkofferingid=cls.network_offering1.id,
+ zoneid=cls.zone.id
+ )
+ cls._cleanup.append(cls.shared_network)
+ #Verify network services in a created network
+ assert TestDeployVMs.list_nw_services(cls.shared_network.id, cls.network_offering1.id),\
+ "Network Services does not match with the offering services"
+ #Register passowrd and ssh-key reset enabled template
+ template = "ssh-password-template-xen" if cls.hypervisor == "xenserver" else "ssh-password-template-kvm"
+ cls.pwd_template = Template.register(cls.api_client,
+ cls.services[template],
+ zoneid=cls.zone.id)
+ cls.pwd_template.download(cls.api_client)
+ cls._cleanup.append(cls.pwd_template)
+ except Exception as e:
+ cls.tearDownClass()
+ raise e
+ return
+
+ @classmethod
+ def tearDownClass(cls):
+ try:
+ cls._cleanup = cls._cleanup[::-1]
+ cleanup_resources(cls.api_client, cls._cleanup)
+ except Exception as e:
+ raise Exception("Warning: Exception during cleanup : %s" % e)
+
+ def setUp(self):
+ self.apiclient = self.testClient.getApiClient()
+ self.dbclient = self.testClient.getDbConnection()
+ self.cleanup = []
+ self.tmp_files = []
+ if self.unsupportedHypervisor:
+ self.skipTest("Skipping tests because suitable hypervisors not present")
+
+ def tearDown(self):
+ try:
+ self.cleanup = self.cleanup[::-1]
+ cleanup_resources(self.apiclient, self.cleanup)
+ for tmp_file in self.tmp_files:
+ os.remove(tmp_file)
+ except Exception as e:
+ raise Exception("Warning: Exception during cleanup : %s" % e)
+ return
+
+ def getVMIPAddress(self,id):
+ """
+ This method retrieves the IP address from a deployed vm.
+ """
+ params = ["externaldhcp.vmip.retrieval.interval","externaldhcp.vmip.max.retry"]
+ offload_params = {}
+ for param in params:
+ configs = Configurations.list(
+ self.apiclient,
+ name=param,
+ )
+ self.assertEqual(validateList(configs)[0],PASS,"List config returned invalid response")
+ config = configs[0]
+ offload_params[param] = config
+ max_wait = int(offload_params[params[0]].value)*int(offload_params[params[1]].value)
+ wait = 0
+ status = 0
+ while(wait <= max_wait):
+ vm_res = VirtualMachine.list(self.apiclient,id=id)
+ self.assertEqual(validateList(vm_res)[0], PASS, "vm list returned invalid response")
+ for nic in vm_res[0].nic:
+ if nic.type == "Shared":
+ if nic.ipaddress is None:
+ time.sleep(int(offload_params[params[0]].value))
+ wait += int(offload_params[params[0]].value)
+ status = 0
+ break
+ else:
+ status = 1
+ else:
+ continue
+ if status == 1:
+ self.debug("CS has retrieved the vm ip address from the hypervisor")
+ break
+ return [status, vm_res[0].nic[0].ipaddress]
+
+ def list_nics(self, vm_id):
+ list_vm_res = VirtualMachine.list(self.apiclient, id=vm_id)
+ self.assertEqual(validateList(list_vm_res)[0], PASS, "List vms returned invalid response")
+ nics = list_vm_res[0].nic
+ for nic in nics:
+ if nic.type == "Shared":
+ nic_res = NIC.list(
+ self.apiclient,
+ virtualmachineid=vm_id,
+ nicid=nic.id
+ )
+ nic_ip = nic_res[0].ipaddress
+ self.assertIsNotNone(nic_ip, "listNics API response does not have the ip address")
+ else:
+ continue
+ return
+
+ def isConfigDriveIsoAttached(self, vm_ip):
+ """
+ This method is to verify whether configdrive iso is attached to vm or not
+ Takes vm ip as the input
+ Returns mount path if config drive is attached else False
+ """
+ mountdir = "/root/iso"
+ cmd = "blkid -t LABEL='config' /dev/hd? /dev/sd? /dev/xvd? -o device"
+ try:
+ self.debug("SSH into VM: %s" % vm_ip)
+ ssh = self.vm.get_ssh_client(ipaddress=vm_ip, reconnect=True)
+ tmp_cmd = ['bash -c "if [ ! -d /root/iso ] ; then mkdir /root/iso ; fi"', "umount /root/iso"]
+ for tcmd in tmp_cmd:
+ ssh.execute(tcmd)
+ configDrive = ssh.execute(cmd)
+ res = ssh.execute("mount {} {}".format(str(configDrive[0]), mountdir))
+ if str(res).lower().find("mounting read-only") > -1:
+ self.debug("configDrive iso has been mounted at location %s" % mountdir)
+ return mountdir
+ else:
+ return False
+ except Exception as e:
+ self.debug("SSH Access failed for vm {}: Exception {}".format(vm_ip, e))
+ return False
+
+ def verifyUserData(self, vm_ip, iso_path):
+ """
+ Connect to vm and verify Userdata
+ """
+ userdata_path = iso_path+"/cloudstack/userdata/user_data.txt"
+ try:
+ self.debug("SSH into VM: %s" % vm_ip)
+ ssh = self.vm.get_ssh_client(ipaddress=vm_ip, reconnect=True)
+ cmd = "cat %s" % userdata_path
+ res = ssh.execute(cmd)
+ if str(res).lower().find(self.userdata):
+ self.debug("Userdata is found in the attached configDriveIso")
+ return True
+ else:
+ self.debug("Userdata is not found in the attached configDriveIso")
+ return False
+ except Exception as e:
+ self.debug("SSH Access failed for vm {}: Exception {}".format(vm_ip, e))
+ return False
+
+ return
+
+ def verifyPassword(self, vm_ip, iso_path):
+ password_file = iso_path+"/cloudstack/password/vm_password.txt"
+ try:
+ self.debug("SSH into VM: %s" % vm_ip)
+ ssh = self.vm.get_ssh_client(ipaddress=vm_ip, reconnect=True)
+ cmd = "cat %s" % password_file
+ res = ssh.execute(cmd)
+ if str(res).find("No such file or directory"):
+ self.debug("Password file is not found")
+ return False
+ elif str(res).lower().find("saved_password"):
+ self.debug("Reset password is not found in the attached configDriveIso")
+ return False
+ else:
+ self.debug("Reset Password is found in the attached configDriveIso")
+ return True
+ except Exception as e:
+ self.debug("SSH Access failed for vm {}: Exception {}".format(vm_ip, e))
+ return False
+ return
+
+ def verifySshKey(self, vm_ip, iso_path):
+
+ publicKey_file = iso_path+"/cloudstack/metadata/public_keys.txt"
+ try:
+ self.debug("SSH into VM: %s" % vm_ip)
+ ssh = self.vm.get_ssh_client(ipaddress=vm_ip)
+ cmd = "cat %s" % publicKey_file
+ res = ssh.execute(cmd)
+ if str(res).lower().find("saved_password"):
+ self.debug("Public Key is found in the attached configDriveIso")
+ return True
+ else:
+ self.debug("Public Key is not found in the attached configDriveIso")
+ return False
+ except Exception as e:
+ self.debug("SSH Access failed for vm {}: Exception {}".format(vm_ip, e))
+ return False
+ return
+
+ def getVMMetaData(self, vm_ip, iso_path):
+
+ metadata_dir = iso_path+"/cloudstack/metadata/"
+ try:
+ response = {}
+ self.debug("SSH into VM: %s" % vm_ip)
+ ssh = self.vm.get_ssh_client(ipaddress=vm_ip, reconnect=True)
+ vm_files = ["availability_zone.txt", "instance_id.txt", "service_offering.txt", "vm_id.txt"]
+ for file in vm_files:
+ cmd = "cat %s" % metadata_dir+file
+ res = ssh.execute(cmd)
+ response[file] = res
+ except Exception as e:
+ self.debug("SSH Access failed for vm {}: Exception {}".format(vm_ip, e))
+ return response
+
+ def verifyMetaData(self, metadata):
+
+ metadata_files = ["availability_zone.txt", "instance_id.txt", "service_offering.txt", "vm_id.txt"]
+ for mfile in metadata_files:
+ if mfile not in metadata:
+ self.fail("{} file is not found in vm metadata".format(mfile))
+ self.assertEqual(
+ str(metadata["availability_zone.txt"][0]),
+ self.zone.name,
+ "Zone name inside metadata does not match with the zone"
+ )
+ self.assertEqual(
+ str(metadata["instance_id.txt"][0]),
+ self.vm.instancename,
+ "vm name inside metadata does not match with the instance name"
+ )
+ self.assertEqual(
+ str(metadata["service_offering.txt"][0]),
+ self.vm.serviceofferingname,
+ "Service offering inside metadata does not match with the instance offering"
+ )
+ qresultset = self.dbclient.execute(
+ "select id from vm_instance where instance_name='%s';" % \
+ self.vm.instancename)
+ self.assertEqual(validateList(qresultset)[0], PASS, "sql query returned invalid response")
+ self.assertEqual(
+ metadata["vm_id.txt"][0],
+ unicode(qresultset[0][0]),
+ "vm id in metadata does not match with the vm id from cloud db"
+ )
+ return
+
+ def generate_ssh_keys(self):
+ """
+ This method generates ssh key pair and writes the private key into a temp file and returns the file name
+ """
+ self.keypair = SSHKeyPair.create(
+ self.apiclient,
+ name=random_gen() + ".pem",
+ account="admin",
+ domainid=1
+ )
+ self.debug("Created keypair with name: %s" % self.keypair.name)
+ self.debug("Writing the private key to local file")
+ keyPairFilePath = tempfile.gettempdir() + os.sep + self.keypair.name
+ self.tmp_files.append(keyPairFilePath)
+ self.debug("File path: %s" % keyPairFilePath)
+ f = open(keyPairFilePath, "w+")
+ f.write(self.keypair.privatekey)
+ f.close()
+ os.system("chmod 400 " + keyPairFilePath)
+ return keyPairFilePath
+
+ def verifyIPFetchEvent(self, ipaddr):
+
+ id = self.dbclient.execute(
+ "select instance_id,id from nics where ip4_address='%s' and removed is null;" % ipaddr
+ )
+ self.assertEqual(
+ validateList(id)[0],
+ PASS,
+ "sql query to select nic id returned invalid response"
+ )
+ qresultset = self.dbclient.execute(
+ "select description from event where type='EXTERNAL.DHCP.VM.IP.FETCH' order by id desc limit 1;"
+ )
+ self.assertEqual(
+ validateList(qresultset)[0],
+ PASS,
+ "sql query for IP Fetch event returned invalid response"
+ )
+ return True if re.search("VM %s nic id %s ip address %s got fetched successfully" % \
+ (id[0][0], id[0][1], ipaddr), str(qresultset[0])) else False
+
+ def umountConfigDrive(self, vm_ip, iso_path):
+ """umount config drive iso attached inside guest vm"""
+ try:
+ self.debug("SSH into VM: %s" % vm_ip)
+ ssh = self.vm.get_ssh_client(ipaddress=vm_ip, reconnect=True)
+ ssh.execute("umount %s" % iso_path)
+ except Exception as e:
+ self.debug("SSH access failed for vm")
+
+ @classmethod
+ def list_nw_services(cls, nw_id, nw_off_id):
+ """
+ Verify network services in a network. List of services supported should be as per the
+ network offering with which it has been created.
+ return True if created network and network offering has same services else False
+ """
+ nw_response = Network.list(cls.api_client, id = nw_id)
+ assert validateList(nw_response)[0] == PASS, "list networks returned invalid response"
+ nw_services = [service.name for service in nw_response[0].service]
+ nw_off_res = NetworkOffering.list(cls.api_client, id = nw_off_id)
+ assert validateList(nw_off_res)[0] == PASS, "list network offerings returned invalid response"
+ nw_off_services = [service.name for service in nw_off_res[0].service]
+ if len(nw_services) == len(nw_off_services) and len(nw_services) == 0:
+ return True
+ elif len(nw_services) != len(nw_off_services):
+ return False
+ for srv in nw_services:
+ if srv not in nw_off_services:
+ return False
+ return True
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_01_createNetworks_TC3(self):
+
+ """
+ Create shared networks with all the network offerings created in the setupClass method
+ """
+ nw_offs = [self.network_offering3]
+ vlan = self.services["network2"]["vlan"]
+ name = self.services["network2"]["name"]
+ for nw_off in nw_offs:
+ self.services["network2"]["name"]="SharedNetwork%s" % randint(1, 10)
+ try:
+ self.services["network2"]["vlan"] += 1
+ self.shared_network = Network.create(
+ self.apiclient,
+ self.services["network2"],
+ networkofferingid=nw_off.id,
+ zoneid=self.zone.id
+ )
+ self.cleanup.append(self.shared_network)
+ self.assertTrue(
+ TestDeployVMs.list_nw_services(self.shared_network.id, nw_off.id),
+ "Network services not matched with network offering services"
+ )
+ except Exception as e:
+ self.fail("Shared network creation with network offering %s failed with error: %s" % (nw_off, e))
+ self.services["network2"]["vlan"] = vlan
+ self.services["network2"]["name"] = name
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_02_deployVM_nw_without_services_TC6(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm in that network
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval
+ """
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "VM creation failed in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ #Verify IP address retrieval using listVirtualMachines API
+ ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ #Verify the retrieved ip address in listNICs API response
+ self.list_nics(self.vm.id)
+ #Verify config drive is attached to vm or not
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm"
+ )
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_03_deployVM_with_userdata_TC7(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with userdata in the above network
+ 3.Verify vm deployment
+ 4.Verify IP Address retrieval
+ """
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "VM creation with userdata failed in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ #Verify IP address retrieval using listVirtualMachines API
+ ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ #Verify the retrieved ip address in listNICs API response
+ self.list_nics(self.vm.id)
+ #Verify config drive is attached to vm or not
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm"
+ )
+ #Add userdata verification test
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching"
+ )
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_04_deploy_win_VM_with_userdata_TC8(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy windows vm in the above network
+ 3.Verify IP address retrieval
+ """
+ self.skipTest("Skip windows tests for now")
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.shared_network = Network.create(
+ self.apiclient,
+ self.services["network2"],
+ networkofferingid=self.network_offering1.id,
+ zoneid=self.zone.id
+ )
+ self.cleanup.append(self.shared_network)
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.win_template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "FAIL:VM Creation failed with windows template in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ self.list_nics(self.vm_id)
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_06_deployVM_with_userdata_TC11(self):
+ """
+ 1.Create shared network with DHCP,DNS and userdata services provided by VR
+ 2.Deploy vm in that network
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval
+ """
+ vlan = self.services["network2"]["vlan"]
+ self.services["network2"]["vlan"] += 1
+ self.shared_network = Network.create(
+ self.apiclient,
+ self.services["network2"],
+ networkofferingid=self.network_offering3.id,
+ zoneid=self.zone.id
+ )
+ self.cleanup.append(self.shared_network)
+ self.services["network2"]["vlan"] = vlan
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm with in a shared network with DHCP and userdata services provided by VR"
+ )
+ self.cleanup.append(self.vm)
+ ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ self.list_nics(self.vm.id)
+ #To make sure that vm got the ip address as part of the cs allocation process check user_ip_address table
+ #for allocated state for the assigned ip address
+ qresultset = self.dbclient.execute(
+ "select allocated from user_ip_address where public_ip_address='%s' and removed is null;" % \
+ self.vm.nic[0].ipaddress)
+ self.assertEqual(validateList(qresultset)[0],PASS,"sql query returned invalid response")
+ self.assertNotEqual(
+ qresultset[0],
+ 'NULL',
+ "VM didn't get ip address as part of CS IP allocation process\
+ It might have got from external dhcp server in that network")
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_07_deployVM_with_userdata_VR_TC12(self):
+ """
+ 1.Create shared network with only userdata service and VR as the provider
+ 2.Verify that network offering creation should fail
+ """
+ try:
+ self.network_offering4 = NetworkOffering.create(
+ self.api_client,
+ self.services["nw_off_userdata_VR"],
+ )
+ self.fail("NO creation with vr as the userdata provider should not be allowed\
+ since VR in not the dhcp provider")
+ except Exception as e:
+ self.debug("NO creation failed as expected with error message %s" % e)
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_09_StopStartVMAndGetVMIpAddress_TC16(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with default cent os template and pass user data
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval and userdata
+ 5.Stop start vm and repeat step4
+ """
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ self.list_nics(self.vm.id)
+ #Verify configdrive iso attach before vm stop/start
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm after vm stop start"
+ )
+ #Add userdata verification test
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching with the data passed in vm deployment"
+ )
+ #Stop/Start VM and verify the IP address retrieval
+ self.vm.stop(self.apiclient)
+ self.vm.start(self.apiclient)
+ time.sleep(60)
+ ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address after vm stop start"
+ )
+ self.list_nics(self.vm.id)
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm after vm stop start"
+ )
+ #Add userdata verification test
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching after vm stop start"
+ )
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_10_RebootVMAndGetVMIpAddress_TC17(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with default cent os template and pass user data
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval and userdata
+ 5.Reboot vm and repeat step4
+ """
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.cleanup.append(self.vm)
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm in a shared network without any services"
+ )
+ ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ self.list_nics(self.vm.id)
+ #Verify configdrive iso attach before vm reboot
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm before reboot"
+ )
+ #Add userdata verification test
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching with the data passed while deploying"
+ )
+ #Reboot VM and verify the IP address retrieval
+ self.vm.reboot(self.apiclient)
+ time.sleep(60)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address after vm reboot"
+ )
+ self.list_nics(self.vm.id)
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm after vm reboot"
+ )
+ #Add userdata verification test
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching after vm reboot"
+ )
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_11_DestroyVMAndGetVMIpAddress_TC18(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with default cent os template and pass user data
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval and userdata
+ 5.Destroy,restore vm and repeat step4
+ """
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ self.list_nics(self.vm.id)
+ #Verify configdrive iso attach before vm destroy
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm before destroy"
+ )
+ #Add userdata verification test
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching with the data passed while deploying"
+ )
+ #Destroy VM and verify the IP address retrieval
+ self.vm.delete(self.apiclient,expunge=False)
+ self.vm.recover(self.apiclient)
+ self.vm.start(self.apiclient)
+ time.sleep(60)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address after vm reboot"
+ )
+ self.list_nics(self.vm.id)
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm after vm reboot"
+ )
+ #Add userdata verification test
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching after vm reboot"
+ )
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_12_ReInstallVMAndGetVMIpAddress_TC19(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with default cent os template and pass user data
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval and userdata
+ 5.Reinstall vm to same template and repeat step4
+ """
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ self.list_nics(self.vm.id)
+ #Verify configdrive iso attach before vm reinstall
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm before reinstall"
+ )
+ #Add userdata verification test
+ self.assertEqual(
+ self.verifyUserData(ip_addr,configDrive_iso),
+ True,
+ "Userdata is not matching with the data passed while deploying"
+ )
+ #Reinstall VM and verify the IP address retrieval
+ self.vm.restore(self.apiclient)
+ time.sleep(60)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address after vm reinstall"
+ )
+ self.list_nics(self.vm.id)
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm after vm reinstall"
+ )
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching after vm reinstall"
+ )
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_13_MigrateVMAndGetVMIpAddress_TC20(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with default cent os template and pass user data
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval and userdata
+ 5.Live Migrate vm to another host in the cluster and repeat step4
+ """
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ self.list_nics(self.vm.id)
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm before live migrate"
+ )
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching with the data passed while deploying"
+ )
+ self.umountConfigDrive(ip_addr, configDrive_iso)
+ hosts = Host.listForMigration(self.apiclient,virtualmachineid=self.vm.id)
+ self.assertEqual(validateList(hosts)[0], PASS, "Find hosts for migration returned invalid response")
+ if len(hosts) < 1:
+ self.skipTest("No suitable hosts found for vm migration..so skipping test")
+ hostid = hosts[0].id
+ self.vm.migrate(self.apiclient,hostid=hostid)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address after vm live migrate"
+ )
+ self.list_nics(self.vm.id)
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm after vm live migrate"
+ )
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching after vm live migrate"
+ )
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_14_VM_with_password_enabled_template_TC24(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with password enabled template
+ 3.Verify accessing vm with the CS generated password
+ """
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.pwd_template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm in a shared network without any services with password enabled template"
+ )
+ self.cleanup.append(self.vm)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ try:
+ self.debug("SSHing into VM: %s" % ip_addr)
+ self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True)
+ except Exception as e:
+ self.fail("SSH into VM: %s failed with new password: %s" %
+ (self.vm.ssh_ip, e))
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_15_reset_password_TC27(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with password enabled template
+ 3.Reset password
+ 4.Verify accessing vm with the new password
+ """
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.pwd_template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ self.vm.stop(self.apiclient)
+ self.debug("Resetting VM password for VM: %s" % self.vm.name)
+ self.vm_password = self.vm.resetPassword(self.apiclient)
+ self.debug("Password reset to: %s" % self.vm_password)
+ self.debug("Starting VM to verify new password..")
+ self.vm.start(self.apiclient)
+ self.debug("VM - %s stated!" % self.vm.name)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ try:
+ self.debug("SSHing into VM: %s" % ip_addr)
+ self.vm.password = self.vm_password
+ self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True)
+ except Exception as e:
+ self.fail("SSH into VM: %s failed with new password: %s" %
+ (self.vm.ssh_ip, e))
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_16_deployVM_with_sshkeys_TC26(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with ssh key reset script enabled template
+ 3.Verify vm access with new keys
+ """
+ #generate key pair and get private key file name by calling below function
+ ssh_pvt_key = self.generate_ssh_keys()
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.pwd_template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ keypair=self.keypair.name
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm with ssh key pair"
+ )
+ self.cleanup.append(self.vm)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ try:
+ self.debug("SSHing into VM: %s" % ip_addr)
+ self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True, keyPairFileLocation=str(ssh_pvt_key))
+ except Exception as e:
+ self.fail("SSH into VM: %s failed with ssh key pair: %s" %
+ (self.vm.ssh_ip, e))
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_17_reset_sshkeys_TC29(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with ssh key reset script enabled template
+ 3.Reset keys
+ 4.Verify vm access with new keys
+ """
+ #generate key pair and get private key file name by calling below function
+ self.generate_ssh_keys()
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.pwd_template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ keypair=self.keypair.name
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm with ssh key pair"
+ )
+ self.cleanup.append(self.vm)
+ try:
+ self.vm.stop(self.apiclient)
+ except Exception as e:
+ self.fail("Failed to stop virtual machine %s with error %s" % (self.vm.id, e))
+ self.debug("Creating a new SSH keypair")
+ new_pvt_key = self.generate_ssh_keys()
+ try:
+ self.vm.resetSshKey(
+ self.apiclient,
+ keypair=self.keypair.name,
+ name=self.keypair.name,
+ account="admin",
+ domainid=1
+ )
+ except Exception as e:
+ self.fail("Failed to reset SSH key: %s, %s" % (self.vm.name, e))
+ self.debug("Starting the virtual machine after resetting the keypair")
+ try:
+ self.vm.start(self.apiclient)
+ except Exception as e:
+ self.fail("Failed to start virtual machine: %s, %s" % (self.vm.name, e))
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ try:
+ self.debug("SSHing into VM: %s" % ip_addr)
+ self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True, keyPairFileLocation=str(new_pvt_key))
+ except Exception as e:
+ self.fail("SSH into VM: %s failed with ssh key pair with error: %s" %
+ (self.vm.ssh_ip, e))
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_18_reset_password_verify_after_vm_restart_TC36(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with password enabled template
+ 3.Reset password
+ 4.Verify accessing vm with the new password
+ 5.Stop/Start vm and repeat step 4
+ """
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.pwd_template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ self.vm.stop(self.apiclient)
+ self.debug("Resetting VM password for VM: %s" % self.vm.name)
+ self.vm_password = self.vm.resetPassword(self.apiclient)
+ self.debug("Password reset to: %s" % self.vm_password)
+ self.debug("Starting VM to verify new password..")
+ self.vm.start(self.apiclient)
+ self.debug("VM - %s stated!" % self.vm.name)
+ ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ try:
+ self.debug("SSHing into VM: %s" % ip_addr)
+ self.vm.password = self.vm_password
+ self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True)
+ except Exception as e:
+ self.fail("SSH into VM: %s failed with new password: %s" %
+ (self.vm.ssh_ip, e))
+ #Stop start vm and verify connecting to vm with the same password
+ self.vm.stop(self.apiclient)
+ self.vm.start(self.apiclient)
+ ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
+ try:
+ self.debug("SSH into vm after stop start")
+ self.vm.password = self.vm_password
+ self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True)
+ except Exception as e:
+ self.fail("SSH into vm failed with the same password after vm stop start")
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_19_reset_sshkeys_verify_after_vm_restartTC37(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with ssh key reset script enabled template
+ 3.Reset keys
+ 4.Verify vm access with new keys
+ 5.Stop/start vm and repeat step4
+ """
+ #generate key pair and get private key file name by calling below function
+ self.generate_ssh_keys()
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.pwd_template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ keypair=self.keypair.name
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm with ssh key pair"
+ )
+ self.cleanup.append(self.vm)
+ try:
+ self.vm.stop(self.apiclient)
+ except Exception as e:
+ self.fail("Failed to stop virtual machine %s with error %s" % (self.vm.id, e))
+ self.debug("Creating a new SSH keypair")
+ new_pvt_key = self.generate_ssh_keys()
+ try:
+ self.vm.resetSshKey(
+ self.apiclient,
+ keypair=self.keypair.name,
+ name=self.keypair.name,
+ account="admin",
+ domainid=1
+ )
+ except Exception as e:
+ self.fail("Failed to reset SSH key: %s, %s" % (self.vm.name, e))
+ self.debug("Starting the virtual machine after resetting the keypair")
+ try:
+ self.vm.start(self.apiclient)
+ except Exception as e:
+ self.fail("Failed to start virtual machine: %s, %s" % (self.vm.name, e))
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ try:
+ self.debug("SSHing into VM: %s" % ip_addr)
+ self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True, keyPairFileLocation=str(new_pvt_key))
+ except Exception as e:
+ self.fail("SSH into VM: %s failed with ssh key pair with error: %s" %
+ (self.vm.ssh_ip, e))
+ self.vm.stop(self.apiclient)
+ self.vm.start(self.apiclient)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ try:
+ self.debug("SSH into vm after vm stop/start")
+ self.vm.get_ssh_client(ipaddress=ip_addr, reconnect=True, keyPairFileLocation=str(new_pvt_key))
+ except Exception as e:
+ self.fail("SSH into vm failed with new ssh keypair after vm stop start")
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_20_verify_VM_metadata_TC30(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with userdata in the above network
+ 3.Verify vm deployment
+ 4.Verify IP Address retrieval
+ 5.Verify metadata inside configdrive iso
+ """
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm with in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ self.list_nics(self.vm.id)
+ #Verify config drive is attached to vm or not
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm"
+ )
+ metadata = self.getVMMetaData(ip_addr, configDrive_iso)
+ self.verifyMetaData(metadata)
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_21_StopStartVM_verify_ConfigDrive_TC31(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with default cent os template and pass user data
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval and userdata
+ 5.Stop start vm
+ 6.Verify userdata and metadata
+ """
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ self.list_nics(self.vm.id)
+ #Verify configdrive iso attach before vm stop/start
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm before vm stop start"
+ )
+ #Add userdata verification test
+ self.assertEqual(
+ self.verifyUserData(ip_addr,configDrive_iso),
+ True,
+ "Userdata is not matching with the data passed in vm deployment"
+ )
+ metadata = self.getVMMetaData(ip_addr, configDrive_iso)
+ self.verifyMetaData(metadata)
+ #Stop/Start VM and verify IP address retrieval,userdata and metadata
+ self.vm.stop(self.apiclient)
+ self.vm.start(self.apiclient)
+ time.sleep(60)
+ ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address after vm stop start"
+ )
+ self.list_nics(self.vm.id)
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm after vm stop start"
+ )
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching after vm stop start"
+ )
+ metadata = self.getVMMetaData(ip_addr, configDrive_iso)
+ self.verifyMetaData(metadata)
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_22_RebootVM_verify_ConfigDrive_TC32(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with default cent os template and pass user data
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval,userdata and metadata
+ 5.Reboot vm
+ 6.Repeat step4
+ """
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ self.list_nics(self.vm.id)
+ #Verify configdrive iso attach before vm stop/start
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm before vm reboot"
+ )
+ #Add userdata verification test
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching with the data passed in vm deployment"
+ )
+ metadata = self.getVMMetaData(ip_addr, configDrive_iso)
+ self.verifyMetaData(metadata)
+ #Reboot VM and verify IP address retrieval,userdata and metadata
+ self.vm.reboot(self.apiclient)
+ time.sleep(60)
+ ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address after vm reboot"
+ )
+ self.list_nics(self.vm.id)
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm after vm reboot"
+ )
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching after vm reboot"
+ )
+ metadata = self.getVMMetaData(ip_addr, configDrive_iso)
+ self.verifyMetaData(metadata)
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_23_DestroyVM_verify_ConfigDrive_TC33(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with default cent os template and pass user data
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval,userdata and metadata
+ 5.Destroy and restore vm
+ 6.Repeat step4
+ """
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ self.list_nics(self.vm.id)
+ #Verify configdrive iso attach before vm stop/start
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm before vm destroy"
+ )
+ #Add userdata verification test
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching with the data passed in vm deployment"
+ )
+ metadata = self.getVMMetaData(ip_addr, configDrive_iso)
+ self.verifyMetaData(metadata)
+ #Destroy VM and verify IP address retrieval,userdata and metadata
+ self.vm.delete(self.apiclient, expunge=False)
+ self.vm.recover(self.apiclient)
+ self.vm.start(self.apiclient)
+ time.sleep(60)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address after vm destroy"
+ )
+ self.list_nics(self.vm.id)
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm after vm destroy"
+ )
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching after vm destroy"
+ )
+ metadata = self.getVMMetaData(ip_addr, configDrive_iso)
+ self.verifyMetaData(metadata)
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_24_ReInstallVM_verify_ConfigDrive_TC34(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with default cent os template and pass user data
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval,userdata and metadata
+ 5.Reinstall vm to the same template
+ 6.Repeat step4
+ """
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ self.list_nics(self.vm.id)
+ #Verify configdrive iso attach before vm stop/start
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm before vm reinstall"
+ )
+ #Add userdata verification test
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching with the data passed in vm reinstall"
+ )
+ metadata = self.getVMMetaData(ip_addr, configDrive_iso)
+ self.verifyMetaData(metadata)
+ #Reinstall VM and verify the IP address retrieval
+ self.vm.restore(self.apiclient)
+ time.sleep(60)
+ ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address after vm reinstall"
+ )
+ self.list_nics(self.vm.id)
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm after vm reinstall"
+ )
+ self.assertEqual(
+ self.verifyUserData(ip_addr,configDrive_iso),
+ True,
+ "Userdata is not matching after vm reinstall"
+ )
+ metadata = self.getVMMetaData(ip_addr, configDrive_iso)
+ self.verifyMetaData(metadata)
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_25_MigrateVMVM_verify_ConfigDrive_TC35(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm with default cent os template and pass user data
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval,userdata and metadata
+ 5.Migrate VM and Repeat step4
+ """
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ diskofferingid=self.disk_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "Failed to create vm in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ self.list_nics(self.vm.id)
+ #Verify configdrive iso attach before vm stop/start
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm before vm reinstall"
+ )
+ #Add userdata verification test
+ self.assertEqual(
+ self.verifyUserData(ip_addr, configDrive_iso),
+ True,
+ "Userdata is not matching with the data passed in vm reinstall"
+ )
+ metadata = self.getVMMetaData(ip_addr, configDrive_iso)
+ self.verifyMetaData(metadata)
+ #Migrate VM and verify ip address retrieval,userdata and metadata
+ hosts = Host.listForMigration(self.apiclient,virtualmachineid=self.vm.id)
+ self.assertEqual(validateList(hosts)[0], PASS, "Find hosts for migration returned invalid response")
+ if len(hosts) < 1:
+ self.skipTest("No suitable hosts found for vm migration..so skipping test")
+ hostid = hosts[0].id
+ self.umountConfigDrive(ip_addr, configDrive_iso)
+ self.vm.migrate(self.apiclient, hostid=hostid)
+ time.sleep(60)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address after vm reinstall"
+ )
+ self.list_nics(self.vm.id)
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm after vm reinstall"
+ )
+ self.assertEqual(
+ self.verifyUserData(ip_addr,configDrive_iso),
+ True,
+ "Userdata is not matching after vm reinstall"
+ )
+ metadata = self.getVMMetaData(ip_addr, configDrive_iso)
+ self.verifyMetaData(metadata)
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_26_DeployVM_verify_IPFetchEvent_TC56(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm in that network
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval
+ 5.Verify EXTERNAL.DHCP.VM.IP.FETCH event after IP address retrieval
+ """
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "VM creation failed in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ #Verify IP address retrieval using listVirtualMachines API
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ #Verify the retrieved ip address in listNICs API response
+ self.list_nics(self.vm.id)
+ #Verify config drive is attached to vm or not
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm"
+ )
+ #Verify EXTERNAL.DHCP.VM.IP.FETCH event from DB
+ self.assertEqual(
+ self.verifyIPFetchEvent(ip_addr),
+ True,
+ "EXTERNAL.DHCP.VM.IP.FETCH is not generated"
+ )
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_27_StopStartVM_verify_IPFetchEvent_TC57(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm in that network
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval
+ 5.Verify EXTERNAL.DHCP.VM.IP.FETCH event after IP address retrieval
+ 6.Stop/Start vm and repeat step5
+ """
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "VM creation failed in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ #Verify IP address retrieval using listVirtualMachines API
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ #Verify the retrieved ip address in listNICs API response
+ self.list_nics(self.vm.id)
+ #Verify EXTERNAL.DHCP.VM.IP.FETCH event from DB
+ self.assertEqual(
+ self.verifyIPFetchEvent(ip_addr),
+ True,
+ "EXTERNAL.DHCP.VM.IP.FETCH is not generated"
+ )
+ #Stop/Start VM and verify IP address retrieval,event notification
+ self.vm.stop(self.apiclient)
+ self.vm.start(self.apiclient)
+ time.sleep(60)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address after vm stop start"
+ )
+ #Verify EXTERNAL.DHCP.VM.IP.FETCH event from DB
+ self.assertEqual(
+ self.verifyIPFetchEvent(ip_addr),
+ True,
+ "EXTERNAL.DHCP.VM.IP.FETCH is not generated"
+ )
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_28_RebootVM_verify_IPFetchEvent_TC58(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm in that network
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval
+ 5.Verify EXTERNAL.DHCP.VM.IP.FETCH event after IP address retrieval
+ 6.Reboot vm and repeat step5
+ """
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "VM creation failed in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ #Verify IP address retrieval using listVirtualMachines API
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ #Verify the retrieved ip address in listNICs API response
+ self.list_nics(self.vm.id)
+ #Verify EXTERNAL.DHCP.VM.IP.FETCH event from DB
+ self.assertEqual(
+ self.verifyIPFetchEvent(ip_addr),
+ True,
+ "EXTERNAL.DHCP.VM.IP.FETCH is not generated"
+ )
+ #Reboot VM and verify IP address retrieval,event notification
+ self.vm.reboot(self.apiclient)
+ time.sleep(60)
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address after vm stop start"
+ )
+ #Verify EXTERNAL.DHCP.VM.IP.FETCH event from DB
+ self.assertEqual(
+ self.verifyIPFetchEvent(ip_addr),
+ True,
+ "EXTERNAL.DHCP.VM.IP.FETCH is not generated"
+ )
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_29_deployVM_In_Two_Networks_TC49(self):
+ """
+ 1.Create shared network without any services
+ 2.Create isolated network with VR as the service provider
+ 2.Deploy vm in both the networks
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval
+ 5.Verify metadata
+ """
+ self.no_isolate = NetworkOffering.create(
+ self.apiclient,
+ self.services["isolated_network_offering"]
+ )
+ self.no_isolate.update(self.apiclient, state='Enabled')
+ self.isolated_network = Network.create(
+ self.apiclient,
+ self.services["network"],
+ networkofferingid=self.no_isolate.id,
+ zoneid=self.zone.id,
+ accountid="admin",
+ domainid=1
+ )
+ self.cleanup.append(self.isolated_network)
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id, self.isolated_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "VM creation failed in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ #Verify IP address retrieval using listVirtualMachines API
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ #Verify the retrieved ip address in listNICs API response
+ self.list_nics(self.vm.id)
+ #Verify config drive is attached to vm or not
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm"
+ )
+ metadata = self.getVMMetaData(ip_addr, configDrive_iso)
+ self.verifyMetaData(metadata)
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_30_deployVM_In_Two_Networks_TC50(self):
+ """
+ 1.Create shared network without any services
+ 2.Create another shared network with VR as the service provider
+ 2.Deploy vm in both the networks
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval
+ 5.Verify metadata
+ """
+ self.services["shared_network_offering_all_services"]["specifyVlan"]="True"
+ self.services["shared_network_offering_all_services"]["specifyIpRanges"]="True"
+ self.no_shared_vr = NetworkOffering.create(
+ self.apiclient,
+ self.services["shared_network_offering_all_services"]
+ )
+ self.no_shared_vr.update(self.apiclient, state='Enabled')
+ self.services["shared_network"]["vlan"] = self.services["vlan"]
+ self.services["shared_network"]["gateway"] = self.services["gateway"]
+ self.services["shared_network"]["netmask"] = self.services["netmask"]
+ self.services["shared_network"]["startip"] = self.services["startip"]
+ self.services["shared_network"]["endip"] = self.services["endip"]
+ self.shared_network2 = Network.create(
+ self.apiclient,
+ self.services["shared_network"],
+ networkofferingid=self.no_shared_vr.id,
+ zoneid=self.zone.id,
+ accountid="admin",
+ domainid=1
+ )
+ self.cleanup.append(self.shared_network2)
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id, self.shared_network2.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "VM creation failed in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ #Verify IP address retrieval using listVirtualMachines API
+ ip_status,ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ #Verify the retrieved ip address in listNICs API response
+ self.list_nics(self.vm.id)
+ #Verify config drive is attached to vm or not
+ configDrive_iso = self.isConfigDriveIsoAttached(ip_addr)
+ self.assertNotEqual(
+ configDrive_iso,
+ False,
+ "Config drive iso is not attached to vm"
+ )
+ metadata = self.getVMMetaData(ip_addr, configDrive_iso)
+ self.verifyMetaData(metadata)
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_31_deployVM_with_userdataByVR_TC38(self):
+ """
+ 1.Create shared network with userdata service and VR as the provider
+ 2.Deploy vm with userdata in the above network
+ 3.Verify vm deployment
+ 4.Verify IP Address retrieval
+ """
+ self.skipTest("this combination is not supported")
+ self.services["virtual_machine"]["userdata"] = self.userdata
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "VM creation with userdata failed in a shared network with VR as the provider"
+ )
+ self.cleanup.append(self.vm)
+ #Verify IP address retrieval using listVirtualMachines API
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ #Verify the retrieved ip address in listNICs API response
+ self.list_nics(self.vm.id)
+ vr_res = Router.list(
+ self.apiclient,
+ networkid=self.shared_network.id,
+ listAll=True
+ )
+ self.assertEqual(validateList(vr_res)[0],PASS,"List Routers returned invalid response")
+ vr_ip = vr_res[0].guestipaddress
+ ssh = self.vm.get_ssh_client(ipaddress=ip_addr)
+ cmd = "curl http://%s/latest/user-data" % vr_ip
+ res = ssh.execute(cmd)
+ self.assertEqual(
+ str(res),
+ self.userdata,
+ "Failed to get the userdata from VR in shared network"
+ )
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_32_restart_network_TC6(self):
+ """
+ 1.Create shared network without any services
+ 2.Deploy vm in that network
+ 3.Verify vm deployment
+ 4.Verify IP address retrieval
+ 5.Restart network and verify access to VM
+ """
+ self.vm = VirtualMachine.create(
+ self.apiclient,
+ self.services["virtual_machine"],
+ templateid=self.template.id,
+ accountid="admin",
+ domainid=1,
+ serviceofferingid=self.service_offering.id,
+ zoneid=self.zone.id,
+ networkids=[self.shared_network.id],
+ )
+ self.assertIsNotNone(
+ self.vm,
+ "VM creation failed in a shared network without any services"
+ )
+ self.cleanup.append(self.vm)
+ #Verify IP address retrieval using listVirtualMachines API
+ ip_status, ip_addr = self.getVMIPAddress(self.vm.id)
+ self.assertEqual(
+ ip_status,
+ 1,
+ "Failed to retrieve vm ip address"
+ )
+ #Verify the retrieved ip address in listNICs API response
+ self.list_nics(self.vm.id)
+ res = self.shared_network.restart(self.apiclient, cleanup=True)
+ if res.success:
+ self.assertEqual(
+ res.success,
+ True,
+ "Failed to restart shared network without any services"
+ )
+ else:
+ self.fail("Failed restarting shared network without any services")
+ return
+
+ @attr(tags=["advanced"], required_hardware='True')
+ def test_33_verify_config_params_TC65(self):
+ """
+ #@desc: Validate external dhcp config parameters against invalid values
+ #1.Generate random values using special characters, strings and numbers
+ #2.Try to update the config params with those values.
+ #3.Verify that invalid values are not allowed
+ """
+ params = ["externaldhcp.vmip.retrieval.interval","externaldhcp.vmip.max.retry",\
+ "externaldhcp.vmipFetch.threadPool.max"]
+ for param in params:
+ random_num = ''.join(random.choice(string.digits + string.punctuation + string.ascii_letters) \
+ for _ in range(3))
+ try:
+ Configurations.update(
+ self.apiclient,
+ name=param,
+ value=random_num
+ )
+ self.fail("FAIL:{} takes invalid value".format(param))
+ except Exception as e:
+ self.debug("Success: Updating dhcp config params with invalid values is not allowed\
+ and throws following message: %s" % e)
+ return
+