# 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 from marvin.lib.utils import (cleanup_resources, validateList, get_hypervisor_type) from marvin.lib.base import (Account, VirtualMachine, ServiceOffering, Volume, DiskOffering, VmSnapshot, Template, listConfigurations) from marvin.lib.common import (get_domain,list_isos, get_zone, get_template) from nose.plugins.attrib import attr from ast import literal_eval from marvin.codes import PASS from marvin.cloudstackException import CloudstackAPIException class TestVMware(cloudstackTestCase): @classmethod def setUpClass(cls): try: cls._cleanup = [] cls.testClient = super(TestVMware, 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.testClient.getHypervisorInfo() 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.account = Account.create( cls.api_client, cls.services["account"], domainid=cls.domain.id ) # Getting authentication for user in newly created Account cls.user = cls.account.user[0] cls.userapiclient = cls.testClient.getUserApiClient(cls.user.username, cls.domain.name) cls._cleanup.append(cls.disk_offering) cls._cleanup.append(cls.service_offering) cls._cleanup.append(cls.account) 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 = [] def tearDown(self): #Clean up, terminate the created volumes 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) @attr(tags=["advanced"], required_hardware="true") def test_01_attach_volume_ide(self): """ @desc: Exception when attaching data disk to RHEL VM on vSphere Step1: Confirm that vmware.root.disk.controller = "ide" in Global Settings. Step2: Register RHEl 6.0 template and deploy a VM. Step3: Note that the root disk is attached to IDE. Step4: Create new DATA disk and attempt to attach it to the VM. Verify that step4 succeeds without any exception """ self.hypervisor = str(get_hypervisor_type(self.api_client)).lower() if self.hypervisor != "vmware": self.skipTest("This test can be run only on vmware") cmd = listConfigurations.listConfigurationsCmd() cmd.name = "vmware.root.disk.controller" cmd.listAll = True try: config_descs = self.api_client.listConfigurations(cmd) except Exception as e: raise Exception("Failed to fetch configurations: %s" % e) if not isinstance(config_descs, list): raise Exception("List configs didn't returned a valid data") config_desc = config_descs[0] if str(config_desc.value).lower() != "ide": self.skipTest("This test is invalid if {} is not set to ide".format(config_desc.name)) """ Register RHEL 6.0 template and deploy vm """ template = Template.register( self.userapiclient, self.services["rhel60template"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, hypervisor=self.hypervisor ) self.assertIsNotNone(template,"Failed to register Rhel6 template") self.debug( "Registered a template with format {} and id {}".format( self.services["rhel60template"]["format"],template.id) ) template.download(self.userapiclient) self.cleanup.append(template) vm = VirtualMachine.create( self.userapiclient, self.services["virtual_machine"], accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, templateid=template.id, zoneid=self.zone.id ) self.assertIsNotNone(vm,"Failed to deploy virtual machine") self.cleanup.append(vm) response = VirtualMachine.list(self.userapiclient,id=vm.id) status = validateList(response) self.assertEqual(status[0],PASS,"list vm response returned invalid list") """ list root disk of the vm created above and make sure that device type is ide """ volume_res = Volume.list( self.userapiclient, virtualmachineid=vm.id, type="root", listAll="true" ) self.assertEqual(validateList(volume_res)[0],PASS,"list vm response returned invalid list") chaininfo = volume_res[0].chaininfo device_Bus = literal_eval(chaininfo)["diskDeviceBusName"] if "ide" not in device_Bus: self.fail("Root disk is not created with device type IDE") disk = Volume.create( self.userapiclient, self.services["volume"], zoneid=self.zone.id, diskofferingid=self.disk_offering.id ) self.assertIsNotNone(disk,"Failed to create custom volume") self.cleanup.append(disk) try: vm.attach_volume(self.userapiclient,disk) list_volumes = Volume.list( self.userapiclient, listall=self.services["listall"], id=disk.id ) attached_volume = list_volumes[0] self.assertEqual( disk.id, attached_volume.id, "list volume response does not match with the volume created and attached to vm" ) except Exception as e: self.fail("Failed to attach data disk to RHEL vm whose root disk type is IDE") return # @attr(tags=["advanced", "basic"], required_hardware="true") @attr(tags=["TODO"], required_hardware="true") def test_02_attach_ISO_in_CentOSVM(self): """ @desc:Incorrect guest os mapping in vmware for CentOS 5.9 and above Step1 :Register an CentOS 6.3 template Step2 :Launch a VM Step3: Try to attach VMware Tools ISO Step4: Verify VMware tools ISO attached correctly """ self.hypervisor = str(get_hypervisor_type(self.api_client)).lower() if self.hypervisor != "vmware": self.skipTest("This test can be run only on vmware") template = Template.register( self.userapiclient, self.services["CentOS6.3template"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, hypervisor=self.hypervisor ) self.debug( "Registered a template with format {} and id {}".format( self.services["CentOS6.3template"]["format"],template.id) ) template.download(self.userapiclient) self.cleanup.append(template) vm = VirtualMachine.create( self.userapiclient, self.services["virtual_machine"], accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, templateid=template.id, zoneid=self.zone.id ) self.cleanup.append(vm) response = VirtualMachine.list(self.userapiclient,id=vm.id) status = validateList(response) self.assertEqual(status[0],PASS,"list vm response returned invalid list") list_default_iso_response = list_isos( self.api_client, name="vmware-tools.iso", account="system", isready="true" ) status = validateList(list_default_iso_response) self.assertEqual( PASS, status[0], "ISO list is empty") self.debug( "Registered a ISO with name {}".format(list_default_iso_response[0].name)) try: vm.attach_iso(self.userapiclient,list_default_iso_response[0]) except CloudstackAPIException as e: self.fail("Attached ISO failed : %s" % e) response = VirtualMachine.list(self.userapiclient, id=vm.id) status = validateList(response) self.assertEqual(status[0], PASS,"list vm response returned invalid list") attachedIsoName=response[0].isoname; self.assertEqual(attachedIsoName, "vmware-tools.iso", "vmware-tools.iso not attached") return # @attr(tags=["advanced", "basic"], required_hardware="true") @attr(tags=["TODO"], required_hardware="true") def test_03_attach_ISO_in_RHEL7OSVM(self): """ @desc:Incorrect guest os mapping in vmware for Rhel7. Add a valid RHEL7 URL to execute this test case Step1 :Register an RHEL 7 template Step2 :Launch a VM Step3: Try to attach VMware Tools ISO Step4: Verify VMware tools ISO attached correctly """ self.hypervisor = str(get_hypervisor_type(self.api_client)).lower() if self.hypervisor != "vmware": self.skipTest("This test can be run only on vmware") self.services["Rhel7template"]["url"]="http://10.147.28.7/templates/rhel71.ova", template = Template.register( self.userapiclient, self.services["Rhel7template"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, hypervisor=self.hypervisor ) self.debug( "Registered a template with format {} and id {}".format( self.services["Rhel7template"]["format"],template.id) ) template.download(self.userapiclient) self.cleanup.append(template) vm = VirtualMachine.create( self.userapiclient, self.services["virtual_machine"], accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, templateid=template.id, zoneid=self.zone.id ) self.cleanup.append(vm) response = VirtualMachine.list(self.userapiclient,id=vm.id) status = validateList(response) self.assertEqual(status[0],PASS,"list vm response returned invalid list") list_default_iso_response = list_isos( self.api_client, name="vmware-tools.iso", account="system", isready="true" ) status = validateList(list_default_iso_response) self.assertEqual( PASS, status[0], "ISO list is empty") self.debug( "Registered a ISO with name {}".format(list_default_iso_response[0].name)) try: vm.attach_iso(self.userapiclient,list_default_iso_response[0]) except CloudstackAPIException as e: self.fail("Attached ISO failed : %s" % e) response = VirtualMachine.list(self.userapiclient, id=vm.id) status = validateList(response) self.assertEqual(status[0], PASS,"list vm response returned invalid list") attachedIsoName=response[0].isoname; self.assertEqual(attachedIsoName, "vmware-tools.iso", "vmware-tools.iso not attached") return @attr(tags=["advanced", "basic"], required_hardware="true") def test_04_check_vm_snapshot_creation_after_Instance_creation(self): """ @summary: Test if Snapshot creation is successful after VM deployment CLOUDSTACK-8830 : VM snapshot creation fails for 12 min Step1: Create a VM with any Service offering Step2: Create a VM snapshot Step3: Verify is VM SS creation is failed """ if self.hypervisor.lower() not in ['vmware']: self.skipTest("This test case is only for vmware. Hence, skipping the test") vm = VirtualMachine.create( self.userapiclient, self.services["virtual_machine"], accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, templateid=self.template.id, zoneid=self.zone.id ) snapshot_created_1 = VmSnapshot.create( self.userapiclient, vm.id ) self.assertIsNotNone( snapshot_created_1, "VM Snapshot creation failed" )