chef-apply 0.4.6 → 0.4.9
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 +1 -7
- data/chef-apply.gemspec +3 -3
- data/lib/chef_apply/version.rb +1 -1
- metadata +3 -38
- data/README.md +0 -62
- data/spec/fixtures/custom_config.toml +0 -2
- data/spec/integration/chef-run_spec.rb +0 -41
- data/spec/integration/fixtures/chef_help.out +0 -70
- data/spec/integration/fixtures/chef_version.out +0 -1
- data/spec/integration/spec_helper.rb +0 -55
- data/spec/spec_helper.rb +0 -154
- data/spec/support/matchers/output_to_terminal.rb +0 -36
- data/spec/unit/action/base_spec.rb +0 -60
- data/spec/unit/action/converge_target/ccr_failure_mapper_spec.rb +0 -106
- data/spec/unit/action/converge_target_spec.rb +0 -400
- data/spec/unit/action/generate_local_policy_spec.rb +0 -114
- data/spec/unit/action/generate_temp_cookbook/recipe_lookup_spec.rb +0 -122
- data/spec/unit/action/generate_temp_cookbook/temp_cookbook_spec.rb +0 -198
- data/spec/unit/action/generate_temp_cookbook_spec.rb +0 -73
- data/spec/unit/action/install_chef/minimum_chef_version_spec.rb +0 -90
- data/spec/unit/action/install_chef_spec.rb +0 -164
- data/spec/unit/cli/options_spec.rb +0 -75
- data/spec/unit/cli/validation_spec.rb +0 -81
- data/spec/unit/cli_spec.rb +0 -475
- data/spec/unit/config_spec.rb +0 -70
- data/spec/unit/file_fetcher_spec.rb +0 -40
- data/spec/unit/fixtures/multi-error.out +0 -2
- data/spec/unit/log_spec.rb +0 -37
- data/spec/unit/startup_spec.rb +0 -323
- data/spec/unit/target_host/linux_spec.rb +0 -57
- data/spec/unit/target_host/windows_spec.rb +0 -43
- data/spec/unit/target_host_spec.rb +0 -297
- data/spec/unit/target_resolver_spec.rb +0 -380
- data/spec/unit/telemeter/sender_spec.rb +0 -140
- data/spec/unit/telemeter_spec.rb +0 -191
- data/spec/unit/text/error_translation_spec.rb +0 -109
- data/spec/unit/ui/error_printer_spec.rb +0 -196
- data/spec/unit/ui/terminal_spec.rb +0 -119
- data/spec/unit/version_spec.rb +0 -31
@@ -1,114 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright:: Copyright (c) 2017 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
|
-
require "spec_helper"
|
18
|
-
require "chef_apply/action/generate_local_policy"
|
19
|
-
require "chef-cli/policyfile_services/install"
|
20
|
-
require "chef-cli/ui"
|
21
|
-
require "chef-cli/policyfile_services/export_repo"
|
22
|
-
|
23
|
-
RSpec.describe ChefApply::Action::GenerateLocalPolicy do
|
24
|
-
subject { ChefApply::Action::GenerateLocalPolicy.new(cookbook: cookbook) }
|
25
|
-
let(:cookbook) do
|
26
|
-
double("TempCookbook",
|
27
|
-
path: "/my/temp/cookbook",
|
28
|
-
export_path: "/my/temp/cookbook/export",
|
29
|
-
policyfile_lock_path: "/my/temp/cookbook/policyfile.lock")
|
30
|
-
end
|
31
|
-
|
32
|
-
let(:installer_double) do
|
33
|
-
instance_double(ChefCLI::PolicyfileServices::Install, run: :ok)
|
34
|
-
end
|
35
|
-
|
36
|
-
let(:exporter_double) do
|
37
|
-
instance_double(ChefCLI::PolicyfileServices::ExportRepo,
|
38
|
-
archive_file_location: "/path/to/export",
|
39
|
-
run: :ok)
|
40
|
-
end
|
41
|
-
|
42
|
-
before do
|
43
|
-
allow(subject).to receive(:notify)
|
44
|
-
end
|
45
|
-
|
46
|
-
describe "#perform_action" do
|
47
|
-
context "in the normal case" do
|
48
|
-
it "exports the policy notifying caller of progress, setting archive_file_location" do
|
49
|
-
expect(subject).to receive(:notify).ordered.with(:generating)
|
50
|
-
expect(subject).to receive(:installer).ordered.and_return installer_double
|
51
|
-
expect(installer_double).to receive(:run).ordered
|
52
|
-
expect(subject).to receive(:notify).ordered.with(:exporting)
|
53
|
-
expect(subject).to receive(:exporter).ordered.and_return exporter_double
|
54
|
-
expect(exporter_double).to receive(:run).ordered
|
55
|
-
expect(subject).to receive(:exporter).ordered.and_return exporter_double
|
56
|
-
expect(subject).to receive(:notify).ordered.with(:success)
|
57
|
-
subject.perform_action
|
58
|
-
expect(subject.archive_file_location).to eq("/path/to/export")
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
context "when PolicyfileServices raises an error" do
|
63
|
-
it "reraises as PolicyfileInstallError" do
|
64
|
-
expect(subject).to receive(:installer).and_return installer_double
|
65
|
-
expect(installer_double).to receive(:run).and_raise(ChefCLI::PolicyfileInstallError.new("", nil))
|
66
|
-
expect { subject.perform_action }.to raise_error(ChefApply::Action::PolicyfileInstallError)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
context "when the path name is too long" do
|
71
|
-
let(:name) { "THIS_IS_A_REALLY_LONG_STRING111111111111111111111111111111111111111111111111111111" }
|
72
|
-
|
73
|
-
# There is an issue with policyfile generation where, if we have a cookbook with too long
|
74
|
-
# of a name or directory name the policyfile will not generate. This is because the tar
|
75
|
-
# library that ChefCLI uses comes from the Rubygems package and is meant for packaging
|
76
|
-
# gems up, so it can impose a 100 character limit. We attempt to solve this by ensuring
|
77
|
-
# that the paths/names we generate with `TempCookbook` are short.
|
78
|
-
#
|
79
|
-
# This is here for documentation
|
80
|
-
# 2018-05-18 mp addendum: this cna take upwards of 15s to run on ci nodes, pending
|
81
|
-
# for now since it's not testing any Chef Apply functionality.
|
82
|
-
xit "fails to create when there is a long path name" do
|
83
|
-
err = ChefCLI::PolicyfileExportRepoError
|
84
|
-
expect { subject.perform_action }.to raise_error(err) do |e|
|
85
|
-
expect(e.cause.class).to eq(Gem::Package::TooLongFileName)
|
86
|
-
expect(e.cause.message).to match(/should be 100 or less/)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
describe "#exporter" do
|
93
|
-
|
94
|
-
it "returns a correctly constructed ExportRepo" do
|
95
|
-
expect(ChefCLI::PolicyfileServices::ExportRepo).to receive(:new)
|
96
|
-
.with(policyfile: cookbook.policyfile_lock_path,
|
97
|
-
root_dir: cookbook.path,
|
98
|
-
export_dir: cookbook.export_path,
|
99
|
-
archive: true, force: true)
|
100
|
-
.and_return exporter_double
|
101
|
-
expect(subject.exporter).to eq exporter_double
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
describe "#installer" do
|
106
|
-
it "returns a correctly constructed Install service" do
|
107
|
-
expect(ChefCLI::PolicyfileServices::Install).to receive(:new)
|
108
|
-
.with(ui: ChefCLI::UI, root_dir: cookbook.path)
|
109
|
-
.and_return(installer_double)
|
110
|
-
expect(subject.installer).to eq installer_double
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
end
|
@@ -1,122 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright:: Copyright (c) 2018 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_apply/action/generate_temp_cookbook/recipe_lookup"
|
20
|
-
require "chef/exceptions"
|
21
|
-
require "chef/cookbook/cookbook_version_loader"
|
22
|
-
require "chef/cookbook_version"
|
23
|
-
require "chef/cookbook_loader"
|
24
|
-
|
25
|
-
RSpec.describe ChefApply::Action::GenerateTempCookbook::RecipeLookup do
|
26
|
-
let(:repo_path) { "repo_path" }
|
27
|
-
subject(:rp) { ChefApply::Action::GenerateTempCookbook::RecipeLookup.new([repo_path]) }
|
28
|
-
VL = Chef::Cookbook::CookbookVersionLoader
|
29
|
-
let(:version_loader) { instance_double(VL) }
|
30
|
-
let(:cookbook_version) { instance_double(Chef::CookbookVersion, root_dir: "dir", name: "name") }
|
31
|
-
let(:cookbook_loader) { instance_double(Chef::CookbookLoader, load_cookbooks: nil) }
|
32
|
-
|
33
|
-
describe "#split" do
|
34
|
-
it "splits a customer provided specifier into a cookbook part and possible recipe part" do
|
35
|
-
expect(rp.split("/some/path")).to eq(%w{/some/path})
|
36
|
-
expect(rp.split("cookbook::recipe")).to eq(%w{cookbook recipe})
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
describe "#load_cookbook" do
|
41
|
-
context "when a directory is provided" do
|
42
|
-
let(:recipe_specifier) { "/some/directory" }
|
43
|
-
let(:default_recipe) { File.join(recipe_specifier, "default.rb") }
|
44
|
-
let(:recipes_by_name) { { "default" => default_recipe } }
|
45
|
-
before do
|
46
|
-
expect(File).to receive(:directory?).with(recipe_specifier).and_return(true)
|
47
|
-
expect(VL).to receive(:new).with(recipe_specifier).and_return(version_loader)
|
48
|
-
end
|
49
|
-
|
50
|
-
it "loads the cookbook and returns the path to the default recipe" do
|
51
|
-
expect(version_loader).to receive(:load!)
|
52
|
-
expect(version_loader).to receive(:cookbook_version).and_return(cookbook_version)
|
53
|
-
expect(rp.load_cookbook(recipe_specifier)).to eq(cookbook_version)
|
54
|
-
end
|
55
|
-
|
56
|
-
context "the directory is not a cookbook" do
|
57
|
-
it "raise an InvalidCookbook error" do
|
58
|
-
expect(version_loader).to receive(:load!).and_raise(Chef::Exceptions::CookbookNotFoundInRepo.new)
|
59
|
-
expect { rp.load_cookbook(recipe_specifier) }.to raise_error(ChefApply::Action::GenerateTempCookbook::RecipeLookup::InvalidCookbook)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
context "when a cookbook name is provided" do
|
65
|
-
let(:recipe_specifier) { "cb" }
|
66
|
-
before do
|
67
|
-
expect(File).to receive(:directory?).with(recipe_specifier).and_return(false)
|
68
|
-
expect(Chef::CookbookLoader).to receive(:new).and_return(cookbook_loader)
|
69
|
-
end
|
70
|
-
|
71
|
-
context "and a cookbook in the cookbook repository exists with that name" do
|
72
|
-
it "returns the default cookbook" do
|
73
|
-
expect(cookbook_loader).to receive(:[]).with(recipe_specifier).and_return(cookbook_version)
|
74
|
-
expect(rp.load_cookbook(recipe_specifier)).to eq(cookbook_version)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
context "and a cookbook exists but it is invalid" do
|
79
|
-
it "raises an InvalidCookbook error" do
|
80
|
-
expect(cookbook_loader).to receive(:[]).with(recipe_specifier).and_raise(Chef::Exceptions::CookbookNotFoundInRepo.new)
|
81
|
-
expect(File).to receive(:directory?).with(File.join(repo_path, recipe_specifier)).and_return(true)
|
82
|
-
expect { rp.load_cookbook(recipe_specifier) }.to raise_error(ChefApply::Action::GenerateTempCookbook::RecipeLookup::InvalidCookbook)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
context "and a cookbook does not exist" do
|
87
|
-
it "raises an CookbookNotFound error" do
|
88
|
-
expect(cookbook_loader).to receive(:[]).with(recipe_specifier).and_raise(Chef::Exceptions::CookbookNotFoundInRepo.new)
|
89
|
-
expect(File).to receive(:directory?).with(File.join(repo_path, recipe_specifier)).and_return(false)
|
90
|
-
expect { rp.load_cookbook(recipe_specifier) }.to raise_error(ChefApply::Action::GenerateTempCookbook::RecipeLookup::CookbookNotFound)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
describe "#find_recipe" do
|
97
|
-
let(:recipe) { double("recipe") }
|
98
|
-
|
99
|
-
context "no recipe is specified" do
|
100
|
-
it "finds a default recipe" do
|
101
|
-
expect(cookbook_version).to receive(:recipe_filenames_by_name).and_return({ "default" => recipe })
|
102
|
-
expect(rp.find_recipe(cookbook_version)).to eq(recipe)
|
103
|
-
end
|
104
|
-
it "when there is no default recipe it raises a NoDefaultRecipe error" do
|
105
|
-
expect(cookbook_version).to receive(:recipe_filenames_by_name).and_return({})
|
106
|
-
expect { rp.find_recipe(cookbook_version) }.to raise_error(ChefApply::Action::GenerateTempCookbook::RecipeLookup::NoDefaultRecipe)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
context "a recipe is specified" do
|
111
|
-
let(:desired_recipe) { "a_recipe" }
|
112
|
-
it "finds the specified recipe" do
|
113
|
-
expect(cookbook_version).to receive(:recipe_filenames_by_name).and_return({ desired_recipe => recipe })
|
114
|
-
expect(rp.find_recipe(cookbook_version, desired_recipe)).to eq(recipe)
|
115
|
-
end
|
116
|
-
it "when there is no recipe with that name it raises a RecipeNotFound error" do
|
117
|
-
expect(cookbook_version).to receive(:recipe_filenames_by_name).and_return({})
|
118
|
-
expect { rp.find_recipe(cookbook_version, desired_recipe) }.to raise_error(ChefApply::Action::GenerateTempCookbook::RecipeLookup::RecipeNotFound)
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
@@ -1,198 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright:: Copyright (c) 2018 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 "tempfile"
|
20
|
-
require "securerandom"
|
21
|
-
require "chef_apply/action/generate_temp_cookbook/temp_cookbook"
|
22
|
-
RSpec.describe "ChefApply::Action::GenerateTempCookbook::TempCookbook" do
|
23
|
-
subject(:tc) { ChefApply::Action::GenerateTempCookbook::TempCookbook.new }
|
24
|
-
let(:uuid) { SecureRandom.uuid }
|
25
|
-
|
26
|
-
before do
|
27
|
-
@repo_paths = ChefApply::Config.chef.cookbook_repo_paths
|
28
|
-
ChefApply::Config.chef.cookbook_repo_paths = []
|
29
|
-
end
|
30
|
-
|
31
|
-
after do
|
32
|
-
ChefApply::Config.chef.cookbook_repo_paths = @repo_paths
|
33
|
-
subject.delete
|
34
|
-
end
|
35
|
-
|
36
|
-
describe "#from_existing_recipe" do
|
37
|
-
it "raises an error if the recipe does not have a .rb extension" do
|
38
|
-
err = ChefApply::Action::GenerateTempCookbook::TempCookbook::UnsupportedExtension
|
39
|
-
expect { subject.from_existing_recipe("/some/file.chef") }.to raise_error(err)
|
40
|
-
end
|
41
|
-
|
42
|
-
context "when there is an existing cookbook" do
|
43
|
-
let(:cb) do
|
44
|
-
d = Dir.mktmpdir
|
45
|
-
File.open(File.join(d, "metadata.rb"), "w+") do |f|
|
46
|
-
f << "name \"foo\""
|
47
|
-
end
|
48
|
-
FileUtils.mkdir(File.join(d, "recipes"))
|
49
|
-
d
|
50
|
-
end
|
51
|
-
|
52
|
-
let(:existing_recipe) do
|
53
|
-
File.open(File.join(cb, "recipes/default.rb"), "w+") do |f|
|
54
|
-
f.write(uuid)
|
55
|
-
f
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
after do
|
60
|
-
FileUtils.remove_entry cb
|
61
|
-
end
|
62
|
-
|
63
|
-
it "copies the whole cookbook" do
|
64
|
-
subject.from_existing_recipe(existing_recipe.path)
|
65
|
-
expect(File.read(File.join(subject.path, "recipes/default.rb"))).to eq(uuid)
|
66
|
-
expect(File.read(File.join(subject.path, "Policyfile.rb"))).to eq <<~EXPECTED_POLICYFILE
|
67
|
-
name "foo_policy"
|
68
|
-
default_source :supermarket
|
69
|
-
run_list "foo::default"
|
70
|
-
cookbook "foo", path: "."
|
71
|
-
EXPECTED_POLICYFILE
|
72
|
-
expect(File.read(File.join(subject.path, "metadata.rb"))).to eq("name \"foo\"")
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
context "when there is only a single recipe not in a cookbook" do
|
77
|
-
let(:existing_recipe) do
|
78
|
-
t = Tempfile.new(["recipe", ".rb"])
|
79
|
-
t.write(uuid)
|
80
|
-
t.close
|
81
|
-
t
|
82
|
-
end
|
83
|
-
|
84
|
-
after do
|
85
|
-
existing_recipe.unlink
|
86
|
-
end
|
87
|
-
|
88
|
-
it "copies the existing recipe into a new cookbook" do
|
89
|
-
subject.from_existing_recipe(existing_recipe.path)
|
90
|
-
recipe_filename = File.basename(existing_recipe.path)
|
91
|
-
recipe_name = File.basename(recipe_filename, File.extname(recipe_filename))
|
92
|
-
expect(File.read(File.join(subject.path, "recipes/", recipe_filename))).to eq(uuid)
|
93
|
-
expect(File.read(File.join(subject.path, "Policyfile.rb"))).to eq <<~EXPECTED_POLICYFILE
|
94
|
-
name "cw_recipe_policy"
|
95
|
-
default_source :supermarket
|
96
|
-
run_list "cw_recipe::#{recipe_name}"
|
97
|
-
cookbook "cw_recipe", path: "."
|
98
|
-
EXPECTED_POLICYFILE
|
99
|
-
expect(File.read(File.join(subject.path, "metadata.rb"))).to eq("name \"cw_recipe\"\n")
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
describe "#from_resource" do
|
105
|
-
it "creates a recipe containing the supplied recipe" do
|
106
|
-
subject.from_resource("directory", "/tmp/foo", [])
|
107
|
-
expect(File.read(File.join(subject.path, "recipes/default.rb"))).to eq("directory '/tmp/foo'\n")
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
describe "#generate_metadata" do
|
112
|
-
it "generates metadata in the temp cookbook" do
|
113
|
-
f = subject.generate_metadata("foo")
|
114
|
-
expect(File.read(f)).to eq("name \"foo\"\n")
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
describe "#generate_policyfile" do
|
119
|
-
context "when there is no existing policyfile" do
|
120
|
-
it "generates a policyfile in the temp cookbook" do
|
121
|
-
f = subject.generate_policyfile("foo", "bar")
|
122
|
-
expect(File.read(f)).to eq <<~EXPECTED_POLICYFILE
|
123
|
-
name "foo_policy"
|
124
|
-
default_source :supermarket
|
125
|
-
run_list "foo::bar"
|
126
|
-
cookbook "foo", path: "."
|
127
|
-
EXPECTED_POLICYFILE
|
128
|
-
end
|
129
|
-
|
130
|
-
context "when there are configured cookbook_repo_paths" do
|
131
|
-
it "generates a policyfile in the temp cookbook" do
|
132
|
-
ChefApply::Config.chef.cookbook_repo_paths = %w{one two}
|
133
|
-
f = subject.generate_policyfile("foo", "bar")
|
134
|
-
expect(File.read(f)).to eq <<~EXPECTED_POLICYFILE
|
135
|
-
name "foo_policy"
|
136
|
-
default_source :chef_repo, "one"
|
137
|
-
default_source :chef_repo, "two"
|
138
|
-
default_source :supermarket
|
139
|
-
run_list "foo::bar"
|
140
|
-
cookbook "foo", path: "."
|
141
|
-
EXPECTED_POLICYFILE
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
context "when there is an existing policyfile" do
|
147
|
-
before do
|
148
|
-
File.open(File.join(subject.path, "Policyfile.rb"), "a") do |f|
|
149
|
-
f << "this is a policyfile"
|
150
|
-
end
|
151
|
-
end
|
152
|
-
it "only overrides the existing run_list in the policyfile" do
|
153
|
-
f = subject.generate_policyfile("foo", "bar")
|
154
|
-
expect(File.read(f)).to eq <<~EXPECTED_POLICYFILE
|
155
|
-
this is a policyfile
|
156
|
-
# Overriding run_list with command line specified value
|
157
|
-
run_list "foo::bar"
|
158
|
-
EXPECTED_POLICYFILE
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
describe "#create_resource_definition" do
|
164
|
-
let(:r1) { "directory" }
|
165
|
-
let(:r2) { "/tmp" }
|
166
|
-
let(:props) { nil }
|
167
|
-
context "when no properties are provided" do
|
168
|
-
it "it creates a simple resource" do
|
169
|
-
expect(subject.create_resource_definition(r1, r2, [])).to eq("directory '/tmp'\n")
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
context "when properties are provided" do
|
174
|
-
let(:props) do
|
175
|
-
{
|
176
|
-
"key1" => "value",
|
177
|
-
"key2" => 0.1,
|
178
|
-
"key3" => 100,
|
179
|
-
"key4" => true,
|
180
|
-
"key_with_underscore" => "value",
|
181
|
-
}
|
182
|
-
end
|
183
|
-
|
184
|
-
it "converts the properties to chef-client args" do
|
185
|
-
expected = <<~EXPECTED_RESOURCE
|
186
|
-
directory '/tmp' do
|
187
|
-
key1 'value'
|
188
|
-
key2 0.1
|
189
|
-
key3 100
|
190
|
-
key4 true
|
191
|
-
key_with_underscore 'value'
|
192
|
-
end
|
193
|
-
EXPECTED_RESOURCE
|
194
|
-
expect(subject.create_resource_definition(r1, r2, props)).to eq(expected)
|
195
|
-
end
|
196
|
-
end
|
197
|
-
end
|
198
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright:: Copyright (c) 2018 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 "chef_apply/action/generate_temp_cookbook"
|
19
|
-
|
20
|
-
RSpec.describe ChefApply::Action::GenerateTempCookbook do
|
21
|
-
let(:options) { {} }
|
22
|
-
subject { ChefApply::Action::GenerateTempCookbook }
|
23
|
-
|
24
|
-
describe ".from_options" do
|
25
|
-
context "when given options for a recipe" do
|
26
|
-
let(:options) { { recipe_spec: "some::recipe" } }
|
27
|
-
it "returns a GenerateCookbookFromRecipe action" do
|
28
|
-
expect(subject.from_options(options)).to be_a(ChefApply::Action::GenerateCookbookFromRecipe)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
context "when given options for a resource" do
|
33
|
-
let(:resource_properties) { {} }
|
34
|
-
let(:options) do
|
35
|
-
{ resource_name: "user1", resource_type: "user",
|
36
|
-
resource_properties: resource_properties }
|
37
|
-
end
|
38
|
-
|
39
|
-
it "returns a GenerateCookbookFromResource action" do
|
40
|
-
expect(subject.from_options(options)).to be_a ChefApply::Action::GenerateCookbookFromResource
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
context "when not given sufficient options for either" do
|
45
|
-
let(:options) { {} }
|
46
|
-
it "raises MissingOptions" do
|
47
|
-
expect { subject.from_options(options) }.to raise_error ChefApply::Action::MissingOptions
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
describe "#perform_action" do
|
54
|
-
subject { ChefApply::Action::GenerateTempCookbook.new( {} ) }
|
55
|
-
it "generates a cookbook, notifies caller, and makes the cookbook available" do
|
56
|
-
expect(subject).to receive(:notify).ordered.with(:generating)
|
57
|
-
expect(subject).to receive(:generate)
|
58
|
-
expect(subject).to receive(:notify).ordered.with(:success)
|
59
|
-
subject.perform_action
|
60
|
-
expect(subject.generated_cookbook).to_not be nil
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
RSpec.describe ChefApply::Action::GenerateCookbookFromRecipe do
|
68
|
-
xit "#generate", "Please implement me"
|
69
|
-
end
|
70
|
-
|
71
|
-
RSpec.describe ChefApply::Action::GenerateCookbookFromResource do
|
72
|
-
xit "#generate", "Please implement me"
|
73
|
-
end
|