hubcap 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,11 +13,6 @@ class Hubcap::Application < Hubcap::Group
13
13
  end
14
14
 
15
15
 
16
- def extend_tree(outs)
17
- outs << "Load: #{@recipe_paths.inspect}" if @recipe_paths.any?
18
- end
19
-
20
-
21
16
  class Hubcap::NestedApplicationDisallowed < StandardError; end
22
17
 
23
18
  end
data/lib/hubcap/group.rb CHANGED
@@ -235,7 +235,11 @@ class Hubcap::Group
235
235
  def resolv(*hnames)
236
236
  if hnames.size == 1
237
237
  result = lookup(hnames.first)
238
- result.match(IP_PATTERN) ? result : Resolv.getaddress(result)
238
+ begin
239
+ result.match(IP_PATTERN) ? result : Resolv.getaddress(result)
240
+ rescue Resolv::ResolvError => e
241
+ raise(Hubcap::ServerAddressUnknown, hnames.first)
242
+ end
239
243
  else
240
244
  hnames.collect { |hname| resolv(hname) }
241
245
  end
@@ -281,28 +285,6 @@ class Hubcap::Group
281
285
  end
282
286
 
283
287
 
284
- # Returns a formatted string of all the key details for this group, and
285
- # recurses into each child.
286
- #
287
- def tree(indent = " ")
288
- outs = [self.class.name.split('::').last.upcase, "Name: #{@name}"]
289
- outs << "Atts: #{@cap_attributes.inspect}" if @cap_attributes.any?
290
- if @cap_roles == @puppet_roles
291
- outs << "Role: #{@cap_roles.inspect}" if @cap_roles.any?
292
- else
293
- cr = @cap_roles.any? ? 'Cap - '+@cap_roles.inspect : nil
294
- pr = @puppet_roles.any? ? 'Puppet - '+@puppet_roles.inspect : nil
295
- outs << "Role: #{[cr,pr].compact.join(' ')}" if cr || pr
296
- end
297
- outs << "Pram: #{@params.inspect}" if @params.any?
298
- extend_tree(outs) if respond_to?(:extend_tree)
299
- if @children.any?
300
- @children.each { |child| outs << child.tree(indent+" ") }
301
- end
302
- outs.join("\n#{indent}")
303
- end
304
-
305
-
306
288
  private
307
289
 
308
290
  def add_child(category, child)
@@ -323,5 +305,6 @@ class Hubcap::Group
323
305
  class Hubcap::GroupWithoutParent < StandardError; end
324
306
  class Hubcap::InvalidParamKeyType < StandardError; end
325
307
  class Hubcap::HostCircularReference < StandardError; end
308
+ class Hubcap::ServerAddressUnknown < StandardError; end
326
309
 
327
310
  end
data/lib/hubcap/hub.rb CHANGED
@@ -28,11 +28,6 @@ class Hubcap::Hub < Hubcap::Group
28
28
  end
29
29
 
30
30
 
31
- def extend_tree(outs)
32
- outs << "Sets: #{@cap_sets.inspect}"
33
- end
34
-
35
-
36
31
  # Does a few things:
37
32
  #
38
33
  # * Sets the :hubcap variable in the Capistrano instance.
@@ -52,11 +47,14 @@ class Hubcap::Hub < Hubcap::Group
52
47
 
53
48
  cap.instance_eval {
54
49
  require('hubcap/recipes/servers')
50
+ require('hubcap/recipes/ssh')
55
51
  require('hubcap/recipes/puppet')
56
52
  }
57
53
 
58
54
  # Declare the servers.
