Merge "Refactor configuring cluster network settings"
This commit is contained in:
commit
fefeefe961
@ -505,18 +505,15 @@ class FuelWebClient(object):
|
|||||||
hpv_data = attributes['editable']['common']['use_vcenter']
|
hpv_data = attributes['editable']['common']['use_vcenter']
|
||||||
hpv_data['value'] = True
|
hpv_data['value'] = True
|
||||||
|
|
||||||
# Updating attributes is needed before calling
|
# Updating attributes is needed before updating
|
||||||
# update_network_configuration() because addtional networks
|
# networking configuration because additional networks
|
||||||
# may be created by new components like ironic
|
# may be created by new components like ironic
|
||||||
self.client.update_cluster_attributes(cluster_id, attributes)
|
self.client.update_cluster_attributes(cluster_id, attributes)
|
||||||
|
|
||||||
if MULTIPLE_NETWORKS:
|
if MULTIPLE_NETWORKS:
|
||||||
node_groups = {n['name']: [] for n in NODEGROUPS}
|
node_groups = {n['name']: [] for n in NODEGROUPS}
|
||||||
self.update_nodegroups(cluster_id, node_groups)
|
self.update_nodegroups(cluster_id, node_groups)
|
||||||
self.update_network_configuration(cluster_id,
|
self.update_nodegroups_network_configuration(cluster_id)
|
||||||
nodegroups=NODEGROUPS)
|
|
||||||
else:
|
|
||||||
self.update_network_configuration(cluster_id)
|
|
||||||
|
|
||||||
cn = self.get_public_vip(cluster_id)
|
cn = self.get_public_vip(cluster_id)
|
||||||
change_cluster_ssl_config(attributes, cn)
|
change_cluster_ssl_config(attributes, cn)
|
||||||
@ -1281,25 +1278,113 @@ class FuelWebClient(object):
|
|||||||
for node in nailgun_nodes:
|
for node in nailgun_nodes:
|
||||||
self.update_node_networks(node['id'], assigned_networks)
|
self.update_node_networks(node['id'], assigned_networks)
|
||||||
|
|
||||||
@logwrap
|
def change_default_network_settings(self):
|
||||||
def update_network_configuration(self, cluster_id, nodegroups=None):
|
api_version = self.client.get_api_version()
|
||||||
net_config = self.client.get_networks(cluster_id)
|
if int(api_version["release"][0]) < 6:
|
||||||
if not nodegroups:
|
return
|
||||||
logger.info('Update network settings of cluster %s', cluster_id)
|
|
||||||
new_settings = self.update_net_settings(net_config)
|
|
||||||
else:
|
|
||||||
new_settings = net_config
|
|
||||||
for nodegroup in nodegroups:
|
|
||||||
logger.info('Update network settings of cluster %s, '
|
|
||||||
'nodegroup %s', cluster_id, nodegroup['name'])
|
|
||||||
new_settings = self.update_net_settings(new_settings,
|
|
||||||
nodegroup,
|
|
||||||
cluster_id)
|
|
||||||
|
|
||||||
self.update_floating_ranges(new_settings)
|
def fetch_networks(networks):
|
||||||
for net in net_config['networks']:
|
"""Parse response from api/releases/1/networks and return dict with
|
||||||
if 'baremetal' in net['name']:
|
networks' settings - need for avoiding hardcode"""
|
||||||
self.update_baremetal_ranges(new_settings)
|
result = {}
|
||||||
|
for net in networks:
|
||||||
|
if (net['name'] == 'private' and
|
||||||
|
net.get('seg_type', '') == 'tun'):
|
||||||
|
result['private_tun'] = net
|
||||||
|
elif (net['name'] == 'private' and
|
||||||
|
net.get('seg_type', '') == 'gre'):
|
||||||
|
result['private_gre'] = net
|
||||||
|
elif net['name'] == 'public':
|
||||||
|
result['public'] = net
|
||||||
|
elif net['name'] == 'management':
|
||||||
|
result['management'] = net
|
||||||
|
elif net['name'] == 'storage':
|
||||||
|
result['storage'] = net
|
||||||
|
elif net['name'] == 'baremetal':
|
||||||
|
result['baremetal'] = net
|
||||||
|
return result
|
||||||
|
|
||||||
|
public_net = self.environment.d_env.get_network(name="public").ip
|
||||||
|
if not BONDING:
|
||||||
|
manage_net = self.environment.d_env.get_network(
|
||||||
|
name="management").ip
|
||||||
|
storage_net = self.environment.d_env.get_network(
|
||||||
|
name="storage").ip
|
||||||
|
private_net = self.environment.d_env.get_network(
|
||||||
|
name="private").ip
|
||||||
|
|
||||||
|
logger.info("Applying default network settings")
|
||||||
|
for _release in self.client.get_releases():
|
||||||
|
logger.info(
|
||||||
|
'Applying changes for release: {}'.format(
|
||||||
|
_release['name']))
|
||||||
|
net_settings = \
|
||||||
|
self.client.get_release_default_net_settings(
|
||||||
|
_release['id'])
|
||||||
|
for net_provider in net_settings:
|
||||||
|
if net_provider == "bonding":
|
||||||
|
continue
|
||||||
|
|
||||||
|
networks = fetch_networks(
|
||||||
|
net_settings[net_provider]['networks'])
|
||||||
|
|
||||||
|
networks['public']['cidr'] = str(public_net)
|
||||||
|
networks['public']['gateway'] = str(public_net.network + 1)
|
||||||
|
|
||||||
|
# use the first half of public network as static public range
|
||||||
|
static, floating = public_net.subnet()
|
||||||
|
networks['public']['ip_range'] = [
|
||||||
|
str(static[2]), str(static[-1])]
|
||||||
|
|
||||||
|
# use the secong half of public network as floating range
|
||||||
|
net_settings[net_provider]['config']['floating_ranges'] = \
|
||||||
|
[[str(floating[0]), str(floating[-2])]]
|
||||||
|
|
||||||
|
if 'baremetal' in networks:
|
||||||
|
ironic_net = self.environment.d_env.get_network(
|
||||||
|
name='ironic').ip
|
||||||
|
subnet1, subnet2 = ironic_net.subnet()
|
||||||
|
networks['baremetal']['cidr'] = str(ironic_net)
|
||||||
|
networks['baremetal']['gateway'] = str(ironic_net[-2])
|
||||||
|
networks['baremetal']['ip_range'] = [
|
||||||
|
str(subnet1[2]), str(subnet2[0])]
|
||||||
|
net_settings[net_provider]['config']['baremetal_ranges'] =\
|
||||||
|
[[str(subnet2[1]), str(subnet2[-3])]]
|
||||||
|
|
||||||
|
if BONDING:
|
||||||
|
# leave defaults for mgmt, storage and private if
|
||||||
|
# BONDING is enabled
|
||||||
|
continue
|
||||||
|
|
||||||
|
networks['management']['cidr'] = str(manage_net)
|
||||||
|
networks['storage']['cidr'] = str(storage_net)
|
||||||
|
|
||||||
|
if net_provider == 'neutron':
|
||||||
|
networks['private_tun']['cidr'] = str(private_net)
|
||||||
|
networks['private_gre']['cidr'] = str(private_net)
|
||||||
|
|
||||||
|
net_settings[net_provider]['config']['internal_cidr'] = \
|
||||||
|
str(private_net)
|
||||||
|
net_settings[net_provider]['config']['internal_gateway'] =\
|
||||||
|
str(private_net[1])
|
||||||
|
|
||||||
|
elif net_provider == 'nova_network':
|
||||||
|
net_settings[net_provider]['config'][
|
||||||
|
'fixed_networks_cidr'] = str(private_net)
|
||||||
|
|
||||||
|
self.client.put_release_default_net_settings(
|
||||||
|
_release['id'], net_settings)
|
||||||
|
|
||||||
|
@logwrap
|
||||||
|
def update_nodegroups_network_configuration(self, cluster_id):
|
||||||
|
net_config = self.client.get_networks(cluster_id)
|
||||||
|
new_settings = net_config
|
||||||
|
for nodegroup in NODEGROUPS:
|
||||||
|
logger.info('Update network settings of cluster %s, '
|
||||||
|
'nodegroup %s', cluster_id, nodegroup['name'])
|
||||||
|
new_settings = self.update_nodegroup_net_settings(new_settings,
|
||||||
|
nodegroup,
|
||||||
|
cluster_id)
|
||||||
self.client.update_network(
|
self.client.update_network(
|
||||||
cluster_id=cluster_id,
|
cluster_id=cluster_id,
|
||||||
networking_parameters=new_settings["networking_parameters"],
|
networking_parameters=new_settings["networking_parameters"],
|
||||||
@ -1312,51 +1397,22 @@ class FuelWebClient(object):
|
|||||||
if name in net:
|
if name in net:
|
||||||
return net
|
return net
|
||||||
|
|
||||||
def update_net_settings(self, network_configuration, nodegroup=None,
|
def update_nodegroup_net_settings(self, network_configuration, nodegroup,
|
||||||
cluster_id=None):
|
cluster_id=None):
|
||||||
seg_type = network_configuration.get('networking_parameters', {}) \
|
seg_type = network_configuration.get('networking_parameters', {}) \
|
||||||
.get('segmentation_type')
|
.get('segmentation_type')
|
||||||
if not nodegroup:
|
nodegroup_id = self.get_nodegroup(cluster_id, nodegroup['name'])['id']
|
||||||
for net in network_configuration.get('networks'):
|
for net in network_configuration.get('networks'):
|
||||||
|
if net['group_id'] == nodegroup_id:
|
||||||
|
# Do not overwrite default PXE admin network configuration
|
||||||
|
if nodegroup['name'] == 'default' and \
|
||||||
|
net['name'] == 'fuelweb_admin':
|
||||||
|
continue
|
||||||
self.set_network(net_config=net,
|
self.set_network(net_config=net,
|
||||||
net_name=net['name'],
|
net_name=net['name'],
|
||||||
|
net_pools=nodegroup['pools'],
|
||||||
seg_type=seg_type)
|
seg_type=seg_type)
|
||||||
return network_configuration
|
return network_configuration
|
||||||
else:
|
|
||||||
nodegroup_id = self.get_nodegroup(cluster_id,
|
|
||||||
nodegroup['name'])['id']
|
|
||||||
for net in network_configuration.get('networks'):
|
|
||||||
if net['group_id'] == nodegroup_id:
|
|
||||||
# Do not overwrite default PXE admin network configuration
|
|
||||||
if nodegroup['name'] == 'default' and \
|
|
||||||
net['name'] == 'fuelweb_admin':
|
|
||||||
continue
|
|
||||||
self.set_network(net_config=net,
|
|
||||||
net_name=net['name'],
|
|
||||||
net_pools=nodegroup['pools'],
|
|
||||||
seg_type=seg_type)
|
|
||||||
return network_configuration
|
|
||||||
|
|
||||||
def update_floating_ranges(self, network_configuration):
|
|
||||||
nc = network_configuration["networking_parameters"]
|
|
||||||
|
|
||||||
public = self.environment.d_env.get_network(name='public').ip
|
|
||||||
|
|
||||||
if not BONDING:
|
|
||||||
float_range = public
|
|
||||||
else:
|
|
||||||
float_range = list(public.subnet(new_prefix=27))[0]
|
|
||||||
# Setting of multiple floating IP ranges disabled for 7.0, LP#1490657
|
|
||||||
# This feature moved to 8.0: LP#1371363, LP#1490578
|
|
||||||
nc["floating_ranges"] = self.get_range(float_range, 1)
|
|
||||||
|
|
||||||
def update_baremetal_ranges(self, network_configuration):
|
|
||||||
nc = network_configuration["networking_parameters"]
|
|
||||||
|
|
||||||
baremetal_net = self.environment.d_env.get_network(
|
|
||||||
name='ironic').ip_network
|
|
||||||
|
|
||||||
nc["baremetal_ranges"] = self.get_range(baremetal_net, 3)
|
|
||||||
|
|
||||||
def set_network(self, net_config, net_name, net_pools=None, seg_type=None):
|
def set_network(self, net_config, net_name, net_pools=None, seg_type=None):
|
||||||
nets_wo_floating = ['public', 'management', 'storage', 'baremetal']
|
nets_wo_floating = ['public', 'management', 'storage', 'baremetal']
|
||||||
|
@ -193,6 +193,18 @@ class NailgunClient(object):
|
|||||||
if release["name"].lower().find(release_name.lower()) != -1:
|
if release["name"].lower().find(release_name.lower()) != -1:
|
||||||
return release["id"]
|
return release["id"]
|
||||||
|
|
||||||
|
@logwrap
|
||||||
|
@json_parse
|
||||||
|
def get_release_default_net_settings(self, release_id):
|
||||||
|
return self.client.get("/api/releases/{}/networks".format(
|
||||||
|
release_id))
|
||||||
|
|
||||||
|
@logwrap
|
||||||
|
@json_parse
|
||||||
|
def put_release_default_net_settings(self, release_id, data):
|
||||||
|
return self.client.put(
|
||||||
|
"/api/releases/{}/networks".format(release_id), data)
|
||||||
|
|
||||||
@logwrap
|
@logwrap
|
||||||
@json_parse
|
@json_parse
|
||||||
def get_node_interfaces(self, node_id):
|
def get_node_interfaces(self, node_id):
|
||||||
|
@ -155,6 +155,7 @@ class SetupEnvironment(TestBasic):
|
|||||||
self.env.revert_snapshot("empty", skip_timesync=True)
|
self.env.revert_snapshot("empty", skip_timesync=True)
|
||||||
|
|
||||||
self.fuel_web.get_nailgun_version()
|
self.fuel_web.get_nailgun_version()
|
||||||
|
self.fuel_web.change_default_network_settings()
|
||||||
if REPLACE_DEFAULT_REPOS and REPLACE_DEFAULT_REPOS_ONLY_ONCE:
|
if REPLACE_DEFAULT_REPOS and REPLACE_DEFAULT_REPOS_ONLY_ONCE:
|
||||||
self.fuel_web.replace_default_repos()
|
self.fuel_web.replace_default_repos()
|
||||||
self.env.make_snapshot("ready", is_make=True)
|
self.env.make_snapshot("ready", is_make=True)
|
||||||
|
@ -152,19 +152,14 @@ class CommandLine(TestBasic):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@logwrap
|
@logwrap
|
||||||
def update_cli_network_configuration(self, cluster_id, remote,
|
def update_cli_network_configuration(self, cluster_id, remote):
|
||||||
nodegroup=None):
|
"""Update cluster network settings with custom configuration.
|
||||||
|
Place here an additional config changes if needed (e.g. nodegroups'
|
||||||
|
networking configuration.
|
||||||
|
Also this method checks downloading/uploading networks via cli.
|
||||||
|
"""
|
||||||
net_config = self.get_networks(cluster_id, remote)
|
net_config = self.get_networks(cluster_id, remote)
|
||||||
if not nodegroup:
|
new_settings = net_config
|
||||||
logger.info('Update network settings of cluster %s', cluster_id)
|
|
||||||
new_settings = self.fuel_web.update_net_settings(net_config)
|
|
||||||
|
|
||||||
else:
|
|
||||||
logger.info('Update network settings of cluster %s, nodegroup %s',
|
|
||||||
cluster_id, nodegroup['name'])
|
|
||||||
new_settings = self.fuel_web.update_net_settings(
|
|
||||||
net_config, nodegroup, cluster_id)
|
|
||||||
self.fuel_web.update_floating_ranges(new_settings)
|
|
||||||
self.update_network(cluster_id, remote, new_settings)
|
self.update_network(cluster_id, remote, new_settings)
|
||||||
|
|
||||||
def get_public_vip(self, cluster_id, remote):
|
def get_public_vip(self, cluster_id, remote):
|
||||||
|
@ -85,6 +85,8 @@ class PrepareBase(base_actions_factory.BaseActionsFactory):
|
|||||||
self.env.revert_snapshot("empty", skip_timesync=True)
|
self.env.revert_snapshot("empty", skip_timesync=True)
|
||||||
|
|
||||||
self.fuel_web.get_nailgun_version()
|
self.fuel_web.get_nailgun_version()
|
||||||
|
self.fuel_web.change_default_network_settings()
|
||||||
|
|
||||||
if (test_settings.REPLACE_DEFAULT_REPOS and
|
if (test_settings.REPLACE_DEFAULT_REPOS and
|
||||||
test_settings.REPLACE_DEFAULT_REPOS_ONLY_ONCE):
|
test_settings.REPLACE_DEFAULT_REPOS_ONLY_ONCE):
|
||||||
self.fuel_web.replace_default_repos()
|
self.fuel_web.replace_default_repos()
|
||||||
|
Loading…
Reference in New Issue
Block a user