knife-inspect 0.8.0 → 0.9.0

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.
Files changed (41) hide show
  1. checksums.yaml +5 -13
  2. data/.travis.yml +3 -2
  3. data/HISTORY.md +12 -0
  4. data/README.md +10 -0
  5. data/knife-inspect.gemspec +2 -2
  6. data/lib/chef/knife/cookbook_inspect.rb +4 -27
  7. data/lib/chef/knife/data_bag_inspect.rb +7 -3
  8. data/lib/chef/knife/environment_inspect.rb +4 -16
  9. data/lib/chef/knife/inspect.rb +6 -5
  10. data/lib/chef/knife/role_inspect.rb +4 -16
  11. data/lib/health_inspector.rb +11 -10
  12. data/lib/health_inspector/checklists/base.rb +30 -27
  13. data/lib/health_inspector/checklists/cookbooks.rb +44 -52
  14. data/lib/health_inspector/checklists/data_bag_items.rb +11 -12
  15. data/lib/health_inspector/checklists/data_bags.rb +5 -6
  16. data/lib/health_inspector/checklists/environments.rb +8 -9
  17. data/lib/health_inspector/checklists/roles.rb +6 -7
  18. data/lib/health_inspector/color.rb +18 -19
  19. data/lib/health_inspector/context.rb +1 -1
  20. data/lib/health_inspector/pairing.rb +27 -32
  21. data/lib/health_inspector/runner.rb +29 -0
  22. data/lib/health_inspector/version.rb +1 -1
  23. data/spec/chef-repo/data_bags/data_bag_one/one.json +4 -0
  24. data/spec/chef-repo/data_bags/data_bag_two/two.json +1 -0
  25. data/spec/chef/knife/cookbook_inspect_spec.rb +10 -0
  26. data/spec/chef/knife/data_bag_inspect_spec.rb +79 -0
  27. data/spec/chef/knife/environment_inspect_spec.rb +10 -0
  28. data/spec/chef/knife/inspect_spec.rb +51 -0
  29. data/spec/chef/knife/role_inspect_spec.rb +10 -0
  30. data/spec/health_inspector/checklists/cookbook_spec.rb +23 -21
  31. data/spec/health_inspector/checklists/cookbooks_spec.rb +14 -12
  32. data/spec/health_inspector/checklists/data_bag_item_spec.rb +3 -3
  33. data/spec/health_inspector/checklists/data_bag_items_spec.rb +96 -10
  34. data/spec/health_inspector/checklists/data_bag_spec.rb +3 -3
  35. data/spec/health_inspector/checklists/data_bags_spec.rb +28 -11
  36. data/spec/health_inspector/checklists/environment_spec.rb +6 -7
  37. data/spec/health_inspector/checklists/environments_spec.rb +9 -11
  38. data/spec/health_inspector/checklists/role_spec.rb +3 -3
  39. data/spec/health_inspector/checklists/roles_spec.rb +9 -11
  40. data/spec/spec_helper.rb +122 -56
  41. metadata +37 -26
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- YTcyNzJmYmE2Nzg0ZWRjN2QyMTA4YzA0ODJiZTNiYjg5ODE0NGNiNA==
5
- data.tar.gz: !binary |-
6
- NDNkMTNlNWM5ODc3OGZhNmE0ZDI3ODliZTRmZGIzMGNiYTRkNjc0ZA==
2
+ SHA1:
3
+ metadata.gz: 316a4b1c10a5933ca22aca053893070e92e0d6ce
4
+ data.tar.gz: 647775423040ddc38db71ec6fa0fefa242ae5322
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- Y2I1MTdlYTViNDdiZWQwZDA3OTM1NDhiYjgyZTM1MmNmNzM4NTMyZTliZmY1
10
- YTJjOTA1MmRlZWIyYTE1NjdhNDUyMmYyNmYzYTZhZGU4ODM2YjdiNDE3ZWNj
11
- Yzk5MjYzM2IyZmIwODM5ZDg5MjM5NzY4MWRjMWFkYWYzZDMyMDY=
12
- data.tar.gz: !binary |-
13
- OWQ2NWRiYmYxMWIyMTg1YWRiMTc0MTljNzQ2NTkwYTgzZTcyZTcwMjFmNDc2
14
- NzFkN2FkOWRmNDYxNTZhZjZmNDkwY2FhYjNiNzIzMmI1Y2ZhZTMyNThkNmZh
15
- YTQyZjM0ZjdhNmU5MGI3OTdmZmIyOTJjMDFhMGEwNDg1Nzk3NmU=
6
+ metadata.gz: 6cc9b27c85c801807d98e22f255f3f0a4bbe7bdcfb747f521a1c06e9af7a55f4bbbebb66325950a029be16803377279766263e0e636aa81adc4b59112016939f
7
+ data.tar.gz: 69d5f911e727f954a8bdaea2ec182092e6bfcb6390b5ab9d5587ce3738c04961407ba9c9571166ea038540841538e192d0ab924b7c8a68ed9aabd1f9446b4008
data/.travis.yml CHANGED
@@ -1,8 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
+ - 2.1.2
4
5
  env:
