chef 16.4.41 → 16.5.64
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Rakefile +2 -2
- data/bin/knife +1 -1
- data/chef.gemspec +2 -1
- data/lib/chef/application.rb +18 -16
- data/lib/chef/application/apply.rb +12 -7
- data/lib/chef/application/base.rb +26 -23
- data/lib/chef/application/client.rb +10 -4
- data/lib/chef/application/exit_code.rb +13 -4
- data/lib/chef/application/knife.rb +22 -11
- data/lib/chef/application/solo.rb +2 -1
- data/lib/chef/application/windows_service.rb +14 -14
- data/lib/chef/application/windows_service_manager.rb +6 -6
- data/lib/chef/chef_fs/knife.rb +2 -2
- data/lib/chef/chef_fs/parallelizer.rb +0 -1
- data/lib/chef/client.rb +10 -11
- data/lib/chef/cookbook/cookbook_version_loader.rb +1 -1
- data/lib/chef/cookbook/synchronizer.rb +2 -2
- data/lib/chef/cookbook_site_streaming_uploader.rb +13 -11
- data/lib/chef/cookbook_uploader.rb +1 -1
- data/lib/chef/data_collector.rb +6 -5
- data/lib/chef/data_collector/config_validation.rb +22 -13
- data/lib/chef/data_collector/run_end_message.rb +2 -2
- data/lib/chef/data_collector/run_start_message.rb +1 -1
- data/lib/chef/deprecated.rb +1 -1
- data/lib/chef/deprecation/warnings.rb +2 -2
- data/lib/chef/digester.rb +2 -2
- data/lib/chef/dsl/chef_vault.rb +1 -1
- data/lib/chef/dsl/data_query.rb +2 -2
- data/lib/chef/dsl/platform_introspection.rb +1 -1
- data/lib/chef/encrypted_data_bag_item.rb +3 -4
- data/lib/chef/encrypted_data_bag_item/decryptor.rb +3 -3
- data/lib/chef/encrypted_data_bag_item/encryptor.rb +3 -3
- data/lib/chef/environment.rb +2 -2
- data/lib/chef/event_loggers/windows_eventlog.rb +2 -2
- data/lib/chef/exceptions.rb +4 -4
- data/lib/chef/file_access_control/windows.rb +5 -1
- data/lib/chef/formatters/doc.rb +7 -6
- data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +6 -5
- data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +3 -3
- data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +9 -9
- data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +2 -2
- data/lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb +3 -3
- data/lib/chef/formatters/minimal.rb +5 -4
- data/lib/chef/http.rb +6 -4
- data/lib/chef/http/auth_credentials.rb +5 -1
- data/lib/chef/http/authenticator.rb +1 -1
- data/lib/chef/http/basic_client.rb +4 -2
- data/lib/chef/http/decompressor.rb +1 -1
- data/lib/chef/http/http_request.rb +7 -5
- data/lib/chef/http/socketless_chef_zero_client.rb +5 -2
- data/lib/chef/http/ssl_policies.rb +1 -1
- data/lib/chef/json_compat.rb +1 -1
- data/lib/chef/knife.rb +4 -4
- data/lib/chef/knife/bootstrap.rb +16 -14
- data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -1
- data/lib/chef/knife/bootstrap/templates/chef-full.erb +3 -3
- data/lib/chef/knife/bootstrap/templates/windows-chef-client-msi.erb +7 -7
- data/lib/chef/knife/client_create.rb +3 -3
- data/lib/chef/knife/config_get.rb +8 -97
- data/lib/chef/knife/config_get_profile.rb +9 -9
- data/lib/chef/knife/config_list.rb +139 -0
- data/lib/chef/knife/config_list_profiles.rb +8 -98
- data/lib/chef/knife/config_show.rb +127 -0
- data/lib/chef/knife/config_use.rb +61 -0
- data/lib/chef/knife/config_use_profile.rb +9 -24
- data/lib/chef/knife/configure.rb +2 -2
- data/lib/chef/knife/core/bootstrap_context.rb +2 -2
- data/lib/chef/knife/core/object_loader.rb +1 -1
- data/lib/chef/knife/core/windows_bootstrap_context.rb +11 -11
- data/lib/chef/knife/exec.rb +2 -2
- data/lib/chef/knife/node_show.rb +2 -2
- data/lib/chef/knife/serve.rb +3 -3
- data/lib/chef/knife/ssh.rb +16 -1
- data/lib/chef/knife/ssl_check.rb +3 -3
- data/lib/chef/knife/status.rb +2 -2
- data/lib/chef/knife/user_create.rb +2 -2
- data/lib/chef/knife/yaml_convert.rb +1 -1
- data/lib/chef/local_mode.rb +2 -2
- data/lib/chef/log/syslog.rb +2 -2
- data/lib/chef/log/winevt.rb +2 -2
- data/lib/chef/mixin/deep_merge.rb +0 -12
- data/lib/chef/mixin/openssl_helper.rb +1 -4
- data/lib/chef/mixin/template.rb +2 -2
- data/lib/chef/mixin/uris.rb +2 -2
- data/lib/chef/mixin/versioned_api.rb +1 -2
- data/lib/chef/monkey_patches/net_http.rb +4 -4
- data/lib/chef/node_map.rb +2 -2
- data/lib/chef/policy_builder/policyfile.rb +2 -2
- data/lib/chef/provider.rb +0 -4
- data/lib/chef/provider/file.rb +2 -2
- data/lib/chef/provider/ifconfig.rb +1 -1
- data/lib/chef/provider/launchd.rb +2 -2
- data/lib/chef/provider/mount/linux.rb +63 -0
- data/lib/chef/provider/package/rubygems.rb +21 -18
- data/lib/chef/provider/package/snap.rb +0 -1
- data/lib/chef/provider/package/windows.rb +2 -2
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +3 -1
- data/lib/chef/provider/package/zypper.rb +1 -1
- data/lib/chef/provider/remote_file/content.rb +3 -0
- data/lib/chef/provider/remote_file/ftp.rb +6 -4
- data/lib/chef/provider/remote_file/sftp.rb +6 -4
- data/lib/chef/provider/route.rb +2 -6
- data/lib/chef/provider/service/macosx.rb +2 -2
- data/lib/chef/provider/template_finder.rb +2 -10
- data/lib/chef/provider/user/dscl.rb +3 -3
- data/lib/chef/provider/user/mac.rb +1 -1
- data/lib/chef/provider/windows_task.rb +1 -2
- data/lib/chef/provider/zypper_repository.rb +2 -2
- data/lib/chef/provider_resolver.rb +1 -1
- data/lib/chef/providers.rb +1 -0
- data/lib/chef/recipe.rb +2 -2
- data/lib/chef/resource.rb +1 -1
- data/lib/chef/resource/apt_repository.rb +1 -1
- data/lib/chef/resource/bff_package.rb +22 -0
- data/lib/chef/resource/breakpoint.rb +57 -2
- data/lib/chef/resource/build_essential.rb +1 -1
- data/lib/chef/resource/cab_package.rb +29 -0
- data/lib/chef/resource/chef_client_cron.rb +32 -25
- data/lib/chef/resource/chef_client_launchd.rb +194 -0
- data/lib/chef/resource/chef_client_scheduled_task.rb +21 -18
- data/lib/chef/resource/chef_client_systemd_timer.rb +24 -17
- data/lib/chef/resource/chef_client_trusted_certificate.rb +101 -0
- data/lib/chef/resource/chef_gem.rb +10 -10
- data/lib/chef/resource/chef_handler.rb +148 -4
- data/lib/chef/resource/chef_sleep.rb +2 -2
- data/lib/chef/resource/chef_vault_secret.rb +1 -1
- data/lib/chef/resource/cookbook_file.rb +2 -2
- data/lib/chef/resource/cron/cron_d.rb +0 -1
- data/lib/chef/resource/dnf_package.rb +2 -2
- data/lib/chef/resource/dsc_resource.rb +0 -1
- data/lib/chef/resource/dsc_script.rb +2 -2
- data/lib/chef/resource/execute.rb +6 -6
- data/lib/chef/resource/file.rb +4 -4
- data/lib/chef/resource/gem_package.rb +5 -5
- data/lib/chef/resource/homebrew_package.rb +3 -3
- data/lib/chef/resource/homebrew_update.rb +5 -5
- data/lib/chef/resource/hostname.rb +2 -2
- data/lib/chef/resource/launchd.rb +2 -1
- data/lib/chef/resource/locale.rb +2 -2
- data/lib/chef/resource/macos_userdefaults.rb +3 -3
- data/lib/chef/resource/notify_group.rb +0 -1
- data/lib/chef/resource/ohai.rb +46 -3
- data/lib/chef/resource/ohai_hint.rb +33 -0
- data/lib/chef/resource/openssl_dhparam.rb +27 -5
- data/lib/chef/resource/openssl_ec_private_key.rb +6 -3
- data/lib/chef/resource/openssl_ec_public_key.rb +2 -2
- data/lib/chef/resource/openssl_rsa_private_key.rb +6 -3
- data/lib/chef/resource/openssl_x509_certificate.rb +14 -14
- data/lib/chef/resource/openssl_x509_crl.rb +19 -10
- data/lib/chef/resource/openssl_x509_request.rb +14 -16
- data/lib/chef/resource/osx_profile.rb +77 -13
- data/lib/chef/resource/plist.rb +1 -1
- data/lib/chef/resource/powershell_package_source.rb +5 -5
- data/lib/chef/resource/reboot.rb +2 -2
- data/lib/chef/resource/remote_file.rb +3 -3
- data/lib/chef/resource/rhsm_register.rb +22 -10
- data/lib/chef/resource/ruby_block.rb +2 -2
- data/lib/chef/resource/scm/subversion.rb +2 -2
- data/lib/chef/resource/service.rb +3 -3
- data/lib/chef/resource/ssh_known_hosts_entry.rb +2 -2
- data/lib/chef/resource/support/cron.d.erb +1 -1
- data/lib/chef/resource/support/cron_access.erb +1 -1
- data/lib/chef/resource/support/sudoer.erb +1 -1
- data/lib/chef/resource/support/ulimit.erb +1 -1
- data/lib/chef/resource/sysctl.rb +1 -5
- data/lib/chef/resource/systemd_unit.rb +2 -2
- data/lib/chef/resource/template.rb +2 -2
- data/lib/chef/resource/windows_ad_join.rb +10 -3
- data/lib/chef/resource/windows_certificate.rb +6 -4
- data/lib/chef/resource/windows_firewall_profile.rb +22 -20
- data/lib/chef/resource/windows_package.rb +28 -5
- data/lib/chef/resource/windows_printer.rb +5 -3
- data/lib/chef/resource/windows_printer_port.rb +6 -4
- data/lib/chef/resource/windows_user_privilege.rb +53 -54
- data/lib/chef/resource/windows_workgroup.rb +3 -3
- data/lib/chef/resource/yum_package.rb +2 -2
- data/lib/chef/resources.rb +3 -1
- data/lib/chef/run_context.rb +2 -2
- data/lib/chef/run_context/cookbook_compiler.rb +1 -1
- data/lib/chef/run_lock.rb +2 -2
- data/lib/chef/search/query.rb +4 -5
- data/lib/chef/shell.rb +31 -26
- data/lib/chef/shell/ext.rb +11 -11
- data/lib/chef/shell/shell_session.rb +2 -2
- data/lib/chef/train_transport.rb +5 -104
- data/lib/chef/util/diff.rb +3 -3
- data/lib/chef/util/powershell/cmdlet.rb +3 -1
- data/lib/chef/util/powershell/ps_credential.rb +18 -14
- data/lib/chef/util/threaded_job_queue.rb +0 -2
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/crypto.rb +1 -1
- data/lib/chef/win32/registry.rb +1 -2
- data/spec/data/shef-config.rb +1 -1
- data/spec/functional/event_loggers/windows_eventlog_spec.rb +6 -5
- data/spec/functional/resource/aix_service_spec.rb +2 -2
- data/spec/functional/resource/aixinit_service_spec.rb +1 -1
- data/spec/functional/resource/insserv_spec.rb +1 -1
- data/spec/functional/resource/user/dscl_spec.rb +1 -1
- data/spec/functional/resource/user/mac_user_spec.rb +1 -1
- data/spec/functional/resource/windows_task_spec.rb +13 -13
- data/spec/functional/version_spec.rb +3 -3
- data/spec/integration/client/client_spec.rb +4 -4
- data/spec/integration/client/exit_code_spec.rb +3 -2
- data/spec/integration/client/ipv6_spec.rb +1 -1
- data/spec/integration/knife/{config_list_profiles_spec.rb → config_list_spec.rb} +30 -29
- data/spec/integration/knife/{config_get_spec.rb → config_show_spec.rb} +3 -3
- data/spec/integration/knife/{config_use_profile_spec.rb → config_use_spec.rb} +53 -10
- data/spec/integration/knife/cookbook_api_ipv6_spec.rb +1 -1
- data/spec/integration/ohai/ohai_spec.rb +61 -0
- data/spec/integration/recipes/remote_directory.rb +1 -1
- data/spec/integration/solo/solo_spec.rb +5 -5
- data/spec/spec_helper.rb +6 -3
- data/spec/stress/win32/file_spec.rb +1 -1
- data/spec/support/chef_helpers.rb +2 -2
- data/spec/support/matchers/leak.rb +2 -2
- data/spec/support/platform_helpers.rb +16 -34
- data/spec/support/shared/functional/securable_resource.rb +108 -27
- data/spec/support/shared/functional/win32_service.rb +1 -1
- data/spec/support/shared/unit/application_dot_d.rb +5 -3
- data/spec/tiny_server.rb +0 -1
- data/spec/unit/application/client_spec.rb +2 -2
- data/spec/unit/application/exit_code_spec.rb +10 -0
- data/spec/unit/application_spec.rb +4 -6
- data/spec/unit/chef_fs/parallelizer_spec.rb +5 -1
- data/spec/unit/chef_fs/path_util_spec.rb +1 -1
- data/spec/unit/cookbook/synchronizer_spec.rb +2 -2
- data/spec/unit/cookbook_spec.rb +2 -2
- data/spec/unit/data_collector/config_validation_spec.rb +208 -0
- data/spec/unit/data_collector_spec.rb +0 -113
- data/spec/unit/dsl/declare_resource_spec.rb +1 -1
- data/spec/unit/file_access_control_spec.rb +1 -1
- data/spec/unit/knife/bootstrap_spec.rb +6 -6
- data/spec/unit/knife/core/ui_spec.rb +1 -0
- data/spec/unit/knife/ssh_spec.rb +2 -2
- data/spec/unit/lwrp_spec.rb +3 -3
- data/spec/unit/mixin/deep_merge_spec.rb +15 -0
- data/spec/unit/mixin/openssl_helper_spec.rb +1 -1
- data/spec/unit/mixin/powershell_exec_spec.rb +1 -1
- data/spec/unit/mixin/securable_spec.rb +2 -2
- data/spec/unit/node/immutable_collections_spec.rb +2 -2
- data/spec/unit/provider/mount/linux_spec.rb +97 -0
- data/spec/unit/provider/package/chocolatey_spec.rb +1 -1
- data/spec/unit/provider/package/powershell_spec.rb +1 -1
- data/spec/unit/provider/package/rubygems_spec.rb +4 -1
- data/spec/unit/provider/route_spec.rb +0 -2
- data/spec/unit/recipe_spec.rb +1 -1
- data/spec/unit/resource/chef_client_cron_spec.rb +35 -14
- data/spec/unit/resource/chef_client_launchd_spec.rb +127 -0
- data/spec/unit/resource/chef_client_systemd_timer_spec.rb +36 -1
- data/spec/unit/resource/chef_client_trusted_certificate_spec.rb +54 -0
- data/spec/unit/resource/launchd_spec.rb +8 -0
- data/spec/unit/resource/osx_profile_spec.rb +67 -1
- data/spec/unit/resource/rhsm_register_spec.rb +56 -18
- data/spec/unit/resource/windows_uac_spec.rb +1 -1
- data/spec/unit/resource/windows_user_privilege_spec.rb +55 -0
- data/spec/unit/run_lock_spec.rb +5 -1
- data/spec/unit/runner_spec.rb +1 -2
- data/spec/unit/shell/shell_ext_spec.rb +46 -3
- data/spec/unit/shell/shell_session_spec.rb +35 -64
- data/spec/unit/shell_spec.rb +16 -19
- data/spec/unit/train_transport_spec.rb +14 -13
- data/spec/unit/util/selinux_spec.rb +2 -0
- data/tasks/rspec.rb +0 -2
- metadata +41 -17
- data/lib/chef/dist.rb +0 -68
- data/spec/integration/knife/config_get_profile_spec.rb +0 -114
@@ -17,7 +17,7 @@ require "spec_helper"
|
|
17
17
|
require "support/shared/integration/integration_helper"
|
18
18
|
require "support/shared/context/config"
|
19
19
|
|
20
|
-
describe "knife config
|
20
|
+
describe "knife config show", :workstation do
|
21
21
|
include IntegrationSupport
|
22
22
|
include KnifeSupport
|
23
23
|
|
@@ -27,7 +27,7 @@ describe "knife config get", :workstation do
|
|
27
27
|
|
28
28
|
when_the_repository("has a custom env") do
|
29
29
|
subject do
|
30
|
-
cmd = knife("config", "
|
30
|
+
cmd = knife("config", "show", *cmd_args, instance_filter: lambda { |instance|
|
31
31
|
# Clear the stub set up in KnifeSupport.
|
32
32
|
allow(File).to receive(:file?).and_call_original
|
33
33
|
# Lies, damn lies, and config files. We need to allow normal config loading
|
@@ -47,7 +47,7 @@ describe "knife config get", :workstation do
|
|
47
47
|
ChefConfig::PathHelper.per_tool_home_environment = "KNIFE_HOME"
|
48
48
|
# Clear these out because they are cached permanently.
|
49
49
|
ChefConfig::PathHelper.class_exec { remove_class_variable(:@@home_dir) }
|
50
|
-
Chef::Knife::
|
50
|
+
Chef::Knife::ConfigShow.reset_config_loader!
|
51
51
|
begin
|
52
52
|
ex.run
|
53
53
|
ensure
|
@@ -17,7 +17,7 @@ require "spec_helper"
|
|
17
17
|
require "support/shared/integration/integration_helper"
|
18
18
|
require "support/shared/context/config"
|
19
19
|
|
20
|
-
describe "knife config use
|
20
|
+
describe "knife config use", :workstation do
|
21
21
|
include IntegrationSupport
|
22
22
|
include KnifeSupport
|
23
23
|
|
@@ -26,15 +26,15 @@ describe "knife config use-profile", :workstation do
|
|
26
26
|
let(:cmd_args) { [] }
|
27
27
|
|
28
28
|
when_the_repository("has a custom env") do
|
29
|
-
let(:
|
30
|
-
knife("config", "use
|
29
|
+
let(:knife_use) do
|
30
|
+
knife("config", "use", *cmd_args, instance_filter: lambda { |instance|
|
31
31
|
# Fake the failsafe check because this command doesn't actually process knife.rb.
|
32
32
|
$__KNIFE_INTEGRATION_FAILSAFE_CHECK << " ole"
|
33
33
|
allow(File).to receive(:file?).and_call_original
|
34
34
|
})
|
35
35
|
end
|
36
36
|
|
37
|
-
subject {
|
37
|
+
subject { knife_use.stdout }
|
38
38
|
|
39
39
|
around do |ex|
|
40
40
|
# Store and reset the value of some env vars.
|
@@ -45,7 +45,7 @@ describe "knife config use-profile", :workstation do
|
|
45
45
|
ChefConfig::PathHelper.per_tool_home_environment = "KNIFE_HOME"
|
46
46
|
# Clear these out because they are cached permanently.
|
47
47
|
ChefConfig::PathHelper.class_exec { remove_class_variable(:@@home_dir) }
|
48
|
-
Chef::Knife::
|
48
|
+
Chef::Knife::ConfigUse.reset_config_loader!
|
49
49
|
begin
|
50
50
|
ex.run
|
51
51
|
ensure
|
@@ -68,8 +68,51 @@ describe "knife config use-profile", :workstation do
|
|
68
68
|
end
|
69
69
|
|
70
70
|
context "with no argument" do
|
71
|
-
|
72
|
-
|
71
|
+
context "with no configuration" do
|
72
|
+
it { is_expected.to eq "default\n" }
|
73
|
+
end
|
74
|
+
|
75
|
+
context "with --profile" do
|
76
|
+
let(:cmd_args) { %w{--profile production} }
|
77
|
+
it { is_expected.to eq "production\n" }
|
78
|
+
end
|
79
|
+
|
80
|
+
context "with an environment variable" do
|
81
|
+
around do |ex|
|
82
|
+
old_chef_profile = ENV["CHEF_PROFILE"]
|
83
|
+
begin
|
84
|
+
ENV["CHEF_PROFILE"] = "staging"
|
85
|
+
ex.run
|
86
|
+
ensure
|
87
|
+
ENV["CHEF_PROFILE"] = old_chef_profile
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
it { is_expected.to eq "staging\n" }
|
92
|
+
end
|
93
|
+
|
94
|
+
context "with a context file" do
|
95
|
+
before { file(".chef/context", "development\n") }
|
96
|
+
it { is_expected.to eq "development\n" }
|
97
|
+
end
|
98
|
+
|
99
|
+
context "with a context file under $CHEF_HOME" do
|
100
|
+
before do
|
101
|
+
file("chefhome/.chef/context", "other\n")
|
102
|
+
ENV["CHEF_HOME"] = path_to("chefhome")
|
103
|
+
end
|
104
|
+
|
105
|
+
it { is_expected.to eq "other\n" }
|
106
|
+
end
|
107
|
+
|
108
|
+
context "with a context file under $KNIFE_HOME" do
|
109
|
+
before do
|
110
|
+
file("knifehome/.chef/context", "other\n")
|
111
|
+
ENV["KNIFE_HOME"] = path_to("knifehome")
|
112
|
+
end
|
113
|
+
|
114
|
+
it { is_expected.to eq "other\n" }
|
115
|
+
end
|
73
116
|
end
|
74
117
|
|
75
118
|
context "with an argument" do
|
@@ -88,14 +131,14 @@ describe "knife config use-profile", :workstation do
|
|
88
131
|
|
89
132
|
context "with no credentials file" do
|
90
133
|
let(:cmd_args) { %w{production} }
|
91
|
-
subject {
|
134
|
+
subject { knife_use.stderr }
|
92
135
|
it { is_expected.to eq "FATAL: No profiles found, #{path_to(".chef/credentials")} does not exist or is empty\n" }
|
93
136
|
end
|
94
137
|
|
95
138
|
context "with an empty credentials file" do
|
96
139
|
let(:cmd_args) { %w{production} }
|
97
140
|
before { file(".chef/credentials", "") }
|
98
|
-
subject {
|
141
|
+
subject { knife_use.stderr }
|
99
142
|
it { is_expected.to eq "FATAL: No profiles found, #{path_to(".chef/credentials")} does not exist or is empty\n" }
|
100
143
|
end
|
101
144
|
|
@@ -107,7 +150,7 @@ describe "knife config use-profile", :workstation do
|
|
107
150
|
client_key = "testkey.pem"
|
108
151
|
chef_server_url = "https://example.com/organizations/testorg"
|
109
152
|
EOH
|
110
|
-
subject {
|
153
|
+
subject { knife_use }
|
111
154
|
it { expect { subject }.to raise_error ChefConfig::ConfigurationError, "Profile staging doesn't exist. Please add it to #{path_to(".chef/credentials")} and if it is profile with DNS name check that you are not missing single quotes around it as per docs https://docs.chef.io/workstation/knife_setup/#knife-profiles." }
|
112
155
|
end
|
113
156
|
|
@@ -62,7 +62,7 @@ describe "Knife cookbook API integration with IPv6", :workstation, :not_supporte
|
|
62
62
|
Dir.mktmpdir
|
63
63
|
end
|
64
64
|
|
65
|
-
let(:chef_dir) { File.join(
|
65
|
+
let(:chef_dir) { File.join(__dir__, "..", "..", "..", "bin") }
|
66
66
|
let(:knife) { "ruby '#{chef_dir}/knife'" }
|
67
67
|
|
68
68
|
let(:knife_config_flag) { "-c '#{path_to("config/knife.rb")}'" }
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "chef/mixin/shell_out"
|
3
|
+
require "benchmark" unless defined?(Benchmark)
|
4
|
+
|
5
|
+
describe "ohai" do
|
6
|
+
include Chef::Mixin::ShellOut
|
7
|
+
|
8
|
+
let(:ohai) { "bundle exec ohai" }
|
9
|
+
|
10
|
+
describe "testing ohai performance" do
|
11
|
+
# The purpose of this test is to generally find misconfigured DNS on
|
12
|
+
# CI testers. If this fails, it is probably because the forward+reverse
|
13
|
+
# DNS lookup that node[:hostname] needs is timing out and failing.
|
14
|
+
#
|
15
|
+
# If it is failing spuriously, it may mean DNS is failing spuriously, the
|
16
|
+
# best solution will be to make sure that `hostname -f`-like behavior hits
|
17
|
+
# /etc/hosts and not DNS.
|
18
|
+
#
|
19
|
+
# If it still fails supriously, it is possible that the server has high
|
20
|
+
# CPU load (e.g. due to background processes) which are contending with the
|
21
|
+
# running tests (disable the screensaver on servers, stop playing Fortnite
|
22
|
+
# while you're running tests, etc).
|
23
|
+
#
|
24
|
+
# If this just fails due to I/O being very slow and ruby being very slow to
|
25
|
+
# startup then that still indicates that the tester configuration needs
|
26
|
+
# fixing. The fact that this will fail on a windows box on a virt that doesn't
|
27
|
+
# use an SSD is because we have a higher bar for the tests to run successfully
|
28
|
+
# and that configuration is broken, so this test is red for a reason.
|
29
|
+
#
|
30
|
+
# This will probably fail on raspberry pi's or something like that as well. That
|
31
|
+
# is not a bug. We will never accept a raspberry pi as a CI tester for our
|
32
|
+
# software. Feel free to manually delete and thereby skip this file in your
|
33
|
+
# own testing harness, but that is not our concern, we are testing behavior
|
34
|
+
# that is critical to our infrastructure and must run in our tests.
|
35
|
+
#
|
36
|
+
# XXX: unfortunately this is so slow on our windows testers (~9 seconds on one
|
37
|
+
# tester) that we can't enable it for windows unless we get some better perf there.
|
38
|
+
#
|
39
|
+
it "the hostname plugin must return in under 4 seconds (see comments in code)" do
|
40
|
+
# unfortunately this doesn't look stable enough to enable
|
41
|
+
skip "we need to do more performance work on windows and s390x testers before this can be enabled"
|
42
|
+
delta = Benchmark.realtime do
|
43
|
+
shell_out!("#{ohai} hostname")
|
44
|
+
end
|
45
|
+
expect(delta).to be < 4
|
46
|
+
end
|
47
|
+
|
48
|
+
# The purpose of this is to give some indication of if shell_out is slow or
|
49
|
+
# if the hostname plugin itself is slow. If this test is also failing that we
|
50
|
+
# almost certainly have some kind of issue with DNS timeouts, etc. If this
|
51
|
+
# test succeeds and the other one fails, then it can be some kind of shelling-out
|
52
|
+
# issue or poor performance due to I/O on starting up ruby to run ohai, etc.
|
53
|
+
#
|
54
|
+
it "the hostname plugin must return in under 2 seconds when called from pure ruby" do
|
55
|
+
delta = Benchmark.realtime do
|
56
|
+
Ohai::System.new.all_plugins(["hostname"])
|
57
|
+
end
|
58
|
+
expect(delta).to be < 2
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -5,7 +5,7 @@ describe Chef::Resource::RemoteDirectory do
|
|
5
5
|
include Chef::Mixin::ShellOut
|
6
6
|
|
7
7
|
# Until Cheffish::RSpec has cookbook support, we have to run the whole client
|
8
|
-
let(:chef_dir) { File.join(
|
8
|
+
let(:chef_dir) { File.join(__dir__, "..", "..", "..", "bin") }
|
9
9
|
|
10
10
|
# Invoke `chef-client` as `ruby PATH/TO/chef-client`. This ensures the
|
11
11
|
# following constraints are satisfied:
|
@@ -5,20 +5,20 @@ require "chef/run_lock"
|
|
5
5
|
require "chef/config"
|
6
6
|
require "timeout"
|
7
7
|
require "fileutils"
|
8
|
+
require "chef-utils"
|
8
9
|
require "chef/win32/security" if ChefUtils.windows?
|
9
|
-
require "chef/dist"
|
10
10
|
|
11
|
-
describe
|
11
|
+
describe ChefUtils::Dist::Solo::EXEC do
|
12
12
|
include IntegrationSupport
|
13
13
|
include Chef::Mixin::ShellOut
|
14
14
|
|
15
|
-
let(:chef_dir) { File.join(
|
15
|
+
let(:chef_dir) { File.join(__dir__, "..", "..", "..") }
|
16
16
|
|
17
17
|
let(:cookbook_x_100_metadata_rb) { cb_metadata("x", "1.0.0") }
|
18
18
|
|
19
19
|
let(:cookbook_ancient_100_metadata_rb) { cb_metadata("ancient", "1.0.0") }
|
20
20
|
|
21
|
-
let(:chef_solo) { "bundle exec #{
|
21
|
+
let(:chef_solo) { "bundle exec #{ChefUtils::Dist::Solo::EXEC} --legacy-mode --minimal-ohai" }
|
22
22
|
|
23
23
|
when_the_repository "creates nodes" do
|
24
24
|
let(:nodes_dir) { File.join(@repository_dir, "nodes") }
|
@@ -183,7 +183,7 @@ describe Chef::Dist::SOLOEXEC do
|
|
183
183
|
# run_lock gets stuck we can discover it.
|
184
184
|
expect do
|
185
185
|
Timeout.timeout(120) do
|
186
|
-
chef_dir = File.join(
|
186
|
+
chef_dir = File.join(__dir__, "..", "..", "..")
|
187
187
|
|
188
188
|
threads = []
|
189
189
|
|
data/spec/spec_helper.rb
CHANGED
@@ -141,9 +141,10 @@ RSpec.configure do |config|
|
|
141
141
|
|
142
142
|
config.filter_run_excluding windows_only: true unless windows?
|
143
143
|
config.filter_run_excluding not_supported_on_windows: true if windows?
|
144
|
-
config.filter_run_excluding not_supported_on_macos: true if
|
145
|
-
config.filter_run_excluding macos_only: true unless
|
146
|
-
config.filter_run_excluding
|
144
|
+
config.filter_run_excluding not_supported_on_macos: true if macos?
|
145
|
+
config.filter_run_excluding macos_only: true unless macos?
|
146
|
+
config.filter_run_excluding macos_1013: true unless macos_1013?
|
147
|
+
config.filter_run_excluding macos_gte_1014: true unless macos_gte_1014?
|
147
148
|
config.filter_run_excluding not_supported_on_aix: true if aix?
|
148
149
|
config.filter_run_excluding not_supported_on_solaris: true if solaris?
|
149
150
|
config.filter_run_excluding not_supported_on_gce: true if gce?
|
@@ -242,6 +243,8 @@ RSpec.configure do |config|
|
|
242
243
|
|
243
244
|
Chef::Log.setup!
|
244
245
|
|
246
|
+
Chef::ServerAPIVersions.instance.reset!
|
247
|
+
|
245
248
|
Chef::Config[:log_level] = :fatal
|
246
249
|
Chef::Log.level(Chef::Config[:log_level])
|
247
250
|
|
@@ -21,7 +21,7 @@ require "chef/win32/file" if windows?
|
|
21
21
|
|
22
22
|
describe "Chef::ReservedNames::Win32::File", :windows_only do
|
23
23
|
before(:each) do
|
24
|
-
@path = File.expand_path(File.join(
|
24
|
+
@path = File.expand_path(File.join(__dir__, "..", "..", "data", "old_home_dir", "my-dot-emacs"))
|
25
25
|
end
|
26
26
|
|
27
27
|
it "should not leak significant memory", :volatile do
|
@@ -14,8 +14,8 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
-
CHEF_SPEC_DATA = File.expand_path(
|
18
|
-
CHEF_SPEC_ASSETS = File.expand_path(
|
17
|
+
CHEF_SPEC_DATA = File.expand_path(__dir__ + "/../data/")
|
18
|
+
CHEF_SPEC_ASSETS = File.expand_path(__dir__ + "/../functional/assets/")
|
19
19
|
CHEF_SPEC_BACKUP_PATH = File.join(Dir.tmpdir, "test-backup-path")
|
20
20
|
|
21
21
|
def sha256_checksum(path)
|
@@ -61,10 +61,10 @@ module Matchers
|
|
61
61
|
def profiler
|
62
62
|
@profiler ||= begin
|
63
63
|
if ChefUtils.windows?
|
64
|
-
require File.join(
|
64
|
+
require File.join(__dir__, "..", "platforms", "prof", "win32")
|
65
65
|
RSpec::Prof::Win32::Profiler.new
|
66
66
|
else
|
67
|
-
require File.join(
|
67
|
+
require File.join(__dir__, "..", "prof", "gc")
|
68
68
|
RSpec::Prof::GC::Profiler.new
|
69
69
|
end
|
70
70
|
end
|
@@ -3,7 +3,6 @@ require "chef/mixin/shell_out"
|
|
3
3
|
require "ohai/mixin/http_helper"
|
4
4
|
require "ohai/mixin/gce_metadata"
|
5
5
|
require "chef/mixin/powershell_out"
|
6
|
-
require "chef/version_class"
|
7
6
|
|
8
7
|
class ShellHelpers
|
9
8
|
extend Chef::Mixin::ShellOut
|
@@ -27,11 +26,11 @@ class DependencyProc < Proc
|
|
27
26
|
end
|
28
27
|
|
29
28
|
def ruby_64bit?
|
30
|
-
|
29
|
+
RbConfig::CONFIG["host_cpu"].include?("x86_64")
|
31
30
|
end
|
32
31
|
|
33
32
|
def ruby_32bit?
|
34
|
-
|
33
|
+
RbConfig::CONFIG["host_cpu"].include?("i686")
|
35
34
|
end
|
36
35
|
|
37
36
|
def windows?
|
@@ -58,17 +57,17 @@ end
|
|
58
57
|
def windows_2012r2?
|
59
58
|
return false unless windows?
|
60
59
|
|
61
|
-
(
|
60
|
+
(win32_os_version && win32_os_version.start_with?("6.3"))
|
62
61
|
end
|
63
62
|
|
64
63
|
def windows_gte_10?
|
65
64
|
return false unless windows?
|
66
65
|
|
67
|
-
Gem::Requirement.new(">= 10").satisfied_by?(Gem::Version.new(
|
66
|
+
Gem::Requirement.new(">= 10").satisfied_by?(Gem::Version.new(win32_os_version))
|
68
67
|
end
|
69
68
|
|
70
|
-
def
|
71
|
-
@
|
69
|
+
def win32_os_version
|
70
|
+
@win32_os_version ||= begin
|
72
71
|
wmi = WmiLite::Wmi.new
|
73
72
|
host = wmi.first_of("Win32_OperatingSystem")
|
74
73
|
host["version"]
|
@@ -95,26 +94,12 @@ def windows_user_right?(right)
|
|
95
94
|
Chef::ReservedNames::Win32::Security.get_account_right(ENV["USERNAME"]).include?(right)
|
96
95
|
end
|
97
96
|
|
98
|
-
def
|
99
|
-
|
100
|
-
ver = Chef::Version.new(ohai[:platform_version])
|
101
|
-
return ver.major == 10 && ver.minor == 14
|
102
|
-
end
|
103
|
-
|
104
|
-
false
|
97
|
+
def macos_1013?
|
98
|
+
macos? && Gem::Requirement.new("~> 10.13.0").satisfied_by?(Gem::Version.new(ohai[:platform_version]))
|
105
99
|
end
|
106
100
|
|
107
|
-
def
|
108
|
-
|
109
|
-
result = ShellHelpers.shell_out("/usr/bin/sw_vers")
|
110
|
-
result.stdout.each_line do |line|
|
111
|
-
if /^ProductName:\sMac OS X.*$/.match?(line)
|
112
|
-
return true
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
false
|
101
|
+
def macos_gte_1014?
|
102
|
+
macos? && Gem::Requirement.new(">= 10.14").satisfied_by?(Gem::Version.new(ohai[:platform_version]))
|
118
103
|
end
|
119
104
|
|
120
105
|
# detects if the hardware is 64-bit (evaluates to true in "WOW64" mode in a 32-bit app on a 64-bit system)
|
@@ -127,26 +112,24 @@ def windows32?
|
|
127
112
|
windows? && !windows64?
|
128
113
|
end
|
129
114
|
|
130
|
-
# def jruby?
|
131
|
-
|
132
115
|
def unix?
|
133
116
|
!windows?
|
134
117
|
end
|
135
118
|
|
136
119
|
def linux?
|
137
|
-
RUBY_PLATFORM.
|
120
|
+
RUBY_PLATFORM.include?("linux")
|
138
121
|
end
|
139
122
|
|
140
123
|
def macos?
|
141
|
-
RUBY_PLATFORM.
|
124
|
+
RUBY_PLATFORM.include?("darwin")
|
142
125
|
end
|
143
126
|
|
144
127
|
def solaris?
|
145
|
-
RUBY_PLATFORM.
|
128
|
+
RUBY_PLATFORM.include?("solaris")
|
146
129
|
end
|
147
130
|
|
148
131
|
def freebsd?
|
149
|
-
RUBY_PLATFORM.
|
132
|
+
RUBY_PLATFORM.include?("freebsd")
|
150
133
|
end
|
151
134
|
|
152
135
|
def intel_64bit?
|
@@ -182,7 +165,7 @@ def debian_family?
|
|
182
165
|
end
|
183
166
|
|
184
167
|
def aix?
|
185
|
-
RUBY_PLATFORM.
|
168
|
+
RUBY_PLATFORM.include?("aix")
|
186
169
|
end
|
187
170
|
|
188
171
|
def wpar?
|
@@ -216,8 +199,7 @@ def selinux_enabled?
|
|
216
199
|
end
|
217
200
|
|
218
201
|
def suse?
|
219
|
-
|
220
|
-
( ::File.exist?("/etc/os-release") && /sles|suse/.match?(File.read("/etc/os-release")) )
|
202
|
+
!!(ohai[:platform_family] == "suse")
|
221
203
|
end
|
222
204
|
|
223
205
|
def root?
|
@@ -242,48 +242,100 @@ shared_examples_for "a securable resource with existing target" do
|
|
242
242
|
include_context "use Windows permissions"
|
243
243
|
|
244
244
|
describe "when setting owner" do
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
245
|
+
context "with user name" do
|
246
|
+
before do
|
247
|
+
resource.owner(SID.admin_account_name)
|
248
|
+
resource.run_action(:create)
|
249
|
+
end
|
249
250
|
|
250
|
-
|
251
|
-
|
251
|
+
it "should set the owner" do
|
252
|
+
expect(descriptor.owner).to eq(SID.Administrator)
|
253
|
+
end
|
254
|
+
|
255
|
+
it "is marked as updated only if changes are made" do
|
256
|
+
expect(resource.updated_by_last_action?).to eq(expect_updated?)
|
257
|
+
end
|
252
258
|
end
|
253
259
|
|
254
|
-
|
255
|
-
|
260
|
+
context "with SID" do
|
261
|
+
before do
|
262
|
+
resource.owner(SID.Administrator.to_s)
|
263
|
+
resource.run_action(:create)
|
264
|
+
end
|
265
|
+
|
266
|
+
it "should set the owner" do
|
267
|
+
expect(descriptor.owner).to eq(SID.Administrator)
|
268
|
+
end
|
269
|
+
|
270
|
+
it "is marked as updated only if changes are made" do
|
271
|
+
expect(resource.updated_by_last_action?).to eq(expect_updated?)
|
272
|
+
end
|
256
273
|
end
|
257
274
|
end
|
258
275
|
|
259
276
|
describe "when setting group" do
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
277
|
+
context "with group name" do
|
278
|
+
before do
|
279
|
+
resource.group("Administrators")
|
280
|
+
resource.run_action(:create)
|
281
|
+
end
|
282
|
+
|
283
|
+
it "should set the group" do
|
284
|
+
expect(descriptor.group).to eq(SID.Administrators)
|
285
|
+
end
|
264
286
|
|
265
|
-
|
266
|
-
|
287
|
+
it "is marked as updated only if changes are made" do
|
288
|
+
expect(resource.updated_by_last_action?).to eq(expect_updated?)
|
289
|
+
end
|
267
290
|
end
|
268
291
|
|
269
|
-
|
270
|
-
|
292
|
+
context "with group SID" do
|
293
|
+
before do
|
294
|
+
resource.group(SID.Administrators.to_s)
|
295
|
+
resource.run_action(:create)
|
296
|
+
end
|
297
|
+
|
298
|
+
it "should set the group" do
|
299
|
+
expect(descriptor.group).to eq(SID.Administrators)
|
300
|
+
end
|
301
|
+
|
302
|
+
it "is marked as updated only if changes are made" do
|
303
|
+
expect(resource.updated_by_last_action?).to eq(expect_updated?)
|
304
|
+
end
|
271
305
|
end
|
272
306
|
end
|
273
307
|
|
274
308
|
describe "when setting rights and deny_rights" do
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
309
|
+
context "with user name" do
|
310
|
+
before do
|
311
|
+
resource.deny_rights(:modify, "Guest")
|
312
|
+
resource.rights(:read, "Guest")
|
313
|
+
resource.run_action(:create)
|
314
|
+
end
|
280
315
|
|
281
|
-
|
282
|
-
|
316
|
+
it "should set the rights and deny_rights" do
|
317
|
+
expect(explicit_aces).to eq(denied_acl(SID.Guest, expected_modify_perms) + allowed_acl(SID.Guest, expected_read_perms))
|
318
|
+
end
|
319
|
+
|
320
|
+
it "is marked as updated only if changes are made" do
|
321
|
+
expect(resource.updated_by_last_action?).to eq(expect_updated?)
|
322
|
+
end
|
283
323
|
end
|
284
324
|
|
285
|
-
|
286
|
-
|
325
|
+
context "with SID" do
|
326
|
+
before do
|
327
|
+
resource.deny_rights(:modify, SID.Guest.to_s)
|
328
|
+
resource.rights(:read, SID.Guest.to_s)
|
329
|
+
resource.run_action(:create)
|
330
|
+
end
|
331
|
+
|
332
|
+
it "should set the rights and deny_rights" do
|
333
|
+
expect(explicit_aces).to eq(denied_acl(SID.Guest, expected_modify_perms) + allowed_acl(SID.Guest, expected_read_perms))
|
334
|
+
end
|
335
|
+
|
336
|
+
it "is marked as updated only if changes are made" do
|
337
|
+
expect(resource.updated_by_last_action?).to eq(expect_updated?)
|
338
|
+
end
|
287
339
|
end
|
288
340
|
end
|
289
341
|
end
|
@@ -302,12 +354,18 @@ shared_examples_for "a securable resource without existing target" do
|
|
302
354
|
expect(descriptor.owner).to eq(SID.default_security_object_owner)
|
303
355
|
end
|
304
356
|
|
305
|
-
it "sets owner when owner is specified" do
|
357
|
+
it "sets owner when owner is specified by name" do
|
306
358
|
resource.owner "Guest"
|
307
359
|
resource.run_action(:create)
|
308
360
|
expect(descriptor.owner).to eq(SID.Guest)
|
309
361
|
end
|
310
362
|
|
363
|
+
it "sets owner when owner is specified by SID" do
|
364
|
+
resource.owner SID.Guest.to_s
|
365
|
+
resource.run_action(:create)
|
366
|
+
expect(descriptor.owner).to eq(SID.Guest)
|
367
|
+
end
|
368
|
+
|
311
369
|
it "fails to set owner when owner has invalid characters" do
|
312
370
|
expect { resource.owner 'Lance "The Nose" Glindenberry III' }.to raise_error(Chef::Exceptions::ValidationFailed)
|
313
371
|
end
|
@@ -339,12 +397,18 @@ shared_examples_for "a securable resource without existing target" do
|
|
339
397
|
expect(descriptor.group).to eq(SID.default_security_object_group)
|
340
398
|
end
|
341
399
|
|
342
|
-
it "sets group when group is specified" do
|
400
|
+
it "sets group when group is specified by name" do
|
343
401
|
resource.group "Everyone"
|
344
402
|
resource.run_action(:create)
|
345
403
|
expect(descriptor.group).to eq(SID.Everyone)
|
346
404
|
end
|
347
405
|
|
406
|
+
it "sets group when group is specified by SID" do
|
407
|
+
resource.group SID.Everyone.to_s
|
408
|
+
resource.run_action(:create)
|
409
|
+
expect(descriptor.group).to eq(SID.Everyone)
|
410
|
+
end
|
411
|
+
|
348
412
|
it "fails to set group when group has invalid characters" do
|
349
413
|
expect { resource.group 'Lance "The Nose" Glindenberry III' }.to raise_error(Chef::Exceptions::ValidationFailed)
|
350
414
|
end
|
@@ -406,6 +470,17 @@ shared_examples_for "a securable resource without existing target" do
|
|
406
470
|
allowed_acl(SID.Guest, expected_modify_perms)
|
407
471
|
)
|
408
472
|
end
|
473
|
+
|
474
|
+
it "multiple rights with SID" do
|
475
|
+
resource.rights(:read, SID.Everyone.to_s)
|
476
|
+
resource.rights(:modify, SID.Guest.to_s)
|
477
|
+
resource.run_action(:create)
|
478
|
+
|
479
|
+
expect(explicit_aces).to eq(
|
480
|
+
allowed_acl(SID.Everyone, expected_read_perms) +
|
481
|
+
allowed_acl(SID.Guest, expected_modify_perms)
|
482
|
+
)
|
483
|
+
end
|
409
484
|
end
|
410
485
|
end
|
411
486
|
|
@@ -443,6 +518,12 @@ shared_examples_for "a securable resource without existing target" do
|
|
443
518
|
expect(explicit_aces).to eq(denied_acl(SID.Guest, expected_full_control_perms))
|
444
519
|
end
|
445
520
|
|
521
|
+
it "using SID" do
|
522
|
+
resource.deny_rights(:full_control, SID.Guest.to_s)
|
523
|
+
resource.run_action(:create)
|
524
|
+
expect(explicit_aces).to eq(denied_acl(SID.Guest, expected_full_control_perms))
|
525
|
+
end
|
526
|
+
|
446
527
|
it "deny_rights ahead of rights" do
|
447
528
|
resource.rights(:read, "Everyone")
|
448
529
|
resource.deny_rights(:modify, "Guest")
|