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
Public Class Methods
# 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
# 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
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
# 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
Add support for aws_id_attribute
: true
Chef::Provisioning::AWSDriver::SuperLWRP::attribute
# 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
# File lib/chef/provisioning/aws_driver/aws_resource.rb, line 193 def self.aws_option_handlers @@aws_option_handlers end
# 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
Backwards compatibility for action :destroy
# File lib/chef/provisioning/aws_driver/aws_resource.rb, line 25 def action(*args) if args == [:delete] super(:destroy) else super end end
# File lib/chef/provisioning/aws_driver/aws_resource.rb, line 36 def action=(value) action(value) end
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
# 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