# 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.

# Import Local Modules
from marvin.cloudstackTestCase import cloudstackTestCase
import unittest
from marvin.lib.utils import cleanup_resources, validateList
from marvin.lib.base import (Account,
                             ServiceOffering,
                             NetworkOffering,
                             Network,
                             VirtualMachine,
                             SecurityGroup,
                             DiskOffering,
                             Resources,
                             Iso,
                             Configurations,
                             SSHKeyPair,
                             Volume,
                             VmSnapshot,
                             Zone,
                             Template,
                             Host)
from marvin.lib.common import (get_zone,
                               get_template,
                               get_domain,
                               find_storage_pool_type)
from marvin.codes import PASS
from marvin.sshClient import SshClient
from nose.plugins.attrib import attr
import time
from marvin.cloudstackException import CloudstackAPIException

class TestListInstances(cloudstackTestCase):
    @classmethod
    def setUpClass(cls):
        try:
            cls._cleanup = []
            cls.testClient = super(TestListInstances, cls).getClsTestClient()
            cls.api_client = cls.testClient.getApiClient()
            cls.services = cls.testClient.getParsedTestDataConfig()
            cls.hypervisor = cls.testClient.getHypervisorInfo()
            # Get Domain, Zone, Template
            cls.domain = get_domain(cls.api_client)
            cls.zone = get_zone(
                cls.api_client,
                cls.testClient.getZoneForTests())
            cls.template = get_template(
                cls.api_client,
                cls.zone.id,
                cls.services["ostype"]
            )
            if cls.zone.localstorageenabled:
                cls.storagetype = 'local'
                cls.services["service_offerings"][
                    "tiny"]["storagetype"] = 'local'
                cls.services["disk_offering"]["storagetype"] = 'local'
            else:
                cls.storagetype = 'shared'
                cls.services["service_offerings"][
                    "tiny"]["storagetype"] = 'shared'
                cls.services["disk_offering"]["storagetype"] = 'shared'

            cls.services['mode'] = cls.zone.networktype
            cls.services["virtual_machine"]["hypervisor"] = cls.hypervisor
            cls.services["virtual_machine"]["zoneid"] = cls.zone.id
            cls.services["virtual_machine"]["template"] = cls.template.id
            cls.services["custom_volume"]["zoneid"] = cls.zone.id
            # Creating Disk offering, Service Offering and Account
            cls.disk_offering = DiskOffering.create(
                cls.api_client,
                cls.services["disk_offering"]
            )
            cls.service_offering = ServiceOffering.create(
                cls.api_client,
                cls.services["service_offerings"]["tiny"]
            )
            cls._cleanup.append(cls.service_offering)
            cls._cleanup.append(cls.disk_offering)
        except Exception as e:
            cls.tearDownClass()
            raise Exception("Warning: Exception in setup : %s" % e)
        return

    def setUp(self):

        self.apiClient = self.testClient.getApiClient()
        self.account = Account.create(
            self.apiClient,
            self.services["account"],
            domainid=self.domain.id
        )
        # Getting authentication for user in newly created Account
        self.user = self.account.user[0]
        self.userapiclient = self.testClient.getUserApiClient(
            self.user.username,
            self.domain.name)
        # Updating resource Limits
        for i in range(0, 12):
            Resources.updateLimit(
                self.api_client,
                account=self.account.name,
                domainid=self.domain.id,
                max=-1,
                resourcetype=i
            )

        self.cleanup = [self.account, ]

    def tearDown(self):
        # Clean up, terminate the created resources
        cleanup_resources(self.apiClient, self.cleanup)
        return

    @classmethod
    def tearDownClass(cls):
        try:
            cleanup_resources(cls.api_client, cls._cleanup)
        except Exception as e:
            raise Exception("Warning: Exception during cleanup : %s" % e)

        return

    def __verify_values(self, expected_vals, actual_vals):
        """
        @Desc: Function to verify expected and actual values
        @Steps:
        Step1: Initializing return flag to True
        Step1: Verifying length of expected and actual dictionaries is matching
               If not matching returning false
        Step2: Listing all the keys from expected dictionary
        Step3: Looping through each key from step2 and verifying expected and
               actual dictionaries have same value
               If not making return flag to False
        Step4: returning the return flag after all the values are verified
        """
        return_flag = True

        if len(expected_vals) != len(actual_vals):
            return False

        keys = list(expected_vals.keys())
        for i in range(0, len(expected_vals)):
            exp_val = expected_vals[keys[i]]
            act_val = actual_vals[keys[i]]
            if exp_val == act_val:
                return_flag = return_flag and True
            else:
                return_flag = return_flag and False
                self.debug(
                    "expected Value: %s, is not matching with\
                            actual value: %s" %
                    (exp_val, act_val))
        return return_flag

    @attr(tags=["advanced", "basic"], required_hardware="false")
    def test_01_list_instances_pagination(self):
        """
        @Desc: Test List Instances pagination
        @Steps:
        Step1: Listing all the Instances for a user
        Step2: Verifying listed Instances for account created at class level
        Step3: If number of volumes is less than
                (page size + 1), then creating them
        Step4: Listing all the volumes again after creation of volumes
        Step5: Verifying the length of the volumes is (page size + 1)
        Step6: Listing all the volumes in page1
        Step7: Verifying that the length of the volumes in page 1 is
               (page size)
        Step8: Listing all the volumes in page2
        Step9: Verifying that the length of the volumes in page 2 is 1
        Step10: Deleting the volume present in page 2
        Step11: Listing for the volumes on page 2
        Step12: Verifying that there are no volumes present in page 2
        """
        # Listing all the instances for a user
        list_instances_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"])

        # Verifying listed instances for account created at class level
        self.assertIsNone(
            list_instances_before,
            "Virtual Machine already exists for newly created user"
        )
        # If number of instances are less than (pagesize + 1), then creating
        # them
        for i in range(0, (self.services["pagesize"] + 1)):
            vm_created = VirtualMachine.create(
                self.userapiclient,
                self.services["virtual_machine"],
                accountid=self.account.name,
                domainid=self.account.domainid,
                serviceofferingid=self.service_offering.id,
            )
            self.assertIsNotNone(
                vm_created,
                "VM creation failed"
            )

            self.assertEqual(
                self.services["virtual_machine"]["displayname"],
                vm_created.displayname,
                "Newly created VM name and the test data VM name\
                        are not matching")

        # Listing all the instances again after creating VM's
        list_instances_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"])
        status = validateList(list_instances_after)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of instances after creation failed"
        )
        # Verifying the length of the instances is (page size + 1)
        self.assertEqual(
            len(list_instances_after),
            (self.services["pagesize"] + 1),
            "Number of instances created is not matching as expected"
        )

        # Listing all the volumes in page1
        list_instances_page1 = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid
        )
        status = validateList(list_instances_page1)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of instances in page1 failed"
        )
        # Verifying that the length of the instances in page 1 is (page size)
        self.assertEqual(
            self.services["pagesize"],
            len(list_instances_page1),
            "List VM response is not matching with the page size\
                    length for page 1")

        # Listing all the VM's in page2
        list_instances_page2 = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=2,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid
        )
        status = validateList(list_instances_page2)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of instances in page2 failed"
        )
        # Verifying that the length of the VM's in page 2 is 1
        self.assertEqual(
            1,
            len(list_instances_page2),
            "List VM response is not matching with the\
                    page size length for page 2"
        )
        instance_page2 = list_instances_page2[0]

        # Verifying that the VM on page 2 is not present in page1
        for i in range(0, len(list_instances_page1)):
            instance_page1 = list_instances_page1[i]
            self.assertNotEqual(
                instance_page2.id,
                instance_page1.id,
                "VM listed in page 2 is also listed in page 1"
            )

        # Deleting a single VM
        VirtualMachine.delete(vm_created, self.apiClient, expunge=True)

        # Listing the VM's in page 2
        list_instance_response = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=2,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid
        )
        # verifying that VM does not exists on page 2
        self.assertEqual(
            list_instance_response,
            None,
            "VM was not deleted"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="false")
    def test_02_list_Running_vm(self):
        """
        @Desc: Test List Running VM's
        @Steps:
        Step1: Listing all the Running VMs for a user
        Step2: Verifying that the size of the list is 0
        Step3: Deploying a VM
        Step4: Listing all the Running VMs for a user again
        Step5: Verifying that the size of the list is increased by 1
        Step6: Verifying that the details of the Running VM listed are
               same as the VM deployed in Step3
        """
        # Listing all the Running VM's for a User
        list_running_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            state="Running"
        )
        self.assertIsNone(
            list_running_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the Running VM's for a User
        list_running_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            state="Running"
        )
        status = validateList(list_running_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "Newly created VM is not in Running state"
        )
        # Verifying list size is 1
        self.assertEqual(
            1,
            len(list_running_vms_after),
            "Running VM list count is not matching"
        )
        running_vm = list_running_vms_after[0]

        # Creating expected and actual values dictionaries
        expected_dict = {
            "id": vm_created.id,
            "name": vm_created.name,
            "displayname": vm_created.displayname,
            "state": "Running",
            "zoneid": vm_created.zoneid,
            "account": vm_created.account,
            "template": vm_created.templateid
        }
        actual_dict = {
            "id": running_vm.id,
            "name": running_vm.name,
            "displayname": running_vm.displayname,
            "state": running_vm.state,
            "zoneid": running_vm.zoneid,
            "account": running_vm.account,
            "template": running_vm.templateid
        }
        running_vm_status = self.__verify_values(
            expected_dict,
            actual_dict
        )
        self.assertEqual(
            True,
            running_vm_status,
            "Listed Running VM details are not as expected"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="false")
    def test_03_list_Stopped_vm(self):
        """
        @Desc: Test List Stopped VM's
        @Steps:
        Step1: Listing all the Stopped VMs for a user
        Step2: Verifying that the size of the list is 0
        Step3: Deploying a VM
        Step4: Stopping the VM deployed in step3
        Step5: Listing all the Stopped VMs for a user again
        Step6: Verifying that the size of the list is increased by 1
        Step7: Verifying that the details of the Stopped VM listed are
               same as the VM stopped in Step4
        """
        # Listing all the Stopped VM's for a User
        list_stopped_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            state="Stopped"
        )
        self.assertIsNone(
            list_stopped_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Stopping the VM
        VirtualMachine.stop(vm_created, self.userapiclient)
        # Listing all the Stopped VM's for a User
        list_stopped_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            state="Stopped"
        )
        status = validateList(list_stopped_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "Stopped VM is not in Stopped state"
        )
        # Verifying list size is 1
        self.assertEqual(
            1,
            len(list_stopped_vms_after),
            "Stopped VM list count is not matching"
        )
        stopped_vm = list_stopped_vms_after[0]
        # Creating expected and actual values dictionaries
        expected_dict = {
            "id": vm_created.id,
            "name": vm_created.name,
            "displayname": vm_created.displayname,
            "state": "Stopped",
            "zoneid": vm_created.zoneid,
            "account": vm_created.account,
            "template": vm_created.templateid
        }
        actual_dict = {
            "id": stopped_vm.id,
            "name": stopped_vm.name,
            "displayname": stopped_vm.displayname,
            "state": stopped_vm.state,
            "zoneid": stopped_vm.zoneid,
            "account": stopped_vm.account,
            "template": stopped_vm.templateid
        }
        stopped_vm_status = self.__verify_values(
            expected_dict,
            actual_dict
        )
        self.assertEqual(
            True,
            stopped_vm_status,
            "Listed Stopped VM details are not as expected"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="false")
    def test_04_list_Destroyed_vm(self):
        """
        @Desc: Test List Destroyed VM's
        @Steps:
        Step1: Listing all the Destroyed VMs for a user
        Step2: Verifying that the size of the list is 0
        Step3: Deploying a VM
        Step4: Destroyed the VM deployed in step3
        Step5: Listing all the Destroyed VMs for a user again
        Step6: Verifying that destroyed VM is not listed for User
        Step7: Listing all the destroyed VMs as admin
        Step8: Verifying that the size of the list is 1
        Step9: Verifying that the details of the Destroyed VM listed
                are same as the VM destroyed in Step4
        """
        # Listing all the Destroyed VM's for a User
        list_destroyed_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            state="Destroyed"
        )
        self.assertIsNone(
            list_destroyed_vms_before,
            "Virtual Machine in Destroyed state already exists\
                    for newly created user")
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Destroying the VM
        VirtualMachine.delete(vm_created, self.userapiclient, expunge=False)
        # Listing all the Destroyed VM's for a User
        list_destroyed_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            state="Destroyed"
        )
        self.assertIsNone(
            list_destroyed_vms_after,
            "Destroyed VM is not in destroyed state"
        )
        # Listing destroyed VMs as admin user
        list_destroyed_vms_admin = VirtualMachine.list(
            self.apiClient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            state="Destroyed",
            id=vm_created.id
        )
        status = validateList(list_destroyed_vms_admin)
        self.assertEqual(
            PASS,
            status[0],
            "Destroyed VM is not in Destroyed state"
        )
        # Verifying that the length of the destroyed VMs list should be 1
        self.assertEqual(
            1,
            len(list_destroyed_vms_admin),
            "Destroyed VM list count is not matching"
        )
        destroyed_vm = list_destroyed_vms_admin[0]
        # Creating expected and actual values dictionaries
        expected_dict = {
            "id": vm_created.id,
            "name": vm_created.name,
            "displayname": vm_created.displayname,
            "state": "Destroyed",
            "zoneid": vm_created.zoneid,
            "account": vm_created.account,
            "template": vm_created.templateid
        }
        actual_dict = {
            "id": destroyed_vm.id,
            "name": destroyed_vm.name,
            "displayname": destroyed_vm.displayname,
            "state": destroyed_vm.state,
            "zoneid": destroyed_vm.zoneid,
            "account": destroyed_vm.account,
            "template": destroyed_vm.templateid
        }
        destroyed_vm_status = self.__verify_values(
            expected_dict,
            actual_dict
        )
        self.assertEqual(
            True,
            destroyed_vm_status,
            "Listed Destroyed VM details are not as expected"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="false")
    def test_05_list_vm_by_id(self):
        """
        @Desc: Test List VM by Id
        @Steps:
        Step1: Listing all the VMs for a user
        Step2: Verifying that the size of the list is 0
        Step3: Deploying a VM
        Step4: Listing all the VMs for a user again
        Step5: Verifying that the size of the list is increased by 1
        Step6: List a VM by specifying the Id if the VM deployed in Step3
        Step7: Verifying that the details of the Listed VM are same as
               the VM deployed in Step3
        """
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            account=self.account.name
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the VM's for a User
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            account=self.account.name
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of VM after creation failed"
        )
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Listing a VM by Id
        list_vm_byid = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            id=vm_created.id
        )
        status = validateList(list_vm_byid)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of VM by Id failed"
        )
        listed_vm = list_vm_byid[0]
        # Creating expected and actual values dictionaries
        expected_dict = {
            "id": vm_created.id,
            "name": vm_created.name,
            "displayname": vm_created.displayname,
            "state": vm_created.state,
            "zoneid": vm_created.zoneid,
            "account": vm_created.account,
            "template": vm_created.templateid
        }
        actual_dict = {
            "id": listed_vm.id,
            "name": listed_vm.name,
            "displayname": listed_vm.displayname,
            "state": listed_vm.state,
            "zoneid": listed_vm.zoneid,
            "account": listed_vm.account,
            "template": listed_vm.templateid
        }
        list_vm_status = self.__verify_values(
            expected_dict,
            actual_dict
        )
        self.assertEqual(
            True,
            list_vm_status,
            "Listed VM by Id details are not as expected"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="false")
    def test_06_list_vm_by_name(self):
        """
        @Desc: Test List VM's by Name
        @Steps:
        Step1: Listing all the VMs for a user
        Step2: Verifying that the size of the list is 0
        Step3: Deploying a 2 VM's
        Step4: Listing all the VMs for a user again
        Step5: Verifying that list size is increased by 2
        Step6: Listing the VM by specifying complete name of
               VM-1 created in step3
        Step7: Verifying that the size of the list is 1
        Step8: Verifying that the details of the listed VM are same as the
               VM-1 created in step3
        Step9: Listing the VM by specifying the partial name of VM
        Step10: Verifying that the size of the list is 2
        """
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        vms = {}
        for i in range(0, 2):
            # Deploying a VM
            vm_created = VirtualMachine.create(
                self.userapiclient,
                self.services["virtual_machine"],
                accountid=self.account.name,
                domainid=self.account.domainid,
                serviceofferingid=self.service_offering.id,
            )
            self.assertIsNotNone(
                vm_created,
                "VM creation failed"
            )
            vms.update({i: vm_created})

        # Listing all the VM's for a User
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM's creation failed"
        )
        self.assertEqual(
            2,
            len(list_vms_after),
            "VM's list count is not matching"
        )
        # Listing the VM by complete name
        list_vm_byfullname = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            name=vms[0].name
        )
        status = validateList(list_vm_byfullname)
        self.assertEqual(
            PASS,
            status[0],
            "Failed to list VM by Name"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vm_byfullname),
            "VM list by full name count is not matching"
        )
        # Verifying that the details of the listed VM are same
        # as the VM created above
        # Creating expected and actual values dictionaries
        expected_dict = {
            "id": vms[0].id,
            "name": vms[0].name,
            "displayname": vms[0].displayname,
            "state": vms[0].state,
            "zoneid": vms[0].zoneid,
            "account": vms[0].account,
            "template": vms[0].templateid
        }
        actual_dict = {
            "id": list_vm_byfullname[0].id,
            "name": list_vm_byfullname[0].name,
            "displayname": list_vm_byfullname[0].displayname,
            "state": list_vm_byfullname[0].state,
            "zoneid": list_vm_byfullname[0].zoneid,
            "account": list_vm_byfullname[0].account,
            "template": list_vm_byfullname[0].templateid
        }
        list_vm_status = self.__verify_values(
            expected_dict,
            actual_dict
        )
        self.assertEqual(
            True,
            list_vm_status,
            "Listed VM details are not as expected"
        )
        # Listing the VM by partial name
        list_vm_bypartialname = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            domainid=self.account.domainid,
            name=vms[0].name[:1]
        )
        status = validateList(list_vm_bypartialname)
        self.assertEqual(
            PASS,
            status[0],
            "Failed to list VM by Name"
        )
        # Verifying that the size of the list is 2
        self.assertEqual(
            2,
            len(list_vm_bypartialname),
            "VM list by full name count is not matching"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="false")
    def test_07_list_vm_by_name_state(self):
        """
        @Desc: Test List VM's by Name and State
        @Steps:
        Step1: Listing all the VMs for a user
        Step2: Verifying that the size of the list is 0
        Step3: Deploying a VM
        Step4: Listing all the VMs for a user again
        Step5: Verifying that list size is increased by 1
        Step6: Listing the VM by specifying name of VM created in step3 and
               state as Running (matching name and state)
        Step7: Verifying that the size of the list is 1
        Step8: Verifying that the details of the listed VM are same as
               the VM created in step3
        Step9: Listing the VM by specifying name of VM created in step3
               and state as Stopped (non matching state)
        Step10: Verifying that the size of the list is 0
        Step11: Listing the VM by specifying non matching name and
                state as Running (non matching name)
        Step12: Verifying that the size of the list is 0
        """
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the VM's for a User
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM's creation failed"
        )
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM's list count is not matching"
        )
        # Listing the VM by matching Name and State
        list_running_vm = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            name=vm_created.name,
            state="Running"
        )
        status = validateList(list_running_vm)
        self.assertEqual(
            PASS,
            status[0],
            "List VM by name and state failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_running_vm),
            "Count of VM list by name and state is not matching"
        )
        # Verifying that the details of the listed VM are same
        # as the VM created above
        # Creating expected and actual values dictionaries
        expected_dict = {
            "id": vm_created.id,
            "name": vm_created.name,
            "displayname": vm_created.displayname,
            "state": "Running",
            "zoneid": vm_created.zoneid,
            "account": vm_created.account,
            "template": vm_created.templateid
        }
        actual_dict = {
            "id": list_running_vm[0].id,
            "name": list_running_vm[0].name,
            "displayname": list_running_vm[0].displayname,
            "state": list_running_vm[0].state,
            "zoneid": list_running_vm[0].zoneid,
            "account": list_running_vm[0].account,
            "template": list_running_vm[0].templateid
        }
        list_vm_status = self.__verify_values(
            expected_dict,
            actual_dict
        )
        self.assertEqual(
            True,
            list_vm_status,
            "Listed VM details are not as expected"
        )
        # Listing the VM by matching name and non matching state
        list_running_vm = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            name=vm_created.name,
            state="Stopped"
        )
        self.assertIsNone(
            list_running_vm,
            "Listed VM with non matching state"
        )
        # Listing the VM by non matching name and matching state
        list_running_vm = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            name="name",
            state="Running"
        )
        self.assertIsNone(
            list_running_vm,
            "Listed VM with non matching name"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="false")
    def test_08_list_vm_by_zone(self):
        """
        @Desc: Test List VM by Zone.
        This test case is applicable for a setup having multiple zones.
        @Steps:
        Step1: Listing all the zones
        Step2: Checking if there are multiple zones in the setup.
               Continuing below steps only if there are multiple zones
        Step3: Listing template for zone
        Step4: Listing all the VMs for a user
        Step5: Verifying that the size of the list is 0
        Step6: Deploying a VM
        Step7: Listing all the VMs for a user again for matching zone
        Step8: Verifying that the size of the list is 1
        Step9: Verifying that the details of the Listed VM are same
               as the VM deployed in Step6
        Step10: Listing all the VMs for a user again for non-matching zone
        Step11: Verifying that the size of the list is 0
        """
        # Listing all the zones available
        zones_list = Zone.list(self.apiClient)
        status = validateList(zones_list)
        self.assertEqual(
            PASS,
            status[0],
            "zones not available in the given setup"
        )
        current_zone = self.services["virtual_machine"]["zoneid"]
        current_template = self.services["virtual_machine"]["template"]
        # Checking if there are multiple zones in the setup.
        if not len(zones_list) > 1:
            self.debug("Setup is not having multiple zones")
        else:
            # Getting the template available under the zone
            template = get_template(
                self.apiClient,
                zones_list[0].id,
                self.services["ostype"]
            )
            self.assertIsNotNone(
                template,
                "Template not found for zone"
            )
            self.services["virtual_machine"]["zoneid"] = zones_list[0].id
            self.services["virtual_machine"]["template"] = template.id
            # Listing all the VM's for a User
            list_vms_before = VirtualMachine.list(
                self.userapiclient,
                listall=self.services["listall"],
                page=1,
                pagesize=self.services["pagesize"],
                domainid=self.account.domainid,
                zoneid=zones_list[0].id
            )
            self.assertIsNone(
                list_vms_before,
                "Virtual Machine already exists for newly created user"
            )
            # Deploying a VM
            vm_created = VirtualMachine.create(
                self.userapiclient,
                self.services["virtual_machine"],
                accountid=self.account.name,
                domainid=self.account.domainid,
                serviceofferingid=self.service_offering.id,
            )
            self.assertIsNotNone(
                vm_created,
                "VM creation failed"
            )
            # Listing all the VMs for a user again for matching zone
            list_vms_after = VirtualMachine.list(
                self.userapiclient,
                listall=self.services["listall"],
                page=1,
                pagesize=self.services["pagesize"],
                domainid=self.account.domainid,
                zoneid=zones_list[0].id
            )
            status = validateList(list_vms_after)
            self.assertEqual(
                PASS,
                status[0],
                "VM creation failed"
            )
            # Verifying that the size of the list is 1
            self.assertEqual(
                1,
                len(list_vms_after),
                "VM list count is not matching"
            )
            listed_vm = list_vms_after[0]
            # Verifying that the details of the Listed VM are
            # same as the VM deployed above
            # Creating expected and actual values dictionaries
            expected_dict = {
                "id": vm_created.id,
                "name": vm_created.name,
                "displayname": vm_created.displayname,
                "state": vm_created.state,
                "zoneid": vm_created.zoneid,
                "account": vm_created.account,
                "template": vm_created.templateid
            }
            actual_dict = {
                "id": listed_vm.id,
                "name": listed_vm.name,
                "displayname": listed_vm.displayname,
                "state": listed_vm.state,
                "zoneid": listed_vm.zoneid,
                "account": listed_vm.account,
                "template": listed_vm.templateid
            }
            list_vm_status = self.__verify_values(
                expected_dict,
                actual_dict
            )
            self.assertEqual(
                True,
                list_vm_status,
                "Listed VM by Id details are not as expected"
            )
            # Listing all the VMs for a user again for non-matching zone
            list_vms = VirtualMachine.list(
                self.userapiclient,
                listall=self.services["listall"],
                page=1,
                pagesize=self.services["pagesize"],
                domainid=self.account.domainid,
                zoneid=zones_list[1].id
            )
            self.assertIsNone(
                list_vms,
                "VM's listed for non matching zone"
            )
            self.services["virtual_machine"]["zoneid"] = current_zone
            self.services["virtual_machine"]["template"] = current_template
        return

    @attr(tags=["advanced", "basic"], required_hardware="false")
    def test_09_list_vm_by_zone_name(self):
        """
        @Desc: Test List VM by Zone.
        This test case is applicable for a setup having multiple zones.
        @Steps:
        Step1: Listing all the zones
        Step2: Checking if there are multiple zones in the setup.
               Continuing below steps only if there are multiple zones
        Step3: Listing template for zone
        Step4: Listing all the VMs for a user
        Step5: Verifying that the size of the list is 0
        Step6: Deploying a VM
        Step7: Listing all the VMs for a user again
        Step8: Verifying that list size is increased by 1
        Step9: Listing the VM by specifying name of VM created in step6
               and matching zone (matching name and zone)
        Step10: Verifying that the size of the list is 1
        Step11: Verifying that the details of the listed VM are same
                as the VM created in step3
        Step12: Listing the VM by specifying name of VM created in step6
                and non matching zone (non matching zone)
        Step13: Verifying that the size of the list is 0
        Step14: Listing the VM by specifying non matching name and
                matching zone (non matching name)
        Step15: Verifying that the size of the list is 0
        """
        # Listing all the zones available
        zones_list = Zone.list(self.apiClient)
        status = validateList(zones_list)
        self.assertEqual(
            PASS,
            status[0],
            "zones not available in the given setup"
        )
        current_zone = self.services["virtual_machine"]["zoneid"]
        current_template = self.services["virtual_machine"]["template"]
        # Checking if there are multiple zones in the setup.
        if not len(zones_list) > 1:
            self.debug("Setup is not having multiple Zones")
        else:
            # Getting the template available under the zone
            template = get_template(
                self.apiClient,
                zones_list[0].id,
                self.services["ostype"]
            )
            self.assertIsNotNone(
                template,
                "Template not found for zone"
            )
            self.services["virtual_machine"]["zoneid"] = zones_list[0].id
            self.services["virtual_machine"]["template"] = template.id
            # Listing all the VM's for a User
            list_vms_before = VirtualMachine.list(
                self.userapiclient,
                listall=self.services["listall"],
                page=1,
                pagesize=self.services["pagesize"],
                domainid=self.account.domainid,
                zoneid=zones_list[0].id,
                account=self.account.name
            )
            self.assertIsNone(
                list_vms_before,
                "Virtual Machine already exists for newly created user"
            )
            # Deploying a VM
            vm_created = VirtualMachine.create(
                self.userapiclient,
                self.services["virtual_machine"],
                accountid=self.account.name,
                domainid=self.account.domainid,
                serviceofferingid=self.service_offering.id,
            )
            self.assertIsNotNone(
                vm_created,
                "VM creation failed"
            )
            # Listing all the VMs for a user again for matching zone
            list_vms_after = VirtualMachine.list(
                self.userapiclient,
                listall=self.services["listall"],
                page=1,
                pagesize=self.services["pagesize"],
                domainid=self.account.domainid,
                zoneid=zones_list[0].id,
                account=self.account.name
            )
            status = validateList(list_vms_after)
            self.assertEqual(
                PASS,
                status[0],
                "VM creation failed"
            )
            # Verifying that the size of the list is 1
            self.assertEqual(
                1,
                len(list_vms_after),
                "VM list count is not matching"
            )
            # Listing the VM by specifying name of VM created in above and
            # matching zone
            list_vms = VirtualMachine.list(
                self.userapiclient,
                listall=self.services["listall"],
                page=1,
                pagesize=self.services["pagesize"],
                domainid=self.account.domainid,
                zoneid=zones_list[0].id,
                name=vm_created.name
            )
            status = validateList(list_vms)
            self.assertEqual(
                PASS,
                status[0],
                "Listing VM's by name and zone failed"
            )
            # Verifying that the size of the list is 1
            self.assertEqual(
                1,
                len(list_vms),
                "Count of listed VM's by name and zone is not as expected"
            )
            listed_vm = list_vms[0]
            # Verifying that the details of the Listed VM are same
            # as the VM deployed above
            # Creating expected and actual values dictionaries
            expected_dict = {
                "id": vm_created.id,
                "name": vm_created.name,
                "displayname": vm_created.displayname,
                "state": vm_created.state,
                "zoneid": vm_created.zoneid,
                "account": vm_created.account,
                "template": vm_created.templateid
            }
            actual_dict = {
                "id": listed_vm.id,
                "name": listed_vm.name,
                "displayname": listed_vm.displayname,
                "state": listed_vm.state,
                "zoneid": listed_vm.zoneid,
                "account": listed_vm.account,
                "template": listed_vm.templateid
            }
            list_vm_status = self.__verify_values(
                expected_dict,
                actual_dict
            )
            self.assertEqual(
                True,
                list_vm_status,
                "Listed VM by Id details are not as expected"
            )
            # Listing the VM by specifying name of VM created in step3 and non
            # matching zone
            list_vms = VirtualMachine.list(
                self.userapiclient,
                listall=self.services["listall"],
                page=1,
                pagesize=self.services["pagesize"],
                domainid=self.account.domainid,
                zoneid=zones_list[1].id,
                name=vm_created.name
            )
            self.assertIsNone(
                list_vms,
                "VM's listed for non matching zone"
            )
            # Listing the VM by specifying non matching name of VM and matching
            # zone
            list_vms = VirtualMachine.list(
                self.userapiclient,
                listall=self.services["listall"],
                page=1,
                pagesize=self.services["pagesize"],
                domainid=self.account.domainid,
                zoneid=zones_list[0].id,
                name="name"
            )
            self.assertIsNone(
                list_vms,
                "VM's listed for non matching zone"
            )
            self.services["virtual_machine"]["zoneid"] = current_zone
            self.services["virtual_machine"]["template"] = current_template
        return

    @attr(tags=["advanced", "basic"], required_hardware="false")
    def test_10_list_vm_by_zone_name_state(self):
        """
        @Desc: Test List VM by Zone.
        @Steps:
        Step1: Listing all the VMs for a user
        Step2: Verifying that the size of the list is 0
        Step3: Deploying a VM
        Step4: Listing all the VMs for a user again
        Step5: Verifying that list size is increased by 1
        Step6: Listing the VM by specifying name of VM created in step3
               and matching zone and state as Running
        Step7: Verifying that the size of the list is 1
        Step8: Verifying that the details of the listed VM are same
               as the VM created in step3
        Step9: Listing the VM by specifying name of VM created in step3 and
               matching zone and state as Stopped
        Step10: Verifying that the size of the list is 0
        Step11: Listing the VM by name, Zone and account
        Step12: Verifying that the size of the list is 1
        Step13: Verifying that the details of the listed VM are same
                as the VM created in step3
        """
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            zoneid=self.zone.id,
            account=self.account.name
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the VMs for a user again for matching zone
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            zoneid=self.zone.id,
            account=self.account.name
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Listing the VM by specifying name of VM created in step3 and matching
        # zone and state as Running
        list_vms = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            zoneid=self.zone.id,
            name=vm_created.name,
            state="Running"
        )
        status = validateList(list_vms)
        self.assertEqual(
            PASS,
            status[0],
            "Listing VM's by name and zone failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms),
            "Count of listed VM's by name, zone and state is not as expected"
        )
        listed_vm = list_vms[0]
        # Verifying that the details of the Listed VM are same
        # as the VM deployed above
        # Creating expected and actual values dictionaries
        expected_dict = {
            "id": vm_created.id,
            "name": vm_created.name,
            "displayname": vm_created.displayname,
            "state": vm_created.state,
            "zoneid": vm_created.zoneid,
            "account": vm_created.account,
            "template": vm_created.templateid
        }
        actual_dict = {
            "id": listed_vm.id,
            "name": listed_vm.name,
            "displayname": listed_vm.displayname,
            "state": listed_vm.state,
            "zoneid": listed_vm.zoneid,
            "account": listed_vm.account,
            "template": listed_vm.templateid
        }
        list_vm_status = self.__verify_values(
            expected_dict,
            actual_dict
        )
        self.assertEqual(
            True,
            list_vm_status,
            "Listed VM by Id details are not as expected"
        )
        # Listing the VM by specifying name of VM created in step3, zone and
        # State as Stopped
        list_vms = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            zoneid=self.zone.id,
            name=vm_created.name,
            state="Stopped"
        )
        self.assertIsNone(
            list_vms,
            "VM's listed for non matching zone"
        )
        # Listing the VM by name, zone and account
        list_vms = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            zoneid=self.zone.id,
            name=vm_created.name,
            account=self.account.name
        )
        status = validateList(list_vms)
        self.assertEqual(
            PASS,
            status[0],
            "Listing VM's by name, account and zone failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms),
            "Count of listed VM's by name, zone and account is not as expected"
        )
        listed_vm = list_vms[0]
        # Verifying that the details of the Listed VM are same
        # as the VM deployed above
        # Creating expected and actual values dictionaries
        expected_dict = {
            "id": vm_created.id,
            "name": vm_created.name,
            "displayname": vm_created.displayname,
            "state": vm_created.state,
            "zoneid": vm_created.zoneid,
            "account": vm_created.account,
            "template": vm_created.templateid
        }
        actual_dict = {
            "id": listed_vm.id,
            "name": listed_vm.name,
            "displayname": listed_vm.displayname,
            "state": listed_vm.state,
            "zoneid": listed_vm.zoneid,
            "account": listed_vm.account,
            "template": listed_vm.templateid
        }
        list_vm_status = self.__verify_values(
            expected_dict,
            actual_dict
        )
        self.assertEqual(
            True,
            list_vm_status,
            "Listed VM by Id details are not as expected"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="true")
    def test_11_register_reset_vm_sshkey(self):
        """
        @Desc: Test to verify registering and reset of SSH Key for VM
        @Steps:
        Step1: Deploying a VM
        Step2: Stopping the VM deployed in step1
        Step3: Listing all the SSH Key pairs
        Step4: Registering a SSH Key pair
        Step5: Listing all the SSh Key pairs again
        Step6: Verifying that the key pairs list is increased by 1
        Step7: Resetting the VM SSH Key to the key pair registered in step4
        Step8: Verifying that the registered SSH Key pair is set to the VM
        """
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the VMs for a user again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Stopping the VM deployed above
        vm_created.stop(
            self.userapiclient,
            forced=True
        )
        # Listing all the SSH Key pairs
        list_keypairs_before = SSHKeyPair.list(
            self.userapiclient
        )
        list_keypairs_before_size = 0
        if list_keypairs_before is not None:
            list_keypairs_before_size = len(list_keypairs_before)

        # Registering new Key pair
        new_keypair = SSHKeyPair.register(
            self.userapiclient,
            name="keypair1",
            publickey="ssh-rsa: e6:9a:1e:b5:98:75:88:5d:56:bc:92:7b:43:48:05:b2")
        self.assertIsNotNone(
            new_keypair,
            "New Key pair generation failed"
        )
        self.assertEqual(
            "keypair1",
            new_keypair.name,
            "Key Pair not created with given name"
        )
        # Listing all the SSH Key pairs again
        list_keypairs_after = SSHKeyPair.list(
            self.userapiclient
        )
        status = validateList(list_keypairs_after)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of Key pairs failed"
        )
        # Verifying that list size is increased by 1
        self.assertEqual(
            list_keypairs_before_size + 1,
            len(list_keypairs_after),
            "List count is not matching"
        )
        # Resetting the VM SSH key to the Key pair created above
        vm_created.resetSshKey(
            self.userapiclient,
            keypair=new_keypair.name
        )
        # Listing VM details again
        list_vm = VirtualMachine.list(
            self.userapiclient,
            id=vm_created.id
        )
        status = validateList(list_vm)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of VM failed"
        )
        self.assertEqual(
            1,
            len(list_vm),
            "VMs list is not as expected"
        )
        # Verifying that VM's SSH keypair is set to newly created keypair
        self.assertEqual(
            new_keypair.name,
            list_vm[0].keypair,
            "VM is not set to newly created SSH Key pair"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="true")
    def test_12_running_vm_change_service(self):
        """
        @Desc: Test to verify change service for Running VM
        @Steps:
        Step1: Deploying a VM
        Step2: Listing all the existing service offerings
        Step3: If there is a matching Service Offering for
                change service of stopped VM
                use that service offering. If not create
                one service offering for change service.
        Step4: Perform change service for the Running VM
        Step5: Verifying that change service is not possible for Running VM
        """
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing details of current Service Offering
        vm_so_list = ServiceOffering.list(
            self.userapiclient,
            id=vm_created.serviceofferingid
        )
        status = validateList(vm_so_list)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of VM Service offering failed"
        )
        current_so = vm_so_list[0]
        # Listing all the VMs for a user again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Listing all the service offerings
        service_offerings_list = ServiceOffering.list(
            self.userapiclient,
            virtualmachineid=vm_created.id
        )
        # Verifying if any Service offering available for change service of VM
        so_exists = False
        if service_offerings_list is not None:
            for i in range(0, len(service_offerings_list)):
                if ((current_so.id != service_offerings_list[i].id) and (
                            current_so.storagetype ==
                            service_offerings_list[i].storagetype)):
                    so_exists = True
                    new_so = service_offerings_list[i]
                    break
        # If service offering does not exists, then creating one service
        # offering for scale up
        if not so_exists:
            self.services["service_offerings"]["small"][
                "storagetype"] = current_so.storagetype
            new_so = ServiceOffering.create(
                self.apiClient,
                self.services["service_offerings"]["small"]
            )
            self.cleanup.append(new_so)
        # Changing service for the Running VM
        with self.assertRaises(Exception):
            vm_created.change_service_offering(
                self.userapiclient,
                new_so.id
            )
        # Listing VM details again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            id=vm_created.id
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of VM failed"
        )
        self.assertEqual(
            1,
            len(list_vms_after),
            "VMs list is not as expected"
        )
        # Verifying that VM's service offerings is not changed
        self.assertEqual(
            current_so.id,
            list_vms_after[0].serviceofferingid,
            "VM is not containing old Service Offering"
        )
        return

    @attr(tags=["advanced"], required_hardware="true")
    def test_13_vm_nics(self):
        """
        @Desc: Test to verify Nics for a VM
        @Steps:
        Step1: Deploying a VM
        Step2: Listing all the Networks
        Step3: Verifying that the list size is 1
        Step4: Creating 1 network
        Step5: Listing all the networks again
        Step6: Verifying that the list size is 2
        Step7: Verifying that VM deployed in step1 has only 1 nic
                and it is same as network listed in step3
        Step8: Adding the networks created in step4 to VM deployed in step1
        Step9: Verifying that VM deployed in step1 has 2 nics
        Step10: Verifying that isdefault is set to true for only 1 nic
        Step11: Verifying that isdefault is set to true for the Network
                created when deployed a VM
        Step12: Making the nic created in step4 as default nic
        Step13: Verifying that isdefault is set to true for only 1 nic
        Step14: Verifying that the isdefault is set to true for the
                nic created in step4
        Step15: Removing the non-default nic from VM
        Step16: Verifying that VM deployed in step1 has only 1 nic
        """
        if self.hypervisor.lower() in ['hyperv']:
            self.skipTest(
                "This feature is not supported on existing hypervisor.\
                        Hence, skipping the test")

        hypervisorIsVmware = False

        if self.hypervisor.lower() == "vmware":
            hypervisorIsVmware = True

        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
            mode=self.zone.networktype if hypervisorIsVmware else "default"
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the VMs for a user again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Listing all the networks before
        list_network_before = Network.list(
            self.userapiclient,
            isdefault="true",
            zoneid=self.zone.id,
            account=self.account.name,
            domainid=self.domain.id,
            type="Isolated"
        )
        status = validateList(list_network_before)
        self.assertEqual(
            PASS,
            status[0],
            "Default Network not created when deploying a VM"
        )
        # Verifying that only 1 network is created while deploying a VM
        self.assertEqual(
            1,
            len(list_network_before),
            "More than 1 default network exists"
        )
        network1 = list_network_before[0]
        # Listing Network Offerings
        network_offerings_list = NetworkOffering.list(
            self.apiClient,
            forvpc="false",
            guestiptype="Isolated",
            state="Enabled",
            supportedservices="SourceNat",
            zoneid=self.zone.id
        )
        self.assertIsNotNone(
            network_offerings_list,
            "Isolated Network Offerings with sourceNat enabled are not found"
        )
        # Creating one more network
        network2 = Network.create(
            self.userapiclient,
            self.services["network"],
            accountid=self.account.name,
            domainid=self.domain.id,
            networkofferingid=network_offerings_list[0].id,
            zoneid=self.zone.id
        )
        self.assertIsNotNone(
            network2,
            "Network creation failed"
        )
        # Listing all the networks again
        list_network_after = Network.list(
            self.userapiclient,
            zoneid=self.zone.id,
            account=self.account.name,
            domainid=self.domain.id,
            type="Isolated"
        )
        status = validateList(list_network_after)
        self.assertEqual(
            PASS,
            status[0],
            "List of Networks failed"
        )
        # Verifying that list size is 2
        self.assertEqual(
            2,
            len(list_network_after),
            "More than 1 default network exists"
        )
        # Verifying that VM created is having only 1 nic
        vm_nics_before = vm_created.nic
        self.assertIsNotNone(
            vm_nics_before,
            "Nic not found for the VM deployed"
        )
        self.assertEqual(
            1,
            len(vm_nics_before),
            "VM Nic count is not matching"
        )
        # Verifying that the nic is same as the default network listed above
        self.assertEqual(
            network1.id,
            vm_nics_before[0].networkid,
            "Default NIC for VM is not as expected"
        )
        # Adding network2 created above to VM
        VirtualMachine.add_nic(
            vm_created,
            self.userapiclient,
            network2.id
        )
        # Listing the Vm details again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            id=vm_created.id
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of VM failed"
        )
        vm = list_vms_after[0]
        # Verifying that VM nics size is 2 now
        vm_nics_after = vm.nic
        self.assertIsNotNone(
            vm_nics_after,
            "Nic not found for the deployed VM"
        )
        self.assertEqual(
            2,
            len(vm_nics_after),
            "VM NIC's count is not matching"
        )
        # Verifying that isdefault is set to true for only 1 nic
        default_count = 0
        for i in range(0, len(vm_nics_after)):
            if vm_nics_after[i].isdefault is True:
                default_count = default_count + 1
                default_nic = vm_nics_after[i]
            else:
                non_default_nic = vm_nics_after[i]
        self.assertEqual(
            1,
            default_count,
            "Default NIC count is not matching"
        )
        # Verifying that default NIC is same the network created when VM is
        # deployed
        self.assertEqual(
            network1.id,
            default_nic.networkid,
            "Default NIC is not matching for VM"
        )
        # Updating network 2 as default NIC
        vm_created.update_default_nic(
            self.userapiclient,
            non_default_nic.id
        )
        # Listing the Vm details again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            id=vm_created.id
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of VM failed"
        )
        vm = list_vms_after[0]
        # Verifying that VM nics size is 2 now
        vm_nics_after = vm.nic
        self.assertIsNotNone(
            vm_nics_after,
            "Nic not found for the deployed VM"
        )
        self.assertEqual(
            2,
            len(vm_nics_after),
            "VM NIC's count is not matching"
        )
        # Verifying that isdefault is set to true for only 1 nic
        default_count = 0
        for i in range(0, len(vm_nics_after)):
            if vm_nics_after[i].isdefault is True:
                default_count = default_count + 1
                default_nic = vm_nics_after[i]
            else:
                non_default_nic = vm_nics_after[i]

        self.assertEqual(
            1,
            default_count,
            "Default NIC count is not matching"
        )
        # Verifying that default NIC is same the newly updated network (network
        # 2)
        self.assertEqual(
            network2.id,
            default_nic.networkid,
            "Default NIC is not matching for VM"
        )

        # If hypervisor is Vmware, then check if
        # the vmware tools are installed and the process is running
        # Vmware tools are necessary for remove nic operations (vmware 5.5+)
        isVmwareToolInstalled = False
        if hypervisorIsVmware:
            sshClient = vm_created.get_ssh_client()
            result = str(
                sshClient.execute("service vmware-tools status")).lower()
            self.debug("and result is: %s" % result)
            if "running" in result:
                isVmwareToolInstalled = True

        goForUnplugOperation = True
        # If Vmware tools are not installed in case of vmware hypervisor
        # then don't go further for unplug operation (remove nic) as it won't
        # be supported
        if hypervisorIsVmware and not isVmwareToolInstalled:
            goForUnplugOperation = False

        if goForUnplugOperation:
            # Deleting non default NIC
            vm_created.remove_nic(
                self.userapiclient,
                non_default_nic.id
            )
            # Listing the Vm details again
            list_vms_after = VirtualMachine.list(
                self.userapiclient,
                id=vm_created.id
            )
            status = validateList(list_vms_after)
            self.assertEqual(
                PASS,
                status[0],
                "Listing of VM failed"
            )
            vm = list_vms_after[0]
            # Verifying that VM nics size is 1 now
            vm_nics_after = vm.nic
            self.assertIsNotNone(
                vm_nics_after,
                "Nic not found for the deployed VM"
            )
            self.assertEqual(
                1,
                len(vm_nics_after),
                "VM NIC's count is not matching"
            )
            # Verifying the nic network is same as the default nic network
            self.assertEqual(
                network2.id,
                vm_nics_after[0].networkid,
                "VM NIC is not same as expected"
            )
        return
    @attr(tags=["advanced", "basic"], required_hardware="true")
    def test_14_Create_vm_with_same_sshkey(self):
        """
        @Desc: Test to verify API call Register ssh key pair fails when uses same public key for differnet key name
        """


        # Listing all the SSH Key pairs
        list_keypairs_before = SSHKeyPair.list(
            self.userapiclient
        )
        list_keypairs_before_size = 0
        if list_keypairs_before is not None:
            list_keypairs_before_size = len(list_keypairs_before)

        # Registering first Key pair
        new_keypair1 = SSHKeyPair.register(
            self.userapiclient,
            name="keypair1",
            publickey="ssh-rsa: e6:9a:1e:b5:98:75:88:5d:56:bc:92:7b:43:48:05:b2")
        self.assertIsNotNone(
            new_keypair1,
            "New Key pair generation failed"
        )
        self.assertEqual(
            "keypair1",
            new_keypair1.name,
            "Key Pair not created with given name"
        )
        # Listing all the SSH Key pairs again
        list_keypairs_after = SSHKeyPair.list(
            self.userapiclient
        )
        status = validateList(list_keypairs_after)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of Key pairs failed"
        )
        # Verifying that list size is increased by 1
        self.assertEqual(
            list_keypairs_before_size + 1,
            len(list_keypairs_after),
            "List count is not matching"
        )

        # Deploying a VM with keypair 1
        first_vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
            keypair=new_keypair1.name
        )
        self.assertIsNotNone(
            first_vm_created,
            "VM creation failed"
        )
        # Listing all the VMs for a user again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,id=first_vm_created.id,
            listall=True,
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        vm = list_vms_after[0]
        self.assertEqual(
            vm.state,
            "Running",
            "VM state should be running after deployment")
        self.assertEqual(vm.keypair , new_keypair1.name , "VM keypair name is not keypair1")

        try:

            # Registering second key pair using same public key
            new_keypair2 = SSHKeyPair.register(
                self.userapiclient,
                name="keypair2",
                publickey="ssh-rsa: e6:9a:1e:b5:98:75:88:5d:56:bc:92:7b:43:48:05:b2")
            self.fail("SSH Key creation passed using same public key ")
        except CloudstackAPIException as e:
            self.assertRaises("Exception Raised : %s" % e)

        return


