aether 0.0.2 → 0.0.3

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