59
55
  servers.each { |svr|
56
+ # Raises an error if we cannot resolve the resulting address with DNS.
57
+ resolv(svr.address) unless svr.address.match(Hubcap::Group::IP_PATTERN)
60
58
  opts = {
61
59
  :name => svr.name,
62
60
  :full_name => svr.history.join('.')
@@ -5,24 +5,78 @@ Capistrano::Configuration.instance(:must_exist).load do
5
5
  desc <<-DESC
6
6
  Lists all the servers that match the filter used when Hubcap was loaded.
7
7
  DESC
8
+ task(:default) do
9
+ outs = hubcap.servers.collect { |s|
10
+ out = ["#{s.name}#{"(#{s.address})" if s.name != s.address}"]
11
+ if app = s.application_parent
12
+ out << " Appli: #{app.name}"
13
+ end
14
+ out << [" Attrs: "+s.cap_attributes.inspect] if s.cap_attributes.any?
15
+ if s.cap_roles == s.puppet_roles
16
+ out << " Roles: #{s.cap_roles}"
17
+ else
18
+ cr = s.cap_roles.any? ? 'Cap - '+s.cap_roles.inspect : nil
19
+ pr = s.puppet_roles.any? ? 'Puppet - '+s.puppet_roles.inspect : nil
20
+ out << " Roles: #{[cr,pr].compact.join(" | ")}" if cr || pr
21
+ end
22
+ out << " Parms: #{s.params.inspect}" if s.params.any?
23
+ out.join("\n")
24
+ }
25
+ puts(outs.join("\n\n"))
26
+ end
27
+
28
+
8
29
  task(:list) do
9
- puts(hubcap.servers.collect(&:tree))
30
+ outs = hubcap.servers.collect { |s|
31
+ out = []
32
+ out << s.history.join('.')
33
+ out << s.address
34
+ out << "App[#{s.application_parent.name}]" if s.application_parent
35
+ if s.cap_roles == s.puppet_roles
36
+ out << "Role#{s.cap_roles}"
37
+ else
38
+ out << "Cap#{s.cap_roles}" if s.cap_roles.any?
39
+ out << "Pup#{s.puppet_roles}" if s.puppet_roles.any?
40
+ end
41
+ out.join(', ')
42
+ }
43
+ puts(outs.join("\n"))
10
44
  end
11
45
 
46
+
12
47
  desc <<-DESC
13
48
  Show the entire Hubcap configuration tree for the given filter.
14
49
  DESC
15
50
  task(:tree) do
16
- puts(hubcap.tree)
51
+ tree = lambda { |obj, indent|
52
+ outs = [obj.class.name.split('::').last.upcase+': '+obj.name]
53
+ atts = obj.instance_variable_get(:@cap_attributes)
54
+ croles = obj.instance_variable_get(:@cap_roles)
55
+ proles = obj.instance_variable_get(:@puppet_roles)
56
+ prams = obj.instance_variable_get(:@params)
57
+ outs << "Atts: #{atts.inspect}" if atts.any?
58
+ if croles == proles
59
+ outs << "Role: #{croles.inspect}" if croles.any?
60
+ else
61
+ cr = croles.any? ? 'Cap - '+croles.inspect : nil
62
+ pr = proles.any? ? 'Puppet - '+proles.inspect : nil
63
+ outs << "Role: #{[cr,pr].compact.join(' ')}" if cr || pr
64
+ end
65
+ outs << "Parm: #{prams.inspect}" if prams.any?
66
+ if obj.is_a?(Hubcap::Hub)
67
+ outs << "Sets: #{obj.instance_variable_get(:@cap_sets).inspect}"
68
+ elsif obj.is_a?(Hubcap::Application)
69
+ recipes = obj.instance_variable_get(:@recipe_paths)
70
+ outs << "Load: #{recipes.inspect}" if recipes.any?
71
+ end
72
+ if obj.children.any?
73
+ obj.children.each { |child| outs << tree.call(child, indent+" ") }
74
+ end
75
+ outs.join("\n#{indent}")
76
+ }
77
+ puts(tree.call(hubcap, ' '))
17
78
  end
18
79
 
19
80
  end
20
81
 
21
-
22
- task(:ssh) do
23
- host = hubcap.servers.first.address
24
- puts("SSH connect to: #{user}@#{host}")
25
- system("ssh -A #{user}@#{host}")
26
- end
27
-
28
82
  end
@@ -0,0 +1,15 @@
1
+ Capistrano::Configuration.instance(:must_exist).load do
2
+
3
+ namespace(:ssh) do
4
+
5
+ desc("Shells out to SSH for the first server that matches the filter.")
6
+ task(:default) do
7
+ host = hubcap.servers.first.address
8
+ puts("SSH connect to: #{user}@#{host}")
9
+ system("ssh -A #{user}@#{host}")
10
+ end
11
+
12
+ end
13
+
14
+ end
15
+
data/lib/hubcap/server.rb CHANGED
@@ -36,6 +36,7 @@ class Hubcap::Server < Hubcap::Group
36
36
  return p if p.kind_of?(Hubcap::Application)
37
37
  p = p.instance_variable_get(:@parent)
38
38
  end
39
+ nil
39
40
  end
40
41
 
41
42
 
@@ -1,5 +1,5 @@
1
1
  module Hubcap
2
2
 
3
- VERSION = '0.0.4'
3
+ VERSION = '0.0.5'
4
4
 
5
5
  end
data/test/data/example.rb CHANGED
@@ -52,16 +52,16 @@ application('example', :recipes => 'deploy') {
52
52
  group('app') {
53
53
  role(:app)
54
54
  param('env' => prod_env.merge('FORCE_SSL' => '1'))
55
- server('app-1.example.com')
56
- server('app-2.example.com')
57
- server('app-3.example.com')
55
+ server('example.com')
56
+ server('example.org')
57
+ server('example.net')
58
58
  }
59
59
  group('db') {
60
60
  role(:db)
61
- server('db-1.example.com')
62
- server('db-2.example.com')
61
+ server('example.com')
62
+ server('example.net')
63
63
  }
64
- server('queue-1.example.com') {
64
+ server('example.com') {
65
65
  role(:queue)
66
66
  }
67
67
  }
data/test/data/readme.rb CHANGED
@@ -10,7 +10,7 @@ application('readme', :recipes => 'deploy') {
10
10
  # Puppet will have a $::exception_subject_prefix variable on these servers.
11
11
  param('exception_subject_prefix' => '[STAGING] ')
12
12
  # For simple staging, just one server that does everything.
13
- server('readme.stage') {
13
+ server('readme.stage', :address => '0.0.0.0') {
14
14
  role(:cap => [:web, :app, :db], :puppet => ['proxy', 'app', 'db'])
15
15
  }
16
16
  }
@@ -21,7 +21,7 @@ class Hubcap::TestHub < Test::Unit::TestCase
21
21
  application('a') {
22
22
  group('g') {
23
23
  role(:baseline)
24
- server('s') { role(:everything) }
24
+ server('s', :address => '0.0.0.0') { role(:everything) }
25
25
  }
26
26
  }
27
27
  }
@@ -34,8 +34,8 @@ class Hubcap::TestHub < Test::Unit::TestCase
34
34
  assert_not_nil(cap.find_task('servers:list'))
35
35
  assert_not_nil(cap.find_task('puppet:check'))
36
36
  assert_nil(cap.find_task('deploy:setup'))
37
- assert_equal('s', cap.roles[:baseline].servers.first.host)
38
- assert_equal('s', cap.roles[:everything].servers.first.host)
37
+ assert_equal('0.0.0.0', cap.roles[:baseline].servers.first.host)
38
+ assert_equal('0.0.0.0', cap.roles[:everything].servers.first.host)
39
39
  end
40
40
 
41
41
 
@@ -45,7 +45,7 @@ class Hubcap::TestHub < Test::Unit::TestCase
45
45
  group('g') {
46
46
  cap_set(:branch, 'deploy')
47
47
  role(:baseline)
48
- server('s') { role(:everything) }
48
+ server('s', :address => '0.0.0.0') { role(:everything) }
49
49
  }
50
50
  }
51
51
  }
@@ -62,8 +62,8 @@ class Hubcap::TestHub < Test::Unit::TestCase
62
62
  def test_configure_capistrano_in_application_mode_with_two_applications
63
63
  hub = Hubcap.hub {
64
64
  role(:baseline)
65
- application('a1') { server('s1') }
66
- application('a2') { server('s2') }
65
+ application('a1') { server('s1', :address => '1.1.1.1') }
66
+ application('a2') { server('s2', :address => '2.2.2.2') }
67
67
  }
68
68
 
69
69
  cap = Capistrano::Configuration.new
@@ -75,7 +75,9 @@ class Hubcap::TestHub < Test::Unit::TestCase
75
75
 
76
76
 
77
77
  def test_configure_capistrano_in_application_mode_with_no_applications
78
- hub = Hubcap.hub { server('s1') { role(:baseline) } }
78
+ hub = Hubcap.hub {
79
+ server('s', :address => '0.0.0.0') { role(:baseline) }
80
+ }
79
81
 
80
82
  cap = Capistrano::Configuration.new
81
83
  cap.set(:hubcap_agnostic, false)
@@ -88,7 +90,7 @@ class Hubcap::TestHub < Test::Unit::TestCase
88
90
  def test_configure_capistrano_in_application_mode_with_no_applications
89
91
  hub = Hubcap.hub {
90
92
  cap_set(:foo => 'bar')
91
- server('s1') {
93
+ server('s', :address => '0.0.0.0') {
92
94
  cap_set(:foo => 'baz')
93
95
  role(:baseline)
94
96
  }
@@ -101,4 +103,14 @@ class Hubcap::TestHub < Test::Unit::TestCase
101
103
  }
102
104
  end
103
105
 
106
+
107
+ def test_server_address_resolution
108
+ hub = Hubcap.hub {
109
+ server('s')
110
+ }
111
+ assert_raises(Hubcap::ServerAddressUnknown) {
112
+ hub.configure_capistrano(Capistrano::Configuration.new)
113
+ }
114
+ end
115
+
104
116
  end
metadata CHANGED
@@ -1,25 +1,33 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: hubcap
3
- version: !ruby/object:Gem::Version
4
- version: 0.0.4
5
- prerelease:
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 5
9
+ version: 0.0.5
6
10
  platform: ruby
7
- authors:
11
+ authors:
8
12
  - Joseph Pearson
9
13
  autorequire:
10
14
  bindir: bin
11
15
  cert_chain: []
12
- date: 2012-09-29 00:00:00.000000000 Z
16
+
17
+ date: 2012-10-01 00:00:00 +10:00
18
+ default_executable:
13
19
  dependencies: []
14
- description: Create a hub for your server configuration. Use it with Capistrano, Puppet
15
- and others.
16
- email:
20
+
21
+ description: Create a hub for your server configuration. Use it with Capistrano, Puppet and others.
22
+ email:
17
23
  - joseph@booki.sh
18
- executables:
24
+ executables:
19
25
  - hubcap
20
26
  extensions: []
27
+
21
28
  extra_rdoc_files: []
22
- files:
29
+
30
+ files:
23
31
  - .gitignore
24
32
  - Capfile.example
25
33
  - README.md
@@ -33,6 +41,7 @@ files:
33
41
  - lib/hubcap/hub.rb
34
42
  - lib/hubcap/recipes/puppet.rb
35
43
  - lib/hubcap/recipes/servers.rb
44
+ - lib/hubcap/recipes/ssh.rb
36
45
  - lib/hubcap/server.rb
37
46
  - lib/hubcap/version.rb
38
47
  - test/data/example.rb
@@ -45,31 +54,37 @@ files:
45
54
  - test/unit/test_hub.rb
46
55
  - test/unit/test_hubcap.rb
47
56
  - test/unit/test_server.rb
48
- homepage: ''
57
+ has_rdoc: true
58
+ homepage: ""
49
59
  licenses: []
60
+
50
61
  post_install_message:
51
62
  rdoc_options: []
52
- require_paths:
63
+
64
+ require_paths:
53
65
  - lib
54
- required_ruby_version: !ruby/object:Gem::Requirement
55
- none: false
56
- requirements:
57
- - - ! '>='
58
- - !ruby/object:Gem::Version
59
- version: '0'
60
- required_rubygems_version: !ruby/object:Gem::Requirement
61
- none: false
62
- requirements:
63
- - - ! '>='
64
- - !ruby/object:Gem::Version
65
- version: '0'
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ segments:
71
+ - 0
72
+ version: "0"
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ segments:
78
+ - 0
79
+ version: "0"
66
80
  requirements: []
81
+
67
82
  rubyforge_project:
68
- rubygems_version: 1.8.11
83
+ rubygems_version: 1.3.6
69
84
  signing_key:
70
85
  specification_version: 3
71
86
  summary: Hubcap Capistrano/Puppet extension
72
- test_files:
87
+ test_files:
73
88
  - test/data/example.rb
74
89
  - test/data/parts/foo_param.rb
75
90
  - test/data/readme.rb