mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
CLOUDSTACK-5986: Test script for verifying fix CS-5986 for vpc networks
Signed-off-by: sanjeev <sanjeev@apache.org> Made changes to test script as per the review comments in Review Request 23928
This commit is contained in:
parent
51bfd56244
commit
c4a32d9416
@ -42,7 +42,8 @@ from marvin.lib.common import (get_domain,
|
|||||||
wait_for_cleanup,
|
wait_for_cleanup,
|
||||||
get_free_vlan)
|
get_free_vlan)
|
||||||
|
|
||||||
from marvin.lib.utils import cleanup_resources
|
from marvin.lib.utils import (cleanup_resources, validateList)
|
||||||
|
from marvin.codes import *
|
||||||
from marvin.cloudstackAPI import rebootRouter
|
from marvin.cloudstackAPI import rebootRouter
|
||||||
|
|
||||||
|
|
||||||
@ -275,6 +276,86 @@ class TestVMDeployVPC(cloudstackTestCase):
|
|||||||
self.debug("VPC network validated - %s" % network.name)
|
self.debug("VPC network validated - %s" % network.name)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def acquire_publicip(self, network):
|
||||||
|
self.debug("Associating public IP for network: %s" % network.name)
|
||||||
|
public_ip = PublicIPAddress.create(self.apiclient,
|
||||||
|
accountid=self.account.name,
|
||||||
|
zoneid=self.zone.id,
|
||||||
|
domainid=self.account.domainid,
|
||||||
|
networkid=network.id,
|
||||||
|
vpcid=self.vpc.id
|
||||||
|
)
|
||||||
|
self.debug("Associated {} with network {}".format(public_ip.ipaddress.ipaddress, network.id))
|
||||||
|
return public_ip
|
||||||
|
|
||||||
|
def create_natrule(self, vm, public_ip, network, services=None):
|
||||||
|
self.debug("Creating NAT rule in network for vm with public IP")
|
||||||
|
if not services:
|
||||||
|
services = self.services["natrule"]
|
||||||
|
nat_rule = NATRule.create(self.apiclient,
|
||||||
|
vm,
|
||||||
|
services,
|
||||||
|
ipaddressid=public_ip.ipaddress.id,
|
||||||
|
openfirewall=False,
|
||||||
|
networkid=network.id,
|
||||||
|
vpcid=self.vpc.id
|
||||||
|
)
|
||||||
|
self.debug("Adding NetworkACL rules to make NAT rule accessible")
|
||||||
|
nwacl_nat = NetworkACL.create(self.apiclient,
|
||||||
|
networkid=network.id,
|
||||||
|
services=services,
|
||||||
|
traffictype='Ingress'
|
||||||
|
)
|
||||||
|
self.debug('nwacl_nat=%s' % nwacl_nat.__dict__)
|
||||||
|
return nat_rule
|
||||||
|
|
||||||
|
def check_ssh_into_vm(self, vm, public_ip, testnegative=False):
|
||||||
|
self.debug("Checking if we can SSH into VM={} on public_ip={}".format(vm.name, public_ip.ipaddress.ipaddress))
|
||||||
|
try:
|
||||||
|
vm.get_ssh_client(ipaddress=public_ip.ipaddress.ipaddress)
|
||||||
|
if not testnegative:
|
||||||
|
self.debug("SSH into VM={} on public_ip={} is successful".format(vm.name, public_ip.ipaddress.ipaddress))
|
||||||
|
else:
|
||||||
|
self.fail("SSH into VM={} on public_ip={} is successful".format(vm.name, public_ip.ipaddress.ipaddress))
|
||||||
|
except:
|
||||||
|
if not testnegative:
|
||||||
|
self.fail("Failed to SSH into VM - %s" % (public_ip.ipaddress.ipaddress))
|
||||||
|
else:
|
||||||
|
self.debug("Failed to SSH into VM - %s" % (public_ip.ipaddress.ipaddress))
|
||||||
|
|
||||||
|
def deployVM_and_verify_ssh_access(self, network, ip):
|
||||||
|
# Spawn an instance in that network
|
||||||
|
vm = VirtualMachine.create(
|
||||||
|
self.apiclient,
|
||||||
|
self.services["virtual_machine"],
|
||||||
|
accountid=self.account.name,
|
||||||
|
domainid=self.account.domainid,
|
||||||
|
serviceofferingid=self.service_offering.id,
|
||||||
|
networkids=[str(network.id)],
|
||||||
|
ipaddress=ip,
|
||||||
|
)
|
||||||
|
self.assertIsNotNone(
|
||||||
|
vm,
|
||||||
|
"Failed to deploy vm with ip address {} and hostname {}".format(ip, self.services["virtual_machine"]["name"])
|
||||||
|
)
|
||||||
|
vm_response = VirtualMachine.list(
|
||||||
|
self.apiclient,
|
||||||
|
id=vm.id,
|
||||||
|
)
|
||||||
|
status = validateList(vm_response)
|
||||||
|
self.assertEquals(
|
||||||
|
PASS,
|
||||||
|
status[0],
|
||||||
|
"vm list api returned invalid response after vm {} deployment".format(vm)
|
||||||
|
)
|
||||||
|
public_ip_1 = self.acquire_publicip(network)
|
||||||
|
#ensure vm is accessible over public ip
|
||||||
|
nat_rule = self.create_natrule(vm, public_ip_1, network)
|
||||||
|
self.check_ssh_into_vm(vm, public_ip_1, testnegative=False)
|
||||||
|
#remove the nat rule
|
||||||
|
nat_rule.delete(self.apiclient)
|
||||||
|
return vm
|
||||||
|
|
||||||
@attr(tags=["advanced", "intervlan", "selfservice"])
|
@attr(tags=["advanced", "intervlan", "selfservice"])
|
||||||
def test_01_deploy_vms_in_network(self):
|
def test_01_deploy_vms_in_network(self):
|
||||||
""" Test deploy VMs in VPC networks
|
""" Test deploy VMs in VPC networks
|
||||||
@ -2023,7 +2104,7 @@ class TestVMDeployVPC(cloudstackTestCase):
|
|||||||
public_ips[0].ipaddress,
|
public_ips[0].ipaddress,
|
||||||
public_ip_4.ipaddress.ipaddress,
|
public_ip_4.ipaddress.ipaddress,
|
||||||
"List public Ips %s for network should list the Ip addr %s"
|
"List public Ips %s for network should list the Ip addr %s"
|
||||||
% (public_ips[0].ipaddress, public_ip_4.ipaddress.ipaddress )
|
% (public_ips[0].ipaddress, public_ip_4.ipaddress.ipaddress)
|
||||||
)
|
)
|
||||||
|
|
||||||
self.debug("Adding NetwrokACl rules to make NAT rule accessible with network %s" % network_1.id)
|
self.debug("Adding NetwrokACl rules to make NAT rule accessible with network %s" % network_1.id)
|
||||||
@ -2291,3 +2372,94 @@ class TestVMDeployVPC(cloudstackTestCase):
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@attr(tags=["advanced", "intervlan", "selfservice"])
|
||||||
|
def test_08_ip_reallocation_CS5986(self):
|
||||||
|
"""
|
||||||
|
@Desc: Test to verify dnsmasq dhcp conflict issue due to /ect/hosts not getting udpated
|
||||||
|
@Steps:
|
||||||
|
Step1: Create a VPC
|
||||||
|
Step2: Create one network in vpc
|
||||||
|
Step3: Deploy vm1 with hostname hostA and ip address IP A in the above network
|
||||||
|
Step4: List the vm and verify the ip address in the response and verify ssh access to vm
|
||||||
|
Step5: Deploy vm2 with hostname hostB and ip address IP B in the same network
|
||||||
|
Step6: Repeat step4
|
||||||
|
Step7: Destroy vm1 and vm2
|
||||||
|
Step8: Deploy vm3 with hostname hostA and ip address IP B
|
||||||
|
Step9: Repeat step4
|
||||||
|
Step10: Deploy vm4 with IP A and hostC
|
||||||
|
Step11: Repeat step4
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.debug("creating a VPC network in the account: %s" % self.account.name)
|
||||||
|
self.services["vpc"]["cidr"] = '10.1.1.1/16'
|
||||||
|
self.vpc = VPC.create(
|
||||||
|
self.apiclient,
|
||||||
|
self.services["vpc"],
|
||||||
|
vpcofferingid=self.vpc_off.id,
|
||||||
|
zoneid=self.zone.id,
|
||||||
|
account=self.account.name,
|
||||||
|
domainid=self.account.domainid
|
||||||
|
)
|
||||||
|
self.validate_vpc_network(self.vpc)
|
||||||
|
self.nw_off = NetworkOffering.create(
|
||||||
|
self.apiclient,
|
||||||
|
self.services["network_offering"],
|
||||||
|
conservemode=False
|
||||||
|
)
|
||||||
|
# Enable Network offering
|
||||||
|
self.nw_off.update(self.apiclient, state='Enabled')
|
||||||
|
self._cleanup.append(self.nw_off)
|
||||||
|
# Creating network using the network offering created
|
||||||
|
self.debug("Creating network with network offering: %s" % self.nw_off.id)
|
||||||
|
network_1 = Network.create(
|
||||||
|
self.apiclient,
|
||||||
|
self.services["network"],
|
||||||
|
accountid=self.account.name,
|
||||||
|
domainid=self.account.domainid,
|
||||||
|
networkofferingid=self.nw_off.id,
|
||||||
|
zoneid=self.zone.id,
|
||||||
|
gateway='10.1.1.1',
|
||||||
|
vpcid=self.vpc.id
|
||||||
|
)
|
||||||
|
self.debug("Created network with ID: %s" % network_1.id)
|
||||||
|
# Spawn vm1 in that network
|
||||||
|
vm1_ip = "10.1.1.10"
|
||||||
|
name1 = "hostA"
|
||||||
|
self.services["virtual_machine"]["name"] = name1
|
||||||
|
vm1 = self.deployVM_and_verify_ssh_access(network_1, vm1_ip)
|
||||||
|
#Deploy vm2 with host name "hostB" and ip address "10.1.1.20"
|
||||||
|
vm2_ip = "10.1.1.20"
|
||||||
|
name2 = "hostB"
|
||||||
|
self.services["virtual_machine"]["name"] = name2
|
||||||
|
vm2 = self.deployVM_and_verify_ssh_access(network_1, vm2_ip)
|
||||||
|
#Destroy both the vms
|
||||||
|
try:
|
||||||
|
vm1.delete(self.apiclient, expunge=True)
|
||||||
|
vm2.delete(self.apiclient, expunge=True)
|
||||||
|
except Exception as e:
|
||||||
|
raise Exception("Warning: Exception in expunging vms: %s" % e)
|
||||||
|
"""
|
||||||
|
Deploy vm3 with ip address of vm1 and host name of vm2 so both the vm1 and vm2 entries
|
||||||
|
would be deleted from dhcphosts file on VR becase dhcprelease matches entries with
|
||||||
|
host name and ip address so it matches both the entries.
|
||||||
|
"""
|
||||||
|
# Deploying a VM3 with ip1 and name2
|
||||||
|
self.services["virtual_machine"]["name"] = name2
|
||||||
|
vm3 = self.deployVM_and_verify_ssh_access(network_1, vm1_ip)
|
||||||
|
#Deploy 4th vm
|
||||||
|
"""
|
||||||
|
Deploy vm4 with ip address of vm2. dnsmasq and dhcprelase should be in sync.
|
||||||
|
We should not see dhcp lease block due to IP reallocation.
|
||||||
|
"""
|
||||||
|
name3 = "hostC"
|
||||||
|
self.services["virtual_machine"]["name"] = name3
|
||||||
|
vm4 = self.deployVM_and_verify_ssh_access(network_1, vm2_ip)
|
||||||
|
try:
|
||||||
|
vm3.delete(self.apiclient, expunge=True)
|
||||||
|
vm4.delete(self.apiclient, expunge=True)
|
||||||
|
except Exception as e:
|
||||||
|
raise Exception("Warning: Excepting in expunging vms vm3 and vm4: %s" % e)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user