hieracles 0.3.6 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 580fa2b122f177f4e9a901b9dcc6940c721bf45e
4
- data.tar.gz: c606cd77e93fd4c9d38d84a89f27790d050b8f36
3
+ metadata.gz: e1e246fada2e7e691f6a3c1f92ef9f3bae438ceb
4
+ data.tar.gz: a69b8fcd3a63ecb3df2d6064068f6a747c9c65fd
5
5
  SHA512:
6
- metadata.gz: c1b6c1f4e57844360f5ee2c480d6bcb726f053e30e75fff0f3b18c1e55f6e8e15c4d1bced728554de3fcdf82b1f229d1d6176689b3f5a27897e581bea54926ee
7
- data.tar.gz: b48b039da054c365cda35829a54f539de888a9192f9f12d934abfeb99596233e18383e96d7b37ce15bee1143c1eca00d9a555433850e5859784d8c7261b2bd16
6
+ metadata.gz: 041246165f6e2474bfc6a134a07553cf4b1ae588a8a7842de33e1eb728ec90742db7beb32762f65f2f3cc36cc9cd20e9704a623c280d022e599cfff3563a77b5
7
+ data.tar.gz: 7f1ad137bf9f1c1c09f4bead0c8e9b8ae16ffca9668ca2ffd945d6ed38b237b3d6e0ac88d6bf18d3f74f673df2c8a73383c69e92d3247f036e724d21cffd98ed
data/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
1
  Hieracles Changelog
2
2
  =======================
3
3
 
4
+ ### 0.4.0 - 2016-12-30
5
+ - prepare a new command `hieracles` for preparing version 1.0.0
6
+ - refactoring of main lib to be less node-centric
7
+ - make farms list not to use cache by default
8
+
4
9
  ### 0.3.6 - 2016-04-27
5
10
  - avoid abusive caching for all farms information
6
11
 
data/README.md CHANGED
@@ -249,6 +249,10 @@ Todo
249
249
  - adapt to other ENCs
250
250
  - adapt to PuppetDB storage
251
251
 
252
+ Other hiera tools
253
+ -------------------
254
+
255
+ - https://github.com/binford2k/hiera_explain
252
256
 
253
257
  Authors
254
258
  -----------
data/bin/hc CHANGED
@@ -12,6 +12,8 @@ if opt.options.has_key? :version
12
12
  exit(0)
13
13
  end
14
14
 
15
+ action = opt.payload.shift
16
+
15
17
  fqdn = opt.payload[0]
16
18
  command = opt.payload[1]
17
19
  args = opt.payload[2..-1]
data/bin/hieracles ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH << File.expand_path("../../lib", __FILE__)
4
+
5
+ require 'hieracles'
6
+ require 'hieracles/options/hieracles'
7
+ require 'hieracles/commands'
8
+
9
+ opt = Hieracles::Options::Hieracles.new(ARGV)
10
+
11
+ if opt.options.has_key? :version
12
+ puts Hieracles.version
13
+ exit(0)
14
+ end
15
+
16
+ command = opt.payload.shift
17
+ arg = opt.payload.shift
18
+ extra = opt.payload
19
+
20
+ if !command || command == 'help'
21
+ puts Hieracles::Options::Hieracles.usage
22
+ exit(1)
23
+ end
24
+
25
+ config = Hieracles::Config.new opt.options
26
+ commands = Hieracles::Commands.new config
27
+
28
+ if commands.available.include? command
29
+ commands.run command, arg, extra
30
+ elsif commands.respond_to? command
31
+ commands.send command, arg, extra
32
+ else
33
+ puts 'Command not found.'
34
+ end
data/lib/hieracles.rb CHANGED
@@ -12,6 +12,7 @@ require 'hieracles/formats/yaml'
12
12
  require 'hieracles/formats/plain'
13
13
  require 'hieracles/formats/console'
14
14
  require 'hieracles/formats/rawyaml'
15
+ require 'hieracles/outputs/console'
15
16
  require 'hieracles/puppetdb'
16
17
 
17
18
  # https://github.com/Gandi/hieracles
