{"heat_template_version": "wallaby", "description": "OpenStack containerized Cinder Volume service\n", "parameters": {"ContainerCinderVolumeImage": {"description": "image", "type": "string", "tags": ["role_specific"]}, "ContainerCinderConfigImage": {"description": "The container image to use for the cinder config_volume", "type": "string", "tags": ["role_specific"]}, "ClusterCommonTag": {"default": false, "description": "When set to false, a pacemaker service is configured to use a floating tag for its container image name, e.g. 'REGISTRY/NAMESPACE/IMAGENAME:pcmklatest'. When set to true, the service uses a floating prefix as well, e.g. 'cluster.common.tag/IMAGENAME:pcmklatest'.", "type": "boolean"}, "ClusterFullTag": {"default": true, "description": "When set to true, the pacemaker service uses a fully constant tag for its container image name, e.g. 'cluster.common.tag/SERVICENAME:pcmklatest'.", "type": "boolean"}, "EndpointMap": {"default": {}, "description": "Mapping of service endpoint -> protocol. Typically set via parameter_defaults in the resource registry.", "type": "json"}, "ServiceData": {"default": {}, "description": "Dictionary packing service data", "type": "json"}, "ServiceNetMap": {"default": {}, "description": "Mapping of service_name -> network name. Typically set via parameter_defaults in the resource registry. Use parameter_merge_strategies to merge it with the defaults.", "type": "json"}, "RoleName": {"default": "", "description": "Role name on which the service is applied", "type": "string"}, "RoleParameters": {"default": {}, "description": "Parameters specific to the role", "type": "json"}, "ConfigDebug": {"default": false, "description": "Whether to run config management (e.g. Puppet) in debug mode.", "type": "boolean"}, "ContainerCli": {"type": "string", "default": "podman", "description": "CLI tool used to manage containers.", "constraints": [{"allowed_values": ["docker", "podman"]}]}, "DeployIdentifier": {"default": "", "type": "string", "description": "Setting this to a unique value will re-run any deployment tasks which perform configuration on a Heat stack-update.\n"}, "CinderVolumeLoggingSource": {"type": "json", "default": {"tag": "openstack.cinder.volume", "file": "/var/log/containers/cinder/cinder-volume.log"}}, "CephConfigPath": {"type": "string", "default": "/var/lib/tripleo-config/ceph", "description": "The path where the Ceph Cluster config files are stored on the host.\n"}}, "resources": {"ContainersCommon": {"type": "file:///usr/share/openstack-tripleo-heat-templates/deployment/containers-common.yaml"}, "MySQLClient": {"type": "file:///usr/share/openstack-tripleo-heat-templates/deployment/database/mysql-client.yaml"}, "CinderBase": {"type": "file:///usr/share/openstack-tripleo-heat-templates/deployment/cinder/cinder-volume-container-puppet.yaml", "properties": {"EndpointMap": {"get_param": "EndpointMap"}, "ServiceData": {"get_param": "ServiceData"}, "ServiceNetMap": {"get_param": "ServiceNetMap"}, "RoleName": {"get_param": "RoleName"}, "RoleParameters": {"get_param": "RoleParameters"}}}, "CinderCommon": {"type": "file:///usr/share/openstack-tripleo-heat-templates/deployment/cinder/cinder-common-container-puppet.yaml"}, "RoleParametersValue": {"type": "OS::Heat::Value", "properties": {"type": "json", "value": {"map_replace": [{"map_replace": [{"ContainerCinderVolumeImage": "ContainerCinderVolumeImage", "ContainerCinderConfigImage": "ContainerCinderConfigImage"}, {"values": {"get_param": ["RoleParameters"]}}]}, {"values": {"ContainerCinderVolumeImage": {"get_param": "ContainerCinderVolumeImage"}, "ContainerCinderConfigImage": {"get_param": "ContainerCinderConfigImage"}}}]}}}}, "outputs": {"role_data": {"description": "Role data for the Cinder Volume role.", "value": {"service_name": "cinder_volume", "firewall_rules": {"get_attr": ["CinderBase", "role_data", "firewall_rules"]}, "monitoring_subscription": {"get_attr": ["CinderBase", "role_data", "monitoring_subscription"]}, "config_settings": {"map_merge": [{"get_attr": ["CinderBase", "role_data", "config_settings"]}, {"tripleo::profile::base::lvm::enable_udev": false, "tripleo::profile::pacemaker::cinder::volume_bundle::cinder_volume_docker_image": {"if": [{"get_param": "ClusterFullTag"}, "cluster.common.tag/cinder-volume:pcmklatest", {"yaql": {"data": {"if": [{"get_param": "ClusterCommonTag"}, {"yaql": {"data": {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}, "expression": "concat(\"cluster.common.tag/\", $.data.rightSplit(separator => \"/\", maxSplits => 1)[1])"}}, {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}]}, "expression": "concat($.data.rightSplit(separator => \":\", maxSplits => 1)[0], \":pcmklatest\")"}}]}, "tripleo::profile::pacemaker::cinder::volume_bundle::docker_volumes": {"get_attr": ["CinderCommon", "cinder_volume_volumes"]}, "tripleo::profile::pacemaker::cinder::volume_bundle::docker_environment": {"get_attr": ["CinderCommon", "cinder_volume_environment"]}, "tripleo::profile::pacemaker::cinder::volume_bundle::container_backend": {"get_param": "ContainerCli"}, "tripleo::profile::pacemaker::cinder::volume_bundle::ceph_conf_path": {"get_param": "CephConfigPath"}, "cinder::volume::manage_service": false, "cinder::volume::enabled": false, "cinder::backend_host": "hostgroup"}]}, "service_config_settings": {"get_attr": ["CinderBase", "role_data", "service_config_settings"]}, "puppet_config": {"config_volume": "cinder", "puppet_tags": "cinder_config,file,concat,file_line", "step_config": {"list_join": ["\n", ["include tripleo::profile::base::lvm"], ["include tripleo::profile::pacemaker::cinder::volume_bundle", {"get_attr": ["MySQLClient", "role_data", "step_config"]}]]}, "config_image": {"get_attr": ["RoleParametersValue", "value", "ContainerCinderConfigImage"]}}, "kolla_config": {"/var/lib/kolla/config_files/cinder_volume.json": {"command": "/usr/bin/cinder-volume --config-file /usr/share/cinder/cinder-dist.conf --config-file /etc/cinder/cinder.conf", "config_files": {"get_attr": ["CinderCommon", "cinder_common_kolla_config_files"]}, "permissions": {"get_attr": ["CinderCommon", "cinder_common_kolla_permissions"]}}}, "container_config_scripts": {"get_attr": ["ContainersCommon", "container_config_scripts"]}, "docker_config": {"step_3": {"cinder_volume_init_logs": {"start_order": 0, "image": {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}, "net": "none", "privileged": false, "user": "root", "volumes": ["/var/log/containers/cinder:/var/log/cinder"], "command": ["/bin/bash", "-c", "chown -R cinder:cinder /var/log/cinder"]}}}, "host_prep_tasks": {"get_attr": ["CinderCommon", "cinder_volume_host_prep_tasks"]}, "deploy_steps_tasks": [{"name": "Cinder Volume tag container image for pacemaker", "when": "step|int == 1", "import_role": {"name": "tripleo_container_tag"}, "vars": {"container_image": {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}, "container_image_latest": {"if": [{"get_param": "ClusterFullTag"}, "cluster.common.tag/cinder-volume:pcmklatest", {"yaql": {"data": {"if": [{"get_param": "ClusterCommonTag"}, {"yaql": {"data": {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}, "expression": "concat(\"cluster.common.tag/\", $.data.rightSplit(separator => \"/\", maxSplits => 1)[1])"}}, {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}]}, "expression": "concat($.data.rightSplit(separator => \":\", maxSplits => 1)[0], \":pcmklatest\")"}}]}}}, {"name": "Cinder Volume HA Wrappers Step", "when": "step|int == 5", "block": [{"name": "Cinder volume puppet bundle", "import_role": {"name": "tripleo_ha_wrapper"}, "vars": {"tripleo_ha_wrapper_service_name": "cinder_volume", "tripleo_ha_wrapper_resource_name": "openstack-cinder-volume", "tripleo_ha_wrapper_bundle_name": "openstack-cinder-volume", "tripleo_ha_wrapper_resource_state": "_ Started", "tripleo_ha_wrapper_puppet_config_volume": "cinder", "tripleo_ha_wrapper_puppet_execute": "include ::tripleo::profile::base::pacemaker; include ::tripleo::profile::pacemaker::cinder::volume_bundle", "tripleo_ha_wrapper_puppet_tags": "pacemaker::resource::bundle,pacemaker::property,pacemaker::resource::ip,pacemaker::resource::ocf,pacemaker::constraint::order,pacemaker::constraint::colocation", "tripleo_ha_wrapper_puppet_debug": {"get_param": "ConfigDebug"}, "tripleo_ha_wrapper_config_suffix": ".cinder_volume_previous_run"}}]}], "external_update_tasks": [{"when": "step|int == 1", "tags": "ha_image_update", "block": [{"block": [{"name": "Get cinder_volume image from pacemaker", "become": true, "register": "xmllint_pcmk_cinder_volume_image", "shell": "xmllint --xpath \"string(//bundle[@id='openstack-cinder-volume']/podman/@image)\" /var/lib/pacemaker/cib/cib.xml"}, {"name": "Get container cinder_volume image", "set_fact": {"cinder_volume_image": {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}, "cinder_volume_image_latest": {"if": [{"get_param": "ClusterFullTag"}, "cluster.common.tag/cinder-volume:pcmklatest", {"yaql": {"data": {"if": [{"get_param": "ClusterCommonTag"}, {"yaql": {"data": {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}, "expression": "concat(\"cluster.common.tag/\", $.data.rightSplit(separator => \"/\", maxSplits => 1)[1])"}}, {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}]}, "expression": "concat($.data.rightSplit(separator => \":\", maxSplits => 1)[0], \":pcmklatest\")"}}]}, "pcmk_cinder_volume_image": "{{xmllint_pcmk_cinder_volume_image.stdout}}"}}], "delegate_to": "{{ (groups[\"cinder_volume\"] | difference(groups[\"excluded_overcloud\"]))[0] }}"}, {"name": "cinder-volume temporary pacemaker container tag in case of image switch", "become": true, "import_role": {"name": "tripleo_ha_image_update"}, "vars": {"tripleo_ha_image_update_node_names": "{{ groups[\"cinder_volume\"] | difference(groups[\"excluded_overcloud\"]) }}", "tripleo_ha_image_update_bundle": "openstack-cinder-volume", "tripleo_ha_image_update_new_image": "{{cinder_volume_image_latest}}", "tripleo_ha_image_update_old_image": "{{pcmk_cinder_volume_image}}"}, "when": ["(pcmk_cinder_volume_image != \"\")", "(pcmk_cinder_volume_image != cinder_volume_image_latest)"]}]}], "update_tasks": [{"block": [{"name": "Get cinder_volume image from pacemaker", "become": true, "register": "xmllint_pcmk_cinder_volume_image", "shell": "xmllint --xpath \"string(//bundle[@id='openstack-cinder-volume']/podman/@image)\" /var/lib/pacemaker/cib/cib.xml"}, {"name": "Get container cinder_volume image", "set_fact": {"cinder_volume_image": {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}, "cinder_volume_image_latest": {"if": [{"get_param": "ClusterFullTag"}, "cluster.common.tag/cinder-volume:pcmklatest", {"yaql": {"data": {"if": [{"get_param": "ClusterCommonTag"}, {"yaql": {"data": {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}, "expression": "concat(\"cluster.common.tag/\", $.data.rightSplit(separator => \"/\", maxSplits => 1)[1])"}}, {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}]}, "expression": "concat($.data.rightSplit(separator => \":\", maxSplits => 1)[0], \":pcmklatest\")"}}]}, "pcmk_cinder_volume_image": "{{xmllint_pcmk_cinder_volume_image.stdout}}"}}], "when": "(step|int == 0 or step|int == 2)"}, {"name": "Check for update of cinder-volume container image name", "when": "step|int == 0", "assert": {"that": "pcmk_cinder_volume_image == cinder_volume_image_latest", "fail_msg": "cinder-volume image change detected, run overcloud external-update --tags ha_image_update first"}}, {"name": "Tear-down non-HA cinder_volume container", "when": ["step|int == 1"], "block": [{"name": "Remove non-HA cinder_volume container", "include_role": {"name": "tripleo_container_rm"}, "vars": {"tripleo_container_cli": "{{ container_cli }}", "tripleo_containers_to_rm": ["cinder_volume"]}}]}, {"name": "cinder_volume fetch and retag container image for pacemaker", "when": "step|int == 2", "block": [{"name": "Retag pcmklatest to latest cinder_volume image", "include_role": {"name": "tripleo_container_tag"}, "vars": {"container_image": "{{cinder_volume_image}}", "container_image_latest": "{{cinder_volume_image_latest}}"}}]}], "post_update_tasks": [{"name": "Cinder volume bundle post update", "when": "step|int == 1", "block": [{"name": "Cinder volume puppet bundle", "import_role": {"name": "tripleo_ha_wrapper"}, "vars": {"tripleo_ha_wrapper_service_name": "cinder_volume", "tripleo_ha_wrapper_resource_name": "openstack-cinder-volume", "tripleo_ha_wrapper_bundle_name": "openstack-cinder-volume", "tripleo_ha_wrapper_resource_state": "_ Started", "tripleo_ha_wrapper_puppet_config_volume": "cinder", "tripleo_ha_wrapper_puppet_execute": "include ::tripleo::profile::base::pacemaker; include ::tripleo::profile::pacemaker::cinder::volume_bundle", "tripleo_ha_wrapper_puppet_tags": "pacemaker::resource::bundle,pacemaker::property,pacemaker::resource::ip,pacemaker::resource::ocf,pacemaker::constraint::order,pacemaker::constraint::colocation", "tripleo_ha_wrapper_puppet_debug": {"get_param": "ConfigDebug"}, "tripleo_ha_wrapper_config_suffix": ".cinder_volume_previous_run"}}], "vars": {"tripleo_ha_wrapper_minor_update": true}}], "upgrade_tasks": {"list_concat": [[{"name": "Tear-down non-HA cinder_volume container", "when": ["step|int == 0"], "block": [{"name": "Remove non-HA cinder_volume container", "include_role": {"name": "tripleo_container_rm"}, "vars": {"tripleo_container_cli": "{{ container_cli }}", "tripleo_containers_to_rm": ["cinder_volume"]}}]}, {"name": "Prepare switch of cinder_volume image name", "when": ["step|int == 0"], "block": [{"name": "Get cinder_volume image id currently used by pacemaker", "shell": "pcs resource config openstack-cinder-volume | grep -Eo 'image=[^ ]+' | awk -F= '{print $2;}'", "register": "cinder_volume_image_current_res", "failed_when": false}, {"name": "cinder_volume image facts", "set_fact": {"cinder_volume_image_latest": {"if": [{"get_param": "ClusterFullTag"}, "cluster.common.tag/cinder-volume:pcmklatest", {"yaql": {"data": {"if": [{"get_param": "ClusterCommonTag"}, {"yaql": {"data": {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}, "expression": "concat(\"cluster.common.tag/\", $.data.rightSplit(separator => \"/\", maxSplits => 1)[1])"}}, {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}]}, "expression": "concat($.data.rightSplit(separator => \":\", maxSplits => 1)[0], \":pcmklatest\")"}}]}, "cinder_volume_image_current": "{{cinder_volume_image_current_res.stdout}}"}}, {"name": "Temporarily tag the current cinder_volume image id with the upgraded image name", "import_role": {"name": "tripleo_container_tag"}, "vars": {"container_image": "{{cinder_volume_image_current}}", "container_image_latest": "{{cinder_volume_image_latest}}", "pull_image": false}, "when": ["cinder_volume_image_current != ''", "cinder_volume_image_current != cinder_volume_image_latest"]}, {"name": "Create cinder_volume retag statefile", "file": {"path": "/var/lib/tripleo/cinder_volume_needs_retag", "state": "touch"}, "when": ["cinder_volume_image_current != ''", "cinder_volume_image_current != cinder_volume_image_latest"]}]}, {"name": "Update cinder_volume pcs resource bundle for new container image", "when": ["step|int == 1"], "block": [{"name": "set is_cinder_volume_bootstrap_node fact", "tags": "common", "set_fact": "is_cinder_volume_bootstrap_node={{cinder_volume_short_bootstrap_node_name|lower == ansible_facts['hostname']|lower}}"}, {"name": "Check for cinder_volume retag statefile", "stat": {"path": "/var/lib/tripleo/cinder_volume_needs_retag"}, "register": "cinder_volume_retag_state_file"}]}, {"name": "Update cinder_volume pcs resource bundle for new container image", "when": ["step|int == 1", "is_cinder_volume_bootstrap_node", "cinder_volume_retag_state_file.stat.exists|bool"], "block": [{"name": "Disable the cinder_volume cluster resource before container upgrade", "pacemaker_resource": {"resource": "openstack-cinder-volume", "state": "disable", "wait_for_resource": true}, "register": "output", "retries": 5, "until": "output.rc == 0"}, {"name": "pcs resource bundle update cinder_volume for new container image name", "command": "pcs resource bundle update openstack-cinder-volume container image={{cinder_volume_image_latest}}"}, {"name": "Enable the cinder_volume cluster resource", "pacemaker_resource": {"resource": "openstack-cinder-volume", "state": "enable", "wait_for_resource": true}, "register": "output", "retries": 5, "until": "output.rc == 0"}]}, {"name": "Check for cinder_volume retag statefile", "when": ["step|int == 3"], "stat": {"path": "/var/lib/tripleo/cinder_volume_needs_retag"}, "register": "cinder_volume_retag_state_file"}, {"name": "Retag pacemaker cinder_volume", "when": ["step|int == 3", "cinder_volume_retag_state_file.stat.exists|bool"], "block": [{"name": "Disable the cinder_volume cluster resource before container upgrade", "pacemaker_resource": {"resource": "openstack-cinder-volume", "state": "disable", "wait_for_resource": true}, "register": "output", "retries": 5, "until": "output.rc == 0"}, {"name": "Retag the pacemaker image if containerized", "block": [{"block": [{"name": "Get cinder_volume image from pacemaker", "become": true, "register": "xmllint_pcmk_cinder_volume_image", "shell": "xmllint --xpath \"string(//bundle[@id='openstack-cinder-volume']/podman/@image)\" /var/lib/pacemaker/cib/cib.xml"}, {"name": "Get container cinder_volume image", "set_fact": {"cinder_volume_image": {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}, "cinder_volume_image_latest": {"if": [{"get_param": "ClusterFullTag"}, "cluster.common.tag/cinder-volume:pcmklatest", {"yaql": {"data": {"if": [{"get_param": "ClusterCommonTag"}, {"yaql": {"data": {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}, "expression": "concat(\"cluster.common.tag/\", $.data.rightSplit(separator => \"/\", maxSplits => 1)[1])"}}, {"get_attr": ["RoleParametersValue", "value", "ContainerCinderVolumeImage"]}]}, "expression": "concat($.data.rightSplit(separator => \":\", maxSplits => 1)[0], \":pcmklatest\")"}}]}, "pcmk_cinder_volume_image": "{{xmllint_pcmk_cinder_volume_image.stdout}}"}}]}, {"block": [{"name": "Retag pcmklatest to latest cinder_volume image", "include_role": {"name": "tripleo_container_tag"}, "vars": {"container_image": "{{cinder_volume_image}}", "container_image_latest": "{{cinder_volume_image_latest}}"}}]}]}, {"name": "Enable the cinder_volume cluster resource", "pacemaker_resource": {"resource": "openstack-cinder-volume", "state": "enable", "wait_for_resource": true}, "register": "output", "retries": 5, "until": "output.rc == 0"}, {"name": "Remove cinder_volume retag statefile", "file": {"path": "/var/lib/tripleo/cinder_volume_needs_retag", "state": "absent"}}]}], {"get_attr": ["CinderCommon", "cinder_volume_upgrade_tasks"]}]}, "post_upgrade_tasks": [{"name": "Start cinder_volume service (pacemaker)", "become": true, "when": "step|int == 1", "pacemaker_resource": {"resource": "openstack-cinder-volume", "state": "enable"}}]}}}}