| # 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, |
| Template, |
| Configurations) |
| from marvin.lib.common import (get_domain, |
| get_zone, |
| get_template) |
| from nose.plugins.attrib import attr |
| from marvin.codes import PASS |
| from marvin.sshClient import SshClient |
| import time |
| |
| class TestInstance(cloudstackTestCase): |
| |
| @classmethod |
| def setUpClass(cls): |
| try: |
| cls._cleanup = [] |
| cls.testClient = super(TestInstance, cls).getClsTestClient() |
| cls.api_client = cls.testClient.getApiClient() |
| cls.services = cls.testClient.getParsedTestDataConfig() |
| # 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"]["small"] |
| ) |
| 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) |
| cls.mgtSvrDetails = cls.config.__dict__["mgtSvr"][0].__dict__ |
| 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) |
| |
| def RestartServers(self): |
| """ Restart management server and usage server """ |
| |
| sshClient = SshClient( |
| self.mgtSvrDetails["mgtSvrIp"], |
| 22, |
| self.mgtSvrDetails["user"], |
| self.mgtSvrDetails["passwd"] |
| ) |
| command = "service cloudstack-management restart" |
| sshClient.execute(command) |
| return |
| |
| def updateConfigurAndRestart(self,name, value): |
| Configurations.update(self.apiClient, |
| name,value ) |
| self.RestartServers() |
| time.sleep(self.services["sleep"]) |
| |
| @attr(tags=["advanced"], required_hardware="true") |
| def test1_attach_volume(self): |
| """ |
| @desc: Unable to attach 7th Disk to windows server 2012R2 instance. Add a valid windows server 2012 URL to execute this test case |
| Step1: Set global config vmware.root.disk.controller to 'osdefault' |
| Step2: Deploy a Windows 2012 R2 instance. |
| Step3: Attach 6 disks to the VM. |
| Step4: Try attaching a 7th disk 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") |
| self.updateConfigurAndRestart("vmware.root.disk.controller","osdefault") |
| |
| self.services["Windows Server 2012"]["url"]="http://10.147.28.7/templates/Windows2012/WindowsServer2012R2.ova.gz", |
| template = Template.register( |
| self.userapiclient, |
| self.services["Windows Server 2012"], |
| zoneid=self.zone.id, |
| account=self.account.name, |
| domainid=self.account.domainid |
| ) |
| self.assertIsNotNone(template,"Failed to register Windows server 2012 R2 template") |
| self.debug( |
| "Registered a template with format {} and id {}".format( |
| self.services["Windows Server 2012"]["format"],template.id) |
| ) |
| template.download(self.userapiclient) |
| self.cleanup.append(template) |
| |
| # Creating a big service offering for windows VM launch |
| big_service_offering = ServiceOffering.create( |
| self.apiClient, |
| self.services["service_offerings"]["big"] |
| ) |
| self.cleanup.append(big_service_offering) |
| vm = VirtualMachine.create( |
| self.userapiclient, |
| self.services["virtual_machine"], |
| accountid=self.account.name, |
| domainid=self.account.domainid, |
| serviceofferingid=big_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") |
| |
| for i in range(0,7): |
| self.services["volume"]["diskname"]=i |
| 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 Windows server 2012 R2 vm ".format(i)) |
| return |
| @attr(tags=["advanced"], required_hardware="true") |
| def test_Scale_VM(self): |
| """ |
| @desc: |
| 1. Enable dynamic scaling in Global settings |
| 2. Register an CentOS 7 tempplate(with tools) and tick dynamic scaling |
| 3. Deploy VM with this template |
| 4.Start the VM and try to change service offering |
| |
| """ |
| self.hypervisor = str(get_hypervisor_type(self.api_client)).lower() |
| if self.hypervisor != "xenserver": |
| self.skipTest("This test can be run only on xenserver") |
| self.updateConfigurAndRestart("enable.dynamic.scale.vm","true") |
| template = Template.register( |
| self.userapiclient, |
| self.services["CentOS7template"], |
| zoneid=self.zone.id, |
| account=self.account.name, |
| domainid=self.account.domainid |
| ) |
| self.assertIsNotNone(template,"Failed to register CentOS 7 template") |
| self.debug( |
| "Registered a template with format {} and id {}".format( |
| self.services["CentOS7template"]["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") |
| self.assertEqual(status[1].state,"Running", "vm is not running") |
| |
| service_offering = ServiceOffering.create( |
| self.apiClient, |
| self.services["service_offerings"]["big"] |
| ) |
| time.sleep(self.services["sleep"]) |
| vm.scale(self.userapiclient,service_offering.id) |
| scaleresponse = VirtualMachine.list(self.userapiclient,id=vm.id) |
| scalestatus = validateList(scaleresponse) |
| self.assertEqual(scalestatus[0],PASS,"list vm response returned invalid list") |
| self.assertEqual(scalestatus[1].serviceofferingname,service_offering.name, " service offering is not same") |
| self.assertEqual(scalestatus[1].serviceofferingid,service_offering.id, " service offering ids are not same") |
| |
| |
| return |