90 lines
2.1 KiB
Ruby
90 lines
2.1 KiB
Ruby
require 'shellwords'
|
|
require File.expand_path('../resource', File.dirname(__FILE__))
|
|
require File.expand_path('../mixins/resource_meta', File.dirname(__FILE__))
|
|
|
|
class Pacemaker::Resource::Primitive < Pacemaker::Resource
|
|
TYPE = 'primitive'
|
|
register_type TYPE
|
|
|
|
include Pacemaker::Resource::Meta
|
|
|
|
attr_accessor :agent, :params, :op
|
|
|
|
def initialize(*args)
|
|
super(*args)
|
|
|
|
@agent = nil
|
|
end
|
|
|
|
def self.from_chef_resource(resource)
|
|
new(resource.name).copy_attrs_from_chef_resource(resource, *%w(agent params meta op))
|
|
end
|
|
|
|
def parse_definition
|
|
unless definition =~ /\Aprimitive (\S+) (\S+)/
|
|
raise Pacemaker::CIBObject::DefinitionParseError, \
|
|
"Couldn't parse definition '#{definition}'"
|
|
end
|
|
self.name = $1
|
|
self.agent = $2
|
|
|
|
%w(params meta).each do |data_type|
|
|
hash = self.class.extract_hash(definition, data_type)
|
|
writer = (data_type + '=').to_sym
|
|
send(writer, hash)
|
|
end
|
|
|
|
self.op = {}
|
|
%w(start stop monitor).each do |op|
|
|
h = self.class.extract_hash(definition, "op #{op}")
|
|
self.op[op] = h unless h.empty?
|
|
end
|
|
end
|
|
|
|
def params_string
|
|
self.class.params_string(params)
|
|
end
|
|
|
|
def op_string
|
|
self.class.op_string(op)
|
|
end
|
|
|
|
def definition_string
|
|
str = "#{TYPE} #{name} #{agent}"
|
|
indent = ' ' * 9
|
|
%w(params meta op).each do |data_type|
|
|
unless send(data_type).empty?
|
|
data_string = send("#{data_type}_string")
|
|
str << " \\\n#{indent}#{data_string}"
|
|
else
|
|
end
|
|
end
|
|
str
|
|
end
|
|
|
|
def crm_configure_command
|
|
args = %w(crm configure primitive)
|
|
args << [name, agent, params_string, meta_string, op_string]
|
|
args.join " "
|
|
end
|
|
|
|
def self.params_string(params)
|
|
return "" if ! params or params.empty?
|
|
"params " +
|
|
params.sort.map do |key, value|
|
|
%'#{key}="#{value}"'
|
|
end.join(' ')
|
|
end
|
|
|
|
def self.op_string(ops)
|
|
return "" if ! ops or ops.empty?
|
|
ops.sort.map do |op, attrs|
|
|
attrs.empty? ? nil : "op #{op} " + \
|
|
attrs.sort.map do |key, value|
|
|
%'#{key}="#{value}"'
|
|
end.join(' ')
|
|
end.compact.join(' ')
|
|
end
|
|
|
|
end
|