5
- - CHEF_VERSION=10.30.2
6
- - CHEF_VERSION=11.8.2
6
+ - CHEF_VERSION=10.32.2
7
+ - CHEF_VERSION=11.14.2
7
8
  before_script:
8
9
  - chef-client --version
data/HISTORY.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 0.9.0 ( 2014-08-02 )
2
+
3
+ * Bug fix: update yajl-ruby dependency to 1.2, 1.1 segfaulted in some cases
4
+ ([#22][#22])
5
+ * Feature: Make output not use unicode when stdout is not a TTY. (Ben Hughes)
6
+ ([#21][#21])
7
+ * Bug fix: fix a bug with git submodules in some cases
8
+ ([#7][#7])
9
+
1
10
  ## 0.8.0 ( 2014-01-10 )
2
11
 
3
12
  * New feature: Support data bags, data bag items, environments and roles inside
@@ -122,3 +131,6 @@
122
131
  [#14]: https://github.com/bmarini/knife-inspect/issues/14
123
132
  [#6]: https://github.com/bmarini/knife-inspect/issues/6
124
133
  [#2]: https://github.com/bmarini/knife-inspect/issues/2
134
+ [#21]: https://github.com/bmarini/knife-inspect/issues/21
135
+ [#22]: https://github.com/bmarini/knife-inspect/issues/22
136
+ [#7]: https://github.com/bmarini/knife-inspect/issues/7
data/README.md CHANGED
@@ -48,6 +48,15 @@ So far it checks if...
48
48
  You can use it with your favorite Continuous Integration tool, it returns 0
49
49
  when everything is in sync or 1 if it's not.
50
50
 
51
+ ## Frequently Asked Questions
52
+
53
+ ### How is it different [from knife diff](http://docs.opscode.com/knife_diff.html)?
54
+
55
+ * It returns the proper return code, so you can [use it with a Continuous Integration tool](https://blog.5apps.com/2014/01/07/using-travis-to-make-sure-your-chef-repo-and-server-are-in-sync.html)
56
+ * `knife diff` seems to expect local roles to be json files, knife-inspect supports both JSON and Ruby.
57
+ * It's my personal opinion, but I think the output from knife-inspect is more readable. Also I don't understand some of the errors I'm getting with `knife diff` (`Only in .: clients` for example)
58
+ * I actually didn't know there was a built-in `knife diff` command.
59
+
51
60
  ## Contributors
52
61
 
53
62
  (in alphabetical order)
@@ -56,6 +65,7 @@ when everything is in sync or 1 if it's not.
56
65
  * Eric Saxby ([@sax](https://github.com/sax))
57
66
  * Dan Buch ([@meatballhat](@https://github.com/meatballhat))
58
67
  * Kirt Fitzpatrick ([@kirtfitzpatrick](https://github.com/kirtfitzpatrick))
68
+ * Ben Hughes ([@barn](https://github.com/barn))
59
69
 
60
70
  ## Contributing
61
71
 
@@ -24,10 +24,10 @@ Gem::Specification.new do |s|
24
24
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
25
25
 
26
26
  s.add_development_dependency 'rake', '~> 10.1'
27
- s.add_development_dependency 'rspec', '~> 2.14'
27
+ s.add_development_dependency 'rspec', '~> 3.0.0'
28
28
  s.add_development_dependency 'simplecov', '~> 0.8'
29
29
  s.add_development_dependency 'coveralls', '~> 0.7'
30
30
 
31
31
  s.add_runtime_dependency 'chef', chef_version
32
- s.add_runtime_dependency 'yajl-ruby', '~> 1.1'
32
+ s.add_runtime_dependency 'yajl-ruby', '~> 1.2'
33
33
  end
@@ -1,36 +1,13 @@
1
1
  require 'chef/knife'
2
+ require 'health_inspector'
2
3
 
3
4
  class Chef
4
5
  class Knife
5
6
  class CookbookInspect < Knife
7
+ include HealthInspector::Runner
6
8
 
7
- deps do
8
- require 'health_inspector'
9
- require 'chef/json_compat'
10
- require 'uri'
11
- require 'chef/cookbook_version'
12
- end
13
-
14
- banner "knife cookbook inspect [COOKBOOK] (options)"
15
-
16
- def run
17
- case @name_args.length
18
- when 1 # We are inspecting a cookbook
19
- cookbook_name = @name_args[0]
20
- # TODO: Support environments
21
- # env = config[:environment]
22
- # api_endpoint = env ? "environments/#{env}/cookbooks/#{cookbook_name}" : "cookbooks/#{cookbook_name}"
23
-
24
- validator = HealthInspector::Checklists::Cookbooks.new(self)
25
- exit validator.validate_item( validator.load_item(cookbook_name) )
26
- when 0 # We are inspecting all the cookbooks
27
- exit HealthInspector::Checklists::Cookbooks.run(self)
28
- end
29
- end
9
+ checklist HealthInspector::Checklists::Cookbooks
10
+ banner 'knife cookbook inspect [COOKBOOK] (options)'
30
11
  end
31
12
  end
32
13
  end
33
-
34
-
35
-
36
-
@@ -3,11 +3,13 @@ require 'chef/knife'
3
3
  class Chef
4
4
  class Knife
5
5
  class DataBagInspect < Knife
6
+ # :nocov:
6
7
  deps do
7
8
  require 'health_inspector'
8
9
  end
10
+ # :nocov:
9
11
 
10
- banner "knife data bag inspect [BAG] [ITEM] (options)"
12
+ banner 'knife data bag inspect [BAG] [ITEM] (options)'
11
13
 
12
14
  def run
13
15
  case @name_args.length
@@ -16,13 +18,15 @@ class Chef
16
18
  item_name = @name_args[1]
17
19
 
18
20
  validator = HealthInspector::Checklists::DataBagItems.new(self)
19
- exit validator.validate_item(validator.load_item("#{bag_name}/#{item_name}"))
21
+ item = validator.load_item("#{bag_name}/#{item_name}")
22
+ exit validator.validate_item item
20
23
 
21
24
  when 1 # We are inspecting a data bag
22
25
  bag_name = @name_args[0]
23
26
 
24
27
  validator = HealthInspector::Checklists::DataBags.new(self)
25
- exit validator.validate_item(validator.load_item(bag_name))
28
+ item = validator.load_item(bag_name)
29
+ exit validator.validate_item item
26
30
 
27
31
  when 0 # We are inspecting all the data bags
28
32
  exit HealthInspector::Checklists::DataBags.run(self) &&
@@ -1,25 +1,13 @@
1
1
  require 'chef/knife'
2
+ require 'health_inspector'
2
3
 
3
4
  class Chef
4
5
  class Knife
5
6
  class EnvironmentInspect < Knife
7
+ include HealthInspector::Runner
6
8
 
7
- deps do
8
- require 'health_inspector'
9
- end
10
-
11
- banner "knife environment inspect [ENVIRONMENT] (options)"
12
-
13
- def run
14
- case @name_args.length
15
- when 1 # We are inspecting a environment
16
- environment_name = @name_args[0]
17
- validator = HealthInspector::Checklists::Environments.new(self)
18
- exit validator.validate_item( validator.load_item(environment_name) )
19
- when 0 # We are inspecting all the environments
20
- exit HealthInspector::Checklists::Environments.run(self)
21
- end
22
- end
9
+ checklist HealthInspector::Checklists::Environments
10
+ banner 'knife environment inspect [ENVIRONMENT] (options)'
23
11
  end
24
12
  end
25
13
  end
@@ -3,21 +3,22 @@ require 'chef/knife'
3
3
  class Chef
4
4
  class Knife
5
5
  class Inspect < Knife
6
+ CHECKLISTS = %w(Cookbooks DataBags DataBagItems Environments Roles)
6
7
 
7
- CHECKLISTS = %w[Cookbooks DataBags DataBagItems Environments Roles]
8
-
8
+ # :nocov:
9
9
  deps do
10
- require "health_inspector"
10
+ require 'health_inspector'
11
11
  end
12
+ # :nocov:
12
13
 
13
- banner "knife inspect"
14
+ banner 'knife inspect'
14
15
 
15
16
  def run
16
17
  results = CHECKLISTS.map do |checklist|
17
18
  HealthInspector::Checklists.const_get(checklist).run(self)
18
19
  end
19
20
 
20
- exit ! results.include?(false)
21
+ exit !results.include?(false)
21
22
  end
22
23
  end
23
24
  end
@@ -1,25 +1,13 @@
1
1
  require 'chef/knife'
2
+ require 'health_inspector'
2
3
 
3
4
  class Chef
4
5
  class Knife
5
6
  class RoleInspect < Knife
7
+ include HealthInspector::Runner
6
8
 
7
- deps do
8
- require 'health_inspector'
9
- end
10
-
11
- banner "knife role inspect [ROLE] (options)"
12
-
13
- def run
14
- case @name_args.length
15
- when 1 # We are inspecting a role
16
- role_name = @name_args[0]
17
- validator = HealthInspector::Checklists::Roles.new(self)
18
- exit validator.validate_item( validator.load_item(role_name) )
19
- when 0 # We are inspecting all the roles
20
- exit HealthInspector::Checklists::Roles.run(self)
21
- end
22
- end
9
+ checklist HealthInspector::Checklists::Roles
10
+ banner 'knife role inspect [ROLE] (options)'
23
11
  end
24
12
  end
25
13
  end
@@ -1,14 +1,15 @@
1
1
  # encoding: UTF-8
2
- require "health_inspector/version"
3
- require "health_inspector/color"
4
- require "health_inspector/context"
5
- require "health_inspector/pairing"
6
- require "health_inspector/checklists/base"
7
- require "health_inspector/checklists/cookbooks"
8
- require "health_inspector/checklists/data_bags"
9
- require "health_inspector/checklists/data_bag_items"
10
- require "health_inspector/checklists/environments"
11
- require "health_inspector/checklists/roles"
2
+ require 'health_inspector/version'
3
+ require 'health_inspector/color'
4
+ require 'health_inspector/context'
5
+ require 'health_inspector/pairing'
6
+ require 'health_inspector/runner'
7
+ require 'health_inspector/checklists/base'
8
+ require 'health_inspector/checklists/cookbooks'
9
+ require 'health_inspector/checklists/data_bags'
10
+ require 'health_inspector/checklists/data_bag_items'
11
+ require 'health_inspector/checklists/environments'
12
+ require 'health_inspector/checklists/roles'
12
13
  require 'chef/rest'
13
14
  require 'chef/version'
14
15
 
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
- require "pathname"
2
+ require 'pathname'
3
3
 
4
4
  module HealthInspector
5
5
  module Checklists
@@ -9,7 +9,7 @@ module HealthInspector
9
9
  class << self
10
10
  attr_reader :title
11
11
 
12
- def title(val=nil)
12
+ def title(val = nil)
13
13
  val.nil? ? @title : @title = val
14
14
  end
15
15
  end
@@ -27,11 +27,11 @@ module HealthInspector
27
27
  end
28
28
 
29
29
  def server_items
30
- raise NotImplementedError, "You must implement this method in a subclass"
30
+ fail NotImplementedError, 'You must implement this method in a subclass'
31
31
  end
32
32
 
33
33
  def local_items
34
- raise NotImplementedError, "You must implement this method in a subclass"
34
+ fail NotImplementedError, 'You must implement this method in a subclass'
35
35
  end
36
36
 
37
37
  def all_item_names
@@ -53,7 +53,7 @@ module HealthInspector
53
53
  results << validate_item(item)
54
54
  end
55
55
 
56
- return ! results.include?(false)
56
+ !results.include?(false)
57
57
  end
58
58
 
59
59
  def validate_item(item)
@@ -61,7 +61,7 @@ module HealthInspector
61
61
  failures = item.errors
62
62
 
63
63
  if failures.empty?
64
- print_success(item.name) # unless @context.quiet_success
64
+ print_success(item.name)
65
65
 
66
66
  true
67
67
  else
@@ -72,13 +72,17 @@ module HealthInspector
72
72
  end
73
73
 
74
74
  def banner(message)
75
- ui.msg ""
75
+ ui.msg ''
76
76
  ui.msg message
77
- ui.msg "-" * 80
77
+ ui.msg '-' * 80
78
78
  end
79
79
 
80
80
  def print_success(subject)
81
- ui.msg color('bright pass', "✓") + " #{subject}"
81
+ if $stdout.tty?
82
+ ui.msg color('bright pass', "✓") + " #{subject}"
83
+ else
84
+ ui.msg "Success #{subject}"
85
+ end
82
86
  end
83
87
 
84
88
  def print_failures(subject, failures)
@@ -86,7 +90,7 @@ module HealthInspector
86
90
 
87
91
  failures.each do |message|
88
92
  if message.is_a? Hash
89
- puts color('bright yellow'," has the following values mismatched on the server and repo\n")
93
+ puts color('bright yellow', " has the following values mismatched on the server and repo\n")
90
94
  print_failures_from_hash(message)
91
95
  else
92
96
  puts color('bright yellow', " #{message}")
@@ -94,13 +98,13 @@ module HealthInspector
94
98
  end
95
99
  end
96
100
 
97
- def print_failures_from_hash(message, depth=2)
101
+ def print_failures_from_hash(message, depth = 2)
98
102
  message.keys.each do |key|
99
- print_key(key,depth)
103
+ print_key(key, depth)
100
104
 
101
- if message[key].include? "server"
102
- print_value_diff(message[key],depth)
103
- message[key].delete_if { |k,v| k == "server" || "local" }
105
+ if message[key].include? 'server'
106
+ print_value_diff(message[key], depth)
107
+ message[key].delete_if { |k, _| k == 'server' || 'local' }
104
108
  print_failures_from_hash(message[key], depth + 1) unless message[key].empty?
105
109
  else
106
110
  print_failures_from_hash(message[key], depth + 1)
@@ -109,30 +113,30 @@ module HealthInspector
109
113
  end
110
114
 
111
115
  def print_key(key, depth)
112
- ui.msg indent(color('bright yellow',"#{key} : "), depth)
116
+ ui.msg indent(color('bright yellow', "#{key} : "), depth)
113
117
  end
114
118
 
115
119
  def print_value_diff(value, depth)
116
- print indent(color('bright fail',"server value = "), depth + 1)
117
- print value["server"]
120
+ print indent(color('bright fail', 'server value = '), depth + 1)
121
+ print value['server']
118
122
  print "\n"
119
- print indent(color('bright fail',"local value = "), depth + 1)
120
- print value["local"]
123
+ print indent(color('bright fail', 'local value = '), depth + 1)
124
+ print value['local']
121
125
  print "\n\n"
122
126
  end
123
127
 
124
128
  def load_ruby_or_json_from_local(chef_class, folder, name)
125
129
  path_template = "#{@context.repo_path}/#{folder}/**/#{name}.%s"
126
- ruby_pathname = Pathname.glob(path_template % "rb")
127
- json_pathname = Pathname.glob(path_template % "json")
128
- js_pathname = Pathname.glob(path_template % "js")
130
+ ruby_pathname = Pathname.glob(path_template % 'rb')
131
+ json_pathname = Pathname.glob(path_template % 'json')
132
+ js_pathname = Pathname.glob(path_template % 'js')
129
133
 
130
- if ! ruby_pathname.empty?
134
+ if !ruby_pathname.empty?
131
135
  instance = chef_class.new
132
136
  instance.from_file(ruby_pathname.first.to_s)
133
- elsif ! json_pathname.empty?
137
+ elsif !json_pathname.empty?
134
138
  instance = chef_class.json_create(Yajl::Parser.parse(json_pathname.first.read))
135
- elsif ! js_pathname.empty?
139
+ elsif !js_pathname.empty?
136
140
  instance = chef_class.json_create(Yajl::Parser.parse(js_pathname.first.read))
137
141
  end
138
142
 
@@ -144,7 +148,6 @@ module HealthInspector
144
148
  def indent(string, depth)
145
149
  (' ' * 2 * depth) + string
146
150
  end
147
-
148
151
  end
149
152
  end
150
153
  end
@@ -1,66 +1,62 @@
1
1
  module HealthInspector
2
2
  module Checklists
3
-
4
3
  class Cookbook < Pairing
5
4
  include ExistenceValidations
6
5
 
7
6
  def validate_versions
8
- if versions_exist? && ! versions_match?
7
+ if versions_exist? && !versions_match?
9
8
  errors.add "chef server has #{server} but local version is #{local}"
10
9
  end
11
10
  end
12
11
 
13
12
  def validate_uncommited_changes
14
- if git_repo?
15
- result = `cd #{cookbook_path} && git status -s`
13
+ return unless git_repo?
16
14
 
17
- unless result.empty?
18
- errors.add "Uncommitted changes:\n#{result.chomp}"
19
- end
20
- end
15
+ result = `cd #{cookbook_path} && git status -s`
16
+
17
+ errors.add "Uncommitted changes:\n#{result.chomp}" unless result.empty?
21
18
  end
22
19
 
23
20
  def validate_commits_not_pushed_to_remote
24
- if git_repo?
25
- result = `cd #{cookbook_path} && git status`
21
+ return unless git_repo?
26
22
 
27
- if result =~ /Your branch is ahead of (.+)/
28
- errors.add "ahead of #{$1}"
29
- end
23
+ result = `cd #{cookbook_path} && git status`
24
+
25
+ if result =~ /Your branch is ahead of (.+)/
26
+ errors.add "ahead of #{Regexp.last_match[1]}"
30
27
  end
31
28
  end
32
29
 
33
30
  # TODO: Check files that exist locally but not in manifest on server
34
31
  def validate_changes_on_the_server_not_in_the_repo
35
- if versions_exist? && versions_match?
36
-
37
- begin
38
- cookbook = context.rest.get_rest("/cookbooks/#{name}/#{local}")
39
- messages = []
40
-
41
- Chef::CookbookVersion::COOKBOOK_SEGMENTS.each do |segment|
42
- cookbook.manifest[segment].each do |manifest_record|
43
- path = cookbook_path.join("#{manifest_record["path"]}")
44
-
45
- if path.exist?
46
- checksum = checksum_cookbook_file(path)
47
- messages << "#{manifest_record['path']}" if checksum != manifest_record['checksum']
48
- else
49
- messages << "#{manifest_record['path']} does not exist in the repo"
50
- end
32
+ return unless versions_exist? && versions_match?
33
+
34
+ begin
35
+ cookbook = context.rest.get_rest("/cookbooks/#{name}/#{local}")
36
+ messages = []
37
+
38
+ Chef::CookbookVersion::COOKBOOK_SEGMENTS.each do |segment|
39
+ cookbook.manifest[segment].each do |manifest_record|
40
+ path = cookbook_path.join("#{manifest_record['path']}")
41
+ next if path.basename.to_s == '.git'
42
+
43
+ if path.exist?
44
+ checksum = checksum_cookbook_file(path)
45
+ messages << "#{manifest_record['path']}" if checksum != manifest_record['checksum']
46
+ else
47
+ messages << "#{manifest_record['path']} does not exist in the repo"
51
48
  end
52
49
  end
50
+ end
53
51
 
54
- unless messages.empty?
55
- message = "has a checksum mismatch between server and repo in\n"
56
- message << messages.map { |f| " #{f}" }.join("\n")
57
- errors.add message
58
- end
59
-
60
- rescue Net::HTTPServerException => e
61
- errors.add "Could not find cookbook #{name} on the server"
52
+ unless messages.empty?
53
+ message = "has a checksum mismatch between server and repo in\n"
54
+ message << messages.map { |f| " #{f}" }.join("\n")
55
+ errors.add message
62
56
  end
63
57
 
58
+ rescue Net::HTTPServerException
59
+ errors.add "Could not find cookbook #{name} on the server"
64
60
  end
65
61
  end
66
62
 
@@ -84,34 +80,31 @@ module HealthInspector
84
80
  def checksum_cookbook_file(filepath)
85
81
  Chef::CookbookVersion.checksum_cookbook_file(filepath)
86
82
  end
87
-
88
83
  end
89
84
 
90
85
  class Cookbooks < Base
91
-
92
- title "cookbooks"
86
+ title 'cookbooks'
93
87
 
94
88
  def load_item(name)
95
89
  Cookbook.new(@context,
96
- :name => name,
97
- :server => server_items[name],
98
- :local => local_items[name]
99
- )
90
+ name: name,
91
+ server: server_items[name],
92
+ local: local_items[name])
100
93
  end
101
94
 
102
95
  def server_items
103
- @context.rest.get_rest("/cookbooks").inject({}) do |hsh, (name,version)|
104
- hsh[name] = Chef::Version.new(version["versions"].first["version"])
96
+ @context.rest.get_rest('/cookbooks').reduce({}) do |hsh, (name, version)|
97
+ hsh[name] = Chef::Version.new(version['versions'].first['version'])
105
98
  hsh
106
99
  end
107
100
  end
108
101
 
109
102
  def local_items
110
- @context.cookbook_path.
111
- map { |path| Dir["#{path}/*"] }.
112
- flatten.
113
- select { |path| File.exists?("#{path}/metadata.rb") }.
114
- inject({}) do |hsh, path|
103
+ @context.cookbook_path
104
+ .map { |path| Dir["#{path}/*"] }
105
+ .flatten
106
+ .select { |path| File.exist?("#{path}/metadata.rb") }
107
+ .reduce({}) do |hsh, path|
115
108
 
116
109
  name = File.basename(path)
117
110
  version = (`grep '^version' #{path}/metadata.rb`).split.last[1...-1]
@@ -124,7 +117,6 @@ module HealthInspector
124
117
  def all_item_names
125
118
  (server_items.keys + local_items.keys).uniq.sort
126
119
  end
127
-
128
120
  end
129
121
  end
130
122
  end