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:
parent
608a972766
commit
f188631bba
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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')
|
Loading…
Reference in New Issue