providers/pool.rb (91 lines of code) (raw):
#
# Author: Hans Chris Jones <chris.jones@lambdastack.io>
# Cookbook: ceph
#
# Copyright 2017, Bloomberg Finance L.P.
#
# 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.
#
provides :ceph_chef_pool
def whyrun_supported?
true
end
use_inline_resources
action :create do
if @current_resource.exists
Chef::Log.info "#{@new_resource} already exists - nothing to do."
else
converge_by("Creating #{@new_resource}") do
create_pool
set_pool_crush_ruleset if @new_resource.crush_ruleset >= 0
end
end
end
# Note: Set only checks for existing resourse and not if the pool is set to the value passed so it will
# always run in a chef-client run.
action :set do
if !@current_resource.exists
Chef::Log.info "#{@new_resource} does not exist - can't update anything."
else
converge_by("Updating #{@new_resource}") do
set_pool
end
end
end
action :get do
converge_by("Getting #{@new_resource}") do
get_pool
end
end
action :delete do
if @current_resource.exists
converge_by("Deleting #{@new_resource}") do
delete_pool
end
else
Chef::Log.info "#{@current_resource} does not exist - nothing to do."
end
end
def load_current_resource
@current_resource = Chef::Resource::CephChefPool.new(@new_resource.name)
@current_resource.name(@new_resource.name)
@current_resource.exists = pool_exists?(@current_resource.name)
end
# profile is only used for erasure coding...
def create_pool
cmd_text = "ceph osd pool create #{new_resource.name} #{new_resource.pg_num} #{new_resource.pgp_num} #{new_resource.type}"
cmd_text << " #{new_resource.profile}" if new_resource.profile
cmd_text << " #{new_resource.crush_ruleset_name}" if new_resource.crush_ruleset_name
cmd_text << " #{new_resource.options}" if new_resource.options
puts "\nRunning... #{cmd_text}"
cmd = Mixlib::ShellOut.new(cmd_text)
cmd.run_command
cmd.error!
Chef::Log.debug "Pool created: #{cmd.stderr}"
end
def set_pool
cmd_text = "ceph osd pool set #{new_resource.name} #{new_resource.key} #{new_resource.value}"
puts "\nSetting... #{cmd_text}"
cmd = Mixlib::ShellOut.new(cmd_text)
cmd.run_command
cmd.error!
Chef::Log.debug "Pool updated: #{cmd.stderr}"
end
def set_pool_crush_ruleset
cmd_text = "ceph osd pool set #{new_resource.name} crush_ruleset #{new_resource.crush_ruleset}"
cmd = Mixlib::ShellOut.new(cmd_text)
cmd.run_command
cmd.error!
Chef::Log.debug "Pool crush_ruleset updated: #{cmd.stderr}"
end
# rubocop:disable Style/AccessorMethodName
def get_pool
cmd = shell_out("ceph osd pool get #{new_resource.name} #{new_resource.key}")
cmd.stdout
end
# rubocop:enable Style/AccessorMethodName
def delete_pool
cmd_text = "ceph osd pool delete #{new_resource.name}"
cmd_text << " #{new_resource.name} --yes-i-really-really-mean-it"
cmd = Mixlib::ShellOut.new(cmd_text)
cmd.run_command
cmd.error!
Chef::Log.debug "Pool deleted: #{cmd.stderr}"
end
def pool_exists?(name)
cmd = Mixlib::ShellOut.new("ceph osd pool get #{name} size")
cmd.run_command
cmd.error!
Chef::Log.debug "Pool exists: #{cmd.stdout}"
true
rescue
Chef::Log.debug "Pool doesn't seem to exist: #{cmd.stderr}"
false
end
#