cloudstack-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jaya...@apache.org
Subject [4/4] git commit: updated refs/heads/master to 3df847d
Date Fri, 10 Jul 2015 04:20:15 GMT
CLOUDSTACK-8324: Added integration tests for dhcp dns offload feature

   This closes #568


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3df847df
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3df847df
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3df847df

Branch: refs/heads/master
Commit: 3df847dfbba01927b7efad24f4132833b7039640
Parents: 140cd7c
Author: Jayapal <jayapal@apache.org>
Authored: Wed Jul 8 15:14:46 2015 +0530
Committer: Jayapal <jayapal@apache.org>
Committed: Fri Jul 10 09:49:32 2015 +0530

----------------------------------------------------------------------
 .../component/test_dhcp_dns_offload.py          | 2126 ++++++++++++++++++
 1 file changed, 2126 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3df847df/test/integration/component/test_dhcp_dns_offload.py
----------------------------------------------------------------------
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
+


Mime
View raw message