diff --git a/fuelweb_test/network_templates/two_nodegroups.yaml b/fuelweb_test/network_templates/two_nodegroups.yaml index ed5132259..4d8a5d3fd 100644 --- a/fuelweb_test/network_templates/two_nodegroups.yaml +++ b/fuelweb_test/network_templates/two_nodegroups.yaml @@ -44,7 +44,7 @@ adv_net_template: name: br-fw-admin - action: add-port bridge: br-fw-admin - name: eth0 + name: <% if1 %> endpoints: - br-fw-admin roles: @@ -65,7 +65,7 @@ adv_net_template: mtu: 65000 - action: add-port bridge: br-ex - name: eth1 + name: <% if2 %> endpoints: - br-ex roles: @@ -79,7 +79,7 @@ adv_net_template: name: br-mgmt - action: add-port bridge: br-mgmt - name: eth2 + name: <% if3 %> endpoints: - br-mgmt roles: @@ -126,7 +126,7 @@ adv_net_template: mtu: 65000 - action: add-port bridge: br-aux - name: eth3 + name: <% if4 %> endpoints: - br-prv roles: @@ -138,7 +138,7 @@ adv_net_template: name: br-storage - action: add-port bridge: br-storage - name: eth4 + name: <% if5 %> endpoints: - br-storage roles: @@ -147,11 +147,11 @@ adv_net_template: group-custom-1: nic_mapping: default: - if11: eth0 # admin - if12: eth1 # public - if13: eth2 # management - if14: eth3 # private - if15: eth4 # storage + if11: enp0s3 # admin + if12: enp0s4 # public + if13: enp0s5 # management + if14: enp0s6 # private + if15: enp0s7 # storage templates_for_node_role: controller: - admin @@ -189,7 +189,7 @@ adv_net_template: name: br-fw-admin - action: add-port bridge: br-fw-admin - name: eth0 + name: <% if11 %> endpoints: - br-fw-admin roles: @@ -210,7 +210,7 @@ adv_net_template: mtu: 65000 - action: add-port bridge: br-ex - name: eth1 + name: <% if12 %> endpoints: - br-ex roles: @@ -224,7 +224,7 @@ adv_net_template: name: br-mgmt - action: add-port bridge: br-mgmt - name: eth2 + name: <% if13 %> endpoints: - br-mgmt roles: @@ -270,7 +270,7 @@ adv_net_template: mtu: 65000 - action: add-port bridge: br-aux - name: eth3 + name: <% if14 %> endpoints: - br-prv roles: @@ -282,7 +282,7 @@ adv_net_template: name: br-storage - action: add-port bridge: br-storage - name: eth4 + name: <% if15 %> endpoints: - br-storage roles: diff --git a/fuelweb_test/tests/test_multiple_networks.py b/fuelweb_test/tests/test_multiple_networks.py index b588b25a2..139a3187e 100644 --- a/fuelweb_test/tests/test_multiple_networks.py +++ b/fuelweb_test/tests/test_multiple_networks.py @@ -33,76 +33,19 @@ from fuelweb_test.settings import DEPLOYMENT_MODE_HA from fuelweb_test.settings import MULTIPLE_NETWORKS from fuelweb_test.settings import NEUTRON_SEGMENT from fuelweb_test.settings import NODEGROUPS -from fuelweb_test.tests.base_test_case import TestBasic from fuelweb_test.tests.base_test_case import SetupEnvironment +from fuelweb_test.tests.test_net_templates_base import TestNetworkTemplatesBase from fuelweb_test import logger @test(groups=["multiple_cluster_networks", "thread_7"]) -class TestMultipleClusterNets(TestBasic): +class TestMultipleClusterNets(TestNetworkTemplatesBase): """TestMultipleClusterNets.""" # TODO documentation def __init__(self): self.netconf_all_groups = None super(TestMultipleClusterNets, self).__init__() - @staticmethod - def get_modified_ranges(net_dict, net_name, group_id): - for net in net_dict['networks']: - if net_name in net['name'] and net['group_id'] == group_id: - cidr = net['cidr'] - sliced_list = list(netaddr.IPNetwork(str(cidr)))[5:-5] - return [str(sliced_list[0]), str(sliced_list[-1])] - - @staticmethod - def change_default_admin_range(networks, number_excluded_ips): - """Change IP range for admin network by excluding N of first addresses - from default range - :param networks: list, environment networks configuration - :param number_excluded_ips: int, number of IPs to remove from range - """ - default_admin_network = [n for n in networks - if (n['name'] == "fuelweb_admin" and - n['group_id'] is None)] - asserts.assert_true(len(default_admin_network) == 1, - "Default 'admin/pxe' network not found " - "in cluster network configuration!") - default_admin_range = [netaddr.IPAddress(str(ip)) for ip - in default_admin_network[0]["ip_ranges"][0]] - new_admin_range = [default_admin_range[0] + number_excluded_ips, - default_admin_range[1]] - default_admin_network[0]["ip_ranges"][0] = [str(ip) - for ip in new_admin_range] - return default_admin_network[0]["ip_ranges"][0] - - @staticmethod - def is_ip_in_range(ip_addr, ip_range_start, ip_range_end): - return netaddr.IPAddress(str(ip_addr)) in netaddr.iter_iprange( - str(ip_range_start), str(ip_range_end)) - - @staticmethod - def is_update_dnsmasq_running(tasks): - for task in tasks: - if task['name'] == "update_dnsmasq" and \ - task["status"] == "running": - return True - return False - - @staticmethod - def update_network_ranges(net_data, update_data): - for net in net_data['networks']: - for group in update_data: - for net_name in update_data[group]: - if net_name in net['name'] and net['group_id'] == group: - net['ip_ranges'] = update_data[group][net_name] - net['meta']['notation'] = 'ip_ranges' - return net_data - - @staticmethod - def get_ranges(net_data, net_name, group_id): - return [net['ip_ranges'] for net in net_data['networks'] if - net_name in net['name'] and group_id == net['group_id']][0] - @test(depends_on=[SetupEnvironment.prepare_release], groups=["deploy_neutron_tun_ha_nodegroups"]) @log_snapshot_after_test diff --git a/fuelweb_test/tests/test_net_templates.py b/fuelweb_test/tests/test_net_templates.py index ee41338d3..8bfd6feeb 100644 --- a/fuelweb_test/tests/test_net_templates.py +++ b/fuelweb_test/tests/test_net_templates.py @@ -12,19 +12,14 @@ # License for the specific language governing permissions and limitations # under the License. -from proboscis import SkipTest from proboscis import test -from proboscis.asserts import assert_equal from proboscis.asserts import assert_true from fuelweb_test import logger from fuelweb_test.helpers.decorators import log_snapshot_after_test from fuelweb_test.helpers.utils import get_network_template from fuelweb_test.settings import DEPLOYMENT_MODE_HA -from fuelweb_test.settings import NEUTRON_SEGMENT from fuelweb_test.settings import NEUTRON_SEGMENT_TYPE -from fuelweb_test.settings import NODEGROUPS -from fuelweb_test.settings import MULTIPLE_NETWORKS from fuelweb_test.tests.base_test_case import SetupEnvironment from fuelweb_test.tests.test_net_templates_base import TestNetworkTemplatesBase @@ -276,106 +271,6 @@ class TestNetworkTemplates(TestNetworkTemplatesBase): self.env.make_snapshot("add_nodes_net_tmpl") - @test(depends_on=[SetupEnvironment.prepare_slaves_5], - groups=['two_nodegroups_network_templates', - 'known_issues']) - @log_snapshot_after_test - def two_nodegroups_network_templates(self): - """Deploy HA environment with Cinder, Neutron and network template on - two nodegroups. - - Scenario: - 1. Revert snapshot with 5 slaves - 2. Create cluster (HA) with Neutron VLAN/VXLAN/GRE - 3. Add 3 controller nodes - 4. Add 2 compute + cinder nodes - 5. Upload 'two_nodegroups' network template - 6. Deploy cluster - 7. Run health checks (OSTF) - 8. Check L3 network configuration on slaves - 9. Check that services are listening on their networks only - - Duration 120m - Snapshot two_nodegroups_network_templates - """ - def get_network(x): - return self.env.d_env.get_network(name=x).ip_network - - if not MULTIPLE_NETWORKS: - raise SkipTest() - - self.env.revert_snapshot('ready_with_5_slaves') - - # TODO(akostrikov) This should be refactored. - admin_net = self.env.d_env.admin_net - admin_net2 = self.env.d_env.admin_net2 - - networks = ['.'.join(get_network(n).split('.')[0:-1]) - for n in [admin_net, admin_net2]] - nodes_addresses = ['.'.join(node['ip'].split('.')[0:-1]) for node in - self.fuel_web.client.list_nodes()] - assert_equal(set(networks), set(nodes_addresses), - 'Only one admin network is used for discovering slaves:' - ' "{0}"'.format(set(nodes_addresses))) - - cluster_id = self.fuel_web.create_cluster( - name=self.__class__.__name__, - mode=DEPLOYMENT_MODE_HA, - settings={ - 'net_provider': 'neutron', - 'net_segment_type': NEUTRON_SEGMENT['tun'], - 'tenant': 'netTemplate', - 'user': 'netTemplate', - 'password': 'netTemplate', - } - ) - nodegroup1 = NODEGROUPS[0]['name'] - nodegroup2 = NODEGROUPS[1]['name'] - self.fuel_web.update_nodes( - cluster_id, - { - 'slave-01': [['controller'], nodegroup1], - 'slave-05': [['controller'], nodegroup1], - 'slave-03': [['controller'], nodegroup1], - 'slave-02': [['compute', 'cinder'], nodegroup2], - 'slave-04': [['compute', 'cinder'], nodegroup2], - } - ) - - network_template = get_network_template('two_nodegroups') - self.fuel_web.client.upload_network_template( - cluster_id=cluster_id, - network_template=network_template) - networks = self.generate_networks_for_template( - template=network_template, - ip_nets={nodegroup1: '10.200.0.0/16', nodegroup2: '10.210.0.0/16'}, - ip_prefixlen='24') - existing_networks = self.fuel_web.client.get_network_groups() - networks = self.create_custom_networks(networks, existing_networks) - - logger.debug('Networks: {0}'.format( - self.fuel_web.client.get_network_groups())) - - self.fuel_web.verify_network(cluster_id) - - self.fuel_web.deploy_cluster_wait(cluster_id, timeout=180 * 60) - - self.check_ipconfig_for_template(cluster_id, - network_template, - networks) - self.check_services_networks(cluster_id, network_template) - - # TODO(akostrikov) ostf may fail, need further investigation. - ostf_tmpl_set = ['smoke', 'sanity', 'ha', 'tests_platform'] - self.fuel_web.run_ostf(cluster_id=cluster_id, test_sets=ostf_tmpl_set) - - self.check_ipconfig_for_template(cluster_id, - network_template, - networks) - self.check_services_networks(cluster_id, network_template) - - self.env.make_snapshot('two_nodegroups_network_templates') - @test(depends_on=[SetupEnvironment.prepare_slaves_5], groups=["network_config_consistency_on_reboot"]) @log_snapshot_after_test diff --git a/fuelweb_test/tests/test_net_templates_base.py b/fuelweb_test/tests/test_net_templates_base.py index 201dcf542..589143038 100644 --- a/fuelweb_test/tests/test_net_templates_base.py +++ b/fuelweb_test/tests/test_net_templates_base.py @@ -418,3 +418,60 @@ class TestNetworkTemplatesBase(TestBasic): assert_true(check_passed, 'Some services are listening on wrong IPs! ' 'Please check logs for details!') + + @staticmethod + def get_modified_ranges(net_dict, net_name, group_id): + for net in net_dict['networks']: + if net_name in net['name'] and net['group_id'] == group_id: + cidr = net['cidr'] + sliced_list = list(netaddr.IPNetwork(str(cidr)))[5:-5] + return [str(sliced_list[0]), str(sliced_list[-1])] + + @staticmethod + def change_default_admin_range(networks, number_excluded_ips): + """Change IP range for admin network by excluding N of first addresses + from default range + :param networks: list, environment networks configuration + :param number_excluded_ips: int, number of IPs to remove from range + """ + default_admin_network = [n for n in networks + if (n['name'] == "fuelweb_admin" and + n['group_id'] is None)] + assert_true(len(default_admin_network) == 1, + "Default 'admin/pxe' network not found " + "in cluster network configuration!") + default_admin_range = [netaddr.IPAddress(str(ip)) for ip + in default_admin_network[0]["ip_ranges"][0]] + new_admin_range = [default_admin_range[0] + number_excluded_ips, + default_admin_range[1]] + default_admin_network[0]["ip_ranges"][0] = [str(ip) + for ip in new_admin_range] + return default_admin_network[0]["ip_ranges"][0] + + @staticmethod + def is_ip_in_range(ip_addr, ip_range_start, ip_range_end): + return netaddr.IPAddress(str(ip_addr)) in netaddr.iter_iprange( + str(ip_range_start), str(ip_range_end)) + + @staticmethod + def is_update_dnsmasq_running(tasks): + for task in tasks: + if task['name'] == "update_dnsmasq" and \ + task["status"] == "running": + return True + return False + + @staticmethod + def update_network_ranges(net_data, update_data): + for net in net_data['networks']: + for group in update_data: + for net_name in update_data[group]: + if net_name in net['name'] and net['group_id'] == group: + net['ip_ranges'] = update_data[group][net_name] + net['meta']['notation'] = 'ip_ranges' + return net_data + + @staticmethod + def get_ranges(net_data, net_name, group_id): + return [net['ip_ranges'] for net in net_data['networks'] if + net_name in net['name'] and group_id == net['group_id']][0] diff --git a/fuelweb_test/tests/test_net_templates_multiple_networks.py b/fuelweb_test/tests/test_net_templates_multiple_networks.py new file mode 100644 index 000000000..52cc4a0bb --- /dev/null +++ b/fuelweb_test/tests/test_net_templates_multiple_networks.py @@ -0,0 +1,127 @@ +# Copyright 2016 Mirantis, Inc. +# +# 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. + +from proboscis import asserts +from proboscis import test + +from fuelweb_test import logger +from fuelweb_test.helpers.decorators import log_snapshot_after_test +from fuelweb_test.helpers import utils +from fuelweb_test.settings import DEPLOYMENT_MODE_HA +from fuelweb_test.settings import NEUTRON_SEGMENT +from fuelweb_test.settings import NODEGROUPS +from fuelweb_test.settings import MULTIPLE_NETWORKS +from fuelweb_test.tests.base_test_case import SetupEnvironment +from fuelweb_test.tests.test_net_templates_base import TestNetworkTemplatesBase + + +@test(groups=["network_templates_multiple_networks"]) +class TestNetworkTemplatesMultipleNetworks(TestNetworkTemplatesBase): + """TestNetworkTemplatesMultipleNetworks.""" # TODO documentation + + @test(depends_on=[SetupEnvironment.prepare_release], + groups=['two_nodegroups_network_templates']) + @log_snapshot_after_test + def two_nodegroups_network_templates(self): + """Deploy HA environment with Cinder, Neutron and network template on + two nodegroups. + + Scenario: + 1. Revert snapshot with ready master node + 2. Bootstrap 3 slaves from default nodegroup + 3. Create cluster with Neutron VXLAN and custom nodegroups + 4. Bootstrap 2 slaves nodes from custom nodegroup + 5. Add 3 controller nodes from default nodegroup + 6. Add 2 compute+cinder nodes from custom nodegroup + 7. Upload 'two_nodegroups' network template + 8. Verify networks + 9. Deploy cluster + 10. Run health checks (OSTF) + 11. Check L3 network configuration on slaves + 12. Check that services are listening on their networks only + + Duration 120m + Snapshot two_nodegroups_network_templates + """ + + asserts.assert_true(MULTIPLE_NETWORKS, "MULTIPLE_NETWORKS variable" + " wasn't exported") + self.show_step(1, initialize=True) + self.env.revert_snapshot('ready') + self.show_step(2) + self.env.bootstrap_nodes(self.env.d_env.nodes().slaves[0:3]) + self.show_step(3) + cluster_id = self.fuel_web.create_cluster( + name=self.__class__.__name__, + mode=DEPLOYMENT_MODE_HA, + settings={ + 'net_provider': 'neutron', + 'net_segment_type': NEUTRON_SEGMENT['tun'], + 'tenant': 'netTemplate', + 'user': 'netTemplate', + 'password': 'netTemplate', + } + ) + + self.show_step(4) + self.env.bootstrap_nodes(self.env.d_env.nodes().slaves[3:5]) + + self.show_step(5) + self.show_step(6) + nodegroup1 = NODEGROUPS[0]['name'] + nodegroup2 = NODEGROUPS[1]['name'] + self.fuel_web.update_nodes( + cluster_id, + { + 'slave-01': [['controller'], nodegroup1], + 'slave-02': [['controller'], nodegroup1], + 'slave-03': [['controller'], nodegroup1], + 'slave-04': [['compute', 'cinder'], nodegroup2], + 'slave-05': [['compute', 'cinder'], nodegroup2], + } + ) + network_template = utils.get_network_template('two_nodegroups') + self.show_step(7) + self.fuel_web.client.upload_network_template( + cluster_id=cluster_id, + network_template=network_template) + networks = self.generate_networks_for_template( + template=network_template, + ip_nets={nodegroup1: '10.200.0.0/16', nodegroup2: '10.210.0.0/16'}, + ip_prefixlen='24') + existing_networks = self.fuel_web.client.get_network_groups() + networks = self.create_custom_networks(networks, existing_networks) + + logger.debug('Networks: {0}'.format( + self.fuel_web.client.get_network_groups())) + + self.show_step(8) + self.fuel_web.verify_network(cluster_id) + + self.show_step(9) + self.fuel_web.deploy_cluster_wait(cluster_id, timeout=180 * 60) + + self.show_step(11) + self.check_ipconfig_for_template(cluster_id, + network_template, + networks) + self.show_step(12) + self.check_services_networks(cluster_id, network_template) + + # TODO(akostrikov) ostf may fail, need further investigation. + ostf_tmpl_set = ['smoke', 'sanity', 'ha', 'tests_platform'] + self.show_step(10) + self.fuel_web.run_ostf(cluster_id=cluster_id, test_sets=ostf_tmpl_set) + + self.env.make_snapshot('two_nodegroups_network_templates')