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 <sanjeev@apache.org>

Incorporated review comments provided in RR 25097

Fixed review comments mentioned in RR25293

Conflicts:

	tools/marvin/marvin/config/test_data.py
This commit is contained in:
sanjeev 2014-08-13 16:11:11 +05:30
parent e5efa702bb
commit 9e5da759b3
2 changed files with 226 additions and 12 deletions

View File

@ -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

View File

@ -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 <ACS repo>/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"
}
]
},
}