@@ -0,0 +1,59 @@
1
+
2
+ module Hieracles
3
+ class Commands
4
+
5
+ attr_reader :available
6
+
7
+ def initialize(config)
8
+ @config = config
9
+ @formatter = Object.const_get("Hieracles::Formats::#{@config.format}")
10
+ @available = %w(info files params paths modules allparams facts)
11
+ end
12
+
13
+ def run(command, arg, extra)
14
+ if arg and arg[/\./] # poor way to detect if it is a fqdn
15
+ if Hieracles::Registry.nodes(@config).include? arg
16
+ puts call_node(command.to_sym, arg, extra)
17
+ else
18
+ puts "node '#{arg}' not found"
19
+ end
20
+ else
21
+ if respond_to? command
22
+ send command.to_sym, arg, extra
23
+ else
24
+ # not a node
25
+ puts "'#{arg}' is not a FQDN."
26
+ end
27
+ end
28
+ end
29
+
30
+ def farms(arg, extra)
31
+ if arg
32
+ arg = [arg]
33
+ else
34
+ arg = []
35
+ end
36
+ formatter = @formatter.new nil
37
+ farms = Hieracles::Registry.farms_nodes(@config, 'local', true)
38
+ puts formatter.build_list(farms, nil, arg)
39
+ end
40
+
41
+ def modules(arg, extra)
42
+ if arg
43
+ arg = [arg]
44
+ else
45
+ arg = []
46
+ end
47
+ formatter = @formatter.new nil
48
+ modules = Hieracles::Registry.nodes_modules(@config, 'local', arg)
49
+ puts formatter.build_list(modules, nil, arg)
50
+ end
51
+
52
+ def call_node(command, fqdn, extra)
53
+ node = Hieracles::Node.new fqdn, @config
54
+ formatter = @formatter.new node
55
+ formatter.send command, extra
56
+ end
57
+
58
+ end
59
+ end
@@ -73,43 +73,40 @@ module Hieracles
73
73
  @node.paths.join("\n") + "\n"
74
74
  end
75
75
 
76
- def build_head(without_common)
77
- output = "[-] (merged)\n"
76
+ def show_params(without_common, args)
77
+ filter = args[0]
78
78
  @node.files(without_common).each_with_index do |f, i|
79
79
  output << format("#{COLORS[i]}\n", "[#{i}] #{f}")
80
80
  @colors[f] = i
81
81
  end
82
- "#{output}\n"
83
- end
84
-
85
- def build_params_line(key, value, filter)
86
- output = ''
87
- if !filter || Regexp.new(filter).match(key)
88
- output << build_line_item(key, value)
82
+ @node.params(without_common).each do |key, v|
83
+ if !filter || Regexp.new(filter).match(key)
84
+ if v[:overriden]
85
+ output << format(
86
+ "%s #{COLORS[7]} %s\n", "[-]",
87
+ key,
88
+ sanitize(value[:value])
89
+ )
90
+ value[:found_in].each do |val|
91
+ output << format(
92
+ " #{COLORS[8]}\n",
93
+ "[#{filecolor_index}] #{key} #{val[:value]}"
94
+ )
95
+ end
96
+ else
97
+ filecolor_index = @colors[value[:file]]
98
+ filecolor = COLORS[filecolor_index]
99
+ output << format(
100
+ "#{filecolor} #{COLORS[7]} %s\n", "[#{filecolor_index}]",
101
+ key,
102
+ sanitize(value[:value])
103
+ )
104
+ end
105
+ end
89
106
  end
90
107
  output
91
108
  end
92
109
 
93
- def build_line_item(key, value)
94
- if value[:overriden]
95
- format("%s #{COLORS[7]} %s\n", "[-]", key, sanitize(value[:value]) ) +
96
- build_overriden(key, value[:found_in])
97
- else
98
- filecolor_index = @colors[value[:file]]
99
- filecolor = COLORS[filecolor_index]
100
- format("#{filecolor} #{COLORS[7]} %s\n", "[#{filecolor_index}]", key, sanitize(value[:value]) )
101
- end
102
- end
103
-
104
- def build_overriden(key, found_in)
105
- back = ''
106
- found_in.each do |v|
107
- filecolor_index = @colors[v[:file]]
108
- back << format(" #{COLORS[8]}\n", "[#{filecolor_index}] #{key} #{v[:value]}")
109
- end
110
- back
111
- end
112
-
113
110
  def build_modules_line(key, value)
