1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
require 'puppet'
Puppet::Type.type(:vs_config).provide(:ovs) do
commands :vsctl => 'ovs-vsctl'
def self.munge_array_value(value)
"[#{value[1..-2].split(',').map(&:strip).sort.join(",")}]"
end
def self.parse_column_value(value)
value = value.chomp
if value[0] == '{'
# hash case, like {system-id=\"some-id\", name=\"some-name\"}
type = 'hash'
res = {}
value[1..-2].gsub('"','').split(', ').map(&:strip).each do |v|
k,val = v.split('=', 2)
res[k] = val
end
elsif value[0] == '['
# set case, like ['id1', 'id2', 'id3']
type = 'set'
res = munge_array_value(value)
else
# simple string
type = 'string'
res = value
end
{
:type => type,
:value => res
}
end
def self.list_config_entries
open_vs = vsctl("list", "Open_vSwitch", ".").split("\n")
configs = []
open_vs.each do |line|
key, value = line.split(' : ').map(&:strip)
if value.nil?
next
end
parsed_value = parse_column_value(value)
if parsed_value[:type] == "hash"
parsed_value[:value].each do |k, v|
configs.push({
:name => "#{key}:#{k}",
:value => v,
:ensure => :present
})
end
else
configs.push({
:name => key,
:ensure => :present,
:value => parsed_value[:value],
})
end
end
configs
end
def self.instances()
configs = list_config_entries
configs.collect do |config|
new(config)
end
end
def self.prefetch(resources)
instances.each do |prov|
if resource = resources[prov.name]
resource.provider = prov
end
end
end
def initialize(value)
super(value)
end
def exists?
# if skip_if_version matches ovs_version(), then skip the configuration by faking exists
if @resource[:skip_if_version].eql? ovs_version()
return true
elsif ensure_absent?
@property_hash[:ensure] != :present
else
@property_hash[:ensure] == :present
end
end
def destroy
if @resource[:name].include?(':')
name, key = @resource[:name].split(':')
vsctl("remove", "Open_vSwitch", ".", name, key)
else
vsctl("clear", "Open_vSwitch", ".", @resource[:name])
end
end
def _set
if @resource[:wait] == :false
vsctl("--no-wait", "set", "Open_vSwitch", ".", "#{@resource[:name]}=#{@resource[:value]}")
else
vsctl("set", "Open_vSwitch", ".", "#{@resource[:name]}=#{@resource[:value]}")
end
end
def create
if ensure_absent?
destroy
else
_set
end
end
def value
# if skip_if_version matches ovs_version(), then skip the configuration by returning the same value
if @resource[:skip_if_version].eql? ovs_version()
@resource[:value]
elsif ensure_absent?
@resource[:value]
else
@property_hash[:value]
end
end
def ovs_version
vsctl("--version")[/.*ovs-vsctl\s+\(Open\s+vSwitch\)\s+(\d+\.\d+)/][/(\d+\.\d+)/].chomp()
end
def value=(value)
if ensure_absent?
destroy
else
_set
end
end
private
def ensure_absent?
(@resource[:value].nil? or @resource[:value].empty?) and @resource[:ensure] == :present
end
end
|