sml-rubber 0.9.9 → 0.9.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/VERSION +1 -1
  2. data/generators/vulcanize/templates/apache/config/rubber/deploy-apache.rb +13 -7
  3. data/generators/vulcanize/templates/apache/config/rubber/role/{web → apache}/deflate.conf +0 -0
  4. data/generators/vulcanize/templates/apache/config/rubber/role/{web → apache}/expires.conf +0 -0
  5. data/generators/vulcanize/templates/apache/config/rubber/role/{web → apache}/headers.conf +0 -0
  6. data/generators/vulcanize/templates/apache/config/rubber/role/apache/monit-apache.conf +8 -0
  7. data/generators/vulcanize/templates/apache/config/rubber/role/apache/ports.conf +5 -0
  8. data/generators/vulcanize/templates/apache/config/rubber/role/{web → apache}/setenvif.conf +0 -0
  9. data/generators/vulcanize/templates/apache/config/rubber/role/web_tools/tools-apache-vhost.conf +62 -0
  10. data/generators/vulcanize/templates/apache/config/rubber/role/web_tools/tools-apache.auth +7 -0
  11. data/generators/vulcanize/templates/{nginx/config/rubber/role/web_tools/index.html → apache/config/rubber/role/web_tools/tools-index.html} +8 -1
  12. data/generators/vulcanize/templates/apache/config/rubber/rubber-apache.yml +4 -12
  13. data/generators/vulcanize/templates/base/config/deploy.rb +5 -34
  14. data/generators/vulcanize/templates/base/config/rubber/deploy-setup.rb +4 -6
  15. data/generators/vulcanize/templates/base/config/rubber/rubber.yml +29 -3
  16. data/generators/vulcanize/templates/complete_mongrel_mysql/config/rubber/role/haproxy/haproxy-mongrel.conf +23 -0
  17. data/generators/vulcanize/templates/{nginx/config/rubber/role/web/nginx.conf → complete_mongrel_mysql/config/rubber/role/nginx/nginx-mongrel.conf} +25 -45
  18. data/generators/vulcanize/templates/complete_mongrel_mysql/config/rubber/rubber-complete.yml +41 -0
  19. data/generators/vulcanize/templates/{complete_mysql → complete_mongrel_mysql}/templates.yml +0 -0
  20. data/generators/vulcanize/templates/complete_passenger_mysql/config/rubber/role/haproxy/haproxy-passenger.conf +19 -0
  21. data/generators/vulcanize/templates/complete_passenger_mysql/config/rubber/rubber-complete.yml +40 -0
  22. data/generators/vulcanize/templates/complete_passenger_mysql/templates.yml +3 -1
  23. data/generators/vulcanize/templates/cruise/config/rubber/deploy-cruise.rb +8 -10
  24. data/generators/vulcanize/templates/cruise/config/rubber/role/web_tools/cruise-nginx.conf +1 -1
  25. data/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/haproxy-base.conf +26 -0
  26. data/generators/vulcanize/templates/haproxy/config/rubber/role/web_tools/haproxy-nginx.conf +1 -1
  27. data/generators/vulcanize/templates/haproxy/config/rubber/rubber-haproxy.yml +0 -5
  28. data/generators/vulcanize/templates/mongrel/config/rubber/deploy-mongrel.rb +7 -7
  29. data/generators/vulcanize/templates/mongrel/config/rubber/role/{app → mongrel}/mongrel_cluster.yml +4 -4
  30. data/generators/vulcanize/templates/mongrel/config/rubber/role/{app → mongrel}/monit-mongrel.conf +2 -2
  31. data/generators/vulcanize/templates/mongrel/config/rubber/rubber-mongrel.yml +2 -2
  32. data/generators/vulcanize/templates/monit/config/rubber/role/web_tools/monit-admin-nginx.conf +1 -1
  33. data/generators/vulcanize/templates/munin/config/rubber/deploy-munin.rb +17 -1
  34. data/generators/vulcanize/templates/munin/config/rubber/role/web_tools/munin-nginx.conf +1 -1
  35. data/generators/vulcanize/templates/munin/config/rubber/rubber-munin.yml +1 -1
  36. data/generators/vulcanize/templates/mysql/config/rubber/deploy-mysql.rb +14 -36
  37. data/generators/vulcanize/templates/mysql/config/rubber/role/db/monit-mysql.cnf +1 -1
  38. data/generators/vulcanize/templates/mysql/config/rubber/rubber-mysql.yml +8 -0
  39. data/generators/vulcanize/templates/mysql_cluster/config/rubber/deploy-mysql_cluster.rb +7 -7
  40. data/generators/vulcanize/templates/nginx/config/rubber/deploy-nginx.rb +6 -6
  41. data/generators/vulcanize/templates/nginx/config/rubber/role/{web → nginx}/crontab +0 -0
  42. data/generators/vulcanize/templates/nginx/config/rubber/role/{web → nginx}/monit-nginx.conf +0 -1
  43. data/generators/vulcanize/templates/nginx/config/rubber/role/nginx/nginx.conf +42 -0
  44. data/generators/vulcanize/templates/nginx/config/rubber/role/web_tools/nginx-tools.conf +43 -62
  45. data/generators/vulcanize/templates/nginx/config/rubber/role/web_tools/tools-index.html +30 -0
  46. data/generators/vulcanize/templates/nginx/config/rubber/role/web_tools/tools-nginx.auth +7 -0
  47. data/generators/vulcanize/templates/nginx/config/rubber/rubber-nginx.yml +3 -26
  48. data/generators/vulcanize/templates/passenger/config/rubber/deploy-passenger.rb +13 -40
  49. data/generators/vulcanize/templates/passenger/config/rubber/role/passenger/munin-passenger-sudoers.conf +6 -0
  50. data/generators/vulcanize/templates/passenger/config/rubber/role/passenger/munin-passenger.conf +47 -0
  51. data/generators/vulcanize/templates/passenger/config/rubber/role/passenger/passenger-apache-vhost.conf +46 -0
  52. data/generators/vulcanize/templates/passenger/config/rubber/role/passenger/passenger.conf +10 -0
  53. data/generators/vulcanize/templates/passenger/config/rubber/rubber-passenger.yml +9 -11
  54. data/generators/vulcanize/templates/sphinx/config/rubber/deploy-sphinx.rb +1 -1
  55. data/lib/rubber/cloud/aws.rb +30 -0
  56. data/lib/rubber/instance.rb +53 -2
  57. data/lib/rubber/recipes/rubber.rb +7 -6
  58. data/lib/rubber/recipes/rubber/deploy.rb +22 -1
  59. data/lib/rubber/recipes/rubber/instances.rb +74 -24
  60. data/lib/rubber/recipes/rubber/load_balancers.rb +27 -0
  61. data/lib/rubber/recipes/rubber/security_groups.rb +5 -7
  62. data/lib/rubber/recipes/rubber/setup.rb +50 -14
  63. data/lib/rubber/recipes/rubber/static_ips.rb +7 -7
  64. data/lib/rubber/recipes/rubber/utils.rb +6 -7
  65. data/lib/rubber/recipes/rubber/volumes.rb +8 -8
  66. data/lib/rubber/util.rb +4 -0
  67. data/test/instance_test.rb +55 -0
  68. metadata +32 -18
  69. data/generators/vulcanize/templates/apache/config/rubber/role/web/vhost.conf +0 -27
  70. data/generators/vulcanize/templates/haproxy/config/rubber/role/haproxy/haproxy.conf +0 -44
  71. data/generators/vulcanize/templates/passenger/config/rubber/role/web/passenger.conf +0 -8
  72. data/generators/vulcanize/templates/passenger/config/rubber/role/web/vhost.conf +0 -29
