vcloud-edge_gateway 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/CHANGELOG.md +11 -0
  2. data/README.md +219 -11
  3. data/examples/firewall-rules.yaml +50 -0
  4. data/examples/loadbalancer-rules.yaml +55 -0
  5. data/examples/nat-rules.yaml +58 -0
  6. data/lib/vcloud/edge_gateway.rb +2 -3
  7. data/lib/vcloud/edge_gateway/configuration_differ.rb +13 -1
  8. data/lib/vcloud/edge_gateway/configuration_generator/nat_service.rb +10 -10
  9. data/lib/vcloud/edge_gateway/edge_gateway_configuration.rb +2 -2
  10. data/lib/vcloud/edge_gateway/firewall_configuration_differ.rb +18 -0
  11. data/lib/vcloud/edge_gateway/load_balancer_configuration_differ.rb +3 -13
  12. data/lib/vcloud/edge_gateway/nat_configuration_differ.rb +18 -0
  13. data/lib/vcloud/edge_gateway/version.rb +1 -1
  14. data/lib/vcloud/edge_gateway_services.rb +1 -1
  15. data/spec/integration/edge_gateway/edge_gateway_services_spec.rb +7 -13
  16. data/spec/integration/edge_gateway/firewall_service_spec.rb +2 -12
  17. data/spec/integration/edge_gateway/load_balancer_service_spec.rb +4 -4
  18. data/spec/integration/edge_gateway/nat_service_spec.rb +4 -4
  19. data/spec/spec_helper.rb +2 -2
  20. data/spec/vcloud/edge_gateway/configuration_differ_shared_examples.rb +132 -0
  21. data/spec/vcloud/edge_gateway/configuration_differ_spec.rb +5 -122
  22. data/spec/vcloud/edge_gateway/configuration_generator/firewall_service_spec.rb +46 -52
  23. data/spec/vcloud/edge_gateway/firewall_configuration_differ_spec.rb +65 -0
  24. data/spec/vcloud/edge_gateway/firewall_schema_validation_spec.rb +2 -2
  25. data/spec/vcloud/edge_gateway/load_balancer_configuration_differ_spec.rb +32 -147
  26. data/spec/vcloud/edge_gateway/load_balancer_schema_validation_spec.rb +7 -7
  27. data/spec/vcloud/edge_gateway/nat_configuration_differ_spec.rb +65 -0
  28. data/spec/vcloud/edge_gateway/nat_schema_validation_spec.rb +4 -4
  29. data/vcloud-edge_gateway.gemspec +2 -2
  30. metadata +18 -13
  31. data/lib/vcloud/config_loader.rb +0 -27
  32. data/lib/vcloud/config_validator.rb +0 -207
  33. data/spec/vcloud/config_loader_spec.rb +0 -112
  34. data/spec/vcloud/config_validator_spec.rb +0 -570
@@ -53,7 +53,7 @@ module Vcloud
53
53
 
54
54
  valid_tests.each do |test|
55
55
  it "#{test[:name]}" do
56
- validator = ConfigValidator.validate(:base, test[:input],
56
+ validator = Vcloud::Core::ConfigValidator.validate(:base, test[:input],
57
57
  Vcloud::Schema::LOAD_BALANCER_POOL_ENTRY)
58
58
  expect(validator.errors).to eq([])
59
59
  expect(validator.valid?).to be_true
@@ -93,7 +93,7 @@ module Vcloud
93
93
 
94
94
  valid_tests.each do |test|
95
95
  it "#{test[:name]}" do
96
- validator = ConfigValidator.validate(:base, test[:input],
96
+ validator = Vcloud::Core::ConfigValidator.validate(:base, test[:input],
97
97
  Vcloud::Schema::LOAD_BALANCER_VIRTUAL_SERVER_ENTRY)
98
98
  expect(validator.errors).to eq([])
99
99
  expect(validator.valid?).to be_true
@@ -124,7 +124,7 @@ module Vcloud
124
124
  },
125
125
  ],
126
126
  }
127
- validator = ConfigValidator.validate(:base, input, Vcloud::Schema::LOAD_BALANCER_SERVICE)
127
+ validator = Vcloud::Core::ConfigValidator.validate(:base, input, Vcloud::Schema::LOAD_BALANCER_SERVICE)
128
128
  expect(validator.errors).to eq([])
129
129
  expect(validator.valid?).to be_true
130
130
  end
@@ -144,7 +144,7 @@ module Vcloud
144
144
  },
