Class: VagrantPlugins::AWS::Config

Inherits:
Object
  • Object
show all
Defined in:
lib/vagrant-aws/config.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(region_specific = false) ⇒ Config

Returns a new instance of Config.



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/vagrant-aws/config.rb', line 158

def initialize(region_specific=false)
  @access_key_id             = UNSET_VALUE
  @ami                       = UNSET_VALUE
  @availability_zone         = UNSET_VALUE
  @instance_ready_timeout    = UNSET_VALUE
  @instance_package_timeout  = UNSET_VALUE
  @instance_type             = UNSET_VALUE
  @keypair_name              = UNSET_VALUE
  @private_ip_address        = UNSET_VALUE
  @region                    = UNSET_VALUE
  @endpoint                  = UNSET_VALUE
  @version                   = UNSET_VALUE
  @secret_access_key         = UNSET_VALUE
  @session_token             = UNSET_VALUE
  @security_groups           = UNSET_VALUE
  @subnet_id                 = UNSET_VALUE
  @tags                      = {}
  @user_data                 = UNSET_VALUE
  @use_iam_profile           = UNSET_VALUE
  @block_device_mapping      = []
  @elastic_ip                = UNSET_VALUE
  @iam_instance_profile_arn  = UNSET_VALUE
  @iam_instance_profile_name = UNSET_VALUE
  @terminate_on_shutdown     = UNSET_VALUE
  @ssh_host_attribute        = UNSET_VALUE
  @monitoring                = UNSET_VALUE
  @ebs_optimized             = UNSET_VALUE
  @associate_public_ip       = UNSET_VALUE
  @elb                       = UNSET_VALUE

  # Internal state (prefix with __ so they aren't automatically
  # merged)
  @__compiled_region_configs = {}
  @__finalized = false
  @__region_config = {}
  @__region_specific = region_specific
end

Instance Attribute Details

#access_key_idString

The access key ID for accessing AWS.

Returns:

  • (String)


9
10
11
# File 'lib/vagrant-aws/config.rb', line 9

def access_key_id
  @access_key_id
end

#amiString

The ID of the AMI to use.

Returns:

  • (String)


14
15
16
# File 'lib/vagrant-aws/config.rb', line 14

def ami
  @ami
end

#associate_public_ipBoolean

Assigning a public IP address in a VPC

Returns:

  • (Boolean)


150
151
152
# File 'lib/vagrant-aws/config.rb', line 150

def associate_public_ip
  @associate_public_ip
end

#availability_zoneString

The availability zone to launch the instance into. If nil, it will use the default for your account.

Returns:

  • (String)


20
21
22
# File 'lib/vagrant-aws/config.rb', line 20

def availability_zone
  @availability_zone
end

#block_device_mappingArray<Hash>

Block device mappings

Returns:

  • (Array<Hash>)


120
121
122
# File 'lib/vagrant-aws/config.rb', line 120

def block_device_mapping
  @block_device_mapping
end

#ebs_optimizedBoolean

EBS optimized instance

Returns:

  • (Boolean)


145
146
147
# File 'lib/vagrant-aws/config.rb', line 145

def ebs_optimized
  @ebs_optimized
end

#elastic_ipString

If true, acquire and attach an elastic IP address. If set to an IP address, assign to the instance.

Returns:

  • (String)


51
52
53
# File 'lib/vagrant-aws/config.rb', line 51

def elastic_ip
  @elastic_ip
end

#elbString

The name of ELB, which an instance should be attached to

Returns:

  • (String)


156
157
158
# File 'lib/vagrant-aws/config.rb', line 156

def elb
  @elb
end

#endpointString

The EC2 endpoint to connect to

Returns:

  • (String)


61
62
63
# File 'lib/vagrant-aws/config.rb', line 61

def endpoint
  @endpoint
end

#iam_instance_profile_arnString

The Amazon resource name (ARN) of the IAM Instance Profile to associate with the instance.

Returns:

  • (String)


88
89
90
# File 'lib/vagrant-aws/config.rb', line 88

def iam_instance_profile_arn
  @iam_instance_profile_arn
end

#iam_instance_profile_nameString

The name of the IAM Instance Profile to associate with the instance.

Returns:

  • (String)


94
95
96
# File 'lib/vagrant-aws/config.rb', line 94

def iam_instance_profile_name
  @iam_instance_profile_name
end

#instance_package_timeoutFixnum

The timeout to wait for an instance to successfully burn into an AMI.

Returns:

  • (Fixnum)


30
31
32
# File 'lib/vagrant-aws/config.rb', line 30

def instance_package_timeout
  @instance_package_timeout
end

#instance_ready_timeoutFixnum

The timeout to wait for an instance to become ready.

Returns:

  • (Fixnum)


25
26
27
# File 'lib/vagrant-aws/config.rb', line 25

def instance_ready_timeout
  @instance_ready_timeout
end

#instance_typeString

The type of instance to launch, such as “m3.medium”

Returns:

  • (String)


35
36
37
# File 'lib/vagrant-aws/config.rb', line 35

