theforeman/foreman_salt

View on GitHub
app/controllers/foreman_salt/api/v2/salt_states_controller.rb

Summary

Maintainability
A
1 hr
Test Coverage
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