File: ovs.rb

package info (click to toggle)
puppet-module-vswitch 21.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 596 kB
  • sloc: ruby: 2,189; python: 38; sh: 10; makefile: 10
file content (148 lines) | stat: -rw-r--r-- 3,319 bytes parent folder | download
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