Skip to content

Commit

Permalink
Merge pull request ManageIQ#18057 from lfu/service_ansible_mixin
Browse files Browse the repository at this point in the history
Normalize extra_vars support for Ansible Tower playbooks.
  • Loading branch information
gmcculloug authored Oct 18, 2018
2 parents 88f7d2f + 3b6fa05 commit 9b265d4
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 29 deletions.
35 changes: 35 additions & 0 deletions app/models/mixins/ansible_extra_vars_mixin.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
module AnsibleExtraVarsMixin
extend ActiveSupport::Concern

def manageiq_env(user, miq_group, request_task = nil)
{
'api_url' => api_url,
'api_token' => api_token(user),
'user' => user.href_slug,
'group' => miq_group.href_slug,
'X_MIQ_Group' => user.current_group.description,
}.merge(task_url(request_task))
end

def manageiq_connection_env(user)
{
'url' => api_url,
'token' => api_token(user),
'X_MIQ_Group' => user.current_group.description
}
end

private

def api_token(user)
@api_token ||= Api::UserTokenService.new.generate_token(user.userid, 'api')
end

def api_url
@api_url ||= MiqRegion.my_region.remote_ws_url
end

def task_url(request_task)
request_task ? {'request_task' => "#{request_task.miq_request.href_slug}/#{request_task.href_slug}", 'request' => request_task.miq_request.href_slug} : {}
end
end
39 changes: 13 additions & 26 deletions app/models/service_ansible_playbook.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
class ServiceAnsiblePlaybook < ServiceGeneric
include AnsibleExtraVarsMixin

delegate :job_template, :to => :service_template, :allow_nil => true

# A chance for taking options from automate script to override options from a service dialog
Expand All @@ -13,7 +15,12 @@ def preprocess(action, add_options = {})

def execute(action)
jt = job_template(action)
opts = get_job_options(action).deep_merge(:extra_vars => {'manageiq' => manageiq_extra_vars(action), 'manageiq_connection' => manageiq_connection_env})
opts = get_job_options(action).deep_merge(
:extra_vars => {
'manageiq' => service_manageiq_env(action),
'manageiq_connection' => manageiq_connection_env(evm_owner)
}
)
hosts = opts.delete(:hosts)

_log.info("Launching Ansible Tower job with options:")
Expand Down Expand Up @@ -61,32 +68,12 @@ def on_error(action)

private

def manageiq_extra_vars(action)
{
'api_url' => api_url,
'api_token' => api_token,
'service' => href_slug,
'user' => evm_owner.href_slug,
'group' => miq_group.href_slug,
'action' => action,
'X_MIQ_Group' => evm_owner.current_group.description
}.merge(request_options_extra_vars)
end

def manageiq_connection_env
def service_manageiq_env(action)
{
'url' => api_url,
'token' => api_token,
'X_MIQ_Group' => evm_owner.current_group.description
}
end

def api_token
@api_token ||= Api::UserTokenService.new.generate_token(evm_owner.userid, 'api')
end

def api_url
@api_url ||= MiqRegion.my_region.remote_ws_url
'service' => href_slug,
'action' => action
}.merge(manageiq_env(evm_owner, miq_group, miq_request_task))
.merge(request_options_extra_vars)
end

def request_options_extra_vars
Expand Down
22 changes: 21 additions & 1 deletion app/models/service_ansible_tower.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
class ServiceAnsibleTower < Service
include AnsibleExtraVarsMixin
include ServiceConfigurationMixin
include ServiceOrchestrationOptionsMixin

Expand All @@ -9,6 +10,14 @@ class ServiceAnsibleTower < Service

def launch_job
job_class = "#{job_template.class.parent.name}::#{job_template.class.stack_type}".constantize
job_options.deep_merge!(
:extra_vars => {
'manageiq' => service_manageiq_env,
'manageiq_connection' => manageiq_connection_env(evm_owner)
}
)
_log.info("Launching Ansible Tower job with options:")
$log.log_hashes(job_options)
@job = job_class.create_job(job_template, job_options)
add_resource(@job)
@job
Expand Down Expand Up @@ -40,7 +49,7 @@ def build_stack_create_options

