rubber 1.6.3 → 1.7.0

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/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