Skip to content

Commit

Permalink
Merge pull request ManageIQ#13879 from blomquisg/embedded_automation_…
Browse files Browse the repository at this point in the history
…manager

Adding many models for EmbeddedAnsible provider
  • Loading branch information
Fryguy authored Feb 23, 2017
2 parents 8773af5 + f72a278 commit 13acb63
Show file tree
Hide file tree
Showing 91 changed files with 559 additions and 248 deletions.
39 changes: 17 additions & 22 deletions app/models/manageiq/providers/ansible_tower/automation_manager.rb
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
class ManageIQ::Providers::AnsibleTower::AutomationManager < ManageIQ::Providers::ExternalAutomationManager
include ManageIQ::Providers::AnsibleTower::Shared::AutomationManager

require_nested :AmazonCredential
require_nested :AzureCredential
require_nested :CloudCredential
require_nested :GoogleCredential
require_nested :MachineCredential
require_nested :NetworkCredential
require_nested :OpenstackCredential
require_nested :RackspaceCredential
require_nested :Satellite6Credential
require_nested :VmwareCredential

require_nested :ConfigurationScript
require_nested :ConfiguredSystem
require_nested :EventCatcher
require_nested :EventParser
require_nested :Job
require_nested :Playbook
require_nested :Refresher
require_nested :RefreshWorker
require_nested :Job

include ProcessTasksMixin
delegate :authentications,
:authentication_check,
:authentication_status,
:authentication_status_ok?,
:connect,
:missing_credentials?,
:verify_credentials,
:with_provider_connection,
:to => :provider

def self.ems_type
@ems_type ||= "ansible_tower_automation".freeze
Expand All @@ -23,14 +28,4 @@ def self.ems_type
def self.description
@description ||= "Ansible Tower Automation".freeze
end

def image_name
"ansible_tower_automation"
end

private

def connection_source(options = {})
options[:connection_source] || self
end
end
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# This corresponds to Ansible Tower's Azure Resource Manager (azure_rm) type credential. We are not modeling the deprecated Azzure classic
class ManageIQ::Providers::AnsibleTower::AutomationManager::AzureCredential < ManageIQ::Providers::AnsibleTower::AutomationManager::CloudCredential
# This corresponds to Ansible Tower's Azure Resource Manager (azure_rm) type credential. We are not modeling the deprecated Azure classic
class ManageIQ::Providers::AnsibleTower::AutomationManager::AzureCredential <
ManageIQ::Providers::AnsibleTower::AutomationManager::CloudCredential
end
Original file line number Diff line number Diff line change
@@ -1,19 +1,5 @@
class ManageIQ::Providers::AnsibleTower::AutomationManager::ConfigurationScript < ConfigurationScript
extend ApiCreate
class ManageIQ::Providers::AnsibleTower::AutomationManager::ConfigurationScript <
ManageIQ::Providers::ExternalAutomationManager::ConfigurationScript

def run(vars = {})
options = vars.merge(merge_extra_vars(vars[:extra_vars]))

with_provider_object do |jt|
jt.launch(options)
end
end

def merge_extra_vars(external)
{:extra_vars => variables.merge(external || {}).to_json}
end

def provider_object(connection = nil)
(connection || connection_source.connect).api.job_templates.find(manager_ref)
end
include ManageIQ::Providers::AnsibleTower::Shared::AutomationManager::ConfigurationScript
end
Original file line number Diff line number Diff line change
@@ -1,17 +1,6 @@
class ManageIQ::Providers::AnsibleTower::AutomationManager::ConfiguredSystem < ::ConfiguredSystem
include ProviderObjectMixin

def provider_object(connection = nil)
(connection || connection_source.connect).api.hosts.find(manager_ref)
end

def ext_management_system
manager
end
class ManageIQ::Providers::AnsibleTower::AutomationManager::ConfiguredSystem <
ManageIQ::Providers::ExternalAutomationManager::ConfiguredSystem

private

