diff options
| author | c5227532 <eike.waldt@sap.com> | 2016-09-28 19:49:49 +0200 |
|---|---|---|
| committer | c5227532 <eike.waldt@sap.com> | 2016-09-28 19:49:49 +0200 |
| commit | 5320cb1b139defb1a37df0a12e26fe8dad1cc8bf (patch) | |
| tree | 4f70ebd4403f3613a4d8e7e856eaf529a7e097bb /lib/chef | |
| parent | 7ed29654c4adf43efbdddd2dccc5afb014c88cca (diff) | |
| download | chef-5320cb1b139defb1a37df0a12e26fe8dad1cc8bf.tar.gz | |
implement locking
Diffstat (limited to 'lib/chef')
| -rw-r--r-- | lib/chef/provider/package.rb | 43 | ||||
| -rw-r--r-- | lib/chef/provider/package/zypper.rb | 30 | ||||
| -rw-r--r-- | lib/chef/resource/package.rb | 2 |
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 |
