Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ def self.description
end

def self.catalog_types
{"generic_ansible_playbook" => N_("Ansible Playbook")}
{"generic_ansible_playbook" => N_("Ansible Playbook (deprecated)"), "embedded_ansible" => N_("Ansible Playbook")}
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class ManageIQ::Providers::EmbeddedAnsible::AutomationManager::Provision < ManageIQ::Providers::AutomationManager::Provision
include StateMachine

TASK_DESCRIPTION = N_("Ansible Playbook Provision")
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
module ManageIQ::Providers::EmbeddedAnsible::AutomationManager::Provision::StateMachine
def run_provision
signal :provision
end

def provision
opts = %i[become_enabled cloud_credential_id credential_id execution_ttl extra_vars hosts network_credential_id vault_credential_id verbosity].to_h do |key|
[key, get_option(key)]
end

opts[:hosts] ||= %w[localhost]
stack = stack_klass.create_stack(source.parent, opts)

phase_context[:stack_id] = stack.id
connect_to_service!(stack, :name => "Provision")

save!

signal :check_provisioned
end

def check_provisioned
if running?
requeue_phase
else
signal :post_provision
end
end

def post_provision
if succeeded?
signal :mark_as_completed
else
abort_job("Failed to provision playbook", "error")
end
end

def running?
!stack.raw_status.completed?
end

def succeeded?
stack.raw_status.succeeded?
end

def mark_as_completed
update_and_notify_parent(:state => "finished", :message => "Playbook provision is complete")
signal :finish
end

def finish
mark_execution_servers
end

def stack_klass
ManageIQ::Providers::EmbeddedAnsible::AutomationManager::Job
end

def stack
@stack ||= stack_klass.find(phase_context[:stack_id])
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
class ManageIQ::Providers::EmbeddedAnsible::AutomationManager::ProvisionWorkflow < ManageIQ::Providers::AutomationManager::ProvisionWorkflow
def self.default_dialog_file
"miq_provision_configuration_script_embedded_ansible_dialogs".freeze
end

def dialog_name_from_automate(message = 'get_dialog_name', extra_attrs = {})
extra_attrs['platform'] ||= 'embedded_ansible'
super
end

def allowed_configuration_scripts(*_args)
self.class.module_parent::ConfigurationScript.all.map do |cs|
build_ci_hash_struct(cs, %w[name description manager_name])
end
end

def allowed_machine_credentials(*_args)
self.class.module_parent::MachineCredential.all.to_h do |mc|
[mc.id, mc.name]
end
end

def allowed_vault_credentials(*_args)
self.class.module_parent::VaultCredential.all.to_h do |vc|
[vc.id, vc.name]
end
end

def allowed_cloud_credential_types(*_args)
# If a cloud credential is selected then pre-populate the Cloud Type
cloud_credential_id = get_value(values[:cloud_credential_id])
if cloud_credential_id && cloud_credential_id != 0 # TODO: Why is <None> = 0 ??
# TODO why does self.class.module_parent::CloudCredential.find(id) not work?
cloud_credential = ::Authentication.find(cloud_credential_id)
{cloud_credential.class.to_s => cloud_credential.class::API_OPTIONS[:label]}
else
self.class.module_parent::CloudCredential.descendants.to_h do |klass|
[klass.to_s, klass::API_OPTIONS[:label]]
end
end
end