145
145
  ],
146
146
  }
147
- validator = ConfigValidator.validate(:base, input, Vcloud::Schema::LOAD_BALANCER_SERVICE)
147
+ validator = Vcloud::Core::ConfigValidator.validate(:base, input, Vcloud::Schema::LOAD_BALANCER_SERVICE)
148
148
  expect(validator.errors).to eq([])
149
149
  expect(validator.valid?).to be_true
150
150
  end
@@ -166,7 +166,7 @@ module Vcloud
166
166
  },
167
167
  ],
168
168
  }
169
- validator = ConfigValidator.validate(:base, input, Vcloud::Schema::LOAD_BALANCER_SERVICE)
169
+ validator = Vcloud::Core::ConfigValidator.validate(:base, input, Vcloud::Schema::LOAD_BALANCER_SERVICE)
170
170
  expect(validator.errors).to eq([])
171
171
  expect(validator.valid?).to be_true
172
172
  end
@@ -175,7 +175,7 @@ module Vcloud
175
175
  input = {
176
176
  virtual_servers: []
177
177
  }
178
- validator = ConfigValidator.validate(:base, input, Vcloud::Schema::LOAD_BALANCER_SERVICE)
178
+ validator = Vcloud::Core::ConfigValidator.validate(:base, input, Vcloud::Schema::LOAD_BALANCER_SERVICE)
179
179
  expect(validator.valid?).to be_true
180
180
  end
181
181
 
@@ -183,7 +183,7 @@ module Vcloud
183
183
  input = {
184
184
  pools: []
185
185
  }
186
- validator = ConfigValidator.validate(:base, input, Vcloud::Schema::LOAD_BALANCER_SERVICE)
186
+ validator = Vcloud::Core::ConfigValidator.validate(:base, input, Vcloud::Schema::LOAD_BALANCER_SERVICE)
187
187
  expect(validator.valid?).to be_true
188
188
  end
189
189
 
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+ require_relative 'configuration_differ_shared_examples.rb'
3
+
4
+ module Vcloud
5
+ module EdgeGateway
6
+ describe NatConfigurationDiffer do
7
+
8
+ it_behaves_like "a configuration differ" do
9
+ let(:config_differ) { NatConfigurationDiffer }
10
+ end
11
+
12
+ it 'should ignore Id parameters in NatRule sections, when showing additions' do
13
+ local = { NatRule: [
14
+ { Id: '65539', deeper: [ 1, 2, 3, 4, 5 ] },
15
+ { Id: '65540', deeper: [ 5, 6, 4, 3, 2 ] },
16
+ ]}
17
+ remote = { NatRule: [
18
+ { Id: '65539', deeper: [ 1, 1, 1, 1, 1 ] },
19
+ { Id: '65540', deeper: [ 1, 2, 3, 4, 5 ] },
20
+ { Id: '65541', deeper: [ 5, 6, 4, 3, 2 ] },
21
+ ]}
22
+ output = [
23
+ ["+", "NatRule[0]", {:deeper=>[1, 1, 1, 1, 1]}]
24
+ ]
25
+ differ = NatConfigurationDiffer.new(local, remote)
26
+ expect(differ.diff).to eq(output)
27
+ end
28
+
29
+ it 'should still highlight a reordering despite ignoring Id' do
30
+ local = { NatRule: [
31
+ { Id: '65538', deeper: [ 1, 1, 1, 1, 1 ] },
32
+ { Id: '65539', deeper: [ 1, 2, 3, 4, 5 ] },
33
+ { Id: '65540', deeper: [ 5, 6, 4, 3, 2 ] },
34
+ ]}
35
+ remote = { NatRule: [
36
+ { Id: '65538', deeper: [ 1, 2, 3, 4, 5 ] },
37
+ { Id: '65539', deeper: [ 5, 6, 4, 3, 2 ] },
38
+ { Id: '65540', deeper: [ 1, 1, 1, 1, 1 ] },
39
+ ]}
40
+ output = [
41
+ ["-", "NatRule[0]", {:deeper=>[1, 1, 1, 1, 1]}],
42
+ ["+", "NatRule[2]", {:deeper=>[1, 1, 1, 1, 1]}],
43
+ ]
44
+ differ = NatConfigurationDiffer.new(local, remote)
45
+ expect(differ.diff).to eq(output)
46
+ end
47
+
48
+ it 'should not ignore Id parameter outside of a NatRule (just in case)' do
49
+ local = {
50
+ NatRule: [ { Id: '65538', deeper: [ 1, 1, 1, 1, 1 ] } ],
51
+ Id: 'outside of NAT rule'
52
+ }
53
+ remote = {
54
+ NatRule: [ { Id: '65538', deeper: [ 1, 1, 1, 1, 1 ] } ],
55
+ }
56
+ output = [
57
+ ["-", "Id", 'outside of NAT rule']
58
+ ]
59
+ differ = NatConfigurationDiffer.new(local, remote)
60
+ expect(differ.diff).to eq(output)
61
+ end
62
+
63
+ end
64
+ end
65
+ end
@@ -13,7 +13,7 @@ module Vcloud
13
13
  translated_ip: "10.10.20.20",
