Merge "Remove parameters/resources for undercloud Nova"
This commit is contained in:
commit
2ec53e79ca
ci
deployed-server
environments
firstboot
.gitkeepconntectx3_streering.yamlnvidia_firstboot.yamlos-net-config-mappings.yamluserdata_default.yamluserdata_dev_rsync.yamluserdata_example.yamluserdata_heat_admin.yamluserdata_root_password.yamluserdata_timesync.yaml
overcloud-resource-registry-puppet.j2.yamlovercloud.j2.yamlpuppet
releasenotes/notes
roles
Compute.yamlController.yamlControllerNoCeph.yamlControllerSriov.yamlControllerStorageDashboard.yamlControllerStorageNfs.yamlObjectStorage.yaml
roles_data.yamlsample-env-generator
tools
@ -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:
|
||||
@ -205,10 +203,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'
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 %}
|
||||
|
@ -1,3 +1,2 @@
|
||||
resource_registry:
|
||||
OS::TripleO::Server: ../deployed-server/deployed-server.yaml
|
||||
OS::TripleO::DeployedServer::ControlPlanePort: ../deployed-server/deployed-neutron-port.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
|
||||
|
0
firstboot/.gitkeep
Normal file
0
firstboot/.gitkeep
Normal file
@ -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}
|
||||
|
@ -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<fw_ver>\d+\.\d+\.\d+)'
|
||||
RUNNING_FW_VERSION_REGEX = r'FW Version\(Running\):\s*\t*(?P<fw_ver>\d+\.\d+\.\d+)'
|
||||
PSID_REGEX = r'PSID:\s*\t*(?P<psid>\w+)'
|
||||
ARRAY_VALUE_REGEX = r'Array\[(?P<first_index>\d+)\.\.(?P<last_index>\d+)\]'
|
||||
ARRAY_PARAM_REGEX = r'(?P<param_name>\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://<your_ip>/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}
|
@ -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
|
@ -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}
|
@ -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}
|
@ -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}
|
@ -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}
|
@ -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}
|
@ -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}
|
@ -33,29 +33,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
|
||||
|
@ -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 %}
|
||||
|
@ -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([]) %}
|
||||
|
@ -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``
|
@ -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'
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
@ -208,10 +206,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'
|
||||
@ -329,8 +325,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
|
||||
|
@ -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
|
||||
|
||||
|
@ -159,14 +159,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
|
||||
|
||||
@ -242,10 +240,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: >
|
||||
|
@ -193,7 +193,6 @@ PARAMETER_DEFINITION_EXCLUSIONS = {
|
||||
'BondInterfaceOvsOptions': ['description',
|
||||
'default',
|
||||
'constraints'],
|
||||
'KeyName': ['constraints'],
|
||||
'OVNSouthboundServerPort': ['description'],
|
||||
'ExternalInterfaceDefaultRoute': ['description', 'default'],
|
||||
'ManagementInterfaceDefaultRoute': ['description', 'default'],
|
||||
|
Loading…
Reference in New Issue
Block a user