cloud-maker 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/cloud-maker +7 -2
- data/lib/cloud-maker.rb +0 -3
- data/lib/cloud_maker/config.rb +16 -7
- data/lib/cloud_maker/ec2.rb +42 -1
- data/lib/cloud_maker/s3_archiver.rb +0 -3
- metadata +2 -2
data/bin/cloud-maker
CHANGED
@@ -96,6 +96,11 @@ class CloudMakerCLI < Thor
|
|
96
96
|
:type => :hash,
|
97
97
|
:default => {},
|
98
98
|
:desc => "Set tags for EC2, merges with and overrides the tag property in the CloudMaker config"
|
99
|
+
method_option :yes,
|
100
|
+
:alias => '-y',
|
101
|
+
:type => :boolean,
|
102
|
+
:default => false,
|
103
|
+
:desc => "Answer yes to any confirmation prompts automatically."
|
99
104
|
def launch(instance_config_yaml)
|
100
105
|
puts "--------------------------------------------------------------------------------".green
|
101
106
|
puts "Launching new EC2 instance"
|
@@ -105,7 +110,7 @@ class CloudMakerCLI < Thor
|
|
105
110
|
|
106
111
|
print_config_hash(config.to_hash)
|
107
112
|
|
108
|
-
if yes?("Launch a new EC2 instance with the options above? (y/n)")
|
113
|
+
if options.yes || yes?("Launch a new EC2 instance with the options above? (y/n)")
|
109
114
|
cloud_maker = CloudMaker::Ec2.new(
|
110
115
|
:aws_access_key_id => options.aws_access_key_id,
|
111
116
|
:aws_secret_access_key => options.aws_secret_access_key
|
@@ -162,7 +167,7 @@ class CloudMakerCLI < Thor
|
|
162
167
|
end
|
163
168
|
|
164
169
|
def build_config(instance_config_yaml, options)
|
165
|
-
config = CloudMaker::Config.from_yaml(instance_config_yaml)
|
170
|
+
config = CloudMaker::Config.from_yaml(instance_config_yaml, 'import_ec2' => true)
|
166
171
|
options.set.each_pair {|key, val| config[key] = val}
|
167
172
|
|
168
173
|
config['tags'] ||= {}
|
data/lib/cloud-maker.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
Bundler.require(ENV['CLOUDMAKER_ENV'].to_sym) if ENV['CLOUDMAKER_ENV']
|
2
|
-
|
3
1
|
require 'yaml'
|
4
2
|
require 'thor'
|
5
3
|
require 'colorize'
|
@@ -10,4 +8,3 @@ require 'cloud_maker/config'
|
|
10
8
|
require 'cloud_maker/ec2'
|
11
9
|
require 'cloud_maker/s3_archiver'
|
12
10
|
require 'cloud_maker/shell_executor'
|
13
|
-
|
data/lib/cloud_maker/config.rb
CHANGED
@@ -61,25 +61,29 @@ module CloudMaker
|
|
61
61
|
# be used. If the detailed version is used all properties
|
62
62
|
# are optional and DEFAULT_KEY_PROPERTIES will be used to
|
63
63
|
# fill in the blanks.
|
64
|
-
#
|
65
64
|
# 'include' - An array of URLs or a String containing 1 URL per line
|
66
65
|
# with optional # prefixed lines as comments.
|
67
66
|
# ... - All valid properties of a Cloud Init config
|
68
67
|
# are also valid here. See:
|
69
68
|
# https://help.ubuntu.com/community/CloudInit
|
70
|
-
#
|
71
|
-
#
|
72
|
-
#
|
69
|
+
#
|
70
|
+
# extra_options - Options that describe the config as opposed to being part
|
71
|
+
# of the config.
|
72
|
+
# 'config_path' - The path the config was loaded from. Used for archival purposes.
|
73
|
+
# 'import_ec2' - CloudMaker::Ec2 defines properties it relies on, if this value
|
74
|
+
# is true then we pull those property definitions in.
|
73
75
|
#
|
74
76
|
# Returns a CloudMaker object
|
75
|
-
def initialize(cloud_config, extra_options)
|
77
|
+
def initialize(cloud_config, extra_options={})
|
76
78
|
self.extra_options = extra_options
|
77
79
|
cloud_config = cloud_config.dup
|
80
|
+
|
78
81
|
self.options = extract_cloudmaker_config!(cloud_config)
|
79
82
|
self.includes = extract_includes!(cloud_config)
|
80
83
|
self.imports = extract_imports!(cloud_config)
|
81
84
|
self.cloud_config = cloud_config
|
82
85
|
|
86
|
+
self.import(self.class.new(Ec2::CLOUD_MAKER_CONFIG)) if (extra_options['import_ec2'])
|
83
87
|
self.imports.reverse.each do |import_path|
|
84
88
|
self.import(self.class.from_yaml(import_path))
|
85
89
|
end
|
@@ -201,11 +205,12 @@ module CloudMaker
|
|
201
205
|
# from it.
|
202
206
|
#
|
203
207
|
# instance_config_yaml - The path of the YAML file
|
208
|
+
# options - Any options to pass through as options to CloudMaker::Config::initialize
|
204
209
|
#
|
205
210
|
# Returns a new Config
|
206
211
|
# Raises: Exception if the file doesn't exist.
|
207
212
|
# Raises: SyntaxError if the YAML file is invalid.
|
208
|
-
def from_yaml(instance_config_yaml)
|
213
|
+
def from_yaml(instance_config_yaml, options={})
|
209
214
|
begin
|
210
215
|
full_path = File.expand_path(instance_config_yaml)
|
211
216
|
cloud_yaml = File.open(full_path, "r") #Right_AWS will base64 encode this for us
|
@@ -213,7 +218,11 @@ module CloudMaker
|
|
213
218
|
raise "ERROR: The path to the CloudMaker config is incorrect"
|
214
219
|
end
|
215
220
|
|
216
|
-
|
221
|
+
# loading a blank config file returns false, it's an odd degenerate case but handling
|
222
|
+
# it like this makes sanity checking other missing values easy.
|
223
|
+
config = YAML::load(cloud_yaml) || {}
|
224
|
+
|
225
|
+
CloudMaker::Config.new(config, options.merge('config_path' => full_path))
|
217
226
|
end
|
218
227
|
end
|
219
228
|
|
data/lib/cloud_maker/ec2.rb
CHANGED
@@ -9,6 +9,36 @@ module CloudMaker
|
|
9
9
|
# Internal: Gets/Sets the RightAws::Ec2 instance.
|
10
10
|
attr_accessor :ec2
|
11
11
|
|
12
|
+
# Public: A CloudMaker::Config hash that describes the config properties Ec2 relies on.
|
13
|
+
CLOUD_MAKER_CONFIG = {
|
14
|
+
'cloud-maker' => {
|
15
|
+
'ami' => {
|
16
|
+
'required' => true,
|
17
|
+
'description' => "The Amazon AMI ID for the instance."
|
18
|
+
},
|
19
|
+
'instance_type' => {
|
20
|
+
'required' => true,
|
21
|
+
'description' => "The Amazon instance type, eg. m1.small."
|
22
|
+
},
|
23
|
+
'availability_zone' => {
|
24
|
+
'required' => true,
|
25
|
+
'description' => "The Amazon availability zone, eg. us-east-1a"
|
26
|
+
},
|
27
|
+
'key_pair' => {
|
28
|
+
'default' => "",
|
29
|
+
'description' => "The name of an Amazon key pair, so you can actually login to the instance."
|
30
|
+
},
|
31
|
+
'elastic_ip' => {
|
32
|
+
'description' => "An elastic IP address you control that you would like to associate to the instance."
|
33
|
+
},
|
34
|
+
'security_group' => {
|
35
|
+
'default' => 'default',
|
36
|
+
'required' => true,
|
37
|
+
'description' => 'The Amazon EC2 security group to launch the instance with.'
|
38
|
+
}
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
12
42
|
# Public: The name of the tag that will be used to find the name of an s3 bucket for archiving/information retrieval
|
13
43
|
BUCKET_TAG = 's3_archive_bucket'
|
14
44
|
|
@@ -66,6 +96,7 @@ module CloudMaker
|
|
66
96
|
:group_names => cloud_maker_config['security_group'],
|
67
97
|
:instance_type => cloud_maker_config['instance_type'],
|
68
98
|
:key_name => cloud_maker_config['key_pair'],
|
99
|
+
:availability_zone => cloud_maker_config['availability_zone'],
|
69
100
|
:user_data => user_data
|
70
101
|
).first
|
71
102
|
|
@@ -81,8 +112,18 @@ module CloudMaker
|
|
81
112
|
end
|
82
113
|
|
83
114
|
ec2.associate_address(instance_id, :public_ip => cloud_maker_config["elastic_ip"])
|
115
|
+
end
|
84
116
|
|
85
|
-
|
117
|
+
begin
|
118
|
+
instance = ec2.describe_instances([instance_id]).first # So we get updated tag/ip info
|
119
|
+
rescue RightAws::AwsError => e
|
120
|
+
tries ||= 0
|
121
|
+
tries += 1
|
122
|
+
if tries <= 5
|
123
|
+
sleep 2**tries
|
124
|
+
else
|
125
|
+
raise e
|
126
|
+
end
|
86
127
|
end
|
87
128
|
|
88
129
|
archiver = S3Archiver.new(
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cloud-maker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-08-
|
13
|
+
date: 2012-08-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: colorize
|