cloud-maker 0.2.0.pre2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/cloud-maker CHANGED
@@ -4,6 +4,8 @@ require 'cloud-maker'
4
4
  class CloudMakerCLI < Thor
5
5
  include Thor::Actions
6
6
 
7
+ map "--version" => :version, "-v" => :version
8
+
7
9
  desc "user_data [INSTANCE_CONFIG_YAML]", "Generate the Cloud Init user data for an instance described by INSTANCE_CONFIG_YAML"
8
10
  method_option :set,
9
11
  :alias => '-s',
@@ -21,9 +23,35 @@ class CloudMakerCLI < Thor
21
23
  puts config.to_user_data
22
24
  end
23
25
 
26
+ desc "version", "Report the current version of CloudMaker"
27
+ def version
28
+ say "cloud-maker #{Gem::Specification.find_by_name('cloud-maker').version.version}"
29
+ end
30
+
24
31
  desc "terminate [AWS_INSTANCE_ID]", "Terminate the specified AWS instance"
32
+ method_option :aws_access_key_id,
33
+ :desc => "Your AWS access key id",
34
+ :default => ENV['AWS_ACCESS_KEY_ID'],
35
+ :required => true
36
+ method_option :aws_secret_access_key,
37
+ :desc => "Your AWS secret access key",
38
+ :default => ENV['AWS_SECRET_ACCESS_KEY'],
39
+ :required => true
25
40
  def terminate(aws_instance_id)
26
- say "Not implemented.".red
41
+ info(aws_instance_id)
42
+
43
+ puts
44
+
45
+ if yes?("Are you sure you wish to terminate this instance?".red + " (y/n)")
46
+ cloud_maker = CloudMaker::Ec2.new(
47
+ :aws_access_key_id => options.aws_access_key_id,
48
+ :aws_secret_access_key => options.aws_secret_access_key
49
+ )
50
+ cloud_maker.terminate(aws_instance_id)
51
+ say "The instance was terminated."
52
+ else
53
+ say "Termination aborted."
54
+ end
27
55
  end
28
56
 
29
57
  desc "info [AWS_INSTANCE_ID]", "Display config info about the specified AWS instance"
@@ -96,10 +124,18 @@ class CloudMakerCLI < Thor
96
124
  private
97
125
  def print_colored_hash(hash, color=:cyan)
98
126
  print_table hash.map {|key, val|
99
- [key.to_s.dup.send(color), val.to_s]
127
+ [key.to_s.dup.send(color), colorize_inspection_string(val.to_s)]
100
128
  }
101
129
  end
102
130
 
