diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2020-02-25 13:38:36 -0800 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2020-02-25 14:45:27 -0800 |
commit | aa30467a340c7d195fd92d64834e1f4defeb3b3a (patch) | |
tree | 1c438b067fe1969192b6f18fd834eeb4484547bc | |
parent | 372ce32577b49a499638a58d4f38ffbaab7640aa (diff) | |
download | chef-aa30467a340c7d195fd92d64834e1f4defeb3b3a.tar.gz |
unified_mode and custom resource for mdadm
Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
-rw-r--r-- | lib/chef/provider/mdadm.rb | 85 | ||||
-rw-r--r-- | lib/chef/providers.rb | 3 | ||||
-rw-r--r-- | lib/chef/resource/mdadm.rb | 60 | ||||
-rw-r--r-- | spec/unit/provider/mdadm_spec.rb | 6 | ||||
-rw-r--r-- | spec/unit/provider_resolver_spec.rb | 4 |
5 files changed, 66 insertions, 92 deletions
diff --git a/lib/chef/provider/mdadm.rb b/lib/chef/provider/mdadm.rb deleted file mode 100644 index c5df1d0724..0000000000 --- a/lib/chef/provider/mdadm.rb +++ /dev/null @@ -1,85 +0,0 @@ -# -# Author:: Joe Williams (<joe@joetify.com>) -# Copyright:: Copyright 2009-2016, Joe Williams -# 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_relative "../log" -require_relative "../provider" - -class Chef - class Provider - class Mdadm < Chef::Provider - - provides :mdadm - - def load_current_resource - @current_resource = Chef::Resource::Mdadm.new(new_resource.name) - current_resource.raid_device(new_resource.raid_device) - logger.trace("#{new_resource} checking for software raid device #{current_resource.raid_device}") - - device_not_found = 4 - mdadm = shell_out!("mdadm", "--detail", "--test", new_resource.raid_device, returns: [0, device_not_found]) - exists = (mdadm.status == 0) - current_resource.exists(exists) - end - - def action_create - unless current_resource.exists - converge_by("create RAID device #{new_resource.raid_device}") do - command = "yes | mdadm --create #{new_resource.raid_device} --level #{new_resource.level}" - command << " --chunk=#{new_resource.chunk}" unless new_resource.level == 1 - command << " --metadata=#{new_resource.metadata}" - command << " --bitmap=#{new_resource.bitmap}" if new_resource.bitmap - command << " --layout=#{new_resource.layout}" if new_resource.layout - command << " --raid-devices #{new_resource.devices.length} #{new_resource.devices.join(" ")}" - logger.trace("#{new_resource} mdadm command: #{command}") - shell_out!(command) - logger.info("#{new_resource} created raid device (#{new_resource.raid_device})") - end - else - logger.trace("#{new_resource} raid device already exists, skipping create (#{new_resource.raid_device})") - end - end - - def action_assemble - unless current_resource.exists - converge_by("assemble RAID device #{new_resource.raid_device}") do - command = "yes | mdadm --assemble #{new_resource.raid_device} #{new_resource.devices.join(" ")}" - logger.trace("#{new_resource} mdadm command: #{command}") - shell_out!(command) - logger.info("#{new_resource} assembled raid device (#{new_resource.raid_device})") - end - else - logger.trace("#{new_resource} raid device already exists, skipping assemble (#{new_resource.raid_device})") - end - end - - def action_stop - if current_resource.exists - converge_by("stop RAID device #{new_resource.raid_device}") do - command = "yes | mdadm --stop #{new_resource.raid_device}" - logger.trace("#{new_resource} mdadm command: #{command}") - shell_out!(command) - logger.info("#{new_resource} stopped raid device (#{new_resource.raid_device})") - end - else - logger.trace("#{new_resource} raid device doesn't exist (#{new_resource.raid_device}) - not stopping") - end - end - - end - end -end diff --git a/lib/chef/providers.rb b/lib/chef/providers.rb index 5022ef7327..aa482e9705 100644 --- a/lib/chef/providers.rb +++ b/lib/chef/providers.rb @@ -1,6 +1,6 @@ # # Author:: Daniel DeLeo (<dan@chef.io>) -# Copyright:: Copyright 2010-2019, Chef Software Inc. +# Copyright:: Copyright 2010-2020, Chef Software Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -34,7 +34,6 @@ require_relative "provider/launchd" require_relative "provider/link" require_relative "provider/log" require_relative "provider/ohai" -require_relative "provider/mdadm" require_relative "provider/mount" require_relative "provider/noop" require_relative "provider/package" diff --git a/lib/chef/resource/mdadm.rb b/lib/chef/resource/mdadm.rb index aff90059a7..e226644f5e 100644 --- a/lib/chef/resource/mdadm.rb +++ b/lib/chef/resource/mdadm.rb @@ -22,6 +22,8 @@ require_relative "../resource" class Chef class Resource class Mdadm < Chef::Resource + unified_mode true + resource_name :mdadm description "Use the mdadm resource to manage RAID devices in a Linux environment using the mdadm utility. The mdadm resource"\ @@ -62,6 +64,64 @@ class Chef property :layout, String, description: "The RAID5 parity algorithm. Possible values: left-asymmetric (or la), left-symmetric (or ls), right-asymmetric (or ra), or right-symmetric (or rs)." + + action_class do + def load_current_resource + @current_resource = Chef::Resource::Mdadm.new(new_resource.name) + current_resource.raid_device(new_resource.raid_device) + logger.trace("#{new_resource} checking for software raid device #{current_resource.raid_device}") + + device_not_found = 4 + mdadm = shell_out!("mdadm", "--detail", "--test", new_resource.raid_device, returns: [0, device_not_found]) + exists = (mdadm.status == 0) + current_resource.exists(exists) + end + end + + action :create do + unless current_resource.exists + converge_by("create RAID device #{new_resource.raid_device}") do + command = "yes | mdadm --create #{new_resource.raid_device} --level #{new_resource.level}" + command << " --chunk=#{new_resource.chunk}" unless new_resource.level == 1 + command << " --metadata=#{new_resource.metadata}" + command << " --bitmap=#{new_resource.bitmap}" if new_resource.bitmap + command << " --layout=#{new_resource.layout}" if new_resource.layout + command << " --raid-devices #{new_resource.devices.length} #{new_resource.devices.join(" ")}" + logger.trace("#{new_resource} mdadm command: #{command}") + shell_out!(command) + logger.info("#{new_resource} created raid device (#{new_resource.raid_device})") + end + else + logger.trace("#{new_resource} raid device already exists, skipping create (#{new_resource.raid_device})") + end + end + + action :assemble do + unless current_resource.exists + converge_by("assemble RAID device #{new_resource.raid_device}") do + command = "yes | mdadm --assemble #{new_resource.raid_device} #{new_resource.devices.join(" ")}" + logger.trace("#{new_resource} mdadm command: #{command}") + shell_out!(command) + logger.info("#{new_resource} assembled raid device (#{new_resource.raid_device})") + end + else + logger.trace("#{new_resource} raid device already exists, skipping assemble (#{new_resource.raid_device})") + end + end + + action :stop do + if current_resource.exists + converge_by("stop RAID device #{new_resource.raid_device}") do + command = "yes | mdadm --stop #{new_resource.raid_device}" + logger.trace("#{new_resource} mdadm command: #{command}") + shell_out!(command) + logger.info("#{new_resource} stopped raid device (#{new_resource.raid_device})") + end + else + logger.trace("#{new_resource} raid device doesn't exist (#{new_resource.raid_device}) - not stopping") + end + end + end end end diff --git a/spec/unit/provider/mdadm_spec.rb b/spec/unit/provider/mdadm_spec.rb index d79c1b35db..7e3546dcce 100644 --- a/spec/unit/provider/mdadm_spec.rb +++ b/spec/unit/provider/mdadm_spec.rb @@ -19,15 +19,15 @@ require "spec_helper" require "ostruct" -describe Chef::Provider::Mdadm do +describe Chef::Resource::Mdadm do before(:each) do @node = Chef::Node.new @events = Chef::EventDispatch::Dispatcher.new @run_context = Chef::RunContext.new(@node, {}, @events) - @new_resource = Chef::Resource::Mdadm.new("/dev/md1") + @new_resource = Chef::Resource::Mdadm.new("/dev/md1", run_context) @new_resource.devices ["/dev/sdz1", "/dev/sdz2", "/dev/sdz3"] - @provider = Chef::Provider::Mdadm.new(@new_resource, @run_context) + @provider = @new_resource.provider_for_action(:create) end describe "when determining the current metadevice status" do diff --git a/spec/unit/provider_resolver_spec.rb b/spec/unit/provider_resolver_spec.rb index 2eadcd0d1c..79b43ccce2 100644 --- a/spec/unit/provider_resolver_spec.rb +++ b/spec/unit/provider_resolver_spec.rb @@ -1,6 +1,6 @@ # # Author:: Lamont Granquist (<lamont@chef.io>) -# Copyright:: Copyright 2014-2019, Chef Software Inc. +# Copyright:: Copyright 2014-2020, Chef Software Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -562,7 +562,7 @@ describe Chef::ProviderResolver do linux_user: [ Chef::Resource::User::LinuxUser, Chef::Provider::User::Linux ], log: [ Chef::Resource::Log, Chef::Provider::Log::ChefLog ], macports_package: [ Chef::Resource::MacportsPackage, Chef::Provider::Package::Macports ], - mdadm: [ Chef::Resource::Mdadm, Chef::Provider::Mdadm ], + mdadm: [ Chef::Resource::Mdadm ], mount: [ Chef::Resource::Mount, Chef::Provider::Mount::Mount ], pacman_package: [ Chef::Resource::PacmanPackage, Chef::Provider::Package::Pacman ], paludis_package: [ Chef::Resource::PaludisPackage, Chef::Provider::Package::Paludis ], |