theforeman/foreman_salt

View on GitHub
app/controllers/foreman_salt/minions_controller.rb

Summary

Maintainability
A
1 hr
Test Coverage
module ForemanSalt
  class MinionsController < ::ForemanSalt::ApplicationController
    include ::Foreman::Controller::SmartProxyAuth
    include ::Foreman::Controller::Parameters::Host

    before_action :find_resource, only: %i[node]
    add_smart_proxy_filters :node, features: 'Salt'

    def node
      enc = {}
      env = @minion.salt_environment.blank? ? 'base' : @minion.salt_environment.name
      enc['classes'] = @minion.salt_modules_for_enc

      pillars = @minion.info['parameters']
      pillars['saltenv'] = env
      pillars.merge!(@minion.salt_params)

      enc['parameters'] = Setting[:salt_namespace_pillars] ? { 'foreman' => pillars } : pillars

      enc['environment'] = env
      respond_to do |format|
        format.html { render plain: "<pre>#{ERB::Util.html_escape(enc.to_yaml)}</pre>" }
        format.yml  { render plain: enc.to_yaml }
      end
    rescue StandardError
      logger.warn "Failed to generate external nodes for #{@minion} with #{$ERROR_INFO}"
      render(plain: "#{_('Unable to generate output, Check log files')}\n", status: :precondition_failed) && return
    end

    def salt_environment_selected
      if params[:host][:salt_environment_id].present?
        @salt_environment = ::ForemanSalt::SaltEnvironment.friendly.find(params[:host][:salt_environment_id])
        load_ajax_vars
        render partial: 'foreman_salt/salt_modules/host_tab_pane'
      else
        logger.info 'environment_id is required to render states'
      end
    end

    def action_permission
      case params[:action]
      when 'node'
        :view
      when 'salt_environment_selected'
        :edit
      else
        super
      end
    end

    def controller_permission
      'hosts'
    end

    def resource_class
      Host
    end

    private

    def load_ajax_vars
      @minion = Host::Base.authorized(:view_hosts, Host).find_by(id: params[:host_id])
      if @minion
        unless @minion.is_a?(Host::Managed)
          @minion      = @minion.becomes(Host::Managed)
          @minion.type = 'Host::Managed'
        end
        @minion.attributes = host_params(:host)
      else
        @minion ||= Host::Managed.new(host_params(:host))
      end

      @obj = @minion
      @inherited_salt_modules = @salt_environment.salt_modules.where(id: @minion.hostgroup ? @minion.hostgroup.all_salt_modules : [])
      @salt_modules = @salt_environment.salt_modules - @inherited_salt_modules
      @selected = @minion.salt_modules || []
    end
  end
end