14
14
 
15
15
  }
16
- validator = ConfigValidator.validate(:base, snat_rule, Vcloud::Schema::NAT_RULE)
16
+ validator = Vcloud::Core::ConfigValidator.validate(:base, snat_rule, Vcloud::Schema::NAT_RULE)
17
17
  expect(validator.valid?).to be_true
18
18
  expect(validator.errors).to be_empty
19
19
 
@@ -33,7 +33,7 @@ module Vcloud
33
33
  mandatory_fields.each do |mandatory_field|
34
34
  it "should error since mandatory field #{mandatory_field} is missing" do
35
35
  @snat_rule.delete(mandatory_field)
36
- validator = ConfigValidator.validate(:base, @snat_rule, Vcloud::Schema::NAT_RULE)
36
+ validator = Vcloud::Core::ConfigValidator.validate(:base, @snat_rule, Vcloud::Schema::NAT_RULE)
37
37
  expect(validator.valid?).to be_false
38
38
  expect(validator.errors).to eq(["base: missing '#{mandatory_field}' parameter"])
39
39
  end
@@ -52,7 +52,7 @@ module Vcloud
52
52
  protocol: 'tcp'
53
53
 
54
54
  }
55
- validator = ConfigValidator.validate(:base, snat_rule, Vcloud::Schema::NAT_RULE)
55
+ validator = Vcloud::Core::ConfigValidator.validate(:base, snat_rule, Vcloud::Schema::NAT_RULE)
56
56
  expect(validator.valid?).to be_true
57
57
  expect(validator.errors).to be_empty
58
58
  end
@@ -84,7 +84,7 @@ module Vcloud
84
84
  }
85
85
  ]
86
86
  }
87
- validator = ConfigValidator.validate(:base, nat_service, Vcloud::Schema::NAT_SERVICE)
87
+ validator = Vcloud::Core::ConfigValidator.validate(:base, nat_service, Vcloud::Schema::NAT_SERVICE)
88
88
  expect(validator.valid?).to be_true
89
89
  expect(validator.errors).to be_empty
90
90
  end
@@ -21,8 +21,8 @@ Gem::Specification.new do |s|
21
21
 
22
22
  s.required_ruby_version = '>= 1.9.2'
23
23
 
24
- s.add_runtime_dependency 'fog', '>= 1.19.0'
25
- s.add_runtime_dependency 'vcloud-core', '>= 0.0.6'
24
+ s.add_runtime_dependency 'fog', '>= 1.21.0'
25
+ s.add_runtime_dependency 'vcloud-core', '>= 0.0.12'
26
26
  s.add_runtime_dependency 'hashdiff'
27
27
  s.add_development_dependency 'rake'
28
28
  s.add_development_dependency 'rspec', '~> 2.14.1'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vcloud-edge_gateway
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-07 00:00:00.000000000 Z
12
+ date: 2014-04-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fog
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: 1.19.0
21
+ version: 1.21.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
- version: 1.19.0
29
+ version: 1.21.0
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: vcloud-core
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -34,7 +34,7 @@ dependencies:
34
34
  requirements:
35
35
  - - ! '>='
36
36
  - !ruby/object:Gem::Version
37
- version: 0.0.6
37
+ version: 0.0.12
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,7 +42,7 @@ dependencies:
42
42
  requirements:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
- version: 0.0.6
45
+ version: 0.0.12
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: hashdiff
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -138,10 +138,11 @@ files:
138
138
  - README.md
139
139
  - Rakefile
140
140
  - bin/vcloud-configure-edge
141
+ - examples/firewall-rules.yaml
142
+ - examples/loadbalancer-rules.yaml
143
+ - examples/nat-rules.yaml
141
144
  - jenkins.sh
142
145
  - jenkins_integration_tests.sh