114
111
  length = max_key_length(@node.modules) + 3
115
112
  value_color = '%s'
@@ -48,6 +48,16 @@ module Hieracles
48
48
  make_csv [key, value]
49
49
  end
50
50
 
51
+ def build_list(hash, notifications, filter)
52
+ if filter[0]
53
+ hash.select! { |k, e| Regexp.new(filter[0]).match k }
54
+ end
55
+ hash.reduce([]) do |a, (k, v)|
56
+ a << make_csv([k, v.join(',')])
57
+ a
58
+ end.join()
59
+ end
60
+
51
61
  private
52
62
 
53
63
  def build_line(whatfile, key, value, overriden = '0')
@@ -5,11 +5,13 @@ module Hieracles
5
5
  # format intended to be used for an api server
6
6
  class Json < Hieracles::Format
7
7
 
8
- def info(_)
8
+ def info(args)
9
+ filter(@node.info, args)
9
10
  @node.info.merge(alerts).to_json
10
11
  end
11
12
 
12
- def facts(_)
13
+ def facts(args)
14
+ filter(@node.facts, args)
13
15
  @node.facts.merge(alerts).to_json
14
16
  end
15
17
 
@@ -34,10 +36,15 @@ module Hieracles
34
36
  end
35
37
 
36
38
  def build_list(hash, notifications, filter)
37
- {
38
- 'notifications' => notifications,
39
- 'payload' => hash
40
- }.to_json
39
+ if filter[0]
40
+ { 'notifications' => notifications,
41
+ 'payload' => hash.select { |k, e| Regexp.new(filter[0]).match k }
42
+ }.to_json
43
+ else
44
+ { 'notifications' => notifications,
45
+ 'payload' => hash
46
+ }.to_json
47
+ end
41
48
  end
42
49
 
43
50
  private
@@ -49,6 +56,15 @@ module Hieracles
49
56
  {}
50
57
  end
51
58
  end
59
+
60
+ def filter(what, args)
61
+ if args and args[0]
62
+ what.select! { |k, v| Regexp.new(args[0]).match(k.to_s) }
63
+ else
64
+ what
65
+ end
66
+ end
67
+
52
68
  end
53
69
  end
54
70
  end
@@ -30,6 +30,14 @@ module Hieracles
30
30
  def allparams(args)
31
31
  @node.params_tree(false).to_yaml
32
32
  end
33
+
34
+ def build_list(hash, notifications, filter)
35
+ if filter[0]
36
+ hash.select { |k, e| Regexp.new(filter[0]).match k }.to_yaml
37
+ else
38
+ hash.to_yaml
39
+ end
40
+ end
33
41
 
34
42
  end
35
43
  end
@@ -92,6 +92,14 @@ module Hieracles
92
92
  added output, key, '', params
93
93
  end
94
94
 
95
+ def build_list(hash, notifications, filter)
96
+ if filter[0]
97
+ hash.select { |k, e| Regexp.new(filter[0]).match k }.to_yaml
98
+ else
99
+ hash.to_yaml
100
+ end
101
+ end
102
+
95
103
  private
96
104
 
97
105
  def added(output, key, leaf, params)