def instance_type
  @instance_type
end

#keypair_nameString

The name of the keypair to use.

Returns:

  • (String)


40
41
42
# File 'lib/vagrant-aws/config.rb', line 40

def keypair_name
  @keypair_name
end

#monitoringBoolean

Enables Monitoring

Returns:

  • (Boolean)


140
141
142
# File 'lib/vagrant-aws/config.rb', line 140

def monitoring
  @monitoring
end

#private_ip_addressString

The private IP address to give this machine (VPC).

Returns:

  • (String)


45
46
47
# File 'lib/vagrant-aws/config.rb', line 45

def private_ip_address
  @private_ip_address
end

#regionString

The name of the AWS region in which to create the instance.

Returns:

  • (String)


56
57
58
# File 'lib/vagrant-aws/config.rb', line 56

def region
  @region
end

#secret_access_keyString

The secret access key for accessing AWS.

Returns:

  • (String)


71
72
73
# File 'lib/vagrant-aws/config.rb', line 71

def secret_access_key
  @secret_access_key
end

#security_groupsArray<String>

The security groups to set on the instance. For VPC this must be a list of IDs. For EC2, it can be either.

Returns:

  • (Array<String>)


82
83
84
# File 'lib/vagrant-aws/config.rb', line 82

def security_groups
  @security_groups
end

#session_tokenString

The token associated with the key for accessing AWS.

Returns:

  • (String)


76
77
78
# File 'lib/vagrant-aws/config.rb', line 76

def session_token
  @session_token
end

#ssh_host_attributeSymbol

Specifies which address to connect to with ssh Must be one of:

- :public_ip_address
- :dns_name
- :private_ip_address

This attribute also accepts an array of symbols

Returns:

  • (Symbol)


135
136
137
# File 'lib/vagrant-aws/config.rb', line 135

def ssh_host_attribute
  @ssh_host_attribute
end

#subnet_idString

The subnet ID to launch the machine into (VPC).

Returns:

  • (String)


99
100
101
# File 'lib/vagrant-aws/config.rb', line 99

def subnet_id
  @subnet_id
end

#tagsHash<String, String>

The tags for the machine.

Returns:

  • (Hash<String, String>)


104
105
106
# File 'lib/vagrant-aws/config.rb', line 104

def tags
  @tags
end

#terminate_on_shutdownbool

Indicates whether an instance stops or terminates when you initiate shutdown from the instance

Returns:

  • (bool)


125
126
127
# File 'lib/vagrant-aws/config.rb', line 125

def terminate_on_shutdown
  @terminate_on_shutdown
end

#use_iam_profileBoolean

Use IAM Instance Role for authentication to AWS instead of an explicit access_id and secret_access_key

Returns:

  • (Boolean)


110
111
112
# File 'lib/vagrant-aws/config.rb', line 110

def use_iam_profile
  @use_iam_profile
end

#user_dataString

The user data string

Returns:

  • (String)


115
116
117
# File 'lib/vagrant-aws/config.rb', line 115

def user_data
  @user_data
end

#versionString

The version of the AWS api to use

Returns:

  • (String)


66
67
68
# File 'lib/vagrant-aws/config.rb', line 66

def version
  @version
end

Instance Method Details

#finalize!Object



266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
# File 'lib/vagrant-aws/config.rb', line 266

def finalize!
  # Try to get access keys from standard AWS environment variables; they
  # will default to nil if the environment variables are not present.
  @access_key_id     = ENV['AWS_ACCESS_KEY'] if @access_key_id     == UNSET_VALUE
  @secret_access_key = ENV['AWS_SECRET_KEY'] if @secret_access_key == UNSET_VALUE
  @session_token     = ENV['AWS_SESSION_TOKEN'] if @session_token == UNSET_VALUE

  # AMI must be nil, since we can't default that
  @ami = nil if @ami == UNSET_VALUE

  # Set the default timeout for waiting for an instance to be ready
  @instance_ready_timeout = 120 if @instance_ready_timeout == UNSET_VALUE

  # Set the default timeout for waiting for an instance to burn into and ami
  @instance_package_timeout = 600 if @instance_package_timeout == UNSET_VALUE

  # Default instance type is an m3.medium
  @instance_type = "m3.medium" if @instance_type == UNSET_VALUE

  # Keypair defaults to nil
  @keypair_name = nil if @keypair_name == UNSET_VALUE

  # Default the private IP to nil since VPC is not default
  @private_ip_address = nil if @private_ip_address == UNSET_VALUE

  # Acquire an elastic IP if requested
  @elastic_ip = nil if @elastic_ip == UNSET_VALUE

  # Default region is us-east-1. This is sensible because AWS
  # generally defaults to this as well.
  @region = "us-east-1" if @region == UNSET_VALUE
  @availability_zone = nil if @availability_zone == UNSET_VALUE
  @endpoint = nil if @endpoint == UNSET_VALUE
  @version = nil if @version == UNSET_VALUE

  # The security groups are empty by default.
  @security_groups = [] if @security_groups == UNSET_VALUE

  # Subnet is nil by default otherwise we'd launch into VPC.
  @subnet_id = nil if @subnet_id == UNSET_VALUE

  # IAM Instance profile arn/name is nil by default.
  @iam_instance_profile_arn   = nil if @iam_instance_profile_arn  == UNSET_VALUE
  @iam_instance_profile_name  = nil if @iam_instance_profile_name == UNSET_VALUE

  # By default we don't use an IAM profile
  @use_iam_profile = false if @use_iam_profile == UNSET_VALUE

  # User Data is nil by default
  @user_data = nil if @user_data == UNSET_VALUE

  # default false
  @terminate_on_shutdown = false if @terminate_on_shutdown == UNSET_VALUE

  # default to nil
  @ssh_host_attribute = nil if @ssh_host_attribute == UNSET_VALUE

  # default false
  @monitoring = false if @monitoring == UNSET_VALUE

  # default false
  @ebs_optimized = false if @ebs_optimized == UNSET_VALUE

  # default false
  @associate_public_ip = false if @associate_public_ip == UNSET_VALUE

  # Don't attach instance to any ELB by default
  @elb = nil if @elb == UNSET_VALUE

  # Compile our region specific configurations only within
  # NON-REGION-SPECIFIC configurations.
  if !@__region_specific
    @__region_config.each do |region, blocks|
      config = self.class.new(true).merge(self)

      # Execute the configuration for each block
      blocks.each { |b| b.call(config) }

      # The region name of the configuration always equals the
      # region config name:
      config.region = region

      # Finalize the configuration
      config.finalize!

      # Store it for retrieval
      @__compiled_region_configs[region] = config
    end
  end

  # Mark that we finalized
  @__finalized = true