143
- - lib/vcloud/config_loader.rb
144
- - lib/vcloud/config_validator.rb
145
146
  - lib/vcloud/edge_gateway.rb
146
147
  - lib/vcloud/edge_gateway/configuration_differ.rb
147
148
  - lib/vcloud/edge_gateway/configuration_generator/firewall_service.rb
@@ -149,7 +150,9 @@ files:
149
150
  - lib/vcloud/edge_gateway/configuration_generator/load_balancer_service.rb
150
151
  - lib/vcloud/edge_gateway/configuration_generator/nat_service.rb
151
152
  - lib/vcloud/edge_gateway/edge_gateway_configuration.rb
153
+ - lib/vcloud/edge_gateway/firewall_configuration_differ.rb
152
154
  - lib/vcloud/edge_gateway/load_balancer_configuration_differ.rb
155
+ - lib/vcloud/edge_gateway/nat_configuration_differ.rb
153
156
  - lib/vcloud/edge_gateway/version.rb
154
157
  - lib/vcloud/edge_gateway_services.rb
155
158
  - lib/vcloud/schema/edge_gateway.rb
@@ -176,13 +179,12 @@ files:
176
179
  - spec/integration/edge_gateway/load_balancer_service_spec.rb
177
180
  - spec/integration/edge_gateway/nat_service_spec.rb
178
181
  - spec/spec_helper.rb
179
- - spec/vcloud/config_loader_spec.rb
180
- - spec/vcloud/config_validator_spec.rb
181
182
  - spec/vcloud/data/basic_preamble_test.erb
182
183
  - spec/vcloud/data/basic_preamble_test.erb.OUT
183
184
  - spec/vcloud/data/working.json
184
185
  - spec/vcloud/data/working.yaml
185
186
  - spec/vcloud/data/working_with_defaults.yaml
187
+ - spec/vcloud/edge_gateway/configuration_differ_shared_examples.rb
186
188
  - spec/vcloud/edge_gateway/configuration_differ_spec.rb
187
189
  - spec/vcloud/edge_gateway/configuration_generator/data/load_balancer_http-input.yaml
188
190
  - spec/vcloud/edge_gateway/configuration_generator/data/load_balancer_http-output.yaml
@@ -194,9 +196,11 @@ files:
194
196
  - spec/vcloud/edge_gateway/configuration_generator/load_balancer_service_spec.rb
195
197
  - spec/vcloud/edge_gateway/configuration_generator/nat_service_spec.rb
196
198
  - spec/vcloud/edge_gateway/edge_gateway_configuration_spec.rb
199
+ - spec/vcloud/edge_gateway/firewall_configuration_differ_spec.rb
197
200
  - spec/vcloud/edge_gateway/firewall_schema_validation_spec.rb
198
201
  - spec/vcloud/edge_gateway/load_balancer_configuration_differ_spec.rb
199
202
  - spec/vcloud/edge_gateway/load_balancer_schema_validation_spec.rb
203
+ - spec/vcloud/edge_gateway/nat_configuration_differ_spec.rb
200
204
  - spec/vcloud/edge_gateway/nat_schema_validation_spec.rb
201
205
  - vcloud-edge_gateway.gemspec
202
206
  homepage: http://github.com/alphagov/vcloud-edge_gateway
@@ -220,7 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
220
224
  version: '0'
221
225
  segments:
222
226
  - 0
223
- hash: 4166614673467124064
227
+ hash: -981764383968782471
224
228
  requirements: []
225
229
  rubyforge_project:
226
230
  rubygems_version: 1.8.23
@@ -247,13 +251,12 @@ test_files:
247
251
  - spec/integration/edge_gateway/load_balancer_service_spec.rb
248
252
  - spec/integration/edge_gateway/nat_service_spec.rb
249
253
  - spec/spec_helper.rb
250
- - spec/vcloud/config_loader_spec.rb
251
- - spec/vcloud/config_validator_spec.rb
252
254
  - spec/vcloud/data/basic_preamble_test.erb
253
255
  - spec/vcloud/data/basic_preamble_test.erb.OUT
254
256
  - spec/vcloud/data/working.json
255
257
  - spec/vcloud/data/working.yaml
256
258
  - spec/vcloud/data/working_with_defaults.yaml
259
+ - spec/vcloud/edge_gateway/configuration_differ_shared_examples.rb
257
260
  - spec/vcloud/edge_gateway/configuration_differ_spec.rb
