![Alan Bishop](/assets/img/avatar_default.png)
Add new workflow that derives the deployment parameters for HCI (Hyper-Converged Infrastructure, where Compute and CephOSD services are deployed on the same node). The workflow is invoked from the main derived parameters workflow for all TripleO roles associated with HCI. Implements: blueprint tripleo-derive-parameters Change-Id: I0942b5cae0ca9ae5820701998a15805b78ccbd81
390 lines
15 KiB
YAML
390 lines
15 KiB
YAML
---
|
|
version: '2.0'
|
|
name: tripleo.derive_params.v1
|
|
description: TripleO Workflows to derive deployment parameters from the introspected data
|
|
|
|
workflows:
|
|
|
|
derive_parameters:
|
|
description: The main workflow for deriving parameters from the introspected data
|
|
|
|
input:
|
|
- plan: overcloud
|
|
- queue_name: tripleo
|
|
- user_inputs: {}
|
|
|
|
tasks:
|
|
get_flattened_parameters:
|
|
action: tripleo.parameters.get_flatten container=<% $.plan %>
|
|
publish:
|
|
environment_parameters: <% task().result.environment_parameters %>
|
|
heat_resource_tree: <% task().result.heat_resource_tree %>
|
|
on-success:
|
|
- get_roles: <% $.environment_parameters and $.heat_resource_tree %>
|
|
- set_status_failed_get_flattened_parameters: <% (not $.environment_parameters) or (not $.heat_resource_tree) %>
|
|
on-error: set_status_failed_get_flattened_parameters
|
|
|
|
get_roles:
|
|
action: tripleo.role.list container=<% $.plan %>
|
|
publish:
|
|
role_name_list: <% task().result %>
|
|
on-success:
|
|
- get_valid_roles: <% $.role_name_list %>
|
|
- set_status_failed_get_roles: <% not $.role_name_list %>
|
|
on-error: set_status_failed_on_error_get_roles
|
|
|
|
# Obtain only the roles which has count > 0, by checking <RoleName>Count parameter, like ComputeCount
|
|
get_valid_roles:
|
|
publish:
|
|
valid_role_name_list: <% let(hr => $.heat_resource_tree.parameters) -> $.role_name_list.where(int($hr.get(concat($, 'Count'), {}).get('default', 0)) > 0) %>
|
|
on-success:
|
|
- for_each_role: <% $.valid_role_name_list %>
|
|
- set_status_failed_get_valid_roles: <% not $.valid_role_name_list %>
|
|
|
|
# Execute the basic preparation workflow for each role to get introspection data
|
|
for_each_role:
|
|
with-items: role_name in <% $.valid_role_name_list %>
|
|
concurrency: 1
|
|
workflow: _derive_parameters_per_role
|
|
input:
|
|
plan: <% $.plan %>
|
|
role_name: <% $.role_name %>
|
|
environment_parameters: <% $.environment_parameters %>
|
|
heat_resource_tree: <% $.heat_resource_tree %>
|
|
user_inputs: <% $.user_inputs %>
|
|
publish:
|
|
# Gets all the roles derived parameters as dictionary
|
|
result: <% task().result.select($.get('derived_parameters', {})).sum() %>
|
|
on-success: reset_derive_parameters_in_plan
|
|
on-error: set_status_failed_for_each_role
|
|
|
|
reset_derive_parameters_in_plan:
|
|
action: tripleo.parameters.reset
|
|
input:
|
|
container: <% $.plan %>
|
|
key: 'derived_parameters'
|
|
on-success:
|
|
- update_derive_parameters_in_plan: <% $.result %>
|
|
on-error: set_status_failed_reset_derive_parameters_in_plan
|
|
|
|
update_derive_parameters_in_plan:
|
|
action: tripleo.parameters.update
|
|
input:
|
|
container: <% $.plan %>
|
|
key: 'derived_parameters'
|
|
parameters: <% $.get('result', {}) %>
|
|
on-success: send_message
|
|
on-error: set_status_failed_update_derive_parameters_in_plan
|
|
|
|
set_status_failed_get_flattened_parameters:
|
|
on-success: send_message
|
|
publish:
|
|
status: FAILED
|
|
message: <% task(get_flattened_parameters).result %>
|
|
|
|
set_status_failed_get_roles:
|
|
on-success: send_message
|
|
publish:
|
|
status: FAILED
|
|
message: "Unable to determine the list of roles in the deployment plan"
|
|
|
|
set_status_failed_on_error_get_roles:
|
|
on-success: send_message
|
|
publish:
|
|
status: FAILED
|
|
message: <% task(get_roles).result %>
|
|
|
|
set_status_failed_get_valid_roles:
|
|
on-success: send_message
|
|
publish:
|
|
status: FAILED
|
|
message: 'Unable to determine the list of valid roles in the deployment plan.'
|
|
|
|
set_status_failed_for_each_role:
|
|
on-success: send_message
|
|
publish:
|
|
status: FAILED
|
|
message: <% task(for_each_role).result.select(dict('role_name' => $.role_name, 'status' => $.get('status', 'SUCCESS'), 'message' => $.get('message', ''))) %>
|
|
|
|
set_status_failed_reset_derive_parameters_in_plan:
|
|
on-success: send_message
|
|
publish:
|
|
status: FAILED
|
|
message: <% task(reset_derive_parameters_in_plan).result %>
|
|
|
|
set_status_failed_update_derive_parameters_in_plan:
|
|
on-success: send_message
|
|
publish:
|
|
status: FAILED
|
|
message: <% task(update_derive_parameters_in_plan).result %>
|
|
|
|
send_message:
|
|
action: zaqar.queue_post
|
|
retry: count=5 delay=1
|
|
input:
|
|
queue_name: <% $.queue_name %>
|
|
messages:
|
|
body:
|
|
type: tripleo.derive_params.v1.derive_parameters
|
|
payload:
|
|
status: <% $.get('status', 'SUCCESS') %>
|
|
message: <% $.get('message', '') %>
|
|
result: <% $.get('result', '') %>
|
|
execution: <% execution() %>
|
|
on-success:
|
|
- fail: <% $.get('status') = 'FAILED' %>
|
|
|
|
|
|
_derive_parameters_per_role:
|
|
description: >
|
|
Workflow which runs per role to get the introspection data on the first matching node assigned to role.
|
|
Once introspection data is fetched, this worklow will trigger the actual derive parameters workflow
|
|
input:
|
|
- plan
|
|
- role_name
|
|
- environment_parameters
|
|
- heat_resource_tree
|
|
- user_inputs
|
|
|
|
output:
|
|
derived_parameters: <% $.get('derived_parameters', {}) %>
|
|
# Need role_name in output parameter to display the status for all roles in main workflow when any role fails here.
|
|
role_name: <% $.role_name %>
|
|
|
|
tasks:
|
|
get_role_info:
|
|
workflow: _get_role_info
|
|
input:
|
|
role_name: <% $.role_name %>
|
|
heat_resource_tree: <% $.heat_resource_tree %>
|
|
publish:
|
|
role_features: <% task().result.get('role_features', []) %>
|
|
role_services: <% task().result.get('role_services', []) %>
|
|
on-success:
|
|
# Continue only if there are features associated with this role. Otherwise, we're done.
|
|
- get_flavor_name: <% $.role_features %>
|
|
on-error: set_status_failed_get_role_info
|
|
|
|
# Getting introspection data workflow, which will take care of
|
|
# 1) profile and flavor based mapping
|
|
# 2) Nova placement api based mapping
|
|
# Currently we have implemented profile and flavor based mapping
|
|
# TODO-Nova placement api based mapping is pending, we will enchance it later.
|
|
get_flavor_name:
|
|
publish:
|
|
flavor_name: <% let(param_name => concat('Overcloud', $.role_name, 'Flavor').replace('OvercloudControllerFlavor', 'OvercloudControlFlavor')) -> $.heat_resource_tree.parameters.get($param_name, {}).get('default', '') %>
|
|
on-success:
|
|
- get_profile_name: <% $.flavor_name %>
|
|
- set_status_failed_get_flavor_name: <% not $.flavor_name %>
|
|
|
|
get_profile_name:
|
|
action: tripleo.parameters.get_profile_of_flavor flavor_name=<% $.flavor_name %>
|
|
publish:
|
|
profile_name: <% task().result %>
|
|
on-success: get_profile_node
|
|
on-error: set_status_failed_get_profile_name
|
|
|
|
get_profile_node:
|
|
workflow: tripleo.baremetal.v1.nodes_with_profile
|
|
input:
|
|
profile: <% $.profile_name %>
|
|
publish:
|
|
profile_node_uuid: <% task().result.matching_nodes.first('') %>
|
|
on-success:
|
|
- get_introspection_data: <% $.profile_node_uuid %>
|
|
- set_status_failed_no_matching_node_get_profile_node: <% not $.profile_node_uuid %>
|
|
on-error: set_status_failed_on_error_get_profile_node
|
|
|
|
get_introspection_data:
|
|
action: baremetal_introspection.get_data uuid=<% $.profile_node_uuid %>
|
|
publish:
|
|
hw_data: <% task().result %>
|
|
# Establish an empty dictionary of derived_parameters prior to
|
|
# invoking the individual "feature" algorithms
|
|
derived_parameters: <% dict() %>
|
|
on-success:
|
|
- get_dpdk_derive_params: <% $.role_features.contains('DPDK') %>
|
|
- get_hci_derive_params: <% not $.role_features.contains('DPDK') and $.role_features.contains('HCI') %>
|
|
on-error: set_status_failed_get_introspection_data
|
|
|
|
get_dpdk_derive_params:
|
|
workflow: tripleo.derive_params_formulas.v1.dpdk_derive_params
|
|
input:
|
|
plan: <% $.plan %>
|
|
role_name: <% $.role_name %>
|
|
hw_data: <% $.hw_data %>
|
|
user_inputs: <% $.user_inputs %>
|
|
publish:
|
|
derived_parameters: <% task().result.get('derived_parameters', {}) %>
|
|
on-success: get_host_derive_params
|
|
on-error: set_status_failed_get_dpdk_derive_params
|
|
|
|
get_host_derive_params:
|
|
workflow: tripleo.derive_params_formulas.v1.host_derive_params
|
|
input:
|
|
role_name: <% $.role_name %>
|
|
hw_data: <% $.hw_data %>
|
|
user_inputs: <% $.user_inputs %>
|
|
derived_parameters: <% $.derived_parameters %>
|
|
publish:
|
|
derived_parameters: <% task().result.get('derived_parameters', {}) %>
|
|
on-success:
|
|
- get_hci_derive_params: <% $.role_features.contains('HCI') %>
|
|
on-error: set_status_failed_get_host_derive_params
|
|
|
|
get_hci_derive_params:
|
|
workflow: tripleo.derive_params_formulas.v1.hci_derive_params
|
|
input:
|
|
role_name: <% $.role_name %>
|
|
environment_parameters: <% $.environment_parameters %>
|
|
heat_resource_tree: <% $.heat_resource_tree %>
|
|
introspection_data: <% $.hw_data %>
|
|
user_inputs: <% $.user_inputs %>
|
|
derived_parameters: <% $.derived_parameters %>
|
|
publish:
|
|
derived_parameters: <% task().result.get('derived_parameters', {}) %>
|
|
on-error: set_status_failed_get_hci_derive_params
|
|
# Done (no more derived parameter features)
|
|
|
|
set_status_failed_get_role_info:
|
|
publish:
|
|
role_name: <% $.role_name %>
|
|
status: FAILED
|
|
message: <% task(get_role_info).result.get('message', '') %>
|
|
on-success: fail
|
|
|
|
set_status_failed_get_flavor_name:
|
|
publish:
|
|
role_name: <% $.role_name %>
|
|
status: FAILED
|
|
message: <% "Unable to determine flavor for role '{0}'".format($.role_name) %>
|
|
on-success: fail
|
|
|
|
set_status_failed_get_profile_name:
|
|
publish:
|
|
role_name: <% $.role_name %>
|
|
status: FAILED
|
|
message: <% task(get_profile_name).result %>
|
|
on-success: fail
|
|
|
|
set_status_failed_no_matching_node_get_profile_node:
|
|
publish:
|
|
role_name: <% $.role_name %>
|
|
status: FAILED
|
|
message: <% "Unable to determine matching node for profile '{0}'".format($.profile_name) %>
|
|
on-success: fail
|
|
|
|
set_status_failed_on_error_get_profile_node:
|
|
publish:
|
|
role_name: <% $.role_name %>
|
|
status: FAILED
|
|
message: <% task(get_profile_node).result %>
|
|
on-success: fail
|
|
|
|
set_status_failed_get_introspection_data:
|
|
publish:
|
|
role_name: <% $.role_name %>
|
|
status: FAILED
|
|
message: <% task(get_introspection_data).result %>
|
|
on-success: fail
|
|
|
|
set_status_failed_get_dpdk_derive_params:
|
|
publish:
|
|
role_name: <% $.role_name %>
|
|
status: FAILED
|
|
message: <% task(get_dpdk_derive_params).result %>
|
|
on-success: fail
|
|
|
|
set_status_failed_get_host_derive_params:
|
|
publish:
|
|
role_name: <% $.role_name %>
|
|
status: FAILED
|
|
message: <% task(get_host_derive_params).result %>
|
|
on-success: fail
|
|
|
|
set_status_failed_get_hci_derive_params:
|
|
publish:
|
|
role_name: <% $.role_name %>
|
|
status: FAILED
|
|
message: <% task(get_hci_derive_params).result %>
|
|
on-success: fail
|
|
|
|
|
|
_get_role_info:
|
|
description: >
|
|
Workflow that determines the list of derived parameter features (DPDK,
|
|
HCI, etc.) for a role based on the services assigned to the role.
|
|
|
|
input:
|
|
- role_name
|
|
- heat_resource_tree
|
|
|
|
tasks:
|
|
get_resource_chains:
|
|
publish:
|
|
resource_chains: <% $.heat_resource_tree.resources.values().where($.get('type', '') = 'OS::Heat::ResourceChain') %>
|
|
on-success:
|
|
- get_role_chain: <% $.resource_chains %>
|
|
- set_status_failed_get_resource_chains: <% not $.resource_chains %>
|
|
|
|
get_role_chain:
|
|
publish:
|
|
role_chain: <% let(chain_name => concat($.role_name, 'ServiceChain'))-> $.heat_resource_tree.resources.values().where($.name = $chain_name).first({}) %>
|
|
on-success:
|
|
- get_service_chain: <% $.role_chain %>
|
|
- set_status_failed_get_role_chain: <% not $.role_chain %>
|
|
|
|
get_service_chain:
|
|
publish:
|
|
service_chain: <% let(resources => $.role_chain.resources)-> $.resource_chains.where($resources.contains($.id)).first('') %>
|
|
on-success:
|
|
- get_role_services: <% $.service_chain %>
|
|
- set_status_failed_get_service_chain: <% not $.service_chain %>
|
|
|
|
get_role_services:
|
|
publish:
|
|
role_services: <% let(resources => $.heat_resource_tree.resources)-> $.service_chain.resources.select($resources.get($)) %>
|
|
on-success:
|
|
- check_features: <% $.role_services %>
|
|
- set_status_failed_get_role_services: <% not $.role_services %>
|
|
|
|
check_features:
|
|
on-success: build_feature_dict
|
|
publish:
|
|
# TODO: Need to update this logic for ODL integration.
|
|
# The role supports the DPDK feature if the NeutronDatapathType parameter is present.
|
|
dpdk: <% $.role_services.any($.get('parameters', []).contains('NeutronDatapathType')) %>
|
|
|
|
# The role supports the HCI feature if it includes both NovaCompute and CephOSD services.
|
|
hci: <% $.role_services.any($.get('type', '').endsWith('::NovaCompute')) and $.role_services.any($.get('type', '').endsWith('::CephOSD')) %>
|
|
|
|
build_feature_dict:
|
|
on-success: filter_features
|
|
publish:
|
|
feature_dict: <% dict(DPDK => $.dpdk, HCI => $.hci) %>
|
|
|
|
filter_features:
|
|
publish:
|
|
# The list of features that are enabled (i.e. are true in the feature_dict).
|
|
role_features: <% let(feature_dict => $.feature_dict)-> $feature_dict.keys().where($feature_dict[$]) %>
|
|
|
|
set_status_failed_get_resource_chains:
|
|
publish:
|
|
message: <% 'Unable to locate any resource chains in the heat resource tree' %>
|
|
on-success: fail
|
|
|
|
set_status_failed_get_role_chain:
|
|
publish:
|
|
message: <% "Unable to determine the service chain resource for role '{0}'".format($.role_name) %>
|
|
on-success: fail
|
|
|
|
set_status_failed_get_service_chain:
|
|
publish:
|
|
message: <% "Unable to determine the service chain for role '{0}'".format($.role_name) %>
|
|
on-success: fail
|
|
|
|
set_status_failed_get_role_services:
|
|
publish:
|
|
message: <% "Unable to determine list of services for role '{0}'".format($.role_name) %>
|
|
on-success: fail
|