diff options
author | harikesh-kolekar <harikesh.kolekar@msystechnologies.com> | 2018-01-29 12:55:28 +0000 |
---|---|---|
committer | harikesh-kolekar <harikesh.kolekar@msystechnologies.com> | 2018-01-30 07:41:03 +0000 |
commit | 85ad3ee585ab50d173c083325d106967d2161dab (patch) | |
tree | ab53f9baee15101758272642479ac51b2031d5cd | |
parent | 4b8580ceb864961f77c87e5013eb1bf36463b895 (diff) | |
download | chef-85ad3ee585ab50d173c083325d106967d2161dab.tar.gz |
rename env resource to windows_env
Signed-off-by: harikesh-kolekar <harikesh.kolekar@msystechnologies.com>
-rw-r--r-- | lib/chef/exceptions.rb | 2 | ||||
-rw-r--r-- | lib/chef/provider/env/windows.rb | 80 | ||||
-rw-r--r-- | lib/chef/provider/windows_env.rb (renamed from lib/chef/provider/env.rb) | 55 | ||||
-rw-r--r-- | lib/chef/providers.rb | 5 | ||||
-rw-r--r-- | lib/chef/resource/windows_env.rb (renamed from lib/chef/resource/env.rb) | 5 | ||||
-rw-r--r-- | lib/chef/resources.rb | 3 | ||||
-rw-r--r--[-rwxr-xr-x] | spec/functional/resource/windows_env_spec.rb (renamed from spec/functional/resource/env_spec.rb) | 14 | ||||
-rw-r--r-- | spec/unit/exceptions_spec.rb | 2 | ||||
-rw-r--r-- | spec/unit/provider/env/windows_spec.rb | 103 | ||||
-rw-r--r-- | spec/unit/provider/windows_env_spec.rb (renamed from spec/unit/provider/env_spec.rb) | 93 | ||||
-rw-r--r-- | spec/unit/provider_resolver_spec.rb | 2 | ||||
-rw-r--r-- | spec/unit/resource/windows_env_spec.rb (renamed from spec/unit/resource/env_spec.rb) | 16 |
12 files changed, 161 insertions, 219 deletions
diff --git a/lib/chef/exceptions.rb b/lib/chef/exceptions.rb index 5b470f574e..1ed71d2a55 100644 --- a/lib/chef/exceptions.rb +++ b/lib/chef/exceptions.rb @@ -45,7 +45,7 @@ class Chef class SigInt < RuntimeError; end class SigTerm < RuntimeError; end class Cron < RuntimeError; end - class Env < RuntimeError; end + class WindowsEnv < RuntimeError; end class Exec < RuntimeError; end class Execute < RuntimeError; end class ErlCall < RuntimeError; end diff --git a/lib/chef/provider/env/windows.rb b/lib/chef/provider/env/windows.rb deleted file mode 100644 index c74911e40f..0000000000 --- a/lib/chef/provider/env/windows.rb +++ /dev/null @@ -1,80 +0,0 @@ -# -# Author:: Doug MacEachern (<dougm@vmware.com>) -# Copyright:: Copyright 2010-2016, VMware, Inc. -# License:: Apache License, Version 2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -require "chef/mixin/windows_env_helper" - -class Chef - class Provider - class Env - class Windows < Chef::Provider::Env - include Chef::Mixin::WindowsEnvHelper - - provides :env, os: "windows" - - def whyrun_supported? - false - end - - def create_env - obj = env_obj(@new_resource.key_name) - unless obj - obj = WIN32OLE.connect("winmgmts://").get("Win32_Environment").spawninstance_ - obj.name = @new_resource.key_name - obj.username = new_resource.user - end - obj.variablevalue = @new_resource.value - obj.put_ - value = @new_resource.value - value = expand_path(value) if @new_resource.key_name.casecmp("PATH") == 0 - ENV[@new_resource.key_name] = value - broadcast_env_change - end - - def delete_env - obj = env_obj(@new_resource.key_name) - if obj - obj.delete_ - broadcast_env_change - end - if ENV[@new_resource.key_name] - ENV.delete(@new_resource.key_name) - end - end - - def env_value(key_name) - obj = env_obj(key_name) - obj.variablevalue if obj - end - - def env_obj(key_name) - return @env_obj if @env_obj - wmi = WmiLite::Wmi.new - # Note that by design this query is case insensitive with regard to key_name - environment_variables = wmi.query("select * from Win32_Environment where name = '#{key_name}'") - if environment_variables && environment_variables.length > 0 - environment_variables.each do |env| - @env_obj = env.wmi_ole_object - return @env_obj if @env_obj.username.split('\\').last.casecmp(new_resource.user) == 0 - end - end - @env_obj = nil - end - end - end - end -end diff --git a/lib/chef/provider/env.rb b/lib/chef/provider/windows_env.rb index b8b9d99846..4cbcc8a478 100644 --- a/lib/chef/provider/env.rb +++ b/lib/chef/provider/windows_env.rb @@ -17,14 +17,16 @@ # require "chef/provider" -require "chef/resource/env" +require "chef/resource/windows_env" +require "chef/mixin/windows_env_helper" class Chef class Provider - class Env < Chef::Provider + class WindowsEnv < Chef::Provider + include Chef::Mixin::WindowsEnvHelper attr_accessor :key_exists - provides :env, os: "!windows" + provides :windows_env, os: "windows" def whyrun_supported? false @@ -36,7 +38,7 @@ class Chef end def load_current_resource - @current_resource = Chef::Resource::Env.new(new_resource.name) + @current_resource = Chef::Resource::WindowsEnv.new(new_resource.name) current_resource.key_name(new_resource.key_name) if env_key_exists(new_resource.key_name) @@ -50,7 +52,7 @@ class Chef end def env_value(key_name) - raise Chef::Exceptions::Env, "#{self} provider does not implement env_value!" + raise Chef::Exceptions::WindowsEnv, "#{self} provider does not implement env_value!" end def env_key_exists(key_name) @@ -138,16 +140,34 @@ class Chef new_resource.updated_by_last_action(true) end else - raise Chef::Exceptions::Env, "Cannot modify #{new_resource} - key does not exist!" + raise Chef::Exceptions::WindowsEnv, "Cannot modify #{new_resource} - key does not exist!" end end def create_env - raise Chef::Exceptions::UnsupportedAction, "#{self} does not support :#{new_resource.action}" + obj = env_obj(@new_resource.key_name) + unless obj + obj = WIN32OLE.connect("winmgmts://").get("Win32_Environment").spawninstance_ + obj.name = @new_resource.key_name + obj.username = new_resource.user + end + obj.variablevalue = @new_resource.value + obj.put_ + value = @new_resource.value + value = expand_path(value) if @new_resource.key_name.casecmp("PATH") == 0 + ENV[@new_resource.key_name] = value + broadcast_env_change end def delete_env - raise Chef::Exceptions::UnsupportedAction, "#{self} does not support :delete" + obj = env_obj(@new_resource.key_name) + if obj + obj.delete_ + broadcast_env_change + end + if ENV[@new_resource.key_name] + ENV.delete(@new_resource.key_name) + end end def modify_env @@ -166,6 +186,25 @@ class Chef def new_values @new_values ||= new_resource.value.split(new_resource.delim) end + + def env_value(key_name) + obj = env_obj(key_name) + obj.variablevalue if obj + end + + def env_obj(key_name) + return @env_obj if @env_obj + wmi = WmiLite::Wmi.new + # Note that by design this query is case insensitive with regard to key_name + environment_variables = wmi.query("select * from Win32_Environment where name = '#{key_name}'") + if environment_variables && environment_variables.length > 0 + environment_variables.each do |env| + @env_obj = env.wmi_ole_object + return @env_obj if @env_obj.username.split('\\').last.casecmp(new_resource.user) == 0 + end + end + @env_obj = nil + end end end end diff --git a/lib/chef/providers.rb b/lib/chef/providers.rb index 507203fd28..582f055260 100644 --- a/lib/chef/providers.rb +++ b/lib/chef/providers.rb @@ -27,7 +27,8 @@ require "chef/provider/cron/aix" require "chef/provider/directory" require "chef/provider/dsc_script" require "chef/provider/dsc_resource" -require "chef/provider/env" +require "chef/provider/windows_env" +require "chef/provider/erl_call" require "chef/provider/execute" require "chef/provider/file" require "chef/provider/git" @@ -61,8 +62,6 @@ require "chef/provider/windows_task" require "chef/provider/zypper_repository" require "chef/provider/windows_path" -require "chef/provider/env/windows" - require "chef/provider/package/apt" require "chef/provider/package/chocolatey" require "chef/provider/package/dpkg" diff --git a/lib/chef/resource/env.rb b/lib/chef/resource/windows_env.rb index 4f2919c3b2..d25fe9326b 100644 --- a/lib/chef/resource/env.rb +++ b/lib/chef/resource/windows_env.rb @@ -21,8 +21,9 @@ class Chef class Resource # Use the env resource to manage environment keys in Microsoft Windows. After an environment key is set, Microsoft # Windows must be restarted before the environment key will be available to the Task Scheduler. - class Env < Chef::Resource - resource_name :env + class WindowsEnv < Chef::Resource + resource_name :windows_env + provides :windows_env, os: "windows" provides :env, os: "windows" default_action :create diff --git a/lib/chef/resources.rb b/lib/chef/resources.rb index 9fee978432..b250d8d4d5 100644 --- a/lib/chef/resources.rb +++ b/lib/chef/resources.rb @@ -33,7 +33,7 @@ require "chef/resource/dpkg_package" require "chef/resource/dnf_package" require "chef/resource/dsc_script" require "chef/resource/dsc_resource" -require "chef/resource/env" +require "chef/resource/erl_call" require "chef/resource/execute" require "chef/resource/file" require "chef/resource/freebsd_package" @@ -89,6 +89,7 @@ require "chef/resource/user/pw_user" require "chef/resource/user/solaris_user" require "chef/resource/user/windows_user" require "chef/resource/whyrun_safe_ruby_block" +require "chef/resource/windows_env" require "chef/resource/windows_package" require "chef/resource/yum_package" require "chef/resource/yum_repository" diff --git a/spec/functional/resource/env_spec.rb b/spec/functional/resource/windows_env_spec.rb index 4c96b33081..a6c6b39970 100755..100644 --- a/spec/functional/resource/env_spec.rb +++ b/spec/functional/resource/windows_env_spec.rb @@ -18,7 +18,7 @@ require "spec_helper" -describe Chef::Resource::Env, :windows_only do +describe Chef::Resource::WindowsEnv, :windows_only do context "when running on Windows" do let(:chef_env_test_lower_case) { "chefenvtest" } let(:chef_env_test_mixed_case) { "chefENVtest" } @@ -54,18 +54,18 @@ describe Chef::Resource::Env, :windows_only do Chef::RunContext.new(node, {}, empty_events) end let(:test_resource) do - Chef::Resource::Env.new("unknown", test_run_context) + Chef::Resource::WindowsEnv.new("unknown", test_run_context) end before(:each) do - resource_lower = Chef::Resource::Env.new(chef_env_test_lower_case, test_run_context) + resource_lower = Chef::Resource::WindowsEnv.new(chef_env_test_lower_case, test_run_context) resource_lower.run_action(:delete) - resource_lower = Chef::Resource::Env.new(chef_env_test_lower_case, test_run_context) + resource_lower = Chef::Resource::WindowsEnv.new(chef_env_test_lower_case, test_run_context) resource_lower.user(env_user) resource_lower.run_action(:delete) - resource_mixed = Chef::Resource::Env.new(chef_env_test_mixed_case, test_run_context) + resource_mixed = Chef::Resource::WindowsEnv.new(chef_env_test_mixed_case, test_run_context) resource_mixed.run_action(:delete) - resource_mixed = Chef::Resource::Env.new(chef_env_test_mixed_case, test_run_context) + resource_mixed = Chef::Resource::WindowsEnv.new(chef_env_test_mixed_case, test_run_context) resource_lower.user(env_user) resource_mixed.run_action(:delete) end @@ -142,7 +142,7 @@ describe Chef::Resource::Env, :windows_only do expect(ENV[chef_env_test_lower_case]).to eq(nil) test_resource.key_name(chef_env_test_lower_case) test_resource.value(env_value1) - expect { test_resource.run_action(:modify) }.to raise_error(Chef::Exceptions::Env) + expect { test_resource.run_action(:modify) }.to raise_error(Chef::Exceptions::WindowsEnv) end context "when env variable exist with same name" do diff --git a/spec/unit/exceptions_spec.rb b/spec/unit/exceptions_spec.rb index e952a5448a..c892b24f28 100644 --- a/spec/unit/exceptions_spec.rb +++ b/spec/unit/exceptions_spec.rb @@ -25,7 +25,7 @@ describe Chef::Exceptions do exception_to_super_class = { Chef::Exceptions::Application => RuntimeError, Chef::Exceptions::Cron => RuntimeError, - Chef::Exceptions::Env => RuntimeError, + Chef::Exceptions::WindowsEnv => RuntimeError, Chef::Exceptions::Exec => RuntimeError, Chef::Exceptions::FileNotFound => RuntimeError, Chef::Exceptions::Package => RuntimeError, diff --git a/spec/unit/provider/env/windows_spec.rb b/spec/unit/provider/env/windows_spec.rb deleted file mode 100644 index 5ddc1d6f91..0000000000 --- a/spec/unit/provider/env/windows_spec.rb +++ /dev/null @@ -1,103 +0,0 @@ -# -# Author:: Sander van Harmelen <svanharmelen@schubergphilis.com> -# Copyright:: Copyright 2014-2016, Chef Software, Inc. -# License:: Apache License, Version 2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -require "spec_helper" - -describe Chef::Provider::Env::Windows, :windows_only do - let(:node) { Chef::Node.new } - let(:events) { Chef::EventDispatch::Dispatcher.new } - let(:run_context) { Chef::RunContext.new(node, {}, events) } - - context "when environment variable is not PATH" do - let(:new_resource) do - new_resource = Chef::Resource::Env.new("CHEF_WINDOWS_ENV_TEST") - new_resource.value("foo") - new_resource - end - let(:provider) do - provider = Chef::Provider::Env::Windows.new(new_resource, run_context) - allow(provider).to receive(:env_obj).and_return(double("null object").as_null_object) - provider - end - - describe "action_create" do - before do - ENV.delete("CHEF_WINDOWS_ENV_TEST") - provider.key_exists = false - end - - it "should update the ruby ENV object when it creates the key" do - provider.action_create - expect(ENV["CHEF_WINDOWS_ENV_TEST"]).to eql("foo") - end - end - - describe "action_modify" do - before do - ENV["CHEF_WINDOWS_ENV_TEST"] = "foo" - end - - it "should update the ruby ENV object when it updates the value" do - expect(provider).to receive(:requires_modify_or_create?).and_return(true) - new_resource.value("foobar") - provider.action_modify - expect(ENV["CHEF_WINDOWS_ENV_TEST"]).to eql("foobar") - end - - describe "action_delete" do - before do - ENV["CHEF_WINDOWS_ENV_TEST"] = "foo" - end - - it "should update the ruby ENV object when it deletes the key" do - provider.action_delete - expect(ENV["CHEF_WINDOWS_ENV_TEST"]).to eql(nil) - end - end - end - end - - context "when environment is PATH" do - describe "for PATH" do - let(:system_root) { "%SystemRoot%" } - let(:system_root_value) { 'D:\Windows' } - let(:new_resource) do - new_resource = Chef::Resource::Env.new("PATH") - new_resource.value(system_root) - new_resource - end - let(:provider) do - provider = Chef::Provider::Env::Windows.new(new_resource, run_context) - allow(provider).to receive(:env_obj).and_return(double("null object").as_null_object) - provider - end - - before do - stub_const("ENV", { "PATH" => "" }) - end - - it "replaces Windows system variables" do - expect(provider).to receive(:requires_modify_or_create?).and_return(true) - expect(provider).to receive(:expand_path).with(system_root).and_return(system_root_value) - provider.action_modify - expect(ENV["PATH"]).to eql(system_root_value) - end - end - - end -end diff --git a/spec/unit/provider/env_spec.rb b/spec/unit/provider/windows_env_spec.rb index a213c06fe4..47a06d1d06 100644 --- a/spec/unit/provider/env_spec.rb +++ b/spec/unit/provider/windows_env_spec.rb @@ -18,16 +18,16 @@ require "spec_helper" -describe Chef::Provider::Env do +describe Chef::Provider::WindowsEnv do before do @node = Chef::Node.new @events = Chef::EventDispatch::Dispatcher.new @run_context = Chef::RunContext.new(@node, {}, @events) - @new_resource = Chef::Resource::Env.new("FOO") + @new_resource = Chef::Resource::WindowsEnv.new("FOO") @new_resource.value("bar") @new_resource.user("<System>") - @provider = Chef::Provider::Env.new(@new_resource, @run_context) + @provider = Chef::Provider::WindowsEnv.new(@new_resource, @run_context) end it "assumes the key_name exists by default" do @@ -71,7 +71,7 @@ describe Chef::Provider::Env do end it "should return the current resource" do - expect(@provider.load_current_resource).to be_a_kind_of(Chef::Resource::Env) + expect(@provider.load_current_resource).to be_a_kind_of(Chef::Resource::WindowsEnv) end end @@ -177,15 +177,15 @@ describe Chef::Provider::Env do @provider.action_modify end - it "should raise a Chef::Exceptions::Env if the key doesn't exist" do + it "should raise a Chef::Exceptions::WindowsEnv if the key doesn't exist" do @provider.key_exists = false - expect { @provider.action_modify }.to raise_error(Chef::Exceptions::Env) + expect { @provider.action_modify }.to raise_error(Chef::Exceptions::WindowsEnv) end end describe "delete_element" do before(:each) do - @current_resource = Chef::Resource::Env.new("FOO") + @current_resource = Chef::Resource::WindowsEnv.new("FOO") @new_resource.delim ";" @new_resource.value "C:/bar/bin" @@ -293,7 +293,7 @@ describe Chef::Provider::Env do allow(@provider).to receive(:create_env).and_return(true) @new_resource.delim ";" - @current_resource = Chef::Resource::Env.new("FOO") + @current_resource = Chef::Resource::WindowsEnv.new("FOO") @current_resource.value "C:/foo/bin" @provider.current_resource = @current_resource end @@ -320,4 +320,81 @@ describe Chef::Provider::Env do expect(@new_resource.value).to eq("C:/foo;C:/bar;C:/baz;C:/foo/bar") end end + + context "when environment variable is not PATH" do + let(:new_resource) do + new_resource = Chef::Resource::WindowsEnv.new("CHEF_WINDOWS_ENV_TEST") + new_resource.value("foo") + new_resource + end + let(:provider) do + provider = Chef::Provider::WindowsEnv::Windows.new(new_resource, run_context) + allow(provider).to receive(:env_obj).and_return(double("null object").as_null_object) + provider + end + + describe "action_create" do + before do + ENV.delete("CHEF_WINDOWS_ENV_TEST") + provider.key_exists = false + end + + it "should update the ruby ENV object when it creates the key" do + provider.action_create + expect(ENV["CHEF_WINDOWS_ENV_TEST"]).to eql("foo") + end + end + + describe "action_modify" do + before do + ENV["CHEF_WINDOWS_ENV_TEST"] = "foo" + end + + it "should update the ruby ENV object when it updates the value" do + expect(provider).to receive(:requires_modify_or_create?).and_return(true) + new_resource.value("foobar") + provider.action_modify + expect(ENV["CHEF_WINDOWS_ENV_TEST"]).to eql("foobar") + end + + describe "action_delete" do + before do + ENV["CHEF_WINDOWS_ENV_TEST"] = "foo" + end + + it "should update the ruby ENV object when it deletes the key" do + provider.action_delete + expect(ENV["CHEF_WINDOWS_ENV_TEST"]).to eql(nil) + end + end + end + end + + context "when environment is PATH" do + describe "for PATH" do + let(:system_root) { "%SystemRoot%" } + let(:system_root_value) { 'D:\Windows' } + let(:new_resource) do + new_resource = Chef::Resource::WindowsEnv.new("PATH") + new_resource.value(system_root) + new_resource + end + let(:provider) do + provider = Chef::Provider::WindowsEnv::Windows.new(new_resource, run_context) + allow(provider).to receive(:env_obj).and_return(double("null object").as_null_object) + provider + end + + before do + stub_const("ENV", { "PATH" => "" }) + end + + it "replaces Windows system variables" do + expect(provider).to receive(:requires_modify_or_create?).and_return(true) + expect(provider).to receive(:expand_path).with(system_root).and_return(system_root_value) + provider.action_modify + expect(ENV["PATH"]).to eql(system_root_value) + end + end + end end diff --git a/spec/unit/provider_resolver_spec.rb b/spec/unit/provider_resolver_spec.rb index a331093055..9470bca929 100644 --- a/spec/unit/provider_resolver_spec.rb +++ b/spec/unit/provider_resolver_spec.rb @@ -762,7 +762,7 @@ describe Chef::ProviderResolver do "windows" => { batch: [ Chef::Resource::Batch, Chef::Provider::Batch ], dsc_script: [ Chef::Resource::DscScript, Chef::Provider::DscScript ], - env: [ Chef::Resource::Env, Chef::Provider::Env::Windows ], + windows_env: [ Chef::Resource::WindowsEnv, Chef::Provider::WindowsEnv::Windows ], group: [ Chef::Resource::Group, Chef::Provider::Group::Windows ], mount: [ Chef::Resource::Mount, Chef::Provider::Mount::Windows ], package: [ Chef::Resource::WindowsPackage, Chef::Provider::Package::Windows ], diff --git a/spec/unit/resource/env_spec.rb b/spec/unit/resource/windows_env_spec.rb index 61c40e33e8..b1052f045a 100644 --- a/spec/unit/resource/env_spec.rb +++ b/spec/unit/resource/windows_env_spec.rb @@ -19,11 +19,19 @@ require "spec_helper" -describe Chef::Resource::Env do - let(:resource) { Chef::Resource::Env.new("FOO") } +describe Chef::Resource::WindowsEnv do - it "has a name property" do - expect(resource.name).to eql("FOO") + before(:each) do + @resource = Chef::Resource::WindowsEnv.new("FOO") + end + + it "creates a new Chef::Resource::WindowsEnv" do + expect(@resource).to be_a_kind_of(Chef::Resource) + expect(@resource).to be_a_kind_of(Chef::Resource::WindowsEnv) + end + + it "has a name" do + expect(@resource.name).to eql("FOO") end it "has a default action of 'create'" do |