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
data/lib/vcloud/edge_gateway.rb
CHANGED
@@ -3,9 +3,6 @@ require 'vcloud/edge_gateway/version'
|
|
3
3
|
require 'vcloud/core'
|
4
4
|
require 'vcloud/fog'
|
5
5
|
|
6
|
-
require 'vcloud/config_loader'
|
7
|
-
require 'vcloud/config_validator'
|
8
|
-
|
9
6
|
require 'vcloud/edge_gateway_services'
|
10
7
|
|
11
8
|
require 'vcloud/schema/nat_service'
|
@@ -18,6 +15,8 @@ require 'vcloud/edge_gateway/configuration_generator/firewall_service'
|
|
18
15
|
require 'vcloud/edge_gateway/configuration_generator/nat_service'
|
19
16
|
require 'vcloud/edge_gateway/configuration_generator/load_balancer_service'
|
20
17
|
require 'vcloud/edge_gateway/configuration_differ'
|
18
|
+
require 'vcloud/edge_gateway/nat_configuration_differ'
|
19
|
+
require 'vcloud/edge_gateway/firewall_configuration_differ'
|
21
20
|
require 'vcloud/edge_gateway/load_balancer_configuration_differ'
|
22
21
|
require 'vcloud/edge_gateway/edge_gateway_configuration'
|
23
22
|
|
@@ -8,7 +8,19 @@ module Vcloud
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def diff
|
11
|
-
(
|
11
|
+
( stripped_local_config == stripped_remote_config ) ? [] : HashDiff.diff(stripped_local_config, stripped_remote_config)
|
12
|
+
end
|
13
|
+
|
14
|
+
def stripped_local_config
|
15
|
+
strip_fields_for_differ_to_ignore(@local) unless @local.nil?
|
16
|
+
end
|
17
|
+
|
18
|
+
def stripped_remote_config
|
19
|
+
strip_fields_for_differ_to_ignore(@remote) unless @remote.nil?
|
20
|
+
end
|
21
|
+
|
22
|
+
def strip_fields_for_differ_to_ignore(config)
|
23
|
+
config
|
12
24
|
end
|
13
25
|
|
14
26
|
end
|
@@ -19,16 +19,16 @@ module Vcloud
|
|
19
19
|
|
20
20
|
def populate_nat_rules
|
21
21
|
rules = @input_config[:nat_rules]
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
22
|
+
i = ID_RANGES::NAT_SERVICE[:min]
|
23
|
+
rules.collect do |rule|
|
24
|
+
new_rule = {}
|
25
|
+
new_rule[:Id] = rule.key?(:id) ? rule[:id] : i.to_s
|
26
|
+
new_rule[:IsEnabled] = rule.key?(:enabled) ? rule[:enabled].to_s : 'true'
|
27
|
+
new_rule[:RuleType] = rule[:rule_type]
|
28
|
+
gateway_nat_rule = populate_gateway_nat_rule(rule)
|
29
|
+
new_rule[:GatewayNatRule] = gateway_nat_rule
|
30
|
+
i += 1
|
31
|
+
new_rule
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
@@ -15,7 +15,7 @@ module Vcloud
|
|
15
15
|
|
16
16
|
firewall_service_config = EdgeGateway::ConfigurationGenerator::FirewallService.new.generate_fog_config(@local_config[:firewall_service])
|
17
17
|
unless firewall_service_config.nil?
|
18
|
-
differ = EdgeGateway::
|
18
|
+
differ = EdgeGateway::FirewallConfigurationDiffer.new(firewall_service_config, @remote_config[:FirewallService])
|
19
19
|
unless differ.diff.empty?
|
20
20
|
@config[:FirewallService] = firewall_service_config
|
21
21
|
@update_required = true
|
@@ -28,7 +28,7 @@ module Vcloud
|
|
28
28
|
).generate_fog_config
|
29
29
|
|
30
30
|
unless nat_service_config.nil?
|
31
|
-
differ = EdgeGateway::
|
31
|
+
differ = EdgeGateway::NatConfigurationDiffer.new(nat_service_config, @remote_config[:NatService])
|
32
32
|
unless differ.diff.empty?
|
33
33
|
@config[:NatService] = nat_service_config
|
34
34
|
@update_required = true
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Vcloud
|
2
|
+
module EdgeGateway
|
3
|
+
class FirewallConfigurationDiffer < ConfigurationDiffer
|
4
|
+
|
5
|
+
def strip_fields_for_differ_to_ignore(config)
|
6
|
+
deep_cloned_config = Marshal.load( Marshal.dump(config) )
|
7
|
+
if deep_cloned_config.key?(:FirewallRule)
|
8
|
+
deep_cloned_config[:FirewallRule].each do |firewall_rule|
|
9
|
+
firewall_rule.delete(:Id)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
deep_cloned_config
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -1,19 +1,9 @@
|
|
1
1
|
module Vcloud
|
2
2
|
module EdgeGateway
|
3
|
-
class LoadBalancerConfigurationDiffer
|
3
|
+
class LoadBalancerConfigurationDiffer < ConfigurationDiffer
|
4
4
|
|
5
|
-
def
|
6
|
-
|
7
|
-
@remote = remote
|
8
|
-
end
|
9
|
-
|
10
|
-
def diff
|
11
|
-
( @local == stripped_remote_config ) ? [] : HashDiff.diff(@local, stripped_remote_config)
|
12
|
-
end
|
13
|
-
|
14
|
-
def stripped_remote_config
|
15
|
-
return nil if @remote.nil?
|
16
|
-
deep_cloned_remote_config = Marshal.load( Marshal.dump(@remote) )
|
5
|
+
def strip_fields_for_differ_to_ignore(config)
|
6
|
+
deep_cloned_remote_config = Marshal.load( Marshal.dump(config) )
|
17
7
|
if deep_cloned_remote_config.key?(:Pool)
|
18
8
|
deep_cloned_remote_config[:Pool].each do |pool_entry|
|
19
9
|
pool_entry.delete(:Operational)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Vcloud
|
2
|
+
module EdgeGateway
|
3
|
+
class NatConfigurationDiffer < ConfigurationDiffer
|
4
|
+
|
5
|
+
def strip_fields_for_differ_to_ignore(config)
|
6
|
+
deep_cloned_config = Marshal.load( Marshal.dump(config) )
|
7
|
+
if deep_cloned_config.key?(:NatRule)
|
8
|
+
deep_cloned_config[:NatRule].each do |nat_rule|
|
9
|
+
nat_rule.delete(:Id)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
deep_cloned_config
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -49,13 +49,6 @@ module Vcloud
|
|
49
49
|
|
50
50
|
context "Check update is functional" do
|
51
51
|
|
52
|
-
before(:all) do
|
53
|
-
local_config = ConfigLoader.new.load_config(
|
54
|
-
@initial_config_file,
|
55
|
-
Vcloud::Schema::EDGE_GATEWAY_SERVICES
|
56
|
-
)
|
57
|
-
end
|
58
|
-
|
59
52
|
it "should be starting our tests from an empty EdgeGateway" do
|
60
53
|
remote_vcloud_config = @edge_gateway.vcloud_attributes[:Configuration][:EdgeGatewayServiceConfiguration]
|
61
54
|
expect(remote_vcloud_config[:FirewallService][:FirewallRule].empty?).to be_true
|
@@ -65,7 +58,7 @@ module Vcloud
|
|
65
58
|
end
|
66
59
|
|
67
60
|
it "should only create one edgeGateway update task when updating the configuration" do
|
68
|
-
start_time =
|
61
|
+
start_time = Time.now.getutc
|
69
62
|
task_list_before_update = get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(start_time)
|
70
63
|
EdgeGatewayServices.new.update(@initial_config_file)
|
71
64
|
task_list_after_update = get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(start_time)
|
@@ -81,7 +74,7 @@ module Vcloud
|
|
81
74
|
end
|
82
75
|
|
83
76
|
it "should not update the EdgeGateway again if the config hasn't changed" do
|
84
|
-
start_time =
|
77
|
+
start_time = Time.now.getutc
|
85
78
|
task_list_before_update = get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(start_time)
|
86
79
|
EdgeGatewayServices.new.update(@initial_config_file)
|
87
80
|
task_list_after_update = get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(start_time)
|
@@ -89,7 +82,7 @@ module Vcloud
|
|
89
82
|
end
|
90
83
|
|
91
84
|
it "should only create one additional edgeGateway update task when adding the LoadBalancer config" do
|
92
|
-
start_time =
|
85
|
+
start_time = Time.now.getutc
|
93
86
|
task_list_before_update = get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(start_time)
|
94
87
|
EdgeGatewayServices.new.update(@adding_load_balancer_config_file)
|
95
88
|
task_list_after_update = get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(start_time)
|
@@ -97,7 +90,7 @@ module Vcloud
|
|
97
90
|
end
|
98
91
|
|
99
92
|
it "should not update the EdgeGateway again if we reapply the 'adding load balancer' config" do
|
100
|
-
start_time =
|
93
|
+
start_time = Time.now.getutc
|
101
94
|
task_list_before_update = get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(start_time)
|
102
95
|
EdgeGatewayServices.new.update(@adding_load_balancer_config_file)
|
103
96
|
task_list_after_update = get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(start_time)
|
@@ -147,12 +140,13 @@ module Vcloud
|
|
147
140
|
|
148
141
|
def get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(timestamp)
|
149
142
|
vcloud_time = timestamp.strftime('%FT%T.000Z')
|
150
|
-
q =
|
143
|
+
q = QueryRunner.new
|
144
|
+
|
145
|
+
q.run('task',
|
151
146
|
:filter =>
|
152
147
|
"name==networkConfigureEdgeGatewayServices;objectName==#{@edge_name};startDate=ge=#{vcloud_time}",
|
153
148
|
:sortDesc => 'startDate',
|
154
149
|
)
|
155
|
-
q.get_all_results
|
156
150
|
end
|
157
151
|
|
158
152
|
end
|
@@ -41,20 +41,10 @@ module Vcloud
|
|
41
41
|
@firewall_service = {}
|
42
42
|
end
|
43
43
|
|
44
|
-
context "Check input schema checking is working" do
|
45
|
-
|
46
|
-
it "should raise exception if input yaml does not match with schema" do
|
47
|
-
config_yaml = File.expand_path('data/incorrect_firewall_config.yaml', File.dirname(__FILE__))
|
48
|
-
expect(Vcloud::EdgeGateway.logger).to receive(:fatal)
|
49
|
-
expect { EdgeGatewayServices.new.update(config_yaml) }.to raise_error('Supplied configuration does not match supplied schema')
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
44
|
context "Check update is functional" do
|
55
45
|
|
56
46
|
before(:all) do
|
57
|
-
local_config = ConfigLoader.new.load_config(@initial_firewall_config_file, Vcloud::Schema::EDGE_GATEWAY_SERVICES)
|
47
|
+
local_config = Core::ConfigLoader.new.load_config(@initial_firewall_config_file, Vcloud::Schema::EDGE_GATEWAY_SERVICES)
|
58
48
|
@local_vcloud_config = EdgeGateway::ConfigurationGenerator::FirewallService.new.generate_fog_config(local_config[:firewall_service])
|
59
49
|
end
|
60
50
|
|
@@ -94,7 +84,7 @@ module Vcloud
|
|
94
84
|
it "should highlight a difference if local firewall config has been updated" do
|
95
85
|
input_config_file = generate_input_config_file('firewall_config_updated_rule.yaml.erb', edge_gateway_erb_input)
|
96
86
|
|
97
|
-
local_config = ConfigLoader.new.load_config(input_config_file, Vcloud::Schema::EDGE_GATEWAY_SERVICES)
|
87
|
+
local_config = Core::ConfigLoader.new.load_config(input_config_file, Vcloud::Schema::EDGE_GATEWAY_SERVICES)
|
98
88
|
local_firewall_config = EdgeGateway::ConfigurationGenerator::FirewallService.new.generate_fog_config(local_config[:firewall_service])
|
99
89
|
|
100
90
|
edge_gateway = Core::EdgeGateway.get_by_name local_config[:gateway]
|
@@ -44,7 +44,7 @@ module Vcloud
|
|
44
44
|
context "Check update is functional" do
|
45
45
|
|
46
46
|
before(:all) do
|
47
|
-
local_config = ConfigLoader.new.load_config(
|
47
|
+
local_config = Core::ConfigLoader.new.load_config(
|
48
48
|
@initial_load_balancer_config_file,
|
49
49
|
Vcloud::Schema::EDGE_GATEWAY_SERVICES
|
50
50
|
)
|
@@ -61,7 +61,7 @@ module Vcloud
|
|
61
61
|
end
|
62
62
|
|
63
63
|
it "should only make one EdgeGateway update task, to minimise EdgeGateway reload events" do
|
64
|
-
start_time =
|
64
|
+
start_time = Time.now.getutc
|
65
65
|
task_list_before_update = get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(start_time)
|
66
66
|
EdgeGatewayServices.new.update(@initial_load_balancer_config_file)
|
67
67
|
task_list_after_update = get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(start_time)
|
@@ -190,12 +190,12 @@ module Vcloud
|
|
190
190
|
|
191
191
|
def get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(timestamp)
|
192
192
|
vcloud_time = timestamp.strftime('%FT%T.000Z')
|
193
|
-
q =
|
193
|
+
q = QueryRunner.new
|
194
|
+
q.run('task',
|
194
195
|
:filter =>
|
195
196
|
"name==networkConfigureEdgeGatewayServices;objectName==#{@edge_name};startDate=ge=#{vcloud_time}",
|
196
197
|
:sortDesc => 'startDate',
|
197
198
|
)
|
198
|
-
q.get_all_results
|
199
199
|
end
|
200
200
|
|
201
201
|
end
|
@@ -49,7 +49,7 @@ module Vcloud
|
|
49
49
|
context "Check update is functional" do
|
50
50
|
|
51
51
|
before(:all) do
|
52
|
-
local_config = ConfigLoader.new.load_config(
|
52
|
+
local_config = Core::ConfigLoader.new.load_config(
|
53
53
|
@initial_nat_config_file, Vcloud::Schema::EDGE_GATEWAY_SERVICES
|
54
54
|
)
|
55
55
|
@local_vcloud_config = EdgeGateway::ConfigurationGenerator::NatService.new(
|
@@ -64,7 +64,7 @@ module Vcloud
|
|
64
64
|
end
|
65
65
|
|
66
66
|
it "should only make one EdgeGateway update task, to minimise EdgeGateway reload events" do
|
67
|
-
start_time =
|
67
|
+
start_time = Time.now.getutc
|
68
68
|
task_list_before_update = get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(start_time)
|
69
69
|
EdgeGatewayServices.new.update(@initial_nat_config_file)
|
70
70
|
task_list_after_update = get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(start_time)
|
@@ -200,11 +200,11 @@ module Vcloud
|
|
200
200
|
|
201
201
|
def get_all_edge_gateway_update_tasks_ordered_by_start_date_since_time(timestamp)
|
202
202
|
vcloud_time = timestamp.strftime('%FT%T.000Z')
|
203
|
-
q =
|
203
|
+
q = QueryRunner.new
|
204
|
+
q.run('task',
|
204
205
|
:filter => "name==networkConfigureEdgeGatewayServices;objectName==#{@edge_name};startDate=ge=#{vcloud_time}",
|
205
206
|
:sortDesc => 'startDate',
|
206
207
|
)
|
207
|
-
q.get_all_results
|
208
208
|
end
|
209
209
|
|
210
210
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -18,9 +18,9 @@ require 'vcloud/edge_gateway'
|
|
18
18
|
SimpleCov.at_exit do
|
19
19
|
SimpleCov.result.format!
|
20
20
|
# do not change the coverage percentage, instead add more unit tests to fix coverage failures.
|
21
|
-
if SimpleCov.result.covered_percent <
|
21
|
+
if SimpleCov.result.covered_percent < 90
|
22
22
|
print "ERROR::BAD_COVERAGE\n"
|
23
|
-
print "Coverage is less than acceptable limit(
|
23
|
+
print "Coverage is less than acceptable limit(90%). Please add more tests to improve the coverage\n"
|
24
24
|
exit(1)
|
25
25
|
end
|
26
26
|
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
module Vcloud
|
2
|
+
module EdgeGateway
|
3
|
+
|
4
|
+
shared_examples "a configuration differ" do
|
5
|
+
|
6
|
+
let(:config_differ) { described_class }
|
7
|
+
|
8
|
+
it 'should return an empty array for two identical empty Hashes' do
|
9
|
+
local = { }
|
10
|
+
remote = { }
|
11
|
+
output = []
|
12
|
+
differ = config_differ.new(local, remote)
|
13
|
+
expect(differ.diff).to eq(output)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should return an empty array for two identical simple Hashes' do
|
17
|
+
local = { testing: 'testing', one: 1, two: 'two', three: "3" }
|
18
|
+
remote = { testing: 'testing', one: 1, two: 'two', three: "3" }
|
19
|
+
output = []
|
20
|
+
differ = config_differ.new(local, remote)
|
21
|
+
expect(differ.diff).to eq(output)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should return an empty array for two identical deep Hashes' do
|
25
|
+
local = { testing: 'testing', one: 1, deep: [
|
26
|
+
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
27
|
+
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
28
|
+
]}
|
29
|
+
remote = { testing: 'testing', one: 1, deep: [
|
30
|
+
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
31
|
+
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
32
|
+
]}
|
33
|
+
output = []
|
34
|
+
differ = config_differ.new(local, remote)
|
35
|
+
expect(differ.diff).to eq(output)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should highlight a simple addition' do
|
39
|
+
local = { foo: '1' }
|
40
|
+
remote = { foo: '1', bar: '2' }
|
41
|
+
output = [["+", "bar", "2"]]
|
42
|
+
differ = config_differ.new(local, remote)
|
43
|
+
expect(differ.diff).to eq(output)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should highlight a simple subtraction' do
|
47
|
+
local = { foo: '1', bar: '2' }
|
48
|
+
remote = { foo: '1' }
|
49
|
+
output = [["-", "bar", "2"]]
|
50
|
+
differ = config_differ.new(local, remote)
|
51
|
+
expect(differ.diff).to eq(output)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should highlight a deep addition' do
|
55
|
+
local = { testing: 'testing', one: 1, deep: [
|
56
|
+
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
57
|
+
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
58
|
+
]}
|
59
|
+
remote = { testing: 'testing', one: 1, deep: [
|
60
|
+
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5, 6 ] },
|
61
|
+
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
62
|
+
]}
|
63
|
+
output = [["+", "deep[0].deeper[5]", 6]]
|
64
|
+
differ = config_differ.new(local, remote)
|
65
|
+
expect(differ.diff).to eq(output)
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should highlight a deep subtraction' do
|
69
|
+
local = { testing: 'testing', one: 1, deep: [
|
70
|
+
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
71
|
+
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
72
|
+
]}
|
73
|
+
remote = { testing: 'testing', one: 1, deep: [
|
74
|
+
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
75
|
+
{ baz: 'bop', deeper: [ 6, 5, 3, 2 ] },
|
76
|
+
]}
|
77
|
+
output = [["-", "deep[1].deeper[2]", 4]]
|
78
|
+
differ = config_differ.new(local, remote)
|
79
|
+
expect(differ.diff).to eq(output)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should return an empty array when hash params are reordered' do
|
83
|
+
local = { one: 1, testing: 'testing', deep: [
|
84
|
+
{ deeper: [ 1, 2, 3, 4, 5 ], foo: 'bar' },
|
85
|
+
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
86
|
+
]}
|
87
|
+
remote = { testing: 'testing', one: 1, deep: [
|
88
|
+
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
89
|
+
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
90
|
+
]}
|
91
|
+
output = []
|
92
|
+
differ = config_differ.new(local, remote)
|
93
|
+
expect(differ.diff).to eq(output)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should highlight when array elements are reordered' do
|
97
|
+
local = { testing: 'testing', one: 1, deep: [
|
98
|
+
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
99
|
+
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
100
|
+
]}
|
101
|
+
remote = { testing: 'testing', one: 1, deep: [
|
102
|
+
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
103
|
+
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
104
|
+
]}
|
105
|
+
output = [
|
106
|
+
["+", "deep[0]", {:foo=>"bar", :deeper=>[1, 2, 3, 4, 5]}],
|
107
|
+
["-", "deep[2]", {:foo=>"bar", :deeper=>[1, 2, 3, 4, 5]}],
|
108
|
+
]
|
109
|
+
differ = config_differ.new(local, remote)
|
110
|
+
expect(differ.diff).to eq(output)
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should highlight when deep array elements are reordered' do
|
114
|
+
local = { testing: 'testing', one: 1, deep: [
|
115
|
+
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
116
|
+
{ baz: 'bop', deeper: [ 5, 6, 4, 3, 2 ] },
|
117
|
+
]}
|
118
|
+
remote = { testing: 'testing', one: 1, deep: [
|
119
|
+
{ foo: 'bar', deeper: [ 1, 2, 3, 4, 5 ] },
|
120
|
+
{ baz: 'bop', deeper: [ 6, 5, 4, 3, 2 ] },
|
121
|
+
]}
|
122
|
+
output = [
|
123
|
+
["+", "deep[1].deeper[0]", 6],
|
124
|
+
["-", "deep[1].deeper[2]", 6]
|
125
|
+
]
|
126
|
+
differ = config_differ.new(local, remote)
|
127
|
+
expect(differ.diff).to eq(output)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
end
|