@@ -0,0 +1,106 @@
1
+ require 'hieracles/optparse'
2
+
3
+ module Hieracles
4
+ module Options
5
+ class Hieracles < Hieracles::Optparse
6
+
7
+ def available_options
8
+ {
9
+ config: {
10
+ has_arg: true,
11
+ aliases: ['c', 'conf', 'config']
12
+ },
13
+ format: {
14
+ has_arg: true,
15
+ aliases: ['f', 'format']
16
+ },
17
+ params: {
18
+ has_arg: true,
19
+ aliases: ['p', 'params']
20
+ },
21
+ hierafile: {
22
+ has_arg: true,
23
+ aliases: ['h', 'hierafile']
24
+ },
25
+ basepath: {
26
+ has_arg: true,
27
+ aliases: ['b', 'basepath']
28
+ },
29
+ encpath: {
30
+ has_arg: true,
31
+ aliases: ['e', 'encpath']
32
+ },
33
+ version: {
34
+ has_arg: false,
35
+ aliases: ['v', 'version']
36
+ },
37
+ yaml_facts: {
38
+ has_arg: true,
39
+ aliases: ['y', 'yaml']
40
+ },
41
+ json_facts: {
42
+ has_arg: true,
43
+ aliases: ['j', 'json']
44
+ },
45
+ interactive: {
46
+ has_arg: false,
47
+ aliases: ['i', 'interactive']
48
+ }
49
+ }
50
+ end
51
+
52
+ def self.usage
53
+ return <<-END
54
+
55
+ Usage: hieracles <command> [extra_args]
56
+
57
+ Available commands:
58
+
59
+ info <fqdn>
60
+ provides the farm, datacenter, country
61
+ associated to the given fqdn
62
+ An extra param can be added for filtering
63
+ eg. hieracles info <fqdn> timestamp
64
+ eg. hieracles info <fqdn> farm
65
+
66
+ files <fqdn|farm|module>
67
+ list all files containing params affecting this fqdn
68
+ (in more than commons)
69
+
70
+ paths <fqdn|farm|module>
71
+ list all file paths for files with params
72
+
73
+ modules <fqdn>
74
+ list modules included in the farm where the node is
75
+
76
+ params <fqdn>
77
+ list params for the node matching the fqdn
78
+ An extra filter string can be added to limit the list
79
+ use ruby regexp without the enclosing slashes
80
+ eg. hieracles params <fqdn> postfix.*version
81
+ eg. hieracles params <fqdn> '^postfix'
82
+ eg. hieracles params <fqdn> 'version$'
83
+
84
+ allparams <fqdn>
85
+ same as params but including the common.yaml params (huge)
86
+ Also accepts a search string
87
+
88
+ Extra args:
89
+ -f <plain|console|csv|yaml|rawyaml|json> default console
90
+ -p extraparam=what,anotherparam=this
91
+ -c <configfile>
92
+ -h <hierafile>
93
+ -b <basepath> default ./
94
+ -e <encdir>
95
+ -y <fact_file> - facts in yaml format
96
+ -j <fact_file> - facts in json format
97
+ -v just displays the version of Hieracles
98
+ -i - interactive mode
99
+ END
100
+ end
101
+
102
+
103
+ end
104
+ end
105
+ end
106
+
@@ -0,0 +1,40 @@
1
+ require 'awesome_print'
2
+
3
+ module Hieracles
4
+ module Outputs
5
+ # format accepting colors
6
+ # for display in the terminal
7
+ class Console
8
+ include Hieracles::Utils
9
+
10
+ COLORS = [
11
+ "\e[31m%s\e[0m",
12
+ "\e[32m%s\e[0m",
13
+ "\e[33m%s\e[0m",
14
+ "\e[34m%s\e[0m",
15
+ "\e[35m%s\e[0m",
16
+ "\e[37m%s\e[0m",
17
+ "\e[38m%s\e[0m",
18
+ "\e[36m%s\e[0m",
19
+ "\e[97m%s\e[0m",
20
+ "\e[35;1m%s\e[0m"
21
+ ]
22
+
23
+ def initialize()
24
+ @colors = {}
25
+ end
26
+
27
+ def hash_list(headers, hash)
28
+ back = "\n"
29
+ if headers.count > 0
30
+ notifications.each do |v|
31
+ back << format("#{COLORS[9]}\n", "*** #{v.source}: #{v.message} ***")
32
+ end
33
+ back << "\n"
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -5,8 +5,8 @@ module Hieracles
5
5
 
6
6
  def farms(config)
7
7
  Dir.glob(format(config.classpath, '*')).sort.map do |f|
