vagrant-gecko-aws 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +6 -0
  5. data/CHANGELOG.md +96 -0
  6. data/Gemfile +10 -0
  7. data/LICENSE +8 -0
  8. data/README.md +329 -0
  9. data/Rakefile +22 -0
  10. data/dummy.box +0 -0
  11. data/example_box/README.md +13 -0
  12. data/example_box/metadata.json +3 -0
  13. data/lib/vagrant-aws/action/connect_aws.rb +48 -0
  14. data/lib/vagrant-aws/action/elb_deregister_instance.rb +24 -0
  15. data/lib/vagrant-aws/action/elb_register_instance.rb +24 -0
  16. data/lib/vagrant-aws/action/is_created.rb +18 -0
  17. data/lib/vagrant-aws/action/is_stopped.rb +18 -0
  18. data/lib/vagrant-aws/action/message_already_created.rb +16 -0
  19. data/lib/vagrant-aws/action/message_not_created.rb +16 -0
  20. data/lib/vagrant-aws/action/message_will_not_destroy.rb +16 -0
  21. data/lib/vagrant-aws/action/package_instance.rb +192 -0
  22. data/lib/vagrant-aws/action/read_ssh_info.rb +53 -0
  23. data/lib/vagrant-aws/action/read_state.rb +38 -0
  24. data/lib/vagrant-aws/action/run_instance.rb +314 -0
  25. data/lib/vagrant-aws/action/start_instance.rb +81 -0
  26. data/lib/vagrant-aws/action/stop_instance.rb +28 -0
  27. data/lib/vagrant-aws/action/terminate_instance.rb +51 -0
  28. data/lib/vagrant-aws/action/timed_provision.rb +21 -0
  29. data/lib/vagrant-aws/action/wait_for_state.rb +41 -0
  30. data/lib/vagrant-aws/action/warn_networks.rb +19 -0
  31. data/lib/vagrant-aws/action.rb +210 -0
  32. data/lib/vagrant-aws/config.rb +572 -0
  33. data/lib/vagrant-aws/errors.rb +43 -0
  34. data/lib/vagrant-aws/plugin.rb +73 -0
  35. data/lib/vagrant-aws/provider.rb +50 -0
  36. data/lib/vagrant-aws/util/elb.rb +58 -0
  37. data/lib/vagrant-aws/util/timer.rb +17 -0
  38. data/lib/vagrant-aws/version.rb +5 -0
  39. data/lib/vagrant-aws.rb +18 -0
  40. data/locales/en.yml +159 -0
  41. data/spec/spec_helper.rb +1 -0
  42. data/spec/vagrant-aws/config_spec.rb +374 -0
  43. data/templates/metadata.json.erb +3 -0
  44. data/templates/vagrant-aws_package_Vagrantfile.erb +5 -0
  45. data/vagrant-aws.gemspec +58 -0
  46. metadata +156 -0