258
261
  - spec/vcloud/edge_gateway/configuration_generator/data/load_balancer_http-input.yaml
259
262
  - spec/vcloud/edge_gateway/configuration_generator/data/load_balancer_http-output.yaml
@@ -265,7 +268,9 @@ test_files:
265
268
  - spec/vcloud/edge_gateway/configuration_generator/load_balancer_service_spec.rb
266
269
  - spec/vcloud/edge_gateway/configuration_generator/nat_service_spec.rb
267
270
  - spec/vcloud/edge_gateway/edge_gateway_configuration_spec.rb
271
+ - spec/vcloud/edge_gateway/firewall_configuration_differ_spec.rb
268
272
  - spec/vcloud/edge_gateway/firewall_schema_validation_spec.rb
269
273
  - spec/vcloud/edge_gateway/load_balancer_configuration_differ_spec.rb
270
274
  - spec/vcloud/edge_gateway/load_balancer_schema_validation_spec.rb
275
+ - spec/vcloud/edge_gateway/nat_configuration_differ_spec.rb
271
276
  - spec/vcloud/edge_gateway/nat_schema_validation_spec.rb
@@ -1,27 +0,0 @@
1
- require 'yaml'
2
- require 'json'
3
-
4
- module Vcloud
5
- class ConfigLoader
6
-
7
- def load_config(config_file, schema = nil)
8
- input_config = YAML::load(File.open(config_file))
9
-
10
- # There is no way in YAML or Ruby to symbolize keys in a hash
11
- json_string = JSON.generate(input_config)
12
- config = JSON.parse(json_string, :symbolize_names => true)
13
-
14
- if schema
15
- validation = ConfigValidator.validate(:base, config, schema)
16
- unless validation.valid?
17
- validation.errors.each do |error|
18
- Vcloud::EdgeGateway.logger.fatal(error)
19
- end
20
- raise("Supplied configuration does not match supplied schema")
21
- end
22
- end
23
- config
24
- end
25
-
26
- end
27
- end
@@ -1,207 +0,0 @@
1
- require 'ipaddr'
2
-
3
- module Vcloud
4
- class ConfigValidator
5
-
6
- attr_reader :key, :data, :schema, :type, :errors
7
-
8
- VALID_ALPHABETICAL_VALUES_FOR_IP_RANGE = %w(Any external internal)
9
-
10
- def initialize(key, data, schema)
11
- raise "Nil schema" unless schema
12
- raise "Invalid schema" unless schema.key?(:type)
13
- @type = schema[:type].to_s.downcase
14
- @errors = []
15
- @data = data
16
- @schema = schema
17
- @key = key
18
- validate
19
- end
20
-
21
- def valid?
22
- @errors.empty?
23
- end
24
-
25
- def self.validate(key, data, schema)
26
- new(key, data, schema)
27
- end
28
-
29
- private
30
-
31
- def validate
32
- self.send("validate_#{type}".to_sym)
33
- end
34
-
35
- def validate_string
36
- unless @data.is_a? String
37
- errors << "#{key}: #{@data} is not a string"
38
- return
39
- end
40
- return unless check_emptyness_ok
41
- return unless check_matcher_matches
42
- end
43
-
44
- def validate_string_or_number
45
- unless data.is_a?(String) || data.is_a?(Numeric)
46
- @errors << "#{key}: #{@data} is not a string_or_number"
47
- return
48
- end
49
- end
50
-
51
- def validate_ip_address
52
- unless data.is_a?(String)
53
- @errors << "#{key}: #{@data} is not a valid ip_address"
54
- return
55
- end
56
- @errors << "#{key}: #{@data} is not a valid ip_address" unless valid_ip_address?(data)
57
- end
58
-
59
- def validate_ip_address_range
60
- unless data.is_a?(String)
61
- @errors << "#{key}: #{@data} is not a valid IP address range. Valid values can be IP address, CIDR, IP range, 'Any','internal' and 'external'."
62
- return
63
- end
64
- valid = valid_cidr_or_ip_address? || valid_alphabetical_ip_range? || valid_ip_range?
65
- @errors << "#{key}: #{@data} is not a valid IP address range. Valid values can be IP address, CIDR, IP range, 'Any','internal' and 'external'." unless valid
66
- end
67
-
68
- def valid_cidr_or_ip_address?
69
- begin
70
- ip = IPAddr.new(data)
71
- ip.ipv4?
72
- rescue ArgumentError
73
- false
74
- end
75
- end
76
-
77
- def valid_alphabetical_ip_range?
78
- VALID_ALPHABETICAL_VALUES_FOR_IP_RANGE.include?(data)
79
- end
80
-
81
- def valid_ip_address? ip_address
82
- begin
83
- #valid formats recognized by IPAddr are : “address”, “address/prefixlen” and “address/mask”.
84
- # Attribute like member_ip in case of load-balancer is an "address"
85
- # and we should not accept “address/prefixlen” and “address/mask” for such fields.
86
- ip = IPAddr.new(ip_address)
87
- ip.ipv4? && !ip_address.include?('/')
88
- rescue ArgumentError
89
- false
90
- end
91
- end
92
-
93
- def valid_ip_range?
94
- range_parts = data.split('-')
95
- return false if range_parts.size != 2
96
- start_address = range_parts.first
97
- end_address = range_parts.last
98
- valid_ip_address?(start_address) && valid_ip_address?(end_address) &&
99
- valid_start_and_end_address_combination?(end_address, start_address)
100
- end
101
-
102
- def valid_start_and_end_address_combination?(end_address, start_address)
103
- IPAddr.new(start_address) < IPAddr.new(end_address)
104
- end
105
-
106
- def validate_hash
107
- unless data.is_a? Hash
108
- @errors << "#{key}: is not a hash"
109
- return
110
- end
111
- return unless check_emptyness_ok
112
- check_for_unknown_parameters
113
- if schema.key?(:internals)
114
- internals = schema[:internals]
115
- internals.each do |param_key,param_schema|
116
- check_hash_parameter(param_key, param_schema)
117
- end
118
- end
119
- end
120
-
121
- def validate_array
122
- unless data.is_a? Array
123
- @errors << "#{key} is not an array"
124
- return
125
- end
126
- return unless check_emptyness_ok
127
- if schema.key?(:each_element_is)
128
- element_schema = schema[:each_element_is]
129
- data.each do |element|
130
- sub_validator = ConfigValidator.validate(key, element, element_schema)
131
- unless sub_validator.valid?
132
- @errors = errors + sub_validator.errors
133
- end
134
- end
135
- end
136
- end
137
-
138
- def validate_enum
139
- unless (acceptable_values = schema[:acceptable_values]) && acceptable_values.is_a?(Array)
140
- raise "Must set :acceptable_values for type 'enum'"
141
- end
142
- unless acceptable_values.include?(data)
143
- acceptable_values_string = acceptable_values.collect {|v| "'#{v}'" }.join(', ')
144
- @errors << "#{key}: #{@data} is not a valid value. Acceptable values are #{acceptable_values_string}."
145
- end
146
- end
147
-
148
- def validate_boolean
149
- unless [true, false].include?(data)
150
- @errors << "#{key}: #{data} is not a valid boolean value."
151
- end
152
- end
153
-
154
- def check_emptyness_ok
155
- unless schema.key?(:allowed_empty) && schema[:allowed_empty]
156
- if data.empty?
157
- @errors << "#{key}: cannot be empty #{type}"
158
- return false
159
- end
160
- end
161
- true
162
- end
163
-
164
- def check_matcher_matches
165
- return unless regex = schema[:matcher]
166
- raise "#{key}: #{regex} is not a Regexp" unless regex.is_a? Regexp
167
- unless data =~ regex
168
- @errors << "#{key}: #{data} does not match"
169
- return false
170
- end
171
- true
172
- end
173
-
174
- def check_hash_parameter(sub_key, sub_schema)
175
- if sub_schema.key?(:required) && sub_schema[:required] == false
176
- # short circuit out if we do not have the key, but it's not required.
177
- return true unless data.key?(sub_key)
178
- end
179
- unless data.key?(sub_key)
180
- @errors << "#{key}: missing '#{sub_key}' parameter"
181
- return false
182
- end
183
- sub_validator = ConfigValidator.validate(
184
- sub_key,
185
- data[sub_key],
186
- sub_schema
187
- )
188
- unless sub_validator.valid?
189
- @errors = errors + sub_validator.errors
190
- end
191
- end
192
-
193
- def check_for_unknown_parameters
194
- unless internals = schema[:internals]
195
- # if there are no parameters specified, then assume all are ok.
196
- return true
197
- end
198
- if schema[:permit_unknown_parameters]
199
- return true
200
- end
201
- data.keys.each do |k|
202
- @errors << "#{key}: parameter '#{k}' is invalid" unless internals[k]
203
- end
204
- end
205
-
206
- end
207
- end