theforeman/foreman_salt

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

Summary

Maintainability
A
2 hrs
Test Coverage
module ForemanSalt
  module StateImporter
    extend ActiveSupport::Concern

    private

    def find_proxy
      @proxy = SmartProxy.find(params[:proxy] || params[:smart_proxy_id])
      return :not_found unless @proxy
    end

    def fetch_states_from_proxy(proxy, environments = nil)
      result = { changes: {},
                 deletes: [] }

      new = ProxyAPI::Salt.new(url: proxy.url).states_list
      old = SaltModule.to_hash

      environments ||= new.keys + old.keys

      environments.each do |environment|
        old_states = old[environment] || []
        new_states = new[environment] || []

        if old_states.any?
          removed = old_states - new_states
          added = new_states - old_states
        else
          added = new_states
          removed = []
        end

        next unless added.any? || removed.any?
        result[:changes][environment] = {}

        if removed.present?
          result[:changes][environment][:remove] = removed
          result[:deletes] << environment if removed.count == old[environment].count && added.blank?
        end

        result[:changes][environment][:add] = added if added.present?
      end

      result
    end

    def add_to_environment(states, environment)
      environment = SaltEnvironment.where(name: environment).first_or_create

      states.each do |state_name|
        state = SaltModule.where(name: state_name).first_or_create
        state.salt_environments << environment unless state.salt_environments.include? environment
      end
    end

    def remove_from_environment(states, environment)
      return unless (environment = SaltEnvironment.friendly.find(environment))

      states.each do |state_name|
        state = SaltModule.friendly.find(state_name)
        state&.salt_environments&.delete(environment)
      end
    end

    def clean_orphans
      SaltModule.all.find_each do |state|
        state.destroy if state.salt_environments.empty?
      end

      SaltEnvironment.all.find_each do |environment|
        environment.destroy if environment.salt_modules.empty?
      end
    end
  end
end