class TestInstances(cloudstackTestCase):
    @classmethod
    def setUpClass(cls):
        try:
            cls._cleanup = []
            cls.testClient = super(TestInstances, cls).getClsTestClient()
            cls.api_client = cls.testClient.getApiClient()
            cls.services = cls.testClient.getParsedTestDataConfig()
            cls.hypervisor = cls.testClient.getHypervisorInfo()
            # Get Domain, Zone, Template
            cls.domain = get_domain(cls.api_client)
            cls.zone = get_zone(
                cls.api_client,
                cls.testClient.getZoneForTests())
            cls.template = get_template(
                cls.api_client,
                cls.zone.id,
                cls.services["ostype"]
            )
            if cls.zone.localstorageenabled:
                cls.storagetype = 'local'
                cls.services["service_offerings"][
                    "tiny"]["storagetype"] = 'local'
                cls.services["disk_offering"]["storagetype"] = 'local'
            else:
                cls.storagetype = 'shared'
                cls.services["service_offerings"][
                    "tiny"]["storagetype"] = 'shared'
                cls.services["disk_offering"]["storagetype"] = 'shared'

            cls.services['mode'] = cls.zone.networktype
            cls.services["virtual_machine"]["hypervisor"] = cls.hypervisor
            cls.services["virtual_machine"]["zoneid"] = cls.zone.id
            cls.services["virtual_machine"]["template"] = cls.template.id
            cls.services["custom_volume"]["zoneid"] = cls.zone.id

            # Creating Disk offering, Service Offering and Account
            cls.disk_offering = DiskOffering.create(
                cls.api_client,
                cls.services["disk_offering"]
            )
            cls.service_offering = ServiceOffering.create(
                cls.api_client,
                cls.services["service_offerings"]["tiny"]
            )
            cls._cleanup.append(cls.service_offering)
            cls._cleanup.append(cls.disk_offering)
        except Exception as e:
            cls.tearDownClass()
            raise Exception("Warning: Exception in setup : %s" % e)
        return

    def setUp(self):

        self.apiClient = self.testClient.getApiClient()
        self.cleanup = []
        self.account = Account.create(
            self.apiClient,
            self.services["account"],
            domainid=self.domain.id
        )
        # Getting authentication for user in newly created Account
        self.user = self.account.user[0]
        self.userapiclient = self.testClient.getUserApiClient(
            self.user.username,
            self.domain.name)
        # Updating resource Limits
        for i in range(0, 8):
            Resources.updateLimit(
                self.api_client,
                account=self.account.name,
                domainid=self.domain.id,
                max=-1,
                resourcetype=i
            )
        self.cleanup.append(self.account)

    def tearDown(self):
        # Clean up, terminate the created resources
        cleanup_resources(self.apiClient, self.cleanup)
        return

    @classmethod
    def tearDownClass(cls):
        try:
            cleanup_resources(cls.api_client, cls._cleanup)
        except Exception as e:
            raise Exception("Warning: Exception during cleanup : %s" % e)

        return

    def __verify_values(self, expected_vals, actual_vals):
        """
        @Desc: Function to verify expected and actual values
        @Steps:
        Step1: Initializing return flag to True
        Step1: Verifying length of expected and actual
               dictionaries is matching.
               If not matching returning false
        Step2: Listing all the keys from expected dictionary
        Step3: Looping through each key from step2 and verifying expected
               and actual dictionaries have same value
               If not making return flag to False
        Step4: returning the return flag after all the values are verified
        """
        return_flag = True

        if len(expected_vals) != len(actual_vals):
            return False

        keys = list(expected_vals.keys())
        for i in range(0, len(expected_vals)):
            exp_val = expected_vals[keys[i]]
            act_val = actual_vals[keys[i]]
            if exp_val == act_val:
                return_flag = return_flag and True
            else:
                return_flag = return_flag and False
                self.debug(
                    "expected Value: %s, is not matching\
                    with actual value: %s" %
                    (exp_val, act_val))
        return return_flag

    @attr(tags=["advanced", "basic"], required_hardware="false")
    def test_27_VM_restore_ES3467(self):
        """
        @Desc:Test to verify  order of root and data disk remains same on Xenserver after VM reset
        @Steps :
        1.Create VM with data disk from Windows template
        5.check disk sequence on hypervisor: 1st = root disk, 2nd = data disk
        6. Issue "reset VM" command on CCP
        7. check disk sequence on hypervisor remains same and VM starts successfully
        """
        if self.hypervisor.lower() in ['kvm', 'hyperv', 'lxc', 'vmware']:
            self.skipTest(
                "This test not applicable on existing hypervisor. Hence,\
                        skipping the test")
        try:

            template = Template.register(self.apiClient,
                                         self.services["Windows 7 (64-bit)"],
                                         zoneid=self.zone.id,
                                         account=self.account.name,
                                         domainid=self.domain.id)

            self.debug(
                "Registered a template of format: %s with ID: %s" % (
                    self.services["Windows 7 (64-bit)"]["format"],
                    template.id
                ))
            template.download(self.apiClient)
            self.cleanup.append(template)
            # Wait for template status to be changed across
            time.sleep(self.services["sleep"])
            timeout = self.services["timeout"]
            while True:
                list_template_response = Template.list(
                    self.apiClient,
                    templatefilter='all',
                    id=template.id,
                    zoneid=self.zone.id,
                    account=self.account.name,
                    domainid=self.account.domainid)
                if isinstance(list_template_response, list):
                    break
                elif timeout == 0:
                    raise Exception("List template failed!")

                time.sleep(5)
                timeout -= 1
            # Verify template response to check whether template added successfully
            status = validateList(list_template_response)
            self.assertEqual(PASS, status[0], "Template download failed")

            self.assertNotEqual(
                len(list_template_response),
                0,
                "Check template available in List Templates"
            )

            template_response = list_template_response[0]
            self.assertEqual(
                template_response.isready,
                True,
                "Template state is not ready, it is %s" % template_response.isready
            )
            disk_offering = DiskOffering.create(
                self.api_client,
                self.services["disk_offering"]
            )
            self.cleanup.append(disk_offering)
            # Deploy new virtual machine using template
            virtual_machine = VirtualMachine.create(
                self.apiClient,
                self.services["virtual_machine"],
                templateid=template.id,
                accountid=self.account.name,
                domainid=self.account.domainid,
                serviceofferingid=self.service_offering.id,
                diskofferingid=disk_offering.id
            )
            self.debug("creating an instance with template ID: %s" % template.id)
            vm_response = VirtualMachine.list(self.apiClient,
                                              id=virtual_machine.id,
                                              account=self.account.name,
                                              domainid=self.account.domainid)
            self.assertEqual(
                isinstance(vm_response, list),
                True,
                "Check for list VMs response after VM deployment"
            )
            # Verify VM response to check whether VM deployment was successful
            self.assertNotEqual(
                len(vm_response),
                0,
                "Check VMs available in List VMs response"
            )
            vm = vm_response[0]
            self.assertEqual(
                vm.state,
                'Running',
                "Check the state of VM created from Template"
            )
            self.cleanup.append(virtual_machine)
            list_volume_response = Volume.list(
                self.apiClient,
                virtualmachineid=virtual_machine.id,
                type='ROOT',
                listall=True
            )
            cmd = "xe vbd-list  vm-name-label=" + virtual_machine.instancename + " vdi-name-label=" + \
                  list_volume_response[0].name + " userdevice=0 --minimal"
            hosts = Host.list(self.apiClient, id=virtual_machine.hostid)
            self.assertEqual(
                isinstance(hosts, list),
                True,
                "Check list host returns a valid list")
            host = hosts[0]
            if self.hypervisor.lower() in 'xenserver':
                #
                ssh = SshClient(host.ipaddress, 22, self.services["configurableData"]["host"]["username"],
                                self.services["configurableData"]["host"]["password"])
                result = ssh.execute(cmd)
                res = str(result)
                self.assertNotEqual(res, "", "root disk should have user device=0")

            self.debug("Restoring  the VM: %s" % virtual_machine.id)
            # Restore VM
            virtual_machine.restore(self.apiClient, template.id)
            vm_response = VirtualMachine.list(
                self.apiClient,
                id=virtual_machine.id,
            )
            hosts = Host.list(self.apiClient, id=virtual_machine.hostid)
            self.assertEqual(
                isinstance(hosts, list),
                True,
                "Check list host returns a valid list")
            host = hosts[0]
            if self.hypervisor.lower() in 'xenserver':
                #
                ssh = SshClient(host.ipaddress, 22, self.services["configurableData"]["host"]["username"],
                                self.services["configurableData"]["host"]["password"])
                result = ssh.execute(cmd)
                res = str(result)
                self.assertNotEqual(res, "", "root disk should have user device=0")

            #
            # Verify VM response to check whether VM deployment was successful
            self.assertNotEqual(
                len(vm_response),
                0,
                "Check VMs available in List VMs response"
            )
            self.assertEqual(
                isinstance(vm_response, list),
                True,
                "Check list VM response for valid list"
            )
            vm = vm_response[0]
            self.assertEqual(
                vm.state,
                'Running',
                "Check the state of VM"
            )
        except Exception as e:
            self.fail("Exception occurred: %s" % e)
        return

    @attr(tags=["advanced", "basic"], required_hardware="false")
    def test_28_VM_restore_ES3467(self):
        """
        @Desc:Test to verify  order of root and data disk remains same on Xenserver after VM reset
        @Steps :
        1.Create VM from Centos template
        3.Add data disk to VM
        5.check disk sequence on hypervisor: 1st = root disk, 2nd = data disk
        6. Issue "reset VM" command on CCP
        7. check disk sequence on hypervisor remains same and VM starts successfully
        """
        try:
            # Deploy new virtual machine using template
            virtual_machine = VirtualMachine.create(
                self.apiClient,
                self.services["virtual_machine"],
                accountid=self.account.name,
                domainid=self.account.domainid,
                serviceofferingid=self.service_offering.id

            )
            self.debug("creating an instance with template ID: %s" % self.template.id)
            vm_response = VirtualMachine.list(self.apiClient,
                                              id=virtual_machine.id,
                                              account=self.account.name,
                                              domainid=self.account.domainid)
            self.assertEqual(
                isinstance(vm_response, list),
                True,
                "Check for list VMs response after VM deployment"
            )
            # Verify VM response to check whether VM deployment was successful
            self.assertNotEqual(
                len(vm_response),
                0,
                "Check VMs available in List VMs response"
            )
            vm = vm_response[0]
            self.assertEqual(
                vm.state,
                'Running',
                "Check the state of VM created from Template"
            )
            disk_offering = DiskOffering.create(
                self.api_client,
                self.services["disk_offering"]
            )
            self.cleanup.append(disk_offering)
            volume = Volume.create(
                self.apiClient,
                self.services["volume"],
                zoneid=self.zone.id,
                account=self.account.name,
                domainid=self.account.domainid,
                diskofferingid=disk_offering.id
            )
            # Check List Volume response for newly created volume
            list_volume_response = Volume.list(
                self.apiClient,
                id=volume.id
            )
            self.assertNotEqual(
                list_volume_response,
                None,
                "Check if volume exists in ListVolumes"
            )
            # Attach volume to VM
            virtual_machine.attach_volume(
                self.apiClient,
                volume
            )
            # Check volumes attached to same VM
            list_volume_response = Volume.list(
                self.apiClient,
                virtualmachineid=virtual_machine.id,
                type='DATADISK',
                listall=True
            )

            self.assertNotEqual(
                list_volume_response,
                None,
                "Check if volume exists in ListVolumes")
            self.assertEqual(
                isinstance(list_volume_response, list),
                True,
                "Check list volumes response for valid list")
            list_volume_response = Volume.list(
                self.apiClient,
                virtualmachineid=virtual_machine.id,
                type='ROOT',
                listall=True
            )
            cmd = "xe vbd-list  vm-name-label=" + virtual_machine.instancename + " vdi-name-label=" + \
                  list_volume_response[0].name + " userdevice=0 --minimal"
            hosts = Host.list(self.apiClient, id=virtual_machine.hostid)
            self.assertEqual(
                isinstance(hosts, list),
                True,
                "Check list host returns a valid list")
            host = hosts[0]
            if self.hypervisor.lower() in 'xenserver':
                #
                # host.user, host.passwd = get_host_credentials(self, host.ipaddress)
                ssh = SshClient(host.ipaddress, 22, self.services["configurableData"]["host"]["username"],
                                self.services["configurableData"]["host"]["password"])
                result = ssh.execute(cmd)
                res = str(result)
                self.assertNotEqual(res, "", "root disk should have user device=0")

            # Stop VM
            virtual_machine.stop(self.apiClient)

            self.debug("Restoring the VM: %s" % virtual_machine.id)
            # Restore VM
            virtual_machine.restore(self.apiClient, self.template.id)
            vm_response = VirtualMachine.list(
                self.apiClient,
                id=virtual_machine.id,
            )
            # Verify VM response to check whether VM deployment was successful
            self.assertNotEqual(
                len(vm_response),
                0,
                "Check VMs available in List VMs response"
            )
            self.assertEqual(
                isinstance(vm_response, list),
                True,
                "Check list VM response for valid list"
            )
            vm = vm_response[0]
            self.assertEqual(
                vm.state,
                'Stopped',
                "Check the state of VM"
            )
            # Start VM
            virtual_machine.start(self.apiClient)
            if self.hypervisor.lower() in 'xenserver':
                #
                # host.user, host.passwd = get_host_credentials(self, host.ipaddress)
                ssh = SshClient(host.ipaddress, 22, self.services["configurableData"]["host"]["username"],
                                self.services["configurableData"]["host"]["password"])
                result = ssh.execute(cmd)
                res = str(result)
                self.assertNotEqual(res, "", "root disk should have user device=0")

            vm_response = VirtualMachine.list(
                self.apiClient,
                id=virtual_machine.id,
            )
            self.assertEqual(
                isinstance(vm_response, list),
                True,
                "Check list VM response for valid list"
            )
            # Verify VM response to check whether VM deployment was successful
            self.assertNotEqual(
                len(vm_response),
                0,
                "Check VMs available in List VMs response"
            )

            vm = vm_response[0]
            self.assertEqual(
                vm.state,
                'Running',
                "Check the state of VM"
            )
        except Exception as e:
            self.fail("Exception occurred: %s" % e)
        return


    @attr(tags=["advanced", "basic"], required_hardware="true")
    def test_13_attach_detach_iso(self):
        """
        @Desc: Test Attach ISO to VM and Detach ISO from VM.
        @Steps:
        Step1: Listing all the VMs for a user
        Step2: Verifying that the size of the list is 0
        Step3: Deploying a VM
        Step4: Listing all the VMs for a user again
        Step5: Verifying that list size is increased by 1
        Step6: Listing all the ready ISO's
        Step7: If size of the list is >= 1 continuing to next steps
        Step8: Attaching the ISO listed to VM deployed in Step3
        Step9: Verifying that the attached ISO details are associated with VM
        Step10: Detaching the ISO attached in step8
        Step11: Verifying that detached ISO details are not associated with VM
        """
        if self.hypervisor.lower() in ['kvm', 'hyperv', 'lxc']:
            self.skipTest(
                "This feature is not supported on existing hypervisor. Hence,\
                        skipping the test")
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            zoneid=self.zone.id,
            account=self.account.name
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the VMs for a user again for matching zone
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
            page=1,
            pagesize=self.services["pagesize"],
            domainid=self.account.domainid,
            zoneid=self.zone.id,
            account=self.account.name
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Listing the ISO's in ready state
        isos_list = Iso.list(
            self.userapiclient,
            isready="true",
            isofilter="executable",
            zoneid=self.zone.id
        )

        self.assertEqual(validateList(isos_list)[0],
                         PASS,
                         "isos list validation failed")

        if self.hypervisor.lower() == "xenserver":
            isoDesc = "xen"
        else:
            isoDesc = "vmware"

        validIsosToAttach = [iso for iso in isos_list
                             if isoDesc in iso.displaytext.lower()]
        if not validIsosToAttach:
            self.skipTest(
                "Valid ISO not present in setup suitable to attach to VM")

        iso_toattach = validIsosToAttach[0]
        # Attaching ISO listed to VM deployed
        VirtualMachine.attach_iso(
            vm_created,
            self.userapiclient,
            iso_toattach
        )
        list_vm = VirtualMachine.list(
            self.userapiclient,
            id=vm_created.id
        )
        status = validateList(list_vm)
        self.assertEqual(
            PASS,
            status[0],
            "VM listing by Id failed"
        )
        # Verifying that attached ISO details are present in VM
        self.assertEqual(
            iso_toattach.name,
            list_vm[0].isoname,
            "Attached ISO name is not matching"
        )
        self.assertEqual(
            iso_toattach.displaytext,
            list_vm[0].isodisplaytext,
            "Attached ISO display is not matching"
        )
        # Detaching ISO from VM
        VirtualMachine.detach_iso(
            vm_created,
            self.userapiclient
        )
        list_vm = VirtualMachine.list(
            self.userapiclient,
            id=vm_created.id
        )
        status = validateList(list_vm)
        self.assertEqual(
            PASS,
            status[0],
            "VM listing by Id failed"
        )
        # Verifying that ISO details are NOT present in VM
        self.assertIsNone(
            list_vm[0].isoname,
            "ISO not detached from VM"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="true")
    def test_14_vm_snapshot_pagination(self):
        """
        @Desc: Test VM Snapshots pagination.
        @Steps:
        Step1: Deploying a VM
        Step2: Listing all the Snapshots of the VM deployed in Step 1
        Step3: Verifying that the list size is 0
        Step4: Creating (pagesize + 1) number of Snapshots for the VM
        Step5: Listing all the Snapshots of the VM deployed in Step 1
        Step6: Verifying that the list size is (pagesize + 1)
        Step7: Listing all the VM snapshots in Page 1 with page size
        Step8: Verifying that size of the list is same as page size
        Step9: Listing all the VM snapshots in Page 2 with page size
        Step10: Verifying that size of the list is 1
        Step11: Deleting VM snapshot in page 2
        Step12: Listing all the VM snapshots in Page 2 with page size
        Step13: Verifying that size of the list is 0
        """
        if self.hypervisor.lower() in ['kvm', 'hyperv', 'lxc']:
            self.skipTest(
                "This feature is not supported on existing hypervisor. Hence,\
                        skipping the test")
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the VMs for a user again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Listing all the VM snapshots for VM deployed above
        list_snapshots_before = VmSnapshot.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id
        )
        # Verifying that the VM snapshot list is None
        self.assertIsNone(
            list_snapshots_before,
            "Snapshots already exists for newly created VM"
        )
        # Creating pagesize + 1 number of VM snapshots
        for i in range(0, (self.services["pagesize"] + 1)):
            snapshot_created = VmSnapshot.create(
                self.userapiclient,
                vm_created.id,
            )
            self.assertIsNotNone(
                snapshot_created,
                "Snapshot creation failed"
            )

        # Listing all the VM snapshots for VM again
        list_snapshots_after = VmSnapshot.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id
        )
        status = validateList(list_snapshots_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM Snapshots creation failed"
        )
        self.assertEqual(
            self.services["pagesize"] + 1,
            len(list_snapshots_after),
            "Count of VM Snapshots is not matching"
        )
        # Listing all the VM snapshots in Page 1 with page size
        list_snapshots_page1 = VmSnapshot.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id,
            page=1,
            pagesize=self.services["pagesize"],
        )
        status = validateList(list_snapshots_page1)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of VM Snapshots failed in page 1"
        )
        # Verifying the list size is equal to pagesize
        self.assertEqual(
            self.services["pagesize"],
            len(list_snapshots_page1),
            "List VM Snapshot count is not matching in page 1"
        )
        # Listing all the VM Snapshots in page 2
        list_snapshots_page2 = VmSnapshot.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id,
            page=2,
            pagesize=self.services["pagesize"],
        )
        status = validateList(list_snapshots_page2)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of VM Snapshots failed in page 2"
        )
        # Verifying the list size is equal to 1
        self.assertEqual(
            1,
            len(list_snapshots_page2),
            "List VM Snapshot count is not matching in page 2"
        )
        # Deleting VM Snapshot in page 2
        VmSnapshot.deleteVMSnapshot(
            self.userapiclient,
            snapshot_created.id
        )
        # Listing all the VM Snapshots in page 2 again
        list_snapshots_page2 = VmSnapshot.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id,
            page=2,
            pagesize=self.services["pagesize"],
        )
        # Verifying the list size is equal to 0
        self.assertIsNone(
            list_snapshots_page2,
            "VM Snapshots exists in page 2"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="true")
    def test_15_revert_vm_to_snapshot(self):
        """
        @Desc: Test Revert VM to Snapshot functionality.
        @Steps:
        Step1: Deploying a VM
        Step2: Listing all the Snapshots of the VM deployed in Step 1
        Step3: Verifying that the list size is 0
        Step4: Creating 2 Snapshots for the VM
        Step5: Listing all the Snapshots of the VM deployed in Step 1
        Step6: Verifying that the list size is 2
        Step7: Verifying that only 1 snapshot is have current flag set to True
        Step8: Verifying that the VM snapshot with current flag set as true is
               the latest snapshot created
        Step9: Reverting VM to snapshot having current flag as false
               (non current snapshot)
        Step10: Verifying that only 1 VM snapshot is having current
                flag set as true.
        Step11: Verifying that the VM Snapshot with current flag set to true
                is the reverted snapshot in Step 8
        """
        if self.hypervisor.lower() in ['kvm', 'hyperv', 'lxc']:
            self.skipTest(
                "This feature is not supported on existing hypervisor.\
                        Hence, skipping the test")
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the VMs for a user again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Listing all the VM snapshots for VM deployed above
        list_snapshots_before = VmSnapshot.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id
        )
        # Verifying that the VM snapshot list is None
        self.assertIsNone(
            list_snapshots_before,
            "Snapshots already exists for newly created VM"
        )
        # Creating 2 of VM snapshots
        snapshot1 = VmSnapshot.create(
            self.userapiclient,
            vm_created.id,
            snapshotmemory=True
        )
        self.assertIsNotNone(
            snapshot1,
            "Snapshot creation failed"
        )
        snapshot2 = VmSnapshot.create(
            self.userapiclient,
            vm_created.id,
            snapshotmemory=True
        )
        self.assertIsNotNone(
            snapshot2,
            "Snapshot creation failed"
        )
        # Listing all the VM snapshots for VM again
        list_snapshots_after = VmSnapshot.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id
        )
        status = validateList(list_snapshots_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM Snapshots creation failed"
        )
        self.assertEqual(
            2,
            len(list_snapshots_after),
            "Count of VM Snapshots is not matching"
        )
        # Verifying that only 1 snapshot is having current flag set to true
        # and that snapshot is the latest snapshot created (snapshot2)
        current_count = 0
        for i in range(0, len(list_snapshots_after)):
            if (list_snapshots_after[i].current is True):
                current_count = current_count + 1
                current_snapshot = list_snapshots_after[i]

        self.assertEqual(
            1,
            current_count,
            "count of VM Snapshot with current flag as true is not matching"
        )
        self.assertEqual(
            snapshot2.id,
            current_snapshot.id,
            "Latest snapshot taken is not marked as current"
        )

        # Reverting the VM to Snapshot 1
        VmSnapshot.revertToSnapshot(
            self.userapiclient,
            snapshot1.id
        )
        # Listing the VM snapshots again
        list_snapshots_after = VmSnapshot.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id
        )
        status = validateList(list_snapshots_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM Snapshots creation failed"
        )
        self.assertEqual(
            2,
            len(list_snapshots_after),
            "Count of VM Snapshots is not matching"
        )
        # Verifying that only 1 snapshot is having current flag set to true
        # and that snapshot is snapshot1
        current_count = 0
        for i in range(0, len(list_snapshots_after)):
            if (list_snapshots_after[i].current is True):
                current_count = current_count + 1
                current_snapshot = list_snapshots_after[i]
        self.assertEqual(
            1,
            current_count,
            "count of VM Snapshot with current flag as true is not matching"
        )
        self.assertEqual(
            snapshot1.id,
            current_snapshot.id,
            "Current flag was set properly after reverting the VM to snapshot"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="false")
    def test_16_list_vm_volumes_pagination(self):
        """
        @Desc: Test to verify pagination of Volumes for a VM
        @Steps:
        Step1: Deploying a VM
        Step2: Listing all the Volumes of the VM deployed in Step 1
        Step3: Verifying that the list size is 1
        Step4: Creating page size number of volumes
        Step5: Attaching all the volumes created in step4 to
               VM deployed in Step1
        Step6: Listing all the Volumes for the VM in step1
        Step7: Verifying that the list size is equal to page size + 1
        Step8: Listing all the volumes of VM in page 1
        Step9: Verifying that the list size is equal to page size
        Step10: Listing all the Volumes in Page 2
        Step11: Verifying that the list size is 1
        Step12: Detaching the volume from the VM
        Step13: Listing all the Volumes in Page 2
        Step14: Verifying that list size is 0
        """
        self.hypervisor = self.testClient.getHypervisorInfo()
        if self.hypervisor.lower() == 'lxc':
            if not find_storage_pool_type(self.api_client, storagetype='rbd'):
                self.skipTest("RBD storage type is required for data volumes for LXC")
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the VMs for a user again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Listing all the Volumes for the VM deployed
        list_volumes_before = Volume.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id
        )
        status = validateList(list_volumes_before)
        self.assertEqual(
            PASS,
            status[0],
            "Root volume is not created for VM deployed"
        )
        # Verifying the size of the list is 1
        self.assertEqual(
            1,
            len(list_volumes_before),
            "Volumes count is not matching"
        )
        # Creating Page size number of volumes
        for i in range(0, self.services["pagesize"]):
            volume_created = Volume.create(
                self.userapiclient,
                self.services["volume"],
                zoneid=self.zone.id,
                diskofferingid=self.disk_offering.id
            )
            self.assertIsNotNone(
                volume_created,
                "Volume is not created"
            )
            # Attaching all the volumes created to VM
            vm_created.attach_volume(
                self.userapiclient,
                volume_created
            )

        # List all the volumes for the VM again
        list_volumes_after = Volume.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id
        )
        status = validateList(list_volumes_after)
        self.assertEqual(
            PASS,
            status[0],
            "Volumes are not listed"
        )
        # Verifying that size of the list is equal to page size + 1
        self.assertEqual(
            self.services["pagesize"] + 1,
            len(list_volumes_after),
            "VM's volume count is not matching"
        )
        # Listing all the volumes for a VM in page 1
        list_volumes_page1 = Volume.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id,
            page=1,
            pagesize=self.services["pagesize"]
        )
        status = validateList(list_volumes_page1)
        self.assertEqual(
            PASS,
            status[0],
            "Volumes not listed in page1"
        )
        # Verifying that list size is equal to page size
        self.assertEqual(
            self.services["pagesize"],
            len(list_volumes_page1),
            "VM's volume count is not matching in page 1"
        )
        # Listing all the volumes for a VM in page 2
        list_volumes_page2 = Volume.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id,
            page=2,
            pagesize=self.services["pagesize"]
        )
        status = validateList(list_volumes_page2)
        self.assertEqual(
            PASS,
            status[0],
            "Volumes not listed in page2"
        )
        # Verifying that list size is equal to 1
        self.assertEqual(
            1,
            len(list_volumes_page2),
            "VM's volume count is not matching in page 1"
        )
        # Detaching 1 volume from VM
        vm_created.detach_volume(
            self.userapiclient,
            volume_created
        )
        # Listing all the volumes for a VM in page 2 again
        list_volumes_page2 = Volume.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id,
            page=2,
            pagesize=self.services["pagesize"]
        )
        # Verifying that there are no volumes present in page 2
        self.assertIsNone(
            list_volumes_page2,
            "Volumes listed in page 2"
        )
        # Listing all the volumes for a VM again in page 1
        list_volumes_page1 = Volume.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id,
            page=1,
            pagesize=self.services["pagesize"]
        )
        status = validateList(list_volumes_page1)
        self.assertEqual(
            PASS,
            status[0],
            "Volumes not listed in page1"
        )
        # Verifying that list size is equal to page size
        self.assertEqual(
            self.services["pagesize"],
            len(list_volumes_page1),
            "VM's volume count is not matching in page 1"
        )

        list_data_disks = Volume.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id,
            page=1,
            pagesize=self.services["pagesize"],
            type="DATADISK"
        )

        for volume in list_data_disks:
            vm_created.detach_volume(self.userapiclient, volume)

        volumes = Volume.list(
            self.userapiclient,
            listall=self.services["listall"],
            virtualmachineid=vm_created.id,
            page=1,
            pagesize=self.services["pagesize"]
        )

        self.assertEqual(
            len(volumes),
            len(list_volumes_page1) - len(list_data_disks),
            "The volumes number should match with (volumes initially\
                        present minus volumes detached")

        return

    @attr(tags=["advanced", "basic"], required_hardware="true")
    def test_17_running_vm_scaleup(self):
        """
        @Desc: Test to verify change service for Running VM
        @Steps:
        Step1: Checking if dynamic scaling of virtual machines is
               enabled in zone and template.
               If yes then continuing.
               If not then printing message that scale up is
               not possible for Running VM
        Step2: Deploying a VM
        Step3: Listing all the existing service offerings
        Step4: If there is a matching Service Offering for scale-up of
               running VM
               use that service offering. If not create one
               service offering for scale up.
        Step5: Perform change service (scale up) the Running VM
               deployed in step1
        Step6: Verifying that VM's service offerings is changed
        """
        if self.hypervisor.lower() == 'kvm':
            self.skipTest(
                "ScaleVM is not supported on KVM. Hence, skipping the test")
        # Checking if Dynamic scaling of VM is supported or not
        list_config = Configurations.list(
            self.apiClient,
            zoneid=self.zone.id,
            name="enable.dynamic.scale.vm"
        )
        status = validateList(list_config)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of configuration failed"
        )
        # Checking if dynamic scaling is allowed in Zone and Template
        if not (
                    (list_config[0].value is True) and (
                        self.template.isdynamicallyscalable)):
            self.debug(
                "Scale up of Running VM is not possible as Zone/Template\
                        does not support")
        else:
            # Listing all the VM's for a User
            list_vms_before = VirtualMachine.list(
                self.userapiclient,
                listall=self.services["listall"],
            )
            self.assertIsNone(
                list_vms_before,
                "Virtual Machine already exists for newly created user"
            )
            # Deploying a VM
            vm_created = VirtualMachine.create(
                self.userapiclient,
                self.services["virtual_machine"],
                accountid=self.account.name,
                domainid=self.account.domainid,
                serviceofferingid=self.service_offering.id,
            )
            self.assertIsNotNone(
                vm_created,
                "VM creation failed"
            )
            # Listing details of current Service Offering
            vm_so_list = ServiceOffering.list(
                self.userapiclient,
                id=vm_created.serviceofferingid
            )
            status = validateList(vm_so_list)
            self.assertEqual(
                PASS,
                status[0],
                "Listing of VM Service offering failed"
            )
            current_so = vm_so_list[0]
            # Listing all the VMs for a user again
            list_vms_after = VirtualMachine.list(
                self.userapiclient,
                listall=self.services["listall"],
            )
            status = validateList(list_vms_after)
            self.assertEqual(
                PASS,
                status[0],
                "VM creation failed"
            )
            # Verifying that the size of the list is 1
            self.assertEqual(
                1,
                len(list_vms_after),
                "VM list count is not matching"
            )
            # Listing all the existing service offerings
            service_offerings_list = ServiceOffering.list(
                self.userapiclient,
                virtualmachineid=vm_created.id
            )
            # Verifying if any Service offering available for scale up of VM
            so_exists = False
            if service_offerings_list is not None:
                for i in range(0, len(service_offerings_list)):
                    if not ((current_so.cpunumber >
                                 service_offerings_list[i].cpunumber or
                                     current_so.cpuspeed >
                                     service_offerings_list[i].cpuspeed or
                                     current_so.memory >
                                     service_offerings_list[i].memory) or
                                (current_so.cpunumber ==
                                     service_offerings_list[i].cpunumber and
                                         current_so.cpuspeed ==
                                         service_offerings_list[i].cpuspeed and
                                         current_so.memory ==
                                         service_offerings_list[i].memory)):
                        if (current_so.storagetype ==
                                service_offerings_list[i].storagetype):
                            so_exists = True
                            new_so = service_offerings_list[i]
                            break
            # If service offering does not exists, then creating one service
            # offering for scale up
            if not so_exists:
                self.services["service_offerings"]["small"][
                    "storagetype"] = current_so.storagetype
                new_so = ServiceOffering.create(
                    self.apiClient,
                    self.services["service_offerings"]["small"]
                )
                self.cleanup.append(new_so)
            # Scaling up the VM
            vm_created.scale_virtualmachine(
                self.userapiclient,
                new_so.id
            )
            # Listing VM details again
            list_vms_after = VirtualMachine.list(
                self.userapiclient,
                id=vm_created.id
            )
            status = validateList(list_vms_after)
            self.assertEqual(
                PASS,
                status[0],
                "Listing of VM failed"
            )
            self.assertEqual(
                1,
                len(list_vms_after),
                "VMs list is not as expected"
            )
            # Verifying that VM's service offerings is changed
            self.assertEqual(
                new_so.id,
                list_vms_after[0].serviceofferingid,
                "VM is not containing New Service Offering"
            )
        return

    @attr(tags=["advanced", "basic"], required_hardware="true")
    def test_18_stopped_vm_change_service(self):
        """
        @Desc: Test to verify change service for Stopped VM
        @Steps:
        Step1: Deploying a VM
        Step2: Stopping the VM deployed in step1
        Step3: Listing all the existing service offerings
        Step4: If there is a matching Service Offering for change service
               of stopped VM
               use that service offering. If not create one service
               offering for change service.
        Step5: Perform change service for the Stopped VM
        Step6: Verifying that VM's service offerings is changed
        """
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing details of current Service Offering
        vm_so_list = ServiceOffering.list(
            self.userapiclient,
            id=vm_created.serviceofferingid
        )
        status = validateList(vm_so_list)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of VM Service offering failed"
        )
        current_so = vm_so_list[0]
        # Listing all the VMs for a user again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Stopping the VM deployed above
        vm_created.stop(
            self.userapiclient,
            forced=True
        )
        # Listing all the service offerings
        service_offerings_list = ServiceOffering.list(
            self.userapiclient,
            virtualmachineid=vm_created.id
        )
        # Verifying if any Service offering available for change service of VM
        so_exists = False
        if service_offerings_list is not None:
            for i in range(0, len(service_offerings_list)):
                if ((current_so.id != service_offerings_list[i].id) and (
                            current_so.storagetype ==
                            service_offerings_list[i].storagetype)):
                    so_exists = True
                    new_so = service_offerings_list[i]
                    break
        # If service offering does not exists, then creating one service
        # offering for scale up
        if not so_exists:
            self.services["service_offerings"]["small"][
                "storagetype"] = current_so.storagetype
            new_so = ServiceOffering.create(
                self.apiClient,
                self.services["service_offerings"]["small"]
            )
            self.cleanup.append(new_so)
        # Changing service for the VM
        vm_created.scale_virtualmachine(
            self.userapiclient,
            new_so.id
        )
        # Listing VM details again
        list_vm = VirtualMachine.list(
            self.userapiclient,
            id=vm_created.id
        )
        status = validateList(list_vm)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of VM failed"
        )
        self.assertEqual(
            1,
            len(list_vm),
            "VMs list is not as expected"
        )
        # Verifying that VM's service offerings is changed
        self.assertEqual(
            new_so.id,
            list_vm[0].serviceofferingid,
            "VM is not containing New Service Offering"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="true")
    def test_19_create_reset_vm_sshkey(self):
        """
        @Desc: Test to verify creation and reset of SSH Key for VM
        @Steps:
        Step1: Deploying a VM
        Step2: Stopping the VM deployed in step1
        Step3: Listing all the SSH Key pairs
        Step4: Creating a new SSH Key pair
        Step5: Listing all the SSh Key pairs again
        Step6: Verifying that the key pairs list is increased by 1
        Step7: Resetting the VM SSH Key to the key pair created in step4
        Step8: Verifying that the new SSH Key pair is set to the VM
        """
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the VMs for a user again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Stopping the VM deployed above
        vm_created.stop(
            self.userapiclient,
            forced=True
        )
        # Listing all the SSH Key pairs
        list_keypairs_before = SSHKeyPair.list(
            self.userapiclient
        )
        list_keypairs_before_size = 0
        if list_keypairs_before is not None:
            list_keypairs_before_size = len(list_keypairs_before)

        # Creating a new Key pair
        new_keypair = SSHKeyPair.create(
            self.userapiclient,
            name="keypair1",
            account=self.account.name,
            domainid=self.domain.id
        )
        self.assertIsNotNone(
            new_keypair,
            "New Key pair generation failed"
        )
        self.assertEqual(
            "keypair1",
            new_keypair.name,
            "Key Pair not created with given name"
        )
        # Listing all the SSH Key pairs again
        list_keypairs_after = SSHKeyPair.list(
            self.userapiclient
        )
        status = validateList(list_keypairs_after)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of Key pairs failed"
        )
        # Verifying that list size is increased by 1
        self.assertEqual(
            list_keypairs_before_size + 1,
            len(list_keypairs_after),
            "List count is not matching"
        )
        # Resetting the VM SSH key to the Key pair created above
        vm_created.resetSshKey(
            self.userapiclient,
            keypair=new_keypair.name
        )
        # Listing VM details again
        list_vm = VirtualMachine.list(
            self.userapiclient,
            id=vm_created.id
        )
        status = validateList(list_vm)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of VM failed"
        )
        self.assertEqual(
            1,
            len(list_vm),
            "VMs list is not as expected"
        )
        # Verifying that VM's SSH keypair is set to newly created keypair
        self.assertEqual(
            new_keypair.name,
            list_vm[0].keypair,
            "VM is not set to newly created SSH Key pair"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="false")
    def test_20_update_vm_displayname_group(self):
        """
        @Desc: Test to verify Update VM details
        @Steps:
        Step1: List all the VM's for a user
        Step2: Deploy a VM with all parameters
        Step3: Listing all the VM's again for the user
        Step4: Verifying that list size is increased by 1
        Step5: Updating VM details - displayname, group
        Step6: Listing the VM deployed in step 2 by ID
        Step7: Verifying that displayname, group details of the VM are updated
        """
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        self.services["virtual_machine"]["keyboard"] = "us"
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
            group="groupName"
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Verifying the displayname and group details for deployed VM
        self.assertEqual(
            self.services["virtual_machine"]["displayname"],
            vm_created.displayname,
            "Display name of VM is not as expected"
        )
        self.assertEqual(
            "groupName",
            vm_created.group,
            "Group of VM is not as expected"
        )
        # Listing all the VMs for a user again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Updating the VM details - displayname and group
        vm_created.update(
            self.userapiclient,
            displayname="DisplayName",
            group="Group",
            haenable=False
        )
        # Listing VM details again
        list_vm = VirtualMachine.list(
            self.userapiclient,
            id=vm_created.id,
        )
        status = validateList(list_vm)
        self.assertEqual(
            PASS,
            status[0],
            "Listing of VM by Id failed"
        )
        self.assertEqual(
            1,
            len(list_vm),
            "Count of List VM by Id is not matching"
        )
        # Verifying that displayname and group details are updated
        self.assertEqual(
            "DisplayName",
            list_vm[0].displayname,
            "Displayname of VM is not updated"
        )
        self.assertEqual(
            "Group",
            list_vm[0].group,
            "Group of VM is not updated"
        )
        return

    @attr(tags=["advanced", "basic"], required_hardware="true")
    def test_21_restore_vm(self):
        """
        @Desc: Test to verify Restore VM
        @Steps:
        Step1: List all the VM's for a user
        Step2: Deploy a VM with all parameters
        Step3: Listing all the VM's again for the user
        Step4: Verifying that list size is increased by 1
        Step5: Restoring the VM deployed in step2
        Step6: Verifying that restored VM details are same as
               the VM deployed in step2
        """
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the VMs for a user again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Restoring the VM
        restored_vm = vm_created.restore(self.userapiclient)
        self.assertIsNotNone(
            restored_vm,
            "VM restore failed"
        )
        # Verifying the restored VM details
        expected_dict = {
            "id": vm_created.id,
            "name": vm_created.name,
            "displayname": vm_created.displayname,
            "state": vm_created.state,
            "zoneid": vm_created.zoneid,
            "account": vm_created.account,
            "template": vm_created.templateid
        }
        actual_dict = {
            "id": restored_vm.id,
            "name": restored_vm.name,
            "displayname": restored_vm.displayname,
            "state": restored_vm.state,
            "zoneid": restored_vm.zoneid,
            "account": restored_vm.account,
            "template": restored_vm.templateid
        }
        restored_vm_status = self.__verify_values(
            expected_dict,
            actual_dict
        )
        self.assertEqual(
            True,
            restored_vm_status,
            "Restored VM details are not as expected"
        )
        return

    @attr(tags=["advanced"], required_hardware="false")
    def test_22_deploy_vm_multiple_networks(self):
        """
        @Desc: Test to verify deploy VM with multiple networks
        @Steps:
        Step1: List all the networks for user
        Step2: If size of list networks is greater than 2 then
               get all the networks id's
                Else create 2 networks and get network id's
        Step3: List all the VM's for a user
        Step4: Deploy a VM with multiple network id's
        Step5: Listing all the VM's again for the user
        Step6: Verifying that list size is increased by 1
        Step7: Verify that VM is associated with multiple networks
        """
        # Listing all the networks available
        networks_list_before = Network.list(
            self.userapiclient,
            listall=self.services["listall"],
            type="Isolated"
        )
        networks_list_size = 0
        if networks_list_before is not None:
            networks_list_size = len(networks_list_before)

        # Listing Network Offerings
        network_offerings_list = NetworkOffering.list(
            self.apiClient,
            forvpc="false",
            guestiptype="Isolated",
            state="Enabled",
            supportedservices="SourceNat",
            zoneid=self.zone.id
        )
        status = validateList(network_offerings_list)
        self.assertEqual(
            PASS,
            status[0],
            "Isolated Network Offerings with sourceNat enabled are not found"
        )
        while networks_list_size < 2:
            # Creating a network
            network = Network.create(
                self.userapiclient,
                self.services["network"],
                accountid=self.account.name,
                domainid=self.domain.id,
                networkofferingid=network_offerings_list[0].id,
                zoneid=self.zone.id
            )
            self.assertIsNotNone(
                network,
                "Network creation failed"
            )
            networks_list_size = networks_list_size + 1

        # Listing the networks again
        networks_list_after = Network.list(
            self.userapiclient,
            listall=self.services["listall"],
            type="Isolated"
        )
        status = validateList(network_offerings_list)
        self.assertEqual(
            PASS,
            status[0],
            "Listing networks failed"
        )
        # populating network id's
        networkids = networks_list_after[
                         0].id + "," + networks_list_after[1].id
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            networkids=networkids,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the VMs for a user again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Verifying that the NIC's in VM created are same as provided
        vm_nics = vm_created.nic
        # Verifying that the size of nics is 2
        self.assertEqual(
            2,
            len(vm_nics),
            "NIC's count in VM created is not matching"
        )
        # Verifying that NIC network ID's are as expected
        for i in range(0, len(vm_nics)):
            if vm_nics[i].isdefault is True:
                self.assertEqual(
                    networks_list_after[0].id,
                    vm_nics[i].networkid,
                    "Default NIC is not as expected"
                )
            else:
                self.assertEqual(
                    networks_list_after[1].id,
                    vm_nics[i].networkid,
                    "Non Default NIC is not as expected"
                )
        return

    @attr(tags=["basic"], required_hardware="true")
    def test_23_deploy_vm_multiple_securitygroups(self):
        """
        @Desc: Test to verify deploy VM with multiple Security Groups
        @Steps:
        Step1: List all the security groups for user
        Step2: If size of list security groups is greater than 2 then get
               all the security groups id's
               Else creating 2 security groups and get security groups id's
        Step3: List all the VM's for a user
        Step4: Deploy a VM with multiple security groups id's
        Step5: Listing all the VM's again for the user
        Step6: Verifying that list size is increased by 1
        Step7: Verify that VM is associated with multiple security groups
        """
        # Listing all the security groups available
        security_groups_list = SecurityGroup.list(
            self.userapiclient,
            listall=self.services["listall"],
            domainid=self.domain.id
        )
        security_groups_list_size = 0
        if security_groups_list is not None:
            security_groups_list_size = len(security_groups_list)

        while security_groups_list_size < 2:
            # Creating a security group
            security_group = SecurityGroup.create(
                self.userapiclient,
                self.services["security_group"],
                account=self.account.name,
                domainid=self.domain.id
            )
            self.assertIsNotNone(
                security_group,
                "Security Group creation failed"
            )
            security_groups_list_size = security_groups_list_size + 1

        # Listing the networks again
        security_groups_list = SecurityGroup.list(
            self.userapiclient,
            listall=self.services["listall"],
            domainid=self.domain.id
        )
        status = validateList(security_groups_list)
        self.assertEqual(
            PASS,
            status[0],
            "Listing Security Groups failed"
        )
        # populating Security Groups id's
        securitygroupids = {
            security_groups_list[0].id,
            security_groups_list[1].id}
        # Listing all the VM's for a User
        list_vms_before = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        self.assertIsNone(
            list_vms_before,
            "Virtual Machine already exists for newly created user"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            serviceofferingid=self.service_offering.id,
            securitygroupids=securitygroupids,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the VMs for a user again
        list_vms_after = VirtualMachine.list(
            self.userapiclient,
            listall=self.services["listall"],
        )
        status = validateList(list_vms_after)
        self.assertEqual(
            PASS,
            status[0],
            "VM creation failed"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(list_vms_after),
            "VM list count is not matching"
        )
        # Verifying that the Security Groups's in VM created are same as
        # provided
        vm_securitygroups = vm_created.securitygroup
        # Verifying that the size of security groups is 2
        self.assertEqual(
            2,
            len(vm_securitygroups),
            "Security Groups count in VM created is not matching"
        )
        # Verifying that Security Group network ID's are as expected
        vm_securitygroups_flag = True
        for i in range(0, len(vm_securitygroups)):
            if ((vm_securitygroups[i].id != security_groups_list[0].id) and
                    (vm_securitygroups[i].id != security_groups_list[1].id)):
                vm_securitygroups_flag = False
                break

        self.assertEqual(
            True,
            vm_securitygroups_flag,
            "Security Groups in VM are not same as created"
        )
        return

    @attr(tags=["advanced"], required_hardware="false")
    def test_24_deploy_vm_with_static_ip_ES1662(self):
        """
        @Desc: Test to verify deploy VM with static ip address assignment
        @Steps:
        Step1: Create a network for the user
        Step2: List the network and check that it is created for the user
        Step3: Deploy vm with ip address in the above network
        Step4: List the vm and verify the ip address in the response
        """
        # Listing Network Offerings
        network_offerings_list = NetworkOffering.list(
            self.apiClient,
            forvpc="false",
            guestiptype="Isolated",
            state="Enabled",
            supportedservices="SourceNat",
            zoneid=self.zone.id
        )
        status = validateList(network_offerings_list)
        self.assertEqual(
            PASS,
            status[0],
            "Isolated Network Offerings with sourceNat enabled are not found"
        )
        """
        Create Isolated network with ip range
        """
        self.services["network"]["startip"] = "10.1.1.2"
        self.services["network"]["endip"] = "10.1.1.254"
        self.services["network"]["gateway"] = "10.1.1.1"
        self.services["network"]["netmask"] = "255.255.255.0"
        vm_ip = "10.1.1.10"
        """
        Creating isolated/guest network with ip range
        """
        network = Network.create(
            self.userapiclient,
            self.services["network"],
            accountid=self.account.name,
            domainid=self.domain.id,
            networkofferingid=network_offerings_list[0].id,
            zoneid=self.zone.id
        )
        self.assertIsNotNone(
            network,
            "Network creation failed"
        )
        # Deploying a VM
        vm_created = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            networkids=network.id,
            ipaddress=vm_ip,
            serviceofferingid=self.service_offering.id,
        )
        self.assertIsNotNone(
            vm_created,
            "VM creation failed"
        )
        # Listing all the VMs for a user again
        vm_response = VirtualMachine.list(
            self.userapiclient,
            id=vm_created.id,
        )
        status = validateList(vm_response)
        self.assertEqual(
            PASS,
            status[0],
            "vm list returned invalid response"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(vm_response),
            "VM list count is not matching"
        )
        # Verifying that the NIC's in VM created are same as provided
        vm_nics = vm_created.nic
        status = validateList(vm_nics)
        self.assertEqual(
            PASS,
            status[0],
            "vm list returned invalid response for vm nics"
        )
        # Verifying that the size of nics is 1
        self.assertEqual(
            1,
            len(vm_nics),
            "VM is created with more than one nic which is not expected"
        )
        """
        Verifying that NIC IP address is as expected
        """
        self.assertEqual(
            str(vm_nics[0].ipaddress),
            vm_ip,
            "VM is not created with static ip address used in vm deployment"
        )
        try:
            vm_created.delete(self.apiClient, expunge=True)
        except Exception as e:
            raise Exception("Warning: Exception in expunging vm : %s" % e)
        return

    @attr(tags=["advanced"], required_hardware="false")
    def test_25_ip_reallocation_ES1377(self):
        """
        @Desc: Test to verify dnsmasq dhcp conflict issue due to
               /ect/hosts not getting updated
        @Steps:
        Step1: Create a network for the user
        Step2: List the network and check that it is created for the user
        Step3: Deploy vm1 with hostname hostA and ip address IP A in the
               above network
        Step4: List the vm and verify the ip address in the response and
               verify ssh access to vm
        Step5: Deploy vm2 with hostname hostB and ip address IP B in the
               same network
        Step6: Repeat step4
        Step7: Destroy vm1 and vm2
        Step8: Deploy vm3 with hostname hostA and ip address IP B
        Step9: Repeat step4
        Step10: Deploy vm4 with IP A and hostC
        Step11: Repeat step4
        """
        # Listing Network Offerings
        network_offerings_list = NetworkOffering.list(
            self.apiClient,
            forvpc="false",
            guestiptype="Isolated",
            state="Enabled",
            supportedservices="SourceNat",
            zoneid=self.zone.id
        )
        status = validateList(network_offerings_list)
        self.assertEqual(
            PASS,
            status[0],
            "Isolated Network Offerings with sourceNat enabled are not found"
        )
        """
        Create Isolated network with ip range
        """
        self.services["network"]["startip"] = "10.1.1.2"
        self.services["network"]["endip"] = "10.1.1.254"
        self.services["network"]["gateway"] = "10.1.1.1"
        self.services["network"]["netmask"] = "255.255.255.0"
        """
        Creating isolated/guest network with ip range
        """
        network = Network.create(
            self.userapiclient,
            self.services["network"],
            accountid=self.account.name,
            domainid=self.domain.id,
            networkofferingid=network_offerings_list[0].id,
            zoneid=self.zone.id
        )
        self.assertIsNotNone(
            network,
            "Network creation failed"
        )
        vm_ip1 = "10.1.1.10"
        name1 = "hostA"
        self.debug("network id:%s" % network.id)
        self.services["virtual_machine"]["name"] = name1
        # Deploying a VM
        vm1 = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            networkids=[network.id],
            ipaddress=vm_ip1,
            serviceofferingid=self.service_offering.id,
            mode="advanced",
        )
        self.assertIsNotNone(
            vm1, "VM1 creation failed with ip address %s and host name %s" %
            (vm_ip1, name1))
        # self.cleanup.append(vm_created)
        # Listing all the VMs for a user again
        vm_response = VirtualMachine.list(
            self.userapiclient,
            id=vm1.id,
        )
        status = validateList(vm_response)
        self.assertEqual(
            PASS,
            status[0],
            "vm list api returned invalid response for vm1"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(vm_response),
            "VM list count is not matching"
        )
        # Deploying a VM
        vm_ip2 = "10.1.1.20"
        name2 = "hostB"
        self.services["virtual_machine"]["name"] = name2
        vm2 = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            networkids=[network.id],
            ipaddress=vm_ip2,
            serviceofferingid=self.service_offering.id,
            mode="advanced",
        )
        self.assertIsNotNone(
            vm2,
            "VM2 creation failed"
        )
        vm_response = VirtualMachine.list(
            self.userapiclient,
            id=vm2.id,
        )
        status = validateList(vm_response)
        self.assertEqual(
            PASS,
            status[0],
            "vm list api returned invalid response for vm2"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(vm_response),
            "VM list count is not matching after vm2 deployment"
        )
        try:
            vm1.delete(self.apiClient, expunge=True)
            vm2.delete(self.apiClient, expunge=True)
        except Exception as e:
            raise Exception("Warning: Exception in expunging vms : %s" % e)
        """
        Deploy vm3 with ip address of vm1 and host name of vm2 so both the vm1
        and vm2 entries would be deleted from dhcphosts file on VR becase
        dhcprelease matches entries with host name and ip address so it
        matches both the entries.
        """
        # Deploying a VM
        self.services["virtual_machine"]["name"] = name2
        vm3 = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            networkids=[network.id],
            ipaddress=vm_ip1,
            serviceofferingid=self.service_offering.id,
            mode="advanced",
        )
        self.assertIsNotNone(
            vm3,
            "VM3 creation failed"
        )
        vm_response = VirtualMachine.list(
            self.userapiclient,
            id=vm3.id,
        )
        status = validateList(vm_response)
        self.assertEqual(
            PASS,
            status[0],
            "vm list api returned invalid response for vm3"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(vm_response),
            "VM list count is not matching after vm2 deployment"
        )
        # Deploying a VM
        """
        Deploy vm4 with ip address of vm2. dnsmasq and dhcprelase
        should be in sync. We should not see dhcp lease block due to IP
        reallocation.
        """
        name3 = "hostC"
        self.services["virtual_machine"]["name"] = name3
        vm4 = VirtualMachine.create(
            self.userapiclient,
            self.services["virtual_machine"],
            accountid=self.account.name,
            domainid=self.account.domainid,
            networkids=[network.id],
            ipaddress=vm_ip2,
            serviceofferingid=self.service_offering.id,
            mode="advanced",
        )
        self.assertIsNotNone(
            vm4,
            "VM4 creation failed"
        )
        vm_response = VirtualMachine.list(
            self.userapiclient,
            id=vm4.id,
        )
        status = validateList(vm_response)
        self.assertEqual(
            PASS,
            status[0],
            "vm list api returned invalid response for vm4"
        )
        # Verifying that the size of the list is 1
        self.assertEqual(
            1,
            len(vm_response),
            "VM list count is not matching after vm2 deployment"
        )
        try:
            vm3.delete(self.apiClient, expunge=True)
            vm4.delete(self.apiClient, expunge=True)
        except Exception as e:
            raise Exception(
                "Warning: Exception in expunging vms vm3 and vm4 : %s" %
                e)
        return
