rubber 1.6.3 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,8 @@
1
+ 1.6.3
2
+ -----
3
+
4
+ Much better way to get an instance's internal IP. <dcf97a3> [Kevin Menard]
5
+
1
6
  1.6.2
2
7
  -----
3
8
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.6.3
1
+ 1.7.0
@@ -44,6 +44,7 @@ module Rubber
44
44
  instance[:state] = item.instanceState.name
45
45
  instance[:zone] = item.placement.availabilityZone
46
46
  instance[:platform] = item.platform || 'linux'
47
+ instance[:root_device_type] = item.rootDeviceType
47
48
  instances << instance
48
49
  end
49
50
  end if response.reservationSet
@@ -55,6 +56,19 @@ module Rubber
55
56
  response = @ec2.terminate_instances(:instance_id => instance_id)
56
57
  end
57
58
 
59
+ def reboot_instance(instance_id)
60
+ response = @ec2.reboot_instances(:instance_id => instance_id)
61
+ end
62
+
63
+ def stop_instance(instance_id)
64
+ # Don't force the stop process. I.e., allow the instance to flush its file system operations.
65
+ response = @ec2.stop_instances(:instance_id => instance_id, :force => false)
66
+ end
67
+
68
+ def start_instance(instance_id)
69
+ response = @ec2.start_instances(:instance_id => instance_id)
70
+ end
71
+
58
72
  def describe_availability_zones
59
73
  zones = []
60
74
  response = @ec2.describe_availability_zones()
@@ -259,6 +273,7 @@ module Rubber
259
273
  image = {}
260
274
  image[:id] = item.imageId
261
275
  image[:location] = item.imageLocation
276
+ image[:root_device_type] = item.rootDeviceType
262
277
  images << image
263
278
  end if response.imagesSet
264
279
  return images
@@ -80,7 +80,7 @@ module Rubber
80
80
  attr_accessor :roles, :zone
81
81
  attr_accessor :external_host, :external_ip
82
82
  attr_accessor :internal_host, :internal_ip
83
- attr_accessor :static_ip, :volumes, :partitions
83
+ attr_accessor :static_ip, :volumes, :partitions, :root_device_type
84
84
  attr_accessor :spot_instance_request_id
85
85
  attr_accessor :platform
86
86
 
@@ -20,8 +20,10 @@ namespace :rubber do
20
20
  required_task :describe_bundles do
21
21
  images = cloud.describe_images()
22
22
  images.each do |image|
23
+ logger.info "======================"
23
24
  logger.info "ID: #{image[:id]}"
24
25
  logger.info "Location: #{image[:location]}"
26
+ logger.info "Root device type: #{image[:root_device_type]}"
25
27
  end
26
28
  end
27
29
 
@@ -42,7 +42,7 @@ namespace :rubber do
42
42
  Refresh the host data for a EC2 instance with the given ALIAS.
43
43
  This is useful to run when rubber:create fails after instance creation
44
44
  DESC
45
- task :refresh do
45
+ required_task :refresh do
46
46
  instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
47
47
  ENV.delete('ROLES') # so we don't get an error if people leave ROLES in env from :create CLI
48
48
  refresh_instance(instance_alias)
@@ -51,7 +51,7 @@ namespace :rubber do
51
51
  desc <<-DESC
52
52
  Destroy the EC2 instance for the given ALIAS
53
53
  DESC
54
- task :destroy do
54
+ required_task :destroy do
55
55
  instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
56
56
  ENV.delete('ROLES') # so we don't get an error if people leave ROLES in env from :create CLI
57
57
  destroy_instance(instance_alias)
@@ -60,12 +60,39 @@ namespace :rubber do
60
60
  desc <<-DESC
61
61
  Destroy ALL the EC2 instances for the current env
62
62
  DESC
63
- task :destroy_all do
63
+ required_task :destroy_all do
64
64
  rubber_instances.each do |ic|
65
65
  destroy_instance(ic.name)
66
66
  end
67
67
  end
68
68
 
69
+ desc <<-DESC
70
+ Reboot the EC2 instance for the give ALIAS
71
+ DESC
72
+ required_task :reboot do
73
+ instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
74
+ ENV.delete('ROLES') # so we don't get an error if people leave ROLES in env from :create CLI
75
+ reboot_instance(instance_alias)
76
+ end
77
+
78
+ desc <<-DESC
79
+ Stop the EC2 instance for the give ALIAS
80
+ DESC
81
+ required_task :stop do
82
+ instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
83
+ ENV.delete('ROLES') # so we don't get an error if people leave ROLES in env from :create CLI
84
+ stop_instance(instance_alias)
85
+ end
86
+
87
+ desc <<-DESC
88
+ Start the EC2 instance for the give ALIAS
89
+ DESC
90
+ required_task :start do
91
+ instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
92
+ ENV.delete('ROLES') # so we don't get an error if people leave ROLES in env from :create CLI
93
+ start_instance(instance_alias)
94
+ end
95
+
69
96
  desc <<-DESC