def connection_source(options = {})
options[:connection_source] || manager
end
include ManageIQ::Providers::AnsibleTower::Shared::AutomationManager::ConfiguredSystem
include ProviderObjectMixin
end
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
class ManageIQ::Providers::AnsibleTower::AutomationManager::Credential < ManageIQ::Providers::AutomationManager::Authentication
class ManageIQ::Providers::AnsibleTower::AutomationManager::Credential < ManageIQ::Providers::ExternalAutomationManager::Authentication
end
Original file line number Diff line number Diff line change
@@ -1,84 +1,6 @@
require 'ansible_tower_client'
class ManageIQ::Providers::AnsibleTower::AutomationManager::Job < ::OrchestrationStack
require_nested :Status

belongs_to :ext_management_system, :foreign_key => :ems_id, :class_name => "ManageIQ::Providers::AutomationManager"
belongs_to :job_template, :foreign_key => :orchestration_template_id, :class_name => "ConfigurationScript"

#
# Allowed options are
# :limit => String
# :extra_vars => Hash
#
def self.create_stack(template, options = {})
stack = new(:name => template.name,
:ext_management_system => template.manager,
:job_template => template)
stack.send(:update_with_provider_object, raw_create_stack(template, options))
stack
end

def self.raw_create_stack(template, options = {})
template.run(options)
rescue => err
_log.error "Failed to create job from template(#{name}), error: #{err}"
raise MiqException::MiqOrchestrationProvisionError, err.to_s, err.backtrace
end

class << self
alias create_job create_stack
alias raw_create_job raw_create_stack
end
class ManageIQ::Providers::AnsibleTower::AutomationManager::Job <
ManageIQ::Providers::ExternalAutomationManager::OrchestrationStack
include ManageIQ::Providers::AnsibleTower::Shared::AutomationManager::Job

def refresh_ems
ext_management_system.with_provider_connection do |connection|
update_with_provider_object(connection.api.jobs.find(ems_ref))
end
rescue AnsibleTowerClient::ResourceNotFoundError
msg = "AnsibleTower Job #{name} with id(#{id}) does not exist on #{ext_management_system.name}"
raise MiqException::MiqOrchestrationStackNotExistError, msg
rescue => err
_log.error "Refreshing job(#{name}, ems_ref=#{ems_ref}), error: #{err}"
raise MiqException::MiqOrchestrationUpdateError, err.to_s, err.backtrace
end

def update_with_provider_object(raw_job)
self.ems_ref = raw_job.id
self.status = raw_job.status
self.parameters =
raw_job.extra_vars_hash.collect do |para_key, para_val|
OrchestrationStackParameter.new(:name => para_key, :value => para_val, :ems_ref => "#{raw_job.id}_#{para_key}")
end if parameters.empty?
save!
end
private :update_with_provider_object

def raw_status
ext_management_system.with_provider_connection do |connection|
raw_job = connection.api.jobs.find(ems_ref)
Status.new(raw_job.status, nil)
end
rescue AnsibleTowerClient::ResourceNotFoundError
msg = "AnsibleTower Job #{name} with id(#{id}) does not exist on #{ext_management_system.name}"
raise MiqException::MiqOrchestrationStackNotExistError, msg
rescue => err
_log.error "AnsibleTower Job #{name} with id(#{id}) status error: #{err}"
raise MiqException::MiqOrchestrationStatusError, err.to_s, err.backtrace
end

def raw_stdout
ext_management_system.with_provider_connection do |connection|
connection.api.jobs.find(ems_ref).stdout
end
rescue AnsibleTowerClient::ResourceNotFoundError
msg = "AnsibleTower Job #{name} with id(#{id}) does not exist on #{ext_management_system.name}"
raise MiqException::MiqOrchestrationStackNotExistError, msg
rescue => err
_log.error "Reading AnsibleTower Job #{name} with id(#{id}) stdout failed with error: #{err}"
raise MiqException::MiqOrchestrationStatusError, err.to_s, err.backtrace
end

def self.db_name
'ConfigurationJob'
end
require_nested :Status
end
Original file line number Diff line number Diff line change
@@ -1,29 +1,3 @@
class ManageIQ::Providers::AnsibleTower::AutomationManager::Job::Status < ::OrchestrationStack::Status
def succeeded?
status.casecmp("successful").zero?
end

