rubber 2.0.1 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -3,8 +3,9 @@ rvm:
3
3
  - 1.8.7
4
4
  - 1.9.2
5
5
  - 1.9.3
6
- # - jruby-18mode # JRuby in 1.8 mode
7
- # - jruby-19mode # JRuby in 1.9 mode
6
+ - jruby-18mode
7
+ - jruby-19mode
8
+ - jruby-head
8
9
  # - rbx-18mode
9
10
  # - rbx-19mode
10
11
  # script: bundle exec rspec spec
data/CHANGELOG CHANGED
@@ -1,13 +1,55 @@
1
- 2.0.1
2
- -----
1
+ 2.0.2 (05/08/2012)
2
+
3
+ New Features:
4
+ ============
5
+
6
+ [graylog] Added an admin UI for ElasticSearch
7
+
8
+ Improvements:
9
+ ============
10
+
11
+ [base] Use ntpd instead of cron for syncing time
12
+ [core] Auto-reboot for kernel updates on initial instance bootstrap rather than prompting the user to reboot
13
+ [redis] Upgraded to redis 2.4.12 from 2.4.11
14
+
15
+ Bug Fixes:
16
+ =========
17
+
18
+ [core] Fixed issue with Route 53 DNS not updating records properly
19
+ [core] Wait for EBS volumes to be fully attached before trying to format them
20
+ [core] Fixed issue with running `rubber config` locally
21
+ [collectd] Made the runner executable
22
+ [graphite] Fixed some broken URLs in the dashboard
23
+ [passenger] Fixed issue with using a path to config.ru before capistrano completed setting it up.
24
+ [resque] Replaced a hard-coded reference to the resque-pool PID file with the rubber configured one
25
+ [resque] Append to the resque-pool.log file rather than overwrite it
26
+ [zookeeper] Fixed the detection of an existing zookeeper installation
27
+
28
+
29
+
30
+ 2.0.1 (04/29/2012)
31
+ ----------
32
+
33
+ New Features:
34
+ ============
35
+
36
+ [base] Added the ability to supply additional arguments to RVM (e.g., to install additional patches or modify compile arguments)
37
+ [graphite] Added a simple graphite dashboard suitable for TV display
3
38
 
4
39
  Improvements:
5
40
  ============
6
41
 
7
- Upgraded to redis 2.4.11 from 2.4.6
8
- Upgraded to RVM 1.13.0 from 1.10.2
9
- Upgraded to Ubuntu 12.04
10
- Assorted fixes/workarounds for 12.04
42
+ [redis] Upgraded to redis 2.4.11 from 2.4.6
43
+ [base] Upgraded to RVM 1.13.0 from 1.10.2
44
+ [base] Upgraded to Ubuntu 12.04
45
+
46
+ Bug Fixes:
47
+ =========
48
+
49
+ [base] Assorted fixes/workarounds for 12.04
50
+ [collectd] Fixed an issue with libperl and collectd
51
+ [redis] Fixed an issue with the redis role not installing the zip packaged, needed for backup
52
+
11
53
 
12
54
  2.0.0 (04/24/2012)
13
55
  ----------
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
- source "http://rubygems.org"
1
+ source "https://rubygems.org"
2
+
3
+ gem 'jruby-openssl', :platforms => :jruby
2
4
 
3
5
  # Specify your gem's dependencies in rubber.gemspec
4
6
  gemspec
@@ -12,25 +12,60 @@ module Rubber
12
12
  super(env)
13
13
  creds = Rubber::Util.symbolize_keys(env.credentials)
14
14
  @client = ::Fog::DNS.new(creds)
15
+ @name_includes_domain = env.name_includes_domain
16
+ @name_includes_trailing_period = env.name_includes_trailing_period
15
17
  end
18
+
19
+ def normalize_name(name, domain)
20
+ domain = domain.gsub(/\.$/, "") if @name_includes_trailing_period
16
21
 
