--- version: '2.0' name: tripleo.plan_management.v1 description: TripleO Overcloud Deployment Workflows v1 workflows: create_default_deployment_plan: description: > This workflow exists to maintain backwards compatibility in pike. This workflow will likely be removed in queens in favor of create_deployment_plan. input: - container - queue_name: tripleo - generate_passwords: true tags: - tripleo-common-managed tasks: call_create_deployment_plan: workflow: tripleo.plan_management.v1.create_deployment_plan on-success: set_status_success on-error: call_create_deployment_plan_set_status_failed input: container: <% $.container %> queue_name: <% $.queue_name %> generate_passwords: <% $.generate_passwords %> use_default_templates: true set_status_success: on-success: notify_zaqar publish: status: SUCCESS message: <% task(call_create_deployment_plan).result %> call_create_deployment_plan_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(call_create_deployment_plan).result %> notify_zaqar: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.create_default_deployment_plan payload: status: <% $.status %> message: <% $.get('message', '') %> execution: <% execution() %> on-success: - fail: <% $.get('status') = "FAILED" %> create_deployment_plan: description: > This workflow provides the capability to create a deployment plan using the default heat templates provided in a standard TripleO undercloud deployment, heat templates contained in an external git repository, or a swift container that already contains templates. input: - container - source_url: null - queue_name: tripleo - generate_passwords: true - use_default_templates: false tags: - tripleo-common-managed tasks: container_required_check: description: > If using the default templates or importing templates from a git repository, a new container needs to be created. If using an existing container containing templates, skip straight to create_plan. on-success: - verify_container_doesnt_exist: <% $.use_default_templates or $.source_url %> - create_plan: <% $.use_default_templates = false and $.source_url = null %> verify_container_doesnt_exist: action: swift.head_container container=<% $.container %> on-success: notify_zaqar on-error: create_container publish: status: FAILED message: "Unable to create plan. The Swift container already exists" create_container: action: tripleo.plan.create_container container=<% $.container %> on-success: templates_source_check on-error: create_container_set_status_failed cleanup_temporary_files: action: tripleo.git.clean container=<% $.container %> templates_source_check: on-success: - upload_default_templates: <% $.use_default_templates = true %> - clone_git_repo: <% $.source_url != null %> clone_git_repo: action: tripleo.git.clone container=<% $.container %> url=<% $.source_url %> on-success: upload_templates_directory on-error: clone_git_repo_set_status_failed upload_templates_directory: action: tripleo.templates.upload container=<% $.container %> templates_path=<% task(clone_git_repo).result %> on-success: create_plan on-complete: cleanup_temporary_files on-error: upload_templates_directory_set_status_failed upload_default_templates: action: tripleo.templates.upload container=<% $.container %> on-success: create_plan on-error: upload_to_container_set_status_failed create_plan: on-success: - ensure_passwords_exist: <% $.generate_passwords = true %> - add_root_stack_name: <% $.generate_passwords != true %> ensure_passwords_exist: action: tripleo.parameters.generate_passwords container=<% $.container %> on-success: add_root_stack_name on-error: ensure_passwords_exist_set_status_failed add_root_stack_name: action: tripleo.parameters.update input: container: <% $.container %> parameters: RootStackName: <% $.container %> on-success: container_images_prepare publish-on-error: status: FAILED message: <% task().result %> on-error: notify_zaqar container_images_prepare: description: > Populate all container image parameters with default values. action: tripleo.container_images.prepare container=<% $.container %> on-success: process_templates on-error: container_images_prepare_set_status_failed process_templates: action: tripleo.templates.process container=<% $.container %> on-success: set_status_success on-error: process_templates_set_status_failed set_status_success: on-success: notify_zaqar publish: status: SUCCESS message: 'Plan created.' create_container_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(create_container).result %> clone_git_repo_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(clone_git_repo).result %> upload_templates_directory_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(upload_templates_directory).result %> upload_to_container_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(upload_default_templates).result %> ensure_passwords_exist_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(ensure_passwords_exist).result %> process_templates_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(process_templates).result %> container_images_prepare_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(container_images_prepare).result %> notify_zaqar: action: zaqar.queue_post retry: count=5 delay=1 input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.create_deployment_plan payload: status: <% $.status %> message: <% $.get('message', '') %> execution: <% execution() %> on-success: - fail: <% $.get('status') = "FAILED" %> update_deployment_plan: input: - container - source_url: null - queue_name: tripleo - generate_passwords: true - plan_environment: null tags: - tripleo-common-managed tasks: templates_source_check: on-success: - update_plan: <% $.source_url = null %> - clone_git_repo: <% $.source_url != null %> clone_git_repo: action: tripleo.git.clone container=<% $.container %> url=<% $.source_url %> on-success: upload_templates_directory on-error: clone_git_repo_set_status_failed upload_templates_directory: action: tripleo.templates.upload container=<% $.container %> templates_path=<% task(clone_git_repo).result %> on-success: create_swift_rings_backup_plan on-complete: cleanup_temporary_files on-error: upload_templates_directory_set_status_failed cleanup_temporary_files: action: tripleo.git.clean container=<% $.container %> create_swift_rings_backup_plan: workflow: tripleo.swift_rings_backup.v1.create_swift_rings_backup_container_plan on-success: update_plan on-error: create_swift_rings_backup_plan_set_status_failed input: container: <% $.container %> queue_name: <% $.queue_name %> use_default_templates: true update_plan: on-success: - ensure_passwords_exist: <% $.generate_passwords = true %> - container_images_prepare: <% $.generate_passwords != true %> ensure_passwords_exist: action: tripleo.parameters.generate_passwords container=<% $.container %> on-success: container_images_prepare on-error: ensure_passwords_exist_set_status_failed container_images_prepare: description: > Populate all container image parameters with default values. action: tripleo.container_images.prepare container=<% $.container %> on-success: process_templates on-error: container_images_prepare_set_status_failed process_templates: action: tripleo.templates.process container=<% $.container %> on-success: - set_status_success: <% $.plan_environment = null %> - upload_plan_environment: <% $.plan_environment != null %> on-error: process_templates_set_status_failed upload_plan_environment: action: tripleo.templates.upload_plan_environment container=<% $.container %> plan_environment=<% $.plan_environment %> on-success: set_status_success on-error: process_templates_set_status_failed set_status_success: on-success: notify_zaqar publish: status: SUCCESS message: 'Plan updated.' create_swift_rings_backup_plan_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(create_swift_rings_backup_plan).result %> clone_git_repo_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(clone_git_repo).result %> upload_templates_directory_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(upload_templates_directory).result %> process_templates_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(process_templates).result %> ensure_passwords_exist_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(ensure_passwords_exist).result %> container_images_prepare_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(container_images_prepare).result %> notify_zaqar: action: zaqar.queue_post retry: count=5 delay=1 input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.update_deployment_plan payload: status: <% $.status %> message: <% $.get('message', '') %> execution: <% execution() %> on-success: - fail: <% $.get('status') = "FAILED" %> delete_deployment_plan: description: > Deletes a plan by deleting the container matching plan_name. It will not delete the plan if a stack exists with the same name. tags: - tripleo-common-managed input: - container: overcloud - queue_name: tripleo tasks: delete_plan: action: tripleo.plan.delete container=<% $.container %> on-complete: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> publish: status: SUCCESS message: <% task().result %> notify_zaqar: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.delete_deployment_plan payload: status: <% $.status %> message: <% $.get('message', '') %> execution: <% execution() %> on-success: - fail: <% $.get('status') = "FAILED" %> get_passwords: description: Retrieves passwords for a given plan input: - container - queue_name: tripleo tags: - tripleo-common-managed tasks: verify_container_exists: action: swift.head_container container=<% $.container %> on-success: get_environment_passwords on-error: verify_container_set_status_failed get_environment_passwords: action: tripleo.parameters.get_passwords container=<% $.container %> on-success: get_passwords_set_status_success on-error: get_passwords_set_status_failed get_passwords_set_status_success: on-success: notify_zaqar publish: status: SUCCESS message: <% task(get_environment_passwords).result %> get_passwords_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(get_environment_passwords).result %> verify_container_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(verify_container_exists).result %> notify_zaqar: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.get_passwords payload: status: <% $.status %> message: <% $.get('message', '') %> execution: <% execution() %> on-success: - fail: <% $.get('status') = "FAILED" %> export_deployment_plan: description: Creates an export tarball for a given plan input: - plan - queue_name: tripleo tags: - tripleo-common-managed tasks: export_plan: action: tripleo.plan.export input: plan: <% $.plan %> delete_after: 3600 exports_container: "plan-exports" on-success: create_tempurl on-error: export_plan_set_status_failed create_tempurl: action: tripleo.swift.tempurl on-success: set_status_success on-error: create_tempurl_set_status_failed input: container: "plan-exports" obj: "<% $.plan %>.tar.gz" valid: 3600 set_status_success: on-success: notify_zaqar publish: status: SUCCESS message: <% task(create_tempurl).result %> tempurl: <% task(create_tempurl).result %> export_plan_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(export_plan).result %> create_tempurl_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(create_tempurl).result %> notify_zaqar: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.export_deployment_plan payload: status: <% $.status %> message: <% $.get('message', '') %> execution: <% execution() %> tempurl: <% $.get('tempurl', '') %> on-success: - fail: <% $.get('status') = "FAILED" %> get_deprecated_parameters: description: Gets the list of deprecated parameters in the whole of the plan including nested stack input: - container: overcloud - queue_name: tripleo tags: - tripleo-common-managed tasks: get_flatten_data: action: tripleo.parameters.get_flatten container=<% $.container %> on-success: get_deprecated_params on-error: set_status_failed_get_flatten_data publish: user_params: <% task().result.environment_parameters %> plan_params: <% task().result.heat_resource_tree.parameters.keys() %> parameter_groups: <% task().result.heat_resource_tree.resources.values().where( $.get('parameter_groups') ).select($.parameter_groups).flatten() %> get_deprecated_params: on-success: check_if_user_param_has_deprecated publish: deprecated_params: <% $.parameter_groups.where($.get('label') = 'deprecated').select($.parameters).flatten().distinct() %> check_if_user_param_has_deprecated: on-success: get_unused_params publish: deprecated_result: <% let(up => $.user_params) -> $.deprecated_params.select( dict('parameter' => $, 'deprecated' => true, 'user_defined' => $up.keys().contains($)) ) %> # Get the list of parameters, which are defined by user via environment files's parameter_default, but not part of the plan definition # It may be possible that the parameter will be used by a service, but the service is not part of the plan. # In such cases, the parameter will be reported as unused, care should be take to understand whether it is really unused or not. get_unused_params: on-success: send_message publish: unused_params: <% let(plan_params => $.plan_params) -> $.user_params.keys().where( not $plan_params.contains($) ) %> set_status_failed_get_flatten_data: on-success: send_message publish: status: FAILED message: <% task(get_flatten_data).result %> send_message: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.get_deprecated_parameters payload: status: <% $.get('status', 'SUCCESS') %> message: <% $.get('message', '') %> execution: <% execution() %> deprecated: <% $.get('deprecated_result', []) %> unused: <% $.get('unused_params', []) %> on-success: - fail: <% $.get('status') = "FAILED" %> publish_ui_logs_to_swift: description: > This workflow drains a zaqar queue, and publish its messages into a log file in swift. This workflow is called by cron trigger. input: - logging_queue_name: tripleo-ui-logging - logging_container: tripleo-ui-logs tags: - tripleo-common-managed tasks: # We're using a NoOp action to start the workflow. The recursive nature # of the workflow means that Mistral will refuse to execute it because it # doesn't know where to begin. start: on-success: get_messages get_messages: action: zaqar.claim_messages on-success: - format_messages: <% task().result.len() > 0 %> input: queue_name: <% $.logging_queue_name %> ttl: 60 grace: 60 publish: status: SUCCESS messages: <% task().result %> message_ids: <% task().result.select($._id) %> format_messages: action: tripleo.logging_to_swift.format_messages on-success: upload_to_swift input: messages: <% $.messages %> publish: status: SUCCESS formatted_messages: <% task().result %> upload_to_swift: action: tripleo.logging_to_swift.publish_ui_log_to_swift on-success: delete_messages input: logging_data: <% $.formatted_messages %> logging_container: <% $.logging_container %> publish: status: SUCCESS delete_messages: action: zaqar.delete_messages on-success: get_messages input: queue_name: <% $.logging_queue_name %> messages: <% $.message_ids %> publish: status: SUCCESS download_logs: description: Creates a tarball with logging data input: - queue_name: tripleo - logging_container: "tripleo-ui-logs" - downloads_container: "tripleo-ui-logs-downloads" - delete_after: 3600 tags: - tripleo-common-managed tasks: publish_logs: workflow: tripleo.plan_management.v1.publish_ui_logs_to_swift on-success: prepare_log_download on-error: publish_logs_set_status_failed prepare_log_download: action: tripleo.logging_to_swift.prepare_log_download input: logging_container: <% $.logging_container %> downloads_container: <% $.downloads_container %> delete_after: <% $.delete_after %> on-success: create_tempurl on-error: download_logs_set_status_failed publish: filename: <% task().result %> create_tempurl: action: tripleo.swift.tempurl on-success: set_status_success on-error: create_tempurl_set_status_failed input: container: <% $.downloads_container %> obj: <% $.filename %> valid: 3600 publish: tempurl: <% task().result %> set_status_success: on-success: notify_zaqar publish: status: SUCCESS message: <% task(create_tempurl).result %> tempurl: <% task(create_tempurl).result %> publish_logs_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(publish_logs).result %> download_logs_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(prepare_log_download).result %> create_tempurl_set_status_failed: on-success: notify_zaqar publish: status: FAILED message: <% task(create_tempurl).result %> notify_zaqar: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.download_logs payload: status: <% $.status %> message: <% $.get('message', '') %> execution: <% execution() %> tempurl: <% $.get('tempurl', '') %> on-success: - fail: <% $.get('status') = "FAILED" %> list_roles: description: Retrieve the roles_data.yaml and return a usable object input: - container: overcloud - roles_data_file: 'roles_data.yaml' - queue_name: tripleo output: roles_data: <% $.roles_data %> tags: - tripleo-common-managed tasks: get_roles_data: action: swift.get_object input: container: <% $.container %> obj: <% $.roles_data_file %> publish: roles_data: <% yaml_parse(task().result.last()) %> status: SUCCESS on-success: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> on-error: notify_zaqar notify_zaqar: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.list_roles payload: status: <% $.status %> roles_data: <% $.get('roles_data', {}) %> message: <% $.get('message', '') %> execution: <% execution() %> on-success: - fail: <% $.get('status') = "FAILED" %> list_available_networks: input: - container - queue_name: tripleo output: available_networks: <% $.available_networks %> tags: - tripleo-common-managed tasks: get_network_file_names: action: swift.get_container input: container: <% $.container %> publish: network_names: <% task().result[1].where($.name.startsWith('networks/')).where($.name.endsWith('.yaml')).name %> on-success: get_network_files on-error: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> get_network_files: with-items: network_name in <% $.network_names %> action: swift.get_object on-success: transform_output on-error: notify_zaqar input: container: <% $.container %> obj: <% $.network_name %> publish: status: SUCCESS available_yaml_networks: <% task().result.select($[1]) %> publish-on-error: status: FAILED message: <% task().result %> transform_output: publish: status: SUCCESS available_networks: <% yaml_parse($.available_yaml_networks.join("\n")) %> publish-on-error: status: FAILED message: <% task().result %> on-complete: notify_zaqar notify_zaqar: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.list_available_networks payload: status: <% $.status %> message: <% $.get('message', '') %> execution: <% execution() %> available_networks: <% $.get('available_networks', []) %> on-success: - fail: <% $.get('status') = "FAILED" %> list_networks: input: - container: 'overcloud' - network_data_file: 'network_data.yaml' - queue_name: tripleo output: network_data: <% $.network_data %> tags: - tripleo-common-managed tasks: get_networks: action: swift.get_object input: container: <% $.container %> obj: <% $.network_data_file %> on-success: notify_zaqar publish: network_data: <% yaml_parse(task().result.last()) %> status: SUCCESS message: <% task().result %> on-error: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> notify_zaqar: action: zaqar.queue_post retry: count=5 delay=1 input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.list_networks payload: status: <% $.status %> network_data: <% $.get('network_data', {}) %> message: <% $.get('message', '') %> execution: <% execution() %> on-success: - fail: <% $.get('status') = "FAILED" %> validate_network_files: description: Validate network files exist input: - container: overcloud - network_data - queue_name: tripleo output: network_data: <% $.network_data %> tags: - tripleo-common-managed tasks: get_network_names: publish: network_names_lower: <% $.network_data.where($.containsKey('name_lower')).name_lower %> network_names: <% $.network_data.where(not $.containsKey('name_lower')).name %> on-success: validate_networks validate_networks: with-items: network in <% $.network_names_lower.concat($.network_names) %> action: swift.head_object input: container: <% $.container %> obj: network/<% $.network.toLower() %>.yaml publish: status: SUCCESS message: <% task().result %> on-success: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> notify_zaqar: action: zaqar.queue_post retry: count=5 delay=1 input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.validate_network_files payload: status: <% $.status %> message: <% $.message %> execution: <% execution() %> on-success: - fail: <% $.get('status') = "FAILED" %> validate_networks: description: Validate network files were generated properly and exist input: - container: 'overcloud' - network_data_file: 'network_data.yaml' - queue_name: tripleo output: network_data: <% $.network_data %> tags: - tripleo-common-managed tasks: get_network_data: workflow: list_networks input: container: <% $.container %> network_data_file: <% $.network_data_file %> queue_name: <% $.queue_name %> publish: network_data: <% task().result.network_data %> on-success: validate_networks publish-on-error: status: FAILED message: <% task().result %> on-error: notify_zaqar validate_networks: workflow: validate_network_files input: container: <% $.container %> network_data: <% $.network_data %> queue_name: <% $.queue_name %> publish: status: SUCCESS message: <% task().result %> on-success: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> on-error: notify_zaqar notify_zaqar: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.validate_networks payload: status: <% $.status %> network_data: <% $.get('network_data', {}) %> message: <% $.get('message', '') %> execution: <% execution() %> on-success: - fail: <% $.get('status') = "FAILED" %> validate_roles: description: Vaildate roles data exists and is parsable input: - container: overcloud - roles_data_file: 'roles_data.yaml' - queue_name: tripleo output: roles_data: <% $.roles_data %> tags: - tripleo-common-managed tasks: get_roles_data: workflow: list_roles input: container: <% $.container %> roles_data_file: <% $.roles_data_file %> queue_name: <% $.queue_name %> publish: roles_data: <% task().result.roles_data %> status: SUCCESS on-success: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> on-error: notify_zaqar notify_zaqar: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.validate_networks payload: status: <% $.status %> roles_data: <% $.get('roles_data', '') %> message: <% $.get('message', '') %> execution: <% execution() %> on-success: - fail: <% $.get('status') = "FAILED" %> _validate_networks_from_roles: description: Internal workflow for validating a network exists from a role input: - container: overcloud - defined_networks - networks_in_roles - queue_name: tripleo tags: - tripleo-common-managed tasks: validate_network_in_network_data: publish: networks_found: <% $.networks_in_roles.toSet().intersect($.defined_networks.toSet()) %> networks_not_found: <% $.networks_in_roles.toSet().difference($.defined_networks.toSet()) %> on-success: - network_not_found: <% $.networks_not_found %> - notify_zaqar: <% not $.networks_not_found %> network_not_found: publish: message: <% "Some networks in roles are not defined, {0}".format($.networks_not_found.join(', ')) %> status: FAILED on-success: notify_zaqar notify_zaqar: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1._validate_networks_from_role payload: status: <% $.get('status', 'SUCCESS') %> message: <% $.get('message', '') %> execution: <% execution() %> on-success: - fail: <% $.get('status') = "FAILED" %> validate_roles_and_networks: description: Vaidate that roles and network data are valid input: - container: overcloud - roles_data_file: 'roles_data.yaml' - network_data_file: 'network_data.yaml' - queue_name: tripleo output: roles_data: <% $.roles_data %> network_data: <% $.network_data %> tags: - tripleo-common-managed tasks: validate_network_data: workflow: validate_networks input: container: <% $.container %> network_data_file: <% $.network_data_file %> queue_name: <% $.queue_name %> publish: network_data: <% task().result.network_data %> on-success: validate_roles_data publish-on-error: status: FAILED message: <% task().result %> on-error: notify_zaqar validate_roles_data: workflow: validate_roles input: container: <% $.container %> roles_data_file: <% $.roles_data_file %> queue_name: <% $.queue_name %> publish: roles_data: <% task().result.roles_data %> role_networks_data: <% task().result.roles_data.networks %> networks_in_roles: <% task().result.roles_data.networks.flatten().distinct() %> on-success: validate_roles_and_networks publish-on-error: status: FAILED message: <% task().result %> on-error: notify_zaqar validate_roles_and_networks: workflow: _validate_networks_from_roles input: container: <% $.container %> defined_networks: <% $.network_data.name %> networks_in_roles: <% $.networks_in_roles %> queue_name: <% $.queue_name %> publish: status: SUCCESS on-success: notify_zaqar publish-on-error: status: FAILED message: <% task().result.message %> on-error: notify_zaqar notify_zaqar: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.validate_roles_and_networks payload: status: <% $.status %> roles_data: <% $.get('roles_data', {}) %> network_data: <% $.get('network_data', {}) %> message: <% $.get('message', '') %> execution: <% execution() %> on-success: - fail: <% $.get('status') = "FAILED" %> list_available_roles: input: - container: overcloud - queue_name: tripleo output: available_roles: <% $.available_roles %> tags: - tripleo-common-managed tasks: get_role_file_names: action: swift.get_container input: container: <% $.container %> publish: role_names: <% task().result[1].where($.name.startsWith('roles/')).where($.name.endsWith('.yaml')).name %> on-success: get_role_files on-error: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> get_role_files: with-items: role_name in <% $.role_names %> action: swift.get_object on-success: transform_output on-error: notify_zaqar input: container: <% $.container %> obj: <% $.role_name %> publish: status: SUCCESS available_yaml_roles: <% task().result.select($[1]) %> publish-on-error: status: FAILED message: <% task().result %> transform_output: publish: status: SUCCESS available_roles: <% yaml_parse($.available_yaml_roles.join("\n")) %> publish-on-error: status: FAILED message: <% task().result %> on-complete: notify_zaqar notify_zaqar: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.list_available_roles payload: status: <% $.status %> message: <% $.get('message', '') %> execution: <% execution() %> available_roles: <% $.get('available_roles', []) %> on-success: - fail: <% $.get('status') = "FAILED" %> update_roles: description: > takes data in json format validates its contents and persists them in roles_data.yaml, after successful update, templates are regenerated. input: - container - roles - roles_data_file: 'roles_data.yaml' - replace_all: false - queue_name: tripleo tags: - tripleo-common-managed tasks: get_available_roles: workflow: list_available_roles input: container: <% $.container %> queue_name: <% $.queue_name%> publish: available_roles: <% task().result.available_roles %> on-success: validate_input on-error: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> validate_input: description: > validate the format of input (verify that each role in input has the required attributes set. check README in roles directory in t-h-t), validate that roles in input exist in roles directory in t-h-t action: tripleo.plan.validate_roles input: container: <% $.container %> roles: <% $.roles %> available_roles: <% $.available_roles %> on-success: get_network_data on-error: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> get_network_data: workflow: list_networks input: container: <% $.container %> queue_name: <% $.queue_name %> publish: network_data: <% task().result.network_data %> on-success: validate_network_names publish-on-error: status: FAILED message: <% task().result %> on-error: notify_zaqar validate_network_names: description: > validate that Network names assigned to Role exist in network-data.yaml object in Swift container workflow: _validate_networks_from_roles input: container: <% $.container %> defined_networks: <% $.network_data.name %> networks_in_roles: <% $.roles.networks.flatten().distinct() %> queue_name: <% $.queue_name %> on-success: get_current_roles on-error: notify_zaqar publish-on-error: status: FAILED message: <% task().result.message %> get_current_roles: workflow: list_roles input: container: <% $.container %> roles_data_file: <% $.roles_data_file %> queue_name: <% $.queue_name %> publish: current_roles: <% task().result.roles_data %> on-success: update_roles_data on-error: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> update_roles_data: description: > update roles_data.yaml object in Swift with roles from workflow input action: tripleo.plan.update_roles input: container: <% $.container %> roles: <% $.roles %> current_roles: <% $.current_roles %> replace_all: <% $.replace_all %> publish: updated_roles_data: <% task().result.roles %> on-success: update_roles_data_in_swift on-error: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> update_roles_data_in_swift: description: > update roles_data.yaml object in Swift with data from workflow input action: swift.put_object input: container: <% $.container %> obj: <% $.roles_data_file %> contents: <% yaml_dump($.updated_roles_data) %> on-success: regenerate_templates publish-on-error: status: FAILED message: <% task().result %> on-error: notify_zaqar regenerate_templates: action: tripleo.templates.process container=<% $.container %> on-success: get_updated_roles on-error: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> get_updated_roles: workflow: list_roles input: container: <% $.container %> roles_data_file: <% $.roles_data_file %> publish: updated_roles: <% task().result.roles_data %> status: SUCCESS on-complete: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> notify_zaqar: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.roles.v1.update_roles payload: status: <% $.status %> message: <% $.get('message', '') %> execution: <% execution() %> updated_roles: <% $.get('updated_roles', []) %> on-success: - fail: <% $.get('status') = "FAILED" %> select_roles: description: > takes a list of role names as input and populates roles_data.yaml in container in Swift with respective roles from 'roles directory' input: - container - role_names - roles_data_file: 'roles_data.yaml' - replace_all: true - queue_name: tripleo tags: - tripleo-common-managed tasks: get_available_roles: workflow: list_available_roles input: container: <% $.container %> queue_name: <% $.queue_name %> publish: available_roles: <% task().result.available_roles %> on-success: get_current_roles on-error: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> get_current_roles: workflow: list_roles input: container: <% $.container %> roles_data_file: <% $.roles_data_file %> queue_name: <% $.queue_name %> publish: current_roles: <% task().result.roles_data %> on-success: gather_roles on-error: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> gather_roles: description: > for each role name from the input, check if it exists in roles_data.yaml, if yes, use that role definition, if not, get the role definition from roles directory. Use the gathered roles definitions as input to updateRolesWorkflow - this ensures configuration of the roles which are already in roles_data.yaml will not get overridden by data from roles directory action: tripleo.plan.gather_roles input: role_names: <% $.role_names %> current_roles: <% $.current_roles %> available_roles: <% $.available_roles %> publish: gathered_roles: <% task().result.gathered_roles %> on-success: call_update_roles_workflow on-error: notify_zaqar publish-on-error: status: FAILED message: <% task().result %> call_update_roles_workflow: workflow: update_roles input: container: <% $.container %> roles: <% $.gathered_roles %> roles_data_file: <% $.roles_data_file %> replace_all: <% $.replace_all %> queue_name: <% $.queue_name %> on-complete: notify_zaqar publish: selected_roles: <% task().result.updated_roles %> status: SUCCESS publish-on-error: status: FAILED message: <% task().result %> notify_zaqar: action: zaqar.queue_post input: queue_name: <% $.queue_name %> messages: body: type: tripleo.plan_management.v1.select_roles payload: status: <% $.status %> message: <% $.get('message', '') %> execution: <% execution() %> selected_roles: <% $.get('selected_roles', []) %> on-success: - fail: <% $.get('status') = "FAILED" %>