Day 25 in the #vDM30in30 Image from https://flic.kr/p/6t59b
So, we’ve talked about the RAL, getters, setters and the resource command.
Now let’s talk about implementing a RAL interface of our own.
swap_file type and provider I ended up implementing a RAL layer in my swap_file module, mainly as an exercise in figuring out how types and providers work.
It looks like this:
Puppet::Type.type(:swap_file).provide(:linux) do desc "Swap file management via `swapon`, `swapoff` and `mkswap`" confine :kernel => :linux commands :swapon => 'swapon' commands :swapoff => 'swapoff' commands :mkswap => 'mkswap' mk_resource_methods def initialize(value={}) super(value) @property_flush = {} end def self.get_swap_files swapfiles = swapon(['-s']).split("\n") swapfiles.shift swapfiles.sort end def self.prefetch(resources) instances.each do |prov| if resource = resources[prov.name] resource.provider = prov end end end def self.instances get_swap_files.collect do |swapfile_line| new(get_swapfile_properties(swapfile_line)) end end def self.get_swapfile_properties(swapfile_line) swapfile_properties = {} # swapon -s output formats thus: # Filename Type Size Used Priority # Split on spaces output_array = swapfile_line.strip.split(/\s+/) # Assign properties based on headers swapfile_properties = { :ensure => :present, :name => output_array[0], :file => output_array[0], :type => output_array[1], :size => output_array[2], :used => output_array[3], :priority => output_array[4] } swapfile_properties[:provider] = :swap_file Puppet.debug "Swapfile: #{swapfile_properties.inspect}" swapfile_properties end def exists? @property_hash[:ensure] == :present end def create @property_flush[:ensure] = :present end def destroy @property_flush[:ensure] = :absent end def create_swap_file(file_path) mk_swap(file_path) swap_on(file_path) end def mk_swap(file_path) Puppet.debug "Running `mkswap #{file_path}`" output = mkswap([file_path]) Puppet.debug "Returned value: #{output}`" end def swap_on(file_path) Puppet.debug "Running `swapon #{file_path}`" output = swapon([file_path]) Puppet.debug "Returned value: #{output}" end def swap_off(file_path) Puppet.debug "Running `swapoff #{file_path}`" output = swapoff([file_path]) Puppet.debug "Returned value: #{output}" end def set_swapfile if @property_flush[:ensure] == :absent swap_off(resource[:name]) return end create_swap_file(resource[:name]) unless exists? end def flush set_swapfile # Collect the resources again once they've been changed (that way `puppet # resource` will show the correct values after changes have been made). @property_hash = self.class.get_swapfile_properties(resource[:name]) end end Now, there’s a bunch of weird stuff in there, that to be honest even know I only vaguely understand…
...