diff --git a/ci/custom_ci_roles_data.yaml b/ci/custom_ci_roles_data.yaml index 4435285edb..c1df52255c 100644 --- a/ci/custom_ci_roles_data.yaml +++ b/ci/custom_ci_roles_data.yaml @@ -36,8 +36,6 @@ # Set uses_deprecated_params to True if any deprecated params are used. uses_deprecated_params: True deprecated_param_extraconfig: 'controllerExtraConfig' - deprecated_param_flavor: 'OvercloudControlFlavor' - deprecated_param_image: 'controllerImage' deprecated_nic_config_name: 'controller.yaml' update_serial: 1 ServicesDefault: @@ -206,10 +204,8 @@ # These deprecated_params only need to be used for existing roles and not for # composable roles. uses_deprecated_params: True - deprecated_param_image: 'NovaImage' deprecated_param_extraconfig: 'NovaComputeExtraConfig' deprecated_param_metadata: 'NovaComputeServerMetadata' - deprecated_param_scheduler_hints: 'NovaComputeSchedulerHints' deprecated_param_ips: 'NovaComputeIPs' deprecated_server_resource_name: 'NovaCompute' deprecated_nic_config_name: 'compute.yaml' diff --git a/deployed-server/deployed-server.yaml b/deployed-server/deployed-server.yaml index 04e194f4ff..40eec6a7e6 100644 --- a/deployed-server/deployed-server.yaml +++ b/deployed-server/deployed-server.yaml @@ -3,61 +3,15 @@ parameters: RootStackName: description: The name of the stack/plan. type: string - image: - type: string - default: unused - flavor: - type: string - default: unused - key_name: - type: string - default: unused - description: Name of keypair to assign to servers - security_groups: - type: json - default: [] - # Require this so we can validate the parent passes the - # correct value - user_data_format: - type: string - user_data: - type: string - default: '' name: type: string default: 'deployed-server' - image_update_policy: - type: string - default: '' - networks: - type: comma_delimited_list - default: '' metadata: type: json default: {} software_config_transport: default: POLL_SERVER_CFN type: string - scheduler_hints: - type: json - description: Optional scheduler hints to pass to nova - default: {} - UpgradeInitCommand: - type: string - description: | - Command or script snippet to run on all overcloud nodes to - initialize the upgrade process. E.g. a repository switch. - default: '' - tags: - - role_specific - UpgradeInitCommonCommand: - type: string - description: | - Common commands required by the upgrades process. This should not - normally be modified by the operator and is set and unset in the - major-upgrade-composable-steps.yaml and major-upgrade-converge.yaml - environment files. - default: '' ControlPlaneSubnet: default: ctlplane-subnet description: The name of the undercloud Neutron control plane subnet diff --git a/environments/composable-roles/monolithic-ha.yaml b/environments/composable-roles/monolithic-ha.yaml index b60992777e..2a5dcfce67 100644 --- a/environments/composable-roles/monolithic-ha.yaml +++ b/environments/composable-roles/monolithic-ha.yaml @@ -44,16 +44,3 @@ parameter_defaults: # NTP servers list. Defaulted to a set of pool.ntp.org servers in order to have a sane default for Pacemaker deployments when not configuring this parameter by default. # Type: comma_delimited_list NtpServer: ['0.pool.ntp.org', '1.pool.ntp.org', '2.pool.ntp.org', '3.pool.ntp.org'] - - # Name of the flavor for Ceph nodes - # Type: string - OvercloudCephStorageFlavor: ceph - - # Name of the flavor for Compute nodes - # Type: string - OvercloudComputeFlavor: compute - - # Name of the flavor for Controller nodes - # Type: string - OvercloudControllerFlavor: control - diff --git a/environments/composable-roles/monolithic-nonha.yaml b/environments/composable-roles/monolithic-nonha.yaml index 79177c8285..ed08e4332a 100644 --- a/environments/composable-roles/monolithic-nonha.yaml +++ b/environments/composable-roles/monolithic-nonha.yaml @@ -44,16 +44,3 @@ parameter_defaults: # NTP servers list. Defaulted to a set of pool.ntp.org servers in order to have a sane default for Pacemaker deployments when not configuring this parameter by default. # Type: comma_delimited_list NtpServer: ['0.pool.ntp.org', '1.pool.ntp.org', '2.pool.ntp.org', '3.pool.ntp.org'] - - # Name of the flavor for Ceph nodes - # Type: string - OvercloudCephStorageFlavor: ceph - - # Name of the flavor for Compute nodes - # Type: string - OvercloudComputeFlavor: compute - - # Name of the flavor for Controller nodes - # Type: string - OvercloudControllerFlavor: control - diff --git a/environments/composable-roles/standalone.yaml b/environments/composable-roles/standalone.yaml index 543d409cf3..c64527d90f 100644 --- a/environments/composable-roles/standalone.yaml +++ b/environments/composable-roles/standalone.yaml @@ -57,28 +57,3 @@ parameter_defaults: # NTP servers list. Defaulted to a set of pool.ntp.org servers in order to have a sane default for Pacemaker deployments when not configuring this parameter by default. # Type: comma_delimited_list NtpServer: ['0.pool.ntp.org', '1.pool.ntp.org', '2.pool.ntp.org', '3.pool.ntp.org'] - - # Name of the flavor for Ceph nodes - # Type: string - OvercloudCephStorageFlavor: ceph - - # Name of the flavor for Compute nodes - # Type: string - OvercloudComputeFlavor: compute - - # Name of the flavor for ControllerOpenstack nodes - # Type: string - OvercloudControllerOpenstackFlavor: control - - # Name of the flavor for Database nodes - # Type: string - OvercloudDatabaseFlavor: db - - # Name of the flavor for Messaging nodes - # Type: string - OvercloudMessagingFlavor: messaging - - # Name of the flavor for Networker nodes - # Type: string - OvercloudNetworkerFlavor: networker - diff --git a/environments/deployed-server-environment.j2.yaml b/environments/deployed-server-environment.j2.yaml index 0da423608a..a0a9a6338b 100644 --- a/environments/deployed-server-environment.j2.yaml +++ b/environments/deployed-server-environment.j2.yaml @@ -1,5 +1,4 @@ resource_registry: - OS::TripleO::Server: ../deployed-server/deployed-server.yaml OS::TripleO::DeployedServer::ControlPlanePort: OS::Neutron::Port {% for role in roles %} diff --git a/environments/deployed-server-noop-ctlplane.yaml b/environments/deployed-server-noop-ctlplane.yaml index 54f5e41deb..7ac8ed254b 100644 --- a/environments/deployed-server-noop-ctlplane.yaml +++ b/environments/deployed-server-noop-ctlplane.yaml @@ -1,3 +1,2 @@ resource_registry: - OS::TripleO::Server: ../deployed-server/deployed-server.yaml OS::TripleO::DeployedServer::ControlPlanePort: ../deployed-server/deployed-neutron-port.yaml diff --git a/environments/standalone/standalone-overcloud.yaml b/environments/standalone/standalone-overcloud.yaml index aa674ec3a5..f15a75fac2 100644 --- a/environments/standalone/standalone-overcloud.yaml +++ b/environments/standalone/standalone-overcloud.yaml @@ -30,10 +30,6 @@ parameter_defaults: # Type: comma_delimited_list NtpServer: ['0.pool.ntp.org', '1.pool.ntp.org', '2.pool.ntp.org', '3.pool.ntp.org'] - # Name of the flavor for Standalone nodes - # Type: string - OvercloudStandaloneFlavor: standalone - # Number of Standalone nodes # Type: number StandaloneCount: 1 diff --git a/firstboot/.gitkeep b/firstboot/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/firstboot/conntectx3_streering.yaml b/firstboot/conntectx3_streering.yaml deleted file mode 100644 index c19de1a77a..0000000000 --- a/firstboot/conntectx3_streering.yaml +++ /dev/null @@ -1,31 +0,0 @@ -heat_template_version: wallaby - -description: > - This's a temporary workaround for adding this option - "log_num_mgm_entry_size=-1" to /etc/modprobe.d/mlx4.conf file in order to - allow steering in ConnectX-3 devices - - -resources: - userdata: - type: OS::Heat::MultipartMime - properties: - parts: - - config: {get_resource: allow_steering} - allow_steering: - type: OS::Heat::SoftwareConfig - properties: - config: | - #!/bin/bash - set -x - echo "options mlx4_core log_num_mgm_entry_size=-1" >> /etc/modprobe.d/mlx4.conf - /sbin/dracut --force - -outputs: - # This means get_resource from the parent template will get the userdata, see: - # http://docs.openstack.org/developer/heat/template_guide/composition.html#making-your-template-resource-more-transparent - # Note this is new-for-kilo, an alternative is returning a value then using - # get_attr in the parent template instead. - OS::stack_id: - value: {get_resource: userdata} - diff --git a/firstboot/nvidia_firstboot.yaml b/firstboot/nvidia_firstboot.yaml deleted file mode 100644 index f76fd69c1e..0000000000 --- a/firstboot/nvidia_firstboot.yaml +++ /dev/null @@ -1,743 +0,0 @@ -heat_template_version: wallaby - -description: > - This's a temporary workaround for upgrading Nvidia mellanox NICs - FW and configuring them using mstflint tool - -parameters: - BIN_DIR_URL: - type: string - default: '' - description: 'URL of a directory containing Mellanox NIC Firmware' - FORCE_UPDATE: - type: boolean - default: False - description: "Force update the fw even if it's an older version" - DEV_WHITE_LIST: - type: comma_delimited_list - default: [] - description: list of MLNX devices PCIs to be processed. - If the value is empty, all MLNX devices will be processed. - Example, ['0000:04:00.0', '0000:81:00.0'] - Make sure to choose only the PCI ends with 0 - NUM_OF_VFS: - type: number - default: 32 - description: 'Max number of vfs' - SRIOV_EN: - type: boolean - default: True - description: 'Enable/Disable Sriov' - LINK_TYPE: - type: string - default: 'eth' - description: 'Link type ["eth", "ib"]' - ESWITCH_IPV4_TTL_MODIFY_ENABLE: - type: boolean - default: False - description: 'Enable TTL modification by E-Switch' - PRIO_TAG_REQUIRED_EN: - type: boolean - default: False - description: 'Priority tag required' - ESWITCH_HAIRPIN_TOT_BUFFER_SIZE: - type: json - default: {"*": "17"} - description: > - If a single key of "*" is provided, then its value will set to all indexes. - If you need to set configuration for a set of specific indexes, you can pass the - value as below for index 2 to be 17 and index 3 to be 16 - Example, {"2": "17", "3": "16"} - Make sure to choose only the PCI ends with 0 - ESWITCH_HAIRPIN_DESCRIPTORS: - type: json - default: {"*": "11"} - description: > - If a single key of "*" is provided, then its value will set to all indexes. - If you need to set configuration for a set of specific indexes, you can pass the - value as below for index 2 to be 17 and index 3 to be 16 - Example, {"2": "17", "3": "16"} - Make sure to choose only the PCI ends with 0 - BF_NIC_MODE: - type: boolean - default: False - description: > - A special parameter for BlueField SmartNICs, if the value is False, that means the - NIC in smart nic mode and it's going to set the following config: - "INTERNAL_CPU_PAGE_SUPPLIER": "ECPF", - "INTERNAL_CPU_ESWITCH_MANAGER": "ECPF", - "INTERNAL_CPU_IB_VPORT0": "ECPF", - "INTERNAL_CPU_OFFLOAD_ENGINE": "ENABLED", - If the value is True, that means the NIC in nic mode and it's going - to set the following config: - "INTERNAL_CPU_PAGE_SUPPLIER", "EXT_HOST_PF" - "INTERNAL_CPU_ESWITCH_MANAGER", "EXT_HOST_PF" - "INTERNAL_CPU_IB_VPORT0", "EXT_HOST_PF" - "INTERNAL_CPU_OFFLOAD_ENGINE", "DISABLED" - RESET_SYNC: - type: number - default: 0 - description: > - Run mstfwreset with the specified reset-sync [0,1], - The default and Current supported option now is 0 - - -resources: - userdata: - type: OS::Heat::MultipartMime - properties: - parts: - - config: {get_resource: nvidia_nic_fw_update} - - nvidia_nic_fw_update: - type: OS::Heat::SoftwareConfig - properties: - config: - str_replace: - template: | - #!/usr/bin/env python - - import logging - import os - import re - import shutil - import tempfile - import threading - - import six - from six.moves import html_parser - from six.moves.urllib import error as urlError - from six.moves.urllib import request as urlRequest - - from oslo_concurrency import processutils - - FW_VERSION_REGEX = r'FW Version:\s*\t*(?P\d+\.\d+\.\d+)' - RUNNING_FW_VERSION_REGEX = r'FW Version\(Running\):\s*\t*(?P\d+\.\d+\.\d+)' - PSID_REGEX = r'PSID:\s*\t*(?P\w+)' - ARRAY_VALUE_REGEX = r'Array\[(?P\d+)\.\.(?P\d+)\]' - ARRAY_PARAM_REGEX = r'(?P\w+)\[\d+\]' - - _DEV_WHITE_LIST = $DEV_WHITE_LIST - _FORCE_UPDATE = $FORCE_UPDATE - _BIN_DIR_URL = "$BIN_DIR_URL" - _BF_NIC_MODE = "$BF_NIC_MODE" - # TODO(adrianc): add configurable parameter for logging - logging.basicConfig( - filename='/var/log/nvidia_nic_fw_update.log', - filemode='w', - level=logging.DEBUG) - LOG = logging.getLogger("nvidia_nic_fw_update") - - _MLX_CONFIG = { - "SRIOV_EN": "$SRIOV_EN", - "NUM_OF_VFS": "$NUM_OF_VFS", - "LINK_TYPE_P1": "$LINK_TYPE", - "LINK_TYPE_P2": "$LINK_TYPE", - "ESWITCH_IPV4_TTL_MODIFY_ENABLE": "$ESWITCH_IPV4_TTL_MODIFY_ENABLE", - "PRIO_TAG_REQUIRED_EN": "$PRIO_TAG_REQUIRED_EN", - "ESWITCH_HAIRPIN_TOT_BUFFER_SIZE": $ESWITCH_HAIRPIN_TOT_BUFFER_SIZE, - "ESWITCH_HAIRPIN_DESCRIPTORS": $ESWITCH_HAIRPIN_DESCRIPTORS - } - if _BF_NIC_MODE.lower() == "false": - # It means we are in smart nic mode for BlueField device - _MLX_CONFIG["INTERNAL_CPU_PAGE_SUPPLIER"] = "ECPF" - _MLX_CONFIG["INTERNAL_CPU_ESWITCH_MANAGER"] = "ECPF" - _MLX_CONFIG["INTERNAL_CPU_IB_VPORT0"] = "ECPF" - _MLX_CONFIG["INTERNAL_CPU_OFFLOAD_ENGINE"] = "ENABLED" - _MLX_CONFIG["INTERNAL_CPU_RSHIM"] = "True" - else: - # It measn we are in nic mode for BlueField device - _MLX_CONFIG["INTERNAL_CPU_PAGE_SUPPLIER"] = "EXT_HOST_PF" - _MLX_CONFIG["INTERNAL_CPU_ESWITCH_MANAGER"] = "EXT_HOST_PF" - _MLX_CONFIG["INTERNAL_CPU_IB_VPORT0"] = "EXT_HOST_PF" - _MLX_CONFIG["INTERNAL_CPU_OFFLOAD_ENGINE"] = "DISABLED" - - _RESET_SYNC = $RESET_SYNC - - def run_command(*cmd, **kwargs): - try: - out, err = processutils.execute(*cmd, **kwargs) - except processutils.ProcessExecutionError as e: - LOG.error("Failed to execute %s, %s", ' '.join(cmd), str(e)) - raise e - if err: - LOG.warning("Got stderr output: %s" % err) - LOG.debug(out) - return out - - - def parse_mstflint_query_output(out): - """ Parse Mstflint query output - - For now just extract 'FW Version' and 'PSID' - - :param out: mstflint query output - :return: dictionary of query attributes - """ - query_info = {} - for line in out.split('\n'): - fw_ver = re.match(FW_VERSION_REGEX, line) - psid = re.match(PSID_REGEX, line) - running_fw_ver = re.match(RUNNING_FW_VERSION_REGEX, line) - if fw_ver: - query_info["fw_ver"] = fw_ver.group('fw_ver') - if running_fw_ver: - query_info["running_fw_ver"] = running_fw_ver.group('fw_ver') - if psid: - query_info["psid"] = psid.group('psid') - return query_info - - - class MlnxDevices(object): - """ Discover and retrieve Mellanox PCI devices. - - Can be used as an iterator once discover has been called. - """ - - def __init__(self, dev_white_list): - self._devs = [] - self._dev_white_list = dev_white_list - - def discover(self): - """ Discover Mellanox devices in the system. (first PF of every device) - - :return: None - """ - if self._devs: - return self._devs - - devs = [] - cmd = ['lspci', '-D', '-d', '15b3:'] - out = run_command(*cmd) - for line in out.split('\n'): - if not line: - continue - dev = line.split()[0] - if dev.endswith('.0') and (not self._dev_white_list or - dev in self._dev_white_list): - devs.append(dev) - self._devs = devs - LOG.info("Found Mellanox devices: %s", devs) - other_devs = set(self._dev_white_list) - set(devs) - if other_devs: - LOG.warning("Not all devices in PCI white list where discovered," - " %s these may not be nvidia devices or have their " - "PCI function set to non zero." % other_devs) - - def __len__(self): - return len(self._devs) - - def __iter__(self): - return self._devs.__iter__() - - - class MlnxConfigParamMetaData(object): - """ Metadata about a single mlxconfig parameter""" - - def __init__(self, name): - self.name = name - - class MlnxConfigArrayParamMetaData(MlnxConfigParamMetaData): - """ Metadata about a single mlxconfig array parameter""" - - def __init__(self, name, first_idx, last_idx): - super(MlnxConfigArrayParamMetaData, self).__init__(name) - self.first_index = int(first_idx) - self.last_index = int(last_idx) - - - class MlnxDeviceConfig(object): - """ Get/Set Mellanox Device configurations - """ - - def __init__(self, pci_dev): - self.pci_dev = pci_dev - self._tool_confs = None - # NOTE(adrianc) ATM contains only array type parameter metadata - self.mlnx_config_array_param_metadata = {} - - def _mstconfig_parse_data(self, data): - # Parsing the mstconfig out to json - data = list(filter(None, data.split('\n'))) - r = {} - c = 0 - for line in data: - c += 1 - if 'Configurations:' in line: - break - for i in range(c, len(data)): - d = list(filter(None, data[i].strip().split())) - r[d[0]] = d[1] - return r - - def get_device_conf_dict(self, param_name=None): - """ Get device Configurations - - :param param_name: if provided retireve only given configuration - :return: dict {"PARAM_NAME": "Param value", ....} - """ - LOG.info("Getting configurations for device: %s" % self.pci_dev) - cmd = ["mstconfig", "-d", self.pci_dev, "q"] - if param_name: - cmd.append(param_name) - out = run_command(*cmd) - return self._mstconfig_parse_data(out) - - def param_supp_by_config_tool(self, param_name): - """ Check if configuration tool supports the provided configuration - parameter. - - :param param_name: configuration name - :return: bool - """ - if self._tool_confs is None: - self._tool_confs = run_command( - "mstconfig", "-d", self.pci_dev, "i") - # trim any array index if present - indexed_param = re.match(ARRAY_PARAM_REGEX, param_name) - if indexed_param: - param_name = indexed_param.group('param_name') - return param_name in self._tool_confs - - def _build_config_param_metadata_map(self, conf_dict): - self.mlnx_config_array_param_metadata = {} - for param_name, val in six.iteritems(conf_dict): - array_val = re.match(ARRAY_VALUE_REGEX, val) - if array_val: - # Array parameter, extract first/last index - first_index = array_val.group('first_index') - last_index = array_val.group('last_index') - self.mlnx_config_array_param_metadata[param_name] = \ - MlnxConfigArrayParamMetaData( - param_name, first_index, last_index) - - def _inflate_array_param_vals_from_query(self, conf_dict): - """ Inflate provided conf dict with all values of array parameter""" - inflated_conf = {} - for param_name, val in six.iteritems(conf_dict): - if param_name in self.mlnx_config_array_param_metadata: - param_meta = self.mlnx_config_array_param_metadata[param_name] - first = param_meta.first_index - last = param_meta.last_index - arr_param_val = self.get_device_conf_dict( - param_name="%s[%s..%s]" % (param_name, first, last)) - # Add new keys to dict - for k, v in six.iteritems(arr_param_val): - inflated_conf[k] = v - else: - inflated_conf[param_name] = val - return inflated_conf - - def _inflate_single_array_input_val(self, param_name, val): - conf_dict = {} - param_meta = self.mlnx_config_array_param_metadata[param_name] - first = param_meta.first_index - last = param_meta.last_index - - if '*' in val: - if len(val) != 1: - raise RuntimeError( - "Invalid input for provided array type parameter. %s:%s" - % (param_name, val)) - - for idx in range(first, last + 1): - conf_dict["%s[%s]" % (param_name, idx)] = val['*'] - else: - for idx, idx_val in six.iteritems(val): - if int(idx) not in range(first, last + 1): - LOG.warning( - "Provided array param index(%s) is out of range " - "[%s..%s] skipping...", idx, first, last) - continue - conf_dict["%s[%s]" % (param_name, idx)] = str(idx_val) - return conf_dict - - def _inflate_array_param_vals_from_input(self, conf_dict): - """ Inflate provided conf dict with all values of array parameter""" - inflated_conf = {} - for param_name, val in six.iteritems(conf_dict): - if param_name in self.mlnx_config_array_param_metadata: - exp_inp = self._inflate_single_array_input_val(param_name, val) - # Add to conf_dict - for k, v in six.iteritems(exp_inp): - inflated_conf[k] = v - else: - inflated_conf[param_name] = val - - return inflated_conf - - def set_config(self, conf_dict): - """ Set device configurations - - :param conf_dict: a dictionary of: - {"PARAM_NAME": "Param value to set", ...} - :return: None - """ - current_mlx_config = self.get_device_conf_dict() - self._build_config_param_metadata_map(current_mlx_config) - current_mlx_config = self._inflate_array_param_vals_from_query( - current_mlx_config) - # inflate user input for array parameters - conf_dict = self._inflate_array_param_vals_from_input(conf_dict) - - params_to_set = [] - for key, value in conf_dict.items(): - if not self.param_supp_by_config_tool(key): - LOG.error( - "Configuraiton: %s is not supported by mstconfig," - " please update to the latest mstflint package." % key) - continue - - if current_mlx_config.get(key) and value.lower( - ) not in current_mlx_config.get(key).lower(): - # Aggregate all configurations required to be modified - params_to_set.append("%s=%s" % (key, value)) - - if params_to_set: - LOG.info("Setting configurations for device: %s" % self.pci_dev) - run_command("mstconfig", "-d", self.pci_dev, "-y", - "set", *params_to_set) - LOG.info("Set device configurations: Setting %s done successfully", - " ".join(params_to_set)) - else: - LOG.info("Set device configurations: No operation required") - - - class MlnxFirmwareBinary(object): - - def __init__(self, local_bin_path): - self.bin_path = local_bin_path - self.image_info = {} - - def get_info(self): - """ Get firmware information from binary - - Caller should wrap this call under try catch to skip non compliant - firmware binaries. - - :return: dict of firmware image attributes - """ - if self.image_info.get('file_path', '') == self.bin_path: - return self.image_info - self.image_info = {'file_path': self.bin_path} - cmd = ['mstflint', '-i', self.bin_path, 'query'] - out = run_command(*cmd) - self.image_info.update(parse_mstflint_query_output(out)) - # Note(adrianc): deep copy ? - return self.image_info - - - class MlnxFirmwareBinariesFetcher(object): - """ A class for fetching firmware binaries form a directory - provided by a URL link - - Note: URL MUST point to a directory and end with '/' - e.g http://www.mysite.com/mlnx_bins/ - """ - dest_dir = tempfile.mkdtemp(suffix="tripleo_mlnx_firmware") - - class FileHTMLParser(html_parser.HTMLParser): - """ A crude HTML Parser to extract files from an HTTP response. - """ - - def __init__(self, suffix): - # HTMLParser is Old style class dont use super() method - html_parser.HTMLParser.__init__(self) - self.matches = [] - self.suffix = suffix - - def handle_starttag(self, tag, attrs): - for name, val in attrs: - if name == 'href' and val.endswith(self.suffix): - self.matches.append(val) - - def __init__(self, url): - self.url = url - - def __del__(self): - self._cleanup_dest_dir() - - def _cleanup_dest_dir(self): - if os.path.exists(MlnxFirmwareBinariesFetcher.dest_dir): - shutil.rmtree(MlnxFirmwareBinariesFetcher.dest_dir) - - def _get_file_from_url(self, file_name): - try: - full_path = self.url + "/" + file_name - LOG.info("Downloading file: %s to %s", full_path, - MlnxFirmwareBinariesFetcher.dest_dir) - url_data = urlRequest.urlopen(full_path) - except urlError.HTTPError as e: - LOG.error("Failed to download data: %s", str(e)) - raise e - dest_file_path = os.path.join(MlnxFirmwareBinariesFetcher.dest_dir, - file_name) - with open(dest_file_path, 'wb') as f: - f.write(url_data.read()) - return dest_file_path - - def _get_file_create_bin_obj(self, file_name, fw_bins): - """ This wrapper method will download a firmware binary, - create MlnxFirmwareBinary object and append to the provided - fw_bins list. - - :return: None - """ - try: - dest_file_path = self._get_file_from_url(file_name) - fw_bin = MlnxFirmwareBinary(dest_file_path) - # Note(adrianc): Pre query image, to skip incompatible files - # in case of Error - fw_bin.get_info() - fw_bins.append(fw_bin) - except Exception as e: - LOG.warning("Failed to download and query %s, skipping file. " - "%s", file_name, str(e)) - - def get_firmware_binaries(self): - """ Get Firmware binaries - - :return: list containing the files downloaded - """ - # get list of files - # download into dest_dir - # for each file, create MlnxFirmwareBinary - # return list of the MlnxFirmwareBinary - if not self.url.endswith('/'): - LOG.error("Bad URL provided (%s), expected URL to be a directory", - self.url) - raise RuntimeError('Failed to get firmware binaries, ' - 'expected directory URL path ' - '(e.g "http:///mlnx_bins/"). ' - 'Given URL path: %s', self.url) - try: - index_data = str(urlRequest.urlopen(_BIN_DIR_URL).read()) - except urlError.HTTPError as err: - LOG.error(err) - raise err - parser = MlnxFirmwareBinariesFetcher.FileHTMLParser(suffix=".bin") - parser.feed(index_data) - parser.close() - if not parser.matches: - LOG.warning("No bin Files found in the provided URL: %s", self.url) - - fw_bins = [] - threads = [] - for file_name in parser.matches: - # TODO(adrianc) fetch files async with co-routines, - # may need to limit thread count - t = threading.Thread(target=self._get_file_create_bin_obj, - args=(file_name, fw_bins)) - t.start() - threads.append(t) - for t in threads: - t.join() - return fw_bins - - - class MlnxDevFirmwareOps(object): - """ Perform various Firmware related operations on device - """ - - def __init__(self, dev): - self.dev = dev - self.dev_info = {} - - def query_device(self, force=False): - """ Get firmware information from device - - :param force: force device query, even if query was executed in - previous calls. - :return: dict of firmware image attributes - """ - if not force and self.dev_info.get('device', '') == self.dev: - return self.dev_info - - self.dev_info = {'device': self.dev} - cmd = ['mstflint', '-d', self.dev, '-qq', 'query'] - out = run_command(*cmd) - self.dev_info = parse_mstflint_query_output(out) - # Note(adrianc): deep copy ? - return self.dev_info - - def need_update(self, image_info): - """ Check if device requires firmware update - - :param image_info: image_info dict as returned from - MlnxFirmwareBinary.get_info() - :return: bool, True if update is needed - """ - if not self.dev_info: - self.query_device() - LOG.info("Device firmware version: %s, Image firmware version: %s" % - (self.dev_info['fw_ver'], image_info['fw_ver'])) - return self.dev_info['fw_ver'] < image_info['fw_ver'] - - def need_reset_before_config(self): - """ Check if device requires firmware reset before applying any - configurations on the device. - - :return: (bool, bool) True if reset is needed, - True if skip_fms_sync is needed - """ - self.query_device(force=True) - next_boot_image_newer = 'running_fw_ver' in self.dev_info and \ - self.dev_info['running_fw_ver'] < self.dev_info['fw_ver'] - if next_boot_image_newer: - mandatory_params = ["ESWITCH_IPV4_TTL_MODIFY_ENABLE", - "PRIO_TAG_REQUIRED_EN", - "INTERNAL_CPU_PAGE_SUPPLIE", - "INTERNAL_CPU_ESWITCH_MANAGE", - "INTERNAL_CPU_IB_VPORT0", - "INTERNAL_CPU_OFFLOAD_ENGINE"] - device_config = MlnxDeviceConfig(self.dev) - conf_dict = device_config.get_device_conf_dict() - for param in mandatory_params: - if param not in conf_dict and \ - device_config.param_supp_by_config_tool(param): - if "INTERNAL_CPU_MODEL" in conf_dict: - if self.dev_info['running_fw_ver'] < "24.32.0000": - # In case the device is BlueField and the FW is less than Nov release - # return True, True to do reset with skip_fms_sync - return True, True - elif (self.dev_info['running_fw_ver'] >= "24.32.0000" and - self.dev_info['running_fw_ver'] < "24.33.0000"): - # In case the device is BlueField and the FW is from Nov release - # reset will fail, so don't do it - return False, False - return True, False - return False, False - - def burn_firmware(self, image_path): - """ Burn firmware on device - - :param image_path: firmware binary file path - :return: None - """ - LOG.info("Updating firmware image (%s) for device: %s", - image_path, self.dev) - cmd = ["mstflint", "-d", self.dev, "-i", image_path, - "-y", "burn"] - run_command(*cmd) - LOG.info("Device %s: Successfully updated.", self.dev) - - def reset_device(self, skip_fms_sync=False): - """ Reset firmware - - :return: None - """ - LOG.info("Device %s: Performing firmware reset.", self.dev) - if skip_fms_sync: - cmd = ["mstfwreset", "-d", self.dev, "--skip_fsm_sync", "-y", - "--sync", _RESET_SYNC, "reset"] - else: - cmd = ["mstfwreset", "-d", self.dev, "-y", "reset"] - run_command(*cmd) - LOG.info("Device %s: Firmware successfully reset.", self.dev) - - - def check_prereq(): - """ Check that all needed tools are available in the system. - - :return: None - """ - try: - # check for mstflint - run_command('mstflint', '-v') - # check for mstconfig - run_command('mstconfig', '-v') - # check for mstfwreset - run_command('mstfwreset', '-v') - # check for lspci - run_command('lspci', '--version') - except Exception as e: - LOG.error("Failed Prerequisite check. %s", str(e)) - raise e - - - def process_device(pci_dev, psid_map): - """ Process a single Mellanox device. - - Processing pipeline: - - Perform firmware update if required - - Reset device to load firmware if required - - Perform device configurations if required - - :param pci_dev: nvidia nic PCI device address (String) - :param psid_map: dict mapping between PSID and an image_info dict - :return: None - """ - try: - LOG.info("Processing Device: %s", pci_dev) - dev_ops = MlnxDevFirmwareOps(pci_dev) - device_config = MlnxDeviceConfig(pci_dev) - dev_query = dev_ops.query_device() - # see if there is a matching bin - dev_psid = dev_query['psid'] - if dev_psid in psid_map: - if _FORCE_UPDATE or dev_ops.need_update(psid_map[dev_psid]): - dev_ops.burn_firmware(psid_map[dev_psid]['file_path']) - else: - LOG.info("Firmware update is not required for Device.") - else: - LOG.info("No firmware binary found for device %s with " - "PSID: %s, skipping...", pci_dev, dev_psid) - # check if reset is required. - # Note: device Reset is required if a newer firmware version was burnt - # and current firmware does not support some mandatory configurations. - # Note: skip_fms_sync is required if device is BlueField SmartNIC and - # the current FW is less than Nov release - need_rest, need_skip_fms_sync = dev_ops.need_reset_before_config() - if need_rest: - dev_ops.reset_device(skip_fms_sync=need_skip_fms_sync) - # set device configurations - device_config.set_config(_MLX_CONFIG) - LOG.info("Device %s processed successfully.", pci_dev) - except Exception as e: - LOG.error("Failed to process device %s. %s", pci_dev, str(e)) - - - def main(): - check_prereq() - # discover devices - mlnx_devices = MlnxDevices(_DEV_WHITE_LIST) - mlnx_devices.discover() - # get binaries and prep psid map - psid_map = {} - if _BIN_DIR_URL: - binary_getter = MlnxFirmwareBinariesFetcher(_BIN_DIR_URL) - fw_binaries = binary_getter.get_firmware_binaries() - - for fw_bin in fw_binaries: - image_info = fw_bin.get_info() - psid_map[image_info['psid']] = image_info - # process devices - for pci_dev in mlnx_devices: - process_device(pci_dev, psid_map) - - - if __name__ == '__main__': - main() - - params: - $BIN_DIR_URL: {get_param: BIN_DIR_URL} - $FORCE_UPDATE: {get_param: FORCE_UPDATE} - $DEV_WHITE_LIST: {get_param: DEV_WHITE_LIST} - $NUM_OF_VFS: {get_param: NUM_OF_VFS} - $SRIOV_EN: {get_param: SRIOV_EN} - $LINK_TYPE: {get_param: LINK_TYPE} - $ESWITCH_IPV4_TTL_MODIFY_ENABLE: {get_param: ESWITCH_IPV4_TTL_MODIFY_ENABLE} - $PRIO_TAG_REQUIRED_EN: {get_param: PRIO_TAG_REQUIRED_EN} - $ESWITCH_HAIRPIN_TOT_BUFFER_SIZE: {get_param: ESWITCH_HAIRPIN_TOT_BUFFER_SIZE} - $ESWITCH_HAIRPIN_DESCRIPTORS: {get_param: ESWITCH_HAIRPIN_DESCRIPTORS} - $BF_NIC_MODE: {get_param: BF_NIC_MODE} - $RESET_SYNC: {get_param: RESET_SYNC} - - -outputs: - # This means get_resource from the parent template will get the userdata, see: - # http://docs.openstack.org/developer/heat/template_guide/composition.html#making-your-template-resource-more-transparent - # Note this is new-for-kilo, an alternative is returning a value then using - # get_attr in the parent template instead. - OS::stack_id: - value: {get_resource: userdata} diff --git a/firstboot/os-net-config-mappings.yaml b/firstboot/os-net-config-mappings.yaml deleted file mode 100644 index 59964c8a7a..0000000000 --- a/firstboot/os-net-config-mappings.yaml +++ /dev/null @@ -1,51 +0,0 @@ -heat_template_version: wallaby - -description: > - DEPRECATED! Configure os-net-config mappings for specific nodes - - DEPRECATION NOTE: - This template has been replaced by an ansible module in tripleo-ansible. - The parameter NetConfigDataLookup is still used, and the input format remain the same for compatibility. - -parameters: - # Note this requires a liberty heat or newer in the undercloud due to - # the 2015-10-15 (which is required to enable str_replace serializing - # the json parameter to json, another approch with a string parameter - # will be required for older heat versions) - NetConfigDataLookup: - type: json - default: {} - description: > - Configure os-net-config mappings for specific nodes - Your environment file needs to look like: - parameter_defaults: - NetConfigDataLookup: - node1: - nic1: "00:c8:7c:e6:f0:2e" - node2: - nic1: "00:18:7d:99:0c:b6" - node3: - dmiString: 'system-uuid' - id: 'A8C85861-1B16-4803-8689-AFC62984F8F6' - nic1: em3 - # Dell PowerEdge - nodegroup1: - dmiString: "system-product-name" - id: "PowerEdge R630" - nic1: em3 - nic2: em1 - nic3: em2 - # Cisco UCS B200-M4" - nodegroup2: - dmiString: "system-product-name" - id: "UCSB-B200-M4" - nic1: enp7s0 - nic2: enp6s0 - - This will result in the first node* entry where either a mac matches a - local device or a DMI String matches the specified id being written as a - mapping file for os-net-config. (/etc/os-net-config/mapping.yaml) - -resources: - OsNetConfigMappings: - type: OS::Heat::None diff --git a/firstboot/userdata_default.yaml b/firstboot/userdata_default.yaml deleted file mode 100644 index 37e8fa1f99..0000000000 --- a/firstboot/userdata_default.yaml +++ /dev/null @@ -1,20 +0,0 @@ -heat_template_version: wallaby - -description: > - This is a default no-op template which provides empty user-data - which can be passed to the OS::Nova::Server resources. - This template can be replaced with a different implementation via - the resource registry, such that deployers may customize their - first-boot configuration. - -resources: - userdata: - type: OS::Heat::MultipartMime - -outputs: - # This means get_resource from the parent template will get the userdata, see: - # http://docs.openstack.org/developer/heat/template_guide/composition.html#making-your-template-resource-more-transparent - # Note this is new-for-kilo, an alternative is returning a value then using - # get_attr in the parent template instead. - OS::stack_id: - value: {get_resource: userdata} diff --git a/firstboot/userdata_dev_rsync.yaml b/firstboot/userdata_dev_rsync.yaml deleted file mode 100644 index f8490dd7b3..0000000000 --- a/firstboot/userdata_dev_rsync.yaml +++ /dev/null @@ -1,49 +0,0 @@ -heat_template_version: wallaby - -description: > - This is first boot configuration for development purposes. It allows - overriding contents of the deployed images via rsync before - configuration (e.g. Puppet) starts, speeding up the feedback loop - between making a change and seeing it applied. - - To prepare the host, put something like this to /etc/rsyncd.conf: - - [overcloudsync] - path = /root/overcloudsync - comment = overcloud pre-puppet customizations - - Then run `rsync --daemon`. - -parameters: - dev_rsync_host: - type: string - default: 192.168.122.1 - description: Host to sync contents from via rsync - dev_rsync_module: - type: string - default: overcloudsync - description: Name of the module defined in rsyncd.conf on rsync_host - -resources: - userdata: - type: OS::Heat::MultipartMime - properties: - parts: - - config: {get_resource: rsync_config} - subtype: 'x-shellscript' - - rsync_config: - type: OS::Heat::SoftwareConfig - properties: - config: - str_replace: - template: | - #!/bin/bash - rsync -avr rsync://RSYNC_HOST/RSYNC_MODULE / - params: - RSYNC_HOST: {get_param: dev_rsync_host} - RSYNC_MODULE: {get_param: dev_rsync_module} - -outputs: - OS::stack_id: - value: {get_resource: userdata} diff --git a/firstboot/userdata_example.yaml b/firstboot/userdata_example.yaml deleted file mode 100644 index 77983fb6bc..0000000000 --- a/firstboot/userdata_example.yaml +++ /dev/null @@ -1,59 +0,0 @@ -heat_template_version: wallaby - -# NOTE: You don't need to pass the parameter explicitly from the -# parent template, it can be specified via the parameter_defaults -# in the resource_registry instead, if you want to override the default -# and/or share values with other templates in the tree. -parameters: - extra_username: - type: string - default: extrauser - -description: > - This is an example showing how you can do firstboot configuration - of the nodes via cloud-init. To enable this, replace the default - mapping of OS::TripleO::NodeUserData in ../overcloud_resource_registry* - -resources: - userdata: - type: OS::Heat::MultipartMime - properties: - parts: - - config: {get_resource: user_config} - - config: {get_resource: ssh_config} - - # Get cloud-init to create an extra user, in addition to the default for the - # distro. Note there are various options, including configuring ssh keys, - # but atm I can only see how to specify the keys explicitly, not via metadata - user_config: - type: OS::Heat::CloudConfig - properties: - cloud_config: - users: - - default - - name: {get_param: extra_username} - - # Setup ssh key for the extra user to match the key installed for the default - # user, e.g that provided via the nova keypair on instance boot - ssh_config: - type: OS::Heat::SoftwareConfig - properties: - config: - str_replace: - template: | - #!/bin/bash - mkdir -p /home/$user/.ssh - chmod 700 /home/$user/.ssh - os-apply-config --key public-keys.0.openssh-key --type raw > /home/$user/.ssh/authorized_keys - chmod 600 /home/$user/.ssh/authorized_keys - chown -R $user:$user /home/$user/.ssh - params: - $user: {get_param: extra_username} - -outputs: - # This means get_resource from the parent template will get the userdata, see: - # http://docs.openstack.org/developer/heat/template_guide/composition.html#making-your-template-resource-more-transparent - # Note this is new-for-kilo, an alternative is returning a value then using - # get_attr in the parent template instead. - OS::stack_id: - value: {get_resource: userdata} diff --git a/firstboot/userdata_heat_admin.yaml b/firstboot/userdata_heat_admin.yaml deleted file mode 100644 index 371aea4644..0000000000 --- a/firstboot/userdata_heat_admin.yaml +++ /dev/null @@ -1,35 +0,0 @@ -heat_template_version: wallaby - -parameters: - # Can be overridden via parameter_defaults in the environment - node_admin_username: - type: string - default: heat-admin - - node_admin_extra_ssh_keys: - type: comma_delimited_list - default: [] - -description: > - Uses cloud-init to create an additional user with a known name, in addition - to the distro-default user created by the cloud-init default. - -resources: - userdata: - type: OS::Heat::MultipartMime - properties: - parts: - - config: {get_resource: user_config} - - # Note this requires cloud-init >= 0.7.2 ref bug #1100920 - user_config: - type: OS::Heat::CloudConfig - properties: - cloud_config: - user: {get_param: node_admin_username} - ssh_authorized_keys: {get_param: node_admin_extra_ssh_keys} - - -outputs: - OS::stack_id: - value: {get_resource: userdata} diff --git a/firstboot/userdata_root_password.yaml b/firstboot/userdata_root_password.yaml deleted file mode 100644 index 9080097797..0000000000 --- a/firstboot/userdata_root_password.yaml +++ /dev/null @@ -1,38 +0,0 @@ -heat_template_version: wallaby - -description: > - Uses cloud-init to enable root logins and set the root password. - Note this is less secure than the default configuration and may not be - appropriate for production environments, it's intended for illustration - and development/debugging only. - -parameters: - NodeRootPassword: - description: Root password for the nodes - hidden: true - type: string - -resources: - userdata: - type: OS::Heat::MultipartMime - properties: - parts: - - config: {get_resource: root_config} - - root_config: - type: OS::Heat::CloudConfig - properties: - cloud_config: - ssh_pwauth: true - disable_root: false - chpasswd: - list: - str_replace: - template: "root:PASSWORD" - params: - PASSWORD: {get_param: NodeRootPassword} - expire: False - -outputs: - OS::stack_id: - value: {get_resource: userdata} diff --git a/firstboot/userdata_timesync.yaml b/firstboot/userdata_timesync.yaml deleted file mode 100644 index 3134135176..0000000000 --- a/firstboot/userdata_timesync.yaml +++ /dev/null @@ -1,98 +0,0 @@ -heat_template_version: wallaby - -parameters: - NtpServer: - default: ['0.pool.ntp.org', '1.pool.ntp.org', '2.pool.ntp.org', '3.pool.ntp.org'] - description: NTP servers list. Defaulted to a set of pool.ntp.org servers - in order to have a sane default for Pacemaker deployments when - not configuring this parameter by default. - type: comma_delimited_list - NtpPool: - default: [] - description: NTP pool list. Defaults to [], so only NtpServer is used by - default. - type: comma_delimited_list - NtpService: - default: chrony - description: NTP Service to use for the timesync bootstrap. - type: string - - -description: > - Uses cloud-init to bootstrap timesync configuration to ensure it is done - as soon as possible. We do additional and more complex configurations as - part of the deployment itself. - -conditions: - use_chrony: {equals: [{get_param: NtpService}, 'chrony']} - -resources: - userdata: - type: OS::Heat::MultipartMime - properties: - parts: - - config: {get_resource: timesync_chrony} - - config: {get_resource: timesync_sync} - - # chrony sync needs chrony to be configured, if not chrony just exit - timesync_chrony: - type: OS::Heat::SoftwareConfig - properties: - config: - str_replace: - template: | - #!/bin/bash - if [ "$service" != "chrony" ]; then - exit 0 - fi - set -x - SERVERS="$ntp_servers" - POOLS="$ntp_pools" - systemctl is-active --quiet chronyd || systemctl start chronyd - for server in $SERVERS; do - chronyc add server "${server}" iburst - done - for pool in $POOLS; do - chronyc add server "${pool}" iburst - done - chronyc sources - params: - $ntp_servers: - list_join: [' ', {get_param: NtpServer}] - $ntp_pools: - list_join: [' ', {get_param: NtpPool}] - $service: {get_param: NtpService} - - # attempt a timesync on boot to ensure the time has been synced - timesync_sync: - type: OS::Heat::SoftwareConfig - properties: - config: - str_replace: - template: | - #!/bin/bash - set -xe - if [ "$service" = "chrony" ]; then - if command -v chronyc >/dev/null; then - chronyc makestep - chronyc waitsync 30 - else - echo "No chronyc available, skipping sync" - fi - elif [ "$service" = "ntp" ]; then - if command -v ntpdate >/dev/null; then - ntpdate -u $ntp_servers - else - echo "No ntpdate available, skipping sync" - fi - fi - hwclock --systohc --utc - params: - $service: {get_param: NtpService} - $ntp_servers: - list_join: [' ', {get_param: NtpServer}] - - -outputs: - OS::stack_id: - value: {get_resource: userdata} diff --git a/overcloud-resource-registry-puppet.j2.yaml b/overcloud-resource-registry-puppet.j2.yaml index 668eb5d277..c1ca3343e1 100644 --- a/overcloud-resource-registry-puppet.j2.yaml +++ b/overcloud-resource-registry-puppet.j2.yaml @@ -34,29 +34,15 @@ resource_registry: OS::TripleO::{{role.name}}ServiceServerMetadataHook: OS::Heat::None {%- endfor %} - OS::TripleO::Server: OS::Nova::Server + OS::TripleO::Server: deployed-server/deployed-server.yaml {% for role in roles %} OS::TripleO::{{role.name}}Server: OS::TripleO::Server {% endfor %} - # This creates the "heat-admin" user for all OS images by default - # To disable, replace with firstboot/userdata_default.yaml - OS::TripleO::NodeAdminUserData: firstboot/userdata_heat_admin.yaml - - # This bootstraps the timesync configuration for any subsequent deployment - # operations. To disable, replace with firstboot/userdata_default.yaml - OS::TripleO::NodeTimesyncUserData: firstboot/userdata_timesync.yaml - # Hooks for operator extra config - # NodeUserData == Cloud-init additional user-data, e.g cloud-config - # role::NodeUserData == Role specific cloud-init additional user-data # ControllerExtraConfigPre == Controller configuration pre service deployment # NodeExtraConfig == All nodes configuration pre service deployment # NodeExtraConfigPost == All nodes configuration post service deployment - OS::TripleO::NodeUserData: firstboot/userdata_default.yaml -{% for role in roles %} - OS::TripleO::{{role.name}}::NodeUserData: firstboot/userdata_default.yaml -{% endfor %} OS::TripleO::NodeTLSCAData: OS::Heat::None OS::TripleO::NodeTLSData: OS::Heat::None OS::TripleO::NodeExtraConfig: puppet/extraconfig/pre_deploy/default.yaml diff --git a/overcloud.j2.yaml b/overcloud.j2.yaml index e239203fd4..f1b9c03138 100644 --- a/overcloud.j2.yaml +++ b/overcloud.j2.yaml @@ -288,17 +288,6 @@ parameters: append to the existing blacklist and 'update' would replace the blacklist. - {{role.name}}SchedulerHints: - type: json - description: Optional scheduler hints to pass to nova - default: {} -{%- if role.deprecated_param_scheduler_hints is defined %} - {{role.deprecated_param_scheduler_hints}}: - type: json - description: DEPRECATED - use {{role.name}}SchedulerHints instead - default: {} -{%- endif %} - {{role.name}}Parameters: type: json description: Optional Role Specific parameters to be provided to service @@ -422,24 +411,11 @@ parameters: default: 'regionOne' description: Keystone region for endpoint -{% for role in roles %} -{%- if role.deprecated_param_scheduler_hints is defined or role.deprecated_param_extraconfig is defined %} -{%- if not parameter_groups_defined|default(false) %} parameter_groups: - label: deprecated description: Do not use deprecated params, they will be removed. parameters: - DnsServers -{%- set parameter_groups_defined = true %} -{%- endif %} -{%- endif %} -{%- if role.deprecated_param_scheduler_hints is defined %} - - {{role.deprecated_param_scheduler_hints}} -{%- endif %} -{%- if role.deprecated_param_extraconfig is defined %} - - {{role.deprecated_param_extraconfig}} -{%- endif %} -{%- endfor %} conditions: add_vips_to_etc_hosts: {equals : [{get_param: AddVipsToEtcHosts}, True]} @@ -616,22 +592,6 @@ resources: - NovaMetadataCellInternal: {get_attr: [EndpointMap, endpoint_map, NovaMetadataInternal]} - {} - # Creates the "heat-admin" user if configured via the environment - # Should return a OS::Heat::MultipartMime reference via OS::stack_id - NodeAdminUserData: - type: OS::TripleO::NodeAdminUserData - - # Bootstraps an ntp configuration and includes a hardware clock sync to - # for containers. - # Should return a OS::Heat::MultipartMime reference via OS::stack_id - NodeTimesyncUserData: - type: OS::TripleO::NodeTimesyncUserData - - # For optional operator additional userdata - # Should return a OS::Heat::MultipartMime reference via OS::stack_id - NodeUserData: - type: OS::TripleO::NodeUserData - # Jinja loop for Role in roles_data.yaml {% for role in roles %} # Resources generated for {{role.name}} Role @@ -781,25 +741,6 @@ resources: data: - {get_attr: [{{role.name}}, hostname_map]} - # Combine the NodeAdminUserData and NodeUserData mime archives - {{role.name}}UserData: - type: OS::Heat::MultipartMime - properties: - parts: - - config: {get_resource: NodeAdminUserData} - type: multipart - - config: {get_resource: NodeTimesyncUserData} - type: multipart - - config: {get_resource: NodeUserData} - type: multipart - - config: {get_resource: {{role.name}}RoleUserData} - type: multipart - - # For optional operator role-specific userdata - # Should return a OS::Heat::MultipartMime reference via OS::stack_id - {{role.name}}RoleUserData: - type: OS::TripleO::{{role.name}}::NodeUserData - {{role.name}}: type: OS::Heat::ResourceGroup depends_on: Networks @@ -825,14 +766,6 @@ resources: params: '%stackname%': {get_param: 'OS::stack_name'} NodeIndex: '%index%' - # Note, SchedulerHints must be defined here, not only in the - # nested template, as it can contain %index% - {{role.name}}SchedulerHints: - map_merge: - {%- if role.deprecated_param_scheduler_hints is defined %} - - {get_param: {{role.deprecated_param_scheduler_hints}}} - {%- endif %} - - {get_param: {{role.name}}SchedulerHints} ServiceNames: {get_attr: [{{role.name}}ServiceNames, value]} ServiceMetadataSettings: {get_attr: [{{role.name}}ServiceChainRoleData, value, service_metadata_settings]} OVNBridgeMappings: {get_attr: [{{role.name}}ServiceChainRoleData, value, config_settings, 'ovn::controller::ovn_bridge_mappings']} @@ -841,7 +774,6 @@ resources: map_merge: - {{role.RoleParametersDefault|default({})}} - get_param: {{role.name}}Parameters - UserData: {get_resource: {{role.name}}UserData} {%- endfor %} {%- for role in roles %} diff --git a/puppet/role.role.j2.yaml b/puppet/role.role.j2.yaml index 76f74f2435..e3ba009ef0 100644 --- a/puppet/role.role.j2.yaml +++ b/puppet/role.role.j2.yaml @@ -5,36 +5,6 @@ heat_template_version: wallaby description: 'OpenStack {{role.name}} node configured by Puppet' parameters: -{%- set default_flavor_name = role.FlavorDefault|default('baremetal') %} -{%- if role.deprecated_param_flavor is defined %} - {{role.deprecated_param_flavor}}: - description: DEPRECATED Use Overcloud{{role.name}}Flavor instead. - default: {{default_flavor_name}} - type: string -{%- endif %} - Overcloud{{role.name}}Flavor: - description: Flavor for the {{role.name}} node. - default: {{default_flavor_name}} - type: string -{%- set default_image_name = role.ImageDefault|default('overcloud-full') %} -{%- if role.deprecated_param_image is defined %} - {{role.deprecated_param_image}}: - type: string - default: {{default_image_name}} - description: DEPRECATED Use {{role.name}}Image instead -{%- endif %} - {{role.name}}Image: - type: string - default: {{default_image_name}} - description: The disk image file to use for the role. - ImageUpdatePolicy: - default: 'REBUILD_PRESERVE_EPHEMERAL' - description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt. - type: string - KeyName: - description: Name of an existing Nova key pair to enable SSH access to the instances - type: string - default: default ServiceNetMap: default: {} description: Mapping of service_name -> network name. Typically set @@ -101,10 +71,6 @@ parameters: the overcloud. It's accessible via the Nova metadata API. This applies to all roles and is merged with a role-specific metadata parameter. type: json - {{role.name}}SchedulerHints: - type: json - description: Optional scheduler hints to pass to nova - default: {} NodeIndex: type: number default: 0 @@ -178,21 +144,6 @@ parameters: constraints: - allowed_values: [delete, retain] - UserData: - type: string - -{% if role.uses_deprecated_params|default(false) %} -parameter_groups: -- label: deprecated - description: Do not use deprecated params, they will be removed. - parameters: -{%- for property in role %} -{%- if property.startswith('deprecated_param_') and not role[property].endswith(('SchedulerHints', 'ExtraConfig')) %} - - {{role[property]}} -{%- endif %} -{%- endfor %} -{%- endif %} - conditions: server_blacklisted: equals: @@ -203,20 +154,6 @@ conditions: equals: - {get_param: [DeploymentServerBlacklistDict, {get_param: Hostname}]} - 1 -{%- if role.deprecated_param_image is defined %} - deprecated_param_image_set: - not: - equals: - - {get_param: {{role.deprecated_param_image}}} - - {{default_image_name}} -{%- endif %} -{%- if role.deprecated_param_flavor is defined %} - deprecated_param_flavor_set: - not: - equals: - - {get_param: {{role.deprecated_param_flavor}}} - - {{default_flavor_name}} -{%- endif %} ctlplane_fixed_ip_set: or: - not: @@ -243,43 +180,6 @@ resources: type: OS::TripleO::{{role.name}}Server deletion_policy: {get_param: ServerDeletionPolicy} properties: - image: -{%- if role.deprecated_param_image is defined %} - if: - - deprecated_param_image_set - - {get_param: {{role.deprecated_param_image}}} - - {get_param: {{role.name}}Image} -{%- else %} - get_param: {{role.name}}Image -{%- endif %} - image_update_policy: {get_param: ImageUpdatePolicy} - flavor: -{%- if role.deprecated_param_flavor is defined %} - if: - - deprecated_param_flavor_set - - {get_param: {{role.deprecated_param_flavor}}} - - {get_param: Overcloud{{role.name}}Flavor} -{%- else %} - get_param: Overcloud{{role.name}}Flavor -{%- endif %} - key_name: {get_param: KeyName} - networks: - - if: - - ctlplane_fixed_ip_set - - network: ctlplane - subnet: {get_param: {{role.name}}ControlPlaneSubnet} - fixed_ip: - yaql: - expression: $.data.where(not isEmpty($)).first() - data: - - get_param: [{{role.name}}IPs, 'ctlplane', {get_param: NodeIndex}] -{%- if role.deprecated_param_ips %} - - get_param: [{{role.deprecated_param_ips}}, 'ctlplane', {get_param: NodeIndex}] -{%- endif %} - - network: ctlplane - subnet: {get_param: {{role.name}}ControlPlaneSubnet} - user_data_format: SOFTWARE_CONFIG - user_data: {get_param: UserData} name: yaql: expression: $.data.hostname_map.get($.data.hostname, $.data.hostname).toLower() @@ -295,7 +195,6 @@ resources: {%- endif %} - {get_param: {{role.name}}ServerMetadata} - {get_param: ServiceMetadataSettings} - scheduler_hints: {get_param: {{role.name}}SchedulerHints} {%- for network in networks %} {%- if network.enabled|default(true) and network.name in role.networks|default([]) %} diff --git a/releasenotes/notes/remove-uc-nova-params-edff776d30992aa3.yaml b/releasenotes/notes/remove-uc-nova-params-edff776d30992aa3.yaml new file mode 100644 index 0000000000..6eaf872ee9 --- /dev/null +++ b/releasenotes/notes/remove-uc-nova-params-edff776d30992aa3.yaml @@ -0,0 +1,20 @@ +--- +upgrade: + - | + The following parameters (and the related deprecated parameters) have been + removed since these have had no effect since Nova was removed from + Undercloud. + + - ``KeyName`` + - ``Overcloud{{role.name}}Flavor`` + - ``{{role.name}}SchedulerHints`` + - {{role.name}}Image + + - | + The configuration hook using cloud-init and node user data has been removed + becuase this method is no longer available since Nova was removed from + Undercloud. Because of this change, any reference to the following two + resource types should be removed during upgrade. + + - ``OS::TripleO::NodeUserData`` + - ``OS::TripleO::{{role.name}}::NodeUserData`` diff --git a/roles/Compute.yaml b/roles/Compute.yaml index a63567ae4a..3c3fbb58a2 100644 --- a/roles/Compute.yaml +++ b/roles/Compute.yaml @@ -25,10 +25,8 @@ # These deprecated_params only need to be used for existing roles and not for # composable roles. uses_deprecated_params: True - deprecated_param_image: 'NovaImage' deprecated_param_extraconfig: 'NovaComputeExtraConfig' deprecated_param_metadata: 'NovaComputeServerMetadata' - deprecated_param_scheduler_hints: 'NovaComputeSchedulerHints' deprecated_param_ips: 'NovaComputeIPs' deprecated_server_resource_name: 'NovaCompute' deprecated_nic_config_name: 'compute.yaml' diff --git a/roles/Controller.yaml b/roles/Controller.yaml index c5fc7d7e0c..8df8772ab5 100644 --- a/roles/Controller.yaml +++ b/roles/Controller.yaml @@ -33,8 +33,6 @@ # Set uses_deprecated_params to True if any deprecated params are used. uses_deprecated_params: True deprecated_param_extraconfig: 'controllerExtraConfig' - deprecated_param_flavor: 'OvercloudControlFlavor' - deprecated_param_image: 'controllerImage' deprecated_nic_config_name: 'controller.yaml' update_serial: 1 ServicesDefault: diff --git a/roles/ControllerNoCeph.yaml b/roles/ControllerNoCeph.yaml index 8891b7dcb5..6c2d28bae3 100644 --- a/roles/ControllerNoCeph.yaml +++ b/roles/ControllerNoCeph.yaml @@ -28,7 +28,6 @@ # Set uses_deprecated_params to True if any deprecated params are used. uses_deprecated_params: True deprecated_param_extraconfig: 'controllerExtraConfig' - deprecated_param_flavor: 'OvercloudControlFlavor' deprecated_param_image: 'controllerImage' update_serial: 1 ServicesDefault: diff --git a/roles/ControllerSriov.yaml b/roles/ControllerSriov.yaml index 48b78938ce..39fdf5015a 100644 --- a/roles/ControllerSriov.yaml +++ b/roles/ControllerSriov.yaml @@ -30,8 +30,6 @@ # Set uses_deprecated_params to True if any deprecated params are used. uses_deprecated_params: True deprecated_param_extraconfig: 'controllerExtraConfig' - deprecated_param_flavor: 'OvercloudControlFlavor' - deprecated_param_image: 'controllerImage' deprecated_nic_config_name: 'controller.yaml' update_serial: 1 ServicesDefault: diff --git a/roles/ControllerStorageDashboard.yaml b/roles/ControllerStorageDashboard.yaml index 206f6184fd..31d7cdbfcb 100644 --- a/roles/ControllerStorageDashboard.yaml +++ b/roles/ControllerStorageDashboard.yaml @@ -32,8 +32,6 @@ # Set uses_deprecated_params to True if any deprecated params are used. uses_deprecated_params: True deprecated_param_extraconfig: 'controllerExtraConfig' - deprecated_param_flavor: 'OvercloudControlFlavor' - deprecated_param_image: 'controllerImage' update_serial: 1 ServicesDefault: - OS::TripleO::Services::Aide diff --git a/roles/ControllerStorageNfs.yaml b/roles/ControllerStorageNfs.yaml index d19f9d557a..890bb34f2e 100644 --- a/roles/ControllerStorageNfs.yaml +++ b/roles/ControllerStorageNfs.yaml @@ -32,8 +32,6 @@ # Set uses_deprecated_params to True if any deprecated params are used. uses_deprecated_params: True deprecated_param_extraconfig: 'controllerExtraConfig' - deprecated_param_flavor: 'OvercloudControlFlavor' - deprecated_param_image: 'controllerImage' update_serial: 1 ServicesDefault: - OS::TripleO::Services::Aide diff --git a/roles/ObjectStorage.yaml b/roles/ObjectStorage.yaml index 77c096a6de..e85ae74c81 100644 --- a/roles/ObjectStorage.yaml +++ b/roles/ObjectStorage.yaml @@ -18,8 +18,6 @@ uses_deprecated_params: True deprecated_param_metadata: 'SwiftStorageServerMetadata' deprecated_param_ips: 'SwiftStorageIPs' - deprecated_param_image: 'SwiftStorageImage' - deprecated_param_flavor: 'OvercloudSwiftStorageFlavor' deprecated_nic_config_name: 'swift-storage.yaml' deprecated_server_resource_name: 'SwiftStorage' # SwiftStorage present so serial has to be 1 diff --git a/roles_data.yaml b/roles_data.yaml index 4b1d7d9027..2ee6b134c0 100644 --- a/roles_data.yaml +++ b/roles_data.yaml @@ -36,8 +36,6 @@ # Set uses_deprecated_params to True if any deprecated params are used. uses_deprecated_params: True deprecated_param_extraconfig: 'controllerExtraConfig' - deprecated_param_flavor: 'OvercloudControlFlavor' - deprecated_param_image: 'controllerImage' deprecated_nic_config_name: 'controller.yaml' update_serial: 1 ServicesDefault: @@ -209,10 +207,8 @@ # These deprecated_params only need to be used for existing roles and not for # composable roles. uses_deprecated_params: True - deprecated_param_image: 'NovaImage' deprecated_param_extraconfig: 'NovaComputeExtraConfig' deprecated_param_metadata: 'NovaComputeServerMetadata' - deprecated_param_scheduler_hints: 'NovaComputeSchedulerHints' deprecated_param_ips: 'NovaComputeIPs' deprecated_server_resource_name: 'NovaCompute' deprecated_nic_config_name: 'compute.yaml' @@ -332,8 +328,6 @@ uses_deprecated_params: True deprecated_param_metadata: 'SwiftStorageServerMetadata' deprecated_param_ips: 'SwiftStorageIPs' - deprecated_param_image: 'SwiftStorageImage' - deprecated_param_flavor: 'OvercloudSwiftStorageFlavor' deprecated_nic_config_name: 'swift-storage.yaml' deprecated_server_resource_name: 'SwiftStorage' # SwiftStorage present so serial has to be 1 diff --git a/sample-env-generator/composable-roles.yaml b/sample-env-generator/composable-roles.yaml index 2decdeef6c..5f2b6af526 100644 --- a/sample-env-generator/composable-roles.yaml +++ b/sample-env-generator/composable-roles.yaml @@ -28,16 +28,10 @@ environments: sample-env-generator/composable-roles.yaml: parameters: - DnsServers - - OvercloudControllerFlavor - - OvercloudComputeFlavor - - OvercloudCephStorageFlavor sample_values: ControllerCount: 1 - OvercloudControllerFlavor: control ComputeCount: 1 - OvercloudComputeFlavor: compute CephStorageCount: 1 - OvercloudCephStorageFlavor: ceph - name: composable-roles/monolithic-ha @@ -64,16 +58,10 @@ environments: sample-env-generator/composable-roles.yaml: parameters: - DnsServers - - OvercloudControllerFlavor - - OvercloudComputeFlavor - - OvercloudCephStorageFlavor sample_values: ControllerCount: 3 - OvercloudControllerFlavor: control ComputeCount: 3 - OvercloudComputeFlavor: compute CephStorageCount: 1 - OvercloudCephStorageFlavor: ceph - name: composable-roles/standalone @@ -104,25 +92,13 @@ environments: - DatabaseCount - MessagingCount - NetworkerCount - - OvercloudControllerOpenstackFlavor - - OvercloudComputeFlavor - - OvercloudCephStorageFlavor - - OvercloudDatabaseFlavor - - OvercloudMessagingFlavor - - OvercloudNetworkerFlavor sample_values: ControllerOpenstackCount: 3 - OvercloudControllerOpenstackFlavor: control ComputeCount: 1 - OvercloudComputeFlavor: compute CephStorageCount: 1 - OvercloudCephStorageFlavor: ceph DatabaseCount: 3 - OvercloudDatabaseFlavor: db MessagingCount: 3 - OvercloudMessagingFlavor: messaging NetworkerCount: 2 - OvercloudNetworkerFlavor: networker # NOTE(aschultz): So because these are dynamic based on the roles used, we @@ -161,32 +137,3 @@ parameters: Note %index% is translated into the index of the node, e.g 0/1/2 etc and %stackname% is replaced with the stack name e.g overcloud default: "%stackname%-controller-%index%" - OvercloudControllerFlavor: - default: control - description: Name of the flavor for Controller nodes - type: string - OvercloudControllerOpenstackFlavor: - default: control - description: Name of the flavor for ControllerOpenstack nodes - type: string - OvercloudComputeFlavor: - default: compute - description: Name of the flavor for Compute nodes - type: string - OvercloudCephStorageFlavor: - default: compute - description: Name of the flavor for Ceph nodes - type: string - OvercloudDatabaseFlavor: - default: database - description: Name of the flavor for Database nodes - type: string - OvercloudMessagingFlavor: - default: messaging - description: Name of the flavor for Messaging nodes - type: string - OvercloudNetworkerFlavor: - default: networker - description: Name of the flavor for Networker nodes - type: string - diff --git a/sample-env-generator/standalone.yaml b/sample-env-generator/standalone.yaml index 2756147bcb..67a55e558a 100644 --- a/sample-env-generator/standalone.yaml +++ b/sample-env-generator/standalone.yaml @@ -161,14 +161,12 @@ environments: parameters: - StandaloneHostnameFormat - StandaloneCount - - OvercloudStandaloneFlavor - StandaloneNetworkConfigTemplate overcloud.yaml: parameters: - DnsServers sample_values: StandaloneCount: 1 - OvercloudStandaloneFlavor: standalone SwiftReplicas: 1 StandaloneNetworkConfigTemplate: templates/net_config_bridge.j2 @@ -244,10 +242,6 @@ parameters: Note %index% is translated into the index of the node, e.g 0/1/2 etc and %stackname% is replaced with the stack name e.g overcloud default: "%stackname%-standalone-%index%" - OvercloudStandaloneFlavor: - default: standalone - description: Name of the flavor for Standalone nodes - type: string AddVipsToEtcHosts: default: false description: > diff --git a/tools/yaml-validate.py b/tools/yaml-validate.py index 86eae910f0..653ac74f6b 100755 --- a/tools/yaml-validate.py +++ b/tools/yaml-validate.py @@ -187,7 +187,6 @@ PARAMETER_DEFINITION_EXCLUSIONS = { 'BondInterfaceOvsOptions': ['description', 'default', 'constraints'], - 'KeyName': ['constraints'], 'OVNSouthboundServerPort': ['description'], 'ExternalInterfaceDefaultRoute': ['description', 'default'], 'ManagementInterfaceDefaultRoute': ['description', 'default'],