aether 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -7,11 +7,13 @@ server information from a Hosted Chef Server.
7
7
  The `Ather::Chef` class is mainly used in Capistrano recipes.
8
8
 
9
9
 
10
- Sample Usage
11
- ------------
10
+ Usage
11
+ -----
12
12
 
13
13
  chef_server = Ather::Chef.new(:server_url => 'https://api.opscode.com/organizations/foo', :client_name => 'foo',
14
14
  :client_key => '/path/to/.chef/foo.pem', :organization => 'foo', :environment => 'production')
15
15
 
16
- webservers = chef_server.find_webservers # returns an array of Ridley::Node
17
- any_servers = chef_server.find_servers(:role => 'a-chef-role') # returns an array of Ridley::Node
16
+ webservers = chef_server.find_webservers # returns an array of Aether::Server
17
+ webservers.first.hostname # => 'foo.bar.com'
18
+
19
+ servers = chef_server.find_servers(:role => 'a-chef-role') # search servers with a given role in its top level run list
@@ -8,7 +8,7 @@ Gem::Specification.new do |gem|
8
8
  gem.add_development_dependency('rspec', '~> 2.11')
9
9
  gem.add_development_dependency('hashie', '~> 1.2')
10
10
 
11
- gem.add_dependency('ridley', '~> 0.2')
11
+ gem.add_dependency('ridley', '~> 0.3')
12
12
 
13
13
  gem.name = "aether"
14
14
  gem.version = Aether::VERSION
@@ -1,5 +1,5 @@
1
1
  require 'ridley'
2
2
 
3
3
  require 'aether/version'
4
- require 'aether/server'
4
+ require 'aether/node'
5
5
  require 'aether/chef'
@@ -14,26 +14,56 @@ module Aether
14
14
  @environment = options[:environment]
15
15
  end
16
16
 
17
- def find_servers(options = {})
18
- role = options[:role]
17
+ def find_nodes(options = {}, include_environment = true)
18
+ roles = options[:roles] || []
19
19
  results = []
20
- connection.search(:node, "chef_environment:#{environment} AND role:#{role}").each do |node|
21
- results << Aether::Server.new(:node => node)
20
+
21
+ search_str = build_search_query(:include_environment => include_environment, :roles => roles)
22
+ connection.search(:node, search_str).each do |node|
23
+ results << Aether::Node.new(node)
22
24
  end
23
25
 
24
26
  results
25
27
  end
26
28
 
27
- def find_web_servers(role = 'web-server')
28
- find_servers(:role => role)
29
+ def find_data_bag_item(bag_name, item_name)
30
+ connection.data_bag.all.find{ |bag| bag.name == bag_name }.item.find(item_name).attributes
29
31
  end
30
32
 
31
- def find_db_migration_server(role = 'db-migration-server')
32
- find_servers(:role => role).first
33
+ def build_search_query(options = {})
34
+ include_environment = options[:include_environment]
35
+ roles = options[:roles] || []
36
+
37
+ str = ''
38
+ str << "chef_environment:#{environment}" if include_environment
39
+ unless roles.empty?
40
+ str << " AND " if include_environment
41
+ str << build_search_roles_query(roles)
42
+ end
43
+
44
+ str
33
45
  end
34
46
 
35
- def find_data_bag_item(bag_name, item_name)
36
- connection.data_bag.all.find{ |bag| bag.name == bag_name }.item.find(item_name).attributes
47
+
48
+ private
49
+
50
+ def build_search_roles_query(roles)
51
+ str = ''
52
+
53
+ last_index = roles.size - 1
54
+ roles.each_with_index do |role, i|
55
+ if i == last_index
56
+ str << "role:#{role}"
57
+ else
58
+ if roles.size == 1
59
+ str << "role:#{role}"
60
+ else
61
+ str << "role:#{role} AND "
62
+ end
63
+ end
64
+ end
65
+
66
+ str
37
67
  end
38
68
 
39
69
  end
@@ -1,10 +1,9 @@
1
1
  module Aether
2
- class Server
2
+ class Node
3
3
 
4
4
  attr_reader :name, :attributes, :raw
5
5
 
6
- def initialize(options = {})
7
- node = options[:node]
6
+ def initialize(node)
8
7
  @name = node.name
9
8
  @attributes = node.attributes
10
9
  @raw = node
@@ -13,10 +12,12 @@ module Aether
13
12
  def ipaddress
14
13
  @ipaddress ||= attributes[:automatic][:ipaddress]
15
14
  end
15
+ alias_method :local_ipv4, :ipaddress
16
16
 
17
17
  def hostname
18
18
  @hostname ||= attributes[:automatic][:fqdn]
19
19
  end
20
+ alias_method :fqdn, :hostname
20
21
 
21
22
  end
22
23
  end
@@ -1,3 +1,3 @@
1
1
  module Aether
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -15,13 +15,45 @@ describe Aether::Chef do
15
15
  end
16
16
  end
17
17
 
18
- describe "#find_servers" do
18
+ describe "#build_search_query" do
19
+ let(:chef_server) { Aether::Chef.new(chef_server_info) }
20
+
21
+ context "with env and 1 role" do
22
+ it "returns an appropriate search query" do
23
+ results = chef_server.build_search_query(:include_environment => true, :roles => ['web-server'])
24
+ expect(results).to eq("chef_environment:#{chef_server.environment} AND role:web-server")
25
+ end
26
+ end
27
+
28
+ context "with env and 2 roles" do
29
+ it "returns an appropriate search query" do
30
+ results = chef_server.build_search_query(:include_environment => true, :roles => ['web-server', 'worker-server'])
31
+ expect(results).to eq("chef_environment:#{chef_server.environment} AND role:web-server AND role:worker-server")
32
+ end
33
+ end
34
+
35
+ context "without env and 1 role" do
36
+ it "returns an appropriate search query" do
37
+ results = chef_server.build_search_query(:include_environment => false, :roles => ['web-server'])
38
+ expect(results).to eq("role:web-server")
39
+ end
40
+ end
41
+
42
+ context "without env and more than one role" do
43
+ it "returns an appropriate search query" do
44
+ results = chef_server.build_search_query(:include_environment => false, :roles => ['web-server', 'push-server', 'worker-server'])
45
+ expect(results).to eq("role:web-server AND role:push-server AND role:worker-server")
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "#find_nodes" do
19
51
  let(:chef_server) { Aether::Chef.new(chef_server_info) }
