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.
- data/CHANGELOG.md +11 -0
- data/README.md +219 -11
- data/examples/firewall-rules.yaml +50 -0
- data/examples/loadbalancer-rules.yaml +55 -0
- data/examples/nat-rules.yaml +58 -0
- data/lib/vcloud/edge_gateway.rb +2 -3
- data/lib/vcloud/edge_gateway/configuration_differ.rb +13 -1
- data/lib/vcloud/edge_gateway/configuration_generator/nat_service.rb +10 -10
- data/lib/vcloud/edge_gateway/edge_gateway_configuration.rb +2 -2
- data/lib/vcloud/edge_gateway/firewall_configuration_differ.rb +18 -0
- data/lib/vcloud/edge_gateway/load_balancer_configuration_differ.rb +3 -13
- data/lib/vcloud/edge_gateway/nat_configuration_differ.rb +18 -0
- data/lib/vcloud/edge_gateway/version.rb +1 -1
- data/lib/vcloud/edge_gateway_services.rb +1 -1
- data/spec/integration/edge_gateway/edge_gateway_services_spec.rb +7 -13
- data/spec/integration/edge_gateway/firewall_service_spec.rb +2 -12
- data/spec/integration/edge_gateway/load_balancer_service_spec.rb +4 -4
- data/spec/integration/edge_gateway/nat_service_spec.rb +4 -4
- data/spec/spec_helper.rb +2 -2
- data/spec/vcloud/edge_gateway/configuration_differ_shared_examples.rb +132 -0
- data/spec/vcloud/edge_gateway/configuration_differ_spec.rb +5 -122
- data/spec/vcloud/edge_gateway/configuration_generator/firewall_service_spec.rb +46 -52
- data/spec/vcloud/edge_gateway/firewall_configuration_differ_spec.rb +65 -0
- data/spec/vcloud/edge_gateway/firewall_schema_validation_spec.rb +2 -2
- data/spec/vcloud/edge_gateway/load_balancer_configuration_differ_spec.rb +32 -147
- data/spec/vcloud/edge_gateway/load_balancer_schema_validation_spec.rb +7 -7
- data/spec/vcloud/edge_gateway/nat_configuration_differ_spec.rb +65 -0
- data/spec/vcloud/edge_gateway/nat_schema_validation_spec.rb +4 -4
- data/vcloud-edge_gateway.gemspec +2 -2
- metadata +18 -13
- data/lib/vcloud/config_loader.rb +0 -27
- data/lib/vcloud/config_validator.rb +0 -207
- data/spec/vcloud/config_loader_spec.rb +0 -112
- data/spec/vcloud/config_validator_spec.rb +0 -570
@@ -1,131 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require_relative 'configuration_differ_shared_examples'
|
2
3
|
|
3
4
|
module Vcloud
|
4
5
|
module EdgeGateway
|
5
|
-
describe ConfigurationDiffer do
|
6
|
-
|
7
|
-
test_cases = [
|
8
|
-
{
|
9
|
-
title: 'should return an empty array for two identical empty Hashes',
|
10
|
-
src: { },
|
11
|
-
dest: { },
|
12
|
-
output: [],
|
13
|
-
},
|
14
|
-
|
15
|
-
{
|
16
|
-
title: 'should return an empty array for two identical simple Hashes',
|
17
|
-
src: { testing: 'testing', one: 1, two: 'two', three: "3" },
|
18
|
-
dest: { testing: 'testing', one: 1, two: 'two', three: "3" },
|
19
|
-
output: [],
|
20
|
-
},
|
21
|
-
|
22
|
-
{
|
23
|
-
title: 'should return an empty array for two identical deep Hashes',
|
24
|
-
src: { testing: 'testing', one: 1, deep: [
|
25
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
26
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
27
|
-
]},
|
28
|
-
dest: { testing: 'testing', one: 1, deep: [
|
29
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
30
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
31
|
-
]},
|
32
|
-
output: [],
|
33
|
-
},
|
34
|
-
|
35
|
-
{
|
36
|
-
title: 'should highlight a simple addition',
|
37
|
-
src: { foo: '1' },
|
38
|
-
dest: { foo: '1', bar: '2' },
|
39
|
-
output: [["+", "bar", "2"]],
|
40
|
-
},
|
41
|
-
|
42
|
-
{
|
43
|
-
title: 'should highlight a simple subtraction',
|
44
|
-
src: { foo: '1', bar: '2' },
|
45
|
-
dest: { foo: '1' },
|
46
|
-
output: [["-", "bar", "2"]],
|
47
|
-
},
|
48
|
-
|
49
|
-
{
|
50
|
-
title: 'should highlight a deep addition',
|
51
|
-
src: { testing: 'testing', one: 1, deep: [
|
52
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
53
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
54
|
-
]},
|
55
|
-
dest: { testing: 'testing', one: 1, deep: [
|
56
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5, 6 ] },
|
57
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
58
|
-
]},
|
59
|
-
output: [["+", "deep[0].deeper[5]", 6]],
|
60
|
-
},
|
61
|
-
|
62
|
-
{
|
63
|
-
title: 'should highlight a deep subtraction',
|
64
|
-
src: { testing: 'testing', one: 1, deep: [
|
65
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
66
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
67
|
-
]},
|
68
|
-
dest: { testing: 'testing', one: 1, deep: [
|
69
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
70
|
-
{ baz: 'bop', deeper: [ 6, 5, 3, 2 ] },
|
71
|
-
]},
|
72
|
-
output: [["-", "deep[1].deeper[2]", 4]],
|
73
|
-
},
|
74
6
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
{ deeper: [ 1, 2, 3, 4, 5 ], foo: 'bar' },
|
79
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
80
|
-
]},
|
81
|
-
dest: { testing: 'testing', one: 1, deep: [
|
82
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
83
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
84
|
-
]},
|
85
|
-
output: [],
|
86
|
-
},
|
87
|
-
|
88
|
-
{
|
89
|
-
title: 'should highlight when array elements are reordered',
|
90
|
-
src: { testing: 'testing', one: 1, deep: [
|
91
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
92
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
93
|
-
]},
|
94
|
-
dest: { testing: 'testing', one: 1, deep: [
|
95
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
96
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
97
|
-
]},
|
98
|
-
output: [
|
99
|
-
["+", "deep[0]", {:foo=>"bar", :deeper=>[1, 2, 3, 4, 5]}],
|
100
|
-
["-", "deep[2]", {:foo=>"bar", :deeper=>[1, 2, 3, 4, 5]}],
|
101
|
-
]
|
102
|
-
},
|
103
|
-
|
104
|
-
{
|
105
|
-
title: 'should highlight when deep array elements are reordered',
|
106
|
-
src: { testing: 'testing', one: 1, deep: [
|
107
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
108
|
-
{ baz: 'bop', deeper: [ 5, 6, 4, 3, 2 ] },
|
109
|
-
]},
|
110
|
-
dest: { testing: 'testing', one: 1, deep: [
|
111
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
112
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
113
|
-
]},
|
114
|
-
output: [
|
115
|
-
["+", "deep[1].deeper[0]", 6],
|
116
|
-
["-", "deep[1].deeper[2]", 6]
|
117
|
-
]
|
118
|
-
},
|
119
|
-
|
120
|
-
]
|
121
|
-
|
122
|
-
test_cases.each do |test_case|
|
123
|
-
it "#{test_case[:title]}" do
|
124
|
-
differ = ConfigurationDiffer.new(test_case[:src], test_case[:dest])
|
125
|
-
expect(differ.diff).to eq(test_case[:output])
|
126
|
-
end
|
7
|
+
describe ConfigurationDiffer do
|
8
|
+
it_behaves_like "a configuration differ" do
|
9
|
+
let(:config_differ) { ConfigurationDiffer }
|
127
10
|
end
|
128
|
-
|
129
11
|
end
|
12
|
+
|
130
13
|
end
|
131
14
|
end
|
@@ -66,11 +66,8 @@ module Vcloud
|
|
66
66
|
|
67
67
|
context "firewall config generation" do
|
68
68
|
|
69
|
-
|
70
|
-
|
71
|
-
{
|
72
|
-
title: 'disabled firewall with a disabled rule',
|
73
|
-
input: {
|
69
|
+
it 'should have disabled firewall with a disabled rule' do
|
70
|
+
input = {
|
74
71
|
enabled: 'false',
|
75
72
|
policy: 'allow',
|
76
73
|
log_default_action: 'true',
|
@@ -89,8 +86,8 @@ module Vcloud
|
|
89
86
|
enable_logging: 'true',
|
90
87
|
}
|
91
88
|
]
|
92
|
-
|
93
|
-
|
89
|
+
}
|
90
|
+
output = {
|
94
91
|
IsEnabled: 'false',
|
95
92
|
DefaultAction: "allow",
|
96
93
|
LogDefaultAction: 'true',
|
@@ -111,12 +108,13 @@ module Vcloud
|
|
111
108
|
EnableLogging: 'true',
|
112
109
|
}
|
113
110
|
]
|
114
|
-
|
115
|
-
|
111
|
+
}
|
112
|
+
generated_config = FirewallService.new.generate_fog_config(input)
|
113
|
+
expect(generated_config).to eq(output)
|
114
|
+
end
|
116
115
|
|
117
|
-
|
118
|
-
|
119
|
-
input: {
|
116
|
+
it 'id should be auto generated if not provided' do
|
117
|
+
input = {
|
120
118
|
firewall_rules: [
|
121
119
|
{
|
122
120
|
description: "rule 1",
|
@@ -131,8 +129,8 @@ module Vcloud
|
|
131
129
|
source_ip: "192.0.2.2",
|
132
130
|
}
|
133
131
|
]
|
134
|
-
|
135
|
-
|
132
|
+
}
|
133
|
+
output = {
|
136
134
|
IsEnabled: 'true',
|
137
135
|
DefaultAction: "drop",
|
138
136
|
LogDefaultAction: 'false',
|
@@ -168,12 +166,13 @@ module Vcloud
|
|
168
166
|
EnableLogging: 'false',
|
169
167
|
}
|
170
168
|
]
|
171
|
-
|
172
|
-
|
169
|
+
}
|
170
|
+
generated_config = FirewallService.new.generate_fog_config(input)
|
171
|
+
expect(generated_config).to eq(output)
|
172
|
+
end
|
173
173
|
|
174
|
-
|
175
|
-
|
176
|
-
input: {
|
174
|
+
it 'should send port as -1 if destination/source_port_ranges are ranges' do
|
175
|
+
input = {
|
177
176
|
firewall_rules: [
|
178
177
|
{
|
179
178
|
description: "rule 1",
|
@@ -183,8 +182,8 @@ module Vcloud
|
|
183
182
|
source_ip: "192.0.2.2",
|
184
183
|
}
|
185
184
|
]
|
186
|
-
|
187
|
-
|
185
|
+
}
|
186
|
+
output = {
|
188
187
|
IsEnabled: 'true',
|
189
188
|
DefaultAction: "drop",
|
190
189
|
LogDefaultAction: 'false',
|
@@ -205,12 +204,13 @@ module Vcloud
|
|
205
204
|
EnableLogging: 'false',
|
206
205
|
}
|
207
206
|
]
|
208
|
-
|
209
|
-
|
207
|
+
}
|
208
|
+
generated_config = FirewallService.new.generate_fog_config(input)
|
209
|
+
expect(generated_config).to eq(output)
|
210
|
+
end
|
210
211
|
|
211
|
-
|
212
|
-
|
213
|
-
input: {
|
212
|
+
it 'should send port same as destination/source_port_range if destination/source_port_range are decimals and not ranges' do
|
213
|
+
input = {
|
214
214
|
firewall_rules: [
|
215
215
|
{
|
216
216
|
description: "rule 1",
|
@@ -220,8 +220,8 @@ module Vcloud
|
|
220
220
|
source_ip: "192.0.2.2",
|
221
221
|
}
|
222
222
|
]
|
223
|
-
|
224
|
-
|
223
|
+
}
|
224
|
+
output = {
|
225
225
|
IsEnabled: 'true',
|
226
226
|
DefaultAction: "drop",
|
227
227
|
LogDefaultAction: 'false',
|
@@ -242,12 +242,13 @@ module Vcloud
|
|
242
242
|
EnableLogging: 'false',
|
243
243
|
}
|
244
244
|
]
|
245
|
-
|
246
|
-
|
245
|
+
}
|
246
|
+
generated_config = FirewallService.new.generate_fog_config(input)
|
247
|
+
expect(generated_config).to eq(output)
|
248
|
+
end
|
247
249
|
|
248
|
-
|
249
|
-
|
250
|
-
input: {
|
250
|
+
it 'should handle a rule specifiying "any" protocols' do
|
251
|
+
input = {
|
251
252
|
firewall_rules: [
|
252
253
|
{
|
253
254
|
description: "allow any protocol",
|
@@ -256,8 +257,8 @@ module Vcloud
|
|
256
257
|
source_ip: "192.0.2.2",
|
257
258
|
}
|
258
259
|
]
|
259
|
-
|
260
|
-
|
260
|
+
}
|
261
|
+
output = {
|
261
262
|
IsEnabled: 'true',
|
262
263
|
DefaultAction: "drop",
|
263
264
|
LogDefaultAction: 'false',
|
@@ -278,12 +279,13 @@ module Vcloud
|
|
278
279
|
EnableLogging: 'false',
|
279
280
|
}
|
280
281
|
]
|
281
|
-
|
282
|
-
|
282
|
+
}
|
283
|
+
generated_config = FirewallService.new.generate_fog_config(input)
|
284
|
+
expect(generated_config).to eq(output)
|
285
|
+
end
|
283
286
|
|
284
|
-
|
285
|
-
|
286
|
-
input: {
|
287
|
+
it 'output rule order should be same as the input rule order' do
|
288
|
+
input = {
|
287
289
|
firewall_rules: [
|
288
290
|
{
|
289
291
|
description: "rule 1",
|
@@ -316,8 +318,8 @@ module Vcloud
|
|
316
318
|
source_ip: "Any",
|
317
319
|
},
|
318
320
|
],
|
319
|
-
|
320
|
-
|
321
|
+
}
|
322
|
+
output = {
|
321
323
|
IsEnabled: 'true',
|
322
324
|
DefaultAction: "drop",
|
323
325
|
LogDefaultAction: 'false',
|
@@ -398,17 +400,9 @@ module Vcloud
|
|
398
400
|
EnableLogging: 'false',
|
399
401
|
}
|
400
402
|
]
|
401
|
-
}
|
402
403
|
}
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
test_cases.each do |test_case|
|
407
|
-
it "#{test_case[:title]}" do
|
408
|
-
generated_config = FirewallService.new.generate_fog_config test_case[:input]
|
409
|
-
expect(generated_config).to eq(test_case[:output])
|
410
|
-
end
|
411
|
-
|
404
|
+
generated_config = FirewallService.new.generate_fog_config(input)
|
405
|
+
expect(generated_config).to eq(output)
|
412
406
|
end
|
413
407
|
|
414
408
|
end
|
@@ -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 FirewallConfigurationDiffer do
|
7
|
+
|
8
|
+
it_behaves_like "a configuration differ" do
|
9
|
+
let(:config_differ) { FirewallConfigurationDiffer }
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should ignore Id parameters in FirewallRule sections, when showing additions' do
|
13
|
+
local = { FirewallRule: [
|
14
|
+
{ Id: '1', deeper: [ 1, 2, 3, 4, 5 ] },
|
15
|
+
{ Id: '2', deeper: [ 5, 6, 4, 3, 2 ] },
|
16
|
+
]}
|
17
|
+
remote = { FirewallRule: [
|
18
|
+
{ Id: '1', deeper: [ 1, 1, 1, 1, 1 ] },
|
19
|
+
{ Id: '2', deeper: [ 1, 2, 3, 4, 5 ] },
|
20
|
+
{ Id: '3', deeper: [ 5, 6, 4, 3, 2 ] },
|
21
|
+
]}
|
22
|
+
output = [
|
23
|
+
["+", "FirewallRule[0]", {:deeper=>[1, 1, 1, 1, 1]}]
|
24
|
+
]
|
25
|
+
differ = FirewallConfigurationDiffer.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 = { FirewallRule: [
|
31
|
+
{ Id: '1', deeper: [ 1, 1, 1, 1, 1 ] },
|
32
|
+
{ Id: '2', deeper: [ 1, 2, 3, 4, 5 ] },
|
33
|
+
{ Id: '3', deeper: [ 5, 6, 4, 3, 2 ] },
|
34
|
+
]}
|
35
|
+
remote = { FirewallRule: [
|
36
|
+
{ Id: '1', deeper: [ 1, 2, 3, 4, 5 ] },
|
37
|
+
{ Id: '2', deeper: [ 5, 6, 4, 3, 2 ] },
|
38
|
+
{ Id: '3', deeper: [ 1, 1, 1, 1, 1 ] },
|
39
|
+
]}
|
40
|
+
output = [
|
41
|
+
["-", "FirewallRule[0]", {:deeper=>[1, 1, 1, 1, 1]}],
|
42
|
+
["+", "FirewallRule[2]", {:deeper=>[1, 1, 1, 1, 1]}],
|
43
|
+
]
|
44
|
+
differ = FirewallConfigurationDiffer.new(local, remote)
|
45
|
+
expect(differ.diff).to eq(output)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should not ignore Id parameter outside of a FirewallRule (just in case)' do
|
49
|
+
local = {
|
50
|
+
FirewallRule: [ { Id: '1', deeper: [ 1, 1, 1, 1, 1 ] } ],
|
51
|
+
Id: 'outside of firewall rule'
|
52
|
+
}
|
53
|
+
remote = {
|
54
|
+
FirewallRule: [ { Id: '1', deeper: [ 1, 1, 1, 1, 1 ] } ],
|
55
|
+
}
|
56
|
+
output = [
|
57
|
+
["-", "Id", 'outside of firewall rule']
|
58
|
+
]
|
59
|
+
differ = FirewallConfigurationDiffer.new(local, remote)
|
60
|
+
expect(differ.diff).to eq(output)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -16,7 +16,7 @@ module Vcloud
|
|
16
16
|
]
|
17
17
|
|
18
18
|
}
|
19
|
-
validator = ConfigValidator.validate(:base, config, Schema::FIREWALL_SERVICE)
|
19
|
+
validator = Vcloud::Core::ConfigValidator.validate(:base, config, Schema::FIREWALL_SERVICE)
|
20
20
|
expect(validator.valid?).to be_false
|
21
21
|
expect(validator.errors).to eq([
|
22
22
|
"source_ip: 192.0 is not a valid IP address range. Valid values can be IP address, CIDR, IP range, 'Any','internal' and 'external'.",
|
@@ -37,7 +37,7 @@ module Vcloud
|
|
37
37
|
]
|
38
38
|
|
39
39
|
}
|
40
|
-
validator = ConfigValidator.validate(:base, config, Schema::FIREWALL_SERVICE)
|
40
|
+
validator = Vcloud::Core::ConfigValidator.validate(:base, config, Schema::FIREWALL_SERVICE)
|
41
41
|
expect(validator.valid?).to be_true
|
42
42
|
end
|
43
43
|
end
|
@@ -1,158 +1,43 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require_relative 'configuration_differ_shared_examples.rb'
|
2
3
|
|
3
4
|
module Vcloud
|
4
5
|
module EdgeGateway
|
5
6
|
describe LoadBalancerConfigurationDiffer do
|
6
7
|
|
7
|
-
|
8
|
-
{
|
9
|
-
|
10
|
-
src: { },
|
11
|
-
dest: { },
|
12
|
-
output: [],
|
13
|
-
},
|
14
|
-
|
15
|
-
{
|
16
|
-
title: 'should return an empty array for two identical simple Hashes',
|
17
|
-
src: { testing: 'testing', one: 1, two: 'two', three: "3" },
|
18
|
-
dest: { testing: 'testing', one: 1, two: 'two', three: "3" },
|
19
|
-
output: [],
|
20
|
-
},
|
21
|
-
|
22
|
-
{
|
23
|
-
title: 'should return an empty array for two identical deep Hashes',
|
24
|
-
src: { testing: 'testing', one: 1, deep: [
|
25
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
26
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
27
|
-
]},
|
28
|
-
dest: { testing: 'testing', one: 1, deep: [
|
29
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
30
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
31
|
-
]},
|
32
|
-
output: [],
|
33
|
-
},
|
34
|
-
|
35
|
-
{
|
36
|
-
title: 'should highlight a simple addition',
|
37
|
-
src: { foo: '1' },
|
38
|
-
dest: { foo: '1', bar: '2' },
|
39
|
-
output: [["+", "bar", "2"]],
|
40
|
-
},
|
41
|
-
|
42
|
-
{
|
43
|
-
title: 'should highlight a simple subtraction',
|
44
|
-
src: { foo: '1', bar: '2' },
|
45
|
-
dest: { foo: '1' },
|
46
|
-
output: [["-", "bar", "2"]],
|
47
|
-
},
|
48
|
-
|
49
|
-
{
|
50
|
-
title: 'should highlight a deep addition',
|
51
|
-
src: { testing: 'testing', one: 1, deep: [
|
52
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
53
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
54
|
-
]},
|
55
|
-
dest: { testing: 'testing', one: 1, deep: [
|
56
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5, 6 ] },
|
57
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
58
|
-
]},
|
59
|
-
output: [["+", "deep[0].deeper[5]", 6]],
|
60
|
-
},
|
61
|
-
|
62
|
-
{
|
63
|
-
title: 'should highlight a deep subtraction',
|
64
|
-
src: { testing: 'testing', one: 1, deep: [
|
65
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
66
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
67
|
-
]},
|
68
|
-
dest: { testing: 'testing', one: 1, deep: [
|
69
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
70
|
-
{ baz: 'bop', deeper: [ 6, 5, 3, 2 ] },
|
71
|
-
]},
|
72
|
-
output: [["-", "deep[1].deeper[2]", 4]],
|
73
|
-
},
|
74
|
-
|
75
|
-
{
|
76
|
-
title: 'should return an empty array when hash params are reordered',
|
77
|
-
src: { one: 1, testing: 'testing', deep: [
|
78
|
-
{ deeper: [ 1, 2, 3, 4, 5 ], foo: 'bar' },
|
79
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
80
|
-
]},
|
81
|
-
dest: { testing: 'testing', one: 1, deep: [
|
82
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
83
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
84
|
-
]},
|
85
|
-
output: [],
|
86
|
-
},
|
87
|
-
|
88
|
-
{
|
89
|
-
title: 'should highlight when array elements are reordered',
|
90
|
-
src: { testing: 'testing', one: 1, deep: [
|
91
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
92
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
93
|
-
]},
|
94
|
-
dest: { testing: 'testing', one: 1, deep: [
|
95
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
96
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
97
|
-
]},
|
98
|
-
output: [
|
99
|
-
["+", "deep[0]", {:foo=>"bar", :deeper=>[1, 2, 3, 4, 5]}],
|
100
|
-
["-", "deep[2]", {:foo=>"bar", :deeper=>[1, 2, 3, 4, 5]}],
|
101
|
-
]
|
102
|
-
},
|
103
|
-
|
104
|
-
{
|
105
|
-
title: 'should highlight when deep array elements are reordered',
|
106
|
-
src: { testing: 'testing', one: 1, deep: [
|
107
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
108
|
-
{ baz: 'bop', deeper: [ 5, 6, 4, 3, 2 ] },
|
109
|
-
]},
|
110
|
-
dest: { testing: 'testing', one: 1, deep: [
|
111
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
112
|
-
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
113
|
-
]},
|
114
|
-
output: [
|
115
|
-
["+", "deep[1].deeper[0]", 6],
|
116
|
-
["-", "deep[1].deeper[2]", 6]
|
117
|
-
]
|
118
|
-
},
|
119
|
-
|
120
|
-
{
|
121
|
-
title: 'should ignore remote config having additional :Operational keys in :Pool entries',
|
122
|
-
src: { Pool: [
|
123
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
124
|
-
{ baz: 'bop', deeper: [ 5, 6, 4, 3, 2 ] },
|
125
|
-
]},
|
126
|
-
dest: { Pool: [
|
127
|
-
{ foo: 'bar', Operational: 'wibble', deeper: [ 1, 2, 3, 4, 5 ] },
|
128
|
-
{ baz: 'bop', Operational: 'wobble', deeper: [ 5, 6, 4, 3, 2 ] },
|
129
|
-
]},
|
130
|
-
output: []
|
131
|
-
},
|
132
|
-
|
133
|
-
{
|
134
|
-
title: 'should ignore remote config having additional :Operational keys in :Pool entries, yet still report other differences ',
|
135
|
-
src: { Pool: [
|
136
|
-
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
137
|
-
{ baz: 'bop', deeper: [ 5, 6, 4, 3, 2 ] },
|
138
|
-
]},
|
139
|
-
dest: { Pool: [
|
140
|
-
{ foo: 'bar', Operational: 'wibble', deeper: [ 1, 2, 3, 4, 5 ] },
|
141
|
-
{ baz: 'bop', Operational: 'wobble', deeper: [ 6, 5, 4, 3, 2 ] },
|
142
|
-
]},
|
143
|
-
output: [
|
144
|
-
["+", "Pool[1].deeper[0]", 6],
|
145
|
-
["-", "Pool[1].deeper[2]", 6]
|
146
|
-
]
|
147
|
-
},
|
8
|
+
it_behaves_like "a configuration differ" do
|
9
|
+
let(:config_differ) { LoadBalancerConfigurationDiffer }
|
10
|
+
end
|
148
11
|
|
149
|
-
|
12
|
+
it 'should ignore remote config having additional :Operational keys in :Pool entries' do
|
13
|
+
local = { Pool: [
|
14
|
+
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
15
|
+
{ baz: 'bop', deeper: [ 5, 6, 4, 3, 2 ] },
|
16
|
+
]}
|
17
|
+
remote = { Pool: [
|
18
|
+
{ foo: 'bar', Operational: 'wibble', deeper: [ 1, 2, 3, 4, 5 ] },
|
19
|
+
{ baz: 'bop', Operational: 'wobble', deeper: [ 5, 6, 4, 3, 2 ] },
|
20
|
+
]}
|
21
|
+
output = []
|
22
|
+
differ = LoadBalancerConfigurationDiffer.new(local, remote)
|
23
|
+
expect(differ.diff).to eq(output)
|
24
|
+
end
|
150
25
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
26
|
+
it 'should ignore remote config having additional :Operational keys in :Pool entries, yet still report other differences' do
|
27
|
+
local = { Pool: [
|
28
|
+
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
29
|
+
{ baz: 'bop', deeper: [ 5, 6, 4, 3, 2 ] },
|
30
|
+
]}
|
31
|
+
remote = { Pool: [
|
32
|
+
{ foo: 'bar', Operational: 'wibble', deeper: [ 1, 2, 3, 4, 5 ] },
|
33
|
+
{ baz: 'bop', Operational: 'wobble', deeper: [ 6, 5, 4, 3, 2 ] },
|
34
|
+
]}
|
35
|
+
output = [
|
36
|
+
["+", "Pool[1].deeper[0]", 6],
|
37
|
+
["-", "Pool[1].deeper[2]", 6]
|
38
|
+
]
|
39
|
+
differ = LoadBalancerConfigurationDiffer.new(local, remote)
|
40
|
+
expect(differ.diff).to eq(output)
|
156
41
|
end
|
157
42
|
|
158
43
|
end
|