@@ -0,0 +1,572 @@
1
+ require "vagrant"
2
+ require "iniparse"
3
+
4
+ module VagrantPlugins
5
+ module AWS
6
+ class Config < Vagrant.plugin("2", :config)
7
+ # The access key ID for accessing AWS.
8
+ #
9
+ # @return [String]
10
+ attr_accessor :access_key_id
11
+
12
+ # The ID of the AMI to use.
13
+ #
14
+ # @return [String]
15
+ attr_accessor :ami
16
+
17
+ # The availability zone to launch the instance into. If nil, it will
18
+ # use the default for your account.
19
+ #
20
+ # @return [String]
21
+ attr_accessor :availability_zone
22
+
23
+ # The placement group to launch the instance into. If nil, it will
24
+ # not use a placement group
25
+ #
26
+ # @return [String]
27
+ attr_accessor :placement_group
28
+
29
+ # The timeout to wait for an instance to become ready.
30
+ #
31
+ # @return [Fixnum]
32
+ attr_accessor :instance_ready_timeout
33
+
34
+ # The interval to wait for checking an instance's state.
35
+ #
36
+ # @return [Fixnum]
37
+ attr_accessor :instance_check_interval
38
+
39
+ # The timeout to wait for an instance to successfully burn into an AMI.
40
+ #
41
+ # @return [Fixnum]
42
+ attr_accessor :instance_package_timeout
43
+
44
+ # The type of instance to launch, such as "m3.medium"
45
+ #
46
+ # @return [String]
47
+ attr_accessor :instance_type
48
+
49
+ # The name of the keypair to use.
50
+ #
51
+ # @return [String]
52
+ attr_accessor :keypair_name
53
+
54
+ # The private IP address to give this machine (VPC).
55
+ #
56
+ # @return [String]
57
+ attr_accessor :private_ip_address
58
+
59
+ # If true, acquire and attach an elastic IP address.
60
+ # If set to an IP address, assign to the instance.
61
+ #
62
+ # @return [String]
63
+ attr_accessor :elastic_ip
64
+
65
+ # The name of the AWS region in which to create the instance.
66
+ #
67
+ # @return [String]
68
+ attr_accessor :region
69
+
70
+ # The EC2 endpoint to connect to
71
+ #
72
+ # @return [String]
73
+ attr_accessor :endpoint
74
+
75
+ # The version of the AWS api to use
76
+ #
77
+ # @return [String]
78
+ attr_accessor :version
79
+
80
+ # The secret access key for accessing AWS.
81
+ #
82
+ # @return [String]
83
+ attr_accessor :secret_access_key
84
+
85
+ # The token associated with the key for accessing AWS.
86
+ #
87
+ # @return [String]
88
+ attr_accessor :session_token
89
+
90
+ # The security groups to set on the instance. For VPC this must
91
+ # be a list of IDs. For EC2, it can be either.
92
+ #
93
+ # @return [Array<String>]
94
+ attr_reader :security_groups
95
+
96
+ # The Amazon resource name (ARN) of the IAM Instance Profile
97
+ # to associate with the instance.
98
+ #
99
+ # @return [String]
100
+ attr_accessor :iam_instance_profile_arn
101
+
102
+ # The name of the IAM Instance Profile to associate with
103
+ # the instance.
104
+ #
105
+ # @return [String]
106
+ attr_accessor :iam_instance_profile_name
107
+
108
+ # The subnet ID to launch the machine into (VPC).
109
+ #
110
+ # @return [String]
111
+ attr_accessor :subnet_id
112
+
113
+ # The tags for the machine.
114
+ #
115
+ # @return [Hash<String, String>]
116
+ attr_accessor :tags
117
+
118
+ # The tags for the AMI generated with package.
119
+ #
120
+ # @return [Hash<String, String>]
121
+ attr_accessor :package_tags
122
+
123
+ # Use IAM Instance Role for authentication to AWS instead of an
124
+ # explicit access_id and secret_access_key
125
+ #
126
+ # @return [Boolean]
127
+ attr_accessor :use_iam_profile
128
+
129
+ # The user data string
130
+ #
131
+ # @return [String]
132
+ attr_accessor :user_data
133
+
134
+ # Block device mappings
135
+ #
136
+ # @return [Array<Hash>]
137
+ attr_accessor :block_device_mapping
138
+
139
+ # Indicates whether an instance stops or terminates when you initiate shutdown from the instance
140
+ #
141
+ # @return [bool]
142
+ attr_accessor :terminate_on_shutdown
143
+
144
+ # Specifies which address to connect to with ssh
145
+ # Must be one of:
146
+ # - :public_ip_address
147
+ # - :dns_name
148
+ # - :private_ip_address
149
+ # This attribute also accepts an array of symbols
150
+ #
151
+ # @return [Symbol]
152
+ attr_accessor :ssh_host_attribute
153
+
154
+ # Enables Monitoring
155
+ #
156
+ # @return [Boolean]
157
+ attr_accessor :monitoring
158
+
159
+ # EBS optimized instance
160
+ #
161
+ # @return [Boolean]
162
+ attr_accessor :ebs_optimized
163
+
164
+ # Source Destination check
165
+ #
166
+ # @return [Boolean]
167
+ attr_accessor :source_dest_check
168
+
169
+ # Assigning a public IP address in a VPC
170
+ #
171
+ # @return [Boolean]
172
+ attr_accessor :associate_public_ip
173
+
174
+ # The name of ELB, which an instance should be
175
+ # attached to
176
+ #
177
+ # @return [String]
178
+ attr_accessor :elb
179
+
180
+ # Disable unregisering ELB's from AZ - useful in case of not using default VPC
181
+ # @return [Boolean]
182
+ attr_accessor :unregister_elb_from_az
183
+
184
+ # Kernel Id
185
+ #
186
+ # @return [String]
187
+ attr_accessor :kernel_id
188
+
189
+ # The tenancy of the instance in a VPC.
190
+ # Defaults to 'default'.
191
+ #
192
+ # @return [String]
193
+ attr_accessor :tenancy
194
+
195
+ # The directory where AWS files are stored (usually $HOME/.aws)
196
+ #
197
+ # @return [String]
198
+ attr_accessor :aws_dir
199
+
200
+ # The selected AWS named profile (as defined in $HOME/.aws/* files)
201
+ #
202
+ # @return [String]
203
+ attr_accessor :aws_profile
204
+
205
+ def initialize(region_specific=false)
206
+ @access_key_id = UNSET_VALUE
207
+ @ami = UNSET_VALUE
208
+ @availability_zone = UNSET_VALUE
209
+ @instance_check_interval = UNSET_VALUE
210
+ @placement_group = UNSET_VALUE
211
+ @instance_ready_timeout = UNSET_VALUE
212
+ @instance_package_timeout = UNSET_VALUE
213
+ @instance_type = UNSET_VALUE
214
+ @keypair_name = UNSET_VALUE
215
+ @private_ip_address = UNSET_VALUE
216
+ @region = UNSET_VALUE
217
+ @endpoint = UNSET_VALUE
218
+ @version = UNSET_VALUE
219
+ @secret_access_key = UNSET_VALUE
220
+ @session_token = UNSET_VALUE
221
+ @security_groups = UNSET_VALUE
222
+ @subnet_id = UNSET_VALUE
223
+ @tags = {}
224
+ @package_tags = {}
225
+ @user_data = UNSET_VALUE
226
+ @use_iam_profile = UNSET_VALUE
227
+ @block_device_mapping = []
228
+ @elastic_ip = UNSET_VALUE
229
+ @iam_instance_profile_arn = UNSET_VALUE
230
+ @iam_instance_profile_name = UNSET_VALUE
231
+ @terminate_on_shutdown = UNSET_VALUE
232
+ @ssh_host_attribute = UNSET_VALUE
233
+ @monitoring = UNSET_VALUE
234
+ @ebs_optimized = UNSET_VALUE
235
+ @source_dest_check = UNSET_VALUE
236
+ @associate_public_ip = UNSET_VALUE
237
+ @elb = UNSET_VALUE
238
+ @unregister_elb_from_az = UNSET_VALUE
239
+ @kernel_id = UNSET_VALUE
240
+ @tenancy = UNSET_VALUE
241
+ @aws_dir = UNSET_VALUE
242
+ @aws_profile = UNSET_VALUE
243
+
244
+ # Internal state (prefix with __ so they aren't automatically
245
+ # merged)
246
+ @__compiled_region_configs = {}
247
+ @__finalized = false
248
+ @__region_config = {}
249
+ @__region_specific = region_specific
250
+ end
251
+
252
+ # set security_groups
253
+ def security_groups=(value)
254
+ # convert value to array if necessary
255
+ @security_groups = value.is_a?(Array) ? value : [value]
256
+ end
257
+
258
+ # Allows region-specific overrides of any of the settings on this
259
+ # configuration object. This allows the user to override things like
260
+ # AMI and keypair name for regions. Example:
261
+ #
262
+ # aws.region_config "us-east-1" do |region|
263
+ # region.ami = "ami-12345678"
264
+ # region.keypair_name = "company-east"
265
+ # end
266
+ #
267
+ # @param [String] region The region name to configure.
268
+ # @param [Hash] attributes Direct attributes to set on the configuration
269
+ # as a shortcut instead of specifying a full block.
270
+ # @yield [config] Yields a new AWS configuration.
271
+ def region_config(region, attributes=nil, &block)
272
+ # Append the block to the list of region configs for that region.
273
+ # We'll evaluate these upon finalization.
274
+ @__region_config[region] ||= []
275
+
276
+ # Append a block that sets attributes if we got one
277
+ if attributes
278
+ attr_block = lambda do |config|
279
+ config.set_options(attributes)
280
+ end
281
+
282
+ @__region_config[region] << attr_block
283
+ end
284
+
285
+ # Append a block if we got one
286
+ @__region_config[region] << block if block_given?
287
+ end
288
+
289
+ #-------------------------------------------------------------------
290
+ # Internal methods.
291
+ #-------------------------------------------------------------------
292
+
293
+ def merge(other)
294
+ super.tap do |result|
295
+ # Copy over the region specific flag. "True" is retained if either
296
+ # has it.
297
+ new_region_specific = other.instance_variable_get(:@__region_specific)
298
+ result.instance_variable_set(
299
+ :@__region_specific, new_region_specific || @__region_specific)
300
+
301
+ # Go through all the region configs and prepend ours onto
302
+ # theirs.
303
+ new_region_config = other.instance_variable_get(:@__region_config)
304
+ @__region_config.each do |key, value|
305
+ new_region_config[key] ||= []
306
+ new_region_config[key] = value + new_region_config[key]
307
+ end
308
+
309
+ # Set it
310
+ result.instance_variable_set(:@__region_config, new_region_config)
311
+
312
+ # Merge in the tags
313
+ result.tags.merge!(self.tags)
314
+ result.tags.merge!(other.tags)
315
+
316
+ # Merge in the package tags
317
+ result.package_tags.merge!(self.package_tags)
318
+ result.package_tags.merge!(other.package_tags)
319
+
320
+ # Merge block_device_mapping
321
+ result.block_device_mapping |= self.block_device_mapping
322
+ result.block_device_mapping |= other.block_device_mapping
323
+ end
324
+ end
325
+
326
+ def finalize!
327
+ # If access_key_id or secret_access_key were not specified in Vagrantfile
328
+ # then try to read from environment variables first, and if it fails from
329
+ # the AWS folder.
330
+ if @access_key_id == UNSET_VALUE or @secret_access_key == UNSET_VALUE
331
+ @aws_profile = 'default' if @aws_profile == UNSET_VALUE
332
+ @aws_dir = ENV['HOME'].to_s + '/.aws/' if @aws_dir == UNSET_VALUE
333
+ @region, @access_key_id, @secret_access_key, @session_token = Credentials.new.get_aws_info(@aws_profile, @aws_dir)
334
+ @region = UNSET_VALUE if @region.nil?
335
+ else
336
+ @aws_profile = nil
337
+ @aws_dir = nil
338
+ end
339
+
340
+ # session token must be set to nil, empty string isn't enough!
341
+ @session_token = nil if @session_token == UNSET_VALUE
342
+
343
+ # AMI must be nil, since we can't default that
344
+ @ami = nil if @ami == UNSET_VALUE
345
+
346
+ # Set the default timeout for waiting for an instance to be ready
347
+ @instance_ready_timeout = 120 if @instance_ready_timeout == UNSET_VALUE
348
+
349
+ # Set the default interval to check instance state
350
+ @instance_check_interval = 2 if @instance_check_interval == UNSET_VALUE
351
+
352
+ # Set the default timeout for waiting for an instance to burn into and ami
353
+ @instance_package_timeout = 600 if @instance_package_timeout == UNSET_VALUE
354
+
355
+ # Default instance type is an m3.medium
356
+ @instance_type = "m3.medium" if @instance_type == UNSET_VALUE
357
+
358
+ # Keypair defaults to nil
359
+ @keypair_name = nil if @keypair_name == UNSET_VALUE
360
+
361
+ # Default the private IP to nil since VPC is not default
362
+ @private_ip_address = nil if @private_ip_address == UNSET_VALUE
363
+
364
+ # Acquire an elastic IP if requested
365
+ @elastic_ip = nil if @elastic_ip == UNSET_VALUE
366
+
367
+ # Default region is us-east-1. This is sensible because AWS
368
+ # generally defaults to this as well.
369
+ @region = "us-east-1" if @region == UNSET_VALUE
370
+ @availability_zone = nil if @availability_zone == UNSET_VALUE
371
+ @placement_group = nil if @placement_group == UNSET_VALUE
372
+ @endpoint = nil if @endpoint == UNSET_VALUE
373
+ @version = nil if @version == UNSET_VALUE
374
+
375
+ # The security groups are empty by default.
376
+ @security_groups = [] if @security_groups == UNSET_VALUE
377
+
378
+ # Subnet is nil by default otherwise we'd launch into VPC.
379
+ @subnet_id = nil if @subnet_id == UNSET_VALUE
380
+
381
+ # IAM Instance profile arn/name is nil by default.
382
+ @iam_instance_profile_arn = nil if @iam_instance_profile_arn == UNSET_VALUE
383
+ @iam_instance_profile_name = nil if @iam_instance_profile_name == UNSET_VALUE
384
+
385
+ # By default we don't use an IAM profile
386
+ @use_iam_profile = false if @use_iam_profile == UNSET_VALUE
387
+
388
+ # User Data is nil by default
389
+ @user_data = nil if @user_data == UNSET_VALUE
390
+
391
+ # default false
392
+ @terminate_on_shutdown = false if @terminate_on_shutdown == UNSET_VALUE
393
+
394
+ # default to nil
395
+ @ssh_host_attribute = nil if @ssh_host_attribute == UNSET_VALUE
396
+
397
+ # default false
398
+ @monitoring = false if @monitoring == UNSET_VALUE
399
+
400
+ # default false
401
+ @ebs_optimized = false if @ebs_optimized == UNSET_VALUE
402
+
403
+ # default to nil
404
+ @source_dest_check = nil if @source_dest_check == UNSET_VALUE
405
+
406
+ # default false
407
+ @associate_public_ip = false if @associate_public_ip == UNSET_VALUE
408
+
409
+ # default 'default'
410
+ @tenancy = "default" if @tenancy == UNSET_VALUE
411
+
412
+ # Don't attach instance to any ELB by default
413
+ @elb = nil if @elb == UNSET_VALUE
414
+
415
+ @unregister_elb_from_az = true if @unregister_elb_from_az == UNSET_VALUE
416
+
417
+ # default to nil
418
+ @kernel_id = nil if @kernel_id == UNSET_VALUE
419
+
420
+ # Compile our region specific configurations only within
421
+ # NON-REGION-SPECIFIC configurations.
422
+ if !@__region_specific
423
+ @__region_config.each do |region, blocks|
424
+ config = self.class.new(true).merge(self)
425
+
426
+ # Execute the configuration for each block
427
+ blocks.each { |b| b.call(config) }
428
+
429
+ # The region name of the configuration always equals the
430
+ # region config name:
431
+ config.region = region
432
+
433
+ # Finalize the configuration
434
+ config.finalize!
435
+
436
+ # Store it for retrieval
437
+ @__compiled_region_configs[region] = config
438
+ end
439
+ end
440
+
441
+ # Mark that we finalized
442
+ @__finalized = true
443
+ end
444
+
445
+ def validate(machine)
446
+ errors = _detected_errors
447
+
448
+ errors << I18n.t("vagrant_aws.config.aws_info_required",
449
+ :profile => @aws_profile, :location => @aws_dir) if \
450
+ @aws_profile and (@access_key_id.nil? or @secret_access_key.nil? or @region.nil?)
451
+
452
+ errors << I18n.t("vagrant_aws.config.region_required") if @region.nil?
453
+
454
+ if @region
455
+ # Get the configuration for the region we're using and validate only
456
+ # that region.
457
+ config = get_region_config(@region)
458
+
459
+ if !config.use_iam_profile
460
+ errors << I18n.t("vagrant_aws.config.access_key_id_required") if \
461
+ config.access_key_id.nil?
462
+ errors << I18n.t("vagrant_aws.config.secret_access_key_required") if \
463
+ config.secret_access_key.nil?
464
+ end
465
+
466
+ if config.associate_public_ip && !config.subnet_id
467
+ errors << I18n.t("vagrant_aws.config.subnet_id_required_with_public_ip")
468
+ end
469
+
470
+ errors << I18n.t("vagrant_aws.config.ami_required", :region => @region) if config.ami.nil?
471
+ end
472
+
473
+ { "AWS Provider" => errors }
474
+ end
475
+
476
+ # This gets the configuration for a specific region. It shouldn't
477
+ # be called by the general public and is only used internally.
478
+ def get_region_config(name)
479
+ if !@__finalized
480
+ raise "Configuration must be finalized before calling this method."
481
+ end
482
+
483
+ # Return the compiled region config
484
+ @__compiled_region_configs[name] || self
485
+ end
486
+ end
487
+
488
+
489
+ class Credentials < Vagrant.plugin("2", :config)
490
+ # This module reads AWS config and credentials.
491
+ # Behaviour aims to mimic what is described in AWS documentation:
492
+ # http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
493
+ # http://docs.aws.amazon.com/cli/latest/topic/config-vars.html
494
+ # Which is the following (stopping at the first successful case):
495
+ # 1) read config and credentials from environment variables
496
+ # 2) read config and credentials from files at location defined by environment variables
497
+ # 3) read config and credentials from files at default location
498
+ #
499
+ # The mandatory fields for a successful "get credentials" are the id and the secret keys.
500
+ # Region is not required since Config#finalize falls back to sensible defaults.
501
+ # The behaviour is all-or-nothing (ie: no mixing between vars and files).
502
+ #
503
+ # It also allows choosing a profile (by default it's [default]) and an "info"
504
+ # directory (by default $HOME/.aws), which can be specified in the Vagrantfile.
505
+ # Supported information: region, aws_access_key_id, aws_secret_access_key, and aws_session_token.
506
+
507
+ def get_aws_info(profile, location)
508
+ # read credentials from environment variables
509
+ aws_region, aws_id, aws_secret, aws_token = read_aws_environment()
510
+ # if nothing there, then read from files
511
+ # (the _if_ doesn't check aws_region since Config#finalize sets one by default)
512
+ if aws_id.to_s == '' or aws_secret.to_s == ''
513
+ # check if there are env variables for credential location, if so use then
514
+ aws_config = ENV['AWS_CONFIG_FILE'].to_s
515
+ aws_creds = ENV['AWS_SHARED_CREDENTIALS_FILE'].to_s
516
+ if aws_config == '' or aws_creds == ''
517
+ aws_config = location + 'config'
518
+ aws_creds = location + 'credentials'
519
+ end
520
+ if File.exist?(aws_config) and File.exist?(aws_creds)
521
+ aws_region, aws_id, aws_secret, aws_token = read_aws_files(profile, aws_config, aws_creds)
522
+ end
523
+ end
524
+ aws_region = nil if aws_region == ''
525
+ aws_id = nil if aws_id == ''
526
+ aws_secret = nil if aws_secret == ''
527
+ aws_token = nil if aws_token == ''
528
+
529
+ return aws_region, aws_id, aws_secret, aws_token
530
+ end
531
+
532
+
533
+ private
534
+
535
+ def read_aws_files(profile, aws_config, aws_creds)
536
+ # determine section in config ini file
537
+ if profile == 'default'
538
+ ini_profile = profile
539
+ else
540
+ ini_profile = 'profile ' + profile
541
+ end
542
+ # get info from config ini file for selected profile
543
+ data = File.read(aws_config)
544
+ doc_cfg = IniParse.parse(data)
545
+ aws_region = doc_cfg[ini_profile]['region']
546
+
547
+ # determine section in credentials ini file
548
+ ini_profile = profile
549
+ # get info from credentials ini file for selected profile
550
+ data = File.read(aws_creds)
551
+ doc_cfg = IniParse.parse(data)
552
+ aws_id = doc_cfg[ini_profile]['aws_access_key_id']
553
+ aws_secret = doc_cfg[ini_profile]['aws_secret_access_key']
554
+ aws_token = doc_cfg[ini_profile]['aws_session_token']
555
+
556
+ return aws_region, aws_id, aws_secret, aws_token
557
+ end
558
+
559
+ def read_aws_environment()
560
+ aws_region = ENV['AWS_DEFAULT_REGION']
561
+ aws_id = ENV['AWS_ACCESS_KEY_ID']
562
+ aws_secret = ENV['AWS_SECRET_ACCESS_KEY']
563
+ aws_token = ENV['AWS_SESSION_TOKEN']
564
+
565
+ return aws_region, aws_id, aws_secret, aws_token
566
+ end
567
+
568
+ end
569
+
570
+
571
+ end
572
+ end
@@ -0,0 +1,43 @@
1
+ require "vagrant"
2
+
3
+ module VagrantPlugins
4
+ module AWS
5
+ module Errors
6
+ class VagrantAWSError < Vagrant::Errors::VagrantError
7
+ error_namespace("vagrant_aws.errors")
8
+ end
9
+
10
+ class FogError < VagrantAWSError
11
+ error_key(:fog_error)
12
+ end
13
+
14
+ class InternalFogError < VagrantAWSError
15
+ error_key(:internal_fog_error)
16
+ end
17
+
18
+ class InstanceReadyTimeout < VagrantAWSError
19
+ error_key(:instance_ready_timeout)
20
+ end
21
+
22
+ class InstancePackageError < VagrantAWSError
23
+ error_key(:instance_package_error)
24
+ end
25
+
26
+ class InstancePackageTimeout < VagrantAWSError
27
+ error_key(:instance_package_timeout)
28
+ end
29
+
30
+ class RsyncError < VagrantAWSError
31
+ error_key(:rsync_error)
32
+ end
33
+
34
+ class MkdirError < VagrantAWSError
35
+ error_key(:mkdir_error)
36
+ end
37
+
38
+ class ElbDoesNotExistError < VagrantAWSError
39
+ error_key("elb_does_not_exist")
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,73 @@
1
+ begin
2
+ require "vagrant"
3
+ rescue LoadError
4
+ raise "The Vagrant AWS plugin must be run within Vagrant."
5
+ end
6
+
7
+ # This is a sanity check to make sure no one is attempting to install
8
+ # this into an early Vagrant version.
9
+ if Vagrant::VERSION < "1.2.0"
10
+ raise "The Vagrant AWS plugin is only compatible with Vagrant 1.2+"
11
+ end
12
+
13
+ module VagrantPlugins
14
+ module AWS
15
+ class Plugin < Vagrant.plugin("2")
16
+ name "AWS"
17
+ description <<-DESC
18
+ This plugin installs a provider that allows Vagrant to manage
19
+ machines in AWS (EC2/VPC).
20
+ DESC
21
+
22
+ config(:aws, :provider) do
23
+ require_relative "config"
24
+ Config
25
+ end
26
+
27
+ provider(:aws, parallel: true) do
28
+ # Setup logging and i18n
29
+ setup_logging
30
+ setup_i18n
31
+
32
+ # Return the provider
33
+ require_relative "provider"
34
+ Provider
35
+ end
36
+
37
+ # This initializes the internationalization strings.
38
+ def self.setup_i18n
39
+ I18n.load_path << File.expand_path("locales/en.yml", AWS.source_root)
40
+ I18n.reload!
41
+ end
42
+
43
+ # This sets up our log level to be whatever VAGRANT_LOG is.
44
+ def self.setup_logging
45
+ require "log4r"
46
+
47
+ level = nil
48
+ begin
49
+ level = Log4r.const_get(ENV["VAGRANT_LOG"].upcase)
50
+ rescue NameError
51
+ # This means that the logging constant wasn't found,
52
+ # which is fine. We just keep `level` as `nil`. But
53
+ # we tell the user.
54
+ level = nil
55
+ end
56
+
57
+ # Some constants, such as "true" resolve to booleans, so the
58
+ # above error checking doesn't catch it. This will check to make
59
+ # sure that the log level is an integer, as Log4r requires.
60
+ level = nil if !level.is_a?(Integer)
61
+
62
+ # Set the logging level on all "vagrant" namespaced
63
+ # logs as long as we have a valid level.
64
+ if level
65
+ logger = Log4r::Logger.new("vagrant_aws")
66
+ logger.outputters = Log4r::Outputter.stderr
67
+ logger.level = level
68
+ logger = nil
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end