65275a755b30825d59b479542b2cdd045421bc66
[mirror/dsa-puppet.git] / 3rdparty / modules / rabbitmq / lib / puppet / type / rabbitmq_policy.rb
1 Puppet::Type.newtype(:rabbitmq_policy) do
2   desc <<-DESC
3 Type for managing rabbitmq policies
4
5 @example Create a rabbitmq_policy
6  rabbitmq_policy { 'ha-all@myvhost':
7    pattern    => '.*',
8    priority   => 0,
9    applyto    => 'all',
10    definition => {
11      'ha-mode'      => 'all',
12      'ha-sync-mode' => 'automatic',
13    },
14  }
15 DESC
16
17   ensurable do
18     defaultto(:present)
19     newvalue(:present) do
20       provider.create
21     end
22     newvalue(:absent) do
23       provider.destroy
24     end
25   end
26
27   autorequire(:service) { 'rabbitmq-server' }
28
29   validate do
30     raise('pattern parameter is required.') if self[:ensure] == :present && self[:pattern].nil?
31     raise('definition parameter is required.') if self[:ensure] == :present && self[:definition].nil?
32   end
33
34   newparam(:name, namevar: true) do
35     desc 'combination of policy@vhost to create policy for'
36     newvalues(%r{^\S+@\S+$})
37   end
38
39   newproperty(:pattern) do
40     desc 'policy pattern'
41     validate do |value|
42       resource.validate_pattern(value)
43     end
44   end
45
46   newproperty(:applyto) do
47     desc 'policy apply to'
48     newvalue(:all)
49     newvalue(:exchanges)
50     newvalue(:queues)
51     defaultto :all
52   end
53
54   newproperty(:definition) do
55     desc 'policy definition'
56     validate do |value|
57       resource.validate_definition(value)
58     end
59     munge do |value|
60       resource.munge_definition(value)
61     end
62   end
63
64   newproperty(:priority) do
65     desc 'policy priority'
66     newvalues(%r{^\d+$})
67     defaultto 0
68   end
69
70   autorequire(:rabbitmq_vhost) do
71     [self[:name].split('@')[1]]
72   end
73
74   def validate_pattern(value)
75     Regexp.new(value)
76   rescue RegexpError
77     raise ArgumentError, "Invalid regexp #{value}"
78   end
79
80   def validate_definition(definition)
81     unless [Hash].include?(definition.class)
82       raise ArgumentError, 'Invalid definition'
83     end
84     definition.each do |k, v|
85       if k == 'ha-params' && definition['ha-mode'] == 'nodes'
86         unless [Array].include?(v.class)
87           raise ArgumentError, "Invalid definition, value #{v} for key #{k} is not an array"
88         end
89       else
90         unless [String].include?(v.class)
91           raise ArgumentError, "Invalid definition, value #{v} is not a string"
92         end
93       end
94     end
95     if definition['ha-mode'] == 'exactly'
96       ha_params = definition['ha-params']
97       unless ha_params.to_i.to_s == ha_params
98         raise ArgumentError, "Invalid ha-params '#{ha_params}' for ha-mode 'exactly'"
99       end
100     end
101     if definition.key? 'expires'
102       expires_val = definition['expires']
103       unless expires_val.to_i.to_s == expires_val
104         raise ArgumentError, "Invalid expires value '#{expires_val}'"
105       end
106     end
107     if definition.key? 'message-ttl'
108       message_ttl_val = definition['message-ttl']
109       unless message_ttl_val.to_i.to_s == message_ttl_val
110         raise ArgumentError, "Invalid message-ttl value '#{message_ttl_val}'"
111       end
112     end
113     if definition.key? 'max-length'
114       max_length_val = definition['max-length']
115       unless max_length_val.to_i.to_s == max_length_val
116         raise ArgumentError, "Invalid max-length value '#{max_length_val}'"
117       end
118     end
119     if definition.key? 'max-length-bytes'
120       max_length_bytes_val = definition['max-length-bytes']
121       unless max_length_bytes_val.to_i.to_s == max_length_bytes_val
122         raise ArgumentError, "Invalid max-length-bytes value '#{max_length_bytes_val}'"
123       end
124     end
125     if definition.key? 'shards-per-node'
126       shards_per_node_val = definition['shards-per-node']
127       unless shards_per_node_val.to_i.to_s == shards_per_node_val
128         raise ArgumentError, "Invalid shards-per-node value '#{shards_per_node_val}'"
129       end
130     end
131     if definition.key? 'ha-sync-batch-size' # rubocop:disable Style/GuardClause
132       ha_sync_batch_size_val = definition['ha-sync-batch-size']
133       unless ha_sync_batch_size_val.to_i.to_s == ha_sync_batch_size_val
134         raise ArgumentError, "Invalid ha-sync-batch-size value '#{ha_sync_batch_size_val}'"
135       end
136     end
137   end
138
139   def munge_definition(definition)
140     if definition['ha-mode'] == 'exactly'
141       definition['ha-params'] = definition['ha-params'].to_i
142     end
143     if definition.key? 'expires'
144       definition['expires'] = definition['expires'].to_i
145     end
146     if definition.key? 'message-ttl'
147       definition['message-ttl'] = definition['message-ttl'].to_i
148     end
149     if definition.key? 'max-length'
150       definition['max-length'] = definition['max-length'].to_i
151     end
152     if definition.key? 'max-length-bytes'
153       definition['max-length-bytes'] = definition['max-length-bytes'].to_i
154     end
155     if definition.key? 'shards-per-node'
156       definition['shards-per-node'] = definition['shards-per-node'].to_i
157     end
158     if definition.key? 'ha-sync-batch-size'
159       definition['ha-sync-batch-size'] = definition['ha-sync-batch-size'].to_i
160     end
161     definition
162   end
163 end