sproutr 0.2.2 → 0.2.3
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.
- data/lib/sproutr.rb +48 -6
- data/lib/sproutr/instance.rb +3 -2
- data/lib/sproutr/utilities.rb +3 -2
- metadata +90 -96
data/lib/sproutr.rb
CHANGED
@@ -37,7 +37,7 @@ class Sproutr < Thor
|
|
37
37
|
end
|
38
38
|
new_config = clone_ami_config(@ec2.call("DescribeInstances", "InstanceId" => ami_to_clone)["reservationSet"][0]["instancesSet"][0], ami_id)
|
39
39
|
until ami_done?(ami_id) do
|
40
|
-
say "Ami has not completed so this clone can not yet be started. Sleeping 30 seconds", :red
|
40
|
+
say "Ami creation has not completed so this clone can not yet be started. Sleeping 30 seconds", :red
|
41
41
|
sleep 30
|
42
42
|
end
|
43
43
|
new_instance = invoke_launch(new_config)
|
@@ -99,6 +99,18 @@ into a singluar raid array (Required): "
|
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
+
desc "grow", "Grow a machine's 'hardware' resources"
|
103
|
+
method_option :ami, :type => :array, :required => true
|
104
|
+
method_option :size, :type => :string, :required => true
|
105
|
+
|
106
|
+
def grow
|
107
|
+
options[:ami].each do |ami|
|
108
|
+
Instance::call_on(@ec2, "StopInstances", ami)
|
109
|
+
@ec2.call "ModifyInstanceAttribute", "InstanceId" => ami, "InstanceType" => options[:size]
|
110
|
+
Instance::call_on(@ec2, "StartInstances", ami)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
102
114
|
desc "launch", "launch an instance from the specified config directory"
|
103
115
|
method_option :config_file, :type => :string, :required => true
|
104
116
|
|
@@ -122,7 +134,12 @@ into a singluar raid array (Required): "
|
|
122
134
|
ami_table = table do |a|
|
123
135
|
a.headings = 'Name', 'AMI Id', 'Type', 'State', 'Size', 'Architecture', 'Public?', 'Description'
|
124
136
|
@ami_images.each do |ami|
|
125
|
-
|
137
|
+
begin
|
138
|
+
ami_size = ami.blockDeviceMapping.first["ebs"]["volumeSize"]
|
139
|
+
rescue
|
140
|
+
ami_size = "unknown"
|
141
|
+
end
|
142
|
+
a << [ami.name, ami.imageId, ami.rootDeviceType, ami.imageState, ami_size,
|
126
143
|
ami.architecture, ami.isPublic, ami.description]
|
127
144
|
end
|
128
145
|
end
|
@@ -136,6 +153,7 @@ into a singluar raid array (Required): "
|
|
136
153
|
instance_table = table do |i|
|
137
154
|
i.headings = 'Name', 'Instance Id', 'Status', 'ip Address', 'Instance Type', 'AMI Image', 'Availablity Zone', 'DNS Cname'
|
138
155
|
instances.each do |instance|
|
156
|
+
p instance.inspect
|
139
157
|
i << [((instance.tagSet.nil?) ? "Name Not Set" : instance.tagSet[0]["value"]),
|
140
158
|
instance.instanceId, instance.instanceState["name"], instance.ipAddress,
|
141
159
|
instance.instanceType, instance.imageId, instance.placement["availabilityZone"], instance.dnsName]
|
@@ -157,11 +175,31 @@ into a singluar raid array (Required): "
|
|
157
175
|
puts snapshots_table
|
158
176
|
end
|
159
177
|
|
178
|
+
desc "migrate", "Migrate from one Availability Zone to another, requires --ami= [multiple apis supported separated by space] and --target="
|
179
|
+
method_option :ami, :type => :array, :require => true
|
180
|
+
method_option :target, :type => :string, :require => true
|
181
|
+
|
182
|
+
def migrate
|
183
|
+
ami_id = @ec2.call("CreateImage", "InstanceId" => ami_to_clone, "Name" => "AMI-#{options["ami"]}-#{Time.now.to_i}",
|
184
|
+
"Description" => "AMI created from #{options["ami"]} at #{Time.now}", "NoReboot" => "true")["imageId"]
|
185
|
+
|
186
|
+
current_config = @ec2.call("DescribeInstances", "InstanceId" => options["ami"])["reservationSet"][0]["instancesSet"][0]
|
187
|
+
new_config = clone_ami_config(current_config, ami_id)
|
188
|
+
|
189
|
+
until ami_done?(ami_id) do
|
190
|
+
say "Ami creation has not completed so the new instance can not yet be started. Sleeping 30 seconds", :red
|
191
|
+
sleep 30
|
192
|
+
end
|
193
|
+
new_instance = invoke_launch(validate_launch_config(new_config, options[:target]))
|
194
|
+
say "Created and started #{new_instance}", :green
|
195
|
+
tag_instance(new_instance, options[:tags]) if options[:tags]
|
196
|
+
end
|
197
|
+
|
160
198
|
desc "restart", "Restart the specified instance(s), requires --ami="
|
161
199
|
method_option :ami, :type => :array, :required => true
|
162
200
|
|
163
201
|
def restart
|
164
|
-
options[:ami].each { |ami| Instance::call_on("RebootInstances", ami) }
|
202
|
+
options[:ami].each { |ami| Instance::call_on(@ec2, "RebootInstances", ami) }
|
165
203
|
end
|
166
204
|
|
167
205
|
desc "snapshot", "Create snapshot"
|
@@ -180,14 +218,14 @@ into a singluar raid array (Required): "
|
|
180
218
|
method_option :ami, :type => :array, :required => true
|
181
219
|
|
182
220
|
def start
|
183
|
-
options[:ami].each { |ami| Instance::call_on("StartInstances", ami) }
|
221
|
+
options[:ami].each { |ami| Instance::call_on(@ec2, "StartInstances", ami) }
|
184
222
|
end
|
185
223
|
|
186
224
|
desc "stop", "Stop the specified instance(s), requires --ami="
|
187
225
|
method_option :ami, :type => :array, :required => true
|
188
226
|
|
189
227
|
def stop
|
190
|
-
options[:ami].each { |ami| Instance::call_on("StopInstances", ami) if yes? "Do you really want to stop the #{
|
228
|
+
options[:ami].each { |ami| Instance::call_on(@ec2, "StopInstances", ami) if yes? "Do you really want to stop the #{ami} instance? ", :red }
|
191
229
|
end
|
192
230
|
|
193
231
|
|
@@ -197,7 +235,7 @@ into a singluar raid array (Required): "
|
|
197
235
|
def terminate
|
198
236
|
options[:ami].each do |ami|
|
199
237
|
verify = ask "Do you really want to terminate the #{ami} instance? ", :red
|
200
|
-
Instance::call_on("TerminateInstances", ami) if verify.downcase == "y" || verify.downcase == "yes"
|
238
|
+
Instance::call_on(@ec2, "TerminateInstances", ami) if verify.downcase == "y" || verify.downcase == "yes"
|
201
239
|
end
|
202
240
|
end
|
203
241
|
|
@@ -205,6 +243,10 @@ into a singluar raid array (Required): "
|
|
205
243
|
method_option :ami, :type => :array, :required => true
|
206
244
|
alias :destroy :terminate
|
207
245
|
|
246
|
+
desc "shrink", "Alias to grow"
|
247
|
+
method_option :ami, :type => :array, :required => true
|
248
|
+
method_option :size, :type => :string, :require => true
|
249
|
+
alias :shrink :terminate
|
208
250
|
|
209
251
|
desc "list_snapshots", "Alias to list_snapshots"
|
210
252
|
alias :list_snapshot :list_snapshots
|
data/lib/sproutr/instance.rb
CHANGED
data/lib/sproutr/utilities.rb
CHANGED
@@ -21,14 +21,15 @@ def invoke_launch(config)
|
|
21
21
|
response["instancesSet"].first["instanceId"]
|
22
22
|
end
|
23
23
|
|
24
|
-
def validate_launch_config(config)
|
24
|
+
def validate_launch_config(config, availability_zone = nil)
|
25
25
|
instance_options = {
|
26
26
|
"SecurityGroup.#" => config["groups"] || [],
|
27
27
|
"MinCount" => "1",
|
28
28
|
"MaxCount" => "1",
|
29
29
|
"KeyName" => config["key_name"] || "Production",
|
30
30
|
"InstanceType" => config["instance_type"] || "m1.small",
|
31
|
-
"ImageId" => config["ami"]
|
31
|
+
"ImageId" => config["ami"],
|
32
|
+
"AvailabilityZone" => availability_zone || config["placement"]["availabilityZone"]
|
32
33
|
}
|
33
34
|
|
34
35
|
if config["volumes"]
|
metadata
CHANGED
@@ -1,149 +1,146 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: sproutr
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.3
|
4
5
|
prerelease:
|
5
|
-
version: 0.2.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Kevin Poorman
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2011-04-24 00:00:00 -04:00
|
12
|
+
date: 2011-11-04 00:00:00.000000000 -04:00
|
14
13
|
default_executable:
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
17
16
|
name: swirl
|
18
|
-
|
19
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: &70273739915900 !ruby/object:Gem::Requirement
|
20
18
|
none: false
|
21
|
-
requirements:
|
19
|
+
requirements:
|
22
20
|
- - ~>
|
23
|
-
- !ruby/object:Gem::Version
|
21
|
+
- !ruby/object:Gem::Version
|
24
22
|
version: 1.7.5
|
25
23
|
type: :runtime
|
26
|
-
version_requirements: *id001
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: thor
|
29
24
|
prerelease: false
|
30
|
-
|
25
|
+
version_requirements: *70273739915900
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: thor
|
28
|
+
requirement: &70273739915440 !ruby/object:Gem::Requirement
|
31
29
|
none: false
|
32
|
-
requirements:
|
30
|
+
requirements:
|
33
31
|
- - ~>
|
34
|
-
- !ruby/object:Gem::Version
|
32
|
+
- !ruby/object:Gem::Version
|
35
33
|
version: 0.14.6
|
36
34
|
type: :runtime
|
37
|
-
version_requirements: *id002
|
38
|
-
- !ruby/object:Gem::Dependency
|
39
|
-
name: terminal-table
|
40
35
|
prerelease: false
|
41
|
-
|
36
|
+
version_requirements: *70273739915440
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: terminal-table
|
39
|
+
requirement: &70273739914960 !ruby/object:Gem::Requirement
|
42
40
|
none: false
|
43
|
-
requirements:
|
41
|
+
requirements:
|
44
42
|
- - ~>
|
45
|
-
- !ruby/object:Gem::Version
|
43
|
+
- !ruby/object:Gem::Version
|
46
44
|
version: 1.4.2
|
47
45
|
type: :runtime
|
48
|
-
version_requirements: *id003
|
49
|
-
- !ruby/object:Gem::Dependency
|
50
|
-
name: awesome_print
|
51
46
|
prerelease: false
|
52
|
-
|
47
|
+
version_requirements: *70273739914960
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: awesome_print
|
50
|
+
requirement: &70273739914460 !ruby/object:Gem::Requirement
|
53
51
|
none: false
|
54
|
-
requirements:
|
52
|
+
requirements:
|
55
53
|
- - ~>
|
56
|
-
- !ruby/object:Gem::Version
|
54
|
+
- !ruby/object:Gem::Version
|
57
55
|
version: 0.3.2
|
58
56
|
type: :runtime
|
59
|
-
version_requirements: *id004
|
60
|
-
- !ruby/object:Gem::Dependency
|
61
|
-
name: json
|
62
57
|
prerelease: false
|
63
|
-
|
58
|
+
version_requirements: *70273739914460
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: json
|
61
|
+
requirement: &70273739914060 !ruby/object:Gem::Requirement
|
64
62
|
none: false
|
65
|
-
requirements:
|
66
|
-
- -
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version:
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
69
67
|
type: :runtime
|
70
|
-
version_requirements: *id005
|
71
|
-
- !ruby/object:Gem::Dependency
|
72
|
-
name: rspec
|
73
68
|
prerelease: false
|
74
|
-
|
69
|
+
version_requirements: *70273739914060
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rspec
|
72
|
+
requirement: &70273739913500 !ruby/object:Gem::Requirement
|
75
73
|
none: false
|
76
|
-
requirements:
|
74
|
+
requirements:
|
77
75
|
- - ~>
|
78
|
-
- !ruby/object:Gem::Version
|
76
|
+
- !ruby/object:Gem::Version
|
79
77
|
version: 2.5.0
|
80
78
|
type: :development
|
81
|
-
version_requirements: *id006
|
82
|
-
- !ruby/object:Gem::Dependency
|
83
|
-
name: rspec-core
|
84
79
|
prerelease: false
|
85
|
-
|
80
|
+
version_requirements: *70273739913500
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: rspec-core
|
83
|
+
requirement: &70273739912940 !ruby/object:Gem::Requirement
|
86
84
|
none: false
|
87
|
-
requirements:
|
85
|
+
requirements:
|
88
86
|
- - ~>
|
89
|
-
- !ruby/object:Gem::Version
|
87
|
+
- !ruby/object:Gem::Version
|
90
88
|
version: 2.5.0
|
91
89
|
type: :development
|
92
|
-
version_requirements: *id007
|
93
|
-
- !ruby/object:Gem::Dependency
|
94
|
-
name: rspec-expectations
|
95
90
|
prerelease: false
|
96
|
-
|
91
|
+
version_requirements: *70273739912940
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
name: rspec-expectations
|
94
|
+
requirement: &70273739912440 !ruby/object:Gem::Requirement
|
97
95
|
none: false
|
98
|
-
requirements:
|
96
|
+
requirements:
|
99
97
|
- - ~>
|
100
|
-
- !ruby/object:Gem::Version
|
98
|
+
- !ruby/object:Gem::Version
|
101
99
|
version: 2.5.0
|
102
100
|
type: :development
|
103
|
-
version_requirements: *id008
|
104
|
-
- !ruby/object:Gem::Dependency
|
105
|
-
name: rspec-mocks
|
106
101
|
prerelease: false
|
107
|
-
|
102
|
+
version_requirements: *70273739912440
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: rspec-mocks
|
105
|
+
requirement: &70273739911900 !ruby/object:Gem::Requirement
|
108
106
|
none: false
|
109
|
-
requirements:
|
107
|
+
requirements:
|
110
108
|
- - ~>
|
111
|
-
- !ruby/object:Gem::Version
|
109
|
+
- !ruby/object:Gem::Version
|
112
110
|
version: 2.5.0
|
113
111
|
type: :development
|
114
|
-
version_requirements: *id009
|
115
|
-
- !ruby/object:Gem::Dependency
|
116
|
-
name: vcr
|
117
112
|
prerelease: false
|
118
|
-
|
113
|
+
version_requirements: *70273739911900
|
114
|
+
- !ruby/object:Gem::Dependency
|
115
|
+
name: vcr
|
116
|
+
requirement: &70273739911360 !ruby/object:Gem::Requirement
|
119
117
|
none: false
|
120
|
-
requirements:
|
118
|
+
requirements:
|
121
119
|
- - ~>
|
122
|
-
- !ruby/object:Gem::Version
|
120
|
+
- !ruby/object:Gem::Version
|
123
121
|
version: 1.6.0
|
124
122
|
type: :development
|
125
|
-
version_requirements: *id010
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: webmock
|
128
123
|
prerelease: false
|
129
|
-
|
124
|
+
version_requirements: *70273739911360
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: webmock
|
127
|
+
requirement: &70273739910780 !ruby/object:Gem::Requirement
|
130
128
|
none: false
|
131
|
-
requirements:
|
129
|
+
requirements:
|
132
130
|
- - ~>
|
133
|
-
- !ruby/object:Gem::Version
|
131
|
+
- !ruby/object:Gem::Version
|
134
132
|
version: 1.6.2
|
135
133
|
type: :development
|
136
|
-
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: *70273739910780
|
137
136
|
description: Elegant, interactive EC2 Management
|
138
|
-
email:
|
137
|
+
email:
|
139
138
|
- kjp@brightleafsoftware.com
|
140
|
-
executables:
|
139
|
+
executables:
|
141
140
|
- sproutr
|
142
141
|
extensions: []
|
143
|
-
|
144
142
|
extra_rdoc_files: []
|
145
|
-
|
146
|
-
files:
|
143
|
+
files:
|
147
144
|
- LICENSE
|
148
145
|
- README.md
|
149
146
|
- lib/sproutr/ami.rb
|
@@ -156,30 +153,27 @@ files:
|
|
156
153
|
has_rdoc: true
|
157
154
|
homepage: https://github.com/noeticpenguin/sproutr
|
158
155
|
licenses: []
|
159
|
-
|
160
156
|
post_install_message:
|
161
157
|
rdoc_options: []
|
162
|
-
|
163
|
-
require_paths:
|
158
|
+
require_paths:
|
164
159
|
- lib
|
165
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
160
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
166
161
|
none: false
|
167
|
-
requirements:
|
168
|
-
- -
|
169
|
-
- !ruby/object:Gem::Version
|
170
|
-
version:
|
171
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
167
|
none: false
|
173
|
-
requirements:
|
174
|
-
- -
|
175
|
-
- !ruby/object:Gem::Version
|
176
|
-
version:
|
168
|
+
requirements:
|
169
|
+
- - ! '>='
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: '0'
|
177
172
|
requirements: []
|
178
|
-
|
179
173
|
rubyforge_project:
|
180
174
|
rubygems_version: 1.6.2
|
181
175
|
signing_key:
|
182
176
|
specification_version: 2
|
183
|
-
summary: An Ec2 management system designed to help you quickly define a new instance,
|
177
|
+
summary: An Ec2 management system designed to help you quickly define a new instance,
|
178
|
+
create N clones of said instance and start/stop them
|
184
179
|
test_files: []
|
185
|
-
|