def allowed_cloud_credentials(*_args)
klass = get_value(values[:cloud_credential_type])&.safe_constantize
klass ||= self.class.module_parent::CloudCredential
klass.all.to_h do |cc|
[cc.id, "#{cc.name} - #{cc.type}"]
end
end
end
5 changes: 5 additions & 0 deletions app/models/service_embedded_ansible.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class ServiceEmbeddedAnsible < ServiceAutomation
def job(action = "Provision")
service_resources.find_by(:name => action, :resource_type => 'OrchestrationStack').try(:resource)
end
end
2 changes: 2 additions & 0 deletions app/models/service_template_embedded_ansible.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class ServiceTemplateEmbeddedAnsible < ServiceTemplateAutomation
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
---
:name: miq_provision_configuration_script_embedded_ansible_dialogs
:description: Sample Configuration Script Embedded Ansible Provisioning Dialog
:dialog_type: MiqProvisionConfigurationScriptWorkflow
:content:
:buttons:
- :submit
- :cancel
:dialogs:
:requester:
:description: Request
:fields:
:owner_phone:
:description: Phone
:required: false
:display: :hide
:data_type: :string
:owner_country:
:description: Country/Region
:required: false
:display: :hide
:data_type: :string
:owner_phone_mobile:
:description: Mobile
:required: false
:display: :hide
:data_type: :string
:owner_title:
:description: Title
:required: false
:display: :hide
:data_type: :string
:owner_first_name:
:description: First Name
:required: false
:display: :edit
:data_type: :string
:owner_manager:
:description: Name
:required: false
:display: :edit
:data_type: :string
:owner_address:
:description: Address
:required: false
:display: :hide
:data_type: :string
:owner_company:
:description: Company
:required: false
:display: :hide
:data_type: :string
:owner_last_name:
:description: Last Name
:required: false
:display: :edit
:data_type: :string
:owner_manager_mail:
:description: E-Mail
:required: false
:display: :hide
:data_type: :string
:owner_city:
:description: City
:required: false
:display: :hide
:data_type: :string
:owner_department:
:description: Department
:required: false
:display: :hide
:data_type: :string
:owner_manager_phone:
:description: Phone
:required: false
:display: :hide
:data_type: :string
:owner_state:
:description: State
:required: false
:display: :hide
:data_type: :string
:owner_office:
:description: Office
:required: false
:display: :hide
:data_type: :string
:owner_zip:
:description: Zip code
:required: false
:display: :hide
:data_type: :string
:owner_email:
:description: E-Mail
:required_method: :validate_regex
:required_regex: !ruby/regexp /\A[\w!#$\%&'*+\/=?`\{|\}~^-]+(?:\.[\w!#$\%&'*+\/=?`\{|\}~^-]+)*@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}\Z/i
:required: true
:display: :edit
:data_type: :string
:request_notes:
:description: Notes
:required: false
:display: :edit
:data_type: :string
:display: :show
:field_order:
:purpose:
:description: Purpose
:fields:
:tag_ids:
:required_method: :validate_tags
:description: Tags
:required: false
:options:
:include: []
:order: []
:single_select: []
:exclude: []
:display: :edit
:required_tags: []
:data_type: :integer
:display: :show
:field_order:
:provision:
:description: Provision
:fields:
:verbosity:
:description: Verbosity
:values:
0: Normal
1: Verbose
2: More Verbose
3: Debug
4: Connection Debug
5: WinRM Debug
:notes:
:required: false
:display: :edit
:default: 0
:data_type: :integer
:log_output:
:description: Log Output
:values:
on_error: On Error
always: Always
never: Never
:notes:
:required: false
:display: :edit
:default: on_error
:data_type: :string
:execution_ttl:
:description: Max TTL (mins)
:notes:
:required: false
:display: :edit
:data_type: :integer
:credential_id:
:values_from:
:method: :allowed_machine_credentials
:description: Machine Credential
:required: true
:display: :edit
:data_type: :integer
:vault_credential_id:
:values_from:
:method: :allowed_vault_credentials
:description: Vault Credential
:required: false
:display: :edit
:data_type: :integer
:cloud_credential_type:
:values_from:
:method: :allowed_cloud_credential_types
:description: Cloud Type
:required: false
:display: :edit
:data_type: :string
:cloud_credential_id:
:values_from:
:method: :allowed_cloud_credentials
:description: Cloud Credential
:required: false
:display: :edit
:data_type: :integer
:display: :show
:service:
:description: Catalog
:fields:
:src_configuration_script_id:
:values_from:
:method: :allowed_configuration_scripts
:description: Configuration Script
:required: true
:notes:
:display: :edit
:data_type: :integer
:notes_display: :show
:display: :show
:schedule:
:description: Schedule
:fields:
:schedule_type:
:values:
schedule: Schedule
immediately: Immediately on Approval
:description: When to Provision
:required: false
:display: :edit
:default: immediately
:data_type: :string
:schedule_time:
:values_from:
:options:
:offset: 1.day
:method: :default_schedule_time
:description: Provision on
:required: false
:display: :edit
:data_type: :time
:display: :show
:dialog_order:
- :requester
- :purpose
- :service
- :provision
- :schedule
Loading
Loading