ec2launcher 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 1.2.0
2
+
3
+ * Added support for terminating instances.
4
+
5
+ ## 1.1.3
6
+
7
+ * Fixed typo with error handling in BackoffRunner.
8
+ * Bumped required version of AWS SDK to support IAM Instance Profiles.
9
+ * Fixed typo with IAM instance profile attribute name.
10
+
1
11
  ## 1.1.2
2
12
 
3
13
  * Added support for specifying an IAM Instance Profile through the environment and/or application.
data/bin/ec2launcher CHANGED
@@ -5,7 +5,8 @@
5
5
  require 'erb'
6
6
 
7
7
  require 'ec2launcher'
8
- require "ec2launcher/init_options"
8
+ require 'ec2launcher/init_options'
9
+ require 'ec2launcher/terminator'
9
10
 
10
11
  opt_parser = EC2Launcher::InitOptions.new
11
12
  opt_parser.parse(ARGV)
@@ -25,9 +26,12 @@ if opt_parser.command == "init"
25
26
  File.open("config.rb", 'w') {|f| f.write(new_config_template.result)}
26
27
 
27
28
  puts "Successfully created #{opt_parser.location}"
29
+ elsif opt_parser.command =~ /^term/
30
+ terminator = EC2Launcher::Terminator.new
31
+ terminator.terminate(opt_parser.hostname, opt_parser.options)
28
32
  elsif opt_parser.command == "launch"
29
- launcher = EC2Launcher::Launcher.new
30
- launcher.launch(opt_parser.options)
33
+ launcher = EC2Launcher::Launcher.new
34
+ launcher.launch(opt_parser.options)
31
35
  else
32
36
  opt_parser.help
33
37
  exit 1
data/ec2launcher.gemspec CHANGED
@@ -14,6 +14,6 @@ Gem::Specification.new do |gem|
14
14
  gem.require_paths = ["lib"]
15
15
  gem.version = EC2Launcher::VERSION
16
16
 
17
- gem.add_runtime_dependency "aws-sdk", [">= 1.5.0"]
17
+ gem.add_runtime_dependency "aws-sdk", [">= 1.6.6"]
18
18
  gem.add_runtime_dependency "log4r"
19
19
  end
@@ -0,0 +1,28 @@
1
+ #
2
+ # Copyright (c) 2012 Sean Laurent
3
+ #
4
+ require 'rubygems'
5
+ require 'aws-sdk'
6
+
7
+ module EC2Launcher
8
+ module AWSInitializer
9
+ # Initializes connections to the AWS SDK
10
+ #
11
+ def initialize_aws(access_key = nil, secret_key = nil)
12
+ aws_access_key = access_key
13
+ aws_access_key ||= ENV['AWS_ACCESS_KEY']
14
+
15
+ aws_secret_access_key = secret_key
16
+ aws_secret_access_key ||= ENV['AWS_SECRET_ACCESS_KEY']
17
+
18
+ if aws_access_key.nil? || aws_secret_access_key.nil?
19
+ abort("You MUST either set the AWS_ACCESS_KEY and AWS_SECRET_ACCESS_KEY environment variables or use the command line options.")
20
+ end
21
+
22
+ AWS.config({
23
+ :access_key_id => aws_access_key,
24
+ :secret_access_key => aws_secret_access_key
25
+ })
26
+ end
27
+ end
28
+ end
@@ -28,7 +28,7 @@ module EC2Launcher
28
28
  rescue AWS::EC2::Errors::InstanceLimitExceeded
29
29
  puts "AWS::EC2::Errors::InstanceLimitExceeded ... aborting launch."
30
30
  return false
31
- rescue StdError => bang
31
+ rescue Exception => bang
32
32
  print "Error for #{message}: #{bang}"
33
33
  return false
34
34
  end
@@ -22,6 +22,8 @@ module EC2Launcher
22
22
  dsl_accessor :chef_validation_pem_url
23
23
  dsl_accessor :domain_name
24
24
  dsl_accessor :gem_path
25
+
26
+ # @since 1.1.2
25
27
  dsl_accessor :iam_profile
26
28
  dsl_accessor :inherit
