chef-dk 1.1.16 → 1.2.20
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/Gemfile +12 -4
- data/Gemfile.lock +84 -68
- data/Rakefile +9 -0
- data/acceptance/Gemfile +3 -0
- data/acceptance/Gemfile.lock +43 -27
- data/chef-dk.gemspec +3 -2
- data/lib/chef-dk/command/install.rb +1 -1
- data/lib/chef-dk/exceptions.rb +10 -0
- data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +52 -8
- data/lib/chef-dk/policyfile/community_cookbook_source.rb +0 -1
- data/lib/chef-dk/policyfile/cookbook_location_specification.rb +2 -2
- data/lib/chef-dk/policyfile/dsl.rb +4 -2
- data/lib/chef-dk/policyfile/source_uri.rb +57 -0
- data/lib/chef-dk/policyfile/storage_config.rb +3 -0
- data/lib/chef-dk/policyfile_compiler.rb +4 -4
- data/lib/chef-dk/policyfile_services/install.rb +4 -2
- data/lib/chef-dk/skeletons/code_generator/files/default/delivery-project.toml +14 -3
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +3 -0
- data/lib/chef-dk/skeletons/code_generator/recipes/build_cookbook.rb +2 -0
- data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +121 -4
- data/lib/chef-dk/version.rb +1 -1
- data/omnibus_overrides.rb +2 -0
- data/spec/unit/command/generator_commands/cookbook_spec.rb +16 -5
- data/spec/unit/command/install_spec.rb +2 -2
- data/spec/unit/fixtures/cookbooks_api/chef_server_universe.json +56 -0
- data/spec/unit/fixtures/cookbooks_api/pruned_chef_server_universe.json +30 -0
- data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +29 -8
- data/spec/unit/policyfile/cookbook_location_specification_spec.rb +22 -0
- data/spec/unit/policyfile/source_uri_spec.rb +36 -0
- data/spec/unit/policyfile/storage_config_spec.rb +12 -0
- data/spec/unit/policyfile_services/push_spec.rb +16 -0
- data/version_policy.rb +9 -5
- metadata +40 -13
data/Rakefile
CHANGED
|
@@ -21,3 +21,12 @@ require_relative "tasks/bundle"
|
|
|
21
21
|
require_relative "tasks/dependencies"
|
|
22
22
|
require_relative "tasks/github_changelog_generator"
|
|
23
23
|
require_relative "tasks/announce"
|
|
24
|
+
|
|
25
|
+
desc "Keep the Dockerfile up-to-date"
|
|
26
|
+
task :update_dockerfile do
|
|
27
|
+
require "mixlib/install"
|
|
28
|
+
latest_stable_version = Mixlib::Install.available_versions("chefdk", "stable").last
|
|
29
|
+
text = File.read("Dockerfile")
|
|
30
|
+
new_text = text.gsub(/^ARG VERSION=[\d\.]+$/, "ARG VERSION=#{latest_stable_version}")
|
|
31
|
+
File.open("Dockerfile", "w+") { |f| f.write(new_text) }
|
|
32
|
+
end
|
data/acceptance/Gemfile
CHANGED
|
@@ -10,6 +10,9 @@ gem "winrm-fs"
|
|
|
10
10
|
gem "winrm-elevated"
|
|
11
11
|
gem "berkshelf"
|
|
12
12
|
|
|
13
|
+
# Workaround to address https://github.com/sickill/rainbow/issues/44
|
|
14
|
+
gem "rainbow", ">= 2.1.0", "< 2.2"
|
|
15
|
+
|
|
13
16
|
# TODO remove this when we update Chef to use the new api exposed in 3.5.1
|
|
14
17
|
gem "rspec-core", "= 3.4.4"
|
|
15
18
|
|
data/acceptance/Gemfile.lock
CHANGED
|
@@ -12,15 +12,15 @@ GEM
|
|
|
12
12
|
addressable (2.5.0)
|
|
13
13
|
public_suffix (~> 2.0, >= 2.0.2)
|
|
14
14
|
artifactory (2.5.1)
|
|
15
|
-
aws-sdk (2.
|
|
16
|
-
aws-sdk-resources (= 2.
|
|
17
|
-
aws-sdk-core (2.
|
|
15
|
+
aws-sdk (2.7.2)
|
|
16
|
+
aws-sdk-resources (= 2.7.2)
|
|
17
|
+
aws-sdk-core (2.7.2)
|
|
18
18
|
aws-sigv4 (~> 1.0)
|
|
19
19
|
jmespath (~> 1.0)
|
|
20
|
-
aws-sdk-resources (2.
|
|
21
|
-
aws-sdk-core (= 2.
|
|
20
|
+
aws-sdk-resources (2.7.2)
|
|
21
|
+
aws-sdk-core (= 2.7.2)
|
|
22
22
|
aws-sigv4 (1.0.0)
|
|
23
|
-
berkshelf (5.
|
|
23
|
+
berkshelf (5.5.0)
|
|
24
24
|
addressable (~> 2.3, >= 2.3.4)
|
|
25
25
|
berkshelf-api-client (>= 2.0.2, < 4.0)
|
|
26
26
|
buff-config (~> 2.0)
|
|
@@ -35,7 +35,7 @@ GEM
|
|
|
35
35
|
retryable (~> 2.0)
|
|
36
36
|
ridley (~> 5.0)
|
|
37
37
|
solve (> 2.0, < 4.0)
|
|
38
|
-
thor (~> 0.19)
|
|
38
|
+
thor (~> 0.19, < 0.19.2)
|
|
39
39
|
berkshelf-api-client (3.0.0)
|
|
40
40
|
faraday (~> 0.9)
|
|
41
41
|
httpclient (~> 2.7)
|
|
@@ -48,28 +48,30 @@ GEM
|
|
|
48
48
|
buff-ruby_engine (1.0.0)
|
|
49
49
|
buff-shell_out (1.1.0)
|
|
50
50
|
buff-ruby_engine (~> 1.0)
|
|
51
|
-
builder (3.2.
|
|
51
|
+
builder (3.2.3)
|
|
52
52
|
celluloid (0.16.0)
|
|
53
53
|
timers (~> 4.0.0)
|
|
54
54
|
celluloid-io (0.16.2)
|
|
55
55
|
celluloid (>= 0.16.0)
|
|
56
56
|
nio4r (>= 1.1.0)
|
|
57
|
-
chef-config (12.
|
|
57
|
+
chef-config (12.18.31)
|
|
58
58
|
addressable
|
|
59
59
|
fuzzyurl
|
|
60
60
|
mixlib-config (~> 2.0)
|
|
61
61
|
mixlib-shellout (~> 2.0)
|
|
62
62
|
cleanroom (1.0.0)
|
|
63
63
|
coderay (1.1.1)
|
|
64
|
-
diff-lcs (1.
|
|
65
|
-
docker-api (1.33.
|
|
64
|
+
diff-lcs (1.3)
|
|
65
|
+
docker-api (1.33.2)
|
|
66
66
|
excon (>= 0.38.0)
|
|
67
67
|
json
|
|
68
|
+
domain_name (0.5.20161129)
|
|
69
|
+
unf (>= 0.0.5, < 1.0.0)
|
|
68
70
|
erubis (2.7.0)
|
|
69
71
|
excon (0.54.0)
|
|
70
72
|
faraday (0.9.2)
|
|
71
73
|
multipart-post (>= 1.2, < 3)
|
|
72
|
-
ffi (1.9.
|
|
74
|
+
ffi (1.9.17)
|
|
73
75
|
fuzzyurl (0.9.0)
|
|
74
76
|
gssapi (1.2.0)
|
|
75
77
|
ffi (>= 1.0.1)
|
|
@@ -77,9 +79,19 @@ GEM
|
|
|
77
79
|
builder (>= 2.1.2)
|
|
78
80
|
hashie (3.4.6)
|
|
79
81
|
hitimes (1.2.4)
|
|
82
|
+
http (2.1.0)
|
|
83
|
+
addressable (~> 2.3)
|
|
84
|
+
http-cookie (~> 1.0)
|
|
85
|
+
http-form_data (~> 1.0.1)
|
|
86
|
+
http_parser.rb (~> 0.6.0)
|
|
87
|
+
http-cookie (1.0.3)
|
|
88
|
+
domain_name (~> 0.5)
|
|
89
|
+
http-form_data (1.0.1)
|
|
90
|
+
http_parser.rb (0.6.0)
|
|
80
91
|
httpclient (2.8.3)
|
|
81
|
-
inspec (1.
|
|
92
|
+
inspec (1.10.0)
|
|
82
93
|
hashie (~> 3.4)
|
|
94
|
+
http (~> 2.1.0)
|
|
83
95
|
json (>= 1.8, < 3.0)
|
|
84
96
|
method_source (~> 0.8)
|
|
85
97
|
mixlib-log
|
|
@@ -94,7 +106,7 @@ GEM
|
|
|
94
106
|
thor (~> 0.19)
|
|
95
107
|
train (>= 0.22.0, < 1.0)
|
|
96
108
|
jmespath (1.3.1)
|
|
97
|
-
json (2.0.
|
|
109
|
+
json (2.0.3)
|
|
98
110
|
kitchen-ec2 (1.2.0)
|
|
99
111
|
aws-sdk (~> 2)
|
|
100
112
|
excon
|
|
@@ -105,7 +117,7 @@ GEM
|
|
|
105
117
|
hashie (~> 3.4)
|
|
106
118
|
inspec (>= 0.34.0, < 2.0.0)
|
|
107
119
|
test-kitchen (~> 1.6)
|
|
108
|
-
kitchen-vagrant (0.
|
|
120
|
+
kitchen-vagrant (1.0.0)
|
|
109
121
|
test-kitchen (~> 1.4)
|
|
110
122
|
little-plugger (1.1.4)
|
|
111
123
|
logging (2.1.0)
|
|
@@ -113,7 +125,7 @@ GEM
|
|
|
113
125
|
multi_json (~> 1.10)
|
|
114
126
|
method_source (0.8.2)
|
|
115
127
|
minitar (0.5.4)
|
|
116
|
-
mixlib-archive (0.
|
|
128
|
+
mixlib-archive (0.3.0)
|
|
117
129
|
mixlib-log
|
|
118
130
|
mixlib-authentication (1.4.1)
|
|
119
131
|
mixlib-log
|
|
@@ -125,15 +137,15 @@ GEM
|
|
|
125
137
|
mixlib-log (1.7.1)
|
|
126
138
|
mixlib-shellout (2.2.7)
|
|
127
139
|
mixlib-versioning (1.1.0)
|
|
128
|
-
molinillo (0.5.
|
|
140
|
+
molinillo (0.5.5)
|
|
129
141
|
multi_json (1.12.1)
|
|
130
142
|
multipart-post (2.0.0)
|
|
131
143
|
net-scp (1.2.1)
|
|
132
144
|
net-ssh (>= 2.6.5)
|
|
133
|
-
net-ssh (
|
|
145
|
+
net-ssh (4.0.1)
|
|
134
146
|
net-ssh-gateway (1.2.0)
|
|
135
147
|
net-ssh (>= 2.6.5)
|
|
136
|
-
nio4r (
|
|
148
|
+
nio4r (2.0.0)
|
|
137
149
|
nori (2.6.0)
|
|
138
150
|
octokit (4.6.2)
|
|
139
151
|
sawyer (~> 0.8.0, >= 0.5.3)
|
|
@@ -142,7 +154,7 @@ GEM
|
|
|
142
154
|
coderay (~> 1.1.0)
|
|
143
155
|
method_source (~> 0.8.1)
|
|
144
156
|
slop (~> 3.4)
|
|
145
|
-
public_suffix (2.0.
|
|
157
|
+
public_suffix (2.0.5)
|
|
146
158
|
rainbow (2.1.0)
|
|
147
159
|
retryable (2.0.4)
|
|
148
160
|
ridley (5.1.0)
|
|
@@ -194,31 +206,34 @@ GEM
|
|
|
194
206
|
molinillo (>= 0.5)
|
|
195
207
|
semverse (>= 1.1, < 3.0)
|
|
196
208
|
sslshake (1.0.13)
|
|
197
|
-
test-kitchen (1.
|
|
209
|
+
test-kitchen (1.15.0)
|
|
198
210
|
mixlib-install (>= 1.2, < 3.0)
|
|
199
211
|
mixlib-shellout (>= 1.2, < 3.0)
|
|
200
212
|
net-scp (~> 1.1)
|
|
201
|
-
net-ssh (>= 2.9, <
|
|
202
|
-
net-ssh-gateway (~> 1.2
|
|
213
|
+
net-ssh (>= 2.9, < 5.0)
|
|
214
|
+
net-ssh-gateway (~> 1.2)
|
|
203
215
|
safe_yaml (~> 1.0)
|
|
204
216
|
thor (~> 0.18)
|
|
205
|
-
thor (0.19.
|
|
217
|
+
thor (0.19.1)
|
|
206
218
|
timers (4.0.4)
|
|
207
219
|
hitimes
|
|
208
|
-
train (0.22.
|
|
220
|
+
train (0.22.1)
|
|
209
221
|
docker-api (~> 1.26)
|
|
210
222
|
json (>= 1.8, < 3.0)
|
|
211
223
|
mixlib-shellout (~> 2.0)
|
|
212
224
|
net-scp (~> 1.2)
|
|
213
|
-
net-ssh (>= 2.9, <
|
|
225
|
+
net-ssh (>= 2.9, < 5.0)
|
|
214
226
|
winrm (~> 2.0)
|
|
215
227
|
winrm-fs (~> 1.0)
|
|
228
|
+
unf (0.1.4)
|
|
229
|
+
unf_ext
|
|
230
|
+
unf_ext (0.0.7.2)
|
|
216
231
|
varia_model (0.6.0)
|
|
217
232
|
buff-extensions (~> 2.0)
|
|
218
233
|
hashie (>= 2.0.2, < 4.0.0)
|
|
219
234
|
windows_chef_zero (2.0.0)
|
|
220
235
|
test-kitchen (>= 1.2.1)
|
|
221
|
-
winrm (2.1.
|
|
236
|
+
winrm (2.1.2)
|
|
222
237
|
builder (>= 2.1.2)
|
|
223
238
|
erubis (~> 2.7)
|
|
224
239
|
gssapi (~> 1.2)
|
|
@@ -246,6 +261,7 @@ DEPENDENCIES
|
|
|
246
261
|
kitchen-inspec
|
|
247
262
|
kitchen-vagrant
|
|
248
263
|
mixlib-install (= 1.2.3)
|
|
264
|
+
rainbow (>= 2.1.0, < 2.2)
|
|
249
265
|
rspec-core (= 3.4.4)
|
|
250
266
|
test-kitchen
|
|
251
267
|
windows_chef_zero
|
data/chef-dk.gemspec
CHANGED
|
@@ -44,8 +44,9 @@ Gem::Specification.new do |gem|
|
|
|
44
44
|
gem.add_dependency "ffi-yajl", ">= 1.0", "< 3.0"
|
|
45
45
|
gem.add_dependency "minitar", "~> 0.5.4"
|
|
46
46
|
gem.add_dependency "chef", "~> 12.5"
|
|
47
|
-
gem.add_dependency "solve", "
|
|
48
|
-
gem.add_dependency "
|
|
47
|
+
gem.add_dependency "solve", "< 4.0", "> 2.0"
|
|
48
|
+
gem.add_dependency "addressable", ">= 2.3.5", "< 2.6"
|
|
49
|
+
gem.add_dependency "cookbook-omnifetch", "~> 0.5"
|
|
49
50
|
gem.add_dependency "diff-lcs", "~> 1.0"
|
|
50
51
|
gem.add_dependency "paint", "~> 1.0"
|
|
51
52
|
gem.add_dependency "chef-provisioning", "~> 2.0"
|
|
@@ -83,7 +83,7 @@ E
|
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
def installer
|
|
86
|
-
@installer ||= PolicyfileServices::Install.new(policyfile: policyfile_relative_path, ui: ui, root_dir: Dir.pwd)
|
|
86
|
+
@installer ||= PolicyfileServices::Install.new(policyfile: policyfile_relative_path, ui: ui, root_dir: Dir.pwd, config: chef_config)
|
|
87
87
|
end
|
|
88
88
|
|
|
89
89
|
def debug?
|
data/lib/chef-dk/exceptions.rb
CHANGED
|
@@ -62,6 +62,16 @@ module ChefDK
|
|
|
62
62
|
class PolicyfileError < StandardError
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
+
class InvalidPolicyfileSourceURI < StandardError
|
|
66
|
+
def initialize(url, reason = nil)
|
|
67
|
+
@url = url
|
|
68
|
+
@reason = reason
|
|
69
|
+
msg = "'#{@url}' is not a valid Policy File Source URI"
|
|
70
|
+
msg << " #{@reason}." unless @reason.nil?
|
|
71
|
+
super(msg)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
65
75
|
class MissingCookbookLockData < StandardError
|
|
66
76
|
end
|
|
67
77
|
|
|
@@ -15,28 +15,60 @@
|
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
#
|
|
17
17
|
|
|
18
|
+
require 'ffi_yajl'
|
|
18
19
|
require 'chef-dk/exceptions'
|
|
20
|
+
require 'chef-dk/policyfile/source_uri'
|
|
21
|
+
require 'chef-dk/authenticated_http'
|
|
19
22
|
|
|
20
23
|
module ChefDK
|
|
21
24
|
module Policyfile
|
|
22
25
|
class ChefServerCookbookSource
|
|
23
|
-
|
|
24
26
|
attr_reader :uri
|
|
27
|
+
attr_reader :preferred_cookbooks
|
|
28
|
+
attr_reader :chef_config
|
|
29
|
+
|
|
30
|
+
def initialize(uri, chef_config: nil)
|
|
31
|
+
@uri = SourceURI.parse(uri)
|
|
32
|
+
@http_connections = {}
|
|
33
|
+
@chef_config = chef_config
|
|
34
|
+
@preferred_cookbooks = []
|
|
35
|
+
yield self if block_given?
|
|
36
|
+
end
|
|
25
37
|
|
|
26
|
-
def
|
|
27
|
-
|
|
38
|
+
def default_source_args
|
|
39
|
+
[:chef_server, uri]
|
|
28
40
|
end
|
|
29
41
|
|
|
30
42
|
def ==(other)
|
|
31
|
-
other.kind_of?(self.class) && other.uri == uri
|
|
43
|
+
other.kind_of?(self.class) && other.uri == uri && other.preferred_cookbooks == preferred_cookbooks
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def preferred_for(*cookbook_names)
|
|
47
|
+
preferred_cookbooks.concat(cookbook_names)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def preferred_source_for?(cookbook_name)
|
|
51
|
+
preferred_cookbooks.include?(cookbook_name)
|
|
32
52
|
end
|
|
33
53
|
|
|
34
54
|
def universe_graph
|
|
35
|
-
|
|
55
|
+
@universe_graph ||= begin
|
|
56
|
+
full_chef_server_graph.inject({}) do |normalized_graph, (cookbook_name, metadata_by_version)|
|
|
57
|
+
normalized_graph[cookbook_name] = metadata_by_version.inject({}) do |deps_by_version, (version, metadata)|
|
|
58
|
+
deps_by_version[version] = metadata["dependencies"]
|
|
59
|
+
deps_by_version
|
|
60
|
+
end
|
|
61
|
+
normalized_graph
|
|
62
|
+
end
|
|
63
|
+
end
|
|
36
64
|
end
|
|
37
65
|
|
|
38
66
|
def source_options_for(cookbook_name, cookbook_version)
|
|
39
|
-
|
|
67
|
+
{
|
|
68
|
+
chef_server: uri.to_s,
|
|
69
|
+
version: cookbook_version,
|
|
70
|
+
http_client: http_connection_for(uri.to_s)
|
|
71
|
+
}
|
|
40
72
|
end
|
|
41
73
|
|
|
42
74
|
def null?
|
|
@@ -47,8 +79,20 @@ module ChefDK
|
|
|
47
79
|
"chef_server(#{uri})"
|
|
48
80
|
end
|
|
49
81
|
|
|
82
|
+
private
|
|
83
|
+
|
|
84
|
+
def http_connection_for(base_url)
|
|
85
|
+
@http_connections[base_url] ||= ChefDK::AuthenticatedHTTP.new(base_url,
|
|
86
|
+
signing_key_filename: chef_config.client_key,
|
|
87
|
+
client_name: chef_config.node_name)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def full_chef_server_graph
|
|
91
|
+
@full_chef_server_graph ||=
|
|
92
|
+
begin
|
|
93
|
+
http_connection_for(uri.to_s).get('/universe')
|
|
94
|
+
end
|
|
95
|
+
end
|
|
50
96
|
end
|
|
51
97
|
end
|
|
52
98
|
end
|
|
53
|
-
|
|
54
|
-
|
|
@@ -29,7 +29,7 @@ module ChefDK
|
|
|
29
29
|
# API contract
|
|
30
30
|
include StorageConfigDelegation
|
|
31
31
|
|
|
32
|
-
SOURCE_TYPES = [:git, :github, :path, :artifactserver]
|
|
32
|
+
SOURCE_TYPES = [:git, :github, :path, :artifactserver, :chef_server]
|
|
33
33
|
|
|
34
34
|
#--
|
|
35
35
|
# Required by CookbookOmnifetch API contract
|
|
@@ -69,7 +69,7 @@ module ChefDK
|
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
def mirrors_canonical_upstream?
|
|
72
|
-
[:git, :github, :artifactserver].include?(source_type)
|
|
72
|
+
[:git, :github, :artifactserver, :chef_server].include?(source_type)
|
|
73
73
|
end
|
|
74
74
|
|
|
75
75
|
def installed?
|
|
@@ -42,7 +42,8 @@ module ChefDK
|
|
|
42
42
|
|
|
43
43
|
attr_reader :storage_config
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
attr_reader :chef_config
|
|
46
|
+
def initialize(storage_config, chef_config: nil)
|
|
46
47
|
@name = nil
|
|
47
48
|
@errors = []
|
|
48
49
|
@run_list = []
|
|
@@ -50,6 +51,7 @@ module ChefDK
|
|
|
50
51
|
@default_source = [ NullCookbookSource.new ]
|
|
51
52
|
@cookbook_location_specs = {}
|
|
52
53
|
@storage_config = storage_config
|
|
54
|
+
@chef_config = chef_config
|
|
53
55
|
|
|
54
56
|
@node_attributes = Chef::Node::Attribute.new({}, {}, {}, {})
|
|
55
57
|
end
|
|
@@ -168,7 +170,7 @@ module ChefDK
|
|
|
168
170
|
if source_uri.nil?
|
|
169
171
|
@errors << "You must specify the server's URI when using a default_source :chef_server"
|
|
170
172
|
else
|
|
171
|
-
set_default_source(ChefServerCookbookSource.new(source_uri))
|
|
173
|
+
set_default_source(ChefServerCookbookSource.new(source_uri, chef_config: chef_config, &block))
|
|
172
174
|
end
|
|
173
175
|
end
|
|
174
176
|
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2016 Chef Software Inc.
|
|
3
|
+
# License:: Apache License, Version 2.0
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
require 'addressable/uri'
|
|
19
|
+
require 'chef-dk/exceptions'
|
|
20
|
+
|
|
21
|
+
module ChefDK
|
|
22
|
+
module Policyfile
|
|
23
|
+
class SourceURI < Addressable::URI
|
|
24
|
+
class << self
|
|
25
|
+
# Returns a URI object based on the parsed string.
|
|
26
|
+
#
|
|
27
|
+
# @param [String, Addressable::URI, #to_str] uri The URI
|
|
28
|
+
# string to parse. No parsing is performed if the object
|
|
29
|
+
# is already an <code>Addressable::URI</code>.
|
|
30
|
+
#
|
|
31
|
+
# @raise [ChefDK::InvalidPolicyfileSourceURI]
|
|
32
|
+
#
|
|
33
|
+
# @return [ChefDK::Policyfile::SourceURI]
|
|
34
|
+
def parse(uri)
|
|
35
|
+
parsed_uri = super(uri)
|
|
36
|
+
parsed_uri.send(:validate)
|
|
37
|
+
parsed_uri
|
|
38
|
+
rescue TypeError, ArgumentError => ex
|
|
39
|
+
raise ChefDK::InvalidPolicyfileSourceURI.new(uri, ex)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
VALID_SCHEMES = %w{ https http }.freeze
|
|
44
|
+
|
|
45
|
+
# @raise [ChefDK::InvalidPolicyfileSourceURI]
|
|
46
|
+
def validate
|
|
47
|
+
super
|
|
48
|
+
|
|
49
|
+
unless VALID_SCHEMES.include?(self.scheme)
|
|
50
|
+
raise InvalidPolicyfileSourceURI.new(self, "invalid URI scheme '#{self.scheme}'. Valid schemes: #{VALID_SCHEMES}")
|
|
51
|
+
end
|
|
52
|
+
rescue Addressable::URI::InvalidURIError => ex
|
|
53
|
+
raise InvalidPolicyfileSourceURI.new(self, ex)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|