vcloud-edge_gateway 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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