27
29
  dsl_accessor :key_name
@@ -12,8 +12,9 @@ module EC2Launcher
12
12
  attr_reader :command
13
13
  attr_reader :options
14
14
  attr_reader :location
15
+ attr_reader :hostname
15
16
 
16
- SUB_COMMANDS = %w{init launch}
17
+ SUB_COMMANDS = %w{init launch terminate term}
17
18
 
18
19
  def initialize
19
20
  @opts = OptionParser.new do |opts|
@@ -21,8 +22,9 @@ module EC2Launcher
21
22
 
22
23
  where [COMMAND] is one of:
23
24
 
24
- init [LOCATION] Initialize a repository in the specified directory.
25
- launch [OPTIONS] Launch a new instance.
25
+ init [LOCATION] Initialize a repository in the specified directory.
26
+ launch [OPTIONS] Launch a new instance.
27
+ terminate [name] [OPTIONS] Terminates an instance.
26
28
 
27
29
  and [OPTIONS] include:
28
30
 
@@ -172,6 +174,14 @@ module EC2Launcher
172
174
  exit 1
173
175
  end
174
176
  @location = args[0]
177
+ elsif @command =~ /^term/
178
+ unless args.length >= 1
179
+ puts "Missing name of server!"
180
+ puts
181
+ help
182
+ exit 1
183
+ end
184
+ @hostname = args[0]
175
185
  else
176
186
  @opts.parse!(args)
177
187
 
@@ -0,0 +1,53 @@
1
+ #
2
+ # Copyright (c) 2012 Sean Laurent
3
+ #
4
+ require 'rubygems'
5
+ require 'aws-sdk'
6
+ require 'log4r'
7
+
8
+ require 'ec2launcher/aws_initializer'
9
+ require 'ec2launcher/backoff_runner'
10
+
11
+ module EC2Launcher
12
+ class Terminator
13
+ include AWSInitializer
14
+ include BackoffRunner
15
+
16
+ def initialize()
17
+ @log = Logger.new 'ec2launcher'
18
+ log_output = Outputter.stdout
19
+ log_output.formatter = PatternFormatter.new :pattern => "%m"
20
+ @log.outputters = log_output
21
+ end
22
+
23
+ def terminate(server_name, options)
24
+ ##############################
25
+ # Initialize AWS and create EC2 connection
26
+ ##############################
27
+ initialize_aws(options.access_key, options.secret)
28
+ @ec2 = AWS::EC2.new
29
+ instance = nil
30
+ AWS.memoize do
31
+ instances = @ec2.instances.filter("tag:Name", server_name)
32
+ instances.each do |i|
33
+ unless i.status == :shutting_down || i.status == :terminated
34
+ instance = i
35
+ break
36
+ end # unless status
37
+ end # instance loop
38
+ end # memoize
39
+
40
+ if instance
41
+ @log.info("Terminating instance: #{server_name} [#{instance.instance_id}]")
42
+ instance.terminate
43
+ @log.info("Deleting node/client from Chef: #{server_name}")
44
+ node_result = `echo "Y" |knife node delete #{server_name}`
45
+ client_result = `echo "Y" |knife client delete #{server_name}`
46
+ @log.debug("Deleted Chef node: #{result}")
47
+ @log.debug("Deleted Chef client: #{result}")
48
+ else
49
+ @log.error("Unable to find instance: #{server_name}")
50
+ end
51
+ end
52
+ end
53
+ end
@@ -2,5 +2,5 @@
2
2
  # Copyright (c) 2012 Sean Laurent
3
3
  #
4
4
  module EC2Launcher
5
- VERSION = "1.1.2"
5
+ VERSION = "1.2.0"
6
6
  end
data/lib/ec2launcher.rb CHANGED
@@ -14,6 +14,7 @@ require 'ec2launcher/dsl/config'
14
14
  require 'ec2launcher/dsl/application'
15
15
  require 'ec2launcher/dsl/environment'
16
16
 
17
+ require 'ec2launcher/aws_initializer'
17
18
  require 'ec2launcher/backoff_runner'
18
19
  require 'ec2launcher/instance_paths_config'
19
20
  require 'ec2launcher/block_device_builder'
