summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2020-02-25 13:38:36 -0800
committerLamont Granquist <lamont@scriptkiddie.org>2020-02-25 14:45:27 -0800
commitaa30467a340c7d195fd92d64834e1f4defeb3b3a (patch)
tree1c438b067fe1969192b6f18fd834eeb4484547bc
parent372ce32577b49a499638a58d4f38ffbaab7640aa (diff)
downloadchef-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.rb85
-rw-r--r--lib/chef/providers.rb3
-rw-r--r--lib/chef/resource/mdadm.rb60
-rw-r--r--spec/unit/provider/mdadm_spec.rb6
-rw-r--r--spec/unit/provider_resolver_spec.rb4
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 ],