raise _("job template was not set") if job_template.nil?

build_stack_options_from_dialog(dialog_options)
build_stack_options_from_dialog(dialog_options).with_indifferent_access
end

def save_launch_options
Expand All @@ -62,4 +71,15 @@ def extra_vars_from_dialog(dialog_options)
end
end
end

def service_manageiq_env
{
'service' => href_slug
}.merge(manageiq_env(evm_owner, miq_group, miq_request_task))
.merge(request_options_extra_vars)
end

def request_options_extra_vars
miq_request_task.options.fetch_path(:request_options, :manageiq_extra_vars) || {}
end
end
4 changes: 2 additions & 2 deletions spec/models/service_ansible_playbook_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@
let(:control_extras) { {'a' => 'A', 'b' => 'B', 'c' => 'C'} }
before do
FactoryGirl.create(:miq_region, :region => ApplicationRecord.my_region_number)
miq_request_task = FactoryGirl.create(:miq_request_task)
miq_request_task = FactoryGirl.create(:miq_request_task, :miq_request => FactoryGirl.create(:service_template_provision_request))
miq_request_task.update_attributes(:options => {:request_options => {:manageiq_extra_vars => control_extras}})
loaded_service.update_attributes(:evm_owner => FactoryGirl.create(:user_with_group),
:miq_group => FactoryGirl.create(:miq_group),
Expand All @@ -154,7 +154,7 @@
it 'creates an Ansible Tower job' do
expect(ManageIQ::Providers::EmbeddedAnsible::AutomationManager::Job).to receive(:create_job) do |jobtemp, opts|
expect(jobtemp).to eq(tower_job_temp)
exposed_miq = %w(api_url api_token service user group X_MIQ_Group) + control_extras.keys
exposed_miq = %w(api_url api_token service user group X_MIQ_Group request_task request) + control_extras.keys
exposed_connection = %w(url token X_MIQ_Group)
expect(opts[:extra_vars].delete('manageiq').keys).to include(*exposed_miq)
expect(opts[:extra_vars].delete('manageiq_connection').keys).to include(*exposed_connection)
Expand Down
15 changes: 15 additions & 0 deletions spec/models/service_ansible_tower_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,26 @@
end

describe '#launch_job' do
let(:control_extras) { {'a' => 'A', 'b' => 'B', 'c' => 'C'} }
before do
FactoryGirl.create(:miq_region, :region => ApplicationRecord.my_region_number)
miq_request_task = FactoryGirl.create(:miq_request_task, :miq_request => FactoryGirl.create(:service_template_provision_request))
miq_request_task.update_attributes(:options => {:request_options => {:manageiq_extra_vars => control_extras}})
service.update_attributes(:evm_owner => FactoryGirl.create(:user_with_group),
:miq_group => FactoryGirl.create(:miq_group),
:miq_request_task => miq_request_task)
end

it 'launches a job through ansible tower provider' do
allow(ManageIQ::Providers::AnsibleTower::AutomationManager::Job).to receive(:raw_create_stack) do |template, opts|
expect(template).to be_kind_of ConfigurationScript
expect(opts).to have_key(:limit)
expect(opts).to have_key(:extra_vars)

exposed_miq = %w(api_url api_token service user group X_MIQ_Group request_task request) + control_extras.keys
exposed_connection = %w(url token X_MIQ_Group)
expect(opts[:extra_vars].delete('manageiq').keys).to include(*exposed_miq)
expect(opts[:extra_vars].delete('manageiq_connection').keys).to include(*exposed_connection)
end.and_return(double(:raw_job,
:id => 1,
:status => "completed",
Expand Down

0 comments on commit 9b265d4

Please sign in to comment.