diff options
Diffstat (limited to 'lib/python')
-rw-r--r-- | lib/python/apex/common/constants.py | 1 | ||||
-rw-r--r-- | lib/python/apex/common/utils.py | 8 | ||||
-rw-r--r-- | lib/python/apex/deploy_settings.py | 18 | ||||
-rw-r--r-- | lib/python/apex/inventory.py | 33 | ||||
-rw-r--r-- | lib/python/apex/network_environment.py | 47 | ||||
-rw-r--r-- | lib/python/apex/network_settings.py | 38 | ||||
-rwxr-xr-x | lib/python/apex_python_utils.py | 11 |
7 files changed, 95 insertions, 61 deletions
diff --git a/lib/python/apex/common/constants.py b/lib/python/apex/common/constants.py index 741bb4f8..3aa28eab 100644 --- a/lib/python/apex/common/constants.py +++ b/lib/python/apex/common/constants.py @@ -27,3 +27,4 @@ COMPUTE_PRE = "OS::TripleO::ComputeExtraConfigPre" CONTROLLER_PRE = "OS::TripleO::ControllerExtraConfigPre" PRE_CONFIG_DIR = "/usr/share/openstack-tripleo-heat-templates/puppet/" \ "extraconfig/pre_deploy/" +DEFAULT_ROOT_DEV = 'sda' diff --git a/lib/python/apex/common/utils.py b/lib/python/apex/common/utils.py index d623638c..8e6896fa 100644 --- a/lib/python/apex/common/utils.py +++ b/lib/python/apex/common/utils.py @@ -21,3 +21,11 @@ def parse_yaml(yaml_file): with open(yaml_file) as f: parsed_dict = yaml.safe_load(f) return parsed_dict + + +def write_str(bash_str, path=None): + if path: + with open(path, 'w') as file: + file.write(bash_str) + else: + print(bash_str) diff --git a/lib/python/apex/deploy_settings.py b/lib/python/apex/deploy_settings.py index 5490c6e9..3133d7f8 100644 --- a/lib/python/apex/deploy_settings.py +++ b/lib/python/apex/deploy_settings.py @@ -11,6 +11,8 @@ import yaml import logging +from .common import utils + REQ_DEPLOY_SETTINGS = ['sdn_controller', 'odl_version', 'sdn_l3', @@ -19,9 +21,10 @@ REQ_DEPLOY_SETTINGS = ['sdn_controller', 'dataplane', 'sfc', 'vpn', - 'vpp'] + 'vpp', + 'ceph'] -OPT_DEPLOY_SETTINGS = ['performance', 'vsperf'] +OPT_DEPLOY_SETTINGS = ['performance', 'vsperf', 'ceph_device'] VALID_ROLES = ['Controller', 'Compute', 'ObjectStorage'] VALID_PERF_OPTS = ['kernel', 'nova', 'vpp'] @@ -38,7 +41,7 @@ class DeploySettings(dict): """ def __init__(self, filename): init_dict = {} - if type(filename) is str: + if isinstance(filename, str): with open(filename, 'r') as deploy_settings_file: init_dict = yaml.safe_load(deploy_settings_file) else: @@ -81,6 +84,8 @@ class DeploySettings(dict): if req_set not in deploy_options: if req_set == 'dataplane': self['deploy_options'][req_set] = 'ovs' + elif req_set == 'ceph': + self['deploy_options'][req_set] = True else: self['deploy_options'][req_set] = False @@ -162,12 +167,7 @@ class DeploySettings(dict): if 'performance' in self['deploy_options']: bash_str += self._dump_performance() bash_str += self._dump_deploy_options_array() - - if path: - with open(path, 'w') as file: - file.write(bash_str) - else: - print(bash_str) + utils.write_str(bash_str, path) class DeploySettingsException(Exception): diff --git a/lib/python/apex/inventory.py b/lib/python/apex/inventory.py index aa219680..ce16ef41 100644 --- a/lib/python/apex/inventory.py +++ b/lib/python/apex/inventory.py @@ -10,21 +10,25 @@ import yaml import json +from .common import constants +from .common import utils + class Inventory(dict): """ This class parses an APEX inventory yaml file into an object. It generates or detects all missing fields for deployment. - It then collapses one level of identifcation from the object to + It then collapses one level of identification from the object to convert it to a structure that can be dumped into a json file formatted such that Triple-O can read the resulting json as an instackenv.json file. """ def __init__(self, source, ha=True, virtual=False): init_dict = {} - if type(source) is str: - with open(source, 'r') as network_settings_file: - yaml_dict = yaml.safe_load(network_settings_file) + self.root_device = constants.DEFAULT_ROOT_DEV + if isinstance(source, str): + with open(source, 'r') as inventory_file: + yaml_dict = yaml.safe_load(inventory_file) # collapse node identifiers from the structure init_dict['nodes'] = list(map(lambda n: n[1], yaml_dict['nodes'].items())) @@ -40,8 +44,13 @@ class Inventory(dict): node['pm_user'] = node['ipmi_user'] node['mac'] = [node['mac_address']] - for i in ('ipmi_ip', 'ipmi_pass', 'ipmi_user', 'mac_address'): - del i + for i in ('ipmi_ip', 'ipmi_pass', 'ipmi_user', 'mac_address', + 'disk_device'): + if i == 'disk_device' and 'disk_device' in node.keys(): + self.root_device = node[i] + else: + continue + del node[i] return node @@ -53,7 +62,7 @@ class Inventory(dict): 'nodes for HA baremetal deployment') elif len(self['nodes']) < 2: raise InventoryException('You must provide at least 2 nodes ' - 'for non-HA baremetal deployment${reset}') + 'for non-HA baremetal deployment') if virtual: self['arch'] = 'x86_64' @@ -67,6 +76,16 @@ class Inventory(dict): def dump_instackenv_json(self): print(json.dumps(dict(self), sort_keys=True, indent=4)) + def dump_bash(self, path=None): + """ + Prints settings for bash consumption. + + If optional path is provided, bash string will be written to the file + instead of stdout. + """ + bash_str = "{}={}\n".format('root_disk_list', str(self.root_device)) + utils.write_str(bash_str, path) + class InventoryException(Exception): def __init__(self, value): diff --git a/lib/python/apex/network_environment.py b/lib/python/apex/network_environment.py index ae5c602c..4fc6f583 100644 --- a/lib/python/apex/network_environment.py +++ b/lib/python/apex/network_environment.py @@ -21,6 +21,7 @@ from .common.constants import ( COMPUTE_PRE, PRE_CONFIG_DIR ) +from .network_settings import NetworkSettings HEAT_NONE = 'OS::Heat::None' PORTS = '/ports' @@ -63,15 +64,13 @@ class NetworkEnvironment(dict): Create Network Environment according to Network Settings """ init_dict = {} - if type(filename) is str: + if isinstance(filename, str): with open(filename, 'r') as net_env_fh: init_dict = yaml.safe_load(net_env_fh) super().__init__(init_dict) - try: - enabled_nets = net_settings.enabled_network_list - except: - raise NetworkEnvException('Invalid Network Setting object') + if not isinstance(net_settings, NetworkSettings): + raise NetworkEnvException('Invalid Network Settings object') self._set_tht_dir() @@ -86,19 +85,21 @@ class NetworkEnvironment(dict): nets[ADMIN_NETWORK]['installer_vm']['ip'] self[param_def]['DnsServers'] = net_settings['dns_servers'] - if EXTERNAL_NETWORK in enabled_nets: - external_cidr = nets[EXTERNAL_NETWORK][0]['cidr'] + if EXTERNAL_NETWORK in net_settings.enabled_network_list: + external_cidr = net_settings.get_network(EXTERNAL_NETWORK)['cidr'] self[param_def]['ExternalNetCidr'] = str(external_cidr) - if type(nets[EXTERNAL_NETWORK][0]['installer_vm']['vlan']) is int: + external_vlan = self._get_vlan(net_settings.get_network( + EXTERNAL_NETWORK)) + if isinstance(external_vlan, int): self[param_def]['NeutronExternalNetworkBridge'] = '""' - self[param_def]['ExternalNetworkVlanID'] = \ - nets[EXTERNAL_NETWORK][0]['installer_vm']['vlan'] - external_range = nets[EXTERNAL_NETWORK][0]['usable_ip_range'] + self[param_def]['ExternalNetworkVlanID'] = external_vlan + external_range = net_settings.get_network(EXTERNAL_NETWORK)[ + 'overcloud_ip_range'] self[param_def]['ExternalAllocationPools'] = \ [{'start': str(external_range[0]), 'end': str(external_range[1])}] self[param_def]['ExternalInterfaceDefaultRoute'] = \ - nets[EXTERNAL_NETWORK][0]['gateway'] + net_settings.get_network(EXTERNAL_NETWORK)['gateway'] if external_cidr.version == 6: postfix = '/external_v6.yaml' @@ -110,8 +111,8 @@ class NetworkEnvironment(dict): # apply resource registry update for EXTERNAL_RESOURCES self._config_resource_reg(EXTERNAL_RESOURCES, postfix) - if TENANT_NETWORK in enabled_nets: - tenant_range = nets[TENANT_NETWORK]['usable_ip_range'] + if TENANT_NETWORK in net_settings.enabled_network_list: + tenant_range = nets[TENANT_NETWORK]['overcloud_ip_range'] self[param_def]['TenantAllocationPools'] = \ [{'start': str(tenant_range[0]), 'end': str(tenant_range[1])}] @@ -123,7 +124,7 @@ class NetworkEnvironment(dict): postfix = '/tenant.yaml' tenant_vlan = self._get_vlan(nets[TENANT_NETWORK]) - if type(tenant_vlan) is int: + if isinstance(tenant_vlan, int): self[param_def]['TenantNetworkVlanID'] = tenant_vlan else: postfix = '/noop.yaml' @@ -131,8 +132,8 @@ class NetworkEnvironment(dict): # apply resource registry update for TENANT_RESOURCES self._config_resource_reg(TENANT_RESOURCES, postfix) - if STORAGE_NETWORK in enabled_nets: - storage_range = nets[STORAGE_NETWORK]['usable_ip_range'] + if STORAGE_NETWORK in net_settings.enabled_network_list: + storage_range = nets[STORAGE_NETWORK]['overcloud_ip_range'] self[param_def]['StorageAllocationPools'] = \ [{'start': str(storage_range[0]), 'end': str(storage_range[1])}] @@ -143,7 +144,7 @@ class NetworkEnvironment(dict): else: postfix = '/storage.yaml' storage_vlan = self._get_vlan(nets[STORAGE_NETWORK]) - if type(storage_vlan) is int: + if isinstance(storage_vlan, int): self[param_def]['StorageNetworkVlanID'] = storage_vlan else: postfix = '/noop.yaml' @@ -151,8 +152,8 @@ class NetworkEnvironment(dict): # apply resource registry update for STORAGE_RESOURCES self._config_resource_reg(STORAGE_RESOURCES, postfix) - if API_NETWORK in enabled_nets: - api_range = nets[API_NETWORK]['usable_ip_range'] + if API_NETWORK in net_settings.enabled_network_list: + api_range = nets[API_NETWORK]['overcloud_ip_range'] self[param_def]['InternalApiAllocationPools'] = \ [{'start': str(api_range[0]), 'end': str(api_range[1])}] @@ -163,7 +164,7 @@ class NetworkEnvironment(dict): else: postfix = '/internal_api.yaml' api_vlan = self._get_vlan(nets[API_NETWORK]) - if type(api_vlan) is int: + if isinstance(api_vlan, int): self[param_def]['InternalApiNetworkVlanID'] = api_vlan else: postfix = '/noop.yaml' @@ -184,9 +185,9 @@ class NetworkEnvironment(dict): self[param_def][flag] = True def _get_vlan(self, network): - if type(network['nic_mapping'][CONTROLLER]['vlan']) is int: + if isinstance(network['nic_mapping'][CONTROLLER]['vlan'], int): return network['nic_mapping'][CONTROLLER]['vlan'] - elif type(network['nic_mapping'][COMPUTE]['vlan']) is int: + elif isinstance(network['nic_mapping'][COMPUTE]['vlan'], int): return network['nic_mapping'][COMPUTE]['vlan'] else: return 'native' diff --git a/lib/python/apex/network_settings.py b/lib/python/apex/network_settings.py index c9f7d450..b04f141a 100644 --- a/lib/python/apex/network_settings.py +++ b/lib/python/apex/network_settings.py @@ -12,9 +12,8 @@ import logging import ipaddress from copy import copy - -from . import ip_utils from .common import utils +from . import ip_utils from .common.constants import ( CONTROLLER, COMPUTE, @@ -42,7 +41,7 @@ class NetworkSettings(dict): """ def __init__(self, filename): init_dict = {} - if type(filename) is str: + if isinstance(filename, str): with open(filename, 'r') as network_settings_file: init_dict = yaml.safe_load(network_settings_file) else: @@ -55,7 +54,7 @@ class NetworkSettings(dict): def merge(pri, sec): for key, val in sec.items(): if key in pri: - if type(val) is dict: + if isinstance(val, dict): merge(pri[key], val) # else # do not overwrite what's already there @@ -71,7 +70,14 @@ class NetworkSettings(dict): def get_network(self, network): if network == EXTERNAL_NETWORK and self['networks'][network]: - return self['networks'][network][0] + for net in self['networks'][network]: + if 'public' in net: + return net + + raise NetworkSettingsException("The external network, " + "'public', should be defined " + "when external networks are " + "enabled") else: return self['networks'][network] @@ -92,14 +98,11 @@ class NetworkSettings(dict): if _network.get('enabled', True): logging.info("{} enabled".format(network)) self._config_required_settings(network) - if network == EXTERNAL_NETWORK: - nicmap = _network['nic_mapping'] - else: - nicmap = _network['nic_mapping'] + nicmap = _network['nic_mapping'] iface = nicmap[CONTROLLER]['members'][0] self._config_ip_range(network=network, interface=iface, - ip_range='usable_ip_range', + ip_range='overcloud_ip_range', start_offset=21, end_offset=21) self.enabled_network_list.append(network) self._validate_overcloud_nic_order(network) @@ -137,7 +140,7 @@ class NetworkSettings(dict): if interfaces: interface = interfaces[0] - if type(_role.get('vlan', 'native')) is not int and \ + if not isinstance(_role.get('vlan', 'native'), int) and \ any(y == interface for x, y in self.nics[role].items()): raise NetworkSettingsException( "Duplicate {} already specified for " @@ -183,7 +186,6 @@ class NetworkSettings(dict): ip = ipaddress.ip_address(_network['installer_vm']['ip']) nic_if = ip_utils.get_interface(ucloud_if_list[0], ip.version) if nic_if: - ucloud_if_list = [nic_if] logging.info("{}_bridged_interface: {}". format(network, nic_if)) else: @@ -312,16 +314,16 @@ class NetworkSettings(dict): flatten lists to delim separated strings flatten dics to underscored key names and string values """ - if type(obj) is list: + if isinstance(obj, list): return "{}=\'{}\'\n".format(name, delim.join(map(lambda x: str(x), obj))) - elif type(obj) is dict: + elif isinstance(obj, dict): flat_str = '' for k in obj: flat_str += flatten("{}_{}".format(name, k), obj[k]) return flat_str - elif type(obj) is str: + elif isinstance(obj, str): return "{}='{}'\n".format(name, obj) else: return "{}={}\n".format(name, str(obj)) @@ -336,11 +338,7 @@ class NetworkSettings(dict): bash_str += flatten('dns_servers', self['dns_servers'], ' ') bash_str += flatten('domain_name', self['dns-domain'], ' ') bash_str += flatten('ntp_server', self['ntp_servers'][0], ' ') - if path: - with open(path, 'w') as file: - file.write(bash_str) - else: - print(bash_str) + utils.write_str(bash_str, path) def get_ip_addr_family(self,): """ diff --git a/lib/python/apex_python_utils.py b/lib/python/apex_python_utils.py index b0ebb270..e21d0464 100755 --- a/lib/python/apex_python_utils.py +++ b/lib/python/apex_python_utils.py @@ -22,7 +22,6 @@ from apex import NetworkEnvironment from apex import DeploySettings from apex import Inventory from apex import ip_utils -from apex.common.constants import ADMIN_NETWORK def parse_net_settings(args): @@ -66,7 +65,10 @@ def run_clean(args): def parse_inventory(args): inventory = Inventory(args.file, ha=args.ha, virtual=args.virtual) - inventory.dump_instackenv_json() + if args.export_bash is True: + inventory.dump_bash() + else: + inventory.dump_instackenv_json() def find_ip(args): @@ -200,6 +202,11 @@ def get_parser(): default=False, action='store_true', help='Indicate if deployment inventory is virtual') + inventory.add_argument('--export-bash', + default=False, + dest='export_bash', + action='store_true', + help='Export bash variables from inventory') inventory.set_defaults(func=parse_inventory) clean = subparsers.add_parser('clean', |