8
- sub = Regexp.new(".*#{config.classpath.sub(/%s/,'([^/]*)')}")
9
- f.sub(sub, "\\1")
8
+ extract_path = Regexp.new(".*#{config.classpath.sub(/%s/,'([^/]*)')}")
9
+ f.sub(extract_path, "\\1")
10
10
  end
11
11
  end
12
12
 
@@ -25,9 +25,11 @@ module Hieracles
25
25
  def reload_nodes()
26
26
  @_nodes_parameters = {}
27
27
  @_nodes_modules = {}
28
+ @_farms_modules = {}
28
29
  end
29
30
 
30
- def nodes_parameters(config, env = 'production')
31
+ def nodes_parameters(config, env = 'production', reload = true)
32
+ reload_nodes if reload
31
33
  @_nodes_parameters ||= {}
32
34
  @_nodes_parameters[env] ||= Dir.glob(File.join(config.encpath, '*.yaml')).sort.reduce({}) do |a, f|
33
35
  fqdn = File.basename(f, '.yaml')
@@ -36,7 +38,18 @@ module Hieracles
36
38
  end
37
39
  end
38
40
 
39
- def nodes_modules(config, env = 'production')
41
+ def farms_modules(config, env = 'production')
42
+ @_farms_modules ||= {}
43
+ regex = Regexp.new('\s*include\s*([-_a-z0-9]*)')
44
+ extract_path = Regexp.new(".*#{config.classpath.sub(/%s/,'([^/]*)')}")
45
+ @_farms_modules[env] ||= Dir.glob(format(config.classpath, '*')).sort.reduce({}) do |a, f|
46
+ name = f.sub(extract_path, "\\1")
47
+ a[name] = find_item(f, regex)
48
+ a
49
+ end
50
+ end
51
+
52
+ def nodes_modules(config, env = 'production', filter = nil)
40
53
  @_nodes_modules ||= {}
41
54
  @_nodes_modules[env] ||= Dir.glob(File.join(config.encpath, '*.yaml')).sort.reduce({}) do |a, f|
42
55
  YAML.load_file(f)['classes'].each do |cl|
@@ -50,17 +63,60 @@ module Hieracles
50
63
 
51
64
  def farms_counted(config, env = 'production', reload = false)
52
65
  reload_nodes if reload
66
+ extract_path = Regexp.new(".*#{config.classpath.sub(/%s/,'([^/]*)')}")
53
67
  Dir.glob(format(config.classpath, '*')).sort.reduce({}) do |a, f|
54
- sub = Regexp.new(".*#{config.classpath.sub(/%s/,'([^/]*)')}")
55
- name = f.sub(sub, "\\1")
68
+ name = f.sub(extract_path, "\\1")
56
69
  a[name] = nodes_parameters(config, env).select { |k, v| v['farm'] == name }.length
57
70
  a
58
71
  end
59
72
  end
60
73
 
74
+ def farms_nodes(config, env = 'production', reload = false, filter = nil)
75
+ reload_nodes if reload
76
+ extract_path = Regexp.new(".*#{config.classpath.sub(/%s/,'([^/]*)')}")
77
+ Dir.glob(format(config.classpath, '*')).sort.reduce({}) do |a, f|
78
+ name = f.sub(extract_path, "\\1")
79
+ a[name] = nodes_parameters(config, env).select { |k, v| v['farm'] == name }.keys
80
+ a
81
+ end
82
+ end
83
+
61
84
  def modules_counted(config, env = 'production', reload = false)
62
85
  reload_nodes if reload
63
86
  Dir.glob(File.join(config.modulepath, '*')).sort.reduce({}) do |acc, mod|