def failed?
status.casecmp("failed").zero?
end

def canceled?
status.casecmp("canceled").zero?
end

def normalized_status
return ['transient', reason || status] unless completed?

if succeeded?
['create_complete', reason || 'OK']
elsif deleted?
['delete_complete', reason || 'Job was deleted']
elsif canceled?
['create_canceled', reason || 'Job launching was canceled']
elsif updated?
['update_complete', reason || 'OK']
else
['failed', reason || 'Job launching failed']
end
end
include ManageIQ::Providers::AnsibleTower::Shared::AutomationManager::Job::Status
end
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
class ManageIQ::Providers::AnsibleTower::AutomationManager::Playbook < ConfigurationScriptPayload
class ManageIQ::Providers::AnsibleTower::AutomationManager::Playbook <
ManageIQ::Providers::ExternalAutomationManager::ConfigurationScriptPayload
end
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
class ManageIQ::Providers::AnsibleTower::AutomationManager::ScmCredential < ManageIQ::Providers::AutomationManager::Authentication
class ManageIQ::Providers::AnsibleTower::AutomationManager::ScmCredential < ManageIQ::Providers::AnsibleTower::AutomationManager::Credential
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
module ManageIQ::Providers::AnsibleTower::Shared::AutomationManager
extend ActiveSupport::Concern

include ProcessTasksMixin
delegate :authentications,
:authentication_check,
:authentication_status,
:authentication_status_ok?,
:connect,
:verify_credentials,
:with_provider_connection,
:to => :provider

module ClassMethods
private

def connection_source(options = {})
options[:connection_source] || self
end
end

def image_name
"ansible_tower_configuration"
end
end
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
class ManageIQ::Providers::AnsibleTower::AutomationManager::ConfigurationScript
module ApiCreate
module ManageIQ::Providers::AnsibleTower::Shared::AutomationManager::ConfigurationScript
extend ActiveSupport::Concern

module ClassMethods

def create_in_provider(manager_id, params)
manager = ExtManagementSystem.find(manager_id)
job_template = manager.with_provider_connection do |connection|
Expand All @@ -8,22 +11,19 @@ def create_in_provider(manager_id, params)

# Get the record in our database
# TODO: This needs to be targeted refresh so it doesn't take too long
EmsRefresh.queue_refresh(manager, nil, true) if manager.authentication_status_ok?

EmsRefresh.queue_refresh(manager, nil, true) if !manager.missing_credentials? && manager.authentication_status_ok?
find_by(:manager_id => manager.id, :manager_ref => job_template.id)
end

def create_in_provider_queue(manager_id, params, auth_user = nil)
manager = ExtManagementSystem.find(manager_id)
task_opts = {
:action => "Creating Ansible Tower Job Template",
:userid => auth_user || "system"
}

manager = ExtManagementSystem.find(manager_id)

queue_opts = {
:args => [manager_id, params],
:class_name => "ManageIQ::Providers::AnsibleTower::AutomationManager::ConfigurationScript",
:class_name => self.name,
:method_name => "create_in_provider",
:priority => MiqQueue::HIGH_PRIORITY,
:role => "ems_operations",
Expand All @@ -33,4 +33,20 @@ def create_in_provider_queue(manager_id, params, auth_user = nil)
MiqTask.generic_action_with_callback(task_opts, queue_opts)
end
end

def run(vars = {})
options = vars.merge(merge_extra_vars(vars[:extra_vars]))

with_provider_object do |jt|
jt.launch(options)
end
end

def merge_extra_vars(external)
{:extra_vars => variables.merge(external || {}).to_json}
end

def provider_object(connection = nil)
(connection || connection_source.connect).api.job_templates.find(manager_ref)
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
module ManageIQ::Providers::AnsibleTower::Shared::AutomationManager::ConfiguredSystem
extend ActiveSupport::Concern
extend ProviderObjectMixin

def provider_object(connection = nil)
(connection || connection_source.connect).api.hosts.find(manager_ref)
end

def ext_management_system
manager
end

private

def connection_source(options = {})
options[:connection_source] || manager
end
end
Loading

0 comments on commit 13acb63

Please sign in to comment.