From 3db5d3a8b727259087c51b643a16719ba1cb345b Mon Sep 17 00:00:00 2001 From: Rabi Mishra Date: Sat, 23 May 2015 02:20:47 +0530 Subject: [PATCH] Use network 'heat-net' for integration_tests Neutron support for ipv6 is not complete yet (ex. LBaaS only supports ipv4). We'had some gate issues after dual stack was enabled in devstack. We had put some tactical fixes to resolve those[1][2]. This fix adds usage of heat-net/heat-subnet(only ipv4) for integration tests. This also rolls back the earlier tactical changes. https://review.openstack.org/#/c/178576 https://review.openstack.org/#/c/178933/ Change-Id: Ia863edb8932b8dea5c4fa110c97dcfdadca85bb9 --- heat/engine/clients/os/nova.py | 5 +--- heat_integrationtests/common/config.py | 6 ++-- heat_integrationtests/common/test.py | 11 ------- .../functional/test_create_update.py | 4 +++ heat_integrationtests/post_test_hook.sh | 1 + heat_integrationtests/prepare_test_network.sh | 29 +++++++++++++++++++ .../scenario/scenario_base.py | 1 - .../templates/test_neutron_autoscaling.yaml | 5 ++-- .../templates/test_neutron_loadbalancer.yaml | 12 +++++--- .../scenario/test_neutron_autoscaling.py | 2 +- .../scenario/test_neutron_loadbalancer.py | 9 +++--- .../scenario/test_server_cfn_init.py | 2 +- 12 files changed, 55 insertions(+), 32 deletions(-) create mode 100755 heat_integrationtests/prepare_test_network.sh diff --git a/heat/engine/clients/os/nova.py b/heat/engine/clients/os/nova.py index ee46c43ad..c6a0e0980 100644 --- a/heat/engine/clients/os/nova.py +++ b/heat/engine/clients/os/nova.py @@ -25,7 +25,6 @@ from novaclient import exceptions from novaclient import shell as novashell from oslo_config import cfg from oslo_serialization import jsonutils -from oslo_utils import netutils from oslo_utils import uuidutils import six from six.moves.urllib import parse as urlparse @@ -417,9 +416,7 @@ echo -e '%s\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers else: for n in server.networks: if len(server.networks[n]) > 0: - for addr in server.networks[n]: - if netutils.is_valid_ipv4(addr): - return addr + return server.networks[n][0] def get_server(self, server): try: diff --git a/heat_integrationtests/common/config.py b/heat_integrationtests/common/config.py index 5ced77bda..4f6ea3df7 100644 --- a/heat_integrationtests/common/config.py +++ b/heat_integrationtests/common/config.py @@ -62,10 +62,10 @@ IntegrationTestGroup = [ default=1200, help="Timeout in seconds to wait for a stack to build."), cfg.StrOpt('network_for_ssh', - default='private', + default='heat-net', help="Network used for SSH connections."), cfg.StrOpt('fixed_network_name', - default='private', + default='heat-net', help="Visible fixed network name "), cfg.StrOpt('floating_network_name', default='public', @@ -77,7 +77,7 @@ IntegrationTestGroup = [ "resource type Heat::InstallConfigAgent. Needs to " "be appropriate for the image_ref."), cfg.StrOpt('fixed_subnet_name', - default='private-subnet', + default='heat-subnet', help="Visible fixed sub-network name "), cfg.IntOpt('ssh_timeout', default=300, diff --git a/heat_integrationtests/common/test.py b/heat_integrationtests/common/test.py index 4168fb4af..acfe1ad74 100644 --- a/heat_integrationtests/common/test.py +++ b/heat_integrationtests/common/test.py @@ -174,17 +174,6 @@ class HeatIntegrationTest(testscenarios.WithScenarios, if net['name'] == net_name: return net - def _get_subnet_by_version(self, network, ip_version=4): - for subnet_id in self.net['subnets']: - subnet_info = self.network_client.show_subnet(subnet_id) - if subnet_info['subnet']['ip_version'] == ip_version: - return subnet_id - - def _get_server_ip_by_version(self, addresses, ip_version=4): - for address in addresses: - if address['version'] == ip_version: - return address['addr'] - @staticmethod def _stack_output(stack, output_key): """Return a stack output value for a given key.""" diff --git a/heat_integrationtests/functional/test_create_update.py b/heat_integrationtests/functional/test_create_update.py index 37b179084..60533031b 100644 --- a/heat_integrationtests/functional/test_create_update.py +++ b/heat_integrationtests/functional/test_create_update.py @@ -116,6 +116,8 @@ parameters: type: string image: type: string + network: + type: string resources: server: @@ -123,6 +125,7 @@ resources: properties: image: {get_param: image} flavor: {get_param: flavor} + networks: [{network: {get_param: network} }] user_data_format: SOFTWARE_CONFIG user_data: {get_param: user_data} ''' @@ -369,6 +372,7 @@ resources: parms = {'flavor': self.conf.minimal_instance_type, 'image': self.conf.minimal_image_ref, + 'network': self.conf.fixed_network_name, 'user_data': ''} name = self._stack_rand_name() diff --git a/heat_integrationtests/post_test_hook.sh b/heat_integrationtests/post_test_hook.sh index 89518b573..7919d38cf 100755 --- a/heat_integrationtests/post_test_hook.sh +++ b/heat_integrationtests/post_test_hook.sh @@ -19,5 +19,6 @@ set -x export DEST=${DEST:-/opt/stack/new} source $DEST/devstack/accrc/admin/admin sudo -E $DEST/heat/heat_integrationtests/prepare_test_env.sh +sudo -E $DEST/heat/heat_integrationtests/prepare_test_network.sh source $DEST/devstack/accrc/demo/demo sudo -E tox -eintegration diff --git a/heat_integrationtests/prepare_test_network.sh b/heat_integrationtests/prepare_test_network.sh new file mode 100755 index 000000000..657ce7575 --- /dev/null +++ b/heat_integrationtests/prepare_test_network.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# +# Licensed 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. + +# This script creates default tenant networks for the tests + +set -x + +source $DEST/devstack/accrc/admin/admin +PUB_SUBNET_ID=`neutron subnet-list | grep ' public-subnet ' | awk '{split($0,a,"|"); print a[2]}'` +ROUTER_GW_IP=`neutron port-list -c fixed_ips -c device_owner | grep router_gateway | awk -F '"' -v subnet_id="${PUB_SUBNET_ID//[[:space:]]/}" '$4 == subnet_id { print $8; }'` + +# create a heat specific private network (default 'private' network has ipv6 subnet) +source $DEST/devstack/accrc/demo/demo +HEAT_PRIVATE_SUBNET_CIDR=10.0.5.0/24 +neutron net-create heat-net +neutron subnet-create --name heat-subnet heat-net $HEAT_PRIVATE_SUBNET_CIDR +neutron router-interface-add router1 heat-subnet +sudo route add -net $HEAT_PRIVATE_SUBNET_CIDR gw $ROUTER_GW_IP diff --git a/heat_integrationtests/scenario/scenario_base.py b/heat_integrationtests/scenario/scenario_base.py index dbd825b45..dd25b89dd 100644 --- a/heat_integrationtests/scenario/scenario_base.py +++ b/heat_integrationtests/scenario/scenario_base.py @@ -25,7 +25,6 @@ class ScenarioTestsBase(test.HeatIntegrationTest): if not self.conf.fixed_network_name: raise self.skipException("No default network configured to test") self.net = self._get_network() - self.subnet_v4 = self._get_subnet_by_version(self.net) if not self.conf.image_ref: raise self.skipException("No image configured to test") diff --git a/heat_integrationtests/scenario/templates/test_neutron_autoscaling.yaml b/heat_integrationtests/scenario/templates/test_neutron_autoscaling.yaml index 59aad2c98..a34ec43b2 100644 --- a/heat_integrationtests/scenario/templates/test_neutron_autoscaling.yaml +++ b/heat_integrationtests/scenario/templates/test_neutron_autoscaling.yaml @@ -11,7 +11,7 @@ parameters: type: string label: Capacity description: Auto-scaling group desired capacity - fixed_subnet_name: + fixed_subnet: type: string label: fixed subnetwork ID description: subnetwork ID used for autoscaling @@ -28,7 +28,7 @@ resources: lb_method: ROUND_ROBIN name: test_pool protocol: HTTP - subnet: { get_param: fixed_subnet_name } + subnet: { get_param: fixed_subnet } vip: { "description": "Test VIP", "protocol_port": 80, @@ -49,6 +49,7 @@ resources: properties: AvailabilityZones : ["nova"] LaunchConfigurationName : { get_resource : launch_config } + VPCZoneIdentifier: [{ get_param: fixed_subnet }] MinSize : 1 MaxSize : 5 DesiredCapacity: { get_param: capacity } diff --git a/heat_integrationtests/scenario/templates/test_neutron_loadbalancer.yaml b/heat_integrationtests/scenario/templates/test_neutron_loadbalancer.yaml index b0c48c271..dd659d07f 100644 --- a/heat_integrationtests/scenario/templates/test_neutron_loadbalancer.yaml +++ b/heat_integrationtests/scenario/templates/test_neutron_loadbalancer.yaml @@ -10,6 +10,8 @@ parameters: type: string image: type: string + network: + type: string private_subnet_id: type: string external_network_id: @@ -66,6 +68,7 @@ resources: image: { get_param: image } flavor: { get_param: flavor } key_name: { get_param: key_name } + networks: [{network: {get_param: network} }] security_groups: [{ get_resource: sec_group }] user_data_format: SOFTWARE_CONFIG user_data: { get_resource: config } @@ -77,6 +80,7 @@ resources: image: { get_param: image } flavor: { get_param: flavor } key_name: { get_param: key_name } + networks: [{network: {get_param: network} }] security_groups: [{ get_resource: sec_group }] user_data_format: SOFTWARE_CONFIG user_data: { get_resource: config } @@ -119,10 +123,10 @@ resources: - { get_resource: server1 } outputs: - serv1_addresses: - value: {get_attr: [server1, addresses, private]} - serv2_addresses: - value: {get_attr: [server2, addresses, private]} + serv1_ip: + value: {get_attr: [server1, networks, { get_param: network }, 0]} + serv2_ip: + value: {get_attr: [server2, networks, { get_param: network }, 0]} vip: value: {get_attr: [test_pool, vip, address]} fip: diff --git a/heat_integrationtests/scenario/test_neutron_autoscaling.py b/heat_integrationtests/scenario/test_neutron_autoscaling.py index 9a1e63471..e7aae1953 100644 --- a/heat_integrationtests/scenario/test_neutron_autoscaling.py +++ b/heat_integrationtests/scenario/test_neutron_autoscaling.py @@ -40,7 +40,7 @@ class NeutronAutoscalingTest(scenario_base.ScenarioTestsBase): "image_id": self.conf.minimal_image_ref, "capacity": "1", "instance_type": self.conf.minimal_instance_type, - "fixed_subnet_name": self.conf.fixed_subnet_name, + "fixed_subnet": self.net['subnets'][0], } # Launch stack diff --git a/heat_integrationtests/scenario/test_neutron_loadbalancer.py b/heat_integrationtests/scenario/test_neutron_loadbalancer.py index 61642d1d5..d8e01978c 100644 --- a/heat_integrationtests/scenario/test_neutron_loadbalancer.py +++ b/heat_integrationtests/scenario/test_neutron_loadbalancer.py @@ -55,7 +55,8 @@ class NeutronLoadBalancerTest(scenario_base.ScenarioTestsBase): 'key_name': self.keypair_name, 'flavor': self.conf.minimal_instance_type, 'image': self.conf.image_ref, - 'private_subnet_id': self.subnet_v4, + 'network': self.net['name'], + 'private_subnet_id': self.net['subnets'][0], 'external_network_id': self.public_net['id'], 'timeout': self.conf.build_timeout } @@ -69,10 +70,8 @@ class NeutronLoadBalancerTest(scenario_base.ScenarioTestsBase): stack = self.client.stacks.get(sid) floating_ip = self._stack_output(stack, 'fip') vip = self._stack_output(stack, 'vip') - server1_ip = self._get_server_ip_by_version( - self._stack_output(stack, 'serv1_addresses')) - server2_ip = self._get_server_ip_by_version( - self._stack_output(stack, 'serv2_addresses')) + server1_ip = self._stack_output(stack, 'serv1_ip') + server2_ip = self._stack_output(stack, 'serv2_ip') # Check connection and info about received responses self.check_connectivity(server1_ip) self.collect_responses(server1_ip, {'server1\n'}) diff --git a/heat_integrationtests/scenario/test_server_cfn_init.py b/heat_integrationtests/scenario/test_server_cfn_init.py index b2650bb2a..b5b1e67c9 100644 --- a/heat_integrationtests/scenario/test_server_cfn_init.py +++ b/heat_integrationtests/scenario/test_server_cfn_init.py @@ -95,7 +95,7 @@ class CfnInitIntegrationTest(scenario_base.ScenarioTestsBase): 'flavor': self.conf.instance_type, 'image': self.conf.image_ref, 'timeout': self.conf.build_timeout, - 'subnet': self.subnet_v4, + 'subnet': self.net['subnets'][0], } # Launch stack