cardmagic-sumo 0.3.1 → 0.3.4

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 (4) hide show
  1. data/VERSION +1 -1
  2. data/bin/sumo +2 -2
  3. data/lib/sumo.rb +66 -19
  4. metadata +4 -4
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.1
1
+ 0.3.4
data/bin/sumo CHANGED
@@ -15,7 +15,7 @@ class CLI < Thor
15
15
  if role
16
16
  task("Bootstrap chef") { sumo.bootstrap_chef(host) }
17
17
  role.split(',').each do |role|
18
- task("Setup #{role}") { sumo.setup_role(host, role) }
18
+ task("Setup #{role}") { sumo.setup_role(id, role) }
19
19
  end
20
20
 
21
21
  resources = sumo.resources(host)
@@ -62,7 +62,7 @@ class CLI < Thor
62
62
  def role(role, id=nil)
63
63
  inst = sumo.find(id) || sumo.running.first || abort("No running instances")
64
64
  task "Setup #{role}" do
65
- sumo.setup_role(inst[:hostname], role)
65
+ sumo.setup_role(inst[:hostname], inst[:instance_id], role)
66
66
  end
67
67
  end
68
68
 
@@ -15,7 +15,7 @@ class Sumo
15
15
 
16
16
  result = ec2.run_instances(
17
17
  :image_id => ami,
18
- :instance_type => config['instance_size'] || 'm1.small',
18
+ :instance_type => config['instance_size'],
19
19
  :key_name => 'sumo',
20
20
  :security_group => [ 'sumo' ],
21
21
  :availability_zone => config['availability_zone']
@@ -75,6 +75,14 @@ class Sumo
75
75
  )
76
76
  result["volumeId"]
77
77
  end
78
+
79
+ def format_volume(volume, instance, device, mountpoint)
80
+ commands = [
81
+ "if [ ! -d #{mountpoint} ]; then sudo mkdir #{mountpoint}; fi",
82
+ "if [ -b /dev/#{device}1 ]; then sudo mount /dev/#{device}1 #{mountpoint}; else echo ',,L' | sudo sfdisk /dev/#{device} && sudo mkfs.xfs /dev/#{device}1 && sudo mount /dev/#{device}1 #{mountpoint}; fi"
83
+ ]
84
+ ssh(instance, commands)
85
+ end
78
86
 
79
87
  def destroy_volume(volume)
80
88
  ec2.delete_volume(:volume_id => volume)
@@ -91,7 +99,9 @@ class Sumo
91
99
  instances << {
92
100
  :instance_id => item.instanceId,
93
101
  :status => item.instanceState.name,
94
- :hostname => item.dnsName
102
+ :hostname => item.dnsName,
103
+ :local_dns => item.privateDnsName,
104
+ :private_ip => item.privateIpAddress
95
105
  }
96
106
  end
97
107
  end
@@ -147,13 +157,30 @@ class Sumo
147
157
  end
148
158
  end
149
159
 
160
+ def wait_for_private_ip(instance_id)
161
+ raise ArgumentError unless instance_id and instance_id.match(/^i-/)
162
+ loop do
163
+ if inst = instance_info(instance_id)
164
+ if private_ip = inst[:private_ip]
165
+ return private_ip
166
+ end
167
+ end
168
+ sleep 1
169
+ end
170
+ end
171
+
150
172
  def wait_for_ssh(hostname)
151
173
  raise ArgumentError unless hostname
152
174
  loop do
153
175
  begin
154
176
  Timeout::timeout(4) do
155
177
  TCPSocket.new(hostname, 22)
156
- return
178
+ IO.popen("ssh -i #{keypair_file} #{config['user']}@#{hostname} > #{config['logfile'] || "~/.sumo/ssh.log"} 2>&1", "w") do |pipe|
179
+ pipe.puts "ls"
180
+ end
181
+ if $?.success?
182
+ return
183
+ end
157
184
  end
158
185
  rescue SocketError, Timeout::Error, Errno::ECONNREFUSED, Errno::EHOSTUNREACH
159
186
  end
@@ -162,36 +189,51 @@ class Sumo
162
189
 
163
190
  def bootstrap_chef(hostname)
164
191
  commands = [
165
- 'apt-get update',
166
- 'apt-get autoremove -y',
167
- 'apt-get install -y ruby ruby-dev rubygems git-core',
168
- 'gem sources -a http://gems.opscode.com',
169
- 'gem install chef ohai --no-rdoc --no-ri',
170
- config['cookbooks_url'] ? "git clone #{config['cookbooks_url']} chef-cookbooks" : "echo done",
192
+ 'sudo apt-get update',
193
+ 'sudo apt-get autoremove -y',
194
+ 'if [ ! -f /usr/lib/ruby/1.8/net/https.rb ]; then sudo apt-get install -y xfsprogs xfsdump xfslibs-dev ruby ruby-dev rubygems libopenssl-ruby1.8 git-core; fi',
195
+ 'if [ ! -d /etc/chef ]; then sudo mkdir /etc/chef; fi',
196
+ 'if [ ! -d /var/lib/gems/1.8/gems/chef-* ]; then sudo gem install chef ohai --no-rdoc --no-ri; fi',
197
+ config['cookbooks_url'] ? "if [ -d chef-cookbooks ]; then cd chef-cookbooks; git pull; else git clone #{config['cookbooks_url']} chef-cookbooks; fi" : "echo done"
171
198
  ]
