| # 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. |
| |
| """ Component tests for VPC network functionality - Internal Load Balancing Rules |
| """ |
| # Import Local Modules |
| from marvin.cloudstackTestCase import cloudstackTestCase |
| from marvin.lib.base import (Account, |
| ApplicationLoadBalancer, |
| Network, |
| NetworkACL, |
| NetworkOffering, |
| PublicIPAddress, |
| Router, |
| ServiceOffering, |
| StaticNATRule, |
| VirtualMachine, |
| VPC, |
| VpcOffering) |
| from marvin.lib.common import (get_domain, |
| get_template, |
| get_zone) |
| from marvin.lib.utils import cleanup_resources |
| from marvin.cloudstackAPI import (listInternalLoadBalancerVMs, |
| restartVPC, |
| stopInternalLoadBalancerVM, |
| startInternalLoadBalancerVM) |
| # Import System Modules |
| from nose.plugins.attrib import attr |
| import copy |
| import socket |
| import time |
| |
| |
| class TestVPCNetworkInternalLBRules(cloudstackTestCase): |
| """Test VPC network functionality with Internal Load Balancing Rules |
| """ |
| |
| @classmethod |
| def setUpClass(cls): |
| # We want to fail quicker, if it's a failure |
| socket.setdefaulttimeout(60) |
| |
| test_client = super(TestVPCNetworkInternalLBRules, cls).getClsTestClient() |
| cls.api_client = test_client.getApiClient() |
| cls.db_client = test_client.getDbConnection() |
| cls.test_data = test_client.getParsedTestDataConfig() |
| |
| # Get Zone, Domain and templates |
| cls.zone = get_zone(cls.api_client) |
| cls.domain = get_domain(cls.api_client) |
| cls.template = get_template(cls.api_client, |
| cls.zone.id, |
| cls.test_data["ostype"] |
| ) |
| cls.test_data["virtual_machine"]["zoneid"] = cls.zone.id |
| cls.test_data["virtual_machine"]["template"] = cls.template.id |
| |
| # Create service offering |
| cls.service_offering = ServiceOffering.create(cls.api_client, |
| cls.test_data["service_offering"] |
| ) |
| cls._cleanup = [cls.service_offering] |
| return |
| |
| @classmethod |
| def tearDownClass(cls): |
| try: |
| # Cleanup resources used |
| cleanup_resources(cls.api_client, cls._cleanup) |
| except Exception as e: |
| print(("Warning: Exception during cleanup : %s" % e)) |
| return |
| |
| def setUp(self): |
| # Create an account |
| self.account = Account.create(self.api_client, |
| self.test_data["account"], |
| admin=True, |
| domainid=self.domain.id |
| ) |
| self.cleanup = [self.account] |
| |
| # Creating a VPC offering |
| self.debug("Creating a VPC offering..") |
| self.vpc_off = VpcOffering.create(self.api_client, self.test_data["vpc_offering_multi_lb"]) |
| self.cleanup.append(self.vpc_off) |
| self.debug("Enabling the VPC offering created") |
| self.vpc_off.update(self.api_client, state='Enabled') |
| |
| # Creating a VPC |
| self.debug("Creating a VPC in the account: %s" % self.account.name) |
| testdata = self.test_data["vpc"] |
| testdata["name"] = "TestVPC" |
| testdata["displaytext"] = "TestVPC" |
| testdata["cidr"] = "10.1.1.1/16" |
| self.vpc = VPC.create(self.api_client, |
| testdata, |
| vpcofferingid=self.vpc_off.id, |
| zoneid=self.zone.id, |
| account=self.account.name, |
| domainid=self.account.domainid |
| ) |
| |
| # Creating network offerings |
| self.debug("Creating Network offering with Internal LB service...") |
| self.net_off_1 = NetworkOffering.create(self.api_client, |
| self.test_data["network_offering_internal_lb"], |
| conservemode=False) |
| self.cleanup.append(self.net_off_1) |
| self.debug("Enabling the Network offering created") |
| self.net_off_1.update(self.api_client, state="Enabled") |
| |
| self.debug("Creating Network offering without Internal LB service...") |
| net_offering = copy.deepcopy(self.test_data["network_offering_internal_lb"]) |
| net_offering["name"] = "Network offering without internal lb service" |
| net_offering["displaytext"] = "Network offering without internal lb service" |
| net_offering["supportedservices"] = "Vpn,Dhcp,Dns,UserData,SourceNat,StaticNat,PortForwarding,NetworkACL" |
| del net_offering["serviceProviderList"]["Lb"] |
| del net_offering["serviceCapabilityList"]["Lb"] |
| self.net_off_2 = NetworkOffering.create(self.api_client, |
| net_offering, |
| conservemode=False) |
| self.cleanup.append(self.net_off_2) |
| self.debug("Enabling the Network offering created") |
| self.net_off_2.update(self.api_client, state="Enabled") |
| return |
| |
| def tearDown(self): |
| try: |
| # Clean up, terminate the created network offerings |
| cleanup_resources(self.api_client, self.cleanup) |
| except Exception as e: |
| self.debug("Warning: Exception during cleanup : %s" % e) |
| return |
| |
| # create_Network - Creates network with the given Network offering in the VPC |
| def create_Network(self, nw_off, gateway="10.1.1.1"): |
| self.debug("Creating a network in the account - %s" % self.account.name) |
| self.test_data["network"]["netmask"] = "255.255.255.0" |
| network = Network.create(self.api_client, |
| self.test_data["network"], |
| accountid=self.account.name, |
| domainid=self.account.domainid, |
| networkofferingid=nw_off.id, |
| zoneid=self.zone.id, |
| gateway=gateway, |
| vpcid=self.vpc.id, |
| ) |
| self.debug("Created network with ID - %s" % network.id) |
| return network |
| |
| # create_VM - Creates VM in the given network |
| def create_VM(self, network): |
| self.debug("Creating VM in network with ID - %s in the account - %s" % (network.id, self.account.name)) |
| vm = VirtualMachine.create(self.api_client, |
| self.test_data["virtual_machine"], |
| accountid=self.account.name, |
| domainid=self.account.domainid, |
| serviceofferingid=self.service_offering.id, |
| templateid=self.template.id, |
| zoneid=self.zone.id, |
| networkids=[str(network.id)], |
| hostid=None |
| ) |
| self.debug("Created VM with ID - %s in network with ID - %s" % (vm.id, network.id)) |
| return vm |
| |
| # restart_Vpc - Restarts the given VPC with/without cleanup |
| def restart_Vpc(self, vpc, cleanup=None): |
| self.debug("Restarting VPC with ID - %s" % vpc.id) |
| cmd = restartVPC.restartVPCCmd() |
| cmd.id = vpc.id |
| cmd.cleanup = cleanup |
| self.api_client.restartVPC(cmd) |
| self.debug("Restarted VPC with ID - %s" % vpc.id) |
| |
| # get_Router - Returns router for the given network |
| def get_Router(self, network): |
| self.debug("Finding the virtual router for network with ID - %s" % network.id) |
| routers = Router.list(self.api_client, |
| networkid=network.id, |
| listall=True |
| ) |
| self.assertEqual(isinstance(routers, list), True, |
| "List routers should return a valid virtual router for network" |
| ) |
| return routers[0] |
| |
| # create_Internal_LB_Rule - Creates Internal LB rule in the given VPC network |
| def create_Internal_LB_Rule(self, network, vm_array=None, services=None, source_ip=None): |
| self.debug("Creating Internal LB rule in VPC network with ID - %s" % network.id) |
| if not services: |
| services = self.test_data["internal_lbrule"] |
| int_lb_rule = ApplicationLoadBalancer.create(self.api_client, |
| services=services, |
| sourcenetworkid=network.id, |
| networkid=network.id, |
| sourceipaddress=source_ip |
| ) |
| self.debug("Created Internal LB rule") |
| # Assigning VMs to the created Internal Load Balancer rule |
| if vm_array: |
| self.debug("Assigning virtual machines - %s to the created Internal LB rule" % vm_array) |
| int_lb_rule.assign(self.api_client, vms=vm_array) |
| self.debug("Assigned VMs to the created Internal LB rule") |
| return int_lb_rule |
| |
| # validate_Internal_LB_Rule - Validates the given Internal LB rule, |
| # matches the given Internal LB rule name and state against the list of Internal LB rules fetched |
| def validate_Internal_LB_Rule(self, int_lb_rule, state=None, vm_array=None): |
| """Validates the Internal LB Rule""" |
| self.debug("Check if the Internal LB Rule is created successfully ?") |
| int_lb_rules = ApplicationLoadBalancer.list(self.api_client, |
| id=int_lb_rule.id |
| ) |
| self.assertEqual(isinstance(int_lb_rules, list), True, |
| "List Internal LB Rule should return a valid list" |
| ) |
| self.assertEqual(int_lb_rule.name, int_lb_rules[0].name, |
| "Name of the Internal LB Rule should match with the returned list data" |
| ) |
| if state: |
| self.assertEqual(int_lb_rules[0].loadbalancerrule[0].state, state, |
| "Internal LB Rule state should be '%s'" % state |
| ) |
| if vm_array: |
| instance_ids = [instance.id for instance in int_lb_rules[0].loadbalancerinstance] |
| for vm in vm_array: |
| self.assertEqual(vm.id in instance_ids, True, |
| "Internal LB instance list should have the VM with ID - %s" % vm.id |
| ) |
| self.debug("Internal LB Rule creation successfully validated for %s" % int_lb_rule.name) |
| |
| # list_InternalLbVms - Lists deployed Internal LB VM instances |
| def list_InternalLbVms(self, network_id=None, source_ip=None): |
| listInternalLoadBalancerVMsCmd = listInternalLoadBalancerVMs.listInternalLoadBalancerVMsCmd() |
| listInternalLoadBalancerVMsCmd.account = self.account.name |
| listInternalLoadBalancerVMsCmd.domainid = self.account.domainid |
| if network_id: |
| listInternalLoadBalancerVMsCmd.networkid = network_id |
| internal_lb_vms = self.api_client.listInternalLoadBalancerVMs(listInternalLoadBalancerVMsCmd) |
| if source_ip: |
| return [internal_lb_vm for internal_lb_vm in internal_lb_vms |
| if str(internal_lb_vm.guestipaddress) == source_ip] |
| else: |
| return internal_lb_vms |
| |
| # get_InternalLbVm - Returns Internal LB VM instance for the given VPC network and source ip |
| def get_InternalLbVm(self, network, source_ip): |
| self.debug("Finding the InternalLbVm for network with ID - %s and source IP address - %s" % |
| (network.id, source_ip)) |
| internal_lb_vms = self.list_InternalLbVms(network.id, source_ip) |
| self.assertEqual(isinstance(internal_lb_vms, list), True, |
| "List InternalLbVms should return a valid list" |
| ) |
| return internal_lb_vms[0] |
| |
| # stop_InternalLbVm - Stops the given Internal LB VM instance |
| def stop_InternalLbVm(self, int_lb_vm, force=None): |
| self.debug("Stopping InternalLbVm with ID - %s" % int_lb_vm.id) |
| cmd = stopInternalLoadBalancerVM.stopInternalLoadBalancerVMCmd() |
| cmd.id = int_lb_vm.id |
| if force: |
| cmd.forced = force |
| self.api_client.stopInternalLoadBalancerVM(cmd) |
| |
| # start_InternalLbVm - Starts the given Internal LB VM instance |
| def start_InternalLbVm(self, int_lb_vm): |
| self.debug("Starting InternalLbVm with ID - %s" % int_lb_vm.id) |
| cmd = startInternalLoadBalancerVM.startInternalLoadBalancerVMCmd() |
| cmd.id = int_lb_vm.id |
| self.api_client.startInternalLoadBalancerVM(cmd) |
| |
| # check_InternalLbVm_state - Checks if the Internal LB VM instance of the given VPC network and source IP is in the |
| # expected state form the list of fetched Internal LB VM instances |
| def check_InternalLbVm_state(self, network, source_ip, state=None): |
| self.debug("Check if the InternalLbVm is in state - %s" % state) |
| internal_lb_vms = self.list_InternalLbVms(network.id, source_ip) |
| self.assertEqual(isinstance(internal_lb_vms, list), True, |
| "List InternalLbVm should return a valid list" |
| ) |
| if state: |
| self.assertEqual(internal_lb_vms[0].state, state, |
| "InternalLbVm is not in the expected state" |
| ) |
| self.debug("InternalLbVm instance - %s is in the expected state - %s" % (internal_lb_vms[0].name, state)) |
| |
| # create_NetworkAclRule - Creates Ingress Network ACL rule in the given network |
| def create_NetworkAclRule(self, rule, network): |
| self.debug("Adding Ingress NetworkACL rule - %s" % rule) |
| return NetworkACL.create(self.api_client, |
| networkid=network.id, |
| services=rule, |
| traffictype="Ingress" |
| ) |
| |
| # acquire_PublicIPAddress - Acquires public IP address for the VPC |
| def acquire_PublicIPAddress(self): |
| self.debug("Acquiring public IP for VPC with ID - %s in the account - %s" % (self.vpc.id, self.account.name)) |
| public_ip = PublicIPAddress.create(self.api_client, |
| accountid=self.account.name, |
| domainid=self.account.domainid, |
| zoneid=self.zone.id, |
| vpcid=self.vpc.id |
| ) |
| self.debug("Acquired public IP address - %s for VPC with ID - %s" % |
| (public_ip.ipaddress.ipaddress, self.vpc.id)) |
| return public_ip |
| |
| # create_StaticNatRule_For_VM - Creates Static NAT rule on the given public IP for the given VM in the given network |
| def create_StaticNatRule_For_VM(self, vm, public_ip, network): |
| self.debug("Enabling Static NAT rule on public IP - %s for VM with ID - %s in network with ID - %s" % |
| (public_ip.ipaddress.ipaddress, vm.id, network.id)) |
| StaticNATRule.enable(self.api_client, |
| ipaddressid=public_ip.ipaddress.id, |
| virtualmachineid=vm.id, |
| networkid=network.id, |
| vmguestip=None |
| ) |
| self.debug("Static NAT rule enabled on public IP - %s for VM with ID - %s in network with ID - %s" % |
| (public_ip.ipaddress.ipaddress, vm.id, network.id)) |
| |
| # ssh_into_VM - Gets into the shell of the given VM using its Static NAT rule enabled public IP |
| def ssh_into_VM(self, vm, public_ip): |
| self.debug("SSH into VM with ID - %s on public IP address - %s" % (vm.id, public_ip.ipaddress.ipaddress)) |
| ssh_client = vm.get_ssh_client(ipaddress=public_ip.ipaddress.ipaddress) |
| return ssh_client |
| |
| # execute_cmd - Executes the given command on the given ssh client |
| def execute_cmd(self, ssh_client, cmd): |
| self.debug("SSH client executing command - %s" % cmd) |
| ret_data = "" |
| out_list = ssh_client.execute(cmd) |
| if out_list is not None: |
| ret_data = ' '.join(map(str, out_list)).strip() |
| self.debug("SSH client executed command result - %s" % ret_data) |
| else: |
| self.debug("SSH client executed command result is None") |
| return ret_data |
| |
| # wget_from_vm_cmd - From within the given VM (ssh client), |
| # fetches test.html file of web server running with the given public IP |
| def wget_from_vm_cmd(self, ssh_client, ip_address, port): |
| cmd = "wget --no-cache -t 1 http://" + ip_address + ":" + str(port) + "/test.html" |
| response = self.execute_cmd(ssh_client, cmd) |
| if "200 OK" not in response: |
| self.fail("Failed to wget from a VM with http server IP address - %s" % ip_address) |
| # Removing the wget file |
| cmd = "rm -r test.html" |
| self.execute_cmd(ssh_client, cmd) |
| |
| @attr(tags=["advanced", "intervlan"], required_hardware="false") |
| def test_01_internallb_rules(self): |
| """Test VPC Network Internal LB functionality with different combinations of Internal LB rules |
| """ |
| |
| # 1. Create an Internal LB Rule with source IP Address specified, check if the Internal LB Rule is successfully |
| # created. |
| # 2. Create an Internal LB Rule without source IP Address specified, check if the Internal LB Rule is |
| # successfully created. |
| # 3. Create an Internal LB Rule when the specified source IP Address is outside the VPC network (tier) CIDR |
| # range, check if the Internal LB Rule creation failed as the requested source IP is not in the network's |
| # CIDR subnet. |
| # 4. Create an Internal LB Rule when the specified source IP Address is outside the VPC super CIDR range, |
| # check if the Internal LB Rule creation failed as the requested source IP is not in the network's CIDR |
| # subnet. |
| # 5. Create an Internal LB Rule in the tier with LB service provider as VpcInlineLbVm, check if the Internal LB |
| # Rule creation failed as Scheme Internal is not supported by this network offering. |
| # 6. Create multiple Internal LB Rules using different Load Balancing source IP Addresses, check if the Internal |
| # LB Rules are successfully created. |
| # 7. Create multiple Internal LB Rules with different ports but using the same Load Balancing source IP Address, |
| # check if the Internal LB Rules are successfully created. |
| # 8. Create multiple Internal LB Rules with same ports and using the same Load Balancing source IP Address, |
| # check if the second Internal LB Rule creation failed as it conflicts with the first Internal LB rule. |
| # 9. Attach a VM to the above created Internal LB Rules, check if the VM is successfully attached to the |
| # Internal LB Rules. |
| # 10. Verify the InternalLbVm deployment after successfully creating the first Internal LB Rule and attaching a |
| # VM to it. |
| # 11. Verify the failure of attaching a VM from a different tier to an Internal LB Rule created on a tier. |
| # 12. Delete the above created Internal LB Rules, check if the Internal LB Rules are successfully deleted. |
| |
| # Creating VPC networks in the VPC, and deploying VMs |
| self.debug("Creating a VPC network with Internal LB service...") |
| internal_tier = self.create_Network(self.net_off_1, gateway='10.1.1.1') |
| |
| self.debug("Deploying a VM in the created VPC network...") |
| internal_vm = self.create_VM(internal_tier) |
| |
| self.debug("Creating a VPC network without Internal LB service...") |
| public_tier = self.create_Network(self.net_off_2, gateway='10.1.2.1') |
| |
| self.debug("Deploying a VM in the created VPC network...") |
| public_vm = self.create_VM(public_tier) |
| |
| # Creating Internal LB Rules |
| self.debug("Creating an Internal LB Rule without source IP Address specified...") |
| int_lb_rule = self.create_Internal_LB_Rule(internal_tier) |
| self.validate_Internal_LB_Rule(int_lb_rule, state="Add") |
| |
| # Validating InternalLbVm deployment |
| with self.assertRaises(Exception): |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule.sourceipaddress) |
| self.debug("InternalLbVm is not deployed in the network as there are no VMs assigned to this Internal LB Rule") |
| |
| self.debug('Deleting the Internal LB Rule - %s' % int_lb_rule.name) |
| int_lb_rule.delete(self.api_client) |
| with self.assertRaises(Exception): |
| self.validate_Internal_LB_Rule(int_lb_rule) |
| self.debug("Internal LB Rule successfully deleted in CloudStack") |
| |
| free_source_ip = int_lb_rule.sourceipaddress |
| |
| self.debug("Creating an Internal LB Rule with source IP Address specified...") |
| int_lb_rule = self.create_Internal_LB_Rule(internal_tier, source_ip=free_source_ip) |
| self.validate_Internal_LB_Rule(int_lb_rule, state="Add") |
| |
| # Validating InternalLbVm deployment |
| with self.assertRaises(Exception): |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule.sourceipaddress) |
| self.debug("InternalLbVm is not deployed in the network as there are no VMs assigned to this Internal LB Rule") |
| |
| self.debug('Deleting the Internal LB Rule - %s' % int_lb_rule.name) |
| int_lb_rule.delete(self.api_client) |
| with self.assertRaises(Exception): |
| self.validate_Internal_LB_Rule(int_lb_rule) |
| self.debug("Internal LB Rule successfully deleted in CloudStack") |
| |
| self.debug("Creating an Internal LB Rule when the specified source IP Address is outside the VPC network CIDR " |
| "range...") |
| with self.assertRaises(Exception): |
| self.create_Internal_LB_Rule(internal_tier, source_ip="10.1.1.256") |
| self.debug("Internal LB Rule creation failed as the requested IP is not in the network's CIDR subnet") |
| |
| self.debug("Creating an Internal LB Rule when the specified source IP Address is outside the VPC super CIDR " |
| "range...") |
| with self.assertRaises(Exception): |
| self.create_Internal_LB_Rule(internal_tier, source_ip="10.2.1.256") |
| self.debug("Internal LB Rule creation failed as the requested IP is not in the network's CIDR subnet") |
| |
| self.debug("Creating an Internal LB Rule in a VPC network without Internal Lb service...") |
| with self.assertRaises(Exception): |
| self.create_Internal_LB_Rule(public_tier) |
| self.debug("Internal LB Rule creation failed as Scheme Internal is not supported by this network offering") |
| |
| self.debug("Creating multiple Internal LB Rules using different Load Balancing source IP Addresses...") |
| int_lb_rule_1 = self.create_Internal_LB_Rule(internal_tier, vm_array=[internal_vm]) |
| self.validate_Internal_LB_Rule(int_lb_rule_1, state="Active", vm_array=[internal_vm]) |
| int_lb_rule_2 = self.create_Internal_LB_Rule(internal_tier, vm_array=[internal_vm]) |
| self.validate_Internal_LB_Rule(int_lb_rule_2, state="Active", vm_array=[internal_vm]) |
| |
| # Validating InternalLbVms deployment and state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_2.sourceipaddress, state="Running") |
| |
| self.debug('Removing VMs from the Internal LB Rules - %s, %s' % (int_lb_rule_1.name, int_lb_rule_2.name)) |
| int_lb_rule_1.remove(self.api_client, vms=[internal_vm]) |
| with self.assertRaises(Exception): |
| self.validate_Internal_LB_Rule(int_lb_rule_1, vm_array=[internal_vm]) |
| self.debug("VMs successfully removed from the Internal LB Rule in CloudStack") |
| int_lb_rule_2.remove(self.api_client, vms=[internal_vm]) |
| with self.assertRaises(Exception): |
| self.validate_Internal_LB_Rule(int_lb_rule_2, vm_array=[internal_vm]) |
| self.debug("VMs successfully removed from the Internal LB Rule in CloudStack") |
| |
| # Validating InternalLbVms state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_2.sourceipaddress, state="Running") |
| |
| self.debug('Deleting the Internal LB Rules - %s, %s' % (int_lb_rule_1.name, int_lb_rule_2.name)) |
| int_lb_rule_1.delete(self.api_client) |
| with self.assertRaises(Exception): |
| self.validate_Internal_LB_Rule(int_lb_rule_1) |
| self.debug("Internal LB Rule successfully deleted in CloudStack") |
| int_lb_rule_2.delete(self.api_client) |
| with self.assertRaises(Exception): |
| self.validate_Internal_LB_Rule(int_lb_rule_2) |
| self.debug("Internal LB Rule successfully deleted in CloudStack") |
| |
| # Validating InternalLbVms un-deployment |
| with self.assertRaises(Exception): |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress) |
| self.debug("InternalLbVm successfully destroyed in CloudStack") |
| with self.assertRaises(Exception): |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_2.sourceipaddress) |
| self.debug("InternalLbVm successfully destroyed in CloudStack") |
| |
| self.debug("Creating multiple Internal LB Rules with different ports but using the same Load Balancing source " |
| "IP Address...") |
| int_lb_rule_1 = self.create_Internal_LB_Rule(internal_tier, vm_array=[internal_vm]) |
| self.validate_Internal_LB_Rule(int_lb_rule_1, state="Active", vm_array=[internal_vm]) |
| int_lb_rule_2 = self.create_Internal_LB_Rule(internal_tier, |
| vm_array=[internal_vm], |
| services=self.test_data["internal_lbrule_http"], |
| source_ip=int_lb_rule_1.sourceipaddress |
| ) |
| self.validate_Internal_LB_Rule(int_lb_rule_2, state="Active", vm_array=[internal_vm]) |
| |
| # Validating InternalLbVm deployment and state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| self.debug('Removing VMs from the Internal LB Rules - %s, %s' % (int_lb_rule_1.name, int_lb_rule_2.name)) |
| int_lb_rule_1.remove(self.api_client, vms=[internal_vm]) |
| with self.assertRaises(Exception): |
| self.validate_Internal_LB_Rule(int_lb_rule_1, vm_array=[internal_vm]) |
| self.debug("VMs successfully removed from the Internal LB Rule in CloudStack") |
| int_lb_rule_2.remove(self.api_client, vms=[internal_vm]) |
| with self.assertRaises(Exception): |
| self.validate_Internal_LB_Rule(int_lb_rule_2, vm_array=[internal_vm]) |
| self.debug("VMs successfully removed from the Internal LB Rule in CloudStack") |
| |
| # Validating InternalLbVm state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| self.debug('Deleting the Internal LB Rules - %s, %s' % (int_lb_rule_1.name, int_lb_rule_2.name)) |
| int_lb_rule_1.delete(self.api_client) |
| with self.assertRaises(Exception): |
| self.validate_Internal_LB_Rule(int_lb_rule_1) |
| self.debug("Internal LB Rule successfully deleted in CloudStack") |
| int_lb_rule_2.delete(self.api_client) |
| with self.assertRaises(Exception): |
| self.validate_Internal_LB_Rule(int_lb_rule_2) |
| self.debug("Internal LB Rule successfully deleted in CloudStack") |
| |
| # Validating InternalLbVm un-deployment |
| with self.assertRaises(Exception): |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress) |
| self.debug("InternalLbVm successfully destroyed in CloudStack") |
| |
| self.debug("Creating multiple Internal LB Rules with same ports and using the same Load Balancing source IP " |
| "Address...") |
| int_lb_rule = self.create_Internal_LB_Rule(internal_tier, vm_array=[internal_vm]) |
| self.validate_Internal_LB_Rule(int_lb_rule, state="Active", vm_array=[internal_vm]) |
| with self.assertRaises(Exception): |
| self.create_Internal_LB_Rule(internal_tier, vm_array=[internal_vm], source_ip=int_lb_rule.sourceipaddress) |
| self.debug("Internal LB Rule creation failed as it conflicts with the existing rule") |
| |
| # Validating InternalLbVm deployment and state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule.sourceipaddress, state="Running") |
| |
| self.debug('Removing VMs from the Internal LB Rule - %s' % int_lb_rule.name) |
| int_lb_rule.remove(self.api_client, vms=[internal_vm]) |
| with self.assertRaises(Exception): |
| self.validate_Internal_LB_Rule(int_lb_rule, vm_array=[internal_vm]) |
| self.debug("VMs successfully removed from the Internal LB Rule in CloudStack") |
| |
| # Validating InternalLbVm state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule.sourceipaddress, state="Running") |
| |
| self.debug('Deleting the Internal LB Rule - %s' % int_lb_rule.name) |
| int_lb_rule.delete(self.api_client) |
| with self.assertRaises(Exception): |
| self.validate_Internal_LB_Rule(int_lb_rule) |
| self.debug("Internal LB Rule successfully deleted in CloudStack") |
| |
| # Validating InternalLbVm un-deployment |
| with self.assertRaises(Exception): |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule.sourceipaddress) |
| self.debug("InternalLbVm successfully destroyed in CloudStack") |
| |
| self.debug("Attaching a VM from a different tier to an Internal LB Rule created on a tier...") |
| with self.assertRaises(Exception): |
| self.create_Internal_LB_Rule(internal_tier, vm_array=[public_vm]) |
| self.debug("Internal LB Rule creation failed as the VM belongs to a different network") |
| |
| # tags=["advanced", "intervlan"] |
| @attr(tags=["TODO"], required_hardware="true") |
| def test_02_internallb_rules_traffic(self): |
| """Test VPC Network Internal LB functionality by performing (wget) traffic tests within a VPC |
| """ |
| |
| # 1. Create an Internal LB Rule "internal_lbrule" with source IP Address specified on the Internal tier, check |
| # if the Internal LB Rule is successfully created. |
| # 2. Create an Internal LB Rule "internal_lbrule_http" with source IP Address (same as above) specified on the |
| # Internal tier, check if the Internal LB Rule is successfully created. |
| # 3. Attach a VM to the above created Internal LB Rules, check if the InternalLbVm is successfully deployed in |
| # the Internal tier. |
| # 4. Deploy two more VMs in the Internal tier, check if the VMs are successfully deployed. |
| # 5. Attach the newly deployed VMs to the above created Internal LB Rules, verify the validity of the above |
| # created Internal LB Rules over three Load Balanced VMs in the Internal tier. |
| # 6. Create the corresponding Network ACL rules to make the created Internal LB rules (SSH & HTTP) accessible, |
| # check if the Network ACL rules are successfully added to the internal tier. |
| # 7. Validate the Internal LB functionality by performing (wget) traffic tests from a VM in the Public tier to |
| # the Internal load balanced guest VMs in the Internal tier, using Static NAT functionality to access (ssh) |
| # the VM on the Public tier. |
| # 8. Verify that the InternalLbVm gets destroyed when the last Internal LB rule is removed from the Internal |
| # tier. |
| # 9. Repeat the above steps for one more Internal tier as well, validate the Internal LB functionality. |
| |
| # Creating VPC networks in the VPC, and deploying VMs |
| self.debug("Creating a VPC network with Internal LB service...") |
| internal_tier_1 = self.create_Network(self.net_off_1, gateway='10.1.1.1') |
| |
| self.debug("Deploying a VM in the created VPC network...") |
| internal_vm_1 = self.create_VM(internal_tier_1) |
| |
| self.debug("Creating one more VPC network with Internal LB service...") |
| internal_tier_2 = self.create_Network(self.net_off_1, gateway='10.1.2.1') |
| |
| self.debug("Deploying a VM in the created VPC network...") |
| internal_vm_2 = self.create_VM(internal_tier_2) |
| |
| self.debug("Creating a VPC network without Internal LB service...") |
| public_tier = self.create_Network(self.net_off_2, gateway='10.1.3.1') |
| |
| self.debug("Deploying a VM in the created VPC network...") |
| public_vm = self.create_VM(public_tier) |
| |
| # Creating Internal LB Rules in the Internal tiers |
| self.debug("Creating three Internal LB Rules (SSH & HTTP) using the same Load Balancing source IP Address...") |
| int_lb_rule_1 = self.create_Internal_LB_Rule(internal_tier_1, vm_array=[internal_vm_1]) |
| self.validate_Internal_LB_Rule(int_lb_rule_1, state="Active", vm_array=[internal_vm_1]) |
| int_lb_rule_2 = self.create_Internal_LB_Rule(internal_tier_1, |
| vm_array=[internal_vm_1], |
| services=self.test_data["internal_lbrule_http"], |
| source_ip=int_lb_rule_1.sourceipaddress |
| ) |
| self.validate_Internal_LB_Rule(int_lb_rule_2, state="Active", vm_array=[internal_vm_1]) |
| internal_lbrule_http = copy.deepcopy(self.test_data["internal_lbrule_http"]) |
| internal_lbrule_http["sourceport"] = 8080 |
| internal_lbrule_http["instanceport"] = 8080 |
| int_lb_rule_3 = self.create_Internal_LB_Rule(internal_tier_1, |
| vm_array=[internal_vm_1], |
| services=internal_lbrule_http, |
| source_ip=int_lb_rule_1.sourceipaddress |
| ) |
| self.validate_Internal_LB_Rule(int_lb_rule_3, state="Active", vm_array=[internal_vm_1]) |
| |
| # Validating InternalLbVm deployment and state |
| self.check_InternalLbVm_state(internal_tier_1, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Deploying more VMs in the Internal tier |
| self.debug("Deploying two more VMs in network - %s" % internal_tier_1.name) |
| internal_vm_1_1 = self.create_VM(internal_tier_1) |
| internal_vm_1_2 = self.create_VM(internal_tier_1) |
| |
| # Adding newly deployed VMs to the created Internal LB rules |
| self.debug("Adding two more virtual machines to the created Internal LB rules...") |
| int_lb_rule_1.assign(self.api_client, [internal_vm_1_1, internal_vm_1_2]) |
| self.validate_Internal_LB_Rule(int_lb_rule_1, state="Active", |
| vm_array=[internal_vm_1, internal_vm_1_1, internal_vm_1_2]) |
| int_lb_rule_2.assign(self.api_client, [internal_vm_1_1, internal_vm_1_2]) |
| self.validate_Internal_LB_Rule(int_lb_rule_2, state="Active", |
| vm_array=[internal_vm_1, internal_vm_1_1, internal_vm_1_2]) |
| int_lb_rule_3.assign(self.api_client, [internal_vm_1_1, internal_vm_1_2]) |
| self.validate_Internal_LB_Rule(int_lb_rule_3, state="Active", |
| vm_array=[internal_vm_1, internal_vm_1_1, internal_vm_1_2]) |
| |
| # Validating InternalLbVm state |
| self.check_InternalLbVm_state(internal_tier_1, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Adding Network ACL rules in the Internal tier |
| self.debug("Adding Network ACL rules to make the created Internal LB rules (SSH & HTTP) accessible...") |
| self.create_NetworkAclRule(self.test_data["ingress_rule"], internal_tier_1) |
| self.create_NetworkAclRule(self.test_data["http_rule"], internal_tier_1) |
| http_rule = copy.deepcopy(self.test_data["http_rule"]) |
| http_rule["privateport"] = 8080 |
| http_rule["publicport"] = 8080 |
| http_rule["startport"] = 8080 |
| http_rule["endport"] = 8080 |
| self.create_NetworkAclRule(http_rule, internal_tier_1) |
| |
| # Creating Internal LB Rules in the Internal tier |
| self.debug("Creating three Internal LB Rules (SSH & HTTP) using the same Load Balancing source IP Address...") |
| int_lb_rule_4 = self.create_Internal_LB_Rule(internal_tier_2, vm_array=[internal_vm_2]) |
| self.validate_Internal_LB_Rule(int_lb_rule_4, state="Active", vm_array=[internal_vm_2]) |
| int_lb_rule_5 = self.create_Internal_LB_Rule(internal_tier_2, |
| vm_array=[internal_vm_2], |
| services=self.test_data["internal_lbrule_http"], |
| source_ip=int_lb_rule_4.sourceipaddress |
| ) |
| self.validate_Internal_LB_Rule(int_lb_rule_5, state="Active", vm_array=[internal_vm_2]) |
| int_lb_rule_6 = self.create_Internal_LB_Rule(internal_tier_2, |
| vm_array=[internal_vm_2], |
| services=internal_lbrule_http, |
| source_ip=int_lb_rule_4.sourceipaddress |
| ) |
| self.validate_Internal_LB_Rule(int_lb_rule_6, state="Active", vm_array=[internal_vm_2]) |
| |
| # Validating InternalLbVm deployment and state |
| self.check_InternalLbVm_state(internal_tier_2, int_lb_rule_4.sourceipaddress, state="Running") |
| |
| # Deploying more VMs in the Internal tier |
| self.debug("Deploying two more VMs in network - %s" % internal_tier_2.name) |
| internal_vm_2_1 = self.create_VM(internal_tier_2) |
| internal_vm_2_2 = self.create_VM(internal_tier_2) |
| |
| # Adding newly deployed VMs to the created Internal LB rules |
| self.debug("Adding two more virtual machines to the created Internal LB rules...") |
| int_lb_rule_4.assign(self.api_client, [internal_vm_2_1, internal_vm_2_2]) |
| self.validate_Internal_LB_Rule(int_lb_rule_4, state="Active", |
| vm_array=[internal_vm_2, internal_vm_2_1, internal_vm_2_2]) |
| int_lb_rule_5.assign(self.api_client, [internal_vm_2_1, internal_vm_2_2]) |
| self.validate_Internal_LB_Rule(int_lb_rule_5, state="Active", |
| vm_array=[internal_vm_2, internal_vm_2_1, internal_vm_2_2]) |
| int_lb_rule_6.assign(self.api_client, [internal_vm_2_1, internal_vm_2_2]) |
| self.validate_Internal_LB_Rule(int_lb_rule_6, state="Active", |
| vm_array=[internal_vm_2, internal_vm_2_1, internal_vm_2_2]) |
| |
| # Validating InternalLbVm state |
| self.check_InternalLbVm_state(internal_tier_2, int_lb_rule_4.sourceipaddress, state="Running") |
| |
| # Adding Network ACL rules in the Internal tier |
| self.debug("Adding Network ACL rules to make the created Internal LB rules (SSH & HTTP) accessible...") |
| self.create_NetworkAclRule(self.test_data["ingress_rule"], internal_tier_2) |
| self.create_NetworkAclRule(self.test_data["http_rule"], internal_tier_2) |
| self.create_NetworkAclRule(http_rule, internal_tier_2) |
| |
| # Creating Static NAT rule for the VM in the Public tier |
| public_ip = self.acquire_PublicIPAddress() |
| self.create_StaticNatRule_For_VM(public_vm, public_ip, public_tier) |
| |
| # Adding Network ACL rule in the Public tier |
| self.debug("Adding Network ACL rule to make the created NAT rule (SSH) accessible...") |
| self.create_NetworkAclRule(self.test_data["ingress_rule"], public_tier) |
| |
| # Internal LB (wget) traffic tests |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| http_rule["publicport"] |
| ) |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_4.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_4.sourceipaddress, |
| http_rule["publicport"] |
| ) |
| |
| # tags=["advanced", "intervlan"] |
| @attr(tags=["TODO"], required_hardware="true") |
| def test_03_internallb_rules_vpc_network_restarts_traffic(self): |
| """Test VPC Network Internal LB functionality with restarts of VPC network components by performing (wget) |
| traffic tests within a VPC |
| """ |
| |
| # Repeat the tests in the testcase "test_02_internallb_rules_traffic" with restarts of VPC networks (tiers): |
| # 1. Restart tier with InternalLbVm (cleanup = false), verify that the InternalLbVm gets destroyed and deployed |
| # again in the Internal tier. |
| # 2. Restart tier with InternalLbVm (cleanup = true), verify that the InternalLbVm gets destroyed and deployed |
| # again in the Internal tier. |
| # 3. Restart tier without InternalLbVm (cleanup = false), verify that this restart has no effect on the |
| # InternalLbVm functionality. |
| # 4. Restart tier without InternalLbVm (cleanup = true), verify that this restart has no effect on the |
| # InternalLbVm functionality. |
| # 5. Stop all the VMs configured with InternalLbVm, verify that the InternalLbVm gets destroyed in the Internal |
| # tier. |
| # 6. Start all the VMs configured with InternalLbVm, verify that the InternalLbVm gets deployed again in the |
| # Internal tier. |
| # 7. Restart VPC (cleanup = false), verify that the VPC VR gets rebooted and this restart has no effect on the |
| # InternalLbVm functionality. |
| # 7. Restart VPC (cleanup = true), verify that the VPC VR gets rebooted and this restart has no effect on the |
| # InternalLbVm functionality. |
| # Verify the above restarts of VPC networks (tiers) by performing (wget) traffic tests within a VPC. |
| |
| # Creating VPC networks in the VPC, and deploying VMs |
| self.debug("Creating a VPC network with Internal LB service...") |
| internal_tier = self.create_Network(self.net_off_1, gateway='10.1.1.1') |
| |
| self.debug("Deploying a VM in the created VPC network...") |
| internal_vm = self.create_VM(internal_tier) |
| |
| self.debug("Creating a VPC network without Internal LB service...") |
| public_tier = self.create_Network(self.net_off_2, gateway='10.1.2.1') |
| |
| self.debug("Deploying a VM in the created VPC network...") |
| public_vm = self.create_VM(public_tier) |
| |
| # Creating Internal LB Rules in the Internal tiers |
| self.debug("Creating three Internal LB Rules (SSH & HTTP) using the same Load Balancing source IP Address...") |
| int_lb_rule_1 = self.create_Internal_LB_Rule(internal_tier, vm_array=[internal_vm]) |
| self.validate_Internal_LB_Rule(int_lb_rule_1, state="Active", vm_array=[internal_vm]) |
| int_lb_rule_2 = self.create_Internal_LB_Rule(internal_tier, |
| vm_array=[internal_vm], |
| services=self.test_data["internal_lbrule_http"], |
| source_ip=int_lb_rule_1.sourceipaddress |
| ) |
| self.validate_Internal_LB_Rule(int_lb_rule_2, state="Active", vm_array=[internal_vm]) |
| |
| # Validating InternalLbVm deployment and state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Deploying more VMs in the Internal tier |
| self.debug("Deploying two more VMs in network - %s" % internal_tier.name) |
| internal_vm_1 = self.create_VM(internal_tier) |
| internal_vm_2 = self.create_VM(internal_tier) |
| |
| # Adding newly deployed VMs to the created Internal LB rules |
| self.debug("Adding two more virtual machines to the created Internal LB rules...") |
| int_lb_rule_1.assign(self.api_client, [internal_vm_1, internal_vm_2]) |
| self.validate_Internal_LB_Rule(int_lb_rule_1, state="Active", |
| vm_array=[internal_vm, internal_vm_1, internal_vm_2]) |
| int_lb_rule_2.assign(self.api_client, [internal_vm_1, internal_vm_2]) |
| self.validate_Internal_LB_Rule(int_lb_rule_2, state="Active", |
| vm_array=[internal_vm, internal_vm_1, internal_vm_2]) |
| |
| # Validating InternalLbVm state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Adding Network ACL rules in the Internal tier |
| self.debug("Adding Network ACL rules to make the created Internal LB rules (SSH & HTTP) accessible...") |
| self.create_NetworkAclRule(self.test_data["ingress_rule"], internal_tier) |
| self.create_NetworkAclRule(self.test_data["http_rule"], internal_tier) |
| |
| # Creating Static NAT rule for the VM in the Public tier |
| public_ip = self.acquire_PublicIPAddress() |
| self.create_StaticNatRule_For_VM(public_vm, public_ip, public_tier) |
| |
| # Adding Network ACL rule in the Public tier |
| self.debug("Adding Network ACL rule to make the created NAT rule (SSH) accessible...") |
| self.create_NetworkAclRule(self.test_data["ingress_rule"], public_tier) |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| |
| # Restart Internal tier (cleanup = false) |
| # InternalLbVm gets destroyed and deployed again in the Internal tier |
| self.debug("Restarting the Internal tier without cleanup...") |
| Network.restart(internal_tier, self.api_client, cleanup=False) |
| |
| # Validating InternalLbVm state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| tries = 0 |
| while tries < 10: |
| try: |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| except Exception as e: |
| self.debug("Failed to wget file via the InternalLbVm after re-starting the Internal tier: %s" % e) |
| self.debug("Waiting for the InternalLbVm in the Internal tier to be fully resolved for (wget) traffic " |
| "test...") |
| time.sleep(30) |
| tries += 1 |
| continue |
| self.debug("Internal LB (wget) traffic test is successful after re-starting the Internal tier") |
| break |
| |
| # Restart Internal tier (cleanup = true) |
| # InternalLbVm gets destroyed and deployed again in the Internal tier |
| self.debug("Restarting the Internal tier with cleanup...") |
| Network.restart(internal_tier, self.api_client, cleanup=True) |
| |
| # Validating InternalLbVm state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| tries = 0 |
| while tries < 10: |
| try: |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| except Exception as e: |
| self.debug("Failed to wget file via the InternalLbVm after re-starting the Internal tier with cleanup: " |
| "%s" % e) |
| self.debug("Waiting for the InternalLbVm in the Internal tier to be fully resolved for (wget) traffic " |
| "test...") |
| time.sleep(30) |
| tries += 1 |
| continue |
| self.debug("Internal LB (wget) traffic test is successful after re-starting the Internal tier with cleanup") |
| break |
| |
| # Restart Public tier (cleanup = false) |
| # This restart has no effect on the InternalLbVm functionality |
| self.debug("Restarting the Public tier without cleanup...") |
| Network.restart(public_tier, self.api_client, cleanup=False) |
| |
| # Validating InternalLbVm state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| |
| # Restart Public tier (cleanup = true) |
| # This restart has no effect on the InternalLbVm functionality |
| self.debug("Restarting the Public tier with cleanup...") |
| Network.restart(public_tier, self.api_client, cleanup=True) |
| |
| # Validating InternalLbVm state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| |
| # Stopping VMs in the Internal tier |
| # wget traffic test fails as all the VMs in the Internal tier are in stopped state |
| self.debug("Stopping all the VMs in the Internal tier...") |
| internal_vm.stop(self.api_client) |
| internal_vm_1.stop(self.api_client) |
| internal_vm_2.stop(self.api_client) |
| |
| # Validating InternalLbVm state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| with self.assertRaises(Exception): |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| self.debug("Failed to wget file as all the VMs in the Internal tier are in stopped state") |
| |
| # Starting VMs in the Internal tier |
| # wget traffic test succeeds as all the VMs in the Internal tier are back in running state |
| self.debug("Starting all the VMs in the Internal tier...") |
| internal_vm.start(self.api_client) |
| internal_vm_1.start(self.api_client) |
| internal_vm_2.start(self.api_client) |
| |
| # Validating InternalLbVm state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| tries = 0 |
| while tries < 10: |
| try: |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| except Exception as e: |
| self.debug("Failed to wget file via the InternalLbVm after re-starting all the VMs in the Internal tier" |
| ": %s" % e) |
| self.debug("Waiting for the InternalLbVm and all the VMs in the Internal tier to be fully resolved for " |
| "(wget) traffic test...") |
| time.sleep(30) |
| tries += 1 |
| continue |
| self.debug("Internal LB (wget) traffic test is successful after re-starting all the VMs in the Internal " |
| "tier") |
| break |
| |
| # Restarting VPC (cleanup = false) |
| # VPC VR gets destroyed and deployed again in the VPC |
| # This restart has no effect on the InternalLbVm functionality |
| self.debug("Restarting the VPC without cleanup...") |
| self.restart_Vpc(self.vpc, cleanup=False) |
| |
| # Validating InternalLbVm state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| |
| # Restarting VPC (cleanup = true) |
| # VPC VR gets destroyed and deployed again in the VPC |
| # This restart has no effect on the InternalLbVm functionality |
| self.debug("Restarting the VPC with cleanup...") |
| self.restart_Vpc(self.vpc, cleanup=True) |
| |
| # Validating InternalLbVm state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| |
| # tags=["advanced", "intervlan"] |
| @attr(tags=["TODO"], required_hardware="true") |
| def test_04_internallb_appliance_operations_traffic(self): |
| """Test VPC Network Internal LB functionality with InternalLbVm appliance operations by performing (wget) |
| traffic tests within a VPC |
| """ |
| |
| # Repeat the tests in the testcase "test_02_internallb_rules_traffic" with InternalLbVm appliance operations: |
| # 1. Verify the InternalLbVm deployment by creating the Internal LB Rules when the VPC VR is in Stopped state, |
| # VPC VR has no effect on the InternalLbVm functionality. |
| # 2. Stop the InternalLbVm when the VPC VR is in Stopped State |
| # 3. Start the InternalLbVm when the VPC VR is in Stopped state |
| # 4. Stop the InternalLbVm when the VPC VR is in Running State |
| # 5. Start the InternalLbVm when the VPC VR is in Running state |
| # 6. Force stop the InternalLbVm when the VPC VR is in Running State |
| # 7. Start the InternalLbVm when the VPC VR is in Running state |
| # Verify the above restarts of VPC networks by performing (wget) traffic tests within a VPC. |
| |
| # Creating VPC networks in the VPC, and deploying VMs |
| self.debug("Creating a VPC network with Internal LB service...") |
| internal_tier = self.create_Network(self.net_off_1, gateway='10.1.1.1') |
| |
| self.debug("Deploying a VM in the created VPC network...") |
| internal_vm = self.create_VM(internal_tier) |
| |
| self.debug("Creating a VPC network without Internal LB service...") |
| public_tier = self.create_Network(self.net_off_2, gateway='10.1.2.1') |
| |
| self.debug("Deploying a VM in the created VPC network...") |
| public_vm = self.create_VM(public_tier) |
| |
| # Stopping the VPC VR |
| # VPC VR has no effect on the InternalLbVm functionality |
| vpc_vr = self.get_Router(internal_tier) |
| Router.stop(self.api_client, id=vpc_vr.id) |
| |
| # Creating Internal LB Rules in the Internal tiers |
| self.debug("Creating three Internal LB Rules (SSH & HTTP) using the same Load Balancing source IP Address...") |
| int_lb_rule_1 = self.create_Internal_LB_Rule(internal_tier, vm_array=[internal_vm]) |
| self.validate_Internal_LB_Rule(int_lb_rule_1, state="Active", vm_array=[internal_vm]) |
| int_lb_rule_2 = self.create_Internal_LB_Rule(internal_tier, |
| vm_array=[internal_vm], |
| services=self.test_data["internal_lbrule_http"], |
| source_ip=int_lb_rule_1.sourceipaddress |
| ) |
| self.validate_Internal_LB_Rule(int_lb_rule_2, state="Active", vm_array=[internal_vm]) |
| |
| # Validating InternalLbVm deployment and state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Deploying more VMs in the Internal tier |
| self.debug("Deploying two more VMs in network - %s" % internal_tier.name) |
| internal_vm_1 = self.create_VM(internal_tier) |
| internal_vm_2 = self.create_VM(internal_tier) |
| |
| # Adding newly deployed VMs to the created Internal LB rules |
| self.debug("Adding two more virtual machines to the created Internal LB rules...") |
| int_lb_rule_1.assign(self.api_client, [internal_vm_1, internal_vm_2]) |
| self.validate_Internal_LB_Rule(int_lb_rule_1, state="Active", |
| vm_array=[internal_vm, internal_vm_1, internal_vm_2]) |
| int_lb_rule_2.assign(self.api_client, [internal_vm_1, internal_vm_2]) |
| self.validate_Internal_LB_Rule(int_lb_rule_2, state="Active", |
| vm_array=[internal_vm, internal_vm_1, internal_vm_2]) |
| |
| # Validating InternalLbVm state |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Adding Network ACL rules in the Internal tier |
| self.debug("Adding Network ACL rules to make the created Internal LB rules (SSH & HTTP) accessible...") |
| self.create_NetworkAclRule(self.test_data["ingress_rule"], internal_tier) |
| self.create_NetworkAclRule(self.test_data["http_rule"], internal_tier) |
| |
| # Creating Static NAT rule for the VM in the Public tier |
| public_ip = self.acquire_PublicIPAddress() |
| self.create_StaticNatRule_For_VM(public_vm, public_ip, public_tier) |
| |
| # Adding Network ACL rule in the Public tier |
| self.debug("Adding Network ACL rule to make the created NAT rule (SSH) accessible...") |
| self.create_NetworkAclRule(self.test_data["ingress_rule"], public_tier) |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| |
| # # Stopping the InternalLbVm when the VPC VR is in Stopped state |
| int_lb_vm = self.get_InternalLbVm(internal_tier, int_lb_rule_1.sourceipaddress) |
| self.stop_InternalLbVm(int_lb_vm) |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Stopped") |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| with self.assertRaises(Exception): |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| self.debug("Failed to wget file as the InternalLbVm is in stopped state") |
| |
| # # Starting the InternalLbVm when the VPC VR is in Stopped state |
| self.start_InternalLbVm(int_lb_vm) |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| tries = 0 |
| while tries < 10: |
| try: |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| except Exception as e: |
| self.debug("Failed to wget file via the InternalLbVm after re-starting the InternalLbVm appliance: %s" |
| % e) |
| self.debug("Waiting for the InternalLbVm to be fully resolved for (wget) traffic test...") |
| time.sleep(30) |
| tries += 1 |
| continue |
| self.debug("Internal LB (wget) traffic test is successful after re-starting the InternalLbVm appliance") |
| break |
| |
| # Starting the VPC VR |
| # VPC VR has no effect on the InternalLbVm functionality |
| Router.start(self.api_client, id=vpc_vr.id) |
| |
| # # Stopping the InternalLbVm when the VPC VR is in Running state |
| self.stop_InternalLbVm(int_lb_vm) |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Stopped") |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| with self.assertRaises(Exception): |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| self.debug("Failed to wget file as the InternalLbVm is in stopped state") |
| |
| # # Starting the InternalLbVm when the VPC VR is in Running state |
| self.start_InternalLbVm(int_lb_vm) |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| tries = 0 |
| while tries < 10: |
| try: |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| except Exception as e: |
| self.debug("Failed to wget file via the InternalLbVm after re-starting the InternalLbVm appliance: %s" |
| % e) |
| self.debug("Waiting for the InternalLbVm to be fully resolved for (wget) traffic test...") |
| time.sleep(30) |
| tries += 1 |
| continue |
| self.debug("Internal LB (wget) traffic test is successful after re-starting the InternalLbVm appliance") |
| break |
| |
| # # Force Stopping the InternalLbVm when the VPC VR is in Running state |
| self.stop_InternalLbVm(int_lb_vm, force=True) |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Stopped") |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| with self.assertRaises(Exception): |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| self.debug("Failed to wget file as the InternalLbVm is in stopped state") |
| |
| # # Starting the InternalLbVm when the VPC VR is in Running state |
| self.start_InternalLbVm(int_lb_vm) |
| self.check_InternalLbVm_state(internal_tier, int_lb_rule_1.sourceipaddress, state="Running") |
| |
| # Internal LB (wget) traffic test |
| ssh_client = self.ssh_into_VM(public_vm, public_ip) |
| tries = 0 |
| while tries < 10: |
| try: |
| self.wget_from_vm_cmd(ssh_client, |
| int_lb_rule_1.sourceipaddress, |
| self.test_data["http_rule"]["publicport"] |
| ) |
| except Exception as e: |
| self.debug("Failed to wget file via the InternalLbVm after re-starting the InternalLbVm appliance: %s" |
| % e) |
| self.debug("Waiting for the InternalLbVm to be fully resolved for (wget) traffic test...") |
| time.sleep(30) |
| tries += 1 |
| continue |
| self.debug("Internal LB (wget) traffic test is successful after re-starting the InternalLbVm appliance") |
| break |