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 +6 -4
- data/aether.gemspec +1 -1
- data/lib/aether.rb +1 -1
- data/lib/aether/chef.rb +40 -10
- data/lib/aether/{server.rb → node.rb} +4 -3
- data/lib/aether/version.rb +1 -1
- data/spec/aether/chef_spec.rb +35 -3
- data/spec/aether/node_spec.rb +33 -0
- data/spec/spec_helper.rb +2 -2
- metadata +9 -9
- data/spec/aether/server_spec.rb +0 -20
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
|
-
|
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
|
17
|
-
|
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
|
data/aether.gemspec
CHANGED
@@ -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.
|
11
|
+
gem.add_dependency('ridley', '~> 0.3')
|
12
12
|
|
13
13
|
gem.name = "aether"
|
14
14
|
gem.version = Aether::VERSION
|
data/lib/aether.rb
CHANGED
data/lib/aether/chef.rb
CHANGED
@@ -14,26 +14,56 @@ module Aether
|
|
14
14
|
@environment = options[:environment]
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
|
17
|
+
def find_nodes(options = {}, include_environment = true)
|
18
|
+
roles = options[:roles] || []
|
19
19
|
results = []
|
20
|
-
|
21
|
-
|
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
|
28
|
-
|
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
|
32
|
-
|
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
|
-
|
36
|
-
|
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
|
2
|
+
class Node
|
3
3
|
|
4
4
|
attr_reader :name, :attributes, :raw
|
5
5
|
|
6
|
-
def initialize(
|
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
|
data/lib/aether/version.rb
CHANGED
data/spec/aether/chef_spec.rb
CHANGED
@@ -15,13 +15,45 @@ describe Aether::Chef do
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
describe "#
|
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.
|
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::
|
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
|
data/spec/spec_helper.rb
CHANGED
@@ -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
|
26
|
-
@
|
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.
|
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-
|
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.
|
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.
|
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/
|
94
|
+
- lib/aether/node.rb
|
95
95
|
- lib/aether/version.rb
|
96
96
|
- spec/aether/chef_spec.rb
|
97
|
-
- spec/aether/
|
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:
|
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:
|
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/
|
133
|
+
- spec/aether/node_spec.rb
|
134
134
|
- spec/chef_server.yml.example
|
135
135
|
- spec/spec_helper.rb
|
data/spec/aether/server_spec.rb
DELETED
@@ -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
|