cloudstack/test/integration/component/test_lb_secondary_ip.py
Alex Brett 06b96d1ccf CLOUDSTACK-7448 Fix test_delete_account and test_releaseIP
CLOUDSTACK-4840 changed test_data.py to make the lbrule publicport be 22,
instead of 2222. In doing so, this caused the following tests to fail, as they
hit a problem where they tried to use port 22 for both the lbrule and for other
purposes:
integration.smoke.test_network.TestDeleteAccount.test_delete_account
integration.smoke.test_network.TestReleaseIP.test_releaseIP

The reason the change appears to have been made was that in
test_lb_secondary_ip.py, despite setting up the load balancer using lbrule, the
tests then used the SSH port from natrule to try and access the VM. By changing
lbrule to use port 22 (the same as natrule) this avoided the problem.

This patch updates test_lb_secondary_ip.py to use the SSH port in lbrule where
necessary to access the VMs, and reverts the change to test_data.py
2014-09-04 17:19:08 -07:00

1823 lines
76 KiB
Python

# 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.
"""
P1 tests for Load balancing rules for secondary IP feature, this is an
enhancement to the Multiple IPs per NIC feature
Test Plan: https://cwiki.apache.org/confluence/display/CLOUDSTACK/TestPlan+%3AConfiguring+load+balancing+rules+for+VM+nic+secondary+ips
Issue Link: https://issues.apache.org/jira/browse/CLOUDSTACK-4840
Feature Specifications: https://cwiki.apache.org/confluence/display/CLOUDSTACK/Configuring+load+balancing+rules+for+VM+nic+secondary+ips
"""
# Import Local Modules
from nose.plugins.attrib import attr
from marvin.cloudstackTestCase import cloudstackTestCase, unittest
from marvin.lib.base import (
Account,
ServiceOffering,
VirtualMachine,
LoadBalancerRule,
NIC,
PublicIPAddress,
Router,
NetworkOffering,
Network,
FireWallRule,
NATRule
)
from marvin.lib.common import (get_domain,
get_zone,
get_template,
verifyNetworkState,
wait_for_cleanup,
add_netscaler
)
from marvin.lib.utils import (validateList,
random_gen,
cleanup_resources)
from marvin.cloudstackAPI import (restartNetwork)
from marvin.sshClient import SshClient
from marvin.codes import PASS
def IsIpAssignedToLoadBalancerRule(self, lbrule, iplist):
"""List Load Balancer Rule Instances and verify that IP is present in the list"""
exceptionMessage = ""
isIpAssignedToLbRule = True
try:
lbruleinstances = LoadBalancerRule.listLoadBalancerRuleInstances(
self.apiclient,
id=lbrule.id,
lbvmips=True
)
self.assertEqual(validateList(lbruleinstances)[0], PASS,
"lbruleinstances list validation failed")
lbruleips = [str(ipaddress) for lbruleinstance in lbruleinstances
for ipaddress in lbruleinstance.lbvmipaddresses]
for ip in iplist:
self.assertTrue(ip in lbruleips,
"IP address in lbruleinstances list not matching\
with ips assigned to lb rule")
except Exception as e:
isIpAssignedToLbRule = False
exceptionMessage = e
return [isIpAssignedToLbRule, exceptionMessage]
class TestAssignLBRule(cloudstackTestCase):
@classmethod
def setUpClass(cls):
cloudstackTestClient = super(TestAssignLBRule,\
cls).getClsTestClient()
cls.api_client = cloudstackTestClient.getApiClient()
cls.testdata = cloudstackTestClient.getParsedTestDataConfig()
# Get Zone, Domain and templates
cls.domain = get_domain(cls.api_client)
cls.zone = get_zone(cls.api_client, cloudstackTestClient.getZoneForTests())
template = get_template(cls.api_client,
cls.zone.id,
cls.testdata["ostype"])
# Set Zones and disk offerings
cls.testdata["virtual_machine"]["zoneid"] = cls.zone.id
cls.testdata["virtual_machine"]["template"] = template.id
cls._cleanup = []
try:
cls.service_offering = ServiceOffering.create(
cls.api_client,
cls.testdata["service_offering"])
cls._cleanup.append(cls.service_offering)
except Exception as e:
cls.tearDownClass()
raise unittest.SkipTest(e)
return
def setUp(self):
self.apiclient = self.testClient.getApiClient()
self.cleanup = []
try:
self.account = Account.create(self.apiclient,
self.testdata["account"],
domainid=self.domain.id)
self.cleanup.append(self.account)
self.virtual_machine = VirtualMachine.create(
self.api_client,
self.testdata["virtual_machine"],
accountid=self.account.name,
domainid=self.account.domainid,
serviceofferingid=self.service_offering.id,
mode=self.zone.networktype)
except Exception as e:
self.tearDown()
raise e
def tearDown(self):
try:
#Clean up, terminate the created accounts, domains etc
cleanup_resources(self.apiclient, self.cleanup)
except Exception as e:
raise Exception("Warning: Exception during cleanup : %s" % e)
return
@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)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_01_lb_rule_for_primary_ip(self):
"""Create LB rule for primary IP
steps:
# 1. Add secondary IP to the VM
# 2. Associate a public IP for the network
# 3. Create load balancer rule for this IP
# 4. Assign load balancer rule for primary ip address of VM
# 5. List and verify that load balancer rule is successfully added
"""
NIC.addIp(self.apiclient, id=self.virtual_machine.nic[0].id)
public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=self.virtual_machine.nic[0].networkid)
lb_rule = LoadBalancerRule.create(
self.apiclient,
self.testdata["lbrule"],
ipaddressid=public_ip.ipaddress.id,
accountid=self.account.name,
networkid=self.virtual_machine.nic[0].networkid,
domainid=self.account.domainid)
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.virtual_machine.nic[0].ipaddress)}]
lb_rule.assign(
self.apiclient,
vmidipmap = vmidipmap
)
response = IsIpAssignedToLoadBalancerRule(self, lb_rule,
[self.virtual_machine.nic[0].ipaddress])
self.assertTrue(response[0], response[1])
lbrules = LoadBalancerRule.list(
self.apiclient,
virtualmachineid=self.virtual_machine.id,
listall=True)
self.assertEqual(validateList(lbrules)[0], PASS,
"lb rules list validation failed")
self.assertEqual(lb_rule.id, lbrules[0].id, "LB rules does not match")
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_02_lb_rule_for_primary_ip(self):
"""Create LB rule for secondary IP
steps:
# 1. Add secondary IP to the VM
# 2. Associate a public IP for the network
# 3. Create load balancer rule for this IP
# 4. Assign load balancer rule for secondary ip address of VM
# 5. List and verify that load balancer rule is successfully added"""
secondaryip = NIC.addIp(self.apiclient, id=self.virtual_machine.nic[0].id)
public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=self.virtual_machine.nic[0].networkid)
lb_rule = LoadBalancerRule.create(
self.apiclient,
self.testdata["lbrule"],
ipaddressid=public_ip.ipaddress.id,
accountid=self.account.name,
networkid=self.virtual_machine.nic[0].networkid,
domainid=self.account.domainid)
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(secondaryip.ipaddress)}]
lb_rule.assign(
self.apiclient,
vmidipmap = vmidipmap
)
response = IsIpAssignedToLoadBalancerRule(self, lb_rule,
[secondaryip.ipaddress])
self.assertTrue(response[0], response[1])
lbrules = LoadBalancerRule.list(
self.apiclient,
virtualmachineid=self.virtual_machine.id,
listall=True)
self.assertEqual(validateList(lbrules)[0], PASS,
"lb rules list validation failed")
self.assertEqual(lb_rule.id, lbrules[0].id, "LB rules does not match")
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_03_lb_rule_for_primary_and_secondary_ip(self):
"""Create LB rule for primary and secondary IP
steps:
# 1. Add secondary IP to the VM
# 2. Associate a public IP for the network
# 3. Create load balancer rule for this IP
# 4. Assign load balancer rule to both primary and secondary ip address of VM
# 5. List and verify that load balancer rule is successfully added"""
secondaryip = NIC.addIp(self.apiclient, id=self.virtual_machine.nic[0].id)
public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=self.virtual_machine.nic[0].networkid)
lb_rule = LoadBalancerRule.create(
self.apiclient,
self.testdata["lbrule"],
ipaddressid=public_ip.ipaddress.id,
accountid=self.account.name,
networkid=self.virtual_machine.nic[0].networkid,
domainid=self.account.domainid)
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.virtual_machine.nic[0].ipaddress)},
{"vmid": str(self.virtual_machine.id),
"vmip": str(secondaryip.ipaddress)}]
lb_rule.assign(
self.apiclient,
vmidipmap = vmidipmap
)
response = IsIpAssignedToLoadBalancerRule(self, lb_rule,
[self.virtual_machine.nic[0].ipaddress, secondaryip.ipaddress])
self.assertTrue(response[0], response[1])
lbrules = LoadBalancerRule.list(
self.apiclient,
virtualmachineid=self.virtual_machine.id,
listall=True)
self.assertEqual(validateList(lbrules)[0], PASS,
"lb rules list validation failed")
self.assertEqual(lb_rule.id, lbrules[0].id, "LB rules does not match")
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_04_lb_rule_primary_secondary_multiple_vms(self):
"""Create LB rule for primary and secondary IPs of multiple VMs
steps:
# 1. Deploy two VMs in same network and add secondary IP for both
# 2. Associate a public IP for the network
# 3. Create load balancer rule for this IP
# 4. Assign load balancer rule to both primary and secondary ip address of both VMs
# 5. List and verify that load balancer rule is successfully added"""
secondaryip_vm1 = NIC.addIp(self.apiclient,
id=self.virtual_machine.nic[0].id
)
self.virtual_machine2 = VirtualMachine.create(
self.api_client,
self.testdata["virtual_machine"],
accountid=self.account.name,
domainid=self.account.domainid,
serviceofferingid=self.service_offering.id,
mode=self.zone.networktype,
networkids=[self.virtual_machine.nic[0].networkid, ])
secondaryip_vm2 = NIC.addIp(self.apiclient,
id=self.virtual_machine2.nic[0].id
)
public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=self.virtual_machine.nic[0].networkid)
lb_rule = LoadBalancerRule.create(
self.apiclient,
self.testdata["lbrule"],
ipaddressid=public_ip.ipaddress.id,
accountid=self.account.name,
networkid=self.virtual_machine.nic[0].networkid,
domainid=self.account.domainid)
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.virtual_machine.nic[0].ipaddress)},
{"vmid": str(self.virtual_machine.id),
"vmip": str(secondaryip_vm1.ipaddress)},
{"vmid": str(self.virtual_machine2.id),
"vmip": str(self.virtual_machine2.nic[0].ipaddress)},
{"vmid": str(self.virtual_machine2.id),
"vmip": str(secondaryip_vm2.ipaddress)}]
lb_rule.assign(
self.apiclient,
vmidipmap = vmidipmap
)
iplist = [self.virtual_machine.nic[0].ipaddress,
secondaryip_vm1.ipaddress,
self.virtual_machine2.nic[0].ipaddress,
secondaryip_vm2.ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, lb_rule, iplist)
self.assertTrue(response[0], response[1])
lbrules = LoadBalancerRule.list(
self.apiclient,
virtualmachineid=self.virtual_machine.id,
listall=True)
self.assertEqual(validateList(lbrules)[0], PASS,
"lb rules list validation failed")
self.assertEqual(lb_rule.id, lbrules[0].id, "LB rules does not match")
lbrules = LoadBalancerRule.list(
self.apiclient,
virtualmachineid=self.virtual_machine2.id,
listall=True)
self.assertEqual(validateList(lbrules)[0], PASS,
"lb rules list validation failed")
self.assertEqual(lb_rule.id, lbrules[0].id, "LB rules does not match")
return
class TestFailureScenarios(cloudstackTestCase):
@classmethod
def setUpClass(cls):
cloudstackTestClient = super(TestFailureScenarios,\
cls).getClsTestClient()
cls.api_client = cloudstackTestClient.getApiClient()
cls.testdata = cloudstackTestClient.getParsedTestDataConfig()
# Get Zone, Domain and templates
cls.domain = get_domain(cls.api_client)
cls.zone = get_zone(cls.api_client, cloudstackTestClient.getZoneForTests())
template = get_template(cls.api_client,
cls.zone.id,
cls.testdata["ostype"])
# Set Zones and disk offerings
cls.testdata["virtual_machine"]["zoneid"] = cls.zone.id
cls.testdata["virtual_machine"]["template"] = template.id
cls._cleanup = []
try:
cls.service_offering = ServiceOffering.create(
cls.api_client,
cls.testdata["service_offering"])
cls._cleanup.append(cls.service_offering)
except Exception as e:
cls.tearDownClass()
raise unittest.SkipTest(e)
return
def setUp(self):
self.apiclient = self.testClient.getApiClient()
self.cleanup = []
try:
self.account = Account.create(self.apiclient,
self.testdata["account"],
domainid=self.domain.id)
self.cleanup.append(self.account)
self.virtual_machine = VirtualMachine.create(
self.api_client,
self.testdata["virtual_machine"],
accountid=self.account.name,
domainid=self.account.domainid,
serviceofferingid=self.service_offering.id,
mode=self.zone.networktype)
except Exception as e:
self.tearDown()
raise e
def tearDown(self):
try:
cleanup_resources(self.apiclient, self.cleanup)
except Exception as e:
raise Exception("Warning: Exception during cleanup : %s" % e)
return
@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)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_05_lb_rule_wrong_vm_id(self):
"""Try to assign LB rule to secondary IP by giving wrong vm id
steps:
# 1. Add secondary IP for VM
# 2. Associate a public IP for the network
# 3. Create load balancer rule for this IP
# 4. Try to assign load balancer rule for secondary IP of VM by specifying
invalid vm id, it should fail"""
secondaryip = NIC.addIp(self.apiclient, id=self.virtual_machine.nic[0].id)
public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=self.virtual_machine.nic[0].networkid)
lb_rule = LoadBalancerRule.create(
self.apiclient,
self.testdata["lbrule"],
ipaddressid=public_ip.ipaddress.id,
accountid=self.account.name,
networkid=self.virtual_machine.nic[0].networkid,
domainid=self.account.domainid)
vmidipmap = [{"vmid": str(self.virtual_machine.id) + random_gen(),
"vmip": str(secondaryip.ipaddress)}]
with self.assertRaises(Exception):
lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_06_lb_rule_wrong_vm_ip(self):
"""Try to assign LB rule to secondary IP by giving wrong ip
steps:
# 1. Add secondary IP for VM
# 2. Associate a public IP for the network
# 3. Create load balancer rule for this IP
# 4. Try to assign load balancer rule by specifying wrong ip and correct vm id,
the task should fail"""
secondaryip = NIC.addIp(self.apiclient, id=self.virtual_machine.nic[0].id)
public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=self.virtual_machine.nic[0].networkid)
lb_rule = LoadBalancerRule.create(
self.apiclient,
self.testdata["lbrule"],
ipaddressid=public_ip.ipaddress.id,
accountid=self.account.name,
networkid=self.virtual_machine.nic[0].networkid,
domainid=self.account.domainid)
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(secondaryip.ipaddress) + random_gen()}]
with self.assertRaises(Exception):
lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
return
@unittest.skip("Failing-WIP")
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_07_lb_rule_used_ip(self):
"""Try to assign secondary IP to lb rule which is already assigned to another
LB rule
steps:
# 1. Add secondary IP for VM
# 2. Associate two public IPs for the network
# 3. Create load balancer rule for both the IPs
# 4. Assign load balancer rule 1 to secondary IP
# 5. Try to assign load balancer rule 2 to secondary IP, the operation
should fail"""
secondaryip = NIC.addIp(self.apiclient, id=self.virtual_machine.nic[0].id)
public_ip1 = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=self.virtual_machine.nic[0].networkid)
lb_rule1 = LoadBalancerRule.create(
self.apiclient,
self.testdata["lbrule"],
ipaddressid=public_ip1.ipaddress.id,
accountid=self.account.name,
networkid=self.virtual_machine.nic[0].networkid,
domainid=self.account.domainid)
public_ip2 = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=self.virtual_machine.nic[0].networkid)
lb_rule2 = LoadBalancerRule.create(
self.apiclient,
self.testdata["lbrule"],
ipaddressid=public_ip2.ipaddress.id,
accountid=self.account.name,
networkid=self.virtual_machine.nic[0].networkid,
domainid=self.account.domainid)
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(secondaryip.ipaddress)}]
lb_rule1.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [secondaryip.ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, lb_rule1, iplist)
self.assertTrue(response[0], response[1])
with self.assertRaises(Exception):
lb_rule2.assign(self.apiclient,
vmidipmap=vmidipmap)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_08_lb_rule_remove_used_ip(self):
"""Try to remove secondary IP with load balancer rule configured for it
steps:
# 1. Add secondary IP for VM
# 2. Associate public IP for the network
# 3. Create load balancer rule for IP
# 4. Assign load balancer rule to secondary IP
# 5. Try to remove the secondary IP form NIC, the operation should fail"""
secondaryip = NIC.addIp(self.apiclient, id=self.virtual_machine.nic[0].id)
public_ip1 = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=self.virtual_machine.nic[0].networkid)
lb_rule1 = LoadBalancerRule.create(
self.apiclient,
self.testdata["lbrule"],
ipaddressid=public_ip1.ipaddress.id,
accountid=self.account.name,
networkid=self.virtual_machine.nic[0].networkid,
domainid=self.account.domainid)
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(secondaryip.ipaddress)}]
lb_rule1.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [secondaryip.ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, lb_rule1, iplist)
self.assertTrue(response[0], response[1])
with self.assertRaises(Exception):
NIC.removeIp(self.apiclient, ipaddressid=secondaryip.id)
return
class TestListLBRuleInstances(cloudstackTestCase):
@classmethod
def setUpClass(cls):
cloudstackTestClient = super(TestListLBRuleInstances,\
cls).getClsTestClient()
cls.api_client = cloudstackTestClient.getApiClient()
cls.testdata = cloudstackTestClient.getParsedTestDataConfig()
# Get Zone, Domain and templates
cls.domain = get_domain(cls.api_client)
cls.zone = get_zone(cls.api_client, cloudstackTestClient.getZoneForTests())
template = get_template(cls.api_client,
cls.zone.id,
cls.testdata["ostype"])
# Set Zones and disk offerings
cls.testdata["virtual_machine"]["zoneid"] = cls.zone.id
cls.testdata["virtual_machine"]["template"] = template.id
cls._cleanup = []
try:
cls.service_offering = ServiceOffering.create(
cls.api_client,
cls.testdata["service_offering"])
cls._cleanup.append(cls.service_offering)
except Exception as e:
cls.tearDownClass()
raise unittest.SkipTest(e)
return
def setUp(self):
self.apiclient = self.testClient.getApiClient()
self.cleanup = []
try:
self.account = Account.create(self.apiclient,
self.testdata["account"],
domainid=self.domain.id)
self.cleanup.append(self.account)
self.virtual_machine = VirtualMachine.create(
self.api_client,
self.testdata["virtual_machine"],
accountid=self.account.name,
domainid=self.account.domainid,
serviceofferingid=self.service_offering.id,
mode=self.zone.networktype)
except Exception as e:
self.tearDown()
raise e
def tearDown(self):
try:
cleanup_resources(self.apiclient, self.cleanup)
except Exception as e:
raise Exception("Warning: Exception during cleanup : %s" % e)
return
@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)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_09_lbvmips_true(self):
"""List load balancer instances by passing lbvmips flag True
steps:
# 1. Add secondary IP for VM
# 2. Associate public IP for the network
# 3. Create load balancer rule for IP
# 4. Assign load balancer rule to secondary IP
# 5. List loadbalancer instances by specifying lbvmips flag as True
# 6. List of load balancer instances should contain the secondary IP of VM
used to assign lb rule to"""
secondaryip = NIC.addIp(self.apiclient,
id=self.virtual_machine.nic[0].id)
public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=self.virtual_machine.nic[0].networkid)
lb_rule = LoadBalancerRule.create(
self.apiclient,
self.testdata["lbrule"],
ipaddressid=public_ip.ipaddress.id,
accountid=self.account.name,
networkid=self.virtual_machine.nic[0].networkid,
domainid=self.account.domainid)
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(secondaryip.ipaddress)}]
lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [secondaryip.ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, lb_rule, iplist)
self.assertTrue(response[0], response[1])
lbruleinstances = LoadBalancerRule.listLoadBalancerRuleInstances(
self.apiclient,
id=lb_rule.id,
lbvmips=True
)
self.assertEqual(validateList(lbruleinstances)[0], PASS,
"lbruleinstances list validation failed")
self.assertEqual(str(lbruleinstances[0].lbvmipaddresses[0]), secondaryip.ipaddress,
"IP address in lbruleinstances list not matching\
with secondary ip assigned to lb rule")
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_10_lbvmips_false(self):
"""List load balancer instances by passing lbvmips flag False
steps:
# 1. Add secondary IP for VM
# 2. Associate public IP for the network
# 3. Create load balancer rule for IP
# 4. Assign load balancer rule to secondary IP
# 5. List loadbalancer instances by specifying lbvmips flag as False
# 6. List of load balancer instances should not list the vm ip addresses to
which load balancer rule has been assigned"""
secondaryip = NIC.addIp(self.apiclient,
id=self.virtual_machine.nic[0].id)
public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=self.virtual_machine.nic[0].networkid)
lb_rule = LoadBalancerRule.create(
self.apiclient,
self.testdata["lbrule"],
ipaddressid=public_ip.ipaddress.id,
accountid=self.account.name,
networkid=self.virtual_machine.nic[0].networkid,
domainid=self.account.domainid)
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(secondaryip.ipaddress)}]
lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [secondaryip.ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, lb_rule, iplist)
self.assertTrue(response[0], response[1])
lbruleinstances = LoadBalancerRule.listLoadBalancerRuleInstances(
self.apiclient,
id=lb_rule.id,
lbvmips=False
)
self.assertEqual(validateList(lbruleinstances)[0], PASS,
"lbruleinstances list validation failed")
self.assertTrue(lbruleinstances[0].lbvmipaddresses is None,
"IP address in lbruleinstances list not matching\
with secondary ip assigned to lb rule")
return
class TestLbRuleFunctioning(cloudstackTestCase):
@classmethod
def setUpClass(cls):
cloudstackTestClient = super(TestLbRuleFunctioning,\
cls).getClsTestClient()
cls.api_client = cloudstackTestClient.getApiClient()
cls.testdata = cloudstackTestClient.getParsedTestDataConfig()
# Get Zone, Domain and templates
cls.domain = get_domain(cls.api_client)
cls.zone = get_zone(cls.api_client, cloudstackTestClient.getZoneForTests())
template = get_template(cls.api_client,
cls.zone.id,
cls.testdata["ostype"])
# Set Zones and disk offerings
cls.testdata["virtual_machine"]["zoneid"] = cls.zone.id
cls.testdata["virtual_machine"]["template"] = template.id
cls._cleanup = []
try:
cls.service_offering = ServiceOffering.create(
cls.api_client,
cls.testdata["service_offering"])
cls._cleanup.append(cls.service_offering)
except Exception as e:
cls.tearDownClass()
raise unittest.SkipTest(e)
return
def setUp(self):
self.apiclient = self.testClient.getApiClient()
self.cleanup = []
try:
self.account = Account.create(self.apiclient,
self.testdata["account"],
domainid=self.domain.id)
self.cleanup.append(self.account)
self.virtual_machine = VirtualMachine.create(
self.api_client,
self.testdata["virtual_machine"],
accountid=self.account.name,
domainid=self.account.domainid,
serviceofferingid=self.service_offering.id,
mode=self.zone.networktype)
self.secondaryip = NIC.addIp(self.apiclient,
id=self.virtual_machine.nic[0].id)
self.public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=self.virtual_machine.nic[0].networkid)
FireWallRule.create(self.apiclient,ipaddressid=self.public_ip.ipaddress.id,
protocol='TCP', cidrlist=[self.testdata["fwrule"]["cidr"]],
startport=self.testdata["fwrule"]["startport"],endport=self.testdata["fwrule"]["endport"])
# To make secondary IP working for VM, we have to configure it on VM
# after acquiring it
# Hence create NAT rule for public IP and SSH to it using the primary IP of VM
# After SSH is successful, configure the secondary IP on VM, delete the NAT rule
# and then create LB rule for secondary IP
nat_rule = NATRule.create(self.apiclient, self.virtual_machine,
self.testdata["natrule"],ipaddressid=self.public_ip.ipaddress.id,
networkid=self.virtual_machine.nic[0].networkid)
sshClient = SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['natrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
cmd = "ip addr add {0}/24 broadcast {0} dev eth0".format(self.secondaryip.ipaddress)
sshClient.execute(cmd)
sshClient.execute("ip addr show")
# Deleting NAT rule after configuring secondary IP
nat_rule.delete(self.apiclient)
self.lb_rule = LoadBalancerRule.create(
self.apiclient,
self.testdata["lbrule"],
ipaddressid=self.public_ip.ipaddress.id,
accountid=self.account.name,
networkid=self.virtual_machine.nic[0].networkid,
domainid=self.account.domainid)
except Exception as e:
self.tearDown()
raise e
def tearDown(self):
try:
cleanup_resources(self.apiclient, self.cleanup)
except Exception as e:
raise Exception("Warning: Exception during cleanup : %s" % e)
return
@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)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_11_ssh_to_secondary_ip(self):
"""SSH to VM using LB rule assigned to secondary IP of VM
steps:
# 1. Add secondary IP for VM
# 2. Associate public IP for the network
# 3. Create load balancer rule for IP
# 4. Assign load balancer rule to secondary IP
# 5. Try to SSH to VM using the public IP"""
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.secondaryip.ipaddress)}]
self.lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [self.secondaryip.ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, self.lb_rule, iplist)
self.assertTrue(response[0], response[1])
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
return
@unittest.skip("Failing-WIP")
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_12_ssh_to_primary_secondary_ip(self):
"""SSH to VM using LB rule assigned to primary and secondary IP of VM
steps:
# 1. Add secondary IP for VM
# 2. Associate public IP for the network
# 3. Create load balancer rule for IP
# 4. Assign load balancer rule to primary and secondary IP of VM
# 5. Try to SSH to VM using the public IP
# 6. Delete the primary IP
# 7. Try to list load balancer rule, the operation should fail
# 8. Try to SSH to VM using the public IP, the operation should fail"""
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.secondaryip.ipaddress)}]
self.lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [self.secondaryip.ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, self.lb_rule, iplist)
self.assertTrue(response[0], response[1])
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
self.public_ip.delete(self.apiclient)
with self.assertRaises(Exception):
LoadBalancerRule.list(self.apiclient, id=self.lb_rule.id)
with self.assertRaises(Exception):
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_13_delete_lb_rule(self):
"""SSH to VM after deleting LB rule
steps:
# 1. Add secondary IP for VM
# 2. Associate public IP for the network
# 3. Create load balancer rule for IP
# 4. Assign load balancer rule to primary and secondary IP of VM
# 5. Try to SSH to VM using the public IP, it should succeed
# 6. Delete the LB rule
# 7. Try to SSH to VM using the public IP, operation should fail"""
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.secondaryip.ipaddress)}]
self.lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [self.secondaryip.ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, self.lb_rule, iplist)
self.assertTrue(response[0], response[1])
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
self.lb_rule.delete(self.apiclient)
with self.assertRaises(Exception):
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_14_remove_lb_rule_secondary_ip(self):
"""ssh to vm after removing secondary ip from load balancer rule
steps:
# 1. add secondary ip for vm
# 2. associate public ip for the network
# 3. create load balancer rule for ip
# 4. assign load balancer rule to primary and secondary ip of vm
# 5. try to ssh to vm using the public ip, it should succeed
# 6. remove the secondary ip of vm from the load balancer rule
# 7. try to ssh to vm using the public ip, it should succeed"""
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.secondaryip.ipaddress)},
{"vmid": str(self.virtual_machine.id),
"vmip": str(self.virtual_machine.nic[0].ipaddress)}]
self.lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [self.secondaryip.ipaddress,
self.virtual_machine.nic[0].ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, self.lb_rule, iplist)
self.assertTrue(response[0], response[1])
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.secondaryip.ipaddress)}]
self.lb_rule.remove(self.apiclient,
vmidipmap=vmidipmap)
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_15_remove_lb_rule_primary_ip(self):
"""ssh to vm after removing secondary ip from load balancer rule
steps:
# 1. Add secondary ip for vm
# 2. Associate public ip for the network
# 3. Create load balancer rule for ip
# 4. Assign load balancer rule to primary and secondary ip of vm
# 5. Try to ssh to vm using the public ip, it should succeed
# 6. Remove the primary ip of vm from the load balancer rule
# 7. Try to ssh to vm using the public ip, it should succeed"""
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.secondaryip.ipaddress)},
{"vmid": str(self.virtual_machine.id),
"vmip": str(self.virtual_machine.nic[0].ipaddress)}]
self.lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [self.secondaryip.ipaddress,
self.virtual_machine.nic[0].ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, self.lb_rule, iplist)
self.assertTrue(response[0], response[1])
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.virtual_machine.nic[0].ipaddress)}]
self.lb_rule.remove(self.apiclient,
vmidipmap=vmidipmap)
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_16_delete_vm_from_lb_rule(self):
"""ssh to vm after removing secondary ip from load balancer rule
steps:
# 1. Add secondary ip for vm
# 2. Associate public ip for the network
# 3. Create load balancer rule for ip
# 4. Assign load balancer rule to secondary ip of vm
# 5. Try to ssh to vm using the public ip, it should succeed
# 6. Remove the VM from load balancer rule
# 7. Try to list the load balancer rules for the VM, list should be empty
# 8. Try to SSH to VM using the public IP, the opeation should fail"""
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.secondaryip.ipaddress)}]
self.lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [self.secondaryip.ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, self.lb_rule, iplist)
self.assertTrue(response[0], response[1])
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
self.lb_rule.remove(self.apiclient, vms=[self.virtual_machine])
lbrules = LoadBalancerRule.list(
self.apiclient,
virtualmachineid=self.virtual_machine.id,
listall=True)
self.assertTrue(lbrules is None,
"LB rules list should be empty")
with self.assertRaises(Exception):
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_20_destroy_recover_vm(self):
"""Verify LB rules after destroying and recovering VM
steps:
# 1. Add secondary ip for vm
# 2. Associate public ip for the network
# 3. Create load balancer rule for ip
# 4. Assign load balancer rule to secondary ip of vm
# 5. Try to ssh to vm using the public ip, it should succeed
# 6. Destroy VM
# 7 Recover the VM
# 8.Try to list the LB rule, it should be present
# 9.Try to SSH to VM, it should be successful"""
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.secondaryip.ipaddress)}]
self.lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [self.secondaryip.ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, self.lb_rule, iplist)
self.assertTrue(response[0], response[1])
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
#Destroy VM
self.virtual_machine.delete(self.apiclient, expunge=False)
#Recover VM
self.virtual_machine.recover(self.apiclient)
self.virtual_machine.start(self.apiclient)
lbruleinstances = LoadBalancerRule.listLoadBalancerRuleInstances(
self.apiclient,
id=self.lb_rule.id,
lbvmips=True
)
self.assertEqual(validateList(lbruleinstances)[0], PASS,
"lbruleinstances list validation failed")
self.assertEqual(str(lbruleinstances[0].lbvmipaddresses[0]), self.secondaryip.ipaddress,
"IP address in lbruleinstances list not matching\
with secondary ip assigned to lb rule")
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_21_modify_lb_rule_algorithm(self):
"""Verify LB rule functioning with different algorithm
steps:
# 1. Add secondary ip for vm
# 2. Associate public ip for the network
# 3. Create load balancer rule for ip using roundrobin algorithm
# 4. Assign load balancer rule to secondary ip of vm
# 5. Try to ssh to vm using the public ip, it should succeed
# 6. Update the algorithm of LB rule as leastconn
# 7. Try to SSH to VM, it should succeed"""
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.secondaryip.ipaddress)}]
self.lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [self.secondaryip.ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, self.lb_rule, iplist)
self.assertTrue(response[0], response[1])
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
self.lb_rule.update(self.apiclient, algorithm="leastconn")
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
return
class TestNetworkOperations(cloudstackTestCase):
@classmethod
def setUpClass(cls):
cloudstackTestClient = super(TestNetworkOperations,\
cls).getClsTestClient()
cls.api_client = cloudstackTestClient.getApiClient()
cls.testdata = cloudstackTestClient.getParsedTestDataConfig()
# Get Zone, Domain and templates
cls.domain = get_domain(cls.api_client)
cls.zone = get_zone(cls.api_client, cloudstackTestClient.getZoneForTests())
template = get_template(cls.api_client,
cls.zone.id,
cls.testdata["ostype"])
# Set Zones and disk offerings
cls.testdata["virtual_machine"]["zoneid"] = cls.zone.id
cls.testdata["virtual_machine"]["template"] = template.id
cls._cleanup = []
try:
cls.service_offering = ServiceOffering.create(
cls.api_client,
cls.testdata["service_offering"])
cls._cleanup.append(cls.service_offering)
except Exception as e:
cls.tearDownClass()
raise unittest.SkipTest(e)
return
def setUp(self):
self.apiclient = self.testClient.getApiClient()
self.cleanup = []
try:
self.account = Account.create(self.apiclient,
self.testdata["account"],
domainid=self.domain.id)
self.cleanup.append(self.account)
self.virtual_machine = VirtualMachine.create(
self.api_client,
self.testdata["virtual_machine"],
accountid=self.account.name,
domainid=self.account.domainid,
serviceofferingid=self.service_offering.id,
mode=self.zone.networktype)
self.secondaryip = NIC.addIp(self.apiclient,
id=self.virtual_machine.nic[0].id)
self.public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=self.virtual_machine.nic[0].networkid)
FireWallRule.create(self.apiclient,ipaddressid=self.public_ip.ipaddress.id,
protocol='TCP', cidrlist=[self.testdata["fwrule"]["cidr"]],
startport=self.testdata["fwrule"]["startport"],endport=self.testdata["fwrule"]["endport"])
# To make secondary IP working for VM, we have to configure it on VM
# after acquiring it
# Hence create NAT rule for public IP and SSH to it using the primary IP of VM
# After SSH is successful, configure the secondary IP on VM, delete the NAT rule
# and then create LB rule for secondary IP
nat_rule = NATRule.create(self.apiclient, self.virtual_machine,
self.testdata["natrule"],ipaddressid=self.public_ip.ipaddress.id,
networkid=self.virtual_machine.nic[0].networkid)
sshClient = SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['natrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
cmd = "ip addr add {0}/24 broadcast {0} dev eth0".format(self.secondaryip.ipaddress)
sshClient.execute(cmd)
sshClient.execute("ip addr show")
# Deleting NAT rule after configuring secondary IP
nat_rule.delete(self.apiclient)
self.lb_rule = LoadBalancerRule.create(
self.apiclient,
self.testdata["lbrule"],
ipaddressid=self.public_ip.ipaddress.id,
accountid=self.account.name,
networkid=self.virtual_machine.nic[0].networkid,
domainid=self.account.domainid)
except Exception as e:
self.tearDown()
raise e
def tearDown(self):
try:
cleanup_resources(self.apiclient, self.cleanup)
except Exception as e:
raise Exception("Warning: Exception during cleanup : %s" % e)
return
@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)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_17_restart_router(self):
"""Verify LB rules after restarting router VM
steps:
# 1. Add secondary ip for vm
# 2. Associate public ip for the network
# 3. Create load balancer rule for ip using roundrobin algorithm
# 4. Assign load balancer rule to secondary ip of vm
# 5. Try to ssh to vm using the public ip, it should succeed
# 6. List the router associated with the network and restart the router
# 7. List the LB rule, it should be present
# 8. Try to SSH to VM, it should succeed"""
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.secondaryip.ipaddress)},
{"vmid": str(self.virtual_machine.id),
"vmip": str(self.virtual_machine.nic[0].ipaddress)}]
self.lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [self.secondaryip.ipaddress,
self.virtual_machine.nic[0].ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, self.lb_rule, iplist)
self.assertTrue(response[0], response[1])
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
routers = Router.list(self.apiclient, networkid=self.virtual_machine.nic[0].networkid, listall=True)
self.assertEqual(validateList(routers)[0], PASS, "routers list validation failed")
Router.reboot(self.apiclient, id=routers[0].id)
lbrules = LoadBalancerRule.list(self.apiclient, id=self.lb_rule.id, listll=True)
self.assertEqual(validateList(lbrules)[0], PASS, "lbrules list validation failed")
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_18_restart_network_cleanup_true(self):
"""Verfy LB rules after restarting the network with cleanup flag set to True
steps:
# 1. Add secondary ip for vm
# 2. Associate public ip for the network
# 3. Create load balancer rule for ip using roundrobin algorithm
# 4. Assign load balancer rule to secondary ip of vm
# 5. Try to ssh to vm using the public ip, it should succeed
# 6. Restart the network with cleanup flag set to True
# 7. List the LB rule, it should be present
# 8. Try to SSH to VM, it should succeed"""
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.secondaryip.ipaddress)},
{"vmid": str(self.virtual_machine.id),
"vmip": str(self.virtual_machine.nic[0].ipaddress)}]
self.lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [self.secondaryip.ipaddress,
self.virtual_machine.nic[0].ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, self.lb_rule, iplist)
self.assertTrue(response[0], response[1])
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
cmd = restartNetwork.restartNetworkCmd()
cmd.id = self.virtual_machine.nic[0].networkid
cmd.cleanup = True
self.apiclient.restartNetwork(cmd)
lbrules = LoadBalancerRule.list(self.apiclient, id=self.lb_rule.id, listll=True)
self.assertEqual(validateList(lbrules)[0], PASS, "lbrules list validation failed")
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_19_restart_network_cleanup_false(self):
"""Verfy LB rules after restarting the network with cleanup flag set to False
steps:
# 1. Add secondary ip for vm
# 2. Associate public ip for the network
# 3. Create load balancer rule for ip using roundrobin algorithm
# 4. Assign load balancer rule to secondary ip of vm
# 5. Try to ssh to vm using the public ip, it should succeed
# 6. Restart the network with cleanup flag set to False
# 7. List the LB rule, it should be present
# 8. Try to SSH to VM, it should succeed"""
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.secondaryip.ipaddress)},
{"vmid": str(self.virtual_machine.id),
"vmip": str(self.virtual_machine.nic[0].ipaddress)}]
self.lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [self.secondaryip.ipaddress,
self.virtual_machine.nic[0].ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, self.lb_rule, iplist)
self.assertTrue(response[0], response[1])
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
cmd = restartNetwork.restartNetworkCmd()
cmd.id = self.virtual_machine.nic[0].networkid
cmd.cleanup = False
self.apiclient.restartNetwork(cmd)
lbrules = LoadBalancerRule.list(self.apiclient, id=self.lb_rule.id, listll=True)
self.assertEqual(validateList(lbrules)[0], PASS, "lbrules list validation failed")
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
return
@attr(tags = ["advanced", "selfservice"], required_hardware="false")
def test_22_network_gc(self):
"""Verify LB rule functioning to secondary IP after network GC
steps:
# 1. Add secondary ip for vm
# 2. Associate public ip for the network
# 3. Create load balancer rule for ip using roundrobin algorithm
# 4. Assign load balancer rule to secondary ip of vm
# 5. Try to ssh to vm using the public ip, it should succeed
# 6. Stop the VM
# 7. Wait for the network.gc time interval
# 7. Check the state of the network, it should be allocated
# 8. Check the state of the related router VM, it should be stopped
# 9. Start the virtual machine
# 8. Check the state of the network, it should be implemented now
# 11.Check the state of the router, it should be running
# 12.Try to SSH to the VM using public IP, it should be successful"""
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(self.secondaryip.ipaddress)},
{"vmid": str(self.virtual_machine.id),
"vmip": str(self.virtual_machine.nic[0].ipaddress)}]
self.lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [self.secondaryip.ipaddress,
self.virtual_machine.nic[0].ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, self.lb_rule, iplist)
self.assertTrue(response[0], response[1])
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
self.virtual_machine.stop(self.apiclient)
wait_for_cleanup(self.apiclient, ["network.gc.wait",
"network.gc.interval"])
response = verifyNetworkState(self.api_client, self.virtual_machine.nic[0].networkid, "allocated")
exceptionOccured = response[0]
isNetworkInDesiredState = response[1]
exceptionMessage = response[2]
if (exceptionOccured or (not isNetworkInDesiredState)):
self.fail(exceptionMessage)
routers = Router.list(self.apiclient, networkid=self.virtual_machine.nic[0].networkid, listall=True)
self.assertEqual(validateList(routers)[0], PASS, "routers list validation failed")
self.assertEqual(str(routers[0].state).lower(), "stopped", "Router should be in stopped state")
self.virtual_machine.start(self.apiclient)
response = verifyNetworkState(self.api_client, self.virtual_machine.nic[0].networkid, "implemented")
exceptionOccured = response[0]
isNetworkInDesiredState = response[1]
exceptionMessage = response[2]
if (exceptionOccured or (not isNetworkInDesiredState)):
self.fail(exceptionMessage)
routers = Router.list(self.apiclient, networkid=self.virtual_machine.nic[0].networkid, listall=True)
self.assertEqual(validateList(routers)[0], PASS, "routers list validation failed")
self.assertEqual(str(routers[0].state).lower(), "running", "Router should be in running state")
try:
SshClient(self.public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
return
class TestExternalLoadBalancer(cloudstackTestCase):
@classmethod
def setUpClass(cls):
cloudstackTestClient = super(TestExternalLoadBalancer,\
cls).getClsTestClient()
cls.api_client = cloudstackTestClient.getApiClient()
cls.testdata = cloudstackTestClient.getParsedTestDataConfig()
# Get Zone, Domain and templates
cls.domain = get_domain(cls.api_client)
cls.zone = get_zone(cls.api_client, cloudstackTestClient.getZoneForTests())
template = get_template(cls.api_client,
cls.zone.id,
cls.testdata["ostype"])
# Set Zones and disk offerings
cls.testdata["virtual_machine"]["zoneid"] = cls.zone.id
cls.testdata["virtual_machine"]["template"] = template.id
cls._cleanup = []
try:
cls.netscaler = add_netscaler(cls.api_client, cls.zone.id, cls.testdata["netscaler_VPX"])
cls._cleanup.append(cls.netscaler)
except Exception as e:
raise unittest.SkipTest("Failed to add netscaler device: %s" % e)
try:
cls.service_offering = ServiceOffering.create(
cls.api_client,
cls.testdata["service_offering"])
cls._cleanup.append(cls.service_offering)
except Exception as e:
cls.tearDownClass()
raise unittest.SkipTest(e)
return
def setUp(self):
self.apiclient = self.testClient.getApiClient()
self.cleanup = []
try:
self.account = Account.create(self.apiclient,
self.testdata["account"],
domainid=self.domain.id)
self.cleanup.append(self.account)
except Exception as e:
self.tearDown()
raise e
def tearDown(self):
try:
cleanup_resources(self.apiclient, self.cleanup)
except Exception as e:
raise Exception("Warning: Exception during cleanup : %s" % e)
return
@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)
return
@attr(tags = ["advancedns", "provisioning"], required_hardware="true")
def test_23_lb_rule_functioning_with_netscaler(self):
"""Verify LB rule functioning for secondary IP with LB handled
through Netscaler device
steps:
# 1. Add secondary ip for vm
# 2. Associate public ip for the network
# 3. Create load balancer rule for ip using roundrobin algorithm
# 4. Assign load balancer rule to secondary ip of vm
# 5. Try to ssh to vm using the public ip, it should succeed
# 6. Update the algorithm of LB rule as leastconn
# 7. Try to SSH to VM, it should succeed"""
# Creating Network Offerign with LB as Netscalar
nwoff_netscaler = NetworkOffering.create(
self.apiclient,
self.testdata["nw_off_isolated_netscaler"]
)
# Enable Network offering
nwoff_netscaler.update(self.apiclient, state='Enabled')
# Creating a Network Using the Network Offering
network = Network.create(
self.apiclient,
self.testdata["network"],
accountid=self.account.name,
domainid=self.domain.id,
networkofferingid=nwoff_netscaler.id,
zoneid=self.zone.id
)
self.virtual_machine = VirtualMachine.create(
self.api_client,
self.testdata["virtual_machine"],
accountid=self.account.name,
domainid=self.account.domainid,
serviceofferingid=self.service_offering.id,
mode=self.zone.networktype,
networkids = [network.id])
secondaryip = NIC.addIp(self.apiclient,
id=self.virtual_machine.nic[0].id)
public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=self.virtual_machine.nic[0].networkid)
FireWallRule.create(self.apiclient,ipaddressid=public_ip.ipaddress.id,
protocol='TCP', cidrlist=[self.testdata["fwrule"]["cidr"]],
startport=self.testdata["fwrule"]["startport"],endport=self.testdata["fwrule"]["endport"])
nat_rule = NATRule.create(self.apiclient, self.virtual_machine,
self.testdata["natrule"],ipaddressid=public_ip.ipaddress.id,
networkid=self.virtual_machine.nic[0].networkid)
sshClient = SshClient(public_ip.ipaddress.ipaddress,
self.testdata['natrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
cmd = "ip addr add {0}/24 broadcast {0} dev eth0".format(self.secondaryip.ipaddress)
sshClient.execute(cmd)
sshClient.execute("ip addr show")
# Deleting NAT rule after configuring secondary IP
nat_rule.delete(self.apiclient)
lb_rule = LoadBalancerRule.create(
self.apiclient,
self.testdata["lbrule"],
ipaddressid=public_ip.ipaddress.id,
accountid=self.account.name,
networkid=self.virtual_machine.nic[0].networkid,
domainid=self.account.domainid)
vmidipmap = [{"vmid": str(self.virtual_machine.id),
"vmip": str(secondaryip.ipaddress)}]
lb_rule.assign(self.apiclient,
vmidipmap=vmidipmap)
iplist = [secondaryip.ipaddress]
response = IsIpAssignedToLoadBalancerRule(self, lb_rule, iplist)
self.assertTrue(response[0], response[1])
try:
SshClient(public_ip.ipaddress.ipaddress,
self.testdata['lbrule']["publicport"],
self.virtual_machine.username,
self.virtual_machine.password
)
except Exception as e:
self.fail("Exception during SSH : %s" % e)
return