@@ -0,0 +1,46 @@
1
+ <%
2
+ @path = "/etc/apache2/sites-available/#{rubber_env.app_name}-passenger"
3
+ @post = "a2enmod rewrite && a2enmod ssl && a2ensite #{rubber_env.app_name}-passenger"
4
+ %>
5
+
6
+ <% [rubber_env.passenger_listen_port, rubber_env.passenger_listen_ssl_port].each do |port| %>
7
+
8
+ Listen <%= port %>
9
+ <VirtualHost *:<%= port %>>
10
+ ServerName <%= rubber_env.domain %>
11
+ <%- if rubber_env.web_aliases -%>
12
+ ServerAlias <%= rubber_env.web_aliases.join(" ") %>
13
+ <%- end -%>
14
+ DocumentRoot <%= RUBBER_ROOT + "/public" %>
15
+
16
+ ErrorDocument 404 /404.html
17
+ ErrorDocument 500 /500.html
18
+
19
+ SetEnvIf User-Agent "^(.*MSIE.*)|(.*AppleWebKit.*)$" nokeepalive
20
+
21
+ RailsEnv <%= RUBBER_ENV %>
22
+ RailsAllowModRewrite on
23
+
24
+ RewriteEngine On
25
+ RewriteCond %{HTTP_HOST} ^<%= rubber_env.domain %>$
26
+ RewriteRule ^(.*)$ http://www.<%= rubber_env.domain %>$1 [R,L]
27
+
28
+ # Include <%= RUBBER_ROOT %>/config/apache/rewrites.conf
29
+
30
+ RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
31
+ RewriteCond %{SCRIPT_FILENAME} !maintenance.html
32
+ RewriteRule ^.*$ /system/maintenance.html [L]
33
+
34
+ <% if port == rubber_env.passenger_listen_ssl_port %>
35
+ SSLEngine on
36
+ SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
37
+ SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
38
+ SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
39
+ # SSLCertificateFile <%= RUBBER_ROOT %>/config/<%= rubber_env.domain %>.crt
40
+ # SSLCertificateKeyFile <%= RUBBER_ROOT %>/config/<%= rubber_env.domain %>.key
41
+ # SSLCertificateChainFile /etc/ssl/certs/gd_intermediate_bundle.crt
42
+ <% end %>
43
+
44
+ </VirtualHost>
45
+
46
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <%
2
+ @path = '/etc/apache2/mods-available/passenger.conf'
3
+ @post = 'cd /etc/apache2/mods-enabled && ln -fs ../mods-available/passenger.conf'
4
+ %>
5
+ LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-<%= rubber_env.passenger_version %>/ext/apache2/mod_passenger.so
6
+ PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-<%= rubber_env.passenger_version %>
7
+ PassengerRuby /usr/bin/ruby
8
+ PassengerUseGlobalQueue on
9
+
10
+ PassengerMaxPoolSize <%= rubber_env.max_app_connections %>
@@ -1,14 +1,12 @@
1
- security_groups:
2
- web:
3
- description: To open up port 80 for http server on web role
4
- rules:
5
- - protocol: tcp
6
- from_port: 80
7
- to_port: 80
8
- source_ips: [0.0.0.0/0]
1
+ passenger_version: 2.2.5
2
+ passenger_listen_port: 7000
3
+ passenger_listen_ssl_port: 7001
4
+ max_app_connections: 20
5
+
6
+ role_dependencies:
7
+ passenger: [apache]
9
8
 
