kitchen-inspector 1.1.0 → 1.2.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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG.md +18 -0
- data/README.md +6 -0
- data/lib/kitchen-inspector/inspector.rb +3 -1
- data/lib/kitchen-inspector/inspector/cli.rb +5 -6
- data/lib/kitchen-inspector/inspector/health_bureau.rb +26 -2
- data/lib/kitchen-inspector/inspector/mixin/utils.rb +1 -1
- data/lib/kitchen-inspector/inspector/models/dependency.rb +89 -0
- data/lib/kitchen-inspector/inspector/models/repo_cookbook.rb +54 -0
- data/lib/kitchen-inspector/inspector/repository_inspector.rb +2 -2
- data/lib/kitchen-inspector/inspector/repository_managers/base.rb +2 -2
- data/lib/kitchen-inspector/inspector/repository_managers/github.rb +6 -5
- data/lib/kitchen-inspector/inspector/repository_managers/gitlab.rb +4 -3
- data/lib/kitchen-inspector/inspector/version.rb +1 -1
- data/spec/github_manager_spec.rb +16 -15
- data/spec/gitlab_manager_spec.rb +4 -2
- data/spec/{dependency_inspector_spec.rb → health_bureau_spec.rb} +43 -9
- data/spec/report_spec.rb +3 -3
- metadata +7 -5
- data/lib/kitchen-inspector/inspector/dependency.rb +0 -87
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 68e23844d77116a23b08ba739b8ed04569aaa82f
|
|
4
|
+
data.tar.gz: a5e820d914562944de16eaf98053fa9dee7051e0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 154b8702208b8d647427e985a7c26674180663b82cfd6656b2fb2c71072b9e5d54eae281ac48617caa8c475d16c2a3d6f0f5d30394aa2a68272363d21e3e2d2d
|
|
7
|
+
data.tar.gz: 498cbbc3e0cfc33836211b7e7d16849ec6b42676ff1c995ddef4f27b7f85a109d357807051ba710146f857a750cf36bcda16592c016ed904f8042d6a40a8e98e
|
data/.travis.yml
CHANGED
|
@@ -6,4 +6,4 @@ rvm:
|
|
|
6
6
|
script: bundle exec rspec spec
|
|
7
7
|
env:
|
|
8
8
|
global:
|
|
9
|
-
secure:
|
|
9
|
+
secure: QquzUUCraIbBpzZbihr2LEdbnTVxUyBYNgHMvc5Z94HUh8R8ShITRz1zWUvTXQ41IA71/ML1loF8BFHFEE0+Zli6wi8ctoA+/CdH14lFHA6mBaT0o4JRGenAcnG2/1PFVj7CfCjlJe2EBJ/DHpR6bOaiDH4tL42O6fAWu6CDfyQ=
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
Changes
|
|
2
2
|
==
|
|
3
|
+
|
|
4
|
+
12 Feb 2014 (1.2.0)
|
|
5
|
+
--
|
|
6
|
+
|
|
7
|
+
FEATURES:
|
|
8
|
+
|
|
9
|
+
* Fallback to *knife.rb* for Chef Server configuration
|
|
10
|
+
|
|
11
|
+
FIXES:
|
|
12
|
+
|
|
13
|
+
* Detect when inspectors are not configured at all
|
|
14
|
+
* Blacklist metadata.rb's fields instead of using a whitelist
|
|
15
|
+
* Fix cache key for changelog
|
|
16
|
+
|
|
17
|
+
CHANGES:
|
|
18
|
+
|
|
19
|
+
* Show 'inspect' in help instead of 'investigate'
|
|
20
|
+
|
|
3
21
|
17 Dec 2013 (1.1.0)
|
|
4
22
|
--
|
|
5
23
|
|
data/README.md
CHANGED
|
@@ -130,6 +130,9 @@ In order to turn off recursive analysis, simply use _--recursive false_.
|
|
|
130
130
|
|
|
131
131
|
By default *${HOME}/.chef/kitchen_inspector.rb* is picked, but _--config_ can be used to override that setting.
|
|
132
132
|
|
|
133
|
+
Valid Repository Manager and Chef Server configurations must be provided.
|
|
134
|
+
When a Chef Server configuration is not specified in *kitchen_inspector.rb* it fallbacks to *${HOME}/.chef/knife.rb*, if present.
|
|
135
|
+
|
|
133
136
|
```
|
|
134
137
|
$ kitchen-inspector --config config_example.rb
|
|
135
138
|
```
|
|
@@ -167,6 +170,9 @@ host the cookbooks you're interested in.
|
|
|
167
170
|
So, even though a *token* is not strictly required, it's better to configure it as well.
|
|
168
171
|
From [GitHub's Applications page](https://github.com/settings/applications) go to "Personal Access Tokens" and generate a new token.
|
|
169
172
|
|
|
173
|
+
Due to the huge search space, searches against GitHub are restricted to profiles owned by *allowed_users* (aka GitHub usernames).
|
|
174
|
+
Cookbooks are thus searched only within those users' repositories, comparing cookbooks' names with repositories' names (Pattern "one repo per cookbook").
|
|
175
|
+
|
|
170
176
|
Example:
|
|
171
177
|
|
|
172
178
|
```ruby
|
|
@@ -34,7 +34,9 @@ require 'googl'
|
|
|
34
34
|
require 'kitchen-inspector/inspector/common'
|
|
35
35
|
require 'kitchen-inspector/inspector/mixin/utils'
|
|
36
36
|
require 'kitchen-inspector/inspector/cli'
|
|
37
|
-
|
|
37
|
+
|
|
38
|
+
require 'kitchen-inspector/inspector/models/dependency'
|
|
39
|
+
require 'kitchen-inspector/inspector/models/repo_cookbook'
|
|
38
40
|
|
|
39
41
|
require 'kitchen-inspector/inspector/chef_inspector'
|
|
40
42
|
require 'kitchen-inspector/inspector/repository_inspector'
|
|
@@ -49,16 +49,15 @@ module KitchenInspector
|
|
|
49
49
|
default: false,
|
|
50
50
|
aliases: '--remarks'
|
|
51
51
|
|
|
52
|
-
desc '
|
|
53
|
-
|
|
54
|
-
map 'inspect' => :investigate
|
|
52
|
+
desc 'inspect (COOKBOOK_PATH)', 'Check Repository Manager/Chef Server status of dependent cookbooks'
|
|
53
|
+
map 'inspect' => :investigate
|
|
55
54
|
def investigate(path=Dir.pwd)
|
|
56
55
|
inspector = HealthBureau.new options[:config]
|
|
57
56
|
|
|
58
57
|
dependencies = inspector.investigate(path, options[:recursive])
|
|
59
58
|
|
|
60
59
|
if dependencies.empty?
|
|
61
|
-
puts 'No dependent cookbooks'.yellow
|
|
60
|
+
puts 'No dependent cookbooks.'.yellow
|
|
62
61
|
status_code = :'warning-nodependencies'
|
|
63
62
|
else
|
|
64
63
|
output, status_code = Report.generate(dependencies, options[:format], options)
|
|
@@ -69,10 +68,10 @@ module KitchenInspector
|
|
|
69
68
|
puts e.message.red
|
|
70
69
|
exit STATUS_TO_RETURN_CODES[:'error-config']
|
|
71
70
|
rescue NotACookbookError
|
|
72
|
-
puts 'The path is not a cookbook path'.red
|
|
71
|
+
puts 'The path is not a cookbook path.'.red
|
|
73
72
|
exit STATUS_TO_RETURN_CODES[:'error-notacookbook']
|
|
74
73
|
rescue UnsupportedReportFormatError
|
|
75
|
-
puts "The report format #{options[:format]} is not supported".red
|
|
74
|
+
puts "The report format #{options[:format]} is not supported.".red
|
|
76
75
|
exit STATUS_TO_RETURN_CODES[:'error-reportformat']
|
|
77
76
|
end
|
|
78
77
|
end
|
|
@@ -38,8 +38,14 @@ module KitchenInspector
|
|
|
38
38
|
begin
|
|
39
39
|
self.instance_eval configuration
|
|
40
40
|
rescue NoMethodError => e
|
|
41
|
-
raise ConfigurationError, "Unsupported configuration: #{e.name}"
|
|
41
|
+
raise ConfigurationError, "Unsupported configuration: #{e.name}."
|
|
42
42
|
end
|
|
43
|
+
|
|
44
|
+
raise ConfigurationError, "Chef Server is not configured properly, " \
|
|
45
|
+
"please check your 'chef_server' configuration." unless validate_chef_inspector
|
|
46
|
+
|
|
47
|
+
raise ConfigurationError, "Repository Manager is not configured properly, " \
|
|
48
|
+
"please check your 'repository_manager' configuration." unless @repo_inspector
|
|
43
49
|
end
|
|
44
50
|
|
|
45
51
|
# Inspect your kitchen!
|
|
@@ -54,7 +60,7 @@ module KitchenInspector
|
|
|
54
60
|
|
|
55
61
|
metadata = Ridley::Chef::Cookbook::Metadata.from_file(File.join(path, 'metadata.rb'))
|
|
56
62
|
metadata.dependencies.collect do |name, version|
|
|
57
|
-
analyze_dependency(Dependency.new(name, version), recursive)
|
|
63
|
+
analyze_dependency(Models::Dependency.new(name, version), recursive)
|
|
58
64
|
end.flatten
|
|
59
65
|
end
|
|
60
66
|
|
|
@@ -176,6 +182,24 @@ module KitchenInspector
|
|
|
176
182
|
def repository_manager(config)
|
|
177
183
|
@repo_inspector = RepositoryInspector.new config
|
|
178
184
|
end
|
|
185
|
+
|
|
186
|
+
# Initialize a Chef Inspector using knife.rb settings if not already
|
|
187
|
+
# initialized
|
|
188
|
+
#
|
|
189
|
+
# @return [ChefInspector]
|
|
190
|
+
def validate_chef_inspector
|
|
191
|
+
@chef_inspector ||= begin
|
|
192
|
+
# Fallback to knife.rb if possible
|
|
193
|
+
knife_cfg = "#{Dir.home}/.chef/knife.rb"
|
|
194
|
+
if File.exists?(knife_cfg)
|
|
195
|
+
Chef::Config.from_file knife_cfg
|
|
196
|
+
chef_server({ :username => Chef::Config.node_name,
|
|
197
|
+
:url => Chef::Config.chef_server_url,
|
|
198
|
+
:client_pem => Chef::Config.client_key
|
|
199
|
+
})
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
end
|
|
179
203
|
end
|
|
180
204
|
end
|
|
181
205
|
end
|
|
@@ -71,7 +71,7 @@ module KitchenInspector
|
|
|
71
71
|
def eval_metadata(raw_response)
|
|
72
72
|
clean_response = raw_response.split("\n").select do |line|
|
|
73
73
|
line.strip!
|
|
74
|
-
line
|
|
74
|
+
line !~ /^(long_)*description|^recipe|^maintainer.*|^license/
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
metadata = Ridley::Chef::Cookbook::Metadata.new
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2013 Stefano Tortarolo <stefano.tortarolo@gmail.com>
|
|
3
|
+
#
|
|
4
|
+
# MIT License
|
|
5
|
+
#
|
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
7
|
+
# a copy of this software and associated documentation files (the
|
|
8
|
+
# "Software"), to deal in the Software without restriction, including
|
|
9
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
10
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
11
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
12
|
+
# the following conditions:
|
|
13
|
+
#
|
|
14
|
+
# The above copyright notice and this permission notice shall be
|
|
15
|
+
# included in all copies or substantial portions of the Software.
|
|
16
|
+
#
|
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
18
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
19
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
20
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
21
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
22
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
23
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
24
|
+
#
|
|
25
|
+
|
|
26
|
+
module KitchenInspector
|
|
27
|
+
module Inspector
|
|
28
|
+
module Models
|
|
29
|
+
# The class that contains information about a dependent cookbook
|
|
30
|
+
class Dependency
|
|
31
|
+
include Comparable
|
|
32
|
+
|
|
33
|
+
# The name of the dependency
|
|
34
|
+
attr_reader :name
|
|
35
|
+
|
|
36
|
+
# The requirement for the dependency
|
|
37
|
+
attr_reader :requirement
|
|
38
|
+
|
|
39
|
+
# Info from Chef Server
|
|
40
|
+
attr_accessor :chef
|
|
41
|
+
|
|
42
|
+
# Info from the Repository Manager
|
|
43
|
+
attr_accessor :repomanager
|
|
44
|
+
|
|
45
|
+
# The status of the dependency
|
|
46
|
+
attr_accessor :status
|
|
47
|
+
|
|
48
|
+
# The dependencies of a cookbook
|
|
49
|
+
attr_accessor :dependencies
|
|
50
|
+
|
|
51
|
+
# Remarks field
|
|
52
|
+
attr_accessor :remarks
|
|
53
|
+
|
|
54
|
+
# Dependency's parents (if transitive)
|
|
55
|
+
attr_accessor :parents
|
|
56
|
+
|
|
57
|
+
def initialize(name, requirement)
|
|
58
|
+
@name = name
|
|
59
|
+
@requirement = requirement
|
|
60
|
+
@chef = {}
|
|
61
|
+
@repomanager = {}
|
|
62
|
+
@status = nil
|
|
63
|
+
@remarks = []
|
|
64
|
+
@dependencies = []
|
|
65
|
+
@parents = []
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def ==(anOther)
|
|
69
|
+
name == anOther.name && requirement == anOther.requirement
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def to_hash
|
|
73
|
+
{}.tap do |hash|
|
|
74
|
+
hash[:name] = name
|
|
75
|
+
hash[:requirement] = requirement
|
|
76
|
+
hash[:status] = status
|
|
77
|
+
hash[:remarks] = remarks
|
|
78
|
+
hash[:dependencies] = dependencies
|
|
79
|
+
hash[:chef] = chef
|
|
80
|
+
hash[:chef][:latest_version] = hash[:chef][:latest_version].to_s if hash[:chef][:latest_version]
|
|
81
|
+
hash[:repomanager] = repomanager
|
|
82
|
+
hash[:repomanager][:latest_tag] = hash[:repomanager][:latest_tag].to_s if hash[:repomanager][:latest_tag]
|
|
83
|
+
hash[:repomanager][:latest_metadata] = hash[:repomanager][:latest_metadata].to_s if hash[:repomanager][:latest_metadata]
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2013 Stefano Tortarolo <stefano.tortarolo@gmail.com>
|
|
3
|
+
#
|
|
4
|
+
# MIT License
|
|
5
|
+
#
|
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
7
|
+
# a copy of this software and associated documentation files (the
|
|
8
|
+
# "Software"), to deal in the Software without restriction, including
|
|
9
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
10
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
11
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
12
|
+
# the following conditions:
|
|
13
|
+
#
|
|
14
|
+
# The above copyright notice and this permission notice shall be
|
|
15
|
+
# included in all copies or substantial portions of the Software.
|
|
16
|
+
#
|
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
18
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
19
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
20
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
21
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
22
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
23
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
24
|
+
#
|
|
25
|
+
|
|
26
|
+
module KitchenInspector
|
|
27
|
+
module Inspector
|
|
28
|
+
module Models
|
|
29
|
+
# The class that contains information about a cookbook on Repository Manager
|
|
30
|
+
class RepoCookbook
|
|
31
|
+
include Comparable
|
|
32
|
+
|
|
33
|
+
# The ID of the cookbook on Repository Manager
|
|
34
|
+
attr_reader :id
|
|
35
|
+
|
|
36
|
+
# The name of the cookbook
|
|
37
|
+
attr_reader :name
|
|
38
|
+
|
|
39
|
+
# Path to metadata.rb
|
|
40
|
+
attr_accessor :metadata_path
|
|
41
|
+
|
|
42
|
+
def initialize(id, name, metadata_path)
|
|
43
|
+
@id = id
|
|
44
|
+
@name = name
|
|
45
|
+
@metadata_path = metadata_path
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def ==(anOther)
|
|
49
|
+
name == anOther.name && metadata_path == anOther.metadata_path
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -35,7 +35,7 @@ module KitchenInspector
|
|
|
35
35
|
require "kitchen-inspector/inspector/repository_managers/#{config[:type].downcase}"
|
|
36
36
|
manager_cls = "KitchenInspector::Inspector::#{config[:type]}Manager".constantize
|
|
37
37
|
rescue LoadError, NameError => e
|
|
38
|
-
raise RepositoryManagerError, "Repository Manager '#{config[:type]}' not supported"
|
|
38
|
+
raise RepositoryManagerError, "Repository Manager '#{config[:type]}' not supported."
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
@manager = manager_cls.new config
|
|
@@ -60,7 +60,7 @@ module KitchenInspector
|
|
|
60
60
|
repo_info[:not_unique] = projects.size > 1
|
|
61
61
|
|
|
62
62
|
# Inherit only shallow information from dependency
|
|
63
|
-
prj_dependency = Dependency.new(dependency.name, dependency.requirement)
|
|
63
|
+
prj_dependency = Models::Dependency.new(dependency.name, dependency.requirement)
|
|
64
64
|
prj_dependency.parents = dependency.parents
|
|
65
65
|
|
|
66
66
|
prj_dependency.parents.each do |parent|
|
|
@@ -65,7 +65,7 @@ module KitchenInspector
|
|
|
65
65
|
metadata = project_metadata(project, revId)
|
|
66
66
|
|
|
67
67
|
if metadata
|
|
68
|
-
metadata.dependencies.collect{|dep, constraint| Dependency.new(dep, constraint)}
|
|
68
|
+
metadata.dependencies.collect{|dep, constraint| Models::Dependency.new(dep, constraint)}
|
|
69
69
|
end
|
|
70
70
|
end
|
|
71
71
|
|
|
@@ -98,7 +98,7 @@ module KitchenInspector
|
|
|
98
98
|
# Return a shortened url to the commits between two revisions
|
|
99
99
|
def changelog(project_url, revId, otherRevId)
|
|
100
100
|
return unless project_url && revId && otherRevId
|
|
101
|
-
cache_key = "#{project_url}-#{revId}
|
|
101
|
+
cache_key = "#{project_url}-#{revId}-#{otherRevId}"
|
|
102
102
|
|
|
103
103
|
@changelogs_cache[cache_key] ||=
|
|
104
104
|
begin
|
|
@@ -52,8 +52,8 @@ module KitchenInspector
|
|
|
52
52
|
|
|
53
53
|
# Given a project and a revision retrieve its metadata
|
|
54
54
|
def retrieve_metadata(project, revId)
|
|
55
|
-
response = Octokit.contents(project.
|
|
56
|
-
{:ref => revId, :path =>
|
|
55
|
+
response = Octokit.contents(project.name,
|
|
56
|
+
{:ref => revId, :path => project.metadata_path })
|
|
57
57
|
|
|
58
58
|
if response && response.respond_to?(:content)
|
|
59
59
|
eval_metadata Base64.decode64(response.content)
|
|
@@ -64,7 +64,7 @@ module KitchenInspector
|
|
|
64
64
|
|
|
65
65
|
# Return the full URL for a given project
|
|
66
66
|
def source_url(project)
|
|
67
|
-
"github.com/#{project.
|
|
67
|
+
"github.com/#{project.name}"
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
# Retrieve projects by name
|
|
@@ -76,14 +76,15 @@ module KitchenInspector
|
|
|
76
76
|
repos = repos.items.select do |repo|
|
|
77
77
|
repo.name == name
|
|
78
78
|
end
|
|
79
|
-
|
|
79
|
+
|
|
80
|
+
repos.collect{|repo| Models::RepoCookbook.new(repo.id, repo.full_name, "metadata.rb")}
|
|
80
81
|
end
|
|
81
82
|
end
|
|
82
83
|
|
|
83
84
|
# Given a project return the tags on GitHub
|
|
84
85
|
def retrieve_tags(project)
|
|
85
86
|
tags = {}
|
|
86
|
-
Octokit.tags(project.
|
|
87
|
+
Octokit.tags(project.name).collect do |tag|
|
|
87
88
|
tags[fix_version_name(tag.name)] = tag.commit.sha
|
|
88
89
|
end
|
|
89
90
|
tags
|
|
@@ -58,17 +58,18 @@ module KitchenInspector
|
|
|
58
58
|
|
|
59
59
|
# Return the full URL for a given project
|
|
60
60
|
def source_url(project)
|
|
61
|
-
"#{@gitlab_base_url}/#{project.
|
|
61
|
+
"#{@gitlab_base_url}/#{project.name}"
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
# Retrieve projects by name
|
|
65
65
|
def projects_by_name(name)
|
|
66
|
-
projects.select{|prj| prj.path == name }
|
|
66
|
+
repos = projects.select{|prj| prj.path == name }
|
|
67
|
+
repos.collect{|repo| Models::RepoCookbook.new(repo.id, repo.path_with_namespace, "metadata.rb")}
|
|
67
68
|
end
|
|
68
69
|
|
|
69
70
|
# Given a project and a revision retrieve its metadata
|
|
70
71
|
def retrieve_metadata(project, revId)
|
|
71
|
-
response = HTTParty.get("#{Gitlab.endpoint}/projects/#{project.id}/repository/blobs/#{revId}?filepath
|
|
72
|
+
response = HTTParty.get("#{Gitlab.endpoint}/projects/#{project.id}/repository/blobs/#{revId}?filepath=#{project.metadata_path}",
|
|
72
73
|
headers: {"PRIVATE-TOKEN" => Gitlab.private_token})
|
|
73
74
|
|
|
74
75
|
if response.code == 200
|
data/spec/github_manager_spec.rb
CHANGED
|
@@ -2,7 +2,9 @@ require_relative 'support/spec_helper'
|
|
|
2
2
|
|
|
3
3
|
describe GitHubManager do
|
|
4
4
|
let(:manager) do
|
|
5
|
-
config = {:type => "GitHub",
|
|
5
|
+
config = {:type => "GitHub",
|
|
6
|
+
:allowed_users => ["kitchen-inspector"],
|
|
7
|
+
:token => ENV['GITHUB_TOKEN']}
|
|
6
8
|
|
|
7
9
|
manager = GitHubManager.new config
|
|
8
10
|
manager
|
|
@@ -22,7 +24,7 @@ describe GitHubManager do
|
|
|
22
24
|
it "creates a valid Manager" do
|
|
23
25
|
config = {:type => "GitHub",
|
|
24
26
|
:token => ENV['GITHUB_TOKEN'],
|
|
25
|
-
:allowed_users => ["
|
|
27
|
+
:allowed_users => ["kitchen-inspector"]
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
manager = GitHubManager.new config
|
|
@@ -42,36 +44,35 @@ describe GitHubManager do
|
|
|
42
44
|
end
|
|
43
45
|
|
|
44
46
|
describe "#projects_by_name" do
|
|
45
|
-
it "returns the correct project for
|
|
46
|
-
projects = manager.projects_by_name "
|
|
47
|
+
it "returns the correct project for kitchen-inspector/cook-test", :type => :external do
|
|
48
|
+
projects = manager.projects_by_name "cook-test"
|
|
47
49
|
expect(projects).not_to eq(nil)
|
|
48
50
|
end
|
|
49
51
|
end
|
|
50
52
|
|
|
51
53
|
describe "#tags" do
|
|
52
|
-
let(:project) { manager.projects_by_name("
|
|
53
|
-
|
|
54
|
-
it "returns the correct tags for astratto/kitchen-inspector", :type => :external do
|
|
54
|
+
let(:project) { manager.projects_by_name("cook-test").first }
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
it "returns the correct tags for kitchen-inspector/cook-test", :type => :external do
|
|
57
|
+
expect(manager.tags(project)["1.1.0"]).to eq("5c430684e34415df07f3178dff96f2cf23a59452")
|
|
57
58
|
end
|
|
58
59
|
end
|
|
59
60
|
|
|
60
61
|
describe "#project_metadata" do
|
|
61
62
|
let(:project) { manager.projects_by_name("cook-test").first }
|
|
62
|
-
it "returns the correct metadata for github.com/
|
|
63
|
+
it "returns the correct metadata for github.com/kitchen-inspector/cook-test v.1.1.0", :type => :external do
|
|
63
64
|
|
|
64
|
-
metadata = manager.project_metadata(project, "
|
|
65
|
+
metadata = manager.project_metadata(project, "5c430684e34415df07f3178dff96f2cf23a59452")
|
|
65
66
|
expect(metadata.name).to eq("cook-test")
|
|
66
67
|
end
|
|
67
68
|
|
|
68
|
-
it "returns the correct version for github.com/
|
|
69
|
-
version = manager.project_metadata_version(project, "
|
|
70
|
-
expect(version).to eq("1.
|
|
69
|
+
it "returns the correct version for github.com/kitchen-inspector/cook-test v.1.1.0", :type => :external do
|
|
70
|
+
version = manager.project_metadata_version(project, "5c430684e34415df07f3178dff96f2cf23a59452")
|
|
71
|
+
expect(version).to eq("1.1.0")
|
|
71
72
|
end
|
|
72
73
|
|
|
73
|
-
it "returns the correct dependencies for github.com/
|
|
74
|
-
dependencies = manager.project_dependencies(project, "
|
|
74
|
+
it "returns the correct dependencies for github.com/kitchen-inspector/cook-test v.1.1.0", :type => :external do
|
|
75
|
+
dependencies = manager.project_dependencies(project, "5c430684e34415df07f3178dff96f2cf23a59452")
|
|
75
76
|
|
|
76
77
|
expect(dependencies.collect(&:name)).to eq(["openssl", "build-essential"])
|
|
77
78
|
end
|
data/spec/gitlab_manager_spec.rb
CHANGED
|
@@ -41,7 +41,8 @@ describe GitLabManager do
|
|
|
41
41
|
|
|
42
42
|
expect do
|
|
43
43
|
GitLabManager.new config
|
|
44
|
-
end.to raise_error(GitLabAccessNotConfiguredError
|
|
44
|
+
end.to raise_error(GitLabAccessNotConfiguredError, "GitLab Private Token not configured. " \
|
|
45
|
+
"Please set token in your config file.")
|
|
45
46
|
end
|
|
46
47
|
|
|
47
48
|
it "raises an error when GitLab Base Url is not configured" do
|
|
@@ -51,7 +52,8 @@ describe GitLabManager do
|
|
|
51
52
|
|
|
52
53
|
expect do
|
|
53
54
|
GitLabManager.new config
|
|
54
|
-
end.to raise_error(GitLabAccessNotConfiguredError
|
|
55
|
+
end.to raise_error(GitLabAccessNotConfiguredError, "GitLab base url not configured. " \
|
|
56
|
+
"Please set base_url in your config file.")
|
|
55
57
|
end
|
|
56
58
|
end
|
|
57
59
|
end
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
require_relative 'support/spec_helper'
|
|
2
2
|
|
|
3
3
|
describe HealthBureau do
|
|
4
|
+
before(:each) do
|
|
5
|
+
# Ignore existing knife.rb configuration
|
|
6
|
+
orig_file = File.method(:exists?)
|
|
7
|
+
File.stub(:exists?).with(anything()) { |*args| orig_file.call(*args) }
|
|
8
|
+
File.stub(:exists?).with("#{Dir.home}/.chef/knife.rb").and_return(false)
|
|
9
|
+
end
|
|
10
|
+
|
|
4
11
|
let(:health_bureau) { generate_health_bureau }
|
|
5
12
|
|
|
6
13
|
let(:repomanager_info) do
|
|
@@ -16,6 +23,28 @@ describe HealthBureau do
|
|
|
16
23
|
end
|
|
17
24
|
|
|
18
25
|
describe "#initialize" do
|
|
26
|
+
context "Incomplete configuration" do
|
|
27
|
+
it "raises an error if a Repository Manager is not configured" do
|
|
28
|
+
config = StringIO.new
|
|
29
|
+
config.puts "chef_server :url => 'http://localhost:4000', :client_pem => 'testclient.pem', :username => 'test_user'"
|
|
30
|
+
|
|
31
|
+
expect do
|
|
32
|
+
HealthBureau.new config
|
|
33
|
+
end.to raise_error(ConfigurationError, "Repository Manager is not configured properly, "\
|
|
34
|
+
"please check your 'repository_manager' configuration.")
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "raises an error if a Chef Server is not configured" do
|
|
38
|
+
config = StringIO.new
|
|
39
|
+
config.puts "repository_manager :type => 'GitLab', :base_url => 'http://localhost:8080', :token =>'test_token'"
|
|
40
|
+
|
|
41
|
+
expect do
|
|
42
|
+
HealthBureau.new config
|
|
43
|
+
end.to raise_error(ConfigurationError, "Chef Server is not configured properly, "\
|
|
44
|
+
"please check your 'chef_server' configuration.")
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
19
48
|
context "Repository Manager" do
|
|
20
49
|
it "raises an error if an unsupported Repository Manager is specified" do
|
|
21
50
|
config = StringIO.new
|
|
@@ -24,7 +53,7 @@ describe HealthBureau do
|
|
|
24
53
|
|
|
25
54
|
expect do
|
|
26
55
|
HealthBureau.new config
|
|
27
|
-
end.to raise_error(RepositoryManagerError)
|
|
56
|
+
end.to raise_error(RepositoryManagerError, "Repository Manager 'Unknown' not supported.")
|
|
28
57
|
end
|
|
29
58
|
|
|
30
59
|
it "raises an error if an unsupported field is specified" do
|
|
@@ -35,7 +64,7 @@ describe HealthBureau do
|
|
|
35
64
|
|
|
36
65
|
expect do
|
|
37
66
|
HealthBureau.new config
|
|
38
|
-
end.to raise_error(ConfigurationError)
|
|
67
|
+
end.to raise_error(ConfigurationError, "Unsupported configuration: invalid_field.")
|
|
39
68
|
end
|
|
40
69
|
|
|
41
70
|
context "GitLab" do
|
|
@@ -58,7 +87,8 @@ describe HealthBureau do
|
|
|
58
87
|
|
|
59
88
|
expect do
|
|
60
89
|
HealthBureau.new config
|
|
61
|
-
end.to raise_error(GitLabAccessNotConfiguredError
|
|
90
|
+
end.to raise_error(GitLabAccessNotConfiguredError, "GitLab Private Token not configured. " \
|
|
91
|
+
"Please set token in your config file.")
|
|
62
92
|
end
|
|
63
93
|
|
|
64
94
|
it "raises an error when GitLab Base Url is not configured" do
|
|
@@ -68,7 +98,8 @@ describe HealthBureau do
|
|
|
68
98
|
|
|
69
99
|
expect do
|
|
70
100
|
HealthBureau.new config
|
|
71
|
-
end.to raise_error(GitLabAccessNotConfiguredError
|
|
101
|
+
end.to raise_error(GitLabAccessNotConfiguredError, "GitLab base url not configured. " \
|
|
102
|
+
"Please set base_url in your config file.")
|
|
72
103
|
end
|
|
73
104
|
end
|
|
74
105
|
end
|
|
@@ -82,7 +113,8 @@ describe HealthBureau do
|
|
|
82
113
|
|
|
83
114
|
expect do
|
|
84
115
|
HealthBureau.new config
|
|
85
|
-
end.to raise_error(ChefAccessNotConfiguredError
|
|
116
|
+
end.to raise_error(ChefAccessNotConfiguredError, "Chef Server url not configured. " \
|
|
117
|
+
"Please set :url in your config file.")
|
|
86
118
|
end
|
|
87
119
|
|
|
88
120
|
it "raises an error when Client PEM is not configured" do
|
|
@@ -92,7 +124,8 @@ describe HealthBureau do
|
|
|
92
124
|
|
|
93
125
|
expect do
|
|
94
126
|
HealthBureau.new config
|
|
95
|
-
end.to raise_error(ChefAccessNotConfiguredError
|
|
127
|
+
end.to raise_error(ChefAccessNotConfiguredError, "Chef client PEM not configured. " \
|
|
128
|
+
"Please set :client_pem in your config file.")
|
|
96
129
|
end
|
|
97
130
|
|
|
98
131
|
it "raises an error when Username is not configured" do
|
|
@@ -102,14 +135,15 @@ describe HealthBureau do
|
|
|
102
135
|
|
|
103
136
|
expect do
|
|
104
137
|
HealthBureau.new config
|
|
105
|
-
end.to raise_error(ChefAccessNotConfiguredError
|
|
138
|
+
end.to raise_error(ChefAccessNotConfiguredError, "Chef username not configured. " \
|
|
139
|
+
"Please set :username in your config file.")
|
|
106
140
|
end
|
|
107
141
|
end
|
|
108
142
|
end
|
|
109
143
|
|
|
110
144
|
describe "#update_dependency" do
|
|
111
145
|
before(:each) do
|
|
112
|
-
@dep = Dependency.new("test", ">= 0")
|
|
146
|
+
@dep = Models::Dependency.new("test", ">= 0")
|
|
113
147
|
end
|
|
114
148
|
|
|
115
149
|
it "returns a success for correct versions on both servers" do
|
|
@@ -265,7 +299,7 @@ describe HealthBureau do
|
|
|
265
299
|
project = double()
|
|
266
300
|
|
|
267
301
|
allow(project).to receive(:id).and_return(1)
|
|
268
|
-
allow(project).to receive(:
|
|
302
|
+
allow(project).to receive(:name).and_return("group/project")
|
|
269
303
|
|
|
270
304
|
GitLabManager.any_instance.stub(:projects_by_name).and_return([
|
|
271
305
|
project
|
data/spec/report_spec.rb
CHANGED
|
@@ -18,7 +18,7 @@ describe Report do
|
|
|
18
18
|
describe ".generate" do
|
|
19
19
|
context "global status" do
|
|
20
20
|
before(:each) do
|
|
21
|
-
dep1 = Dependency.new("Test", "~> 1.0.0")
|
|
21
|
+
dep1 = Models::Dependency.new("Test", "~> 1.0.0")
|
|
22
22
|
health_bureau.update_dependency(dep1, chef_info, repomanager_info)
|
|
23
23
|
|
|
24
24
|
@dependencies = [dep1]
|
|
@@ -111,7 +111,7 @@ describe Report do
|
|
|
111
111
|
end
|
|
112
112
|
|
|
113
113
|
it "warn_req" do
|
|
114
|
-
dep1 = Dependency.new("Test", "= 1.0.0")
|
|
114
|
+
dep1 = Models::Dependency.new("Test", "= 1.0.0")
|
|
115
115
|
chef = {:versions => ["1.0.0", "1.0.1"],
|
|
116
116
|
:latest_version => Solve::Version.new("1.0.1"),
|
|
117
117
|
:version_used => "1.0.0"}
|
|
@@ -214,7 +214,7 @@ describe Report do
|
|
|
214
214
|
|
|
215
215
|
it "shows nested dependencies" do
|
|
216
216
|
dep1 = @dependencies.first
|
|
217
|
-
dep2 = Dependency.new("Nested", "~> 1.0.0")
|
|
217
|
+
dep2 = Models::Dependency.new("Nested", "~> 1.0.0")
|
|
218
218
|
dep2.parents << dep1
|
|
219
219
|
dep1.dependencies << dep2
|
|
220
220
|
health_bureau.update_dependency(dep2, chef_info, repomanager_info)
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kitchen-inspector
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Stefano Tortarolo
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2014-02-12 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -256,9 +256,10 @@ files:
|
|
|
256
256
|
- lib/kitchen-inspector/inspector/chef_inspector.rb
|
|
257
257
|
- lib/kitchen-inspector/inspector/cli.rb
|
|
258
258
|
- lib/kitchen-inspector/inspector/common.rb
|
|
259
|
-
- lib/kitchen-inspector/inspector/dependency.rb
|
|
260
259
|
- lib/kitchen-inspector/inspector/health_bureau.rb
|
|
261
260
|
- lib/kitchen-inspector/inspector/mixin/utils.rb
|
|
261
|
+
- lib/kitchen-inspector/inspector/models/dependency.rb
|
|
262
|
+
- lib/kitchen-inspector/inspector/models/repo_cookbook.rb
|
|
262
263
|
- lib/kitchen-inspector/inspector/report/report.rb
|
|
263
264
|
- lib/kitchen-inspector/inspector/report/status_reporter.rb
|
|
264
265
|
- lib/kitchen-inspector/inspector/repository_inspector.rb
|
|
@@ -272,9 +273,9 @@ files:
|
|
|
272
273
|
- spec/data/test_client.pem
|
|
273
274
|
- spec/data/test_config_invalid.rb
|
|
274
275
|
- spec/data/test_config_valid.rb
|
|
275
|
-
- spec/dependency_inspector_spec.rb
|
|
276
276
|
- spec/github_manager_spec.rb
|
|
277
277
|
- spec/gitlab_manager_spec.rb
|
|
278
|
+
- spec/health_bureau_spec.rb
|
|
278
279
|
- spec/report_spec.rb
|
|
279
280
|
- spec/support/spec_helper.rb
|
|
280
281
|
- spec/utils_spec.rb
|
|
@@ -309,9 +310,10 @@ test_files:
|
|
|
309
310
|
- spec/data/test_client.pem
|
|
310
311
|
- spec/data/test_config_invalid.rb
|
|
311
312
|
- spec/data/test_config_valid.rb
|
|
312
|
-
- spec/dependency_inspector_spec.rb
|
|
313
313
|
- spec/github_manager_spec.rb
|
|
314
314
|
- spec/gitlab_manager_spec.rb
|
|
315
|
+
- spec/health_bureau_spec.rb
|
|
315
316
|
- spec/report_spec.rb
|
|
316
317
|
- spec/support/spec_helper.rb
|
|
317
318
|
- spec/utils_spec.rb
|
|
319
|
+
has_rdoc:
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Copyright (c) 2013 Stefano Tortarolo <stefano.tortarolo@gmail.com>
|
|
3
|
-
#
|
|
4
|
-
# MIT License
|
|
5
|
-
#
|
|
6
|
-
# Permission is hereby granted, free of charge, to any person obtaining
|
|
7
|
-
# a copy of this software and associated documentation files (the
|
|
8
|
-
# "Software"), to deal in the Software without restriction, including
|
|
9
|
-
# without limitation the rights to use, copy, modify, merge, publish,
|
|
10
|
-
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
11
|
-
# permit persons to whom the Software is furnished to do so, subject to
|
|
12
|
-
# the following conditions:
|
|
13
|
-
#
|
|
14
|
-
# The above copyright notice and this permission notice shall be
|
|
15
|
-
# included in all copies or substantial portions of the Software.
|
|
16
|
-
#
|
|
17
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
18
|
-
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
19
|
-
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
20
|
-
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
21
|
-
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
22
|
-
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
23
|
-
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
24
|
-
#
|
|
25
|
-
|
|
26
|
-
module KitchenInspector
|
|
27
|
-
module Inspector
|
|
28
|
-
# The class that contains information about a dependent cookbook
|
|
29
|
-
class Dependency
|
|
30
|
-
include Comparable
|
|
31
|
-
|
|
32
|
-
# The name of the dependency
|
|
33
|
-
attr_reader :name
|
|
34
|
-
|
|
35
|
-
# The requirement for the dependency
|
|
36
|
-
attr_reader :requirement
|
|
37
|
-
|
|
38
|
-
# Info from Chef Server
|
|
39
|
-
attr_accessor :chef
|
|
40
|
-
|
|
41
|
-
# Info from the Repository Manager
|
|
42
|
-
attr_accessor :repomanager
|
|
43
|
-
|
|
44
|
-
# The status of the dependency
|
|
45
|
-
attr_accessor :status
|
|
46
|
-
|
|
47
|
-
# The dependencies of a cookbook
|
|
48
|
-
attr_accessor :dependencies
|
|
49
|
-
|
|
50
|
-
# Remarks field
|
|
51
|
-
attr_accessor :remarks
|
|
52
|
-
|
|
53
|
-
# Dependency's parents (if transitive)
|
|
54
|
-
attr_accessor :parents
|
|
55
|
-
|
|
56
|
-
def initialize(name, requirement)
|
|
57
|
-
@name = name
|
|
58
|
-
@requirement = requirement
|
|
59
|
-
@chef = {}
|
|
60
|
-
@repomanager = {}
|
|
61
|
-
@status = nil
|
|
62
|
-
@remarks = []
|
|
63
|
-
@dependencies = []
|
|
64
|
-
@parents = []
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def ==(anOther)
|
|
68
|
-
name == anOther.name && requirement == anOther.requirement
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def to_hash
|
|
72
|
-
{}.tap do |hash|
|
|
73
|
-
hash[:name] = name
|
|
74
|
-
hash[:requirement] = requirement
|
|
75
|
-
hash[:status] = status
|
|
76
|
-
hash[:remarks] = remarks
|
|
77
|
-
hash[:dependencies] = dependencies
|
|
78
|
-
hash[:chef] = chef
|
|
79
|
-
hash[:chef][:latest_version] = hash[:chef][:latest_version].to_s if hash[:chef][:latest_version]
|
|
80
|
-
hash[:repomanager] = repomanager
|
|
81
|
-
hash[:repomanager][:latest_tag] = hash[:repomanager][:latest_tag].to_s if hash[:repomanager][:latest_tag]
|
|
82
|
-
hash[:repomanager][:latest_metadata] = hash[:repomanager][:latest_metadata].to_s if hash[:repomanager][:latest_metadata]
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
end
|