summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorc5227532 <eike.waldt@sap.com>2016-09-28 21:49:22 +0200
committerc5227532 <eike.waldt@sap.com>2016-09-28 21:49:22 +0200
commitffeea114701237f7d48616fb82b7ca478f71e34d (patch)
tree0b152f8249b71c83eabcf20d6bc78eb5f973d640
parent5320cb1b139defb1a37df0a12e26fe8dad1cc8bf (diff)
downloadchef-ffeea114701237f7d48616fb82b7ca478f71e34d.tar.gz
added (un)lock_package for apt and zypper
-rw-r--r--lib/chef/provider/package.rb25
-rw-r--r--lib/chef/provider/package/apt.rb8
-rw-r--r--lib/chef/provider/package/zypper.rb21
-rw-r--r--spec/unit/provider/package/apt_spec.rb22
-rw-r--r--spec/unit/provider/package/zypper_spec.rb72
-rw-r--r--spec/unit/provider/package_spec.rb45
6 files changed, 124 insertions, 69 deletions
diff --git a/lib/chef/provider/package.rb b/lib/chef/provider/package.rb
index 5d2c85bcfe..0f1adfb3d0 100644
--- a/lib/chef/provider/package.rb
+++ b/lib/chef/provider/package.rb
@@ -218,25 +218,12 @@ class Chef
end
end
- def package_locked?
- if !current_version_array.any?
- # ! any? means it's all nil's, which means nothing is installed
- false
- elsif !new_version_array.any?
- true # remove any version of all packages
- elsif have_any_matching_version?
- true # remove the version we have
- else
- false # we don't have the version we want to remove
- end
- end
-
def action_lock
multipackage_api_adapter(@current_resource.package_name, @new_resource.version) do |name, version|
- if package_locked(name) == true
+ if package_locked(name, version) == true
Chef::Log.debug("#{new_resource} is already locked")
else
- lock_package(name)
+ lock_package(name, version)
Chef::Log.info("#{@new_resource} locked")
end
end
@@ -244,10 +231,10 @@ class Chef
def action_unlock
multipackage_api_adapter(@current_resource.package_name, @new_resource.version) do |name, version|
- if package_locked(name) == false
+ if package_locked(name, version) == false
Chef::Log.debug("#{new_resource} is already unlocked")
else
- unlock_package(name)
+ unlock_package(name, version)
Chef::Log.info("#{@new_resource} unlocked")
end
end
@@ -287,11 +274,11 @@ class Chef
raise( Chef::Exceptions::UnsupportedAction, "#{self} does not support :reconfig" )
end
- def lock_package(name)
+ def lock_package(name, version)
raise( Chef::Exceptions::UnsupportedAction, "#{self} does not support :lock" )
end
- def unlock_package(name)
+ def unlock_package(name, version)
raise( Chef::Exceptions::UnsupportedAction, "#{self} does not support :unlock" )
end
diff --git a/lib/chef/provider/package/apt.rb b/lib/chef/provider/package/apt.rb
index 8af089e14a..13186097f4 100644
--- a/lib/chef/provider/package/apt.rb
+++ b/lib/chef/provider/package/apt.rb
@@ -105,6 +105,14 @@ class Chef
run_noninteractive("dpkg-reconfigure", name)
end
+ def lock_package(name, version)
+ run_noninteractive("apt-mark -q -y", new_resource.options, "hold", name)
+ end
+
+ def unlock_package(name, version)
+ run_noninteractive("apt-mark -q -y", new_resource.options, "unhold", name)
+ end
+
private
# Runs command via shell_out with magic environment to disable
diff --git a/lib/chef/provider/package/zypper.rb b/lib/chef/provider/package/zypper.rb
index efe07f52af..5b5cd0d71c 100644
--- a/lib/chef/provider/package/zypper.rb
+++ b/lib/chef/provider/package/zypper.rb
@@ -75,18 +75,7 @@ class Chef
end
end
-### def package_locked?
-### package_name_array.map do |package_name|
-#### lock = `zypper locks | grep "| #{package_name} "`.split("|").shift(2).last.strip
-### package_name.lock = `zypper locks | grep "| #{package_name} "`
-### if package_name.lock.empty?
-### false
-### else
-### true
-### end
-### end
-### end
- def package_locked(name)
+ def package_locked(name, version)
islocked = false
locked = shell_out_with_timeout!("zypper locks")
locked.stdout.each_line do |line|
@@ -129,12 +118,12 @@ class Chef
zypper_package("remove --clean-deps", name, version)
end
- def lock_package(name)
- shell_out_with_timeout!(a_to_s("zypper", "addlock", name))
+ def lock_package(name, version)
+ zypper_package("addlock", name, version)
end
- def unlock_package(name)
- shell_out_with_timeout!(a_to_s("zypper", "removelock", name))
+ def unlock_package(name, version)
+ zypper_package("removelock", name, version)
end
private
diff --git a/spec/unit/provider/package/apt_spec.rb b/spec/unit/provider/package/apt_spec.rb
index a549ecc72e..9a391c0d88 100644
--- a/spec/unit/provider/package/apt_spec.rb
+++ b/spec/unit/provider/package/apt_spec.rb
@@ -395,6 +395,28 @@ mpg123 1.12.1-0ubuntu1
end
end
+ describe "when locking a package" do
+ it "should run apt-mark hold package" do
+ expect(@provider).to receive(:shell_out!).with(
+ "apt-mark -q -y hold irssi",
+ :env => { "DEBIAN_FRONTEND" => "noninteractive" },
+ :timeout => @timeout
+ )
+ @provider.lock_package("irssi", "0.8.12-7")
+ end
+ end
+
+ describe "when unlocking a package" do
+ it "should run apt-mark unhold package" do
+ expect(@provider).to receive(:shell_out!).with(
+ "apt-mark -q -y unhold irssi",
+ :env => { "DEBIAN_FRONTEND" => "noninteractive" },
+ :timeout => @timeout
+ )
+ @provider.unlock_package("irssi", "0.8.12-7")
+ end
+ end
+
describe "when installing a virtual package" do
it "should install the package without specifying a version" do
@provider.package_data["libmysqlclient15-dev"][:virtual] = true
diff --git a/spec/unit/provider/package/zypper_spec.rb b/spec/unit/provider/package/zypper_spec.rb
index c64b113649..e18b35bd40 100644
--- a/spec/unit/provider/package/zypper_spec.rb
+++ b/spec/unit/provider/package/zypper_spec.rb
@@ -231,21 +231,85 @@ describe Chef::Provider::Package::Zypper do
end
end
+### describe "lock_package" do
+### it "should run zypper addlock with the package name" do
+### shell_out_expectation!(
+### "zypper addlock emacs"
+### )
+### provider.lock_package(["emacs"], [nil])
+### end
+### end
+###
+### describe "unlock_package" do
+### it "should run zypper removelock with the package name" do
+### shell_out_expectation!(
+### "zypper removelock emacs"
+### )
+### provider.unlock_package(["emacs"], [nil])
+### end
+### end
+
describe "lock_package" do
it "should run zypper addlock with the package name" do
+ allow(Chef::Config).to receive(:[]).with(:zypper_check_gpg).and_return(true)
+ shell_out_expectation!(
+ "zypper --non-interactive addlock emacs"
+ )
+ provider.lock_package(["emacs"], [nil])
+ end
+ it "should run zypper addlock without gpg checks" do
+ allow(Chef::Config).to receive(:[]).with(:zypper_check_gpg).and_return(false)
+ shell_out_expectation!(
+ "zypper --non-interactive --no-gpg-checks addlock emacs"
+ )
+ provider.lock_package(["emacs"], [nil])
+ end
+ it "should warn about gpg checks on zypper addlock" do
+ expect(Chef::Log).to receive(:warn).with(
+ /All packages will be installed without gpg signature checks/
+ )
+ shell_out_expectation!(
+ "zypper --non-interactive --no-gpg-checks addlock emacs"
+ )
+ provider.lock_package(["emacs"], [nil])
+ end
+ it "should run zypper addlock without gpg checks" do
shell_out_expectation!(
- "zypper addlock emacs"
+ "zypper --non-interactive --no-gpg-checks addlock emacs"
)
- provider.lock_package(["emacs"])
+ provider.lock_package(["emacs"], [nil])
end
end
describe "unlock_package" do
it "should run zypper removelock with the package name" do
+ allow(Chef::Config).to receive(:[]).with(:zypper_check_gpg).and_return(true)
+ shell_out_expectation!(
+ "zypper --non-interactive removelock emacs"
+ )
+ provider.unlock_package(["emacs"], [nil])
+ end
+ it "should run zypper removelock without gpg checks" do
+ allow(Chef::Config).to receive(:[]).with(:zypper_check_gpg).and_return(false)
+ shell_out_expectation!(
+ "zypper --non-interactive --no-gpg-checks removelock emacs"
+ )
+ provider.unlock_package(["emacs"], [nil])
+ end
+ it "should warn about gpg checks on zypper removelock" do
+ expect(Chef::Log).to receive(:warn).with(
+ /All packages will be installed without gpg signature checks/
+ )
+ shell_out_expectation!(
+ "zypper --non-interactive --no-gpg-checks removelock emacs"
+ )
+ provider.unlock_package(["emacs"], [nil])
+ end
+ it "should run zypper removelock without gpg checks" do
shell_out_expectation!(
- "zypper removelock emacs"
+ "zypper --non-interactive --no-gpg-checks removelock emacs"
)
- provider.unlock_package(["emacs"])
+ provider.unlock_package(["emacs"], [nil])
end
end
diff --git a/spec/unit/provider/package_spec.rb b/spec/unit/provider/package_spec.rb
index 082fc00ba5..3e509ec5ac 100644
--- a/spec/unit/provider/package_spec.rb
+++ b/spec/unit/provider/package_spec.rb
@@ -321,34 +321,19 @@ describe Chef::Provider::Package do
end
end
- describe "When locking the package" do
- before(:each) do
- allow(provider).to receive(:lock_package).and_return(true)
- end
-
- it "should lock the package if it is unlocked" do
- expect(provider).to be_locking_package
- expect(provider).to receive(:lock_package).with("emacs")
- provider.run_action(:lock)
- expect(new_resource).to be_updated
- expect(new_resource).to be_updated_by_last_action
- end
-
- it "should not purge the package if it is not installed" do
- current_resource.instance_variable_set(:@version, nil)
- expect(provider).not_to be_locking_package
-
- expect(provider).not_to receive(:lock_package)
- provider.run_action(:lock)
- expect(new_resource).not_to be_updated_by_last_action
- end
-
- it "should set the resource to updated if it purges the package" do
- provider.run_action(:lock)
- expect(new_resource).to be_updated
- end
-
- end
+### describe "When locking the package" do
+### before(:each) do
+### allow(provider).to receive(:lock_package).and_return(true)
+### end
+###
+### it "should lock the package if it is already locked" do
+### expect(provider).to be_locking_package
+### expect(provider).to receive(:lock_package).with("emacs", nil)
+### provider.run_action(:lock)
+### expect(new_resource).to be_updated
+### expect(new_resource).to be_updated_by_last_action
+### end
+### end
describe "when running commands to be implemented by subclasses" do
it "should raises UnsupportedAction for install" do
@@ -377,11 +362,11 @@ describe Chef::Provider::Package do
end
it "should raise UnsupportedAction for lock" do
- expect { provider.lock_package("emacs") }.to raise_error(Chef::Exceptions::UnsupportedAction)
+ expect { provider.lock_package("emacs", nil) }.to raise_error(Chef::Exceptions::UnsupportedAction)
end
it "should raise UnsupportedAction for unlock" do
- expect { provider.unlock_package("emacs") }.to raise_error(Chef::Exceptions::UnsupportedAction)
+ expect { provider.unlock_package("emacs", nil) }.to raise_error(Chef::Exceptions::UnsupportedAction)
end
end