172
199
  ssh(hostname, commands)
173
- if config['cookbooks_dir']
200
+ if !config['cookbooks_url'] && config['cookbooks_dir']
174
201
  scp(hostname, config['cookbooks_dir'], "chef-cookbooks")
175
202
  end
203
+ if config['chef-validation']
204
+ scp(hostname, config['chef-validation'], "validation.pem")
205
+ ssh(hostname, ["sudo mv validation.pem /etc/chef/"])
206
+ end
176
207
  end
177
208
 
178
- def setup_role(hostname, role)
209
+ def setup_role(hostname, instance_id, role)
179
210
  commands = [
180
- "cd chef-cookbooks",
181
- "/var/lib/gems/1.8/bin/chef-solo -c config.json -j dna/#{role}.json"
211
+ "if [ ! -f /etc/chef/client.pem ]; then cd chef-cookbooks",
212
+ "sudo /var/lib/gems/1.8/bin/chef-solo -c config/solo.rb -j roles/bootstrap.json -r http://s3.amazonaws.com/chef-solo/bootstrap-latest.tar.gz",
213
+ "if [ -f config/client.rb ]; then sudo cp config/client.rb /etc/chef/client.rb; fi",
214
+ "sudo /var/lib/gems/1.8/bin/chef-client",
215
+ "sudo rm /etc/chef/validation.pem; fi"
182
216
  ]
183
217
  ssh(hostname, commands)
218
+ `knife node run_list add #{instance_id} "role[#{role}]"`
219
+ ssh(hostname, ["sudo /var/lib/gems/1.8/bin/chef-client"])
184
220
  end
185
221
 
186
222
  def ssh(hostname, cmds)
187
223
  unless IO.read(File.expand_path("~/.ssh/known_hosts")).include?(hostname)
188
224
  `ssh-keyscan -t rsa #{hostname} >> $HOME/.ssh/known_hosts`
225
+ if config['deploy_key']
226
+ scp(hostname, config['deploy_key'], ".ssh/id_rsa")
227
+ end
228
+ if config['known_hosts']
229
+ scp(hostname, config['known_hosts'], ".ssh/known_hosts")
230
+ end
189
231
  end
190
- IO.popen("ssh -i #{keypair_file} #{config['user']}@#{hostname} > ~/.sumo/ssh.log 2>&1", "w") do |pipe|
232
+ IO.popen("ssh -i #{keypair_file} #{config['user']}@#{hostname} > #{config['logfile'] || "~/.sumo/ssh.log"} 2>&1", "w") do |pipe|
191
233
  pipe.puts cmds.join(' && ')
192
234
  end
193
235
  unless $?.success?
194
- abort "failed\nCheck ~/.sumo/ssh.log for the output"
236
+ abort "failed\nCheck #{config['logfile'] || "~/.sumo/ssh.log"} for the output"
195
237
  end
196
238
  end
197
239
 
@@ -242,7 +284,7 @@ class Sumo
242
284
  end
243
285
 
244
286
  def fetch_resources(hostname)
245
- cmd = "ssh -i #{keypair_file} #{config['user']}@#{hostname} 'cat /root/resources' 2>&1"
287
+ cmd = "ssh -i #{keypair_file} #{config['user']}@#{hostname} 'sudo cat /root/resources' 2>&1"
246
288
  out = IO.popen(cmd, 'r') { |pipe| pipe.read }
247
289
  abort "failed to read resources, output:\n#{out}" unless $?.success?
248
290
  parse_resources(out, hostname)
@@ -266,11 +308,16 @@ class Sumo
266
308
  @config ||= default_config.merge read_config
267
309
  end
268
310
 
311
+ def set(key, value)
312
+ config[key] = value
313
+ end
314
+
269
315
  def default_config
270
316
  {
271
- 'user' => 'root',
272
- 'ami' => 'ami-ed46a784',
273
- 'availability_zone' => 'us-east-1b'
317
+ 'user' => 'ubuntu',
318
+ 'ami' => 'ami-1234de7b', # Ubuntu 10.04 LTS (Lucid Lynx)
319
+ 'availability_zone' => 'us-east-1d',
320
+ 'instance_size' => 't1.micro'
274
321
  }
275
322
  end
276
323
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cardmagic-sumo
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 1
10
- version: 0.3.1
9
+ - 4
10
+ version: 0.3.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Adam Wiggins
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-06-15 00:00:00 -07:00
18
+ date: 2010-06-24 00:00:00 -07:00
19
19
  default_executable: sumo
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency