# 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. # this script will cover VMdeployment with Userdata tests for MultiNic from marvin.cloudstackTestCase import cloudstackTestCase from marvin.lib.base import (Account, Network, NetworkOffering, ServiceOffering, VirtualMachine) from marvin.lib.common import (get_domain, get_template, get_zone, list_virtual_machines) from marvin.lib.utils import cleanup_resources from nose.plugins.attrib import attr import base64 import random import string _multiprocess_shared_ = True class TestDeployVmWithUserDataMultiNic(cloudstackTestCase): """Tests for UserData """ @classmethod def setUpClass(cls): cls.testClient = super(TestDeployVmWithUserDataMultiNic, cls).getClsTestClient() cls.api_client = cls.testClient.getApiClient() cls.test_data = 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.test_data["ostype"] ) if cls.zone.localstorageenabled: cls.storagetype = 'local' cls.test_data["service_offerings"][ "tiny"]["storagetype"] = 'local' else: cls.storagetype = 'shared' cls.test_data["service_offerings"][ "tiny"]["storagetype"] = 'shared' cls.service_offering = ServiceOffering.create( cls.api_client, cls.test_data["service_offerings"]["tiny"] ) # Create Network offering without userdata cls.network_offering_nouserdata = NetworkOffering.create( cls.api_client, cls.test_data["network_offering"] ) # Enable Network offering cls.network_offering_nouserdata.update(cls.api_client, state='Enabled') # Create Network Offering with all the serices cls.network_offering_all = NetworkOffering.create( cls.api_client, cls.test_data["isolated_network_offering"] ) # Enable Network offering cls.network_offering_all.update(cls.api_client, state='Enabled') cls._cleanup = [ cls.service_offering, cls.network_offering_nouserdata, cls.network_offering_all ] # Generate userdata of 2500 bytes. This is larger than the 2048 bytes limit. # CS however allows for upto 4K bytes in the code. So this must succeed. # Overall, the query length must not exceed 4K, for then the json decoder # will fail this operation at the marvin client side itcls. cls.userdata = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(2500)) def setUp(self): self.apiclient = self.testClient.getApiClient() self.hypervisor = self.testClient.getHypervisorInfo() self.dbclient = self.testClient.getDbConnection() self.account = Account.create( self.apiclient, self.test_data["account"], admin=True, domainid=self.domain.id ) self.cleanup = [] return def tearDown(self): try: self.account.delete(self.apiclient) cleanup_resources(self.apiclient, self.cleanup) except Exception as e: raise Exception("Warning: Exception during cleanup : %s" % e) return @attr(tags=["simulator", "devcloud", "basic", "advanced"], required_hardware="false") def test_deployvm_multinic(self): """Test userdata update when non default nic is without userdata for deploy and update """ self.userdata = base64.encodebytes(self.userdata.encode()).decode() network1 = Network.create( self.apiclient, self.test_data["isolated_network"], accountid=self.account.name, domainid=self.account.domainid, networkofferingid=self.network_offering_all.id, zoneid=self.zone.id ) self.test_data["network_without_acl"]["netmask"] = "255.255.255.128" network2 = Network.create( self.apiclient, self.test_data["network_without_acl"], accountid=self.account.name, domainid=self.account.domainid, networkofferingid=self.network_offering_nouserdata.id, gateway="10.2.1.1", zoneid=self.zone.id ) deployVmResponse = VirtualMachine.create( self.apiclient, services=self.test_data["virtual_machine_userdata"], accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, networkids=[str(network1.id), str(network2.id)], templateid=self.template.id, zoneid=self.zone.id ) vms = list_virtual_machines( self.apiclient, account=self.account.name, domainid=self.account.domainid, id=deployVmResponse.id ) self.assertTrue(len(vms) > 0, "There are no Vms deployed in the account %s" % self.account.name) vm = vms[0] self.assertTrue(vm.id == str(deployVmResponse.id), "Vm deployed is different from the test") self.assertTrue(vm.state == "Running", "VM is not in Running state") try: updateresponse = deployVmResponse.update(self.apiclient, userdata=self.userdata) except Exception as e: self.fail("Failed to update userdata: %s" % e) self.debug("virtual machine update response is: %s" % updateresponse) @classmethod def tearDownClass(cls): try: # Cleanup resources used cleanup_resources(cls.api_client, cls._cleanup) except Exception as e: raise Exception("Warning: Exception during cleanup : %s" % e)