summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorTim Rozet <trozet@redhat.com>2016-07-15 22:04:24 -0400
committerTim Rozet <trozet@redhat.com>2016-07-18 16:35:00 -0400
commit1f5bede73d99f89a3cf1ec5fae7b30cee454b6c8 (patch)
tree79e4e8afde0585c07a98c770b79450d4dd24b8fb /lib
parent88d5b2462933cce79cb059c81e007ec83ee2cd9e (diff)
Allows specifying nic order for overcloud nodes in network settings
Currently there is no way to specify logically or physically the nic order to be used on overcloud nodes. We always hardcode to use nic1 for admin network, nic2 for private, etc. This patch allows a user to not only decide which logical nics to use for which network, but also specify physical interface names if they need to. This is done on a per role basis, due to tripleO limitation. So a user is able to specify nic order/names for compute and controller roles separately. If a user specifies nic order, they must specify it for all networks other than admin network. We assume if admin network is unspecified it uses "nic1", so that name is reserved in this case. A user is also allowed to specify a mixture of logical and physical names, for example "nic2" and "eth3" on another network. JIRA: APEX-151 Change-Id: Ie9d4abb463cf8f8788913cb4bcf9486830adc449 Signed-off-by: Tim Rozet <trozet@redhat.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/python/apex/common/constants.py1
-rw-r--r--lib/python/apex/network_settings.py48
-rwxr-xr-xlib/python/apex_python_utils.py10
3 files changed, 55 insertions, 4 deletions
diff --git a/lib/python/apex/common/constants.py b/lib/python/apex/common/constants.py
index 8ed49ff7..dfed33f8 100644
--- a/lib/python/apex/common/constants.py
+++ b/lib/python/apex/common/constants.py
@@ -15,3 +15,4 @@ API_NETWORK = 'api_network'
OPNFV_NETWORK_TYPES = [ADMIN_NETWORK, PRIVATE_NETWORK, PUBLIC_NETWORK,
STORAGE_NETWORK, API_NETWORK]
DNS_SERVERS = ["8.8.8.8", "8.8.4.4"]
+ROLES = ['compute', 'controller']
diff --git a/lib/python/apex/network_settings.py b/lib/python/apex/network_settings.py
index 50dd15c3..fd6c1455 100644
--- a/lib/python/apex/network_settings.py
+++ b/lib/python/apex/network_settings.py
@@ -31,6 +31,8 @@ class NetworkSettings:
self.settings_obj = yaml.load(network_settings_file)
self.network_isolation = network_isolation
self.enabled_network_list = []
+ self.nics = {'compute': dict(), 'controller': dict()}
+ self.nics_specified = {'compute': False, 'controller': False}
self._validate_input()
def _validate_input(self):
@@ -63,6 +65,7 @@ class NetworkSettings:
start_offset=21, end_offset=21)
self._config_optional_settings(network)
self.enabled_network_list.append(network)
+ self._validate_overcloud_nic_order(network)
else:
logging.info("{} disabled, will collapse with "
"admin_network".format(network))
@@ -73,6 +76,51 @@ class NetworkSettings:
self.settings_obj['dns_servers'] = self.settings_obj.get(
'dns_servers', constants.DNS_SERVERS)
+ def _validate_overcloud_nic_order(self, network):
+ """
+ Detects if nic order is specified per profile (compute/controller)
+ for network
+
+ If nic order is specified in a network for a profile, it should be
+ specified for every network with that profile other than admin_network
+
+ Duplicate nic names are also not allowed across different networks
+
+ :param network: network to detect if nic order present
+ :return: None
+ """
+
+ for role in constants.ROLES:
+ interface = role+'_interface'
+ nic_index = self.get_enabled_networks().index(network) + 1
+ if interface in self.settings_obj[network]:
+ if any(y == self.settings_obj[network][interface] for x, y in
+ self.nics[role].items()):
+ raise NetworkSettingsException("Duplicate {} already "
+ "specified for "
+ "another network"
+ .format(self.settings_obj
+ [network]
+ [interface]))
+ self.nics[role][network] = self.settings_obj[network][
+ interface]
+ self.nics_specified[role] = True
+ logging.info("{} nic order specified for network {"
+ "}".format(role, network))
+ elif self.nics_specified[role]:
+ logging.error("{} nic order not specified for network {"
+ "}".format(role, network))
+ raise NetworkSettingsException("Must specify {} for all "
+ "enabled networks (other than "
+ " admin) or not specify it for "
+ "any".format(interface))
+ else:
+ logging.info("{} nic order not specified for network {"
+ "}. Will use logical default "
+ "nic{}".format(interface, network, nic_index))
+ self.nics[role][network] = 'nic' + str(nic_index)
+ nic_index += 1
+
def _config_required_settings(self, network):
"""
Configures either CIDR or bridged_interface setting
diff --git a/lib/python/apex_python_utils.py b/lib/python/apex_python_utils.py
index 1a3cb159..bc9bc56f 100755
--- a/lib/python/apex_python_utils.py
+++ b/lib/python/apex_python_utils.py
@@ -22,7 +22,6 @@ from apex import NetworkSettings
from apex import NetworkEnvironment
from apex import DeploySettings
from apex import ip_utils
-from apex.common.constants import OPNFV_NETWORK_TYPES
from apex.common.constants import ADMIN_NETWORK
@@ -94,8 +93,9 @@ def build_nic_template(args):
"""
template_dir, template = args.template.rsplit('/', 1)
- settings = NetworkSettings(args.net_settings_file,
- args.network_isolation).settings_obj
+ network_settings = NetworkSettings(args.net_settings_file,
+ args.network_isolation)
+ settings = network_settings.settings_obj
env = Environment(loader=FileSystemLoader(template_dir))
template = env.get_template(template)
@@ -104,13 +104,15 @@ def build_nic_template(args):
net_list.remove(ADMIN_NETWORK)
vlans_vals = map(lambda x: settings[x]['vlan'], net_list)
vlans = dict(zip(net_list, vlans_vals))
+ nics = network_settings.nics
print(template.render(enabled_networks=args.enabled_networks,
role=args.role,
vlans=vlans,
external_net_type=args.ext_net_type,
external_net_af=args.address_family,
- ovs_dpdk_bridge=args.ovs_dpdk_bridge))
+ ovs_dpdk_bridge=args.ovs_dpdk_bridge,
+ nics=nics))
def get_parser():