70
97
  Adds the given ROLES to the instance named ALIAS
71
98
  DESC
@@ -218,7 +245,6 @@ namespace :rubber do
218
245
  sleep 2
219
246
 
220
247
  break if refresh_instance(instance_alias)
221
-
222
248
  end
223
249
  end
224
250
 
@@ -242,6 +268,7 @@ namespace :rubber do
242
268
  instance_item.internal_ip = instance[:internal_ip]
243
269
  instance_item.zone = instance[:zone]
244
270
  instance_item.platform = instance[:platform]
271
+ instance_item.root_device_type = instance[:root_device_type]
245
272
  rubber_instances.save()
246
273
 
247
274
  unless instance_item.windows?
@@ -323,6 +350,65 @@ namespace :rubber do
323
350
  cleanup_known_hosts(instance_item) unless env.disable_known_hosts_cleanup
324
351
  end
325
352
 
353
+ # Reboots the given ec2 instance
354
+ def reboot_instance(instance_alias)
355
+ instance_item = rubber_instances[instance_alias]
356
+ fatal "Instance does not exist: #{instance_alias}" if ! instance_item
357
+
358
+ env = rubber_cfg.environment.bind(instance_item.role_names, instance_item.name)
359
+
360
+ value = Capistrano::CLI.ui.ask("About to REBOOT #{instance_alias} (#{instance_item.instance_id}) in mode #{RUBBER_ENV}. Are you SURE [yes/NO]?: ")
361
+ fatal("Exiting", 0) if value != "yes"
362
+
363
+ logger.info "Rebooting instance alias=#{instance_alias}, instance_id=#{instance_item.instance_id}"
364
+
365
+ cloud.reboot_instance(instance_item.instance_id)
366
+ end
367
+
368
+ # Stops the given ec2 instance. Note that this operation only works for instances that use an EBS volume for the root
369
+ # device and that are not spot instances.
370
+ def stop_instance(instance_alias)
371
+ instance_item = rubber_instances[instance_alias]
372
+ fatal "Instance does not exist: #{instance_alias}" if ! instance_item
373
+ fatal "Cannot stop spot instances!" if ! instance_item.spot_instance_request_id.nil?
374
+ fatal "Cannot stop instances with instance-store root device!" if (instance_item.root_device_type != 'ebs')
375
+
376
+ env = rubber_cfg.environment.bind(instance_item.role_names, instance_item.name)
377
+
378
+ value = Capistrano::CLI.ui.ask("About to STOP #{instance_alias} (#{instance_item.instance_id}) in mode #{RUBBER_ENV}. Are you SURE [yes/NO]?: ")
379
+ fatal("Exiting", 0) if value != "yes"
380
+
381
+ logger.info "Stopping instance alias=#{instance_alias}, instance_id=#{instance_item.instance_id}"
382
+
383
+ cloud.stop_instance(instance_item.instance_id)
384
+ end
385
+
386
+ # Starts the given ec2 instance. Note that this operation only works for instances that use an EBS volume for the root
387
+ # device, that are not spot instances, and that are already stopped.
388
+ def start_instance(instance_alias)
389
+ instance_item = rubber_instances[instance_alias]
390
+ fatal "Instance does not exist: #{instance_alias}" if ! instance_item
391
+ fatal "Cannot start spot instances!" if ! instance_item.spot_instance_request_id.nil?
392
+ fatal "Cannot start instances with instance-store root device!" if (instance_item.root_device_type != 'ebs')
393
+
394
+ env = rubber_cfg.environment.bind(instance_item.role_names, instance_item.name)
395
+
396
+ value = Capistrano::CLI.ui.ask("About to START #{instance_alias} (#{instance_item.instance_id}) in mode #{RUBBER_ENV}. Are you SURE [yes/NO]?: ")
397
+ fatal("Exiting", 0) if value != "yes"
398
+
399
+ logger.info "Starting instance alias=#{instance_alias}, instance_id=#{instance_item.instance_id}"
400
+
401
+ cloud.start_instance(instance_item.instance_id)
402
+
403
+ # Re-starting an instance will almost certainly give it a new set of IPs and DNS entries, so refresh the values.
404
+ print "Waiting for instance to start"
405
+ while true do
406
+ print "."
407
+ sleep 2
408
+
409
+ break if refresh_instance(instance_alias)
410
+ end
411
+ end
326
412
 
327
413
  # delete from ~/.ssh/known_hosts all lines that begin with ec2- or instance_alias
328
414
  def cleanup_known_hosts(instance_item)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubber
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 11
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
- - 6
9
- - 3
10
- version: 1.6.3
8
+ - 7
9
+ - 0
10
+ version: 1.7.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matt Conway
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-28 00:00:00 -04:00
18
+ date: 2010-10-01 00:00:00 -04:00
19
19
  default_executable: vulcanize
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency