diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2014-11-13 13:26:02 -0800 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2014-11-13 13:26:02 -0800 |
commit | 2bcf0d41075cb6382fe11a10aa3e9dfcb7fd1504 (patch) | |
tree | 5724e976575a4d3a5aaa4449443a3beb2046cc6c | |
parent | 4be0cce9900dbfb37487b05171b7137331664e1b (diff) | |
parent | 93605375aac0d20efdc3bcfcbd6cc12e14ccd79c (diff) | |
download | chef-2bcf0d41075cb6382fe11a10aa3e9dfcb7fd1504.tar.gz |
Merge pull request #2420 from opscode/lcg/openbsd-package
Lcg/openbsd package
-rw-r--r-- | CHANGELOG.md | 3 | ||||
-rw-r--r-- | RELEASE_NOTES.md | 10 | ||||
-rw-r--r-- | lib/chef/platform/provider_mapping.rb | 3 | ||||
-rw-r--r-- | lib/chef/provider/package/openbsd.rb | 107 | ||||
-rw-r--r-- | lib/chef/providers.rb | 1 | ||||
-rw-r--r-- | lib/chef/resource/openbsd_package.rb | 51 | ||||
-rw-r--r-- | lib/chef/resources.rb | 1 | ||||
-rw-r--r-- | spec/unit/provider/package/openbsd_spec.rb | 66 | ||||
-rw-r--r-- | spec/unit/resource/openbsd_package_spec.rb | 49 |
9 files changed, 289 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index a83252f9c7..e85a727c37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,12 @@ Fix rubygems provider to use https instead of http. * [**Anshul Sharma**](https://github.com/justanshulsharma) removed securerandom patch +* [**Scott Bonds**](https://github.com/bonds) + add package support for OpenBSD ### Chef Contributions * Update Chef to use RSpec 3. - ## 12.0.0 * [**Jesse Hu**](https://github.com/jessehu): diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 924f189543..6faeacdde8 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,13 @@ +# Chef Client Release Notes 12.2.0: + +# Internal API Changes in this Release + +# End-User Changes + +## OpenBSD Package provider was added + +The package resource on OpenBSD is wired up to use the new OpenBSD package provider to install via pkg_add on OpenBSD systems. + # Chef Client Release Notes 12.0.0: # Internal API Changes in this Release diff --git a/lib/chef/platform/provider_mapping.rb b/lib/chef/platform/provider_mapping.rb index 382df342f5..271e72f761 100644 --- a/lib/chef/platform/provider_mapping.rb +++ b/lib/chef/platform/provider_mapping.rb @@ -365,7 +365,8 @@ class Chef }, :openbsd => { :default => { - :group => Chef::Provider::Group::Usermod + :group => Chef::Provider::Group::Usermod, + :package => Chef::Provider::Package::Openbsd } }, :hpux => { diff --git a/lib/chef/provider/package/openbsd.rb b/lib/chef/provider/package/openbsd.rb new file mode 100644 index 0000000000..f0931d7555 --- /dev/null +++ b/lib/chef/provider/package/openbsd.rb @@ -0,0 +1,107 @@ +# +# Authors:: Bryan McLellan (btm@loftninjas.org) +# Matthew Landauer (matthew@openaustralia.org) +# Richard Manyanza (liseki@nyikacraftsmen.com) +# Scott Bonds (scott@ggr.com) +# Copyright:: Copyright (c) 2009 Bryan McLellan, Matthew Landauer +# Copyright:: Copyright (c) 2014 Richard Manyanza, Scott Bonds +# 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/resource/package' +require 'chef/provider/package' +require 'chef/mixin/shell_out' +require 'chef/mixin/get_source_from_package' + +class Chef + class Provider + class Package + class Openbsd < Chef::Provider::Package + + provides :package, os: "openbsd" + + include Chef::Mixin::ShellOut + include Chef::Mixin::GetSourceFromPackage + + def initialize(*args) + super + @current_resource = Chef::Resource::Package.new(@new_resource.name) + @new_resource.source(pkg_path) if !@new_resource.source + end + + def load_current_resource + @current_resource.package_name(@new_resource.package_name) + @current_resource.version(installed_version) + @current_resource + end + + def install_package(name, version) + unless @current_resource.version + version_string = '' + version_string += "-#{version}" if version + if parts = name.match(/^(.+?)--(.+)/) # use double-dash for stems with flavors, see man page for pkg_add + name = parts[1] + end + shell_out!("pkg_add -r #{name}#{version_string}", :env => {"PKG_PATH" => @new_resource.source}).status + Chef::Log.debug("#{@new_resource} installed from: #{@new_resource.source}") + end + end + + def remove_package(name, version) + version_string = '' + version_string += "-#{version}" if version + if parts = name.match(/^(.+?)--(.+)/) + name = parts[1] + end + shell_out!("pkg_delete #{name}#{version_string}", :env => nil).status + end + + private + + def installed_version + if parts = @new_resource.package_name.match(/^(.+?)--(.+)/) + name = parts[1] + else + name = @new_resource.package_name + end + pkg_info = shell_out!("pkg_info -e \"#{name}->0\"", :env => nil, :returns => [0,1]) + result = pkg_info.stdout[/^inst:#{Regexp.escape(name)}-(.+?)\s/, 1] + Chef::Log.debug("installed_version of '#{@new_resource.package_name}' is '#{result}'") + result + end + + def candidate_version + @candidate_version ||= begin + version_string = '' + version_string += "-#{version}" if @new_resource.version + pkg_info = shell_out!("pkg_info -I \"#{@new_resource.package_name}#{version_string}\"", :env => nil, :returns => [0,1]) + if parts = @new_resource.package_name.match(/^(.+?)--(.+)/) + result = pkg_info.stdout[/^#{Regexp.escape(parts[1])}-(.+?)\s/, 1] + else + result = pkg_info.stdout[/^#{Regexp.escape(@new_resource.package_name)}-(.+?)\s/, 1] + end + Chef::Log.debug("candidate_version of '#{@new_resource.package_name}' is '#{result}'") + result + end + end + + def pkg_path + ENV['PKG_PATH'] || "http://ftp.OpenBSD.org/pub/#{node.kernel.name}/#{node.kernel.release}/packages/#{node.kernel.machine}/" + end + + end + end + end +end diff --git a/lib/chef/providers.rb b/lib/chef/providers.rb index c4f1ce769d..38c0e6fc9a 100644 --- a/lib/chef/providers.rb +++ b/lib/chef/providers.rb @@ -63,6 +63,7 @@ require 'chef/provider/package/freebsd/pkgng' require 'chef/provider/package/homebrew' require 'chef/provider/package/ips' require 'chef/provider/package/macports' +require 'chef/provider/package/openbsd' require 'chef/provider/package/pacman' require 'chef/provider/package/portage' require 'chef/provider/package/paludis' diff --git a/lib/chef/resource/openbsd_package.rb b/lib/chef/resource/openbsd_package.rb new file mode 100644 index 0000000000..20a2523e3a --- /dev/null +++ b/lib/chef/resource/openbsd_package.rb @@ -0,0 +1,51 @@ +# +# Authors:: AJ Christensen (<aj@opscode.com>) +# Richard Manyanza (<liseki@nyikacraftsmen.com>) +# Scott Bonds (<scott@ggr.com>) +# Copyright:: Copyright (c) 2008 Opscode, Inc. +# Copyright:: Copyright (c) 2014 Richard Manyanza, Scott Bonds +# 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/resource/package' +require 'chef/provider/package/openbsd' +require 'chef/mixin/shell_out' + +class Chef + class Resource + class OpenbsdPackage < Chef::Resource::Package + include Chef::Mixin::ShellOut + + provides :package, os: "openbsd" + + def initialize(name, run_context=nil) + super + @resource_name = :openbsd_package + end + + def after_created + assign_provider + end + + private + + def assign_provider + @provider = Chef::Provider::Package::Openbsd + end + + end + end +end + diff --git a/lib/chef/resources.rb b/lib/chef/resources.rb index 696dbbdc55..680b393741 100644 --- a/lib/chef/resources.rb +++ b/lib/chef/resources.rb @@ -48,6 +48,7 @@ require 'chef/resource/macports_package' require 'chef/resource/mdadm' require 'chef/resource/mount' require 'chef/resource/ohai' +require 'chef/resource/openbsd_package' require 'chef/resource/package' require 'chef/resource/pacman_package' require 'chef/resource/paludis_package' diff --git a/spec/unit/provider/package/openbsd_spec.rb b/spec/unit/provider/package/openbsd_spec.rb new file mode 100644 index 0000000000..ee9c9e89fb --- /dev/null +++ b/spec/unit/provider/package/openbsd_spec.rb @@ -0,0 +1,66 @@ +# +# Author:: Scott Bonds (scott@ggr.com) +# Copyright:: Copyright (c) 2014 Scott Bonds +# 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' +require 'ostruct' + +describe Chef::Provider::Package::Openbsd do + + before(:each) do + @node = Chef::Node.new + @node.default['kernel'] = {'name' => 'OpenBSD', 'release' => '5.5', 'machine' => 'amd64'} + @events = Chef::EventDispatch::Dispatcher.new + @run_context = Chef::RunContext.new(@node, {}, @events) + ENV['PKG_PATH'] = nil + end + + describe "install a package" do + before do + @name = 'ihavetoes' + @new_resource = Chef::Resource::Package.new(@name) + @current_resource = Chef::Resource::Package.new(@name) + @provider = Chef::Provider::Package::Openbsd.new(@new_resource, @run_context) + @provider.current_resource = @current_resource + end + it "should run the installation command" do + expect(@provider).to receive(:shell_out!).with( + "pkg_add -r #{@name}", + {:env => {"PKG_PATH" => "http://ftp.OpenBSD.org/pub/OpenBSD/5.5/packages/amd64/"}} + ) {OpenStruct.new :status => true} + @provider.install_package(@name, nil) + end + end + + describe "delete a package" do + before do + @name = 'ihavetoes' + @new_resource = Chef::Resource::Package.new(@name) + @current_resource = Chef::Resource::Package.new(@name) + @provider = Chef::Provider::Package::Openbsd.new(@new_resource, @run_context) + @provider.current_resource = @current_resource + end + it "should run the command to delete the installed package" do + expect(@provider).to receive(:shell_out!).with( + "pkg_delete #{@name}", :env=>nil + ) {OpenStruct.new :status => true} + @provider.remove_package(@name, nil) + end + end + +end + diff --git a/spec/unit/resource/openbsd_package_spec.rb b/spec/unit/resource/openbsd_package_spec.rb new file mode 100644 index 0000000000..95921c2f02 --- /dev/null +++ b/spec/unit/resource/openbsd_package_spec.rb @@ -0,0 +1,49 @@ +# +# Authors:: AJ Christensen (<aj@opscode.com>) +# Richard Manyanza (<liseki@nyikacraftsmen.com>) +# Scott Bonds (<scott@ggr.com>) +# Copyright:: Copyright (c) 2008 Opscode, Inc. +# Copyright:: Copyright (c) 2014 Richard Manyanza, Scott Bonds +# 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' +require 'ostruct' + +describe Chef::Resource::OpenbsdPackage do + + before(:each) do + @node = Chef::Node.new + @events = Chef::EventDispatch::Dispatcher.new + @run_context = Chef::RunContext.new(@node, {}, @events) + @resource = Chef::Resource::OpenbsdPackage.new("foo", @run_context) + end + + describe "Initialization" do + it "should return a Chef::Resource::OpenbsdPackage" do + expect(@resource).to be_a_kind_of(Chef::Resource::OpenbsdPackage) + end + + it "should set the resource_name to :openbsd_package" do + expect(@resource.resource_name).to eql(:openbsd_package) + end + + it "should not set the provider" do + expect(@resource.provider).to be_nil + end + end + +end + |