20
52
 
21
53
  it "returns an array of Chef::Server" do
22
- results = chef_server.find_servers(:role => 'web-server')
54
+ results = chef_server.find_nodes(:roles => ['web-server'])
23
55
  expect(results).to be_an_instance_of(Array)
24
- expect(results.first).to be_an_instance_of(Aether::Server)
56
+ expect(results.first).to be_an_instance_of(Aether::Node)
25
57
  end
26
58
  end
27
59
 
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Aether::Node do
4
+ let(:node) { Aether::Node.new(mock_node) }
5
+
6
+ describe "#ipaddress" do
7
+ it "returns the ip address" do
8
+ expect(node.ipaddress).to_not be_blank
9
+ expect(node.ipaddress).to eq(mock_node.attributes.automatic.ipaddress)
10
+ end
11
+ end
12
+
13
+ describe "#local_ipv4" do
14
+ it "returns the ip address" do
15
+ expect(node.local_ipv4).to_not be_blank
16
+ expect(node.local_ipv4).to eq(mock_node.attributes.automatic.ipaddress)
17
+ end
18
+ end
19
+
20
+ describe "#hostname" do
21
+ it "returns the fqdn" do
22
+ expect(node.hostname).to_not be_blank
23
+ expect(node.hostname).to eq(mock_node.attributes.automatic.fqdn)
24
+ end
25
+ end
26
+
27
+ describe "#fqdn" do
28
+ it "returns the fqdn" do
29
+ expect(node.fqdn).to_not be_blank
30
+ expect(node.fqdn).to eq(mock_node.attributes.automatic.fqdn)
31
+ end
32
+ end
33
+ end
@@ -22,8 +22,8 @@ def chef_server_info
22
22
  @chef_server_info ||= YAML.load_file(File.expand_path(File.join(File.dirname(__FILE__), 'chef_server.yml'))).symbolize_keys
23
23
  end
24
24
 
25
- def mock_node_results
26
- @mock_node_results ||= Hashie::Mash.new(
25
+ def mock_node
26
+ @mock_node ||= Hashie::Mash.new(
27
27
  :name => 'web01.staging.foo.com',
28
28
  :attributes => {
29
29
  :automatic => {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aether
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-15 00:00:00.000000000 Z
12
+ date: 2012-10-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -66,7 +66,7 @@ dependencies:
66
66
  requirements:
67
67
  - - ~>
68
68
  - !ruby/object:Gem::Version
69
- version: '0.2'
69
+ version: '0.3'
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -74,7 +74,7 @@ dependencies:
74
74
  requirements:
75
75
  - - ~>
76
76
  - !ruby/object:Gem::Version
77
- version: '0.2'
77
+ version: '0.3'
78
78
  description: Simple wrapper over Ridley gem (a Chef API client)
79
79
  email:
80
80
  - devops@bitium.com
@@ -91,10 +91,10 @@ files:
91
91
  - aether.gemspec
92
92
  - lib/aether.rb
93
93
  - lib/aether/chef.rb
94
- - lib/aether/server.rb
94
+ - lib/aether/node.rb
95
95
  - lib/aether/version.rb
96
96
  - spec/aether/chef_spec.rb
97
- - spec/aether/server_spec.rb
97
+ - spec/aether/node_spec.rb
98
98
  - spec/chef_server.yml.example
99
99
  - spec/spec_helper.rb
100
100
  homepage: https://github.com/bitium/aether
@@ -111,7 +111,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
111
111
  version: '0'
112
112
  segments:
113
113
  - 0
114
- hash: 1696241638785372526
114
+ hash: 3580871981690329813
115
115
  required_rubygems_version: !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
120
  version: '0'
121
121
  segments:
122
122
  - 0
123
- hash: 1696241638785372526
123
+ hash: 3580871981690329813
124
124
  requirements: []
125
125
  rubyforge_project:
126
126
  rubygems_version: 1.8.24
@@ -130,6 +130,6 @@ summary: Provides helper methods to be used in Capistrano recipes to retrieve se
130
130
  info from a Chef Server
131
131
  test_files:
132
132
  - spec/aether/chef_spec.rb
133
- - spec/aether/server_spec.rb
133
+ - spec/aether/node_spec.rb
134
134
  - spec/chef_server.yml.example
135
135
  - spec/spec_helper.rb
@@ -1,20 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Aether::Server do
4
- let(:server) { Aether::Server.new(:node => mock_node_results) }
5
-
6
- describe "#ipaddress" do
7
- it "returns the ip address" do
8
- expect(server.ipaddress).to_not be_blank
9
- expect(server.ipaddress).to eq(mock_node_results.attributes.automatic.ipaddress)
10
- end
11
- end
12
-
13
- describe "#hostname" do
14
- it "returns the fqdn" do
15
- expect(server.hostname).to_not be_blank
16
- expect(server.hostname).to eq(mock_node_results.attributes.automatic.fqdn)
17
- end
18
- end
19
-
20
- end