galoshes/galoshes

View on GitHub
libraries/provider_server.rb

Summary

Maintainability
A
3 hrs
Test Coverage
require_relative 'provider_base'
require_relative 'service_compute'

class Chef::Provider::GaloshesServer < Chef::Provider::GaloshesBase
  include Galoshes::ComputeService

  def load_current_resource
    require 'fog'

    @collection = service.servers
    @current_resource = @collection.all(new_resource.filter_by => new_resource.name).first

    @exists = !(@current_resource.nil?)
    Chef::Log.info("#{resource_str} current_resource: #{@current_resource} exists: #{@exists}")
    Chef::Log.debug(@current_resource)

    if @exists
      new_resource.private_ip_address(@current_resource.private_ip_address)
    else
      @current_resource = @collection.new
    end
    @current_resource
  end

  def action_create
    converge_unless(@exists, "create #{resource_str}") do
      create_attributes = [:groups, :security_group_ids]
      copy_attributes(create_attributes)
      Chef::Log.debug("current_resource before save: #{current_resource}")

      result = @current_resource.save
      Chef::Log.debug("create as result: #{result}")
      @exists = true
      new_resource.updated_by_last_action(true)
    end
  end

  def action_delete
  end

  def action_update
    if @exists
      Chef::Log.info("tags cur: #{@current_resource.tags}")
      Chef::Log.info("tags new: #{new_resource.tags}")
      new_tags = new_resource.tags.reject { |k, _| @current_resource.tags.include?(k) || k.match(/^aws/) }
      Chef::Log.info("new_tags: #{new_tags}")
      converge_if(new_tags.size > 0, "add tags: #{new_tags}") {}

      update_tags = new_resource.tags.select { |k, v| @current_resource.tags.include?(k) && @current_resource.tags[k] != v && !k.match(/^aws/) }
      update_tags.each do |tag, value|
        converge_by("update tag #{tag} from #{@current_resource.tags[tag]} to #{value}") {}
      end
      changes = new_tags.merge(update_tags)
      converge_if(changes.size > 0, 'call create_tags') do
        result = @current_resource.service.create_tags([@current_resource.id], new_tags.merge(update_tags))
        Chef::Log.info("result: #{result.inspect}")
        new_resource.updated_by_last_action(true)
      end

      delete_tags = @current_resource.tags.reject { |k, _| new_resource.tags.include?(k) || k.match(/^aws/) }
      Chef::Log.info("delete_tags: #{delete_tags}")
      converge_if(delete_tags.size != 0, "removing tags: #{delete_tags}") do
        result = @current_resource.service.delete_tags([@current_resource.id], delete_tags)
        verify_result(result)
      end

      cur_groups = @current_resource.security_group_ids
      new_groups = new_resource.security_group_ids
      cur_groups.sort! unless cur_groups.nil?
      new_groups.sort! unless new_groups.nil?
      Chef::Log.info("security_groups cur: #{cur_groups}")
      Chef::Log.info("security_groups new: #{new_groups}")
      converge_if(!(new_groups.nil?) && cur_groups != new_groups, "update security groups from #{cur_groups} to #{new_groups}") do
        result = service.modify_instance_attribute(@current_resource.id, 'GroupId' => new_groups)
        Chef::Log.info("result: #{result.status}")
        new_resource.updated_by_last_action(true)
      end
    end
  end
end