10
9
  roles:
11
- web:
10
+ app:
12
11
  packages: [apache2-mpm-prefork, apache2-prefork-dev]
13
- gems: [fastthread, rack, [passenger, 2.2.4]]
14
- assigned_security_groups: [web]
12
+ gems: [fastthread, rack, [passenger, "#{passenger_version}"]]
@@ -32,7 +32,7 @@ namespace :rubber do
32
32
  TMPDIR=`mktemp -d` || exit 1
33
33
  cd $TMPDIR
34
34
  echo 'Downloading'
35
- wget -q http://www.sphinxsearch.com/downloads/sphinx-#{ver}.tar.gz
35
+ wget -qN http://www.sphinxsearch.com/downloads/sphinx-#{ver}.tar.gz
36
36
  echo 'Unpacking'
37
37
  tar xf sphinx-#{ver}.tar.gz
38
38
  cd sphinx-#{ver}
@@ -11,6 +11,7 @@ module Rubber
11
11
  super(env, capistrano)
12
12
  @aws_env = env.cloud_providers.aws
13
13
  @ec2 = AWS::EC2::Base.new(:access_key_id => @aws_env.access_key, :secret_access_key => @aws_env.secret_access_key)
14
+ @ec2elb = AWS::ELB::Base.new(:access_key_id => @aws_env.access_key, :secret_access_key => @aws_env.secret_access_key)
14
15
  AWS::S3::Base.establish_connection!(:access_key_id => @aws_env.access_key, :secret_access_key => @aws_env.secret_access_key)