@@ -35,6 +36,7 @@ module EC2Launcher
35
36
  end
36
37
 
37
38
  class Launcher
39
+ include AWSInitializer
38
40
  include BackoffRunner
39
41
 
40
42
  def initialize()
@@ -101,7 +103,7 @@ module EC2Launcher
101
103
  ##############################
102
104
  # Initialize AWS and create EC2 connection
103
105
  ##############################
104
- initialize_aws()
106
+ initialize_aws(@options.access_key, @options.secret)
105
107
  @ec2 = AWS::EC2.new
106
108
 
107
109
  ##############################
@@ -484,26 +486,6 @@ module EC2Launcher
484
486
  dns_name.nil? ? "n/a" : dns_name
485
487
  end
486
488
 
487
- # Initializes connections to the AWS SDK
488
- #
489
- def initialize_aws()
490
- aws_access_key = @options.access_key
491
- aws_access_key ||= ENV['AWS_ACCESS_KEY']
492
-
493
- aws_secret_access_key = @options.secret
494
- aws_secret_access_key ||= ENV['AWS_SECRET_ACCESS_KEY']
495
-
496
- if aws_access_key.nil? || aws_secret_access_key.nil?
497
- abort("You MUST either set the AWS_ACCESS_KEY and AWS_SECRET_ACCESS_KEY environment variables or use the command line options.")
498
- end
499
-
500
- @log.info "Initializing AWS connection..."
501
- AWS.config({
502
- :access_key_id => aws_access_key,
503
- :secret_access_key => aws_secret_access_key
504
- })
505
- end
506
-
507
489
  # Launches an EC2 instance.
508
490
  #
509
491
  # @param [String] FQDN for the new host.
@@ -535,7 +517,7 @@ module EC2Launcher
535
517
  launch_mapping[:block_device_mappings] = block_device_mappings
536
518
  end
537
519
 
538
- launch_mapping[:iam_profile] = iam_profile if iam_profile
520
+ launch_mapping[:iam_instance_profile] = iam_profile if iam_profile
539
521
  launch_mapping[:subnet] = vpc_subnet if vpc_subnet
540
522
 
541
523
  new_instance = @ec2.instances.create(launch_mapping)
@@ -367,12 +367,18 @@ end
367
367
  # Launch Chef
368
368
  def run_chef_client(chef_path)
369
369
  result = 0
370
+ last_line = nil
370
371
  Open3.popen3(chef_path) do |stdin, stdout, stderr, wait_thr|
371
372
  stdout.each do |line|
373
+ last_line = line
372
374
  puts line
373
375
  end
374
376
  result = wait_thr.value if wait_thr
375
377
  end
378
+ if last_line =~ /[ ]ERROR[:][ ]/
379
+ result = -1
380
+ end
381
+
376
382
  result
377
383
  end
378
384
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ec2launcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-19 00:00:00.000000000 Z
12
+ date: 2012-10-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: 1.5.0
21
+ version: 1.6.6
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
- version: 1.5.0
29
+ version: 1.6.6
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: log4r
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -61,6 +61,7 @@ files:
61
61
  - ec2launcher.gemspec
62
62
  - lib/ec2launcher.rb
63
63
  - lib/ec2launcher/application_processor.rb
64
+ - lib/ec2launcher/aws_initializer.rb
64
65
  - lib/ec2launcher/backoff_runner.rb
65
66
  - lib/ec2launcher/block_device_builder.rb
66
67
  - lib/ec2launcher/config_loader.rb
@@ -78,6 +79,7 @@ files:
78
79
  - lib/ec2launcher/init_options.rb
79
80
  - lib/ec2launcher/instance_paths_config.rb
80
81
  - lib/ec2launcher/security_group_handler.rb
82
+ - lib/ec2launcher/terminator.rb
81
83
  - lib/ec2launcher/version.rb
82
84
  - startup-scripts/runurl
83
85
  - startup-scripts/setup.rb
@@ -107,3 +109,4 @@ signing_key:
107
109
  specification_version: 3
108
110
  summary: Tool to launch EC2 instances.
109
111
  test_files: []
112
+ has_rdoc: