class Chef::Provisioning::AWSDriver::AWSResource

Constants

NOT_PASSED

This supports the introduction of the NOT_PASSED chef constant in chef 12.5 TODO remove when we make 12.5 and higher a dependency

Attributes

aws_id_attribute[R]
aws_id_prefix[R]
aws_sdk_class[R]
aws_sdk_class_id[R]
aws_sdk_option_name[R]

Public Class Methods

get_aws_object(value, resource: nil, run_context: nil, driver: nil, managed_entry_store: nil, required: true) click to toggle source
# File lib/chef/provisioning/aws_driver/aws_resource.rb, line 112
def self.get_aws_object(value, resource: nil, run_context: nil, driver: nil, managed_entry_store: nil, required: true)
  return nil if value.nil?

  if resource
    run_context         ||= resource.run_context
    driver              ||= resource.driver
    managed_entry_store ||= resource.managed_entry_store
  end
  if value.is_a?(self)
    resource = value
  else
    resource = new(value, run_context)
    resource.driver driver if driver
    resource.managed_entry_store managed_entry_store if managed_entry_store
  end

  result = resource.aws_object
  raise "#{self}[#{value}] does not exist!" if required && result.nil?
  result
end
get_aws_object_id(value, **options) click to toggle source
# File lib/chef/provisioning/aws_driver/aws_resource.rb, line 133
def self.get_aws_object_id(value, **options)
  aws_object = get_aws_object(value, **options)
  aws_object.public_send(aws_sdk_class_id) if aws_object
end
lookup_options(options = {}, **handler_options) click to toggle source

Look up an AWS options list, translating standard names using the appropriate classes.

For example, `load_balancer_options` is passed into `lookup_options`, and if it looks like this: `{ subnets: `[ 'subnet1', 'subnet2' ] }`, then `AWSResource.lookup_options` will translate each ID with `AwsSubnet.get_aws_object('subnet1')`, which supports Chef names (`mysubnet`) as well as AWS subnet Ids (`subnet-1234abcd`) or AWS objects (`::Aws::EC2::Subnet`).

Keys that represent non-AWS-objects (such as `timeout`) are left alone.

# File lib/chef/provisioning/aws_driver/aws_resource.rb, line 94
def self.lookup_options(options = {}, **handler_options)
  options = options.dup
  options.each do |name, value|
    if name.to_s.end_with?("s")
      handler_name = :"#{name[0..-2]}"
      if aws_option_handlers[handler_name]
        options[name] = [options[name]].flatten.map { |value| aws_option_handlers[handler_name].get_aws_object_id(value, **handler_options) }
      end
    else
      handler_name = name.to_sym
      if aws_option_handlers[handler_name]
        options[handler_name] = aws_option_handlers[handler_name].get_aws_object_id(value, **handler_options)
      end
    end
  end
  options
end
new(name, run_context = nil) click to toggle source
Calls superclass method
# File lib/chef/provisioning/aws_driver/aws_resource.rb, line 15
def initialize(name, run_context = nil)
  name = name.public_send(self.class.aws_sdk_class_id) if name.is_a?(self.class.aws_sdk_class)
  super
  if run_context
    driver run_context.chef_provisioning.current_driver
    chef_server run_context.cheffish.current_chef_server
  end
end

Protected Class Methods

attribute(name, aws_id_attribute: false, **validation_opts) click to toggle source

Add support for aws_id_attribute: true

# File lib/chef/provisioning/aws_driver/aws_resource.rb, line 198
def self.attribute(name, aws_id_attribute: false, **validation_opts)
  @aws_id_attribute = name if aws_id_attribute
  super(name, validation_opts)
end
aws_option_handlers() click to toggle source
# File lib/chef/provisioning/aws_driver/aws_resource.rb, line 193
def self.aws_option_handlers
  @@aws_option_handlers
end
aws_sdk_type(sdk_class, option_names: nil, option_name: NOT_PASSED, load_provider: true, id: :name, aws_id_prefix: nil) click to toggle source
# File lib/chef/provisioning/aws_driver/aws_resource.rb, line 145
def self.aws_sdk_type(sdk_class,
                      option_names: nil,
                      option_name: NOT_PASSED,
                      load_provider: true,
                      id: :name,
                      aws_id_prefix: nil)
  self.resource_name = convert_to_snake_case(name.split("::")[-1])
  @aws_sdk_class = sdk_class
  @aws_sdk_class_id = id
  @aws_id_prefix = aws_id_prefix

  # Go ahead and require the provider since we're here anyway ...
  require "chef/provider/#{resource_name}" if load_provider

  option_name = :"#{resource_name[4..-1]}" if option_name == NOT_PASSED
  @aws_sdk_option_name = option_name

  option_names ||= begin
    option_names = []
    option_names << aws_sdk_option_name
    option_names << :"#{option_name}_#{aws_sdk_class_id}" if aws_sdk_class_id
    option_names
  end
  option_names.each do |option_name|
    aws_option_handlers[option_name] = self
  end

  name = self.name.split("::")[-1]
  eval("Chef::Provisioning::AWSDriver::Resources::#{name} = self", binding, __FILE__, __LINE__)
end

Public Instance Methods

action(*args) click to toggle source

Backwards compatibility for action :destroy

Calls superclass method
# File lib/chef/provisioning/aws_driver/aws_resource.rb, line 25
def action(*args)
  if args == [:delete]
    super(:destroy)
  else
    super
  end
end
action=(value) click to toggle source
# File lib/chef/provisioning/aws_driver/aws_resource.rb, line 36
def action=(value)
  action(value)
end
aws_object() click to toggle source

Get the current AWS object. This should return the aws_object even if it has a status like 'deleted' or 'inactive'. If there is an aws_object, we return it. Callers will need to check the status if they care.

# File lib/chef/provisioning/aws_driver/aws_resource.rb, line 70
def aws_object
  raise NotImplementedError, :aws_object
end
aws_object_id() click to toggle source
# File lib/chef/provisioning/aws_driver/aws_resource.rb, line 74
def aws_object_id
  @aws_object_id ||= begin
    o = aws_object
    o.public_send(self.class.aws_sdk_class_id) if o
  end
end