87
+ mod = File.basename(mod)
88
+ acc[mod] = farms_modules(config, env).select { |k, v| v.include? mod }.length
89
+ acc
90
+ end
91
+ end
92
+
93
+ def modules_farms(config, env = 'production', reload = false)
94
+ reload_nodes if reload
95
+ Dir.glob(File.join(config.modulepath, '*')).sort.reduce({}) do |acc, mod|
96
+ mod = File.basename(mod)
97
+ acc[mod] = farms_modules(config, env).select { |k, v| v.include? mod }.keys
98
+ acc
99
+ end
100
+ end
101
+
102
+ def modules_nodes(config, env = 'production', reload = false, filter = nil)
103
+ reload_nodes if reload
104
+ Dir.glob(File.join(config.modulepath, '*')).sort.reduce({}) do |acc, mod|
105
+ if filter and Regexp.new(filter[0]).match(mod)
106
+ mod = File.basename(mod)
107
+ farms = farms_modules(config, env).select { |k, v| v.include? mod }
108
+ # acc[mod] = farms.map { |f| farms_nodes(config, env, reload, f).values }
109
+ acc[mod] = farms
110
+ end
111
+ acc
112
+ end
113
+ end
114
+
115
+ def find_item(file, regexp)
116
+ File.readlines(file).reduce([]) do |acc, line|
117
+ if regexp.match line
118
+ acc.push $1
119
+ end
64
120
  acc
65
121
  end
66
122
  end
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  basepath: spec/files
3
- classpath: farm_modules/%s.pp
3
+ classpath: farm_modules/%s/manifests/init.pp
4
4
  modulepath: modules
5
5
  hierafile: hiera.yaml
6
6
  paramspath: params
@@ -0,0 +1,3 @@
1
+ class unused_module {
2
+
3
+ }
@@ -6,7 +6,7 @@ describe Hieracles::Config do
6
6
  let(:options) { { config: 'spec/files/config.yml' } }
7
7
  let(:expected) do
8
8
  {
9
- classpath: File.expand_path('spec/files/farm_modules/%s.pp'),
9
+ classpath: File.expand_path('spec/files/farm_modules/%s/manifests/init.pp'),
10
10
  modulepath: File.expand_path('spec/files/modules'),
11
11
  hierafile: File.expand_path('spec/files/hiera.yaml')
12
12
  }
@@ -31,7 +31,7 @@ describe Hieracles::Config do
31
31
  end
32
32
  let(:expected) do
33
33
  {
34
- classpath: File.expand_path('spec/files/farm_modules/%s.pp'),
34
+ classpath: File.expand_path('spec/files/farm_modules/%s/manifests/init.pp'),
35
35
  modulepath: File.expand_path('spec/files/modules'),
36
36
  hierafile: File.expand_path('spec/files/hiera.yaml')
37
37
  }
@@ -63,77 +63,6 @@ describe Hieracles::Formats::Console do
63
63
  end
64
64
  end
65
65
 
66
- describe ".build_head" do
67
- let(:expected) { "[-] (merged)\n\e[31m[0] path1\e[0m\n\e[32m[1] path2\e[0m\n\n" }
68
- before {
69
- allow(node).to receive(:files).and_return(['path1', 'path2'])
70
- }
71
- it "outputs proper text" do
72
- expect(console_format.send :build_head, true).to eq expected
73
- end
74
- end
75
-
76
- describe ".build_params_line" do
77
- context "when not merged" do
78
- let(:expected) {
79
- "[-] \e[36mparams.this.var\e[0m value1\n" +
80
- " \e[97m[0] params.this.var value1\e[0m\n" +
81
- " \e[97m[1] params.this.var value2\e[0m\n"
82
- }
83
- let(:params) {
84
- {
85
- file: '-',
86
- value: 'value1',
87
- overriden: true,
88
- found_in: [
89
- { file: 'path1', value: 'value1' },
90
- { file: 'path2', value: 'value2' }
91
- ]
92
- }
93
- }
94
- before {
95
- console_format.instance_variable_set(:@colors,
96
- {'path1' => 0, 'path2' => 1}
97
- )
98
- }
99
- it "outputs proper text" do
100
- expect(console_format.send :build_params_line,
101
- "params.this.var",
102
- params,
103
- nil).to eq expected
104
- end
105
- end
106
- context "when merged" do
107
- let(:expected) {
108
- "[-] \e[36mparams.this.var\e[0m [\"value1\", \"value2\"]\n"+
109
- " \e[97m[0] params.this.var [\"value1\"]\e[0m\n"+
110
- " \e[97m[1] params.this.var [\"value2\"]\e[0m\n"
111
- }
112
- let(:params) {
113
- {
114
- file: '-',
115
- value: ['value1','value2'],
116
- overriden: true,
117
- found_in: [
118
- { file: 'path1', value: ['value1'] },
119
- { file: 'path2', value: ['value2'] }
120
- ]
121
- }
122
- }
123
- before {
124
- console_format.instance_variable_set(:@colors,
125
- {'path1' => 0, 'path2' => 1}
126
- )
127
- }
128
- it "outputs proper text" do
129
- expect(console_format.send :build_params_line,
130
- "params.this.var",
131
- params,
132
- nil).to eq expected
133
- end
134
- end
135
- end
136
-
137
66
  describe ".build_modules_line" do