15
16
  end
16
17
 
@@ -269,6 +270,35 @@ module Rubber
269
270
  end
270
271
  end
271
272
 
273
+ def describe_load_balancers(name=nil)
274
+ lbs = []
275
+ opts = {}
276
+ opts[:load_balancer_names] = name if name
277
+ response = @ec2elb.describe_load_balancers(opts)
278
+ response.describeLoadBalancersResult.member.each do |member|
279
+ lb = {}
280
+ lb[:name] = member.loadBalancerName
281
+ lb[:dns_name] = member.dNSName
282
+
283
+ member.availabilityZones.member.each do |zone|
284
+ lb[:zones] ||= []
285
+ lb[:zones] << zone
286
+ end
287
+
288
+ member.listeners.member.each do |member|
289
+ listener = {}
290
+ listener[:protocol] = member.protocol
291
+ listener[:port] = member.loadBalancerPort
292
+ listener[:instance_port] = member.instancePort
293
+ lb[:listeners] ||= []
294
+ lb[:listeners] << listener
295
+ end
296
+
297
+ lbs << lb
298
+ end if response.describeLoadBalancersResult
299
+ return lbs
300
+ end
301
+
272
302
  end
273
303
 
274
304
  end
@@ -76,7 +76,8 @@ module Rubber
76
76
 
77
77
  # The configuration for a single instance
78
78
  class InstanceItem
79
- attr_reader :name, :domain, :roles, :instance_id
79
+ attr_reader :name, :domain, :instance_id
80
+ attr_accessor :roles
80
81
  attr_accessor :external_host, :external_ip
81
82
  attr_accessor :internal_host, :internal_ip
82
83
  attr_accessor :static_ip, :volumes, :partitions
@@ -102,9 +103,59 @@ module Rubber
102
103
  class RoleItem
103
104
  attr_reader :name, :options
104
105
 
106
+ def self.expand_role_dependencies(roles, dependency_map, expanded=[])
107
+ roles = Array(roles)
108
+ roles.each do |role|
109
+ unless expanded.include?(role)
110
+ expanded << role
111
+ needed = dependency_map[role]
112
+ expand_role_dependencies(needed, dependency_map, expanded)
113
+ end
114
+ end
115
+ return expanded
116
+ end
117
+
118
+ def self.parse(str)
119
+ data = str.split(':');
120
+ role = Rubber::Configuration::RoleItem.new(data[0])
121
+ if data[1]
122
+ data[1].split(';').each do |pair|
123
+ p = pair.split('=')
124
+ val = case p[1]
125
+ when 'true' then true
126
+ when 'false' then false
127
+ else p[1] end
128
+ role.options[p[0]] = val
129
+ end
130
+ end
131
+ return role
132
+ end
133
+
134
+ def to_s
135
+ str = @name
136
+ @options.each_with_index do |kv, i|
137
+ str += (i == 0 ? ':' : ';')
138
+ str += "#{kv[0]}=#{kv[1]}"
139
+ end
140
+ return str
141
+ end
142
+
105
143
  def initialize(name, options={})
106
144
  @name = name
107
- @options = options
145
+ @options = options || {}
146
+ end
147
+
148
+ def eql?(rhs)
149
+ rhs && @name == rhs.name && @options == rhs.options
150
+ end
151
+ alias == eql?
152
+
153
+ def hash()
154
+ @name.hash
155
+ end
156
+
157
+ def <=>(rhs)
158
+ return @name <=> rhs.name
108
159
  end
109
160
  end
110
161
 
@@ -46,15 +46,16 @@ namespace :rubber do
46
46
  end
47
47
 
48
48
  set :rubber_cfg, Rubber::Configuration.get_configuration(RUBBER_ENV)