end

#get_region_config(name) ⇒ Object

This gets the configuration for a specific region. It shouldn’t be called by the general public and is only used internally.



389
390
391
392
393
394
395
396
# File 'lib/vagrant-aws/config.rb', line 389

def get_region_config(name)
  if !@__finalized
    raise "Configuration must be finalized before calling this method."
  end

  # Return the compiled region config
  @__compiled_region_configs[name] || self
end

#merge(other) ⇒ Object


Internal methods.




237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
# File 'lib/vagrant-aws/config.rb', line 237

def merge(other)
  super.tap do |result|
    # Copy over the region specific flag. "True" is retained if either
    # has it.
    new_region_specific = other.instance_variable_get(:@__region_specific)
    result.instance_variable_set(
    :@__region_specific, new_region_specific || @__region_specific)

    # Go through all the region configs and prepend ours onto
    # theirs.
    new_region_config = other.instance_variable_get(:@__region_config)
    @__region_config.each do |key, value|
      new_region_config[key] ||= []
      new_region_config[key] = value + new_region_config[key]
    end

    # Set it
    result.instance_variable_set(:@__region_config, new_region_config)

    # Merge in the tags
    result.tags.merge!(self.tags)
    result.tags.merge!(other.tags)

    # Merge block_device_mapping
    result.block_device_mapping |= self.block_device_mapping
    result.block_device_mapping |= other.block_device_mapping
  end
end

#region_config(region, attributes = nil) {|config| ... } ⇒ Object

Allows region-specific overrides of any of the settings on this configuration object. This allows the user to override things like AMI and keypair name for regions. Example:

aws.region_config "us-east-1" do |region|
  region.ami = "ami-12345678"
  region.keypair_name = "company-east"
end

Parameters:

  • region (String)

    The region name to configure.

  • attributes (Hash) (defaults to: nil)

    Direct attributes to set on the configuration as a shortcut instead of specifying a full block.

Yields:

  • (config)

    Yields a new AWS configuration.



215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
# File 'lib/vagrant-aws/config.rb', line 215

def region_config(region, attributes=nil, &block)
  # Append the block to the list of region configs for that region.
  # We'll evaluate these upon finalization.
  @__region_config[region] ||= []

  # Append a block that sets attributes if we got one
  if attributes
    attr_block = lambda do |config|
      config.set_options(attributes)
    end

    @__region_config[region] << attr_block
  end

  # Append a block if we got one
  @__region_config[region] << block if block_given?
end

#validate(machine) ⇒ Object



360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
# File 'lib/vagrant-aws/config.rb', line 360

def validate(machine)
  errors = _detected_errors

  errors << I18n.t("vagrant_aws.config.region_required") if @region.nil?

  if @region
    # Get the configuration for the region we're using and validate only
    # that region.
    config = get_region_config(@region)

    if !config.use_iam_profile
      errors << I18n.t("vagrant_aws.config.access_key_id_required") if \
        config.access_key_id.nil?
      errors << I18n.t("vagrant_aws.config.secret_access_key_required") if \
        config.secret_access_key.nil?
    end

    if config.associate_public_ip && !config.subnet_id
      errors << I18n.t("vagrant_aws.config.subnet_id_required_with_public_ip")
    end

    errors << I18n.interpolate("vagrant_aws.config.ami_required", :region => @region)  if config.ami.nil?
  end

  { "AWS Provider" => errors }
end