hieracles 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +2 -0
- data/.gitignore +15 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/.travis.yml +5 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +30 -0
- data/Rakefile +14 -0
- data/bin/hc +32 -0
- data/bin/nodeinfo +41 -0
- data/hieracles.gemspec +30 -0
- data/lib/hieracles.rb +15 -0
- data/lib/hieracles/config.rb +56 -0
- data/lib/hieracles/format.rb +58 -0
- data/lib/hieracles/formats/console.rb +84 -0
- data/lib/hieracles/formats/csv.rb +66 -0
- data/lib/hieracles/formats/plain.rb +61 -0
- data/lib/hieracles/formats/yaml.rb +36 -0
- data/lib/hieracles/help.rb +27 -0
- data/lib/hieracles/hiera.rb +27 -0
- data/lib/hieracles/node.rb +108 -0
- data/lib/hieracles/optparse.rb +63 -0
- data/lib/hieracles/utils.rb +59 -0
- data/spec/files/config.yml +5 -0
- data/spec/files/enc/server.example.com.yaml +7 -0
- data/spec/files/enc/server2.example.com.yaml +7 -0
- data/spec/files/enc/server3.example.com.yaml +7 -0
- data/spec/files/farm_modules/dev.pp +5 -0
- data/spec/files/farm_modules/dev2.pp +5 -0
- data/spec/files/hiera.yaml +16 -0
- data/spec/files/hiera_no_yamlbackend.yaml +16 -0
- data/spec/files/hiera_yamlbackend_notfound.yaml +16 -0
- data/spec/files/modules/fake_module/manifests/init.pp +3 -0
- data/spec/files/modules/fake_module2/manifests/init.pp +3 -0
- data/spec/files/modules/fake_module3/manifests/init.pp +3 -0
- data/spec/files/params/common/common.yml +2 -0
- data/spec/files/params/farm/dev.yaml +1 -0
- data/spec/files/params/nodes/server.example.com.yaml +5 -0
- data/spec/lib/config_spec.rb +63 -0
- data/spec/lib/format_spec.rb +91 -0
- data/spec/lib/formats/console_spec.rb +107 -0
- data/spec/lib/formats/csv_spec.rb +89 -0
- data/spec/lib/formats/plain_spec.rb +94 -0
- data/spec/lib/formats/yaml_spec.rb +80 -0
- data/spec/lib/help_spec.rb +8 -0
- data/spec/lib/hiera_spec.rb +111 -0
- data/spec/lib/node_spec.rb +158 -0
- data/spec/lib/optparse_spec.rb +65 -0
- data/spec/lib/utils_spec.rb +61 -0
- data/spec/spec_helper.rb +26 -0
- metadata +223 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
---
|
2
|
+
:backends:
|
3
|
+
- yaml
|
4
|
+
:hierarchy:
|
5
|
+
- "nodes/%{fqdn}"
|
6
|
+
- "farm_datacenter/%{farm}_%{datacenter}"
|
7
|
+
- "farm/%{farm}"
|
8
|
+
- "room/%{room}"
|
9
|
+
- "datacenter/%{datacenter}"
|
10
|
+
- "country/%{country}"
|
11
|
+
- "os/%{operatingsystem}-%{lsbdistcodename}"
|
12
|
+
- "common/common"
|
13
|
+
:yaml:
|
14
|
+
:datadir: "params/"
|
15
|
+
:puppet:
|
16
|
+
:datasource: data
|
@@ -0,0 +1,16 @@
|
|
1
|
+
---
|
2
|
+
:backends:
|
3
|
+
- yaml
|
4
|
+
:hierarchy:
|
5
|
+
- "nodes/%{fqdn}"
|
6
|
+
- "farm_datacenter/%{farm}_%{datacenter}"
|
7
|
+
- "farm/%{farm}"
|
8
|
+
- "room/%{room}"
|
9
|
+
- "datacenter/%{datacenter}"
|
10
|
+
- "country/%{country}"
|
11
|
+
- "os/%{operatingsystem}-%{lsbdistcodename}"
|
12
|
+
- "common/common"
|
13
|
+
:json:
|
14
|
+
:datadir: "params/"
|
15
|
+
:puppet:
|
16
|
+
:datasource: data
|
@@ -0,0 +1,16 @@
|
|
1
|
+
---
|
2
|
+
:backends:
|
3
|
+
- yaml
|
4
|
+
:hierarchy:
|
5
|
+
- "nodes/%{fqdn}"
|
6
|
+
- "farm_datacenter/%{farm}_%{datacenter}"
|
7
|
+
- "farm/%{farm}"
|
8
|
+
- "room/%{room}"
|
9
|
+
- "datacenter/%{datacenter}"
|
10
|
+
- "country/%{country}"
|
11
|
+
- "os/%{operatingsystem}-%{lsbdistcodename}"
|
12
|
+
- "common/common"
|
13
|
+
:yaml:
|
14
|
+
:datadir: "params_no/"
|
15
|
+
:puppet:
|
16
|
+
:datasource: data
|
@@ -0,0 +1 @@
|
|
1
|
+
somefarmparam: false
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hieracles::Config do
|
4
|
+
describe '.load' do
|
5
|
+
context 'with an existing file' do
|
6
|
+
let(:options) do
|
7
|
+
{ config: 'spec/files/config.yml', basepath: 'spec/files' }
|
8
|
+
end
|
9
|
+
before { Hieracles::Config.load options }
|
10
|
+
|
11
|
+
it 'initialize config values' do
|
12
|
+
expect(Hieracles::Config.classpath).to eq 'farm_modules/%s.pp'
|
13
|
+
expect(Hieracles::Config.modulepath).to eq 'modules'
|
14
|
+
expect(Hieracles::Config.hierafile).to eq 'hiera.yaml'
|
15
|
+
expect(Hieracles::Config.format).to eq 'Console'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'with additional parameters' do
|
20
|
+
let(:hierapath) { 'hiera.yaml' }
|
21
|
+
let(:options) do
|
22
|
+
{ config: 'spec/files/config.yml', basepath: 'spec/files', hierafile: hierapath }
|
23
|
+
end
|
24
|
+
before { Hieracles::Config.load options }
|
25
|
+
|
26
|
+
it 'initialize config values' do
|
27
|
+
expect(Hieracles::Config.classpath).to eq 'farm_modules/%s.pp'
|
28
|
+
expect(Hieracles::Config.modulepath).to eq 'modules'
|
29
|
+
expect(Hieracles::Config.hierafile).to eq hierapath
|
30
|
+
expect(Hieracles::Config.format).to eq 'Console'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'without an existing config file' do
|
35
|
+
let(:options) do
|
36
|
+
{ config: 'spec/files/config_no.yml' }
|
37
|
+
end
|
38
|
+
before do
|
39
|
+
FileUtils.rm(options[:config]) if File.exist? options[:config]
|
40
|
+
Hieracles::Config.load options
|
41
|
+
end
|
42
|
+
after { FileUtils.rm(options[:config]) if File.exist? options[:config] }
|
43
|
+
|
44
|
+
it 'creates a default config file' do
|
45
|
+
expect(File.exist? options[:config]).to be_truthy
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'initialize config values' do
|
49
|
+
expect(Hieracles::Config.classpath).to eq 'manifests/classes/%s.pp'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '.defaultconfig' do
|
55
|
+
it { expect(Hieracles::Config.defaultconfig).to be_truthy }
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '.extract_params' do
|
59
|
+
let(:str) { 'bla=blu;one=two' }
|
60
|
+
let(:expected) { { bla: 'blu', one: 'two' } }
|
61
|
+
it { expect(Hieracles::Config.extract_params(str)).to eq expected }
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hieracles::Format do
|
4
|
+
|
5
|
+
let(:node) { double("node") }
|
6
|
+
let(:dispatch) { Hieracles::Format.new node }
|
7
|
+
let(:not_implemented) { "%s not implemented, please inherit from the Hieracles::Format class to implement a format.\n"}
|
8
|
+
|
9
|
+
describe '.new' do
|
10
|
+
it "defines a node object" do
|
11
|
+
expect(dispatch.instance_variable_get :@node).to eq node
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe ".info" do
|
16
|
+
it "returns a message informing that this class should be inherited" do
|
17
|
+
expect(dispatch.info nil).to eq format(not_implemented, 'info')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
describe ".files" do
|
21
|
+
it "returns a message informing that this class should be inherited" do
|
22
|
+
expect(dispatch.files nil).to eq format(not_implemented, 'files')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
describe ".paths" do
|
26
|
+
it "returns a message informing that this class should be inherited" do
|
27
|
+
expect(dispatch.paths nil).to eq format(not_implemented, 'paths')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
describe ".build_head" do
|
33
|
+
it "returns a message informing that this class should be inherited" do
|
34
|
+
expect(dispatch.send :build_head, true).to eq format(not_implemented, 'build_head')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
describe ".build_params_line" do
|
38
|
+
it "returns a message informing that this class should be inherited" do
|
39
|
+
expect(dispatch.send :build_params_line, nil, nil, nil).to eq format(not_implemented, 'build_params_line')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
describe ".build_modules_line" do
|
43
|
+
it "returns a message informing that this class should be inherited" do
|
44
|
+
expect(dispatch.send :build_modules_line, nil, nil).to eq format(not_implemented, 'build_modules_line')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe ".params" do
|
49
|
+
let(:params) { { k: 'v', kk: 'vv'} }
|
50
|
+
let(:expected) {
|
51
|
+
format(not_implemented, 'build_head') +
|
52
|
+
format(not_implemented, 'build_params_line') +
|
53
|
+
format(not_implemented, 'build_params_line')
|
54
|
+
}
|
55
|
+
before { allow(node).to receive(:params).and_return(params) }
|
56
|
+
it "returns 4 lines" do
|
57
|
+
expect(dispatch.params []).to eq expected
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe ".allparams" do
|
62
|
+
let(:params) { { k: 'v', kk: 'vv'} }
|
63
|
+
let(:expected) {
|
64
|
+
format(not_implemented, 'build_head') +
|
65
|
+
format(not_implemented, 'build_params_line') +
|
66
|
+
format(not_implemented, 'build_params_line')
|
67
|
+
}
|
68
|
+
before {
|
69
|
+
allow(node).to receive(:add_common).and_return(nil)
|
70
|
+
allow(node).to receive(:params).and_return(params)
|
71
|
+
}
|
72
|
+
it "returns 4 lines" do
|
73
|
+
expect(dispatch.allparams []).to eq expected
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe ".modules" do
|
78
|
+
let(:modules) { { k: 'v', kk: 'vv'} }
|
79
|
+
let(:expected) {
|
80
|
+
format(not_implemented, 'build_modules_line') +
|
81
|
+
format(not_implemented, 'build_modules_line')
|
82
|
+
}
|
83
|
+
before {
|
84
|
+
allow(node).to receive(:modules).and_return(modules)
|
85
|
+
}
|
86
|
+
it "returns 2 lines" do
|
87
|
+
expect(dispatch.modules []).to eq expected
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hieracles::Formats::Console do
|
4
|
+
let(:node) { double("node") }
|
5
|
+
let(:console_format) { Hieracles::Formats::Console.new node }
|
6
|
+
|
7
|
+
describe ".info" do
|
8
|
+
let(:expected) {
|
9
|
+
"\e[97mNode \e[0m fqdn\n" +
|
10
|
+
"\e[97mFarm \e[0m farm\n"
|
11
|
+
}
|
12
|
+
before {
|
13
|
+
allow(node).to receive(:info).and_return(
|
14
|
+
{
|
15
|
+
'Node' => 'fqdn',
|
16
|
+
'Farm' => 'farm'
|
17
|
+
}
|
18
|
+
)
|
19
|
+
}
|
20
|
+
it "outputs proper text" do
|
21
|
+
expect(console_format.info nil).to eq expected
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe ".files" do
|
26
|
+
let(:expected) { "path1\npath2\n" }
|
27
|
+
before {
|
28
|
+
allow(node).to receive(:files).and_return(['path1', 'path2'])
|
29
|
+
}
|
30
|
+
it "outputs proper text" do
|
31
|
+
expect(console_format.files nil).to eq expected
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe ".paths" do
|
36
|
+
let(:expected) { "path1\npath2\n" }
|
37
|
+
before {
|
38
|
+
allow(node).to receive(:paths).and_return(['path1', 'path2'])
|
39
|
+
}
|
40
|
+
it "outputs proper text" do
|
41
|
+
expect(console_format.paths nil).to eq expected
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe ".build_head" do
|
46
|
+
let(:expected) { "\e[31m[0] path1\e[0m\n\e[32m[1] path2\e[0m\n\n" }
|
47
|
+
before {
|
48
|
+
allow(node).to receive(:files).and_return(['path1', 'path2'])
|
49
|
+
}
|
50
|
+
it "outputs proper text" do
|
51
|
+
expect(console_format.send :build_head, true).to eq expected
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe ".build_params_line" do
|
56
|
+
let(:expected) {
|
57
|
+
"\e[31m[0]\e[0m \e[36mparams.this.var\e[0m value1\n"+
|
58
|
+
" \e[97m[1] params.this.var value2\e[0m\n"
|
59
|
+
}
|
60
|
+
let(:params) {
|
61
|
+
[
|
62
|
+
{ file: 'path1', value: 'value1'},
|
63
|
+
{ file: 'path2', value: 'value2'},
|
64
|
+
]
|
65
|
+
}
|
66
|
+
before {
|
67
|
+
console_format.instance_variable_set(:@colors,
|
68
|
+
{'path1' => 0, 'path2' => 1}
|
69
|
+
)
|
70
|
+
}
|
71
|
+
it "outputs proper text" do
|
72
|
+
expect(console_format.send :build_params_line,
|
73
|
+
"params.this.var",
|
74
|
+
params,
|
75
|
+
nil).to eq expected
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe ".build_modules_line" do
|
80
|
+
before {
|
81
|
+
allow(node).to receive(:modules).and_return(
|
82
|
+
{
|
83
|
+
'module1' => nil,
|
84
|
+
'longmodule2' => nil
|
85
|
+
}
|
86
|
+
)
|
87
|
+
}
|
88
|
+
context "module is found" do
|
89
|
+
let(:expected) { "module1 value\n" }
|
90
|
+
it "outputs proper text" do
|
91
|
+
expect(console_format.send :build_modules_line, "module1", "value").to eq expected
|
92
|
+
end
|
93
|
+
end
|
94
|
+
context "module is not found" do
|
95
|
+
let(:expected) { "module1 \e[31mnot found\e[0m\n" }
|
96
|
+
it "outputs proper text" do
|
97
|
+
expect(console_format.send :build_modules_line, "module1", "not found").to eq expected
|
98
|
+
end
|
99
|
+
end
|
100
|
+
context "module is duplicate" do
|
101
|
+
let(:expected) { "module1 \e[33m(duplicate)\e[0m\n" }
|
102
|
+
it "outputs proper text" do
|
103
|
+
expect(console_format.send :build_modules_line, "module1", "(duplicate)").to eq expected
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hieracles::Formats::Csv do
|
4
|
+
let(:node) { double("node") }
|
5
|
+
let(:csv_format) { Hieracles::Formats::Csv.new node }
|
6
|
+
|
7
|
+
describe ".info" do
|
8
|
+
let(:expected) {"fqdn;farm\n"}
|
9
|
+
before {
|
10
|
+
allow(node).to receive(:info).and_return(
|
11
|
+
{
|
12
|
+
'Node' => 'fqdn',
|
13
|
+
'Farm' => 'farm'
|
14
|
+
}
|
15
|
+
)
|
16
|
+
}
|
17
|
+
it "outputs proper text" do
|
18
|
+
expect(csv_format.info nil).to eq expected
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe ".files" do
|
23
|
+
let(:expected) { "path1;path2\n" }
|
24
|
+
before {
|
25
|
+
allow(node).to receive(:files).and_return(['path1', 'path2'])
|
26
|
+
}
|
27
|
+
it "outputs proper text" do
|
28
|
+
expect(csv_format.files nil).to eq expected
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ".paths" do
|
33
|
+
let(:expected) { "path1;path2\n" }
|
34
|
+
before {
|
35
|
+
allow(node).to receive(:paths).and_return(['path1', 'path2'])
|
36
|
+
}
|
37
|
+
it "outputs proper text" do
|
38
|
+
expect(csv_format.paths nil).to eq expected
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe ".build_head" do
|
43
|
+
let(:expected) { "path1;path2;var;value;overriden\n" }
|
44
|
+
before {
|
45
|
+
allow(node).to receive(:files).and_return(['path1', 'path2'])
|
46
|
+
}
|
47
|
+
it "outputs proper text" do
|
48
|
+
expect(csv_format.send :build_head, true).to eq expected
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe ".build_params_line" do
|
53
|
+
let(:expected) {
|
54
|
+
"1;0;params.this.var;value1;0\n"+
|
55
|
+
"0;1;params.this.var;value2;1\n"
|
56
|
+
}
|
57
|
+
let(:params) {
|
58
|
+
[
|
59
|
+
{ file: 'path1', value: 'value1'},
|
60
|
+
{ file: 'path2', value: 'value2'},
|
61
|
+
]
|
62
|
+
}
|
63
|
+
before {
|
64
|
+
allow(node).to receive(:files).and_return(['path1', 'path2'])
|
65
|
+
}
|
66
|
+
it "outputs proper text" do
|
67
|
+
expect(csv_format.send :build_params_line,
|
68
|
+
"params.this.var",
|
69
|
+
params,
|
70
|
+
nil).to eq expected
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe ".build_modules_line" do
|
75
|
+
before {
|
76
|
+
allow(node).to receive(:modules).and_return(
|
77
|
+
{
|
78
|
+
'module1' => nil,
|
79
|
+
'longmodule2' => nil
|
80
|
+
}
|
81
|
+
)
|
82
|
+
}
|
83
|
+
let(:expected) { "module1;value\n" }
|
84
|
+
it "outputs proper text" do
|
85
|
+
expect(csv_format.send :build_modules_line, "module1", "value").to eq expected
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|