mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
2021 lines
77 KiB
Python
2021 lines
77 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
|
|
import 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.hypervisor = cloudstackTestClient.getHypervisorInfo()
|
|
# As Hyperv is GUI based VM, it requires more resources to be
|
|
# able to SSH properly to it
|
|
if cls.hypervisor.lower() == 'hyperv':
|
|
cls.testdata["service_offering"]["name"] = "Medium Instance"
|
|
cls.testdata["service_offering"]["memory"] = "1024"
|
|
cls.testdata["service_offering"]["cpuspeed"] = "1024"
|
|
|
|
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.cleanup.append(self.virtual_machine)
|
|
except Exception as e:
|
|
self.tearDown()
|
|
raise e
|
|
|
|
def tearDown(self):
|
|
super(TestAssignLBRule, self).tearDown()
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
super(TestAssignLBRule, cls).tearDownClass()
|
|
|
|
@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)
|
|
self.cleanup.append(public_ip)
|
|
|
|
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)
|
|
self.cleanup.append(lb_rule)
|
|
|
|
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)
|
|
self.cleanup.append(public_ip)
|
|
|
|
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)
|
|
self.cleanup.append(lb_rule)
|
|
|
|
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)
|
|
self.cleanup.append(public_ip)
|
|
|
|
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)
|
|
self.cleanup.append(lb_rule)
|
|
|
|
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, ])
|
|
self.cleanup.append(self.virtual_machine2)
|
|
|
|
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)
|
|
self.cleanup.append(public_ip)
|
|
|
|
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)
|
|
self.cleanup.append(lb_rule)
|
|
|
|
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.hypervisor = cloudstackTestClient.getHypervisorInfo()
|
|
# As Hyperv is GUI based VM, it requires more resources to be
|
|
# able to SSH properly to it
|
|
if cls.hypervisor.lower() == 'hyperv':
|
|
cls.testdata["service_offering"]["name"] = "Medium Instance"
|
|
cls.testdata["service_offering"]["memory"] = "1024"
|
|
cls.testdata["service_offering"]["cpuspeed"] = "1024"
|
|
|
|
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.cleanup.append(self.virtual_machine)
|
|
except Exception as e:
|
|
self.tearDown()
|
|
raise e
|
|
|
|
def tearDown(self):
|
|
super(TestFailureScenarios, self).tearDown()
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
super(TestFailureScenarios, cls).tearDownClass()
|
|
|
|
@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)
|
|
self.cleanup.append(public_ip)
|
|
|
|
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)
|
|
self.cleanup.append(lb_rule)
|
|
|
|
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)
|
|
self.cleanup.append(public_ip)
|
|
|
|
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)
|
|
self.cleanup.append(lb_rule)
|
|
|
|
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)
|
|
self.cleanup.append(public_ip1)
|
|
|
|
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)
|
|
self.cleanup.append(lb_rule1)
|
|
|
|
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)
|
|
self.cleanup.append(public_ip2)
|
|
|
|
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)
|
|
self.cleanup.append(lb_rule2)
|
|
|
|
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)
|
|
self.cleanup.append(public_ip1)
|
|
|
|
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)
|
|
self.cleanup.append(lb_rule1)
|
|
|
|
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.hypervisor = cloudstackTestClient.getHypervisorInfo()
|
|
# As Hyperv is GUI based VM, it requires more resources to be
|
|
# able to SSH properly to it
|
|
if cls.hypervisor.lower() == 'hyperv':
|
|
cls.testdata["service_offering"]["name"] = "Medium Instance"
|
|
cls.testdata["service_offering"]["memory"] = "1024"
|
|
cls.testdata["service_offering"]["cpuspeed"] = "1024"
|
|
|
|
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.cleanup.append(self.virtual_machine)
|
|
except Exception as e:
|
|
self.tearDown()
|
|
raise e
|
|
|
|
def tearDown(self):
|
|
super(TestListLBRuleInstances, self).tearDown()
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
super(TestListLBRuleInstances, cls).tearDownClass()
|
|
|
|
@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)
|
|
self.cleanup.append(public_ip)
|
|
|
|
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)
|
|
self.cleanup.append(lb_rule)
|
|
|
|
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)
|
|
self.cleanup.append(public_ip)
|
|
|
|
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)
|
|
self.cleanup.append(lb_rule)
|
|
|
|
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.hypervisor = cloudstackTestClient.getHypervisorInfo()
|
|
# As Hyperv is GUI based VM, it requires more resources to be
|
|
# able to SSH properly to it
|
|
if cls.hypervisor.lower() == 'hyperv':
|
|
cls.testdata["service_offering"]["name"] = "Medium Instance"
|
|
cls.testdata["service_offering"]["memory"] = "1024"
|
|
cls.testdata["service_offering"]["cpuspeed"] = "1024"
|
|
|
|
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.cleanup.append(self.virtual_machine)
|
|
|
|
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)
|
|
self.cleanup.append(self.public_ip)
|
|
|
|
fwr = 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"])
|
|
self.cleanup.append(fwr)
|
|
|
|
# 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)
|
|
self.cleanup.append(nat_rule)
|
|
|
|
sshClient = SshClient(self.public_ip.ipaddress.ipaddress,
|
|
self.testdata['natrule']["publicport"],
|
|
self.virtual_machine.username,
|
|
self.virtual_machine.password
|
|
)
|
|
response = sshClient.execute("netstat -i")
|
|
# Sample Reponse:
|
|
# [u'Kernel Interface table',
|
|
# u'Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg',
|
|
# u'eth2 1500 0 29 0 0 0 38 0 0 0 BMRU',
|
|
# u'lo 16436 0 4 0 0 0 4 0 0
|
|
# 0 LRU']}
|
|
|
|
# We need to extract default interface out of the response
|
|
defaultEthernetDevice = str(response[2].split()[0])
|
|
|
|
cmd = "ip addr add {0}/24 broadcast {0} dev {1}".format(
|
|
self.secondaryip.ipaddress, defaultEthernetDevice)
|
|
sshClient.execute(cmd)
|
|
sshClient.execute("ip addr show")
|
|
|
|
# Deleting NAT rule after configuring secondary IP
|
|
nat_rule.delete(self.apiclient)
|
|
self.cleanup.remove(nat_rule)
|
|
|
|
self.testdata["lbrule"]["publicport"] = 22
|
|
self.testdata["lbrule"]["privateport"] = 22
|
|
|
|
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)
|
|
self.cleanup.append(self.lb_rule)
|
|
except Exception as e:
|
|
self.tearDown()
|
|
raise e
|
|
|
|
def tearDown(self):
|
|
super(TestLbRuleFunctioning, self).tearDown()
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
super(TestLbRuleFunctioning, cls).tearDownClass()
|
|
|
|
@attr(tags=["advanced"], required_hardware="true")
|
|
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"], required_hardware="true")
|
|
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)
|
|
self.cleanup.remove(self.public_ip)
|
|
|
|
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"], required_hardware="true")
|
|
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)
|
|
self.cleanup.remove(self.lb_rule)
|
|
|
|
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"], required_hardware="true")
|
|
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)
|
|
self.cleanup.remove(self.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"], required_hardware="true")
|
|
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)
|
|
self.cleanup.remove(self.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"], required_hardware="true")
|
|
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])
|
|
self.cleanup.remove(self.lb_rule)
|
|
|
|
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"], required_hardware="true")
|
|
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"""
|
|
|
|
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")
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware="true")
|
|
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.hypervisor = cloudstackTestClient.getHypervisorInfo()
|
|
# As Hyperv is GUI based VM, it requires more resources to be
|
|
# able to SSH properly to it
|
|
if cls.hypervisor.lower() == 'hyperv':
|
|
cls.testdata["service_offering"]["name"] = "Medium Instance"
|
|
cls.testdata["service_offering"]["memory"] = "1024"
|
|
cls.testdata["service_offering"]["cpuspeed"] = "1024"
|
|
|
|
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.cleanup.append(self.virtual_machine)
|
|
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)
|
|
self.cleanup.append(self.public_ip)
|
|
|
|
fwr = 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"])
|
|
self.cleanup.append(fwr)
|
|
|
|
# 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)
|
|
self.cleanup.append(nat_rule)
|
|
|
|
sshClient = SshClient(self.public_ip.ipaddress.ipaddress,
|
|
self.testdata['natrule']["publicport"],
|
|
self.virtual_machine.username,
|
|
self.virtual_machine.password
|
|
)
|
|
response = sshClient.execute("netstat -i")
|
|
# Sample Reponse:
|
|
# [u'Kernel Interface table',
|
|
# u'Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg',
|
|
# u'eth2 1500 0 29 0 0 0 38 0 0 0 BMRU',
|
|
# u'lo 16436 0 4 0 0 0 4 0 0
|
|
# 0 LRU']}
|
|
|
|
# We need to extract default interface out of the response
|
|
defaultEthernetDevice = str(response[2].split()[0])
|
|
|
|
cmd = "ip addr add {0}/24 broadcast {0} dev {1}".format(
|
|
self.secondaryip.ipaddress, defaultEthernetDevice)
|
|
sshClient.execute(cmd)
|
|
sshClient.execute("ip addr show")
|
|
|
|
# Deleting NAT rule after configuring secondary IP
|
|
nat_rule.delete(self.apiclient)
|
|
self.cleanup.remove(nat_rule)
|
|
|
|
self.testdata["lbrule"]["publicport"] = 22
|
|
self.testdata["lbrule"]["privateport"] = 22
|
|
|
|
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)
|
|
self.cleanup.append(self.lb_rule)
|
|
except Exception as e:
|
|
self.tearDown()
|
|
raise e
|
|
|
|
def tearDown(self):
|
|
super(TestNetworkOperations, self).tearDown()
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
super(TestNetworkOperations, cls).tearDownClass()
|
|
|
|
@attr(tags=["advanced"], required_hardware="true")
|
|
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"], required_hardware="true")
|
|
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"], required_hardware="true")
|
|
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"], required_hardware="true")
|
|
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")
|
|
exceptionOccurred = response[0]
|
|
isNetworkInDesiredState = response[1]
|
|
exceptionMessage = response[2]
|
|
|
|
if (exceptionOccurred 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")
|
|
exceptionOccurred = response[0]
|
|
isNetworkInDesiredState = response[1]
|
|
exceptionMessage = response[2]
|
|
|
|
if (exceptionOccurred 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 = []
|
|
cls.testdata["configurableData"]\
|
|
["netscaler"]["lbdevicededicated"] = False
|
|
|
|
try:
|
|
cls.netscaler = add_netscaler(
|
|
cls.api_client,
|
|
cls.zone.id,
|
|
cls.testdata["configurableData"]["netscaler"])
|
|
cls._cleanup.append(cls.netscaler)
|
|
except Exception as e:
|
|
raise unittest.SkipTest("Failed to add netscaler device: %s" % e)
|
|
|
|
try:
|
|
cls.hypervisor = cloudstackTestClient.getHypervisorInfo()
|
|
# As Hyperv is GUI based VM, it requires more resources to be
|
|
# able to SSH properly to it
|
|
if cls.hypervisor.lower() == 'hyperv':
|
|
cls.testdata["service_offering"]["name"] = "Medium Instance"
|
|
cls.testdata["service_offering"]["memory"] = "1024"
|
|
cls.testdata["service_offering"]["cpuspeed"] = "1024"
|
|
|
|
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):
|
|
super(TestExternalLoadBalancer, self).tearDown()
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
super(TestExternalLoadBalancer, cls).tearDownClass()
|
|
|
|
@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"]
|
|
)
|
|
self.cleanup.append(nwoff_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.cleanup.append(network)
|
|
|
|
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])
|
|
self.cleanup.append(self.virtual_machine)
|
|
|
|
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)
|
|
self.cleanup.append(public_ip)
|
|
|
|
fwr = 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"])
|
|
self.cleanup.append(fwr)
|
|
|
|
nat_rule = NATRule.create(
|
|
self.apiclient,
|
|
self.virtual_machine,
|
|
self.testdata["natrule"],
|
|
ipaddressid=public_ip.ipaddress.id,
|
|
networkid=self.virtual_machine.nic[0].networkid)
|
|
self.cleanup.append(nat_rule)
|
|
|
|
sshClient = SshClient(public_ip.ipaddress.ipaddress,
|
|
self.testdata['natrule']["publicport"],
|
|
self.virtual_machine.username,
|
|
self.virtual_machine.password
|
|
)
|
|
response = sshClient.execute("netstat -i")
|
|
# Sample Reponse:
|
|
# [u'Kernel Interface table',
|
|
# u'Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg',
|
|
# u'eth2 1500 0 29 0 0 0 38 0 0 0 BMRU',
|
|
# u'lo 16436 0 4 0 0 0 4 0 0 0
|
|
# LRU']}
|
|
|
|
# We need to extract default interface out of the response
|
|
defaultEthernetDevice = str(response[2].split()[0])
|
|
|
|
cmd = "ip addr add {0}/24 broadcast {0} dev {1}".format(
|
|
secondaryip.ipaddress, defaultEthernetDevice)
|
|
sshClient.execute(cmd)
|
|
sshClient.execute("ip addr show")
|
|
|
|
# Deleting NAT rule after configuring secondary IP
|
|
nat_rule.delete(self.apiclient)
|
|
|
|
self.testdata["lbrule"]["publicport"] = 22
|
|
self.testdata["lbrule"]["privateport"] = 22
|
|
|
|
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)
|
|
self.cleanup.append(lb_rule)
|
|
|
|
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
|