Project

General

Profile

Download (5.09 KB) Statistics
| Branch: | Tag: | Revision:
module Api::ImportPuppetclassesCommonController
extend ActiveSupport::Concern

included do
before_filter :find_required_puppet_proxy, :only => [:import_puppetclasses]
before_filter :get_environment_id, :only => [:import_puppetclasses]
before_filter :find_optional_environment, :only => [:import_puppetclasses]
end

extend Apipie::DSL::Concern

api :POST, "/smart_proxies/:id/import_puppetclasses", "Import puppet classes from puppet proxy."
api :POST, "/smart_proxies/:smart_proxy_id/environments/:id/import_puppetclasses", "Import puppet classes from puppet proxy for particular environment."
api :POST, "/environments/:environment_id/smart_proxies/:id/import_puppetclasses", "Import puppet classes from puppet proxy for particular environment."
param :id, :identifier, :required => true
param :smart_proxy_id, String, :required => false
param :environment_id, String, :required => false
param :dryrun, :bool, :required => false
param :except, String, :required => false, :desc => "Optional comma-deliminated string containing either 'new,updated,obsolete' used to limit the import_puppetclasses actions"

def import_puppetclasses
return unless changed_environments

# @changed is returned from the method above changed_environments
# Limit actions by setting @changed[kind] to empty hash {} (no action)
# if :except parameter is passed with comma deliminator import_puppetclasses?except=new,obsolete
if params[:except].present?
kinds = params[:except].split(',')
kinds.each do |kind|
@changed[kind] = {} if ["new", "obsolete", "updated"].include?(kind)
end
end

# DRYRUN - /import_puppetclasses?dryrun - do not run PuppetClassImporter
rabl_template = @environment ? 'show' : 'index'
if params.key?('dryrun') && !['false', false].include?(params['dryrun'])
render("api/v1/import_puppetclasses/#{rabl_template}", :layout => "api/layouts/import_puppetclasses_layout")
return
end

# RUN PuppetClassImporter
if (errors = ::PuppetClassImporter.new.obsolete_and_new(@changed)).empty?
render("api/v1/import_puppetclasses/#{rabl_template}", :layout => "api/layouts/import_puppetclasses_layout")
else
render :json => {:message => "Failed to update the environments and puppetclasses from the on-disk puppet installation #{errors.join(", ")}"}, :status => 500
end
end

def changed_environments
begin
opts = { :url => @smart_proxy.url }
@importer = PuppetClassImporter.new(opts)
@changed = @importer.changes

# check if environemnt id passed in URL is name of NEW environment in puppetmaster that doesn't exist in db
if @environment || (@changed['new'].keys.include?(@env_id) && (@environment ||= OpenStruct.new(:name => @env_id)))
# only return :keys equal to @environment in @changed hash
["new", "obsolete", "updated"].each do |kind|
@changed[kind].slice!(@environment.name) unless @changed[kind].empty?
end
end

rescue => e
if e.message =~ /puppet feature/i
msg = 'We did not find a foreman proxy that can provide the information, ensure that this proxy has the puppet feature turned on.'
else
msg = e.message
end
render :json => {:message => msg}, :status => 500 and return false
end

# PuppetClassImporter expects [kind][env] to be in json format
["new", "obsolete", "updated"].each do |kind|
unless (envs = @changed[kind]).empty?
envs.keys.sort.each do |env|
@changed[kind][env] = @changed[kind][env].to_json
end
end
end

# @environments is used in import_puppletclasses/index.json.rabl
environment_names = (@changed["new"].keys + @changed["obsolete"].keys + @changed["updated"].keys).uniq.sort
@environments = environment_names.map do |name|
OpenStruct.new(:name => name)
end

render :json => {:message => "No changes to your environments detected"} and return false unless @environments.any?
@environments.any?
end

def find_required_puppet_proxy
id = params.keys.include?('smart_proxy_id') ? params['smart_proxy_id'] : params['id']
@smart_proxy = SmartProxy.authorized(:view_smart_proxies).find_by_id(id.to_i) if id.to_i > 0
@smart_proxy ||= SmartProxy.authorized(:view_smart_proxies).find_by_name(id)
unless @smart_proxy && SmartProxy.puppet_proxies.pluck("smart_proxies.id").include?(@smart_proxy.id)
not_found 'We did not find a foreman proxy that can provide the information, ensure that this proxy has the puppet feature turned on.'
end
@smart_proxy
end

def get_environment_id
@env_id = if params.keys.include?('environment_id')
params['environment_id']
elsif controller_name == 'environments' && params['id'].present?
params['id']
end
@env_id
end

def find_optional_environment
@environment = Environment.authorized(:view_environments).find_by_id(@env_id.to_i) if @env_id.to_i > 0
@environment ||= Environment.authorized(:view_environments).find_by_name(@env_id)
@environment
end

end
(1-1/4)