app/controllers/foreman_salt/api/v2/salt_states_controller.rb
module ForemanSalt
module Api
module V2
class SaltStatesController < ::ForemanSalt::Api::V2::BaseController
include ::ForemanSalt::Concerns::SaltModuleParameters
include StateImporter
before_action :find_resource, except: %i[index create import]
before_action :find_proxy, only: :import
before_action :find_environment, only: :index
api :GET, '/salt_states', N_('List all Salt states')
param :salt_environment_id, :identifier_dottable, required: false, desc: N_('Limit to a specific environment')
param_group :search_and_pagination, ::Api::V2::BaseController
def index
@salt_states = if @salt_environment
resource_scope_for_index.joins(:salt_environments)
.where('salt_module_environments.salt_environment_id' => @salt_environment)
else
resource_scope_for_index
end
@subtotal = @salt_states.count
end
api :GET, '/salt_states/:id/', N_('Show a state')
param :id, :identifier_dottable, required: true
def show
end
def_param_group :state do
param :state, Hash, required: true, action_aware: true do
param :name, String, required: true, desc: N_('Name of the Salt state')
end
end
api :POST, '/salt_states', N_('Create a state')
param_group :state, as: :create
def create
@salt_state = SaltModule.new(salt_module_params)
process_response @salt_state.save
end
api :DELETE, '/salt_states/:id/', N_('Destroy a state')
param :id, :identifier_dottable, required: true
def destroy
process_response @salt_state.destroy
end
api :POST, '/salt_states/import/:smart_proxy_id', N_('Import states from a salt master')
param :smart_proxy_id, :identifier_dottable, required: true, desc: N_('Salt Smart Proxy ID')
param :salt_environments, Array, required: false, desc: N_('Limit to a specific environments')
param :actions, Array, required: false, desc: N_('Limit to specific actions: i.e. add, remove')
param :dryrun, :bool, required: false, desc: N_('Dryrun only')
def import
states = fetch_states_from_proxy(@proxy, params[:salt_environments])
unless params[:dryrun]
states[:changes].each do |environment, state|
add_to_environment(state[:add], environment) if state[:add].present? && (params[:actions].blank? || params[:actions].include?('add'))
if state[:remove].present? && (params[:actions].blank? || params[:actions].include?('remove'))
remove_from_environment(state[:remove], environment)
end
end
clean_orphans
end
render plain: states.to_json
end
def controller_permission
'salt_modules'
end
def resource_class
ForemanSalt::SaltModule
end
def action_permission
case params[:action]
when 'import'
:import
else
super
end
end
private
def find_environment
return unless params[:salt_environment_id]
@salt_environment = ForemanSalt::SaltEnvironment.friendly.find(params[:salt_environment_id])
raise _('Could not find salt environment with id %s') % params[:salt_environment_id] unless @salt_environment
end
end
end
end
end