summaryrefslogtreecommitdiff
path: root/lib/chef
diff options
context:
space:
mode:
authorc5227532 <eike.waldt@sap.com>2016-09-28 19:49:49 +0200
committerc5227532 <eike.waldt@sap.com>2016-09-28 19:49:49 +0200
commit5320cb1b139defb1a37df0a12e26fe8dad1cc8bf (patch)
tree4f70ebd4403f3613a4d8e7e856eaf529a7e097bb /lib/chef
parent7ed29654c4adf43efbdddd2dccc5afb014c88cca (diff)
downloadchef-5320cb1b139defb1a37df0a12e26fe8dad1cc8bf.tar.gz
implement locking
Diffstat (limited to 'lib/chef')
-rw-r--r--lib/chef/provider/package.rb43
-rw-r--r--lib/chef/provider/package/zypper.rb30
-rw-r--r--lib/chef/resource/package.rb2
3 files changed, 74 insertions, 1 deletions
diff --git a/lib/chef/provider/package.rb b/lib/chef/provider/package.rb
index 3f641145e6..5d2c85bcfe 100644
--- a/lib/chef/provider/package.rb
+++ b/lib/chef/provider/package.rb
@@ -218,6 +218,41 @@ 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
+ Chef::Log.debug("#{new_resource} is already locked")
+ else
+ lock_package(name)
+ Chef::Log.info("#{@new_resource} locked")
+ end
+ end
+ end
+
+ def action_unlock
+ multipackage_api_adapter(@current_resource.package_name, @new_resource.version) do |name, version|
+ if package_locked(name) == false
+ Chef::Log.debug("#{new_resource} is already unlocked")
+ else
+ unlock_package(name)
+ Chef::Log.info("#{@new_resource} unlocked")
+ end
+ end
+ end
+
# @todo use composition rather than inheritance
def multipackage_api_adapter(name, version)
@@ -252,6 +287,14 @@ class Chef
raise( Chef::Exceptions::UnsupportedAction, "#{self} does not support :reconfig" )
end
+ def lock_package(name)
+ raise( Chef::Exceptions::UnsupportedAction, "#{self} does not support :lock" )
+ end
+
+ def unlock_package(name)
+ raise( Chef::Exceptions::UnsupportedAction, "#{self} does not support :unlock" )
+ end
+
# used by subclasses. deprecated. use #a_to_s instead.
def expand_options(options)
options ? " #{options}" : ""
diff --git a/lib/chef/provider/package/zypper.rb b/lib/chef/provider/package/zypper.rb
index e20a7332f7..efe07f52af 100644
--- a/lib/chef/provider/package/zypper.rb
+++ b/lib/chef/provider/package/zypper.rb
@@ -75,6 +75,28 @@ 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)
+ islocked = false
+ locked = shell_out_with_timeout!("zypper locks")
+ locked.stdout.each_line do |line|
+ if line.split('|').shift(2).last.strip == name.first
+ islocked = true
+ end
+ end
+ return islocked
+ end
+
def load_current_resource
@current_resource = Chef::Resource::ZypperPackage.new(new_resource.name)
current_resource.package_name(new_resource.package_name)
@@ -107,6 +129,14 @@ class Chef
zypper_package("remove --clean-deps", name, version)
end
+ def lock_package(name)
+ shell_out_with_timeout!(a_to_s("zypper", "addlock", name))
+ end
+
+ def unlock_package(name)
+ shell_out_with_timeout!(a_to_s("zypper", "removelock", name))
+ end
+
private
def zip(names, versions)
diff --git a/lib/chef/resource/package.rb b/lib/chef/resource/package.rb
index 32339e1a24..0738107339 100644
--- a/lib/chef/resource/package.rb
+++ b/lib/chef/resource/package.rb
@@ -25,7 +25,7 @@ class Chef
resource_name :package
default_action :install
- allowed_actions :install, :upgrade, :remove, :purge, :reconfig
+ allowed_actions :install, :upgrade, :remove, :purge, :reconfig, :lock, :unlock
def initialize(name, *args)
# We capture name here, before it gets coerced to name