49
- env = rubber_cfg.environment.bind()
49
+ set :rubber_env, rubber_cfg.environment.bind()
50
+ set :rubber_instances, rubber_cfg.instance
50
51
 
51
- set :cloud, Rubber::Cloud::get_provider(env.cloud_provider || "aws", env, self)
52
+ set :cloud, Rubber::Cloud::get_provider(rubber_env.cloud_provider || "aws", rubber_env, self)
52
53
 
53
- load_roles() unless rubber_cfg.environment.bind().disable_auto_roles
54
+ load_roles() unless rubber_env.disable_auto_roles
54
55
  # NOTE: for some reason Capistrano requires you to have both the public and
55
56
  # the private key in the same folder, the public key should have the
56
57
  # extension ".pub".
57
- ssh_options[:keys] = env.cloud_providers[env.cloud_provider].key_file
58
+ ssh_options[:keys] = rubber_env.cloud_providers[rubber_env.cloud_provider].key_file
58
59
  end
59
60
 
60
61
 
@@ -64,13 +65,13 @@ namespace :rubber do
64
65
 
65
66
  # define empty roles for all known ones so tasks don't fail if a role
66
67
  # doesn't exist due to a filter
67
- all_roles = rubber_cfg.instance.all_roles
68
+ all_roles = rubber_instances.all_roles
68
69
  all_roles += rubber_cfg.environment.known_roles
69
70
  all_roles.uniq!
70
71
  all_roles.each {|name| top.roles[name.to_sym] = []}
71
72
 
72
73
  # define capistrano host => role mapping for all instances
73
- rubber_cfg.instance.filtered.each do |ic|
74
+ rubber_instances.filtered.each do |ic|
74
75
  ic.roles.each do |role|
75
76
  opts = Rubber::Util::symbolize_keys(role.options)
76
77
  msg = "Auto role: #{role.name.to_sym} => #{ic.full_name}"
@@ -24,6 +24,15 @@ namespace :rubber do
24
24
  task :post_stop do
25
25
  end
26
26
 
27
+ # Don't want to do rubber:config for update_code as that tree isn't official
28
+ # until it is 'committed' by the symlink task (and doing so causes it to run
29
+ # for bootstrap_db which should only config the db config file). However,
30
+ # deploy:migrations doesn't call update, so we need an additional trigger for
31
+ # it
32
+ after "deploy:update", "rubber:config"
33
+ after "deploy:rollback_code", "rubber:config"
34
+ before "deploy:migrate", "rubber:config"
35
+
27
36
  desc <<-DESC
28
37
  Configures the deployed rails application by running the rubber configuration process
29
38
  DESC
@@ -42,6 +51,18 @@ namespace :rubber do
42
51
  run_config(opts)
43
52
  end
44
53
 
54
+ # because we start server as appserver user, but migrate as root, server needs to be able to write logs, etc.
55
+ before "rubber:pre_start", "rubber:setup_app_permissions"
56
+ before "rubber:pre_restart", "rubber:setup_app_permissions"
57
+
58
+ desc <<-DESC
59
+ Sets permissions of files in application directory to be owned by app_user.
60
+ DESC
61
+ task :setup_app_permissions do
62
+ run "find #{shared_path} -name cached-copy -prune -o -print | xargs chown #{rubber_env.app_user}:#{rubber_env.app_user}"
63
+ run "chown -R #{rubber_env.app_user}:#{rubber_env.app_user} #{current_path}/tmp"
64
+ end
65
+
45
66
  def run_config(options={})
46
67
  path = options.delete(:deploy_path) || current_path
47
68
  extra_env = options.keys.inject("") {|all, k| "#{all} #{k}=\"#{options[k]}\""}
@@ -49,7 +70,7 @@ namespace :rubber do
49
70
  # Need to do this so we can work with staging instances without having to
50
71
  # checkin instance file between create and bootstrap, as well as during a deploy
51
72
  if fetch(:push_instance_config, false)
52
- push_files = [rubber_cfg.instance.file] + rubber_cfg.environment.config_files
73
+ push_files = [rubber_instances.file] + rubber_cfg.environment.config_files
53
74
  push_files.each do |file|
