tripleo-ansible/tripleo_ansible/roles/tripleo_derived_parameters/tasks/main.yml

280 lines
10 KiB
YAML

---
# Copyright 2020 Red Hat, Inc.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
- name: Set resource and role chain fact
set_fact:
resource_chains: "{{ tripleo_heat_resource_tree.resources | get_filtered_resources('OS::Heat::ResourceChain') }}"
role_chain: "{{ tripleo_heat_resource_tree.resources | get_filtered_resource_chains(tripleo_role_name) }}"
- name: Set service chain fact
set_fact:
service_chain: "{{ resource_chains | get_filtered_service_chain(role_chain.resources) }}"
- name: Set role service fact
set_fact:
role_services: "{{ service_chain.resources | get_filtered_role_resources(tripleo_heat_resource_tree.resources) }}"
- name: Set features facts
set_fact:
dpdk: |-
{% set service_types = role_services.values() | sum(attribute='parameters', start=[]) %}
{% set neutron_datapath = ((service_types | map('regex_search', '.*NeutronDatapathType.*') | list | length) > 0) | bool %}
{% set heat_service_types = tripleo_heat_resource_tree.resources.values() | list | sum(attribute='parameters', start=[]) %}
{% set heat_neutron_datapath = ((heat_service_types | map('regex_search', '.*NeutronDatapathType.*') | list | length) > 0) | bool %}
{{ (neutron_datapath | bool) or (heat_neutron_datapath | bool) }}
sriov: |-
{% set service_types = role_services.values() | map(attribute='type') | list %}
{{ ((service_types | map('regex_search', '.*\:\:NeutronSriovAgent') | list | length) > 0) | bool }}
hci: |-
{% set service_types = role_services.values() | map(attribute='type') | list %}
{% set novacompute = ((service_types | map('regex_search', '.*\:\:NovaCompute') | list | length) > 0) | bool %}
{% set cephosd = ((service_types | map('regex_search', '.*\:\:CephOSD') | list | length) > 0) | bool %}
{{ (novacompute | bool) and (cephosd | bool) }}
- name: Set feature fact
set_fact:
feature_dict:
DPDK: "{{ dpdk }}"
SRIOV: "{{ sriov }}"
HOST: "{{ dpdk or sriov }}"
HCI: "{{ hci }}"
- name: Set role feature fact
set_fact:
role_features: |-
{% set enabled_services = [] %}
{% for key, value in feature_dict.items() %}
{% if value | bool %}
{% set _ = enabled_services.append(key) %}
{% endif %}
{% endfor %}
{{ enabled_services }}
scheduler_hints: |-
{% set params = tripleo_heat_resource_tree.parameters.get((tripleo_role_name ~ 'SchedulerHints'), {}) %}
{{ params.get('default', {}) }}
flavor_name: |-
{% set param_name = 'Overcloud' ~ tripleo_role_name ~ 'Flavor' | replace('OvercloudControllerFlavor', 'OvercloudControlFlavor') %}
{% set params = tripleo_heat_resource_tree.parameters.get(param_name, {}) %}
{{ params.get('default', '') }}
- name: Node block
when:
- tripleo_all_nodes is undefined
block:
- name: Return available ironic hosts
os_baremetal_node_info:
cloud: undercloud
filters:
provision_state: "available"
is_maintenance: false
register: known_available_nodes
- name: Return available ironic hosts
os_baremetal_node_info:
cloud: undercloud
filters:
provision_state: "active"
is_maintenance: false
register: known_active_nodes
- name: Set all nodes fact
set_fact:
tripleo_all_nodes: "{{ known_available_nodes.baremetal_nodes | union(known_active_nodes.baremetal_nodes) }}"
- name: All node block
when:
- (tripleo_all_nodes | length) > 0
block:
- name: Scheduler hint block
when:
- (scheduler_hints | length) > 0
- role_node_uuid is undefined
block:
- name: Set hint regex fact
set_fact:
hint_regex: >-
{{ scheduler_hints.get('capabilities:node', {}) | replace('%index%', '(\d+)') }}
- name: Union all nodes
set_fact:
matching_nodes_with_hint: "{{
tripleo_all_nodes |
get_node_capabilities |
selectattr('hint', 'regex', hint_regex) |
map(attribute='uuid') |
list
}}"
- name: Set role node uuid fact
set_fact:
role_node_uuid: "{{ matching_nodes_with_hint | first }}"
when:
- (matching_nodes_with_hint | length) > 0
- name: Flavor hint block
when:
- (scheduler_hints | length) < 1
- role_node_uuid is undefined
block:
- name: Get flavor profile
tripleo_get_flavor_profile:
flavor_name: "{{ flavor_name }}"
register: flavor_profile
- name: Union all nodes
set_fact:
matching_nodes_with_profile: "{{
tripleo_all_nodes |
get_node_profile |
selectattr('profile', 'equalto', flavor_profile.profile) |
map(attribute='uuid') |
list
}}"
- name: Set role node uuid fact
set_fact:
role_node_uuid: "{{ matching_nodes_with_profile | first }}"
when:
- (matching_nodes_with_profile | length) > 0
- name: Get baremetal inspection data
tripleo_get_introspected_data:
node_id: "{{ role_node_uuid }}"
register: baremetal_data
when:
- role_node_uuid is defined
- baremetal_data is undefined
- name: Set hardware data fact
set_fact:
hw_data: "{{ baremetal_data.data }}"
when:
- baremetal_data is defined
# TODO
# handle_dpdk_feature:
# on-success:
# - get_dpdk_derive_params: <% $.role_features.contains('DPDK') %>
# - handle_sriov_feature: <% not $.role_features.contains('DPDK') %>
# get_dpdk_derive_params:
# workflow: tripleo.derive_params_formulas.v1.dpdk_derive_params
# input:
# plan: <% $.plan %>
# tripleo_role_name: <% $.tripleo_role_name %>
# tripleo_heat_resource_tree: <% $.tripleo_heat_resource_tree %>
# hw_data: <% $.hw_data %>
# user_inputs: <% $.user_inputs %>
# publish:
# derived_parameters: <% task().result.get('derived_parameters', {}) %>
# on-success: handle_sriov_feature
# on-error: set_status_failed_get_dpdk_derive_params
# handle_sriov_feature:
# on-success:
# - get_sriov_derive_params: <% $.role_features.contains('SRIOV') %>
# - handle_host_feature: <% not $.role_features.contains('SRIOV') %>
# get_sriov_derive_params:
# workflow: tripleo.derive_params_formulas.v1.sriov_derive_params
# input:
# tripleo_role_name: <% $.tripleo_role_name %>
# hw_data: <% $.hw_data %>
# derived_parameters: <% $.derived_parameters %>
# publish:
# derived_parameters: <% task().result.get('derived_parameters', {}) %>
# on-success: handle_host_feature
# on-error: set_status_failed_get_sriov_derive_params
# handle_host_feature:
# on-success:
# - get_host_derive_params: <% $.role_features.contains('HOST') %>
# - handle_hci_feature: <% not $.role_features.contains('HOST') %>
# get_host_derive_params:
# workflow: tripleo.derive_params_formulas.v1.host_derive_params
# input:
# tripleo_role_name: <% $.tripleo_role_name %>
# hw_data: <% $.hw_data %>
# user_inputs: <% $.user_inputs %>
# derived_parameters: <% $.derived_parameters %>
# publish:
# derived_parameters: <% task().result.get('derived_parameters', {}) %>
# on-success: handle_hci_feature
# on-error: set_status_failed_get_host_derive_params
# handle_hci_feature:
# on-success:
# - get_hci_derive_params: <% $.role_features.contains('HCI') %>
# get_hci_derive_params:
# workflow: tripleo.derive_params_formulas.v1.hci_derive_params
# input:
# tripleo_role_name: <% $.tripleo_role_name %>
# tripleo_heat_resource_tree: <% $.tripleo_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)
- name: Derive parameters for HCI
when:
- hci
block:
- name: extract average guest cpu and memory
set_fact:
average_guest_cpu_utilization_percentage: "{{ item.value.average_guest_cpu_utilization_percentage }}"
average_guest_memory_size_in_mb: "{{ item.value.average_guest_memory_size_in_mb }}"
loop: "{{ lookup('dict', hci_profile_config) }}"
when: item.key == hci_profile
# Replace with a call to new a hci_derived_parameters module with these inputs
- name: set mock_hci_derived_parameters_inputs
set_fact:
mock_hci_derived_parameters_inputs:
tripleo_heat_resource_tree: "{{ tripleo_heat_resource_tree }}"
introspection_data: "{{ hw_data }}"
average_guest_cpu_utilization_percentage: "{{ average_guest_cpu_utilization_percentage }}"
average_guest_memory_size_in_mb: "{{ average_guest_memory_size_in_mb }}"
derived_parameters: {}
# hci_derived_parameters module will update derived_parameters_result instead
- name: set mock_derived_parameters_result
set_fact:
mock_derived_parameters_result:
NovaReservedHostMemory: 180224
NovaCPUAllocationRatio: 2
- name: Update derived params block
when:
- derived_parameters_result is defined
block:
- name: Reset params
tripleo_reset_params:
container: "{{ plan }}"
parameter_key: derived_parameters
- name: Update derive_parameters in plan
tripleo_plan_parameters_update:
container: "{{ plan }}"
parameter_key: 'derived_parameters'
parameters: "{{ derived_parameters_result }}"
validate: true