22
+ name = name.gsub(/\.$/, "") if @name_includes_trailing_period
23
+ name = name.gsub(/.?#{domain}$/, "") if @name_includes_domain
24
+
25
+ return name, domain
26
+ end
27
+
28
+ def denormalize_name(name, domain)
29
+ if @name_includes_domain
30
+ if name && name.strip.empty?
31
+ name = "#{domain}"
32
+ else
33
+ name = "#{name}.#{domain}"
34
+ end
35
+ end
36
+
37
+ if @name_includes_trailing_period
38
+ name = "#{name}."
39
+ domain = "#{domain}."
40
+ end
41
+
42
+ return name, domain
43
+ end
44
+
17
45
  def host_to_opts(host)
46
+ name, domain = normalize_name(host.name || '', host.zone.domain)
47
+
18
48
  opts = {}
19
- opts[:id] = host.id
20
- opts[:host] = host.name || ''
49
+ opts[:id] = host.id if host.respond_to?(:id) && host.id
50
+ opts[:host] = name
51
+ opts[:domain] = domain
21
52
  opts[:type] = host.type
22
- opts[:data] = host.value if host.value
23
- opts[:ttl] = host.ttl if host.ttl
24
- opts[:priority] = host.priority if host.priority
53
+ opts[:data] = Array(host.value).first if host.value
54
+ opts[:ttl] = host.ttl.to_i if host.ttl
55
+ opts[:priority] = host.priority if host.respond_to?(:priority) && host.priority
56
+
25
57
  return opts
26
58
  end
27
59
 
28
60
  def opts_to_host(opts, host={})
29
- host[:name] = opts[:host]
61
+ name, domain = denormalize_name(opts[:host], opts[:domain])
62
+
63
+ host[:name] = name
30
64
  host[:type] = opts[:type]
31
65
  host[:value] = opts[:data] if opts[:data]
32
66
  host[:ttl] = opts[:ttl] if opts[:ttl]
33
67
  host[:priority] = opts[:priority] if opts[:priority]
68
+
34
69
  return host
35
70
  end
36
71
 
@@ -60,18 +95,34 @@ module Rubber
60
95
  fqdn << "#{opts[:domain]}"
61
96
  end
62
97
 
63
- hosts = fqdn ? (zone.records.find(fqdn) rescue []) : zone.records.all
98
+ # TODO: revert this when fog gets fixed
99
+ # hosts = fqdn ? (zone.records.all(:name => fqdn) rescue []) : zone.records.all
100
+ hosts = zone.records.all
101
+ if fqdn
102
+ hosts = hosts.find_all do |r|
103
+ attributes = host_to_opts(r)
104
+ host, domain = attributes[:host], attributes[:domain]
105
+
106
+ fog_fqdn = ""
107
+ fog_fqdn << "#{host}." if host && ! host.strip.empty?
108
+ fog_fqdn << "#{domain}"
109
+
110
+ fqdn == fog_fqdn
111
+ end
112
+ end
113
+
64
114
  hosts.each do |h|
65
115
  keep = true
116
+ attributes = host_to_opts(h)
66
117
 
67
- if host_type && h.type != host_type && host_type != '*'
118
+ if host_type && host_type != '*' && attributes[:type] != host_type
68
119
  keep = false
69
120
  end
70
121
 
71
- if host_data && h.value != host_data
122
+ if host_data && attributes[:data] != host_data
72
123
  keep = false
73
124
  end
74
-
125
+
75
126
  result << h if keep
76
127
  end
77
128
 
@@ -103,11 +154,20 @@ module Rubber
103
154
  new_opts = setup_opts(new_opts, [:host, :domain, :type, :data])
104
155
 
105
156
  find_hosts(old_opts).each do |h|
106
- opts_to_host(new_opts).each do |k, v|
107
- h.send("#{k}=", v)
157
+ changes = opts_to_host(new_opts)
158
+ result = nil
159
+ if h.respond_to?(:modify)
160
+ result = h.modify(changes)
161
+ elsif h.respond_to?(:update_host)
162
+ result = h.update_host(changes)
163
+ else
164
+ changes.each do |k, v|
165
+ h.send("#{k}=", v)
166
+ end
167
+ result = h.save
108
168
  end
109
169
 
110
- h.save || raise("Failed to update host #{h.hostname}, #{h.errors.full_messages.join(', ')}")
170
+ result || raise("Failed to update host #{h.hostname}, #{h.errors.full_messages.join(', ')}")
111
171
  end
112
172
  end
113
173
 
@@ -134,7 +134,7 @@ module Rubber
134
134
 
135
135
  def expand_string(val)
136
136
  while val =~ /\#\{[^\}]+\}/
137
- val = eval('%Q{' + val + '}', binding)
137
+ val = eval('%Q{' + val + '}', binding, __FILE__)
138
138
  end
139
139
  val = true if val =="true"
140
140
  val = false if val == "false"
@@ -144,8 +144,14 @@ module Rubber
144
144
 
145
145
  # Set file permissions and owner if needed
146
146
  FileUtils.chmod(config.perms, config_path) if config.perms && config_path
147
- FileUtils.chown(config.owner, config.group, config_path) if config_path && (config.owner || config.group)
148
-
147
+ if config_path && (config.owner || config.group)
148
+ if fake_root
149
+ Rubber.logger.info("Not performing chown (#{config.owner}:#{config.group}) as a fake root was given")
150
+ else
151
+ FileUtils.chown(config.owner, config.group, config_path)
152
+ end
153
+ end
154
+
149
155
  # Run post transform command if needed
150
156
  if config.post
151
157
  if fake_root
@@ -472,11 +472,22 @@ namespace :rubber do
472
472
 
473
473
  def maybe_reboot
474
474
  reboot_needed = multi_capture("echo $(ls /var/run/reboot-required 2> /dev/null)")
475
- reboot_hosts = reboot_needed.collect {|k, v| v.strip.size > 0 ? k : nil}.compact
476
-
475
+ reboot_hosts = reboot_needed.collect {|k, v| v.strip.size > 0 ? k : nil}.compact.sort
476
+
477
+ # Figure out which hosts are bootstrapping for the first time so we can auto reboot
478
+ # If there is no deployed app directory, then we have never bootstrapped.
479
+ auto_reboot = multi_capture("echo $(ls #{deploy_to} 2> /dev/null)")
480
+ auto_reboot_hosts = auto_reboot.collect {|k, v| v.strip.size == 0 ? k : nil}.compact.sort
481
+
477
482
  if reboot_hosts.size > 0
478
483
 
479
- ENV['REBOOT'] = 'y' if ENV['FORCE'] =~ /^(t|y)/
484
+ # automatically reboot if FORCE or if all the hosts that need rebooting
485
+ # are bootstrapping for the first time
486
+ if ENV['FORCE'] =~ /^(t|y)/ || reboot_hosts == auto_reboot_hosts
487
+ ENV['REBOOT'] = 'y'
488
+ logger.info "Updates require a reboot on hosts #{reboot_hosts.inspect}"
489
+ end
490
+
480
491
  reboot = get_env('REBOOT', "Updates require a reboot on hosts #{reboot_hosts.inspect}, reboot [y/N]?", false)
481
492
  reboot = (reboot =~ /^y/)
482
493
 
@@ -126,11 +126,26 @@ namespace :rubber do
126
126
  mv /etc/fstab /etc/fstab.bak
127
127
  cat /etc/fstab.bak | grep -v '#{vol_spec['mount']}' > /etc/fstab
128
128
  if [ `lsb_release -r -s | sed 's/[.].*//'` -gt "10" ]; then
129
- device=`echo #{vol_spec['device']} | sed 's/sd/xvd/'`
130
- else
131
- device='#{vol_spec['device']}'
132
- fi
133
- echo "$device #{vol_spec['mount']} #{vol_spec['filesystem']} #{vol_spec['mount_opts'] ? vol_spec['mount_opts'] : 'noatime'} 0 0 # rubber volume #{vol_id}" >> /etc/fstab
129
+ device=`echo #{vol_spec['device']} | sed 's/sd/xvd/'`
130
+ else
131
+ device='#{vol_spec['device']}'
132
+ fi
133
+
134
+ echo "$device #{vol_spec['mount']} #{vol_spec['filesystem']} #{vol_spec['mount_opts'] ? vol_spec['mount_opts'] : 'noatime'} 0 0 # rubber volume #{vol_id}" >> /etc/fstab
135
+
136
+ # Ensure volume is ready before running mkfs on it.
137
+ echo 'Waiting for device'
138
+ cnt=0
139
+ while ! [[ -b #{vol_spec['device']} ]]; do
140
+ if [[ "$cnt" -eq "15" ]]; then
141
+ echo 'Timed out waiting for EBS device to be ready.'
142
+ exit 1
143
+ fi
144
+ echo '.'
145
+ sleep 2
146
+ let "cnt = $cnt + 1"
147
+ done
148
+ echo 'Device ready'
134
149
 
135
150
  #{('yes | mkfs -t ' + vol_spec['filesystem'] + ' ' + '$device') if created}
136
151
  #{("mkdir -p '#{vol_spec['mount']}'") if vol_spec['mount']}
@@ -1,4 +1,4 @@
1
1
  module Rubber
2
- VERSION = "2.0.1"
2
+ VERSION = "2.0.2"
3
3
  end
4
4
 
data/rubber.gemspec CHANGED
@@ -39,6 +39,7 @@ Gem::Specification.new do |s|
39
39
  s.add_development_dependency('test-unit')
40
40
  s.add_development_dependency('shoulda-context')
41
41
  s.add_development_dependency('mocha')
42
+ s.add_development_dependency('awesome_print')
42
43
  end
43
44
 
44
45
 
@@ -74,7 +74,11 @@ NameVirtualHost *:<%= rubber_env.web_tools_ssl_port %>
74
74
 
75
75
  host = "#{name}.#{rubber_env.full_host}"
76
76
  host_and_port = "#{host}:#{rubber_env.web_tools_ssl_port}"
77
- proxy_url = "http://#{proxy_host}:#{settings.port}#{settings.path}"
77
+
78
+ # don't use settings.path here - mapping the host/port is sufficient,
79
+ # and path can be done in tools-index.html. This allows admin sites
80
+ # that hit other paths on same host/port to still function, e.g. elasticsearch
81
+ proxy_url = "http://#{proxy_host}:#{settings.port}/"
78
82
  %>
79
83
  <VirtualHost *:<%= rubber_env.web_tools_ssl_port %>>
80
84
  ServerName <%= host %>
@@ -30,7 +30,7 @@
30
30
  # graphite web app)
31
31
  Array(rubber_env.web_tools_proxies).each do |name, settings|
32
32
  %>
33
- <li><a href="https://<%= name %>.<%= tools_host.full_name %>:<%= rubber_env.web_tools_ssl_port %>/"><%= name.capitalize %></a></li>
33
+ <li><a href="https://<%= name %>.<%= tools_host.full_name %>:<%= rubber_env.web_tools_ssl_port %><%= settings.path || '/' %>"><%= name.capitalize %></a></li>
34
34
  <% end %>
35
35
 
36
36
  </ul>
@@ -16,6 +16,3 @@ RAILS_ENV=<%= Rubber.env %>
16
16
 
17
17
  # Roll all rails logs at midnight
18
18
  0 0 * * * <%= Rubber.root %>/script/rubber cron --task util:rotate_logs --directory=<%= Rubber.root %>/log
19
-
20
- # Automatically set the clock for all machines
21
- <%= rand(60) %> 4 * * * <%= Rubber.root %>/script/rubber cron ntpdate pool.ntp.org
@@ -0,0 +1,7 @@
1
+ <%
2
+ @path = "/etc/sysctl.d/60-ntp.conf"
3
+ @post = "/usr/sbin/service procps start"
4
+ %>
5
+
6
+ # allows us to set machine clock (xen clocks from ec2 tend to drift a lot)
7
+ xen.independent_wallclock=1
@@ -0,0 +1,57 @@
1
+ <%
2
+ @path = "/etc/ntp.conf"
3
+ @post = "/usr/sbin/service ntp restart"
4
+ %>
5
+ # /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help
6
+
7
+ driftfile /var/lib/ntp/ntp.drift
8
+
9
+
10
+ # Enable this if you want statistics to be logged.
11
+ #statsdir /var/log/ntpstats/
12
+
13
+ statistics loopstats peerstats clockstats
14
+ filegen loopstats file loopstats type day enable
15
+ filegen peerstats file peerstats type day enable
16
+ filegen clockstats file clockstats type day enable
17
+
18
+
19
+ # You do need to talk to an NTP server or two (or three).
20
+ server 0.us.pool.ntp.org
21
+ server 1.us.pool.ntp.org
22
+ server 2.us.pool.ntp.org
23
+ server 3.us.pool.ntp.org
24
+
25
+ <% rubber_instances.each do |ic| %>
26
+ peer <%= ic.full_name %>
27
+ <% end %>
28
+
29
+ # Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for
30
+ # details. The web page <http://support.ntp.org/bin/view/Support/AccessRestrictions>
31
+ # might also be helpful.
32
+ #
33
+ # Note that "restrict" applies to both servers and clients, so a configuration
34
+ # that might be intended to block requests from certain clients could also end
35
+ # up blocking replies from your own upstream servers.
36
+
37
+ # By default, exchange time with everybody, but don't allow configuration.
38
+ restrict -4 default kod notrap nomodify nopeer noquery
39
+ restrict -6 default kod notrap nomodify nopeer noquery
40
+
41
+ # Local users may interrogate the ntp server more closely.
42
+ restrict 127.0.0.1
43
+ restrict ::1
44
+
45
+ # Clients from this (example!) subnet have unlimited access, but only if
46
+ # cryptographically authenticated.
47
+ #restrict 192.168.123.0 mask 255.255.255.0 notrust
48
+
49
+
50
+ # If you want to provide time to your local subnet, change the next line.
51
+ # (Again, the address is an example only.)
52
+ #broadcast 192.168.123.255
53
+
54
+ # If you want to listen to time broadcasts on your local subnet, de-comment the
55
+ # next lines. Please do this only if you trust everybody on the network!
56
+ #disable auth
57
+ #broadcastclient
@@ -9,7 +9,7 @@ app_user: app
9
9
  admin_email: "root@#{full_host}"
10
10
 
11
11
  # OPTIONAL: If not set, you won't be able to access web_tools
12
- # server (munin stats, monit status, etc)
12
+ # server (graphite, graylog, monit status, haproxy status, etc)
13
13
  # web_tools_user: admin
14
14
  # web_tools_password: sekret
15
15
 
@@ -169,7 +169,7 @@ prompt_for_security_group_sync: true
169
169
  # OPTIONAL: The packages to install on all instances
170
170
  # You can install a specific version of a package by using a sub-array of pkg, version
171
171
  # For example, packages: [[rake, 0.7.1], irb]
172
- packages: [postfix, build-essential, git-core, ec2-ami-tools, libxslt-dev]
172
+ packages: [postfix, build-essential, git-core, ec2-ami-tools, libxslt-dev, ntp]
173
173
 
174
174
  # OPTIONAL: gem sources to setup for rubygems
175
175
  # gemsources: ["http://rubygems.org", "http://gems.github.com"]
@@ -1,5 +1,5 @@
1
1
  if Rubber::Util::is_bundler?
2
- append_to_file "Gemfile", "gem 'rubber', '#{Rubber.version}'\n"
2
+ append_to_file "Gemfile", "gem 'rubber'\n"
3
3
 
4
4
  # for cron-sh
5
5
  append_to_file 'Gemfile', "gem 'open4'\n"
@@ -12,6 +12,9 @@ namespace :rubber do
12
12
  wget --no-check-certificate -qNP /tmp https://github.com/downloads/elasticsearch/elasticsearch/elasticsearch-#{rubber_env.elasticsearch_version}.zip
13
13
  unzip -d #{rubber_env.elasticsearch_prefix} /tmp/elasticsearch-#{rubber_env.elasticsearch_version}.zip
14
14
  rm /tmp/elasticsearch-#{rubber_env.elasticsearch_version}.zip
15
+
16
+ #{rubber_env.elasticsearch_dir}/bin/plugin -install mobz/elasticsearch-head
17
+
15
18
  fi
16
19
  ENDSCRIPT
17
20
  end
@@ -1,4 +1,4 @@
1
- elasticsearch_version: 0.18.7
1
+ elasticsearch_version: 0.19.3
2
2
  elasticsearch_prefix: /usr/local
3
3
  elasticsearch_dir: "#{elasticsearch_prefix}/elasticsearch-#{elasticsearch_version}"
4
4
  elasticsearch_data_dir: "/mnt/elasticsearch/data"
@@ -9,4 +9,10 @@ elasticsearch_http_port: 9200
9
9
 
10
10
  roles:
11
11
  elasticsearch:
12
- packages: [openjdk-6-jdk]
12
+ packages: [openjdk-7-jdk]
13
+
14
+ web_tools_proxies:
15
+ elasticsearch:
16
+ role: elasticsearch
17
+ port: "#{elasticsearch_http_port}"
18
+ path: /_plugin/head/
@@ -36,7 +36,7 @@ Simple graphite dashboard cycler for use on a large display - e.g. googletv/chro
36
36
 
37
37
  <script type="text/javascript">
38
38
 
39
- // To test this locally, edit ROOT_URL to point to graphite webapp
39
+ // To test this locally, edit ROOT_URL to point to graphite webapp (without trailing slash)
40
40
  // To allow xhttp to graphite from html loaded from local file, run chrome with:
41
41
  // /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --disable-web-security
42
42
 
@@ -91,7 +91,7 @@ Simple graphite dashboard cycler for use on a large display - e.g. googletv/chro
91
91
  self.dashboardList = function() {
92
92
  console.log("Fetching all dashboards");
93
93
 
94
- return $.getJSON(ROOT_URL + '/graphite/dashboard/find/', {'query': ''});
94
+ return $.getJSON(ROOT_URL + '/dashboard/find/', {'query': ''});
95
95
  }
96
96
 
97
97
  self.detailFromDashboardList = function(data) {
@@ -111,7 +111,7 @@ Simple graphite dashboard cycler for use on a large display - e.g. googletv/chro
111
111
  var name = dashboard["name"];
112
112
  console.log("Fetching dashboard detail for " + name);
113
113
 
114
- return $.getJSON(ROOT_URL + '/graphite/dashboard/load/' + name, {}, function(data) {
114
+ return $.getJSON(ROOT_URL + '/dashboard/load/' + name, {}, function(data) {
115
115
 
116
116
  console.log("Got dashboard detail for " + name);
117
117
  console.log(data);
@@ -214,7 +214,7 @@ Simple graphite dashboard cycler for use on a large display - e.g. googletv/chro
214
214
  params = $.extend(true, params, defn); // deep copy
215
215
  params["target"] = params["target"][0];
216
216
 
217
- var url = ROOT_URL + "/graphite/render?" + $.param(params);
217
+ var url = ROOT_URL + "/render?" + $.param(params);
218
218
 
219
219
  return url;
220
220
  });
@@ -26,7 +26,7 @@ namespace :rubber do
26
26
  after "deploy:update_code", "rubber:passenger:remove_config_ru" if Rubber::Util.is_rails?
27
27
 
28
28
  task :remove_config_ru, :roles => :passenger do
29
- rsudo "rm -f #{current_release}/config.ru"
29
+ rsudo "rm -f #{releases_path}/*/config.ru"
30
30
  end
31
31
 
32
32
  # passenger depends on apache for start/stop/restart, just need these defined
@@ -1,4 +1,4 @@
1
- redis_server_version: 2.4.11
1
+ redis_server_version: 2.4.12
2
2
  redis_server_pid_file: /var/run/redis-server.pid
3
3
  redis_server_conf_file: /etc/redis.conf
4
4
  redis_server_log_file: /var/log/redis-server.log
@@ -12,7 +12,7 @@ stop on runlevel [016]
12
12
 
13
13
  script
14
14
  cd <%= Rubber.root %>
15
- exec sudo -u <%= rubber_env.app_user %> /bin/bash -l -c 'cd <%= Rubber.root %> && exec bundle exec resque-pool > log/resque-pool.log 2>&1'
15
+ exec sudo -u <%= rubber_env.app_user %> /bin/bash -l -c 'cd <%= Rubber.root %> && exec bundle exec resque-pool >> log/resque-pool.log 2>&1'
16
16
  end script
17
17
 
18
18
  post-start script
@@ -25,7 +25,7 @@ end script
25
25
  # so that we dont end up killing running jobs
26
26
  #
27
27
  pre-stop script
28
- pid=`cat /var/run/resque-pool.pid`
28
+ pid=`cat <%= rubber_env.resque_pool_pid_file %>`
29
29
  kill -INT $pid
30
30
  while ps -p $pid > /dev/null; do sleep 0.1; done
31
31
  rm -f <%= rubber_env.resque_pool_pid_file %>
@@ -9,7 +9,7 @@ namespace :rubber do
9
9
 
10
10
  task :install, :roles => :zookeeper do
11
11
  rubber.sudo_script 'install_zookeeper', <<-ENDSCRIPT
12
- if [[ ! -f "#{rubber_env.zookeeper_install_dir}" ]]; then
12
+ if [[ ! -d "#{rubber_env.zookeeper_install_dir}" ]]; then
13
13
  # Fetch the sources.
14
14
  wget -qNP /tmp #{rubber_env.zookeeper_package_url}
15
15
  tar -C #{File.dirname rubber_env.zookeeper_install_dir} -zxf /tmp/#{File.basename rubber_env.zookeeper_package_url}
data/test/dns/fog_test.rb CHANGED
@@ -1,147 +1,171 @@
1
1
  require File.expand_path(File.join(__FILE__, '../..', 'test_helper'))
2
2
  require 'rubber/dns/fog'
3
- #require 'rexml/document'
4
3
 
5
4
  class FogTest < Test::Unit::TestCase
6
5
 
7
6
  @envs = []
8
-
7
+
9
8
  env = {'credentials' =>
10
- {'provider' => 'zerigo', 'zerigo_email' => 'xxx', 'zerigo_token' => 'yyy'}}
9
+ {'provider' => 'zerigo', 'zerigo_email' => 'xxx', 'zerigo_token' => 'yyy'}}
11
10
  @envs << Rubber::Configuration::Environment::BoundEnv.new(env, nil, nil)
12
11
 
13
- # no mocks for aws dns yet
14
- #env = {'credentials' =>
15
- # {'provider' => 'aws', 'aws_access_key_id' => 'xxx', 'aws_secret_access_key' => 'yyy'}}
16
- #@envs << Rubber::Configuration::Environment::BoundEnv.new(env, nil, nil)
12
+ unless ENV['CI']
13
+ secret = YAML.load_file(File.expand_path("~/rubber-secret.yml")) rescue {}
14
+ access_key = secret['cloud_providers']['aws']['access_key']
15
+ access_secret = secret['cloud_providers']['aws']['secret_access_key']
16
+ env = {'credentials' =>
17
+ {'provider' => 'aws', 'aws_access_key_id' => access_key, 'aws_secret_access_key' => access_secret},
18
+ 'name_includes_domain' => true,
19
+ 'name_includes_trailing_period' => true}
20
+ # no mocks for aws dns yet
21
+ @envs << Rubber::Configuration::Environment::BoundEnv.new(env, nil, nil)
22
+ end
23
+
24
+ def all_test_zones(dns=@dns)
25
+ dns.client.zones.all.find_all {|z| z.domain =~ /rubbertest/ }
26
+ end
17
27
 
28
+ def destroy_test_domains
29
+ all_test_zones(Rubber::Dns::Fog.new(@env)).each do |zone|
30
+ zone.records.all.each do |record|
31
+ record.destroy
32
+ end
33
+ zone.destroy
34
+ end
35
+ end
18
36
 
37
+ env = @envs.first
19
38
  @envs.each do |env|
20
-
21
- context "fog #{env.credentials.provider} dns" do
22
-
23
- setup do
24
- @env = env
25
- end
26
-
27
- context "find_or_create" do
28
-
29
- should "create domain if it doesn't exist" do
30
- @dns = Rubber::Dns::Fog.new(@env)
31
-
32
- assert_equal 0, @dns.client.zones.all.size
33
-
34
- zone0 = @dns.find_or_create_zone("example1.com")
39
+
40
+ context "fog #{env.credentials.provider} dns" do
41
+
42
+ setup do
43
+ @env = env
44
+
45
+ # no mocks for aws dns yet
46
+ if env.credentials.provider == 'aws'
47
+ Fog.unmock!
48
+ destroy_test_domains
49
+ end
35
50
 
36
- assert_equal 1, @dns.client.zones.all.size
37
- zone1 = @dns.client.zones.all.find {|z| z.domain =~ /^example1.com/ }
38
- assert zone1
39
- assert_equal zone0.id, zone1.id
40
- assert_equal zone0.domain, zone1.domain
41
- end
42
-
43
- should "match the same domain that was passed" do
44
51
  @dns = Rubber::Dns::Fog.new(@env)
45
-
46
- assert_equal 0, @dns.client.zones.all.size
47
-
48
- zone0 = @dns.find_or_create_zone("abcfoo.com")
49
- zone1 = @dns.find_or_create_zone("foo.com")
50
-
51
- assert_equal 2, @dns.client.zones.all.size
52
-
53
- zone2 = @dns.client.zones.all.find {|z| z.domain =~ /^foo.com/ }
54
- assert zone2
55
- assert_equal zone1.id, zone2.id
56
- assert_equal zone1.domain, zone2.domain
57
52
  end
58
53
 
59
- should "do nothing if domain already exists" do
60
- @dns = Rubber::Dns::Fog.new(@env)
61
-
62
- @dns.client.zones.create(:domain => 'example1.com')
63
- assert_equal 1, @dns.client.zones.all.size
64
-
65
- zone0 = @dns.find_or_create_zone("example1.com")
66
-
67
- assert_equal 1, @dns.client.zones.all.size
68
- zone1 = @dns.client.zones.all.find {|z| z.domain =~ /^example1.com/ }
69
- assert_equal zone0.id, zone1.id
70
- assert_equal zone0.domain, zone1.domain
71
- end
54
+ context "find_or_create" do
72
55
 
73
- end
74
-
75
- context "records" do
76
-
77
- setup do
78
- @dns = Rubber::Dns::Fog.new(@env)
56
+ should "create domain if it doesn't exist" do
57
+ assert_equal 0, all_test_zones.size
79
58
 
80
- @domain = "example1.com"
81
- @zone = @dns.find_or_create_zone(@domain)
82
- end
83
-
84
- should "find_records" do
85
- # Set up some sample records.
86
- first = @zone.records.create(:value => '172.16.16.1', :name => 'host1', :domain => @domain, :type => 'A')
87
- @zone.records.create(:value => '172.16.16.2', :domain => @domain, :type => 'A')
59
+ zone0 = @dns.find_or_create_zone("rubbertest.com")
88
60
 
89
- # Search for records through the rubber DNS interface and make sure whe get what we expected.
61
+ assert_equal 1, all_test_zones.size
62
+ zone1 = all_test_zones.find {|z| z.domain =~ /^rubbertest.com/ }
63
+ assert zone1
64
+ assert_equal zone0.id, zone1.id
65
+ assert_equal zone0.domain, zone1.domain
66
+ end
90
67
 
91
- # Wildcard search.
92
- records = @dns.find_host_records(:host => '*', :domain => @domain)
93
- assert_equal 2, records.size
94
- assert_equal({:type => "A", :host => "host1", :domain => @domain, :id => first.id, :data=>"172.16.16.1", :ttl => 3600, :priority => 0}, records.first)
68
+ should "match the same domain that was passed" do
69
+ assert_equal 0, all_test_zones.size
95
70
 
96
- # Blank hostname search.
97
- records = @dns.find_host_records(:host => '', :domain => @domain)
98
- assert_equal 1, records.size
99
- assert_equal '', records.first[:host]
71
+ zone0 = @dns.find_or_create_zone("abcrubbertest.com")
72
+ zone1 = @dns.find_or_create_zone("rubbertest.com")
100
73
 
101
- # Specific hostname search.
102
- records = @dns.find_host_records(:host => 'host1', :domain => @domain)
103
- assert_equal 1, records.size
104
- assert_equal 'host1', records.first[:host]
105
- end
74
+ assert_equal 2, all_test_zones.size
106
75
 
107
- should "create_record" do
108
- @dns.create_host_record({:host => 'newhost', :domain => @domain, :data => '1.1.1.1', :type => 'A', :ttl => '333'})
76
+ zone2 = all_test_zones.find {|z| z.domain =~ /^rubbertest.com/ }
77
+ assert zone2
78
+ assert_equal zone1.id, zone2.id
79
+ assert_equal zone1.domain, zone2.domain
80
+ end
109
81
 
110
- assert_equal @zone.records.all.size, 1
111
- record = @zone.records.first
82
+ should "do nothing if domain already exists" do
83
+ @dns.client.zones.create(:domain => 'rubbertest.com')
84
+ assert_equal 1, all_test_zones.size
112
85
 
113
- assert_equal 'newhost', record.name
114
- assert_equal "newhost.#{@domain}", record.domain
115
- assert_equal '1.1.1.1', record.value
116
- assert_equal 'A', record.type
117
- assert_equal 333, record.ttl
118
- end
86
+ zone0 = @dns.find_or_create_zone("rubbertest.com")
119
87
 
120
- should "destroy_record" do
121
- # Create the record we want to test destroying.
122
- @zone.records.create(:type => 'A', :value => '172.16.16.1', :name => 'host1', :domain => @domain)
123
- assert_equal 1, @zone.records.all.size
88
+ assert_equal 1, all_test_zones.size
89
+ zone1 = all_test_zones.find {|z| z.domain =~ /^rubbertest.com/ }
90
+ assert_equal zone0.id, zone1.id
91
+ assert_equal zone0.domain, zone1.domain
92
+ end
124
93
 
125
- @dns.destroy_host_record({:host => 'host1', :domain => @domain})
126
-
127
- assert_equal 0, @zone.records.all.size
128
94
  end
95
+
96
+ context "records" do
129
97
 
130
- should "update_record" do
131
- params = {:host => 'host1', :domain => @domain, :data => "1.1.1.1"}
132
- new = {:host => 'host1', :domain => @domain, :data => "1.1.1.2"}
133
-
134
- @zone.records.create(:type => 'A', :value => '1.1.1.1', :name => 'host1', :domain => @domain)
98
+ setup do
99
+ @domain = "rubbertest.com"
100
+ @zone = @dns.find_or_create_zone(@domain)
101
+ end
135
102
 
136
- @dns.update_host_record(params, new)
103
+ should "create_record" do
104
+ @dns.create_host_record({:host => 'newhost', :domain => @domain, :data => '1.1.1.1', :type => 'A', :ttl => '333'})
105
+
106
+ assert_equal @zone.records.all.size, 1
107
+ record = @zone.records.first
108
+ attributes = @dns.host_to_opts(record)
109
+
110
+ assert_equal 'newhost', attributes[:host]
111
+ assert_equal @domain, attributes[:domain]
112
+ assert_equal '1.1.1.1', attributes[:data]
113
+ assert_equal 'A', attributes[:type]
114
+ assert_equal 333, attributes[:ttl]
115
+ end
116
+
117
+ should "destroy_record" do
118
+ # Create the record we want to test destroying.
119
+ @dns.create_host_record({:host => 'newhost', :domain => @domain, :data => '1.1.1.1', :type => 'A'})
120
+ assert_equal 1, @zone.records.all.size
121
+
122
+ @dns.destroy_host_record({:host => 'newhost', :domain => @domain})
123
+
124
+ assert_equal 0, @zone.records.all.size
125
+ end
126
+
127
+ should "update_record" do
128
+ params = {:host => 'host1', :domain => @domain, :data => "1.1.1.1"}
129
+ new = {:host => 'host1', :domain => @domain, :data => "1.1.1.2"}
130
+
131
+ @dns.create_host_record({:host => 'host1', :domain => @domain, :data => '1.1.1.1', :type => 'A'})
132
+ assert_equal 1, @zone.records.all.size
133
+
134
+ @dns.update_host_record(params, new)
135
+ assert_equal 1, @zone.records.all.size
136
+
137
+ record = @zone.records.all.first
138
+ attributes = @dns.host_to_opts(record)
139
+ assert_equal '1.1.1.2', attributes[:data]
140
+ end
141
+
142
+ should "find_records" do
143
+ # Set up some sample records.
144
+ created = []
145
+ created << {:host => 'host1', :domain => @domain, :data => '1.1.1.1', :type => 'A'}
146
+ created << {:host => '', :domain => @domain, :data => '1.1.1.1', :type => 'A'}
147
+ created.each {|r| @dns.create_host_record(r) }
148
+
149
+ # Search for records through the rubber DNS interface and make sure whe get what we expected.
150
+
151
+ # Wildcard search.
152
+ records = @dns.find_host_records(:host => '*', :domain => @domain)
153
+ assert_equal 2, records.size
154
+
155
+ # Blank hostname search.
156
+ records = @dns.find_host_records(:host => '', :domain => @domain)
157
+ assert_equal 1, records.size
158
+ assert_equal '', records.first[:host]
159
+
160
+ # Specific hostname search.
161
+ records = @dns.find_host_records(:host => 'host1', :domain => @domain)
162
+ assert_equal 1, records.size
163
+ assert_equal 'host1', records.first[:host]
164
+ end
137
165
 
138
- record = @zone.records.all.first
139
- assert_equal '1.1.1.2', record.value
140
166
  end
141
167
 
142
168
  end
143
-
144
- end
145
-
169
+
146
170
  end
147
171
  end
data/test/test_helper.rb CHANGED
@@ -7,13 +7,16 @@ require 'test/unit'
7
7
  require 'mocha'
8
8
  require 'shoulda-context'
9
9
  require 'pp'
10
+ require 'ap'
10
11
  require 'tempfile'
11
-
12
12
  require 'fog'
13
- Fog.mock!
14
13
 
15
14
  class Test::Unit::TestCase
16
- def teardown
15
+ setup do
16
+ Fog.mock!
17
+ end
18
+
19
+ teardown do
17
20
  Fog::Mock.reset
18
21
  end
19
22
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubber
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-04-29 00:00:00.000000000 Z
13
+ date: 2012-05-08 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: capistrano
@@ -172,6 +172,22 @@ dependencies:
172
172
  - - ! '>='
173
173
  - !ruby/object:Gem::Version
174
174
  version: '0'
175
+ - !ruby/object:Gem::Dependency
176
+ name: awesome_print
177
+ requirement: !ruby/object:Gem::Requirement
178
+ none: false
179
+ requirements:
180
+ - - ! '>='
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
183
+ type: :development
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ none: false
187
+ requirements:
188
+ - - ! '>='
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
175
191
  description: ! " The rubber plugin enables relatively complex multi-instance deployments
176
192
  of RubyOnRails applications to\n Amazon's Elastic Compute Cloud (EC2). Like
177
193
  capistrano, rubber is role based, so you can define a set\n of configuration
@@ -254,6 +270,8 @@ files:
254
270
  - templates/base/Capfile
255
271
  - templates/base/config/deploy.rb
256
272
  - templates/base/config/rubber/common/crontab
273
+ - templates/base/config/rubber/common/ntp-sysctl.conf
274
+ - templates/base/config/rubber/common/ntp.conf
257
275
  - templates/base/config/rubber/common/rsyslog.conf
258
276
  - templates/base/config/rubber/common/rubber.profile
259
277
  - templates/base/config/rubber/deploy-setup.rb
@@ -591,7 +609,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
591
609
  version: '0'
592
610
  segments:
593
611
  - 0
594
- hash: -1797429455710097314
612
+ hash: -340677959787113833
595
613
  required_rubygems_version: !ruby/object:Gem::Requirement
596
614
  none: false
597
615
  requirements:
@@ -600,46 +618,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
600
618
  version: '0'
601
619
  segments:
602
620
  - 0
603
- hash: -1797429455710097314
621
+ hash: -340677959787113833
604
622
  requirements: []
605
623
  rubyforge_project: rubber
606
- rubygems_version: 1.8.21
624
+ rubygems_version: 1.8.23
607
625
  signing_key:
608
626
  specification_version: 3
609
627
  summary: A capistrano plugin for managing multi-instance deployments to the cloud
610
628
  (ec2)
611
- test_files:
612
- - test/cloud/aws_table_store_test.rb
613
- - test/cloud/aws_test.rb
614
- - test/cloud/fog_storage_test.rb
615
- - test/cloud/fog_test.rb
616
- - test/command_test.rb
617
- - test/dns/fog_test.rb
618
- - test/environment_test.rb
619
- - test/fixtures/basic/common/bar.conf
620
- - test/fixtures/basic/common/foo.conf
621
- - test/fixtures/basic/host/host1/foo.conf
622
- - test/fixtures/basic/host/host2/foo.conf
623
- - test/fixtures/basic/role/role1/foo.conf
624
- - test/fixtures/basic/role/role2/foo.conf
625
- - test/fixtures/basic/rubber-extra.yml
626
- - test/fixtures/basic/rubber.yml
627
- - test/fixtures/expansion/rubber.yml
628
- - test/fixtures/generator_order/common/a_first.conf
629
- - test/fixtures/generator_order/common/z_last.conf
630
- - test/fixtures/generator_order/host/host1/a_first.conf
631
- - test/fixtures/generator_order/host/host1/z_last.conf
632
- - test/fixtures/generator_order/role/role1/a_first.conf
633
- - test/fixtures/generator_order/role/role1/z_last.conf
634
- - test/fixtures/generator_order/role/role2/a_first.conf
635
- - test/fixtures/generator_order/role/role2/z_last.conf
636
- - test/fixtures/instance_expansion/instance-test.yml
637
- - test/fixtures/instance_expansion/rubber.yml
638
- - test/fixtures/nested/rubber.yml
639
- - test/fixtures/secret/rubber.yml
640
- - test/fixtures/secret/secret.yml
641
- - test/generator_test.rb
642
- - test/instance_test.rb
643
- - test/test-rails-template.rb
644
- - test/test_helper.rb
645
- - test/util_test.rb
629
+ test_files: []