54
75
  dest_file = file.sub(/^#{RUBBER_ROOT}\/?/, '')
55
76
  put(File.read(file), File.join(path, dest_file), :mode => "+r")
@@ -15,21 +15,10 @@ namespace :rubber do
15
15
 
16
16
  ir = []
17
17
  instance_roles.each do |r|
18
- data = r.split(':');
19
- role = Rubber::Configuration::RoleItem.new(data[0])
20
- if data[1]
21
- data[1].split(';').each do |pair|
22
- p = pair.split('=')
23
- val = case p[1]
24
- when 'true' then true
25
- when 'false' then false
26
- else p[1] end
27
- role.options[p[0]] = val
28
- end
29
- end
18
+ role = Rubber::Configuration::RoleItem.parse(r)
30
19
 
31
20
  # If user doesn't setup a primary db, then be nice and do it
32
- if role.name == "db" && role.options["primary"] == nil && rubber_cfg.instance.for_role("db").size == 0
21
+ if role.name == "db" && role.options["primary"] == nil && rubber_instances.for_role("db").size == 0
33
22
  value = Capistrano::CLI.ui.ask("You do not have a primary db role, should #{instance_alias} be it [y/n]?: ")
34
23
  role.options["primary"] = true if value =~ /^y/
35
24
  end
@@ -37,6 +26,9 @@ namespace :rubber do
37
26
  ir << role
38
27
  end
39
28
 
29
+ # Add in roles that the given set of roles depends on
30
+ ir = Rubber::Configuration::RoleItem.expand_role_dependencies(ir, get_role_dependencies)
31
+
40
32
  create_instance(instance_alias, ir)
41
33
  end
42
34
 
@@ -63,11 +55,58 @@ namespace :rubber do
63
55
  Destroy ALL the EC2 instances for the current env
64
56
  DESC
65
57
  task :destroy_all do
66
- rubber_cfg.instance.each do |ic|
58
+ rubber_instances.each do |ic|
67
59
  destroy_instance(ic.name)
68
60
  end
69
61
  end
70
62
 
63
+ desc <<-DESC
64
+ Adds the given ROLES to the instance named ALIAS
65
+ DESC
66
+ required_task :add_role do
67
+ instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
68
+ r = get_env('ROLES', "Instance roles (e.g. web,app,db:primary=true)", true)
69
+
70
+ instance_roles = r.split(",")
71
+
72
+ ir = []
73
+ instance_roles.each do |r|
74
+ role = Rubber::Configuration::RoleItem.parse(r)
75
+ ir << role
76
+ end
77
+
78
+ # Add in roles that the given set of roles depends on
79
+ ir = Rubber::Configuration::RoleItem.expand_role_dependencies(ir, get_role_dependencies)
80
+
81
+ instance = rubber_instances[instance_alias]
82
+ fatal "Instance does not exist: #{instance_alias}" unless instance
83
+
84
+ instance.roles = (instance.roles + ir).uniq
85
+ rubber_instances.save()
86
+ end
87
+
88
+ desc <<-DESC
89
+ Removes the given ROLES from the instance named ALIAS
90
+ DESC
91
+ required_task :remove_role do
92
+ instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
93
+ r = get_env('ROLES', "Instance roles (e.g. web,app,db:primary=true)", true)
94
+
95
+ instance_roles = r.split(",")
96
+
97
+ ir = []
98
+ instance_roles.each do |r|
99
+ role = Rubber::Configuration::RoleItem.parse(r)
100
+ ir << role
101
+ end
102
+
103
+ instance = rubber_instances[instance_alias]
104
+ fatal "Instance does not exist: #{instance_alias}" unless instance
105
+
106
+ instance.roles = (instance.roles - ir).uniq
107
+ rubber_instances.save()
108
+ end
109
+
71
110
  desc <<-DESC
72
111
  List all your EC2 instances
73
112
  DESC
@@ -106,7 +145,7 @@ namespace :rubber do
106
145
  # Creates a new ec2 instance with the given alias and roles
107
146
  # Configures aliases (/etc/hosts) on local and remote machines
108
147
  def create_instance(instance_alias, instance_roles)
109
- fatal "Instance already exists: #{instance_alias}" if rubber_cfg.instance[instance_alias]
148
+ fatal "Instance already exists: #{instance_alias}" if rubber_instances[instance_alias]
110
149
 
111
150
  role_names = instance_roles.collect{|x| x.name}
112
151
  env = rubber_cfg.environment.bind(role_names, instance_alias)
@@ -124,8 +163,8 @@ namespace :rubber do
124
163
  logger.info "Instance #{instance_id} created"
125
164
 
126
165
  instance_item = Rubber::Configuration::InstanceItem.new(instance_alias, env.domain, instance_roles, instance_id)
127
- rubber_cfg.instance.add(instance_item)
128
- rubber_cfg.instance.save()
166
+ rubber_instances.add(instance_item)
167
+ rubber_instances.save()
129
168
 
130
169
 
131
170
  print "Waiting for instance to start"
@@ -140,7 +179,7 @@ namespace :rubber do
140
179
  instance_item.external_host = instance[:external_host]
141
180
  instance_item.external_ip = instance[:external_ip]
142
181
  instance_item.internal_host = instance[:internal_host]
143
- rubber_cfg.instance.save()
182
+ rubber_instances.save()
144
183
 
145
184
  # setup amazon elastic ips if configured to do so
146
185
  setup_static_ips
@@ -157,7 +196,7 @@ namespace :rubber do
157
196
 
158
197
  task :_get_ip, :hosts => instance_item.external_ip do
159
198
  instance_item.internal_ip = capture(print_ip_command).strip
160
- rubber_cfg.instance.save()
199
+ rubber_instances.save()
161
200
  end
162
201
 
163
202
  # even though instance is running, sometimes ssh hasn't started yet,
@@ -182,7 +221,7 @@ namespace :rubber do
182
221
  # Refreshes a ec2 instance with the given alias
183
222
  # Configures aliases (/etc/hosts) on local and remote machines
184
223
  def refresh_instance(instance_alias)
185
- instance_item = rubber_cfg.instance[instance_alias]
224
+ instance_item = rubber_instances[instance_alias]
186
225
 
187
226
  fatal "Instance does not exist: #{instance_alias}" if ! instance_item
188
227
 
@@ -218,13 +257,13 @@ namespace :rubber do
218
257
  setup_dns_aliases
219
258
  end
220
259
 
221
- rubber_cfg.instance.save()
260
+ rubber_instances.save()
222
261
  end
223
262
 
224
263
 
225
264
  # Destroys the given ec2 instance
226
265
  def destroy_instance(instance_alias)
227
- instance_item = rubber_cfg.instance[instance_alias]
266
+ instance_item = rubber_instances[instance_alias]
228
267
  fatal "Instance does not exist: #{instance_alias}" if ! instance_item
229
268
 
230
269
  env = rubber_cfg.environment.bind(instance_item.role_names, instance_item.name)
@@ -250,8 +289,8 @@ namespace :rubber do
250
289
 
251
290
  cloud.destroy_instance(instance_item.instance_id)
252
291
 
253
- rubber_cfg.instance.remove(instance_alias)
254
- rubber_cfg.instance.save()
292
+ rubber_instances.remove(instance_alias)
293
+ rubber_instances.save()
255
294
 
256
295
  # re-load the roles since we just removed some and setup_remote_aliases
257
296
  # shouldn't hit removed ones
@@ -284,4 +323,15 @@ namespace :rubber do
284
323
  end
285
324
  end
286
325
 
326
+ def get_role_dependencies
327
+ # convert string format of role_dependencies from rubber.yml into
328
+ # objects for use by expand_role_dependencies
329
+ deps = {}
330
+ rubber_env.role_dependencies.each do |k, v|
331
+ rhs = Array(v).collect {|r| Rubber::Configuration::RoleItem.parse(r)}
332
+ deps[Rubber::Configuration::RoleItem.parse(k)] = rhs
333
+ end
334
+ return deps
335
+ end
336
+
287
337
  end