# 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. """ BVT tests for CM Deployment Planner """ # Import Local Modules from marvin.cloudstackAPI import (deployVirtualMachine, destroyVirtualMachine) from marvin.cloudstackTestCase import cloudstackTestCase from marvin.lib.base import (Account, ServiceOffering, Host, Pod, Cluster) from marvin.lib.common import (get_domain, get_zone, get_template) from marvin.lib.utils import cleanup_resources from nose.plugins.attrib import attr class TestVMDeploymentPlanner(cloudstackTestCase): @classmethod def setUpClass(cls): testClient = super(TestVMDeploymentPlanner, cls).getClsTestClient() cls.apiclient = testClient.getApiClient() cls.services = testClient.getParsedTestDataConfig() # Get Zone, Domain and templates cls.domain = get_domain(cls.apiclient) cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) cls.hypervisor = testClient.getHypervisorInfo() cls.services['mode'] = cls.zone.networktype cls.services["virtual_machine"]["zoneid"] = cls.zone.id # Create an account, network, VM and IP addresses cls.account = Account.create( cls.apiclient, cls.services["account"], domainid=cls.domain.id ) cls.service_offering = ServiceOffering.create( cls.apiclient, cls.services["service_offerings"]["tiny"] ) cls._cleanup = [ cls.account, cls.service_offering ] @classmethod def tearDownClass(cls): super(TestVMDeploymentPlanner, cls).tearDownClass() def deploy_vm(self, destination_id): cmd = deployVirtualMachine.deployVirtualMachineCmd() template = get_template( self.apiclient, self.zone.id ) cmd.zoneid = self.zone.id cmd.templateid = template.id cmd.serviceofferingid = self.service_offering.id cmd.hostid = destination_id return self.apiclient.deployVirtualMachine(cmd) def destroy_vm(self, vm_id): cmd = destroyVirtualMachine.destroyVirtualMachineCmd() cmd.expunge = True cmd.id = vm_id return self.apiclient.destroyVirtualMachine(cmd) @attr(tags=["advanced", "advancedns", "ssh", "smoke"], required_hardware="false") def test_01_deploy_vm_on_specific_host(self): hosts = Host.list( self.apiclient, zoneid=self.zone.id, type='Routing' ) target_id = hosts[0].id vm = self.deploy_vm(target_id) self.assertEqual( target_id, vm.hostid, "VM instance was not deployed on target host ID") self.destroy_vm(vm.id) @attr(tags=["advanced", "advancedns", "ssh", "smoke"], required_hardware="false") def test_02_deploy_vm_on_specific_cluster(self): # Select deployment cluster clusters = Cluster.list( self.apiclient, ) target_cluster = clusters[0] target_id = target_cluster.id cluster_hypervisor = target_cluster.hypervisortype template = get_template( self.apiclient, hypervisor=cluster_hypervisor ) # deploy vm on cluster cmd = deployVirtualMachine.deployVirtualMachineCmd() cmd.zoneid = target_cluster.zoneid cmd.serviceofferingid = self.service_offering.id cmd.templateid = template.id cmd.clusterid = target_id vm = self.apiclient.deployVirtualMachine(cmd) vm_host = Host.list(self.apiclient, id=vm.hostid ) self.assertEqual( target_id, vm_host[0].clusterid, "VM was not deployed on the provided cluster" ) self.destroy_vm(vm.id) @attr(tags=["advanced", "advancedns", "ssh", "smoke"], required_hardware="false") def test_03_deploy_vm_on_specific_pod(self): pods = Pod.list( self.apiclient, ) target_pod = pods[0] # Get host by Pod ID host = Host.list( self.apiclient, podid=target_pod.id) # deploy vm on pod cmd = deployVirtualMachine.deployVirtualMachineCmd() cmd.zoneid = target_pod.zoneid cmd.serviceofferingid = self.service_offering.id template = get_template( self.apiclient, hypervisor=host[0].hypervisortype ) cmd.templateid = template.id cmd.podid = target_pod.id vm = self.apiclient.deployVirtualMachine(cmd) vm_host = Host.list(self.apiclient, id=vm.hostid ) self.assertEqual( target_pod.id, vm_host[0].podid, "VM was not deployed on the target pod" ) self.destroy_vm(vm.id) @attr(tags=["advanced", "advancedns", "ssh", "smoke"], required_hardware="false") def test_04_deploy_vm_on_host_override_pod_and_cluster(self): # Optional parameters pod, cluster and host pod = Pod.list(self.apiclient, zoneid=self.zone.id)[0] clusters = Cluster.list(self.apiclient, zoneid=self.zone.id, podid=pod.id) self.assertEqual( isinstance(clusters, list), True, "Check list response returns a valid list" ) host = Host.list(self.apiclient, zoneid=self.zone.id, clusterid=clusters[0].id, type='Routing')[0] cmd = deployVirtualMachine.deployVirtualMachineCmd() # Required parameters cmd.zoneid = self.zone.id cmd.serviceofferingid = self.service_offering.id template = get_template(self.apiclient, zone_id=self.zone.id, hypervisor=host.hypervisor) cmd.templateid = template.id # Add optional deployment params cmd.podid = pod.id cmd.clusterid = clusters[1].id if len(clusters) > 1 else clusters[0].id cmd.hostid = host.id vm = self.apiclient.deployVirtualMachine(cmd) self.assertEqual( vm.hostid, host.id, "VM was not deployed on the target host ID" ) self.destroy_vm(vm.id) @attr(tags=["advanced", "advancedns", "ssh", "smoke"], required_hardware="false") def test_05_deploy_vm_on_cluster_override_pod(self): # Optional parameters pod, cluster and host pod = Pod.list(self.apiclient, zoneid=self.zone.id)[0] clusters = Cluster.list(self.apiclient, zoneid=self.zone.id, podid=pod.id) self.assertEqual( isinstance(clusters, list), True, "Check list response returns a valid list" ) cmd = deployVirtualMachine.deployVirtualMachineCmd() # Required parameters cmd.zoneid = self.zone.id cmd.serviceofferingid = self.service_offering.id template = get_template(self.apiclient, zone_id=self.zone.id, hypervisor=clusters[0].hypervisortype) cmd.templateid = template.id # Add optional deployment params cmd.podid = pod.id cmd.clusterid = clusters[0].id vm = self.apiclient.deployVirtualMachine(cmd) vm_host = Host.list(self.apiclient, id=vm.hostid ) self.assertEqual( vm_host[0].clusterid, clusters[0].id, "VM was not deployed on the target cluster" ) self.destroy_vm(vm.id)