From 9e5da759b315955cf5bc8d606f6929ac1603708f Mon Sep 17 00:00:00 2001 From: sanjeev Date: Wed, 13 Aug 2014 16:11:11 +0530 Subject: [PATCH] Test script to verify vm deployment with two networks in SG enabled advanced zone Test data to deploy new data center and execute test using the deployed zone Signed-off-by: sanjeev Incorporated review comments provided in RR 25097 Fixed review comments mentioned in RR25293 Conflicts: tools/marvin/marvin/config/test_data.py --- .../component/test_advancedsg_networks.py | 197 +++++++++++++++++- tools/marvin/marvin/config/test_data.py | 41 +++- 2 files changed, 226 insertions(+), 12 deletions(-) diff --git a/test/integration/component/test_advancedsg_networks.py b/test/integration/component/test_advancedsg_networks.py index 85ab697ea4e..fddca9bb74c 100644 --- a/test/integration/component/test_advancedsg_networks.py +++ b/test/integration/component/test_advancedsg_networks.py @@ -29,26 +29,35 @@ from marvin.lib.base import (Zone, VpcOffering, VPC, SecurityGroup, - Host) + Host, + ) from marvin.lib.common import (get_domain, get_zone, get_template, get_free_vlan, list_virtual_machines, - wait_for_cleanup) + wait_for_cleanup, + ) from marvin.lib.utils import (cleanup_resources, random_gen, - validateList) + validateList,) from marvin.cloudstackAPI import (authorizeSecurityGroupIngress, revokeSecurityGroupIngress, - deleteSecurityGroup) + deleteSecurityGroup, + listCapacity) +from marvin import deployDataCenter from nose.plugins.attrib import attr -from marvin.codes import PASS +from marvin.codes import PASS,FAIL,FAILED +from netaddr import iter_iprange import time import sys import random +import json +import os +from platform import system + class TestCreateZoneSG(cloudstackTestCase): @@ -1251,6 +1260,59 @@ class TestNetworksInAdvancedSG_VmOperations(cloudstackTestCase): return + def dump_config_deploy_DC(self): + configLines = [] + #Read zone and ip range information from config file + file = self.services["test_34_DeployVM_in_SecondSGNetwork"]["config"] + with open(file, 'r') as fp: + for line in fp: + ws = line.strip() + if not ws.startswith("#"): + configLines.append(ws) + config = json.loads("\n".join(configLines)) + config['zones'][0]['name'] = self.services["test_34_DeployVM_in_SecondSGNetwork"]["zone"] + config['zones'][0]['ipranges'][0]['startip'] = \ + self.services["test_34_DeployVM_in_SecondSGNetwork"]["ipranges"][0]["startip"] + config['zones'][0]['ipranges'][0]['endip'] = \ + self.services["test_34_DeployVM_in_SecondSGNetwork"]["ipranges"][0]["endip"] + config['zones'][0]['ipranges'][0]['vlan'] = \ + self.services["test_34_DeployVM_in_SecondSGNetwork"]["ipranges"][0]["vlan"] + config['zones'][0]['ipranges'][0]['gateway'] = \ + self.services["test_34_DeployVM_in_SecondSGNetwork"]["ipranges"][0]["gateway"] + config["dbSvr"]["dbSvr"] = self.services["test_34_DeployVM_in_SecondSGNetwork"]["dbSvr"]["dbSvr"] + config["dbSvr"]["passwd"] = self.services["test_34_DeployVM_in_SecondSGNetwork"]["dbSvr"]["passwd"] + config["dbSvr"]["db"] = self.services["test_34_DeployVM_in_SecondSGNetwork"]["dbSvr"]["db"] + config["dbSvr"]["port"] = self.services["test_34_DeployVM_in_SecondSGNetwork"]["dbSvr"]["port"] + config["dbSvr"]["user"] = self.services["test_34_DeployVM_in_SecondSGNetwork"]["dbSvr"]["user"] + config['mgtSvr'][0]['mgtSvrIp'] = self.services["test_34_DeployVM_in_SecondSGNetwork"]["mgtSvr"][0]["mgtSvrIp"] + config['mgtSvr'][0]["passwd"] = self.services["test_34_DeployVM_in_SecondSGNetwork"]["mgtSvr"][0]["passwd"] + config['mgtSvr'][0]["user"] = self.services["test_34_DeployVM_in_SecondSGNetwork"]["mgtSvr"][0]["user"] + config['mgtSvr'][0]["port"] = self.services["test_34_DeployVM_in_SecondSGNetwork"]["mgtSvr"][0]["port"] + config['zones'][0]['pods'][0]['clusters'][0]['primaryStorages'][0]['url'] = \ + "nfs://10.147.28.6:/export/home/sandbox/primary_"+str(random.randrange(0,1000,3)) + config['zones'][0]['pods'][0]['clusters'][0]['primaryStorages'][0]['name'] = \ + "PS_"+str(random.randrange(0,1000,3)) + config['zones'][0]['secondaryStorages'][0]['url'] = \ + "nfs://10.147.28.6:/export/home/sandbox/sstor_"+str(random.randrange(0,1000,3)) + if system().lower() != 'windows': + config_file = "/tmp/advsg.cfg" + with open(config_file, 'w+') as fp: + fp.write(json.dump(config, indent=4)) + cfg_file = file.split('/')[-1] + file2 = file.replace("/setup/dev/advanced/"+cfg_file, "") + file2 = file2+"/tools/marvin/marvin/deployDataCenter.py" + else : + config_file = "D:\\advsg.cfg" + with open(config_file, 'w+') as fp: + fp.write(json.dumps(config, indent=4)) + cfg_file = file.split('\\')[-1] + file2 = file.replace("\setup\dev\\"+cfg_file, "") + file2 = file2+"\\tools\marvin\marvin\deployDataCenter.py" + #Run deployDataCenter with new config file stored in \tmp + self.debug("Executing deployAndRun") + status = os.system("%s -i %s" %(file2, config_file)) + return status + @attr(tags = ["advancedsg"]) def test__16_AccountSpecificNwAccess(self): """ Test account specific network access of users""" @@ -2078,6 +2140,131 @@ class TestNetworksInAdvancedSG_VmOperations(cloudstackTestCase): self.assertEqual(vm_list[0].hostid, hosts_to_migrate[0].id, "VM host id does not reflect the migration") return + @attr(tags=["advancedsg"], required_hardware="false") + def test_34_DeployVM_in_SecondSGNetwork(self): + """ + @Desc: VM Cannot deploy to second network in advanced SG network + @step1:Create shared SG network1 + @step2: Consume all ip addresses in network1 + @step3: Create shared SG network2 + @step4: Deploy vm without specifying the network id + @step5: Verify that vm deployment should pick network2 and should not fail by picking network1 + """ + #Deploy data center with custom data + status = self.dump_config_deploy_DC() + if status == 1: + self.fail("Deploy DataCenter failed.") + zone_list = Zone.list( + self.api_client, + name=self.services["test_34_DeployVM_in_SecondSGNetwork"]["zone"] + ) + status = validateList(zone_list) + self.assertEquals(status[0],PASS,"Failed to list the zones") + count = 0 + """ + In simulator environment default guest os template should be in ready state immediately after the ssvm is up. + In worst case test would wait for 100sec for the template to get ready else it would fail. + """ + while (count < 10): + time.sleep(10) + template = get_template( + self.api_client, + zone_list[0].id + ) + if template != FAILED and str(template.isready).lower() == 'true': + break + else: + count=count+1 + if count == 10: + self.fail("Template is not in ready state even after 100sec. something wrong with the SSVM") + self.debug("Creating virtual machine in default shared network to consume all IPs") + vm_1 = VirtualMachine.create( + self.api_client, + self.services["virtual_machine"], + templateid=template.id, + zoneid=zone_list[0].id, + serviceofferingid=self.service_offering.id + ) + self.assertIsNotNone(vm_1,"Failed to deploy vm in default shared network") + self.cleanup_vms.append(vm_1) + #verify that all the IPs are consumed in the default shared network + cmd = listCapacity.listCapacityCmd() + cmd.type=8 + cmd.zoneid = zone_list[0].id + cmd.fetchlatest='true' + count = 0 + """ + Created zone with only 4 guest IP addresses so limiting the loop count to 4 + """ + while count < 5: + listCapacityRes = self.api_client.listCapacity(cmd) + self.assertEqual(validateList(listCapacityRes)[0],PASS,"listCapacity returned invalid list") + percentused = listCapacityRes[0].percentused + if percentused == '100': + break + self.debug("Creating virtual machine in default shared network to consume all IPs") + vm = VirtualMachine.create( + self.api_client, + self.services["virtual_machine"], + templateid=template.id, + zoneid=zone_list[0].id, + serviceofferingid=self.service_offering.id + ) + self.assertIsNotNone(vm,"Failed to deploy vm in default shared network") + self.cleanup_vms.append(vm) + count = count+1 + if count == 5: + self.fail("IPs are not getting consumed. Please check the setup") + #Create another SG enabled shared network after consuming all IPs + self.services["shared_network_sg"]["acltype"] = "domain" + self.services["shared_network_sg"]["networkofferingid"] = self.shared_network_offering_sg.id + physical_network, vlan = get_free_vlan(self.api_client, zone_list[0].id) + #create network using the shared network offering created + self.services["shared_network_sg"]["vlan"] = vlan + self.services["shared_network_sg"]["physicalnetworkid"] = physical_network.id + nwIPs = 3 + self.setSharedNetworkParams("shared_network_sg", range=nwIPs) + self.debug("Creating shared sg network1 with vlan %s" % vlan) + shared_network = Network.create( + self.api_client, + self.services["shared_network_sg"], + networkofferingid=self.shared_network_offering_sg.id, + zoneid=zone_list[0].id + ) + self.assertIsNotNone(shared_network,"shared SG network1 creation failed") + self.cleanup_networks.append(shared_network) + # Deploying 1 VM will exhaust the IP range because we are passing range as 2, and one of the IPs + # already gets consumed by the virtual router of the shared network + self.debug("Deploying vm2 without passing network id after consuming all IPs from default shared nw") + try: + vm_2 = VirtualMachine.create( + self.api_client, + self.services["virtual_machine"], + templateid=template.id, + zoneid=zone_list[0].id, + serviceofferingid=self.service_offering.id + ) + vm2_res = VirtualMachine.list( + self.api_client, + id=vm_2.id + ) + self.assertEqual(validateList(vm2_res)[0],PASS,"Failed to list vms in new network") + vm_ip = vm2_res[0].nic[0].ipaddress + ips_in_new_network = [] + ip_gen = iter_iprange( + self.services["shared_network_sg"]["startip"], + self.services["shared_network_sg"]["endip"] + ) + #construct ip list using start and end ips in the network + for i in range(0,nwIPs): + ips_in_new_network.append(str(ip_gen.next())) + if vm_ip not in ips_in_new_network: + self.fail("vm did not get the ip from new SG enabled shared network") + self.cleanup_vms.append(vm_2) + except Exception as e: + self.fail("Failed to deploy vm with two advanced sg networks %s" % e) + return + class TestSecurityGroups_BasicSanity(cloudstackTestCase): @classmethod diff --git a/tools/marvin/marvin/config/test_data.py b/tools/marvin/marvin/config/test_data.py index a73f9bccc8d..b13d8fe39e6 100644 --- a/tools/marvin/marvin/config/test_data.py +++ b/tools/marvin/marvin/config/test_data.py @@ -940,7 +940,7 @@ test_data = { "name": "hostantiaffinity", "type": "host anti-affinity", }, - "vgpu":{ + "vgpu":{ "disk_offering":{ "displaytext": "Small", "name": "Small", @@ -1180,8 +1180,6 @@ test_data = { "username": "testD12B", "password": "password", }, - - "domain2": { "name": "D2", }, @@ -1200,7 +1198,6 @@ test_data = { "username": "testD2A", "password": "password", }, - "accountROOTA": { "email": "testROOTA@test.com", "firstname": "testROOTA", @@ -1346,8 +1343,7 @@ test_data = { "username": "rmurphy", "password": "internalcloudstackpassword", }, - "ldapConfiguration_1": - { + "ldapConfiguration_1": { "basedn": "dc=cloudstack,dc=org", "emailAttribute": "mail", "userObject": "inetOrgPerson", @@ -1356,5 +1352,36 @@ test_data = { "port": "10389", "ldapUsername": "rmurphy", "ldapPassword": "password" - } + }, + + "test_34_DeployVM_in_SecondSGNetwork": { + "zone": "advsg", + "config": "D:\ACS-Repo\setup\dev\\advancedsg.cfg",#Absolute path to cfg file + #For sample configuration please refer to /setup/dev/advancedsg.cfg + "template": "CentOS 5.3(64-bit) no GUI (Simulator)", + "dbSvr": { + "dbSvr": "10.146.0.133", + "passwd": "cloud", + "db": "cloud", + "port": 3306, + "user": "cloud" + }, + "mgtSvr": [ + { + "mgtSvrIp": "10.146.0.133", + "passwd": "password", + "user": "root", + "port": 8096 + } + ], + "ipranges": [ + { + "startip": "10.147.32.150", + "endip": "10.147.32.153", + "netmask": "255.255.255.0", + "vlan": "32", + "gateway": "10.147.32.1" + } + ] + }, }