138
67
  before {
139
68
  allow(node).to receive(:modules).and_return(
@@ -19,6 +19,27 @@ describe Hieracles::Registry do
19
19
  it { expect(Hieracles::Registry.farms config).to eq expected }
20
20
  end
21
21
 
22
+ describe '.farm_modules' do
23
+ let(:config) { Hieracles::Config.new options }
24
+ let(:expected) { {
25
+ 'dev' => [
26
+ "fake_module",
27
+ "fake_module2",
28
+ "fake_module3"
29
+ ],
30
+ 'dev2' => [
31
+ "fake_module",
32
+ "fake_module2",
33
+ "fake_module4"
34
+ ],
35
+ 'dev4' => [
36
+ "faux_module1",
37
+ "faux_module2"
38
+ ]
39
+ } }
40
+ it { expect(Hieracles::Registry.farms_modules config).to eq expected }
41
+ end
42
+
22
43
  describe '.nodes' do
23
44
  let(:expected) { [
24
45
  'server.example.com',
@@ -36,7 +57,8 @@ describe Hieracles::Registry do
36
57
  'fake_module2',
37
58
  'fake_module3',
38
59
  'faux_module1',
39
- 'faux_module2'
60
+ 'faux_module2',
61
+ 'unused_module'
40
62
  ] }
41
63
  let(:config) { Hieracles::Config.new options }
42
64
  it { expect(Hieracles::Registry.modules config).to eq expected }
@@ -83,5 +105,33 @@ describe Hieracles::Registry do
83
105
  it { expect(Hieracles::Registry.farms_counted config).to eq expected }
84
106
  end
85
107
 
108
+ describe '.modules_counted' do
109
+ let(:expected) {
110
+ {
111
+ 'fake_module' => 2,
112
+ 'fake_module2' => 2,
113
+ 'fake_module3' => 1,
114
+ 'faux_module1' => 1,
115
+ 'faux_module2' => 1,
116
+ 'unused_module' => 0
117
+ }
118
+ }
119
+ let(:config) { Hieracles::Config.new options }
120
+ it { expect(Hieracles::Registry.modules_counted config).to eq expected }
121
+ end
122
+
123
+ describe '.find_item' do
124
+ let(:config) { Hieracles::Config.new options }
125
+ let(:expected) {
126
+ [
127
+ 'fake_module',
128
+ 'fake_module2',
129
+ 'fake_module3'
130
+ ]
131
+ }
132
+ let(:file) { format(config.classpath, 'dev') }
133
+ let(:regex) { Regexp.new('\s*include\s*([-_a-z0-9]*)') }
134
+ it { expect(Hieracles::Registry.find_item file, regex).to eq expected }
135
+ end
86
136
 
87
137
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hieracles
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - mose
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-27 00:00:00.000000000 Z
11
+ date: 2016-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -56,30 +56,30 @@ dependencies:
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '1.7'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '1.7'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '10.0'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '10.0'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: 0.12.0
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: '0'
124
+ version: 0.12.0
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rubocop
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -140,6 +140,7 @@ description: CLI tool for Hiera parameters visualization and analysis.
140
140
  email:
141
141
  - mose@gandi.net
142
142
  executables:
143
+ - hieracles
143
144
  - hc
144
145
  - ppdb
145
146
  extensions: []
@@ -150,11 +151,13 @@ files:
150
151
  - LICENSE
151
152
  - README.md
152
153
  - bin/hc
154
+ - bin/hieracles
153
155
  - bin/ppdb
154
156
  - hc.1
155
157
  - lib/hieracles.rb
156
158
  - lib/hieracles/actions.rb
157
159
  - lib/hieracles/actions/modules.rb
160
+ - lib/hieracles/commands.rb
158
161
  - lib/hieracles/config.rb
159
162
  - lib/hieracles/format.rb
160
163
  - lib/hieracles/formats/console.rb
@@ -168,8 +171,10 @@ files:
168
171
  - lib/hieracles/node.rb
169
172
  - lib/hieracles/notification.rb
170
173
  - lib/hieracles/options/hc.rb
174
+ - lib/hieracles/options/hieracles.rb
171
175
  - lib/hieracles/options/ppdb.rb
172
176
  - lib/hieracles/optparse.rb
177
+ - lib/hieracles/outputs/console.rb
173
178
  - lib/hieracles/puppetdb.rb
174
179
  - lib/hieracles/puppetdb/apierror.rb
175
180
  - lib/hieracles/puppetdb/client.rb
@@ -189,9 +194,9 @@ files:
189
194
  - spec/files/enc/server4.example.com.yaml
190
195
  - spec/files/facts.json
191
196
  - spec/files/facts.yaml
192
- - spec/files/farm_modules/dev.pp
193
- - spec/files/farm_modules/dev2.pp
194
- - spec/files/farm_modules/dev4.pp
197
+ - spec/files/farm_modules/dev/manifests/init.pp
198
+ - spec/files/farm_modules/dev2/manifests/init.pp
199
+ - spec/files/farm_modules/dev4/manifests/init.pp
195
200
  - spec/files/hiera.yaml
196
201
  - spec/files/hiera_columns.yaml
197
202
  - spec/files/hiera_deep.yaml
@@ -203,6 +208,7 @@ files:
203
208
  - spec/files/modules/fake_module3/manifests/init.pp
204
209
  - spec/files/modules/faux_module1/manifests/init.pp
205
210
  - spec/files/modules/faux_module2/manifests/init.pp
211
+ - spec/files/modules/unused_module/manifests/init.pp
206
212
  - spec/files/params/common/common.yml
207
213
  - spec/files/params/farm/dev.yaml
208
214
  - spec/files/params/farm_datacenter/dev_dc1.yaml
@@ -260,7 +266,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
260
266
  version: '0'
261
267
  requirements: []
262
268
  rubyforge_project:
263
- rubygems_version: 2.5.1
269
+ rubygems_version: 2.5.2
264
270
  signing_key:
265
271
  specification_version: 4
266
272
  summary: CLI tool for Hiera parameters visualization.
@@ -286,13 +292,14 @@ test_files:
286
292
  - spec/files/enc/server.example.com.yaml
287
293
  - spec/files/enc/server4.example.com.yaml
288
294
  - spec/files/enc/server3.example.com.yaml
289
- - spec/files/farm_modules/dev4.pp
290
- - spec/files/farm_modules/dev.pp
291
- - spec/files/farm_modules/dev2.pp
295
+ - spec/files/farm_modules/dev2/manifests/init.pp
296
+ - spec/files/farm_modules/dev4/manifests/init.pp
297
+ - spec/files/farm_modules/dev/manifests/init.pp
292
298
  - spec/files/hiera_yamlbackend_notfound.yaml
293
299
  - spec/files/hiera.yaml
294
300
  - spec/files/modules/fake_module3/manifests/init.pp
295
301
  - spec/files/modules/fake_module/manifests/init.pp
302
+ - spec/files/modules/unused_module/manifests/init.pp
296
303
  - spec/files/modules/fake_module2/manifests/init.pp
297
304
  - spec/files/modules/faux_module2/manifests/init.pp
298
305
  - spec/files/modules/faux_module1/manifests/init.pp