Class: Chef::Provisioning::AWSDriver::AWSResource

Inherits:
SuperLWRP
  • Object
show all
Defined in:
lib/chef/provisioning/aws_driver/aws_resource.rb

Constant Summary collapse

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

Object.new

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from SuperLWRP

#_pv_is, lazy

Constructor Details

#initialize(name, run_context = nil) ⇒ AWSResource

Returns a new instance of AWSResource.



15
16
17
18
19
20
21
22
# 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

Class Method Details

.attribute(name, aws_id_attribute: false, **validation_opts) ⇒ Object

Add support for aws_id_attribute: true



200
201
202
203
# File 'lib/chef/provisioning/aws_driver/aws_resource.rb', line 200

def self.attribute(name, aws_id_attribute: false, **validation_opts)
  @aws_id_attribute = name if aws_id_attribute
  super(name, validation_opts)
end

.aws_id_attributeObject



205
206
207
# File 'lib/chef/provisioning/aws_driver/aws_resource.rb', line 205

def self.aws_id_attribute
  @aws_id_attribute
end

.aws_id_prefixObject



186
187
188
# File 'lib/chef/provisioning/aws_driver/aws_resource.rb', line 186

def self.aws_id_prefix
  @aws_id_prefix
end

.aws_option_handlersObject



195
196
197
# File 'lib/chef/provisioning/aws_driver/aws_resource.rb', line 195

def self.aws_option_handlers
  @@aws_option_handlers
end

.aws_sdk_classObject



178
179
180
# File 'lib/chef/provisioning/aws_driver/aws_resource.rb', line 178

def self.aws_sdk_class
  @aws_sdk_class
end

.aws_sdk_class_idObject



182
183
184
# File 'lib/chef/provisioning/aws_driver/aws_resource.rb', line 182

def self.aws_sdk_class_id
  @aws_sdk_class_id
end

.aws_sdk_option_nameObject



190
191
192
# File 'lib/chef/provisioning/aws_driver/aws_resource.rb', line 190

def self.aws_sdk_option_name
  @aws_sdk_option_name
end

.aws_sdk_type(sdk_class, option_names: nil, option_name: NOT_PASSED, load_provider: true, id: :name, aws_id_prefix: nil) ⇒ Object



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/chef/provisioning/aws_driver/aws_resource.rb', line 147

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(self.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

.get_aws_object(value, resource: nil, run_context: nil, driver: nil, managed_entry_store: nil, required: true) ⇒ Object



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# 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
  if required && result.nil?
    raise "#{self}[#{value}] does not exist!"
  end
  result
end

.get_aws_object_id(value, **options) ⇒ Object



135
136
137
138
# File 'lib/chef/provisioning/aws_driver/aws_resource.rb', line 135

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 = Hash.new, **handler_options) ⇒ Object

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.



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/chef/provisioning/aws_driver/aws_resource.rb', line 94

def self.lookup_options(options = Hash.new, **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

Instance Method Details

#action(*args) ⇒ Object

Backwards compatibility for action :destroy



25
26
27
28
29
30
31
# 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) ⇒ Object



36
37
38
# File 'lib/chef/provisioning/aws_driver/aws_resource.rb', line 36

def action=(value)
  action(value)
end

#aws_objectObject

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.

Raises:

  • (NotImplementedError)


70
71
72
# File 'lib/chef/provisioning/aws_driver/aws_resource.rb', line 70

def aws_object
  raise NotImplementedError, :aws_object
end

#aws_object_idObject



74
75
76
77
78
79
# 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