From af3806a5a3442cf120561e7a6c5961d6bd127c37 Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Wed, 20 May 2026 13:13:28 -0400 Subject: [PATCH] Drop the deprecated Automate based Service provisioning --- .../JobTemplate.class/__class__.yaml | 253 -------------- .../JobTemplate.class/_missing.yaml | 12 - .../Operations/Methods.class/__class__.yaml | 73 ---- .../__methods__/available_credentials.rb | 66 ---- .../__methods__/available_credentials.yaml | 52 --- .../available_machine_credentials.yaml | 14 - .../available_network_credentials.yaml | 14 - ...ansible_available_machine_credentials.yaml | 16 - ...ansible_available_network_credentials.yaml | 16 - .../StateMachines/Job.class/__class__.yaml | 73 ---- .../__methods__/launch_ansible_job.rb | 160 --------- .../__methods__/launch_ansible_job.yaml | 12 - .../__methods__/wait_for_completion.rb | 70 ---- .../__methods__/wait_for_completion.yaml | 12 - .../Job.class/__methods__/wait_for_ip.rb | 51 --- .../Job.class/__methods__/wait_for_ip.yaml | 12 - .../StateMachines/Job.class/default.yaml | 10 - .../StateMachines/__namespace__.yaml | 10 - .../Operations/__namespace__.yaml | 10 - .../Provision.class/__class__.yaml | 313 ------------------ .../__methods__/check_provisioned.rb | 83 ----- .../__methods__/check_provisioned.yaml | 12 - .../__methods__/post_provision.rb | 57 ---- .../__methods__/post_provision.yaml | 12 - .../__methods__/preprovision.rb | 65 ---- .../__methods__/preprovision.yaml | 12 - .../Provision.class/__methods__/provision.rb | 56 ---- .../__methods__/provision.yaml | 12 - .../update_serviceprovision_status.rb | 57 ---- .../update_serviceprovision_status.yaml | 32 -- .../Provision.class/_missing.yaml | 16 - .../catalogiteminitialization.yaml | 16 - .../StateMachines/__namespace__.yaml | 10 - .../Service/Provisioning/__namespace__.yaml | 10 - .../AnsibleTower/Service/__namespace__.yaml | 10 - .../AnsibleTower/__namespace__.yaml | 10 - .../__methods__/available_credentials_spec.rb | 115 ------- .../__methods__/launch_ansible_job_spec.rb | 242 -------------- .../__methods__/wait_for_completion_spec.rb | 42 --- .../Job.class/__methods__/wait_for_ip_spec.rb | 32 -- .../__methods__/check_provisioned_spec.rb | 65 ---- .../__methods__/preprovision_spec.rb | 24 -- .../__methods__/provision_spec.rb | 29 -- .../update_serviceprovision_status_spec.rb | 79 ----- 44 files changed, 2347 deletions(-) delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/JobTemplate.class/__class__.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/JobTemplate.class/_missing.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__class__.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__methods__/available_credentials.rb delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__methods__/available_credentials.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/available_machine_credentials.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/available_network_credentials.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/embedded_ansible_available_machine_credentials.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/embedded_ansible_available_network_credentials.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__class__.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/launch_ansible_job.rb delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/launch_ansible_job.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_completion.rb delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_completion.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_ip.rb delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_ip.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/default.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/__namespace__.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/__namespace__.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__class__.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/check_provisioned.rb delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/check_provisioned.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/post_provision.rb delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/post_provision.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/preprovision.rb delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/preprovision.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/provision.rb delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/provision.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/update_serviceprovision_status.rb delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/update_serviceprovision_status.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/_missing.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/catalogiteminitialization.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/__namespace__.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/__namespace__.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/__namespace__.yaml delete mode 100644 content/automate/ManageIQ/AutomationManagement/AnsibleTower/__namespace__.yaml delete mode 100644 spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__methods__/available_credentials_spec.rb delete mode 100644 spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/launch_ansible_job_spec.rb delete mode 100644 spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_completion_spec.rb delete mode 100644 spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_ip_spec.rb delete mode 100644 spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/check_provisioned_spec.rb delete mode 100644 spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/preprovision_spec.rb delete mode 100644 spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/provision_spec.rb delete mode 100644 spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/update_serviceprovision_status_spec.rb diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/JobTemplate.class/__class__.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/JobTemplate.class/__class__.yaml deleted file mode 100644 index bbb6dd865..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/JobTemplate.class/__class__.yaml +++ /dev/null @@ -1,253 +0,0 @@ ---- -object_type: class -version: 1.0 -object: - attributes: - description: - display_name: - name: JobTemplate - type: - inherits: - visibility: - owner: - schema: - - field: - aetype: attribute - name: job_template_name - display_name: '' - datatype: string - priority: 1 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: attribute - name: param1 - display_name: '' - datatype: string - priority: 2 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: attribute - name: param2 - display_name: - datatype: string - priority: 3 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: attribute - name: param3 - display_name: - datatype: string - priority: 4 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: attribute - name: param4 - display_name: - datatype: string - priority: 5 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: attribute - name: param5 - display_name: - datatype: string - priority: 6 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: attribute - name: param6 - display_name: - datatype: string - priority: 7 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: attribute - name: param7 - display_name: - datatype: string - priority: 8 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: attribute - name: param8 - display_name: - datatype: string - priority: 9 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: attribute - name: param9 - display_name: - datatype: string - priority: 10 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: attribute - name: param10 - display_name: - datatype: string - priority: 11 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: relationship - name: Launch - display_name: - datatype: string - priority: 12 - owner: - default_value: "/AutomationManagement/AnsibleTower/Operations/StateMachines/Job/Default" - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/JobTemplate.class/_missing.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/JobTemplate.class/_missing.yaml deleted file mode 100644 index 7e76442e7..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/JobTemplate.class/_missing.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -object_type: instance -version: 1.0 -object: - attributes: - display_name: - name: ".missing" - inherits: - description: - fields: - - job_template_name: - value: "${#_missing_instance}" diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__class__.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__class__.yaml deleted file mode 100644 index 04d94d004..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__class__.yaml +++ /dev/null @@ -1,73 +0,0 @@ ---- -object_type: class -version: 1.0 -object: - attributes: - description: - display_name: - name: Methods - type: - inherits: - visibility: - owner: - schema: - - field: - aetype: attribute - name: credential_type - display_name: - datatype: string - priority: 1 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: attribute - name: embedded_ansible - display_name: - datatype: boolean - priority: 2 - owner: - default_value: 'false' - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: method - name: execute - display_name: - datatype: string - priority: 3 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__methods__/available_credentials.rb b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__methods__/available_credentials.rb deleted file mode 100644 index 85c060030..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__methods__/available_credentials.rb +++ /dev/null @@ -1,66 +0,0 @@ -# -# Description: provide the dynamic list content from available credentials -# for Ansible Provider -# -module ManageIQ - module Automate - module AutomationManagement - module AnsibleTower - module Operations - class AvailableCredentials - AUTH_CLASS = "ManageIQ_Providers_AutomationManager_Authentication".freeze - EMBEDDED_ANSIBLE_CLASS = "ManageIQ_Providers_EmbeddedAnsible_AutomationManager".freeze - def initialize(handle = $evm) - @handle = handle - end - - def main - fill_dialog_field(fetch_list_data) - end - - private - - def provider - # for provisioning we use service_template - # for reconfig and retire use service - # Or use the embedded_ansible_provider - service = @handle.root['service_template'] || @handle.root['service'] - service.try(:playbook, 'Provision').try(:manager) || embedded_ansible_provider - end - - def embedded_ansible_provider - @handle.vmdb(EMBEDDED_ANSIBLE_CLASS).first if @handle.inputs.fetch('embedded_ansible', false) - end - - def credentials - @handle.vmdb(AUTH_CLASS).where("resource_id = ? AND type = ?", - provider.try(:id), - @handle.inputs['credential_type']) - end - - def fetch_list_data - credential_list = Hash[*credentials.pluck(:id, :name).flatten] - @handle.log(:debug, "Number of credentials found #{credential_list.count}") - {nil => ''}.merge(credential_list) - end - - def fill_dialog_field(list) - dialog_hash = { - 'sort_by' => "description", - 'data_type' => "string", - 'required' => false, - 'sort_order' => "ascending", - 'values' => list, - 'default_value' => nil - } - - dialog_hash.each { |key, value| @handle.object[key] = value } - end - end - end - end - end - end -end - -ManageIQ::Automate::AutomationManagement::AnsibleTower::Operations::AvailableCredentials.new.main diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__methods__/available_credentials.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__methods__/available_credentials.yaml deleted file mode 100644 index a4c5d66f6..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__methods__/available_credentials.yaml +++ /dev/null @@ -1,52 +0,0 @@ ---- -object_type: method -version: 1.0 -object: - attributes: - name: Available_Credentials - display_name: - description: - scope: instance - language: ruby - location: inline - inputs: - - field: - aetype: - name: credential_type - display_name: - datatype: - priority: 1 - owner: - default_value: ManageIQ::Providers::AnsibleTower::AutomationManager::MachineCredential - substitute: false - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: - name: embedded_ansible - display_name: - datatype: boolean - priority: 2 - owner: - default_value: 'false' - substitute: false - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/available_machine_credentials.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/available_machine_credentials.yaml deleted file mode 100644 index 56b3761aa..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/available_machine_credentials.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- -object_type: instance -version: 1.0 -object: - attributes: - display_name: Available_Machine_Credentials - name: Available_Machine_Credentials - inherits: - description: - fields: - - credential_type: - value: ManageIQ::Providers::AnsibleTower::AutomationManager::MachineCredential - - execute: - value: Available_Credentials diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/available_network_credentials.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/available_network_credentials.yaml deleted file mode 100644 index 5a6eb0f89..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/available_network_credentials.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- -object_type: instance -version: 1.0 -object: - attributes: - display_name: Available_Network_Credentials - name: Available_Network_Credentials - inherits: - description: - fields: - - credential_type: - value: ManageIQ::Providers::AnsibleTower::AutomationManager::NetworkCredential - - execute: - value: Available_Credentials diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/embedded_ansible_available_machine_credentials.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/embedded_ansible_available_machine_credentials.yaml deleted file mode 100644 index d25f07fab..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/embedded_ansible_available_machine_credentials.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -object_type: instance -version: 1.0 -object: - attributes: - display_name: Embedded_Ansible_Available_Machine_Credentials - name: Embedded_Ansible_Available_Machine_Credentials - inherits: - description: - fields: - - credential_type: - value: ManageIQ::Providers::EmbeddedAnsible::AutomationManager::MachineCredential - - embedded_ansible: - value: 'true' - - execute: - value: Available_Credentials diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/embedded_ansible_available_network_credentials.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/embedded_ansible_available_network_credentials.yaml deleted file mode 100644 index 8360db40b..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/embedded_ansible_available_network_credentials.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -object_type: instance -version: 1.0 -object: - attributes: - display_name: Embedded_Ansible_Available_Network_Credentials - name: Embedded_Ansible_Available_Network_Credentials - inherits: - description: - fields: - - credential_type: - value: ManageIQ::Providers::EmbeddedAnsible::AutomationManager::NetworkCredential - - embedded_ansible: - value: 'true' - - execute: - value: Available_Credentials diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__class__.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__class__.yaml deleted file mode 100644 index a7f3ef38d..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__class__.yaml +++ /dev/null @@ -1,73 +0,0 @@ ---- -object_type: class -version: 1.0 -object: - attributes: - description: - display_name: - name: Job - type: - inherits: - visibility: - owner: - schema: - - field: - aetype: state - name: WaitForIP - display_name: - datatype: string - priority: 1 - owner: - default_value: METHOD::wait_for_ip - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: '100' - max_time: - - field: - aetype: state - name: Launch - display_name: - datatype: string - priority: 2 - owner: - default_value: METHOD::launch_ansible_job - substitute: false - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: - - field: - aetype: state - name: WaitForCompletion - display_name: - datatype: string - priority: 3 - owner: - default_value: METHOD::wait_for_completion - substitute: false - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: '100' - max_time: diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/launch_ansible_job.rb b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/launch_ansible_job.rb deleted file mode 100644 index 94bdb5c3d..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/launch_ansible_job.rb +++ /dev/null @@ -1,160 +0,0 @@ -# -# Description: Launch a Ansible Job Template and save the job id -# in the state variables so we can use it when we -# wait for the job to finish. -# - -module ManageIQ - module Automate - module AutomationManagement - module AnsibleTower - module Operations - module StateMachines - module Job - class LaunchAnsibleJob - ANSIBLE_VAR_REGEX = Regexp.new(/(.*)=(.*$)/) - ANSIBLE_DIALOG_VAR_REGEX = Regexp.new(/dialog_param_(.*)/) - SCRIPT_CLASS = 'ManageIQ_Providers_ExternalAutomationManager_ConfigurationScript'.freeze - MANAGER_CLASS = 'ManageIQ_Providers_AnsibleTower_AutomationManager'.freeze - TEMPLATE_RUNNER_CLASS = 'ManageIQ_Providers_AnsibleTower_AutomationManager_TemplateRunner'.freeze - - def initialize(handle = $evm) - @handle = handle - end - - def main - run(job_template, target) - end - - private - - def target - vm = @handle.root['vm'] || vm_from_request - vm.name if vm - end - - def vm_from_request - @handle.root["miq_provision"].try(:destination) - end - - def ansible_vars_from_objects(object, ext_vars) - return ext_vars unless object - ansible_vars_from_objects(object.parent, object_vars(object, ext_vars)) - end - - def object_vars(object, ext_vars) - # We are traversing the list twice because the object.attributes is a DrbObject - # and when we use each_with_object on a DrbObject, it doesn't seem to update the - # hash. We are investigating that - key_list = object.attributes.keys.select { |k| k.start_with?('param', 'dialog_param') } - key_list.each_with_object(ext_vars) do |key, hash| - if key.start_with?('param') - match_data = ANSIBLE_VAR_REGEX.match(object[key]) - hash[match_data[1].strip] ||= match_data[2] if match_data - else - match_data = ANSIBLE_DIALOG_VAR_REGEX.match(key) - hash[match_data[1]] = object[key] if match_data - end - end - end - - def ansible_vars_from_options(ext_vars) - options = @handle.root["miq_provision"].try(:options) || {} - options.each_with_object(ext_vars) do |(key, value), hash| - match_data = ANSIBLE_DIALOG_VAR_REGEX.match(key.to_s) - hash[match_data[1]] = value if match_data - end - end - - def ansible_vars_from_ws_values(ext_vars) - options = @handle.root["miq_provision"].try(:options) || {} - ws_values = options[:ws_values] || {} - ws_values.each_with_object(ext_vars) do |(key, value), hash| - match_data = ANSIBLE_DIALOG_VAR_REGEX.match(key.to_s) - hash[match_data[1]] = value if match_data - end - end - - def var_search(obj, name) - return nil unless obj - obj.attributes.key?(name) ? obj.attributes[name] : var_search(obj.parent, name) - end - - def job_template - job_template = var_search(@handle.object, 'job_template') || - job_template_by_id || - job_template_by_provider || - job_template_by_name - - if job_template.nil? - raise "Job Template not specified" - end - job_template - end - - def job_template_name - @job_template_name ||= var_search(@handle.object, 'job_template_name') || - var_search(@handle.object, 'dialog_job_template_name') - end - - def job_template_by_name - @handle.vmdb(SCRIPT_CLASS).where('lower(name) = ?', job_template_name.downcase).first if job_template_name - end - - def job_template_by_id - job_template_id = var_search(@handle.object, 'job_template_id') || - var_search(@handle.object, 'dialog_job_template_id') - @handle.vmdb(SCRIPT_CLASS).where(:id => job_template_id).first if job_template_id - end - - def job_template_by_provider - provider_name = var_search(@handle.object, 'ansible_tower_provider_name') || - var_search(@handle.object, 'dialog_ansible_tower_provider_name') - provider = @handle.vmdb(MANAGER_CLASS).where('lower(name) = ?', provider_name.downcase).first if provider_name - provider.configuration_scripts.detect { |s| s.name.casecmp(job_template_name).zero? } if provider && job_template_name - end - - def extra_variables - result = ansible_vars_from_objects(@handle.object, {}) - result = ansible_vars_from_options(result) - ansible_vars_from_ws_values(result) - end - - def zone_from_request - @handle.root["zone"] - end - - def create_job_in_zone(options) - opts = options.merge( - :name => "Launch Ansible job with template: #{job_template.name}", - :ansible_template_id => job_template.id, - :userid => @handle.root['user']&.id || 'system', - :zone => zone_from_request - ) - opts[:log_output] ||= 'on_error' - miq_job = @handle.vmdb(TEMPLATE_RUNNER_CLASS).create_job(opts) - miq_job.signal(:start, :priority => 20) - miq_job.wait_on_ansible_job - end - - def run(job_template, target) - @handle.log(:info, "Processing Job Template #{job_template.name}") - args = {:extra_vars => extra_variables} - args[:limit] = target if target - @handle.log(:info, "Job Arguments #{args}") - - job = zone_from_request.blank? ? job_template.create_job(args) : create_job_in_zone(args) - - @handle.log(:info, "Scheduled Job ID: #{job.id} Ansible Job ID: #{job.ems_ref}") - @handle.set_state_var(:ansible_job_id, job.id) - end - end - end - end - end - end - end - end -end - -ManageIQ::Automate::AutomationManagement::AnsibleTower::Operations::StateMachines::Job::LaunchAnsibleJob.new.main diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/launch_ansible_job.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/launch_ansible_job.yaml deleted file mode 100644 index cf65c38ef..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/launch_ansible_job.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -object_type: method -version: 1.0 -object: - attributes: - name: launch_ansible_job - display_name: - description: - scope: instance - language: ruby - location: inline - inputs: [] diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_completion.rb b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_completion.rb deleted file mode 100644 index 28e91a0f3..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_completion.rb +++ /dev/null @@ -1,70 +0,0 @@ -# -# Description: Given a Ansible Job Id, check it's status -# - -module ManageIQ - module Automate - module AutomationManagement - module AnsibleTower - module Operations - module StateMachines - module Job - class WaitForCompletion - JOB_CLASS = 'ManageIQ_Providers_AutomationManager_OrchestrationStack'.freeze - def initialize(handle = $evm) - @handle = handle - end - - def main - check_status(ansible_job) - end - - private - - def check_status(job) - status, reason = job.normalized_live_status - case status - when 'transient' - @handle.root['ae_result'] = 'retry' - @handle.root['ae_retry_interval'] = 1.minute - when 'failed', 'create_canceled' - @handle.root['ae_result'] = 'error' - @handle.log(:error, "Job failed for #{job.id} Ansible ID: #{job.ems_ref} reason #{reason}") - job.refresh_ems - when 'create_complete' - @handle.root['ae_result'] = 'ok' - job.refresh_ems - else - @handle.root['ae_result'] = 'error' - @handle.log(:error, "Job failed for #{job.id} Ansible ID: #{job.ems_ref} Unknown status #{status} reason #{reason}") - job.refresh_ems - end - end - - def ansible_job - job_id = @handle.get_state_var(:ansible_job_id) - if job_id.nil? - @handle.log(:error, 'Ansible job id not found') - exit(MIQ_ERROR) - end - fetch_job(job_id) - end - - def fetch_job(job_id) - job = @handle.vmdb(JOB_CLASS).find(job_id) - if job.nil? - @handle.log(:error, "Ansible job with id: #{job_id} not found") - exit(MIQ_ERROR) - end - job - end - end - end - end - end - end - end - end -end - -ManageIQ::Automate::AutomationManagement::AnsibleTower::Operations::StateMachines::Job::WaitForCompletion.new.main diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_completion.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_completion.yaml deleted file mode 100644 index 12559b695..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_completion.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -object_type: method -version: 1.0 -object: - attributes: - name: wait_for_completion - display_name: - description: - scope: instance - language: ruby - location: inline - inputs: [] diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_ip.rb b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_ip.rb deleted file mode 100644 index 9a96c8632..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_ip.rb +++ /dev/null @@ -1,51 +0,0 @@ -# -# Description: Wait for the IP address to be available on the VM -# For VMWare for this to work the VMWare tools should be installed -# on the newly provisioned vm's - -module ManageIQ - module Automate - module AutomationManagement - module AnsibleTower - module Operations - module StateMachines - module Job - class WaitForIP - def initialize(handle = $evm) - @handle = handle - end - - def main - vm = @handle.root["miq_provision"].try(:destination) - vm ||= @handle.root["vm"] - vm ? check_ip_addr_available(vm) : vm_not_found - end - - def check_ip_addr_available(vm) - ip_list = vm.ipaddresses - @handle.log(:info, "Current Power State #{vm.power_state}") - @handle.log(:info, "IP addresses for VM #{ip_list}") - - if ip_list.empty? - vm.refresh - @handle.root['ae_result'] = 'retry' - @handle.root['ae_retry_interval'] = 1.minute - else - @handle.root['ae_result'] = 'ok' - end - end - - def vm_not_found - @handle.root['ae_result'] = 'error' - @handle.log(:error, "VM not found") - end - end - end - end - end - end - end - end -end - -ManageIQ::Automate::AutomationManagement::AnsibleTower::Operations::StateMachines::Job::WaitForIP.new.main diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_ip.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_ip.yaml deleted file mode 100644 index 874d72905..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_ip.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -object_type: method -version: 1.0 -object: - attributes: - name: wait_for_ip - display_name: - description: - scope: instance - language: ruby - location: inline - inputs: [] diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/default.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/default.yaml deleted file mode 100644 index b0a02bb4b..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/default.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -object_type: instance -version: 1.0 -object: - attributes: - display_name: - name: default - inherits: - description: - fields: [] diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/__namespace__.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/__namespace__.yaml deleted file mode 100644 index 16eaa5c0f..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/__namespace__.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -object_type: namespace -version: 1.0 -object: - attributes: - name: StateMachines - description: - display_name: - priority: - enabled: diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/__namespace__.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/__namespace__.yaml deleted file mode 100644 index b3f1af212..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/__namespace__.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -object_type: namespace -version: 1.0 -object: - attributes: - name: Operations - description: - display_name: - priority: - enabled: diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__class__.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__class__.yaml deleted file mode 100644 index 030441a75..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__class__.yaml +++ /dev/null @@ -1,313 +0,0 @@ ---- -object_type: class -version: 1.0 -object: - attributes: - description: Ansible Tower Provisioning State Machine - display_name: - name: Provision - type: - inherits: - visibility: - owner: - schema: - - field: - aetype: state - name: sequencer - display_name: - datatype: string - priority: 1 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: update_serviceprovision_status(status => 'Processing Sequencer') - on_exit: update_serviceprovision_status(status => 'Processed Sequencer') - on_error: update_serviceprovision_status(status => 'Error Processing Sequencer') - max_retries: '100' - max_time: - - field: - aetype: state - name: pre1 - display_name: - datatype: string - priority: 2 - owner: - default_value: Method::preprovision - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: update_serviceprovision_status(status => 'Processing Preprovision') - on_exit: update_serviceprovision_status(status => 'Processed Preprovision') - on_error: update_serviceprovision_status(status => 'Error Processing Preprovision') - max_retries: '100' - max_time: - - field: - aetype: state - name: pre2 - display_name: - datatype: string - priority: 3 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: update_serviceprovision_status(status => 'Processing Pre2') - on_exit: update_serviceprovision_status(status => 'Processed Pre2') - on_error: update_serviceprovision_status(status => 'Error Processing Pre2') - max_retries: '100' - max_time: - - field: - aetype: state - name: pre3 - display_name: - datatype: string - priority: 4 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: update_serviceprovision_status(status => 'Processing Pre3') - on_exit: update_serviceprovision_status(status => 'Processed Pre3') - on_error: update_serviceprovision_status(status => 'Error Processing Pre3') - max_retries: '100' - max_time: - - field: - aetype: state - name: pre4 - display_name: - datatype: string - priority: 5 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: update_serviceprovision_status(status => 'Processing Pre4') - on_exit: update_serviceprovision_status(status => 'Processed Pre4') - on_error: update_serviceprovision_status(status => 'Error Processing Pre4') - max_retries: '100' - max_time: - - field: - aetype: state - name: pre5 - display_name: - datatype: string - priority: 6 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: update_serviceprovision_status(status => 'Processing Pre5') - on_exit: update_serviceprovision_status(status => 'Processed Pre5') - on_error: update_serviceprovision_status(status => 'Error Processing Pre5') - max_retries: '100' - max_time: - - field: - aetype: state - name: provision - display_name: - datatype: string - priority: 7 - owner: - default_value: Method::provision - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: update_serviceprovision_status(status => 'Launching Job') - on_exit: update_serviceprovision_status(status => 'Launching Job') - on_error: update_serviceprovision_status(status => 'Error Launching Job') - max_retries: '100' - max_time: - - field: - aetype: state - name: checkprovisioned - display_name: - datatype: string - priority: 8 - owner: - default_value: Method::check_provisioned - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: update_serviceprovision_status(status => 'Launching Job') - on_error: update_serviceprovision_status(status => 'Error Launching Job') - max_retries: '100' - max_time: - - field: - aetype: state - name: post1 - display_name: - datatype: string - priority: 9 - owner: - default_value: Method::post_provision - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: update_serviceprovision_status(status => 'Processing Post1 Customizations') - on_exit: update_serviceprovision_status(status => 'Processed Post1 Customizations') - on_error: update_serviceprovision_status(status => 'Error Processing Post1 Customizations') - max_retries: '100' - max_time: - - field: - aetype: state - name: post2 - display_name: - datatype: string - priority: 10 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: update_serviceprovision_status(status => 'Processing Post2 Customizations') - on_exit: update_serviceprovision_status(status => 'Processed Post2 Customizations') - on_error: update_serviceprovision_status(status => 'Error Processing Post2 Customizations') - max_retries: - max_time: - - field: - aetype: state - name: post3 - display_name: - datatype: string - priority: 11 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: update_serviceprovision_status(status => 'Processing Post3 Customizations') - on_exit: update_serviceprovision_status(status => 'Processed Post3 Customizations') - on_error: update_serviceprovision_status(status => 'Error Processing Post3 Customizations') - max_retries: - max_time: - - field: - aetype: state - name: post4 - display_name: - datatype: string - priority: 12 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: update_serviceprovision_status(status => 'Processing Post4 Customizations') - on_exit: update_serviceprovision_status(status => 'Processed Post4 Customizations') - on_error: update_serviceprovision_status(status => 'Error Processing Post4 Customizations') - max_retries: - max_time: - - field: - aetype: state - name: post5 - display_name: - datatype: string - priority: 13 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: update_serviceprovision_status(status => 'Processing Post5 Customizations') - on_exit: update_serviceprovision_status(status => 'Processed Post5 Customizations') - on_error: update_serviceprovision_status(status => 'Error Processing Post5 Customizations') - max_retries: - max_time: - - field: - aetype: state - name: EmailOwner - display_name: - datatype: string - priority: 14 - owner: - default_value: "/System/Notification/Email/AutomationManagementAnsibleTowerServiceProvisionComplete?event=service_provisioned" - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: update_serviceprovision_status(status => 'Emailing Owner') - on_exit: update_serviceprovision_status(status => 'Emailed Owner') - on_error: update_serviceprovision_status(status => 'Error Emailing Owner') - max_retries: '100' - max_time: - - field: - aetype: state - name: Finished - display_name: - datatype: string - priority: 15 - owner: - default_value: "/System/CommonMethods/StateMachineMethods/service_provision_finished" - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: '100' - max_time: diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/check_provisioned.rb b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/check_provisioned.rb deleted file mode 100644 index 94d02d9dd..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/check_provisioned.rb +++ /dev/null @@ -1,83 +0,0 @@ -# -# Description: This method checks to see if the job has been provisioned -# and refresh the job when it completes at the provider -# - -module ManageIQ - module Automate - module AutomationManagement - module AnsibleTower - module Service - module Provisioning - module StateMachines - module Provision - class CheckProvisioned - def initialize(handle = $evm) - @handle = handle - end - - def main - @handle.log("info", "Checking status of Ansible Tower Provisioning") - check_provisioned(task, service) - end - - private - - def check_provisioned(task, service) - # check whether the AnsibleTower job completed - job = service.job - - if job.nil? - @handle.root['ae_result'] = 'error' - @handle.root['ae_reason'] = 'job was not created' - else - check_status(job) - end - - unless @handle.root['ae_result'] == 'retry' - @handle.log("info", "AnsibleTower job finished. Status: #{@handle.root['ae_result']}, reason: #{@handle.root['ae_reason']}") - @handle.log('error', 'Please examine job console output for more details') if @handle.root['ae_result'] == 'error' - - job.refresh_ems - task.miq_request.user_message = @handle.root['ae_reason'] unless @handle.root['ae_reason'].blank? - end - end - - def check_status(job) - status, reason = job.normalized_live_status - case status.downcase - when 'create_complete' - @handle.root['ae_result'] = 'ok' - when /failed$/, /canceled$/ - @handle.root['ae_result'] = 'error' - @handle.root['ae_reason'] = reason - @handle.log('error', "Ansible Tower Job #{job.name} standard output: #{job.raw_stdout}") if job.respond_to?(:raw_stdout) - else - # job not done yet in provider - @handle.root['ae_result'] = 'retry' - @handle.root['ae_retry_interval'] = '1.minute' - end - end - - def task - @handle.root["service_template_provision_task"].tap do |task| - raise "service_template_provision_task not found" unless task - end - end - - def service - task.destination.tap do |service| - raise "service is not of type AnsibleTower" unless service.respond_to?(:job_template) - end - end - end - end - end - end - end - end - end - end -end - -ManageIQ::Automate::AutomationManagement::AnsibleTower::Service::Provisioning::StateMachines::Provision::CheckProvisioned.new.main diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/check_provisioned.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/check_provisioned.yaml deleted file mode 100644 index 81b9c5942..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/check_provisioned.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -object_type: method -version: 1.0 -object: - attributes: - name: check_provisioned - display_name: - description: - scope: instance - language: ruby - location: inline - inputs: [] diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/post_provision.rb b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/post_provision.rb deleted file mode 100644 index d1b7ff3a6..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/post_provision.rb +++ /dev/null @@ -1,57 +0,0 @@ -# -# Description: This method examines the AnsibleTower job provisioned -# - -module ManageIQ - module Automate - module AutomationManagement - module AnsibleTower - module Service - module Provisioning - module StateMachines - module Provision - class PostProvision - def initialize(handle = $evm) - @handle = handle - end - - def main - @handle.log("info", "Starting Ansible Tower Post-Provisioning") - job = service.job - raise "Job was not created" unless job - - # You can add logic to process the job object in VMDB - # For example, dump all outputs from the job - # - # dump_job_outputs(job) - end - - private - - def task - @handle.root["service_template_provision_task"].tap do |task| - raise "service_template_provision_task not found" unless task - end - end - - def service - task.destination.tap do |service| - raise "service is not of type AnsibleTower" unless service.respond_to?(:job_template) - end - end - - def dump_job_outputs(job) - log_type = job.status == 'failed' ? 'error' : 'info' - @handle.log(log_type, "Ansible Tower Job #{job.name} standard output: #{job.raw_stdout}") if job.respond_to?(:raw_stdout) - end - end - end - end - end - end - end - end - end -end - -ManageIQ::Automate::AutomationManagement::AnsibleTower::Service::Provisioning::StateMachines::Provision::PostProvision.new.main diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/post_provision.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/post_provision.yaml deleted file mode 100644 index c7f9f20d2..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/post_provision.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -object_type: method -version: 1.0 -object: - attributes: - name: post_provision - display_name: - description: - scope: instance - language: ruby - location: inline - inputs: [] diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/preprovision.rb b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/preprovision.rb deleted file mode 100644 index 3a6223bd2..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/preprovision.rb +++ /dev/null @@ -1,65 +0,0 @@ -# -# Description: This method prepares arguments and parameters for a job template -# -module ManageIQ - module Automate - module AutomationManagement - module AnsibleTower - module Service - module Provisioning - module StateMachines - module Provision - class Preprovision - def initialize(handle = $evm) - @handle = handle - end - - def main - @handle.log("info", "Starting Ansible Tower Pre-Provisioning") - examine_request(service) - # modify_job_options(service) - end - - def task - @handle.root["service_template_provision_task"].tap do |task| - raise "service_template_provision_task not found" unless task - end - end - - def service - task.destination.tap do |service| - raise "service is not of type AnsibleTower" unless service.respond_to?(:job_template) - end - end - - # Through service you can examine the job template, configuration manager (i.e., provider) - # and options to start a job - def examine_request(service) - @handle.log("info", "manager = #{service.configuration_manager.name}") - @handle.log("info", "template = #{service.job_template.name}") - - # Caution: job options may contain passwords. - # @handle.log("info", "job options = #{service.job_options.inspect}") - end - - # You can also override job options through service - def modify_job_options(service) - # Example how to programmatically modify job options: - job_options = service.job_options - job_options[:limit] = 'someHost' - job_options[:extra_vars]['flavor'] = 'm1.small' - - # Important: set stack_options - service.job_options = job_options - end - end - end - end - end - end - end - end - end -end - -ManageIQ::Automate::AutomationManagement::AnsibleTower::Service::Provisioning::StateMachines::Provision::Preprovision.new.main diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/preprovision.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/preprovision.yaml deleted file mode 100644 index 89354676b..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/preprovision.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -object_type: method -version: 1.0 -object: - attributes: - name: preprovision - display_name: - description: - scope: instance - language: ruby - location: inline - inputs: [] diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/provision.rb b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/provision.rb deleted file mode 100644 index bff171679..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/provision.rb +++ /dev/null @@ -1,56 +0,0 @@ -# -# Description: This method launches an Ansible Tower job template -# - -module ManageIQ - module Automate - module AutomationManagement - module AnsibleTower - module Service - module Provisioning - module StateMachines - module Provision - class Provision - def initialize(handle = $evm) - @handle = handle - end - - def main - @handle.log("info", "Starting Ansible Tower Provisioning") - run(task, service) - end - - private - - def task - @handle.root["service_template_provision_task"].tap do |task| - raise "service_template_provision_task not found" unless task - end - end - - def service - task.destination.tap do |service| - raise "service is not of type AnsibleTower" unless service.respond_to?(:job_template) - end - end - - def run(task, service) - job = service.launch_job - @handle.log("info", "Ansible Tower Job (#{job.name}) with reference id (#{job.ems_ref}) started.") - rescue => err - @handle.root['ae_result'] = 'error' - @handle.root['ae_reason'] = err.message - task.miq_request.user_message = err.message - @handle.log("error", "Template #{service.job_template.name} launching failed. Reason: #{err.message}") - end - end - end - end - end - end - end - end - end -end - -ManageIQ::Automate::AutomationManagement::AnsibleTower::Service::Provisioning::StateMachines::Provision::Provision.new.main diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/provision.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/provision.yaml deleted file mode 100644 index 8c92da291..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/provision.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -object_type: method -version: 1.0 -object: - attributes: - name: provision - display_name: - description: - scope: instance - language: ruby - location: inline - inputs: [] diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/update_serviceprovision_status.rb b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/update_serviceprovision_status.rb deleted file mode 100644 index 86e984c15..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/update_serviceprovision_status.rb +++ /dev/null @@ -1,57 +0,0 @@ -# -# Description: This method updates the service provision status. -# Required inputs: status - -module ManageIQ - module Automate - module AutomationManagement - module AnsibleTower - module Service - module Provisioning - module StateMachines - class UpdateServiceProvisionStatus - def initialize(handle = $evm) - @handle = handle - end - - def main - prov = @handle.root['service_template_provision_task'] - - if prov.nil? - @handle.log(:error, "Service Template Provision Task not provided") - raise "Service Template Provision Task not provided" - end - - updated_message = update_status_message(prov, @handle.inputs['status']) - - if @handle.root['ae_result'] == "error" - @handle.create_notification(:level => "error", - :subject => prov.miq_request, - :message => "Instance Provision Error: #{updated_message}") - @handle.log(:error, "Instance Provision Error: #{updated_message}") - end - end - - private - - def update_status_message(prov, status) - updated_message = "Server [#{@handle.root['miq_server'].name}] " - updated_message += "Service [#{prov.destination.name}] " - updated_message += "Step [#{@handle.root['ae_state']}] " - updated_message += "Status [#{status}] " - updated_message += "Message [#{prov.message}] " - updated_message += "Current Retry Number [#{@handle.root['ae_state_retries']}]"\ - if @handle.root['ae_result'] == 'retry' - prov.miq_request.user_message = updated_message - prov.message = status - end - end - end - end - end - end - end - end -end - -ManageIQ::Automate::AutomationManagement::AnsibleTower::Service::Provisioning::StateMachines::UpdateServiceProvisionStatus.new.main diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/update_serviceprovision_status.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/update_serviceprovision_status.yaml deleted file mode 100644 index e02ab17ce..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/update_serviceprovision_status.yaml +++ /dev/null @@ -1,32 +0,0 @@ ---- -object_type: method -version: 1.0 -object: - attributes: - name: update_serviceprovision_status - display_name: - description: - scope: instance - language: ruby - location: inline - inputs: - - field: - aetype: - name: status - display_name: - datatype: string - priority: 1 - owner: - default_value: - substitute: true - message: create - visibility: - collect: - scope: - description: - condition: - on_entry: - on_exit: - on_error: - max_retries: - max_time: diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/_missing.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/_missing.yaml deleted file mode 100644 index 49754fdba..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/_missing.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -object_type: instance -version: 1.0 -object: - attributes: - display_name: - name: ".missing" - inherits: - description: default - fields: - - sequencer: - value: "/Service/Provisioning/StateMachines/Methods/GroupSequenceCheck" - - pre1: - value: "/Service/Provisioning/StateMachines/Methods/CatalogItemInitialization" - - pre2: - value: Method::preprovision diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/catalogiteminitialization.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/catalogiteminitialization.yaml deleted file mode 100644 index 0e77c84ff..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/catalogiteminitialization.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -object_type: instance -version: 1.0 -object: - attributes: - display_name: - name: CatalogItemInitialization - inherits: - description: - fields: - - sequencer: - value: "/Service/Provisioning/StateMachines/Methods/GroupSequenceCheck" - - pre1: - value: "/Service/Provisioning/StateMachines/Methods/CatalogItemInitialization" - - pre2: - value: Method::preprovision diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/__namespace__.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/__namespace__.yaml deleted file mode 100644 index 16eaa5c0f..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/__namespace__.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -object_type: namespace -version: 1.0 -object: - attributes: - name: StateMachines - description: - display_name: - priority: - enabled: diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/__namespace__.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/__namespace__.yaml deleted file mode 100644 index c269bfc72..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/__namespace__.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -object_type: namespace -version: 1.0 -object: - attributes: - name: Provisioning - description: - display_name: - priority: - enabled: diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/__namespace__.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/__namespace__.yaml deleted file mode 100644 index de2b05656..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/__namespace__.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -object_type: namespace -version: 1.0 -object: - attributes: - name: Service - description: - display_name: - priority: - enabled: diff --git a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/__namespace__.yaml b/content/automate/ManageIQ/AutomationManagement/AnsibleTower/__namespace__.yaml deleted file mode 100644 index 50b2d17bc..000000000 --- a/content/automate/ManageIQ/AutomationManagement/AnsibleTower/__namespace__.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -object_type: namespace -version: 1.0 -object: - attributes: - name: AnsibleTower - description: - display_name: - priority: - enabled: diff --git a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__methods__/available_credentials_spec.rb b/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__methods__/available_credentials_spec.rb deleted file mode 100644 index 7b7357ba5..000000000 --- a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/Methods.class/__methods__/available_credentials_spec.rb +++ /dev/null @@ -1,115 +0,0 @@ -require_domain_file - -describe ManageIQ::Automate::AutomationManagement::AnsibleTower::Operations::AvailableCredentials do - let(:ansible_manager) { FactoryBot.create(:provider_embedded_ansible).automation_manager } - let(:playbook) do - FactoryBot.create(:embedded_playbook, :manager => ansible_manager) - end - let(:root_object) do - Spec::Support::MiqAeMockObject.new('service_template' => svc_service_template) - end - let(:method_args) do - { 'credential_type' => credential_type } - end - - let(:ae_service) do - Spec::Support::MiqAeMockService.new(root_object).tap do |service| - current_object = Spec::Support::MiqAeMockObject.new - current_object.parent = root_object - service.object = current_object - service.inputs = method_args - end - end - let(:options) { {:config_info => {:provision => {:playbook_id => playbook.id}}} } - let(:svc_template) do - FactoryBot.create(:service_template_ansible_playbook, :options => options) - end - let(:svc_service_template) do - MiqAeMethodService::MiqAeServiceServiceTemplate.find(svc_template.id) - end - let(:mach_cred1) do - FactoryBot.create(:embedded_ansible_machine_credential, :resource => ansible_manager) - end - let(:mach_cred2) do - FactoryBot.create(:embedded_ansible_machine_credential, :resource => ansible_manager) - end - let(:net_cred1) do - FactoryBot.create(:embedded_ansible_network_credential, :resource => ansible_manager) - end - let(:net_cred2) do - FactoryBot.create(:embedded_ansible_network_credential, :resource => ansible_manager) - end - - shared_examples_for "#having only default value" do - let(:default_desc_blank) { "" } - it "provides only default value if no credentials" do - described_class.new(ae_service).main - - expect(ae_service["values"]).to eq(nil => default_desc_blank) - expect(ae_service["default_value"]).to be_nil - end - end - - shared_examples_for "#having specific values based on credential type" do - it "provides only default value if no credentials" do - described_class.new(ae_service).main - - expect(ae_service["values"].keys).to match_array(valid_ids) - expect(ae_service["default_value"]).to be_nil - expect(ae_service["required"]).to be_falsey - expect(ae_service["sort_by"]).to eq('description') - expect(ae_service["sort_order"]).to eq('ascending') - expect(ae_service["data_type"]).to eq('string') - end - end - - context "credentials" do - before do - mach_cred1 - mach_cred2 - net_cred1 - net_cred2 - end - - context "machine" do - let(:credential_type) do - "ManageIQ::Providers::EmbeddedAnsible::AutomationManager::MachineCredential" - end - let(:valid_ids) { [mach_cred1.id, mach_cred2.id, nil] } - - it_behaves_like "#having specific values based on credential type" - end - - context "network" do - let(:credential_type) do - "ManageIQ::Providers::EmbeddedAnsible::AutomationManager::NetworkCredential" - end - let(:valid_ids) { [net_cred1.id, net_cred2.id, nil] } - - it_behaves_like "#having specific values based on credential type" - end - - context "no service template" do - let(:root_object) do - Spec::Support::MiqAeMockObject.new - end - let(:credential_type) do - "ManageIQ::Providers::EmbeddedAnsible::AutomationManager::MachineCredential" - end - let(:method_args) do - { 'credential_type' => credential_type, 'embedded_ansible' => true } - end - let(:valid_ids) { [mach_cred1.id, mach_cred2.id, nil] } - - it_behaves_like "#having specific values based on credential type" - end - end - - context "no credentials" do - context "machine" do - let(:credential_type) { nil } - - it_behaves_like "#having only default value" - end - end -end diff --git a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/launch_ansible_job_spec.rb b/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/launch_ansible_job_spec.rb deleted file mode 100644 index 4d78695c4..000000000 --- a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/launch_ansible_job_spec.rb +++ /dev/null @@ -1,242 +0,0 @@ -require_domain_file - -describe ManageIQ::Automate::AutomationManagement::AnsibleTower::Operations::StateMachines::Job::LaunchAnsibleJob do - let(:job_class) { MiqAeMethodService::MiqAeServiceManageIQ_Providers_AnsibleTower_AutomationManager_Job } - let(:jt_class) { MiqAeMethodService::MiqAeServiceManageIQ_Providers_AnsibleTower_AutomationManager_ConfigurationScript } - let(:user) { FactoryBot.create(:user_with_group) } - let(:vm) { FactoryBot.create(:vm) } - let(:manager) { FactoryBot.create(:automation_manager_ansible_tower, :name => "AT1") } - let(:svc_vm) { MiqAeMethodService::MiqAeServiceVm.find(vm.id) } - let(:job_template) do - FactoryBot.create(:ansible_configuration_script, :manager_id => manager.id) - end - let(:svc_job_template) { jt_class.find(job_template.id) } - let(:ip_addr) { '1.1.1.1' } - let(:job) { FactoryBot.create(:ansible_tower_job) } - let(:svc_job) { job_class.find(job.id) } - let(:current_object) { Spec::Support::MiqAeMockObject.new('a' => 1, 'b' => 2) } - let(:root_object) { Spec::Support::MiqAeMockObject.new('param1' => "x=X", 'param2' => "y=Y") } - let(:middle_object) { Spec::Support::MiqAeMockObject.new('a' => 1, 'b' => 2) } - - let(:ext_vars) { {} } - let(:job_args) { {:extra_vars => ext_vars} } - - let(:service) { Spec::Support::MiqAeMockService.new(root_object) } - - let(:ems) do - FactoryBot.create(:ems_amazon_with_authentication) - end - - let(:vm_template) do - FactoryBot.create(:template_amazon, - :name => "template1", - :ext_management_system => ems) - end - - let(:prov_options) do - {:src_vm_id => vm_template.id} - end - - let(:miq_provision) do - FactoryBot.create(:miq_provision_amazon, - :options => prov_options, - :userid => user.userid, - :state => 'active', - :status => 'Ok') - end - - let(:svc_provision) { MiqAeMethodService::MiqAeServiceMiqProvision.find(miq_provision.id) } - - it "run a job using job template name" do - ext_vars['x'] = 'X' - ext_vars['y'] = 'Y' - root_object['vm'] = svc_vm - current_object = Spec::Support::MiqAeMockObject.new(:job_template_name => job_template.name) - current_object.parent = root_object - service.object = current_object - job_args[:limit] = vm.name - - expect(svc_job_template).to receive(:create_job).with(job_args).and_return(svc_job) - launch_ansible_job = described_class.new(service) - expect(launch_ansible_job).to receive(:job_template_by_name).and_return(svc_job_template) - launch_ansible_job.main - expect(service.get_state_var(:ansible_job_id)).to eq(job.id) - end - - it "run a job using job template name and provider name" do - ext_vars['x'] = 'X' - ext_vars['y'] = 'Y' - root_object['vm'] = svc_vm - current_object = Spec::Support::MiqAeMockObject.new(:job_template_name => job_template.name) - current_object['ansible_tower_provider_name'] = manager.name - current_object.parent = root_object - service.object = current_object - job_args[:limit] = vm.name - - expect(svc_job_template).to receive(:create_job).with(job_args).and_return(svc_job) - launch_ansible_job = described_class.new(service) - expect(launch_ansible_job).to receive(:job_template_by_provider).and_return(svc_job_template) - launch_ansible_job.main - expect(service.get_state_var(:ansible_job_id)).to eq(job.id) - end - - it "run a job using job template name and dialog provider name" do - ext_vars['x'] = 'X' - ext_vars['y'] = 'Y' - root_object['vm'] = svc_vm - current_object = Spec::Support::MiqAeMockObject.new(:job_template_name => job_template.name) - current_object['dialog_ansible_tower_provider_name'] = manager.name - current_object.parent = root_object - service.object = current_object - job_args[:limit] = vm.name - - expect(svc_job_template).to receive(:create_job).with(job_args).and_return(svc_job) - launch_ansible_job = described_class.new(service) - expect(launch_ansible_job).to receive(:job_template_by_provider).and_return(svc_job_template) - launch_ansible_job.main - expect(service.get_state_var(:ansible_job_id)).to eq(job.id) - end - - it "run a job using job template id" do - ext_vars['x'] = 'X' - ext_vars['y'] = 'Y' - root_object['vm'] = svc_vm - current_object = Spec::Support::MiqAeMockObject.new(:job_template_id => job_template.id) - current_object.parent = root_object - service.object = current_object - job_args[:limit] = vm.name - - expect(svc_job_template).to receive(:create_job).with(job_args).and_return(svc_job) - launch_ansible_job = described_class.new(service) - expect(launch_ansible_job).to receive(:job_template_by_id).and_return(svc_job_template) - launch_ansible_job.main - expect(service.get_state_var(:ansible_job_id)).to eq(job.id) - end - - it "run a job using job template object" do - ext_vars['x'] = 'X' - ext_vars['y'] = 'Y' - root_object['vm'] = svc_vm - current_object = Spec::Support::MiqAeMockObject.new(:job_template => svc_job_template) - current_object.parent = root_object - service.object = current_object - job_args[:limit] = vm.name - - expect(svc_job_template).to receive(:create_job).with(job_args).and_return(svc_job) - described_class.new(service).main - expect(service.get_state_var(:ansible_job_id)).to eq(job.id) - end - - it "extra vars from current object" do - root_object['vm'] = svc_vm - root_object[:job_template_name] = job_template.name - ext_vars['x'] = '1' - ext_vars['y'] = '2' - job_args[:limit] = vm.name - current_object = Spec::Support::MiqAeMockObject.new('param1' => 'x=1', 'param2' => 'y=2') - current_object.parent = root_object - service.object = current_object - - expect(svc_job_template).to receive(:create_job).with(job_args).and_return(svc_job) - launch_ansible_job = described_class.new(service) - expect(launch_ansible_job).to receive(:job_template_by_name).and_return(svc_job_template) - launch_ansible_job.main - expect(service.get_state_var(:ansible_job_id)).to eq(job.id) - end - - it "extra vars from dialog params" do - root_object['vm'] = svc_vm - root_object[:job_template_name] = job_template.name - ext_vars['x'] = '1' - ext_vars['y'] = '2' - job_args[:limit] = vm.name - current_object = Spec::Support::MiqAeMockObject.new('dialog_param_x' => '1', 'dialog_param_y' => '2') - current_object.parent = root_object - service.object = current_object - - expect(svc_job_template).to receive(:create_job).with(job_args).and_return(svc_job) - launch_ansible_job = described_class.new(service) - expect(launch_ansible_job).to receive(:job_template_by_name).and_return(svc_job_template) - launch_ansible_job.main - expect(service.get_state_var(:ansible_job_id)).to eq(job.id) - end - - it "use limit from job template" do - root_object[:job_template_name] = job_template.name - ext_vars['x'] = '1' - ext_vars['y'] = '2' - current_object = Spec::Support::MiqAeMockObject.new('param1' => 'x=1', 'param2' => 'y=2') - current_object.parent = root_object - service.object = current_object - - expect(svc_job_template).to receive(:create_job).with(job_args).and_return(svc_job) - launch_ansible_job = described_class.new(service) - expect(launch_ansible_job).to receive(:job_template_by_name).and_return(svc_job_template) - launch_ansible_job.main - expect(service.get_state_var(:ansible_job_id)).to eq(job.id) - end - - it "get dialog parameters" do - prov_options[:dialog_param_name] = 'fred' - ext_vars['name'] = 'fred' - root = Spec::Support::MiqAeMockObject.new(:job_template_name => job_template.name) - root[:miq_provision] = svc_provision - service = Spec::Support::MiqAeMockService.new(root) - service.object = root - expect(svc_job_template).to receive(:create_job).with(job_args).and_return(svc_job) - launch_ansible_job = described_class.new(service) - expect(launch_ansible_job).to receive(:job_template_by_name).and_return(svc_job_template) - launch_ansible_job.main - expect(service.get_state_var(:ansible_job_id)).to eq(job.id) - end - - it "get dialog parameters from ws_values" do - prov_options[:ws_values] = {} - prov_options[:ws_values][:dialog_param_name] = 'fred' - ext_vars['name'] = 'fred' - root = Spec::Support::MiqAeMockObject.new(:job_template_name => job_template.name) - root[:miq_provision] = svc_provision - service = Spec::Support::MiqAeMockService.new(root) - service.object = root - - expect(svc_job_template).to receive(:create_job).with(job_args).and_return(svc_job) - launch_ansible_job = described_class.new(service) - expect(launch_ansible_job).to receive(:job_template_by_name).and_return(svc_job_template) - launch_ansible_job.main - expect(service.get_state_var(:ansible_job_id)).to eq(job.id) - end - - describe "workflow template" do - let(:workflow_job_class) { MiqAeMethodService::MiqAeServiceManageIQ_Providers_AnsibleTower_AutomationManager_WorkflowJob } - let(:workflow_jt_class) { MiqAeMethodService::MiqAeServiceManageIQ_Providers_AnsibleTower_AutomationManager_ConfigurationWorkflow } - let(:workflow_job) { FactoryBot.create(:ansible_tower_workflow_job) } - let(:svc_workflow_job) { workflow_job_class.find(workflow_job.id) } - let(:workflow_template) { FactoryBot.create(:ansible_configuration_workflow, :manager_id => manager.id) } - let(:svc_workflow_template) { workflow_jt_class.find(workflow_template.id) } - - before do - ext_vars['x'] = 'X' - ext_vars['y'] = 'Y' - root_object['vm'] = svc_vm - current_object = Spec::Support::MiqAeMockObject.new(:job_template => svc_workflow_template) - current_object.parent = root_object - service.object = current_object - job_args[:limit] = vm.name - end - - it "run a workflow job using workflow template object" do - expect(svc_workflow_template).to receive(:create_job).with(job_args).and_return(svc_workflow_job) - described_class.new(service).main - expect(service.get_state_var(:ansible_job_id)).to eq(svc_workflow_job.id) - end - - it "call TemplateRunner with specified zone" do - root_object['zone'] = 'some_zone' - miq_job = double("TemplateRunner", :wait_on_ansible_job => svc_workflow_job, :signal => nil) - runner_class = ManageIQ::Providers::AnsibleTower::AutomationManager::TemplateRunner - expect(runner_class).to receive(:create_job).with(hash_including(:zone => 'some_zone')).and_return(miq_job) - described_class.new(service).main - expect(service.get_state_var(:ansible_job_id)).to eq(svc_workflow_job.id) - end - end -end diff --git a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_completion_spec.rb b/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_completion_spec.rb deleted file mode 100644 index a66113a56..000000000 --- a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_completion_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ -require_domain_file - -describe ManageIQ::Automate::AutomationManagement::AnsibleTower::Operations::StateMachines::Job::WaitForCompletion do - let(:job_class) { MiqAeMethodService::MiqAeServiceManageIQ_Providers_AnsibleTower_AutomationManager_Job } - let(:user) { FactoryBot.create(:user_with_group) } - let(:vm) { FactoryBot.create(:vm) } - let(:svc_vm) { MiqAeMethodService::MiqAeServiceVm.find(vm.id) } - let(:job_template) { FactoryBot.create(:configuration_script) } - let(:svc_job_template) { MiqAeMethodService::MiqAeServiceConfigurationScript.find(job_template.id) } - let(:ip_addr) { '1.1.1.1' } - let(:job) { FactoryBot.create(:ansible_tower_job) } - let(:svc_job) { job_class.find(job.id) } - let(:persist_state_hash) { {:ansible_job_id => svc_job.id} } - let(:service) { Spec::Support::MiqAeMockService.new(Spec::Support::MiqAeMockObject.new({}), persist_state_hash) } - - it "job status successful" do - expect_any_instance_of(job_class).to receive(:normalized_live_status).with(no_args).and_return(%w(create_complete ok)) - expect_any_instance_of(job_class).to receive(:refresh_ems).with(no_args).and_return(nil) - described_class.new(service).main - expect(service.root['ae_result']).to eq('ok') - end - - it "job status running" do - expect_any_instance_of(job_class).to receive(:normalized_live_status).with(no_args).and_return(%w(transient ok)) - described_class.new(service).main - expect(service.root['ae_result']).to eq('retry') - end - - it "job status failed" do - expect_any_instance_of(job_class).to receive(:normalized_live_status).with(no_args).and_return(%w(failed ok)) - expect_any_instance_of(job_class).to receive(:refresh_ems).with(no_args).and_return(nil) - described_class.new(service).main - expect(service.root['ae_result']).to eq('error') - end - - it "job status canceled" do - expect_any_instance_of(job_class).to receive(:normalized_live_status).with(no_args).and_return(%w(create_canceled ok)) - expect_any_instance_of(job_class).to receive(:refresh_ems).with(no_args).and_return(nil) - described_class.new(service).main - expect(service.root['ae_result']).to eq('error') - end -end diff --git a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_ip_spec.rb b/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_ip_spec.rb deleted file mode 100644 index 140d69304..000000000 --- a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Operations/StateMachines/Job.class/__methods__/wait_for_ip_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -require_domain_file - -describe ManageIQ::Automate::AutomationManagement::AnsibleTower::Operations::StateMachines::Job::WaitForIP do - let(:user) { FactoryBot.create(:user_with_group) } - let(:vm) { FactoryBot.create(:vm) } - let(:klass) { MiqAeMethodService::MiqAeServiceVm } - let(:svc_vm) { klass.find(vm.id) } - let(:ip_addr) { ['1.1.1.1'] } - let(:svc_job) { job_class.find(job.id) } - let(:root_object) { Spec::Support::MiqAeMockObject.new } - let(:service) { Spec::Support::MiqAeMockService.new(root_object) } - - it "#main - ok" do - root_object['vm'] = svc_vm - allow_any_instance_of(klass).to receive(:ipaddresses).with(no_args).and_return(ip_addr) - allow_any_instance_of(klass).to receive(:refresh).with(no_args).and_return(nil) - - described_class.new(service).main - - expect(root_object['ae_result']).to eq('ok') - end - - it "#main - retry" do - root_object['vm'] = svc_vm - allow_any_instance_of(klass).to receive(:ipaddresses).with(no_args).and_return([]) - allow_any_instance_of(klass).to receive(:refresh).with(no_args).and_return(nil) - - described_class.new(service).main - - expect(root_object['ae_result']).to eq('retry') - end -end diff --git a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/check_provisioned_spec.rb b/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/check_provisioned_spec.rb deleted file mode 100644 index 39df10a63..000000000 --- a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/check_provisioned_spec.rb +++ /dev/null @@ -1,65 +0,0 @@ -require_domain_file - -describe ManageIQ::Automate::AutomationManagement::AnsibleTower::Service::Provisioning::StateMachines::Provision::CheckProvisioned do - let(:admin) { FactoryBot.create(:user_admin) } - let(:request) { FactoryBot.create(:service_template_provision_request, :requester => admin) } - let(:service_ansible_tower) { FactoryBot.create(:service_ansible_tower) } - let(:task) { FactoryBot.create(:service_template_provision_task, :destination => service_ansible_tower, :miq_request => request) } - let(:svc_task) { MiqAeMethodService::MiqAeServiceServiceTemplateProvisionTask.find(task.id) } - let(:root_object) { Spec::Support::MiqAeMockObject.new('service_template_provision_task' => svc_task) } - let(:ae_service) { Spec::Support::MiqAeMockService.new(root_object) } - let(:job_class) { MiqAeMethodService::MiqAeServiceManageIQ_Providers_AnsibleTower_AutomationManager_Job } - let(:job) { FactoryBot.create(:ansible_tower_job) } - let(:workflow_job_class) { MiqAeMethodService::MiqAeServiceManageIQ_Providers_AnsibleTower_AutomationManager_WorkflowJob } - let(:workflow_job) { FactoryBot.create(:ansible_tower_workflow_job) } - let(:ok_status) { %w(create_complete ok) } - let(:running_status) { %w(running ok) } - let(:bad_status) { %w(create_failed bad) } - - describe 'check provision status' do - before { allow_any_instance_of(ServiceAnsibleTower).to receive(:job).and_return(job) } - - context 'ansible tower job completed' do - before { allow_any_instance_of(job_class).to receive(:normalized_live_status).and_return(ok_status) } - it "refreshes the job status" do - expect(job).to receive(:refresh_ems) - described_class.new(ae_service).main - expect(ae_service.root['ae_result']).to eq('ok') - end - end - - context 'ansible tower job is running' do - before { allow_any_instance_of(job_class).to receive(:normalized_live_status).and_return(running_status) } - it "retries the step" do - described_class.new(ae_service).main - expect(ae_service.root['ae_result']).to eq('retry') - end - end - - context 'ansible tower job failed' do - before { allow_any_instance_of(job_class).to receive(:normalized_live_status).and_return(bad_status) } - it "signals error" do - expect(job).to receive(:refresh_ems) - expect(job).to receive(:raw_stdout) - described_class.new(ae_service).main - expect(ae_service.root['ae_result']).to eq('error') - expect(ae_service.root['ae_reason']).to eq('bad') - end - end - - context 'ansible tower workflow job failed' do - before do - allow_any_instance_of(ServiceAnsibleTower).to receive(:job).and_return(workflow_job) - allow_any_instance_of(workflow_job_class).to receive(:normalized_live_status).and_return(bad_status) - end - - it "signals error" do - expect(workflow_job).to receive(:refresh_ems) - expect(workflow_job).not_to receive(:raw_stdout) - described_class.new(ae_service).main - expect(ae_service.root['ae_result']).to eq('error') - expect(ae_service.root['ae_reason']).to eq('bad') - end - end - end -end diff --git a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/preprovision_spec.rb b/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/preprovision_spec.rb deleted file mode 100644 index ce00f94e0..000000000 --- a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/preprovision_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require_domain_file - -describe ManageIQ::Automate::AutomationManagement::AnsibleTower::Service::Provisioning::StateMachines::Provision::Preprovision do - let(:ansible_tower_manager) { FactoryBot.create(:configuration_manager) } - let(:job_template) { FactoryBot.create(:ansible_configuration_script, :manager => ansible_tower_manager) } - let(:service_ansible_tower) { FactoryBot.create(:service_ansible_tower, :job_template => job_template) } - let(:task) { FactoryBot.create(:service_template_provision_task, :destination => service_ansible_tower) } - let(:svc_task) { MiqAeMethodService::MiqAeServiceServiceTemplateProvisionTask.find(task.id) } - let(:root_object) { Spec::Support::MiqAeMockObject.new('service_template_provision_task' => svc_task) } - let(:ae_service) { Spec::Support::MiqAeMockService.new(root_object) } - - it "examines request configuration" do - expect_any_instance_of(ServiceAnsibleTower).to receive(:configuration_manager).and_return(ansible_tower_manager) - expect_any_instance_of(ServiceAnsibleTower).to receive(:job_template).at_least(1).times.and_return(job_template) - described_class.new(ae_service).main - end - - it "modifies job options" do - test = described_class.new(ae_service) - test.send(:modify_job_options, test.service) - service_ansible_tower.reload - expect(service_ansible_tower.job_options).to eq(:limit => 'someHost', :extra_vars => {'flavor' => 'm1.small'}) - end -end diff --git a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/provision_spec.rb b/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/provision_spec.rb deleted file mode 100644 index 5ae4c24a4..000000000 --- a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/provision_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require_domain_file - -describe ManageIQ::Automate::AutomationManagement::AnsibleTower::Service::Provisioning::StateMachines::Provision::Provision do - let(:admin) { FactoryBot.create(:user_admin) } - let(:request) { FactoryBot.create(:service_template_provision_request, :requester => admin) } - let(:job_class) { ManageIQ::Providers::AnsibleTower::AutomationManager::Job } - let(:ansible_tower_manager) { FactoryBot.create(:automation_manager_ansible_tower) } - let(:job_template) { FactoryBot.create(:ansible_configuration_script, :manager => ansible_tower_manager) } - let(:service_ansible_tower) { FactoryBot.create(:service_ansible_tower, :job_template => job_template, :evm_owner => FactoryBot.create(:user_with_group)) } - let(:job) { FactoryBot.create(:ansible_tower_job) } - let(:task) { FactoryBot.create(:service_template_provision_task, :destination => service_ansible_tower, :miq_request => request) } - let(:svc_task) { MiqAeMethodService::MiqAeServiceServiceTemplateProvisionTask.find(task.id) } - let(:root_object) { Spec::Support::MiqAeMockObject.new('service_template_provision_task' => svc_task) } - let(:ae_service) { Spec::Support::MiqAeMockService.new(root_object) } - - before { FactoryBot.create(:miq_region, :region => ApplicationRecord.my_region_number) } - - it "launches an Ansible Tower job" do - expect(job_class).to receive(:create_job).and_return(job) - described_class.new(ae_service).main - end - - it "fails the step when job launching fails" do - expect(job_class).to receive(:create_job).and_raise('provider error') - described_class.new(ae_service).main - expect(ae_service.root['ae_result']).to eq('error') - expect(ae_service.root['ae_reason']).to eq('provider error') - end -end diff --git a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/update_serviceprovision_status_spec.rb b/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/update_serviceprovision_status_spec.rb deleted file mode 100644 index e62a86b78..000000000 --- a/spec/content/automate/ManageIQ/AutomationManagement/AnsibleTower/Service/Provisioning/StateMachines/Provision.class/__methods__/update_serviceprovision_status_spec.rb +++ /dev/null @@ -1,79 +0,0 @@ -require_domain_file - -describe ManageIQ::Automate::AutomationManagement::AnsibleTower::Service:: - Provisioning::StateMachines::UpdateServiceProvisionStatus do - let(:user) { FactoryBot.create(:user_with_group) } - let(:miq_server) { EvmSpecHelper.local_miq_server } - let(:service_orchestration) { FactoryBot.create(:service_orchestration) } - - let(:miq_request_task) do - FactoryBot.create(:miq_request_task, :destination => service_orchestration, - :miq_request => request, :state => 'fred') - end - - let(:request) do - FactoryBot.create(:service_template_provision_request, :requester => user) - end - - let(:ae_service) do - Spec::Support::MiqAeMockService.new(root_object).tap do |service| - current_object = Spec::Support::MiqAeMockObject.new - current_object.parent = root_object - service.object = current_object - end - end - - let(:svc_model_miq_server) { MiqAeMethodService::MiqAeServiceMiqServer.find(miq_server.id) } - let(:svc_model_miq_request_task) { MiqAeMethodService::MiqAeServiceMiqRequestTask.find(miq_request_task.id) } - let(:svc_model_service) { MiqAeMethodService::MiqAeServiceService.find(service_orchestration.id) } - let(:svc_model_request) do - MiqAeMethodService::MiqAeServiceServiceTemplateProvisionRequest.find(request.id) - end - - context "with a stp request object" do - let(:root_hash) do - { 'service_template' => MiqAeMethodService::MiqAeServiceService.find(service_orchestration.id) } - end - - let(:root_object) do - obj = Spec::Support::MiqAeMockObject.new(root_hash) - obj["service_template_provision_task"] = svc_model_miq_request_task - obj["miq_server"] = svc_model_miq_server - obj - end - - before do - allow(ae_service).to receive(:inputs) { {'status' => "fred"} } - allow(svc_model_miq_request_task).to receive(:destination) { svc_model_service } - ae_service.root['ae_result'] = 'ok' - end - - it "method succeeds" do - described_class.new(ae_service).main - expect(svc_model_request.reload.status).to eq('Ok') - end - - it "request message set properly" do - described_class.new(ae_service).main - msg = "Server [#{miq_server.name}] Service [#{service_orchestration.name}] Step [] Status [fred] Message [] " - expect(svc_model_request.reload.message).to eq(msg) - end - - it "creates notification due to ae_result is 'error'" do - ae_service.root['ae_result'] = "error" - expect(ae_service).to receive(:create_notification) - described_class.new(ae_service).main - end - end - - context "without a stp request object" do - let(:root_hash) { {} } - let(:root_object) { Spec::Support::MiqAeMockObject.new(root_hash) } - - it "method fails" do - expect { described_class.new(ae_service).main }.to raise_error( - "Service Template Provision Task not provided" - ) - end - end -end