131
+ def colorize_inspection_string(string)
132
+ string = string.dup
133
+ string.gsub!(/([\{\}\[\]])/, '\1'.magenta)
134
+ string.gsub!(/([\,])/, '\1'.yellow)
135
+ string.gsub!(/([\:\"\']?[0-9a-zA-Z_]*[\"\']?)=>/, '\1'.cyan + '=>')
136
+ string
137
+ end
138
+
103
139
  def print_config_hash(hash)
104
140
  puts
105
141
  say "CloudInit configuration:".green
@@ -107,14 +143,13 @@ class CloudMakerCLI < Thor
107
143
  puts
108
144
 
109
145
  if (!hash['include'].empty?)
110
- puts
111
146
  say 'Include URLs:'.green
112
147
  hash['include'].each do |url|
113
148
  puts url
114
149
  end
150
+ puts
115
151
  end
116
152
 
117
- puts
118
153
  say "CloudMaker configuration:".green
119
154
  print_colored_hash hash['cloud-maker']
120
155
  puts
@@ -133,7 +168,7 @@ class CloudMakerCLI < Thor
133
168
  config['tags'] ||= {}
134
169
  config['tags'].merge!(options.tags)
135
170
 
136
- if !config.valid?
171
+ if !config.missing_values.empty?
137
172
  say "Before an instance can be launched we need a few more values to be specified.".yellow
138
173
  say "Currently missing: #{config.missing_values.map{|key| key.cyan}.join(', ')}"
139
174
  puts
@@ -146,7 +181,16 @@ class CloudMakerCLI < Thor
146
181
  if (config.options[key]["description"])
147
182
  say config.options[key]["description"]
148
183
  end
149
- config[key] = ask "Please choose a value for #{key.cyan}: "
184
+
185
+ if config.options[key]["default"]
186
+ config[key] = ask "Please choose a value for #{key.cyan} [#{config.options[key]["default"]}]:"
187
+ else
188
+ config[key] = ask "Please choose a value for #{key.cyan}:"
189
+ end
190
+
191
+ if (config[key].empty? && config.options[key]["default"])
192
+ config[key] = config.options[key]["default"]
193
+ end
150
194
  end
151
195
  end
152
196
 
data/lib/cloud-maker.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  Bundler.require(ENV['CLOUDMAKER_ENV'].to_sym) if ENV['CLOUDMAKER_ENV']
2
2
 
3
+ require 'yaml'
3
4
  require 'thor'
4
5
  require 'colorize'
5
6
  require 'deep_merge'
@@ -40,7 +40,9 @@ module CloudMaker
40
40
  DEFAULT_KEY_PROPERTIES = {
41
41
  "environment" => true,
42
42
  "required" => false,
43
- "value" => nil
43
+ "value" => nil,
44
+ "default" => nil,
45
+ "description" => nil
44
46
  }
45
47
 
46
48
  # Public: Initializes a new CloudMaker object.
@@ -96,7 +98,7 @@ module CloudMaker
96
98
  #
97
99
  # Returns an Array of required keys that are missing values.
98
100
  def missing_values
99
- self.options.select {|key, option| option["required"] && option["value"].nil?}.map(&:first).map(&:dup)
101
+ self.options.select {|key, option| (option["required"] || option["default"]) && option["value"].nil?}.map(&:first).map(&:dup)
100
102
  end
101
103
 
102
104
  # Returns a Hash of all of the CloudMaker specific properties in the configuration.
@@ -32,9 +32,11 @@ module CloudMaker
32
32
  self.aws_secret_access_key = options[:aws_secret_access_key]
33
33
 
34
34
  self.ec2 = RightAws::Ec2.new(self.aws_access_key_id, self.aws_secret_access_key)
35
-
36
35
  end
37
36
 
37
+ # Public: Fetch archived information about an instance
38
+ #
39
+ # Returns a hash of information about the instance as it was launched
38
40
  def info(instance_id)
39
41
  bucket = self.ec2.describe_tags(:filters => {'resource-id' => instance_id, 'key' => BUCKET_TAG}).first[:value]
40
42
  archiver = S3Archiver.new(
@@ -46,6 +48,13 @@ module CloudMaker
46
48
  archiver.load_archive
47
49
  end
48
50
 
51
+ # Public: Terminates the specified EC2 instance.
52
+ #
53
+ # Returns a RightAws supplied Hash describing the terminated instance.
54
+ def terminate(instance_id)
55
+ self.ec2.terminate_instances([instance_id])
56
+ end
57
+
49
58
  # Public: Launches a new EC2 instance, associates any specified elastic IPS
50
59
  # with it, adds any specified tags, and archives the launch details to S3.
51
60
  #
@@ -1,3 +1,4 @@
1
+ require 'pry'
1
2
  require 'right_aws'
2
3
 
3
4
  module CloudMaker
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloud-maker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0.pre2
5
- prerelease: 6
4
+ version: 0.2.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Nathan Baxter
@@ -93,7 +93,7 @@ dependencies:
93
93
  - !ruby/object:Gem::Version
94
94
  version: '0'
95
95
  description:
96
- email: nathan.baxter@airbnb.cloud-maker
96
+ email: nathan.baxter@airbnb.com
97
97
  executables:
98
98
  - cloud-maker
99
99
  extensions: []
@@ -120,9 +120,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
120
120
  required_rubygems_version: !ruby/object:Gem::Requirement
121
121
  none: false
122
122
  requirements:
123
- - - ! '>'
123
+ - - ! '>='
124
124
  - !ruby/object:Gem::Version
125
- version: 1.3.1
125
+ version: '0'
126
126
  requirements: []
127
127
  rubyforge_project:
128
128
  rubygems_version: 1.8.24