chef-dk 0.2.0 → 0.2.1
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/README.md +1 -1
- data/lib/chef-dk/authenticated_http.rb +40 -0
- data/lib/chef-dk/chef_runner.rb +5 -0
- data/lib/chef-dk/command/exec.rb +4 -1
- data/lib/chef-dk/command/generate.rb +11 -0
- data/lib/chef-dk/command/generator_commands.rb +20 -365
- data/lib/chef-dk/command/generator_commands/app.rb +99 -0
- data/lib/chef-dk/command/generator_commands/attribute.rb +37 -0
- data/lib/chef-dk/command/generator_commands/base.rb +76 -0
- data/lib/chef-dk/command/generator_commands/cookbook.rb +100 -0
- data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +99 -0
- data/lib/chef-dk/command/generator_commands/cookbook_file.rb +45 -0
- data/lib/chef-dk/command/generator_commands/lwrp.rb +36 -0
- data/lib/chef-dk/command/generator_commands/recipe.rb +36 -0
- data/lib/chef-dk/command/generator_commands/repo.rb +96 -0
- data/lib/chef-dk/command/generator_commands/template.rb +45 -0
- data/lib/chef-dk/command/verify.rb +28 -0
- data/lib/chef-dk/component_test.rb +16 -3
- data/lib/chef-dk/cookbook_omnifetch.rb +2 -0
- data/lib/chef-dk/cookbook_profiler/identifiers.rb +3 -15
- data/lib/chef-dk/exceptions.rb +15 -0
- data/lib/chef-dk/generator.rb +102 -25
- data/lib/chef-dk/policyfile/community_cookbook_source.rb +0 -7
- data/lib/chef-dk/policyfile/{cookbook_spec.rb → cookbook_location_specification.rb} +35 -6
- data/lib/chef-dk/policyfile/cookbook_locks.rb +305 -0
- data/lib/chef-dk/policyfile/dsl.rb +26 -12
- data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +70 -0
- data/lib/chef-dk/policyfile/solution_dependencies.rb +204 -0
- data/lib/chef-dk/policyfile/storage_config.rb +77 -0
- data/lib/chef-dk/policyfile/uploader.rb +110 -0
- data/lib/chef-dk/policyfile_compiler.rb +59 -29
- data/lib/chef-dk/policyfile_lock.rb +104 -160
- data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +1 -1
- data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +0 -1
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +66 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/Rakefile +65 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/certificates/README.md +19 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/README-policy.md +9 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/README.md +54 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +63 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +5 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +16 -0
- data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +7 -1
- data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +62 -0
- data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -0
- data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.apache2.erb +201 -0
- data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -0
- data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -0
- data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -0
- data/lib/chef-dk/skeletons/code_generator/templates/default/default_recipe.rb.erb +1 -4
- data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +3 -3
- data/lib/chef-dk/skeletons/code_generator/templates/default/repo/config/rake.rb.erb +38 -0
- data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +11 -0
- data/lib/chef-dk/version.rb +1 -1
- data/spec/shared/a_file_generator.rb +121 -0
- data/spec/shared/a_generated_file.rb +12 -0
- data/spec/shared/fixture_cookbook_checksums.rb +47 -0
- data/spec/spec_helper.rb +4 -2
- data/spec/unit/chef_runner_spec.rb +12 -5
- data/spec/unit/cli_spec.rb +4 -4
- data/spec/unit/command/base_spec.rb +1 -1
- data/spec/unit/command/exec_spec.rb +37 -27
- data/spec/unit/command/generate_spec.rb +3 -3
- data/spec/unit/command/generator_commands/app_spec.rb +131 -0
- data/spec/unit/command/generator_commands/attribute_spec.rb +32 -0
- data/spec/unit/command/generator_commands/cookbook_file_spec.rb +32 -0
- data/spec/unit/command/generator_commands/cookbook_spec.rb +205 -0
- data/spec/unit/command/generator_commands/lwrp_spec.rb +32 -0
- data/spec/unit/command/generator_commands/recipe_spec.rb +32 -0
- data/spec/unit/command/generator_commands/repo_spec.rb +287 -0
- data/spec/unit/command/generator_commands/template_spec.rb +32 -0
- data/spec/unit/command/shell_init_spec.rb +4 -4
- data/spec/unit/command/verify_spec.rb +9 -9
- data/spec/unit/commands_map_spec.rb +1 -1
- data/spec/unit/component_test_spec.rb +3 -3
- data/spec/unit/cookbook_profiler/git_spec.rb +7 -7
- data/spec/unit/cookbook_profiler/identifiers_spec.rb +12 -8
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +1 -1
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +1 -1
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +1 -1
- data/spec/unit/fixtures/example_cookbook/Berksfile +1 -1
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -0
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -0
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +1 -1
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -0
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -0
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -0
- data/spec/unit/generator_spec.rb +120 -0
- data/spec/unit/policyfile/{cookbook_spec_spec.rb → cookbook_location_specification_spec.rb} +83 -38
- data/spec/unit/policyfile/cookbook_locks_spec.rb +354 -0
- data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +85 -0
- data/spec/unit/policyfile/solution_dependencies_spec.rb +145 -0
- data/spec/unit/policyfile/storage_config_spec.rb +98 -0
- data/spec/unit/policyfile/uploader_spec.rb +292 -0
- data/spec/unit/policyfile_demands_spec.rb +177 -24
- data/spec/unit/policyfile_evaluation_spec.rb +40 -12
- data/spec/unit/{policyfile_builder_spec.rb → policyfile_lock_build_spec.rb} +179 -64
- data/spec/unit/policyfile_lock_install_spec.rb +138 -0
- data/spec/unit/policyfile_lock_validation_spec.rb +610 -0
- metadata +103 -59
- data/spec/unit/command/generator_commands_spec.rb +0 -504
|
@@ -46,11 +46,11 @@ describe ChefDK::CookbookProfiler::Git do
|
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
it "reports that the repo is clean" do
|
|
49
|
-
expect(git_profiler.clean?).to
|
|
49
|
+
expect(git_profiler.clean?).to be true
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
it "reports that the commits are unpublished" do
|
|
53
|
-
expect(git_profiler.unpublished_commits?).to
|
|
53
|
+
expect(git_profiler.unpublished_commits?).to be true
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
it "reports that no remotes have the commits" do
|
|
@@ -74,11 +74,11 @@ describe ChefDK::CookbookProfiler::Git do
|
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
it "reports that the repo is clean" do
|
|
77
|
-
expect(git_profiler.clean?).to
|
|
77
|
+
expect(git_profiler.clean?).to be true
|
|
78
78
|
end
|
|
79
79
|
|
|
80
80
|
it "reports that all commits are published to the upstream" do
|
|
81
|
-
expect(git_profiler.unpublished_commits?).to
|
|
81
|
+
expect(git_profiler.unpublished_commits?).to be false
|
|
82
82
|
end
|
|
83
83
|
|
|
84
84
|
it "lists the remotes that commits are published to" do
|
|
@@ -97,11 +97,11 @@ describe ChefDK::CookbookProfiler::Git do
|
|
|
97
97
|
end
|
|
98
98
|
|
|
99
99
|
it "reports that the repo is clean" do
|
|
100
|
-
expect(git_profiler.clean?).to
|
|
100
|
+
expect(git_profiler.clean?).to be true
|
|
101
101
|
end
|
|
102
102
|
|
|
103
103
|
it "reports that there are unpublished changes" do
|
|
104
|
-
expect(git_profiler.unpublished_commits?).to
|
|
104
|
+
expect(git_profiler.unpublished_commits?).to be true
|
|
105
105
|
end
|
|
106
106
|
|
|
107
107
|
it "reports that no remotes have the commits" do
|
|
@@ -118,7 +118,7 @@ describe ChefDK::CookbookProfiler::Git do
|
|
|
118
118
|
end
|
|
119
119
|
|
|
120
120
|
it "reports that the repo is dirty" do
|
|
121
|
-
expect(git_profiler.clean?).to
|
|
121
|
+
expect(git_profiler.clean?).to be false
|
|
122
122
|
end
|
|
123
123
|
|
|
124
124
|
end
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
require 'spec_helper'
|
|
19
19
|
require 'chef-dk/cookbook_profiler/identifiers'
|
|
20
|
+
require 'chef-dk/policyfile/read_cookbook_for_compat_mode_upload'
|
|
20
21
|
|
|
21
22
|
describe ChefDK::CookbookProfiler::Identifiers do
|
|
22
23
|
|
|
@@ -28,15 +29,22 @@ describe ChefDK::CookbookProfiler::Identifiers do
|
|
|
28
29
|
File.join(cache_path, "foo-1.0.0")
|
|
29
30
|
end
|
|
30
31
|
|
|
32
|
+
let(:cookbook_version) do
|
|
33
|
+
chefignore = Chef::Cookbook::Chefignore.new(File.join(foo_cookbook_path, "chefignore"))
|
|
34
|
+
cbvl = Chef::Cookbook::CookbookVersionLoader.new(foo_cookbook_path, chefignore)
|
|
35
|
+
cbvl.load!
|
|
36
|
+
cbvl.cookbook_version
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
31
40
|
let(:identifiers) do
|
|
32
|
-
ChefDK::CookbookProfiler::Identifiers.new(
|
|
41
|
+
ChefDK::CookbookProfiler::Identifiers.new(cookbook_version)
|
|
33
42
|
end
|
|
34
43
|
|
|
35
44
|
let(:cookbook_files_with_cksums) do
|
|
36
45
|
# Entries must be sorted lexically.
|
|
37
46
|
{
|
|
38
47
|
".kitchen.yml" => "85ba09a085dab072722cb197e04fa805",
|
|
39
|
-
"Berksfile" => "a668a1df3121f22875e754466f535d8a",
|
|
40
48
|
"README.md" => "0f15038071e5a131bef176cbe2a956d1",
|
|
41
49
|
"chefignore" => "03485640b005eb1083c76518764053dd",
|
|
42
50
|
"metadata.rb" => "4879d0004b177546cfbcfb2fd26df7c8",
|
|
@@ -44,10 +52,6 @@ describe ChefDK::CookbookProfiler::Identifiers do
|
|
|
44
52
|
}
|
|
45
53
|
end
|
|
46
54
|
|
|
47
|
-
it "has the cookbook's path" do
|
|
48
|
-
expect(identifiers.cookbook_path).to eq(foo_cookbook_path)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
55
|
it "has the cookbook's semver version" do
|
|
52
56
|
expect(identifiers.semver_version).to eq("1.0.0")
|
|
53
57
|
end
|
|
@@ -68,11 +72,11 @@ describe ChefDK::CookbookProfiler::Identifiers do
|
|
|
68
72
|
end
|
|
69
73
|
|
|
70
74
|
it "generates a Hash of the cookbook's content" do
|
|
71
|
-
expect(identifiers.content_identifier).to eq("
|
|
75
|
+
expect(identifiers.content_identifier).to eq("467dc855408ce8b74f991c5dc2fd72a6aa369b60")
|
|
72
76
|
end
|
|
73
77
|
|
|
74
78
|
it "generates a dotted decimal representation of the content hash" do
|
|
75
|
-
expect(identifiers.dotted_decimal_identifier).to eq("
|
|
79
|
+
expect(identifiers.dotted_decimal_identifier).to eq("19841547746970856.51597439762547453.126060145843040")
|
|
76
80
|
end
|
|
77
81
|
|
|
78
82
|
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Put files/directories that should be ignored in this file when uploading
|
|
2
|
+
# or sharing to the community site.
|
|
3
|
+
# Lines that start with '# ' are comments.
|
|
4
|
+
|
|
5
|
+
# OS generated files #
|
|
6
|
+
######################
|
|
7
|
+
.DS_Store
|
|
8
|
+
Icon?
|
|
9
|
+
nohup.out
|
|
10
|
+
ehthumbs.db
|
|
11
|
+
Thumbs.db
|
|
12
|
+
|
|
13
|
+
# SASS #
|
|
14
|
+
########
|
|
15
|
+
.sass-cache
|
|
16
|
+
|
|
17
|
+
# EDITORS #
|
|
18
|
+
###########
|
|
19
|
+
\#*
|
|
20
|
+
.#*
|
|
21
|
+
*~
|
|
22
|
+
*.sw[a-z]
|
|
23
|
+
*.bak
|
|
24
|
+
REVISION
|
|
25
|
+
TAGS*
|
|
26
|
+
tmtags
|
|
27
|
+
*_flymake.*
|
|
28
|
+
*_flymake
|
|
29
|
+
*.tmproj
|
|
30
|
+
.project
|
|
31
|
+
.settings
|
|
32
|
+
mkmf.log
|
|
33
|
+
|
|
34
|
+
## COMPILED ##
|
|
35
|
+
##############
|
|
36
|
+
a.out
|
|
37
|
+
*.o
|
|
38
|
+
*.pyc
|
|
39
|
+
*.so
|
|
40
|
+
*.com
|
|
41
|
+
*.class
|
|
42
|
+
*.dll
|
|
43
|
+
*.exe
|
|
44
|
+
*/rdoc/
|
|
45
|
+
|
|
46
|
+
# Testing #
|
|
47
|
+
###########
|
|
48
|
+
.watchr
|
|
49
|
+
.rspec
|
|
50
|
+
spec/*
|
|
51
|
+
spec/fixtures/*
|
|
52
|
+
test/*
|
|
53
|
+
features/*
|
|
54
|
+
Guardfile
|
|
55
|
+
Procfile
|
|
56
|
+
|
|
57
|
+
# SCM #
|
|
58
|
+
#######
|
|
59
|
+
.git
|
|
60
|
+
*/.git
|
|
61
|
+
.gitignore
|
|
62
|
+
.gitmodules
|
|
63
|
+
.gitconfig
|
|
64
|
+
.gitattributes
|
|
65
|
+
.svn
|
|
66
|
+
*/.bzr/*
|
|
67
|
+
*/.hg/*
|
|
68
|
+
*/.svn/*
|
|
69
|
+
|
|
70
|
+
# Berkshelf #
|
|
71
|
+
#############
|
|
72
|
+
Berksfile
|
|
73
|
+
Berksfile.lock
|
|
74
|
+
cookbooks/*
|
|
75
|
+
tmp
|
|
76
|
+
|
|
77
|
+
# Cookbooks #
|
|
78
|
+
#############
|
|
79
|
+
CONTRIBUTING
|
|
80
|
+
CHANGELOG*
|
|
81
|
+
|
|
82
|
+
# Strainer #
|
|
83
|
+
############
|
|
84
|
+
Colanderfile
|
|
85
|
+
Strainerfile
|
|
86
|
+
.colander
|
|
87
|
+
.strainer
|
|
88
|
+
|
|
89
|
+
# Vagrant #
|
|
90
|
+
###########
|
|
91
|
+
.vagrant
|
|
92
|
+
Vagrantfile
|
|
93
|
+
|
|
94
|
+
# Travis #
|
|
95
|
+
##########
|
|
96
|
+
.travis.yml
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright:: Copyright (c) 2014 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 'spec_helper'
|
|
19
|
+
require 'chef-dk/generator'
|
|
20
|
+
|
|
21
|
+
describe ChefDK::Generator do
|
|
22
|
+
|
|
23
|
+
before(:each) do
|
|
24
|
+
ChefDK::Generator.reset
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe "self.add_attr_to_context" do
|
|
28
|
+
it "adds an accessor for the symbol to the context object" do
|
|
29
|
+
ChefDK::Generator.add_attr_to_context(:snakes)
|
|
30
|
+
expect(ChefDK::Generator.context.snakes = 5).to be_eql(5)
|
|
31
|
+
expect(ChefDK::Generator.context.snakes).to be_eql(5)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "delegates the accessor from the template helper" do
|
|
35
|
+
ChefDK::Generator.add_attr_to_context(:snakes)
|
|
36
|
+
ChefDK::Generator.context.snakes = 5
|
|
37
|
+
expect(ChefDK::Generator::TemplateHelper.instance_methods).to include(:snakes)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "sets a value" do
|
|
41
|
+
ChefDK::Generator.add_attr_to_context(:snakes, 5)
|
|
42
|
+
expect(ChefDK::Generator.context.snakes).to be_eql(5)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
class TmplTest
|
|
48
|
+
include ChefDK::Generator::TemplateHelper
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
describe ChefDK::Generator::TemplateHelper do
|
|
52
|
+
let(:license) { 'all_rights' }
|
|
53
|
+
let(:copyright_holder) { 'Adam Jacob' }
|
|
54
|
+
let(:helper) { TmplTest.new }
|
|
55
|
+
|
|
56
|
+
before(:each) do
|
|
57
|
+
ChefDK::Generator.reset
|
|
58
|
+
ChefDK::Generator.add_attr_to_context(:license, license)
|
|
59
|
+
ChefDK::Generator.add_attr_to_context(:copyright_holder, 'Adam Jacob')
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
describe 'license_description' do
|
|
63
|
+
let(:license) { "all_rights" }
|
|
64
|
+
context "all_rights" do
|
|
65
|
+
it "should match the license" do
|
|
66
|
+
expect(helper.license_description).to match(/^Copyright \(c\)/)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "should comment if requested" do
|
|
70
|
+
expect(helper.license_description('#')).to match(/^# Copyright/)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
context "apache2" do
|
|
75
|
+
let(:license) { 'apache2' }
|
|
76
|
+
it "should match the license" do
|
|
77
|
+
expect(helper.license_description).to match(/Licensed under the Apache/)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "should comment if requested" do
|
|
81
|
+
expect(helper.license_description('#')).to match(/# Licensed under the Apache/)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
context "mit" do
|
|
86
|
+
let(:license) { 'mit' }
|
|
87
|
+
it "should match the license" do
|
|
88
|
+
expect(helper.license_description).to match(/Permission is hereby granted/)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "should comment if requested" do
|
|
92
|
+
expect(helper.license_description('#')).to match(/# Permission is hereby granted/)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
context "gplv2" do
|
|
97
|
+
let(:license) { 'gplv2' }
|
|
98
|
+
it "should match the license" do
|
|
99
|
+
expect(helper.license_description).to match(/This program is free software;/)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "should comment if requested" do
|
|
103
|
+
expect(helper.license_description('#')).to match(/# This program is free software;/)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
context "gplv3" do
|
|
108
|
+
let(:license) { 'gplv3' }
|
|
109
|
+
it "should match the license" do
|
|
110
|
+
expect(helper.license_description).to match(/This program is free software:/)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "should comment if requested" do
|
|
114
|
+
expect(helper.license_description('#')).to match(/# This program is free software:/)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
end
|
|
120
|
+
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
#
|
|
17
17
|
|
|
18
18
|
require 'spec_helper'
|
|
19
|
-
require 'chef-dk/policyfile/
|
|
19
|
+
require 'chef-dk/policyfile/cookbook_location_specification'
|
|
20
20
|
|
|
21
|
-
describe ChefDK::Policyfile::
|
|
21
|
+
describe ChefDK::Policyfile::CookbookLocationSpecification do
|
|
22
22
|
|
|
23
23
|
let(:policyfile_filename) { File.join(fixtures_path, "example_app/Policyfile.rb") }
|
|
24
24
|
|
|
@@ -32,84 +32,95 @@ describe ChefDK::Policyfile::CookbookSpec do
|
|
|
32
32
|
|
|
33
33
|
let(:installer) { double("CookbookOmnifetch location", cached_cookbook: cached_cookbook) }
|
|
34
34
|
|
|
35
|
-
let(:
|
|
35
|
+
let(:storage_config) do
|
|
36
|
+
ChefDK::Policyfile::StorageConfig.new.use_policyfile(policyfile_filename)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
let(:cookbook_location_spec) { described_class.new(cookbook_name, version_constraint, source_options, storage_config) }
|
|
36
40
|
|
|
37
41
|
it "has a name" do
|
|
38
|
-
expect(
|
|
42
|
+
expect(cookbook_location_spec.name).to eq(cookbook_name)
|
|
39
43
|
end
|
|
40
44
|
|
|
41
45
|
it "has a version constraint" do
|
|
42
|
-
expect(
|
|
46
|
+
expect(cookbook_location_spec.version_constraint).to eq(Semverse::Constraint.new(version_constraint))
|
|
43
47
|
end
|
|
44
48
|
|
|
45
49
|
it "has source options it was created with" do
|
|
46
|
-
expect(
|
|
50
|
+
expect(cookbook_location_spec.source_options).to eq(source_options)
|
|
47
51
|
end
|
|
48
52
|
|
|
49
53
|
it "is equal to another cookbook spec with the same name, constraint, and options" do
|
|
50
|
-
equal_spec = described_class.new(cookbook_name, version_constraint, source_options,
|
|
51
|
-
expect(
|
|
54
|
+
equal_spec = described_class.new(cookbook_name, version_constraint, source_options, storage_config)
|
|
55
|
+
expect(cookbook_location_spec).to eq(equal_spec)
|
|
52
56
|
end
|
|
53
57
|
|
|
54
58
|
it "is not equal to another cookbook spec if the name, constraint or option differ" do
|
|
55
|
-
different_name = described_class.new("wut", version_constraint, source_options,
|
|
56
|
-
expect(
|
|
59
|
+
different_name = described_class.new("wut", version_constraint, source_options, storage_config)
|
|
60
|
+
expect(cookbook_location_spec).to_not eq(different_name)
|
|
57
61
|
|
|
58
|
-
different_constraint = described_class.new(cookbook_name, ">= 1.0.0", source_options,
|
|
59
|
-
expect(
|
|
62
|
+
different_constraint = described_class.new(cookbook_name, ">= 1.0.0", source_options, storage_config)
|
|
63
|
+
expect(cookbook_location_spec).to_not eq(different_constraint)
|
|
60
64
|
|
|
61
|
-
different_opts = described_class.new(cookbook_name, version_constraint, {git: "git://example.com/wat.git"},
|
|
62
|
-
expect(
|
|
65
|
+
different_opts = described_class.new(cookbook_name, version_constraint, {git: "git://example.com/wat.git"}, storage_config)
|
|
66
|
+
expect(cookbook_location_spec).to_not eq(different_opts)
|
|
63
67
|
end
|
|
64
68
|
|
|
65
69
|
it "gives the base directory from which relative paths will be expanded" do
|
|
66
|
-
expect(
|
|
70
|
+
expect(cookbook_location_spec.relative_paths_root).to eq(File.join(fixtures_path, "example_app"))
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "gives source options for locking via the installer" do
|
|
74
|
+
lock_data = double("Installer lock data")
|
|
75
|
+
expect(installer).to receive(:lock_data).and_return(lock_data)
|
|
76
|
+
expect(cookbook_location_spec).to receive(:installer).and_return(installer)
|
|
77
|
+
expect(cookbook_location_spec.source_options_for_lock).to eq(lock_data)
|
|
67
78
|
end
|
|
68
79
|
|
|
69
80
|
describe "fetching and querying a cookbook" do
|
|
70
81
|
|
|
71
82
|
before do
|
|
72
|
-
expect(CookbookOmnifetch).to receive(:init).with(
|
|
83
|
+
expect(CookbookOmnifetch).to receive(:init).with(cookbook_location_spec, source_options).and_return(installer)
|
|
73
84
|
end
|
|
74
85
|
|
|
75
86
|
it "initializes a CookbookOmnifetch location class to handle installation" do
|
|
76
|
-
expect(
|
|
87
|
+
expect(cookbook_location_spec.installer).to eq(installer)
|
|
77
88
|
end
|
|
78
89
|
|
|
79
90
|
it "delegates installation to the installer" do
|
|
80
91
|
expect(installer).to receive(:installed?).and_return(false)
|
|
81
92
|
expect(installer).to receive(:install)
|
|
82
|
-
|
|
93
|
+
cookbook_location_spec.ensure_cached
|
|
83
94
|
end
|
|
84
95
|
|
|
85
96
|
it "does not install the cookbook if it's already cached" do
|
|
86
97
|
expect(installer).to receive(:installed?).and_return(true)
|
|
87
98
|
expect(installer).to_not receive(:install)
|
|
88
|
-
|
|
99
|
+
cookbook_location_spec.ensure_cached
|
|
89
100
|
end
|
|
90
101
|
|
|
91
102
|
it "delegates cache_key to the installer" do
|
|
92
103
|
expect(installer).to receive(:cache_key).and_return("my_cookbook-1.2.3-supermarket.getchef.com")
|
|
93
|
-
expect(
|
|
104
|
+
expect(cookbook_location_spec.cache_key).to eq("my_cookbook-1.2.3-supermarket.getchef.com")
|
|
94
105
|
end
|
|
95
106
|
|
|
96
107
|
it "delegates relative_path to the installer" do
|
|
97
108
|
expect(installer).to receive(:relative_path).and_return(Pathname.new("../my_stuff/my_cookbook"))
|
|
98
|
-
expect(
|
|
109
|
+
expect(cookbook_location_spec.relative_path).to eq("../my_stuff/my_cookbook")
|
|
99
110
|
end
|
|
100
111
|
|
|
101
112
|
it "loads the cookbook metadata via the installer" do
|
|
102
|
-
expect(
|
|
113
|
+
expect(cookbook_location_spec.cached_cookbook).to eq(cached_cookbook)
|
|
103
114
|
end
|
|
104
115
|
|
|
105
116
|
it "gives the cookbook's version via the metadata" do
|
|
106
117
|
expect(cached_cookbook).to receive(:version).and_return("1.2.3")
|
|
107
|
-
expect(
|
|
118
|
+
expect(cookbook_location_spec.version).to eq("1.2.3")
|
|
108
119
|
end
|
|
109
120
|
|
|
110
121
|
it "gives the cookbook's dependencies via the metadata" do
|
|
111
122
|
expect(cached_cookbook).to receive(:dependencies).and_return("apt" => "~> 1.2.3")
|
|
112
|
-
expect(
|
|
123
|
+
expect(cookbook_location_spec.dependencies).to eq("apt" => "~> 1.2.3")
|
|
113
124
|
end
|
|
114
125
|
|
|
115
126
|
end
|
|
@@ -117,11 +128,24 @@ describe ChefDK::Policyfile::CookbookSpec do
|
|
|
117
128
|
describe "when created with no source" do
|
|
118
129
|
|
|
119
130
|
it "has a nil installer" do
|
|
120
|
-
expect(
|
|
131
|
+
expect(cookbook_location_spec.installer).to be_nil
|
|
121
132
|
end
|
|
122
133
|
|
|
123
134
|
it "is not at a fixed version" do
|
|
124
|
-
expect(
|
|
135
|
+
expect(cookbook_location_spec.version_fixed?).to be false
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
describe "when created with invalid source options" do
|
|
141
|
+
|
|
142
|
+
let(:source_options) { { herp: "derp" } }
|
|
143
|
+
|
|
144
|
+
it "is invalid" do
|
|
145
|
+
expect(cookbook_location_spec).to_not be_valid
|
|
146
|
+
expect(cookbook_location_spec.errors.size).to eq(1)
|
|
147
|
+
error = cookbook_location_spec.errors.first
|
|
148
|
+
expect(error).to eq("Cookbook `my_cookbook' has invalid source options `{:herp=>\"derp\"}'")
|
|
125
149
|
end
|
|
126
150
|
|
|
127
151
|
end
|
|
@@ -131,15 +155,20 @@ describe ChefDK::Policyfile::CookbookSpec do
|
|
|
131
155
|
let(:source_options) { { git: "git@github.com:example/my_cookbook.git" } }
|
|
132
156
|
|
|
133
157
|
it "has a git installer" do
|
|
134
|
-
expect(
|
|
158
|
+
expect(cookbook_location_spec.installer).to be_a_kind_of(CookbookOmnifetch::GitLocation)
|
|
135
159
|
end
|
|
136
160
|
|
|
137
161
|
it "has a fixed version" do
|
|
138
|
-
expect(
|
|
162
|
+
expect(cookbook_location_spec.version_fixed?).to be true
|
|
139
163
|
end
|
|
140
164
|
|
|
141
165
|
it "mirrors a canonical upstream" do
|
|
142
|
-
expect(
|
|
166
|
+
expect(cookbook_location_spec.mirrors_canonical_upstream?).to be true
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
it "is valid" do
|
|
170
|
+
expect(cookbook_location_spec.errors.size).to eq(0)
|
|
171
|
+
expect(cookbook_location_spec).to be_valid
|
|
143
172
|
end
|
|
144
173
|
|
|
145
174
|
end
|
|
@@ -149,15 +178,20 @@ describe ChefDK::Policyfile::CookbookSpec do
|
|
|
149
178
|
let(:source_options) { { github: "my_org/my_cookbook" } }
|
|
150
179
|
|
|
151
180
|
it "has a github installer" do
|
|
152
|
-
expect(
|
|
181
|
+
expect(cookbook_location_spec.installer).to be_a_kind_of(CookbookOmnifetch::GithubLocation)
|
|
153
182
|
end
|
|
154
183
|
|
|
155
184
|
it "has a fixed version" do
|
|
156
|
-
expect(
|
|
185
|
+
expect(cookbook_location_spec.version_fixed?).to be true
|
|
157
186
|
end
|
|
158
187
|
|
|
159
188
|
it "mirrors a canonical upstream" do
|
|
160
|
-
expect(
|
|
189
|
+
expect(cookbook_location_spec.mirrors_canonical_upstream?).to be true
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
it "is valid" do
|
|
193
|
+
expect(cookbook_location_spec.errors.size).to eq(0)
|
|
194
|
+
expect(cookbook_location_spec).to be_valid
|
|
161
195
|
end
|
|
162
196
|
|
|
163
197
|
end
|
|
@@ -167,15 +201,20 @@ describe ChefDK::Policyfile::CookbookSpec do
|
|
|
167
201
|
let(:source_options) { { path: "../example_cookbook" } }
|
|
168
202
|
|
|
169
203
|
it "has a path installer" do
|
|
170
|
-
expect(
|
|
204
|
+
expect(cookbook_location_spec.installer).to be_a_kind_of(CookbookOmnifetch::PathLocation)
|
|
171
205
|
end
|
|
172
206
|
|
|
173
207
|
it "has a fixed version" do
|
|
174
|
-
expect(
|
|
208
|
+
expect(cookbook_location_spec.version_fixed?).to be true
|
|
175
209
|
end
|
|
176
210
|
|
|
177
211
|
it "isnt a mirror of a canonical upstream" do
|
|
178
|
-
expect(
|
|
212
|
+
expect(cookbook_location_spec.mirrors_canonical_upstream?).to be false
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
it "is valid" do
|
|
216
|
+
expect(cookbook_location_spec.errors.size).to eq(0)
|
|
217
|
+
expect(cookbook_location_spec).to be_valid
|
|
179
218
|
end
|
|
180
219
|
|
|
181
220
|
end
|
|
@@ -185,16 +224,22 @@ describe ChefDK::Policyfile::CookbookSpec do
|
|
|
185
224
|
let(:source_options) { { artifactserver: "https://supermarket.getchef.com:/api/v1/cookbooks/my_cookbook/versions/2.0.0/download" } }
|
|
186
225
|
|
|
187
226
|
it "has a artifactserver installer" do
|
|
188
|
-
expect(
|
|
227
|
+
expect(cookbook_location_spec.installer).to be_a_kind_of(CookbookOmnifetch::ArtifactserverLocation)
|
|
189
228
|
end
|
|
190
229
|
|
|
191
230
|
it "does not have a fixed version" do
|
|
192
|
-
expect(
|
|
231
|
+
expect(cookbook_location_spec.version_fixed?).to be false
|
|
193
232
|
end
|
|
194
233
|
|
|
195
234
|
it "is a mirror of a canonical upstream" do
|
|
196
|
-
expect(
|
|
235
|
+
expect(cookbook_location_spec.mirrors_canonical_upstream?).to be true
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
it "is valid" do
|
|
239
|
+
expect(cookbook_location_spec.errors.size).to eq(0)
|
|
240
|
+
expect(cookbook_location_spec).to be_valid
|
|
197
241
|
end
|
|
198
242
|
|
|
243
|
+
|
|
199
244
|
end
|
|
200
245
|
end
|