Move two_nodegroups_network_templates to own group

- Move two_nodegroups_network_templates test to its
own class with own group
- Move specific methods from test_multiple_networks to
test_net_templates_base
- Fix two_nodegroups.yaml template

Change-Id: Iac0dc8a7dcb7ec5532bdabca5681b74bdd81f8ce
Closes-Bug: #1549334
This commit is contained in:
asledzinskiy 2016-03-23 14:35:25 +02:00
parent 608a972766
commit f188631bba
5 changed files with 201 additions and 179 deletions

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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]

View File

@ -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')