smart_proxy_efficient_ip 0.0.12

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/test/api_test.rb ADDED
@@ -0,0 +1,179 @@
1
+ require 'test_helper'
2
+ require 'SOLIDserver'
3
+ require 'smart_proxy_efficient_ip/api'
4
+
5
+ class ApiTest < Test::Unit::TestCase
6
+ def setup
7
+ @connection = ::SOLIDserver::SOLIDserver.new('10.10.10.10', 'username', 'password')
8
+ @api = ::Proxy::DHCP::EfficientIp::Api.new(@connection)
9
+ end
10
+
11
+ def test_find_subnet
12
+ network_address = '192.168.45.0'
13
+ subnet = { 'subnet_id' => '142', 'subnet_size' => '256' }
14
+ server_response = stub(body: [subnet].to_json)
15
+
16
+ @connection
17
+ .expects(:ip_subnet_list)
18
+ .with(where: "start_hostaddr='#{network_address}' and is_terminal='1'", limit: 1)
19
+ .returns(server_response)
20
+
21
+ assert_equal @api.find_subnet(network_address), subnet
22
+ end
23
+
24
+ def test_find_subnets
25
+ subnets = [
26
+ { 'subnet_id' => '142', 'subnet_size' => '256' },
27
+ { 'subnet_id' => '182', 'subnet_size' => '256' },
28
+ { 'subnet_id' => '108', 'subnet_size' => '256' },
29
+ ]
30
+ server_response = stub(body: subnets.to_json)
31
+
32
+ @connection
33
+ .expects(:ip_subnet_list)
34
+ .with(where: "is_terminal='1' and start_hostaddr!='0.0.0.0'")
35
+ .returns(server_response)
36
+
37
+ assert_equal @api.subnets, subnets
38
+ end
39
+
40
+ def test_find_free
41
+ network_address = '192.168.45.0'
42
+ start_ip = '192.168.45.5'
43
+ end_ip = '192.168.45.25'
44
+ subnet = { 'subnet_id' => '142', 'subnet_size' => '256' }
45
+ free_address = { 'hostaddr' => '192.168.45.11' }
46
+ subnet_response = stub(body: [subnet].to_json)
47
+ server_response = stub(body: [free_address].to_json)
48
+
49
+ @connection
50
+ .expects(:ip_subnet_list)
51
+ .with(where: "start_hostaddr='#{network_address}' and is_terminal='1'", limit: 1)
52
+ .returns(subnet_response)
53
+ @connection
54
+ .expects(:ip_address_find_free)
55
+ .with(subnet_id: subnet['subnet_id'], begin_addr: start_ip, end_addr: end_ip, max_find: 1)
56
+ .returns(server_response)
57
+
58
+ assert_equal @api.find_free(network_address, start_ip, end_ip), free_address
59
+ end
60
+
61
+ def test_find_record
62
+ address = '192.168.45.92'
63
+ record = { 'name' => 'Vincent', 'hostaddr' => address }
64
+ server_response = stub(body: [record].to_json)
65
+
66
+ @connection
67
+ .expects(:ip_address_list)
68
+ .with(where: "type='ip' and (hostaddr='#{address}' or mac_addr='#{address}')", limit: 1)
69
+ .returns(server_response)
70
+
71
+ assert_equal @api.find_record(address), record
72
+ end
73
+
74
+ def test_find_records
75
+ address = '192.168.45.92'
76
+ records = [
77
+ { 'name' => 'Vincent', 'hostaddr' => address },
78
+ { 'name' => 'Tom', 'hostaddr' => address },
79
+ ]
80
+ server_response = stub(body: records.to_json)
81
+
82
+ @connection
83
+ .expects(:ip_address_list)
84
+ .with(where: "type='ip' and (hostaddr='#{address}' or mac_addr='#{address}')")
85
+ .returns(server_response)
86
+
87
+ assert_equal @api.find_records(address), records
88
+ end
89
+
90
+ def test_hosts
91
+ network_address = '192.168.45.0'
92
+ hosts = [
93
+ { 'name' => 'Vincent', 'hostaddr' => '192.168.45.101' },
94
+ { 'name' => 'Tom', 'hostaddr' => '192.168.45.94' },
95
+ ]
96
+ subnet = { 'subnet_id' => '192', 'subnet_size' => '256', 'start_hostaddr' => network_address }
97
+ subnet_response = stub(body: [subnet].to_json)
98
+ server_response = stub(body: hosts.to_json)
99
+
100
+ @connection
101
+ .expects(:ip_subnet_list)
102
+ .with(where: "start_hostaddr='#{network_address}' and is_terminal='1'", limit: 1)
103
+ .returns(subnet_response)
104
+ @connection
105
+ .expects(:ip_address_list)
106
+ .with(where: "subnet_id=#{subnet['subnet_id']} and dhcphost_id > 0")
107
+ .returns(server_response)
108
+
109
+ assert_equal @api.hosts(network_address), hosts
110
+ end
111
+
112
+ def test_leases
113
+ network_address = '192.168.47.0'
114
+ addresses = [
115
+ { 'dhcplease_id' => '78' },
116
+ { 'dhcplease_id' => '21' },
117
+ ]
118
+ leases = [
119
+ { 'dhcplease_id' => '78', 'dhcplease_name' => 'ABC' },
120
+ { 'dhcplease_id' => '21', 'dhcplease_name' => 'CBD' },
121
+ ]
122
+ subnet = { 'subnet_id' => '192', 'subnet_size' => '256', 'start_hostaddr' => network_address }
123
+ subnet_response = stub(body: [subnet].to_json)
124
+ server_response = stub(body: addresses.to_json)
125
+ leases_resposne = stub(body: leases.to_json)
126
+ ids = addresses.map { |addr| addr['dhcplease_id'] }
127
+
128
+ @connection
129
+ .expects(:ip_subnet_list)
130
+ .with(where: "start_hostaddr='#{network_address}' and is_terminal='1'", limit: 1)
131
+ .returns(subnet_response)
132
+ @connection
133
+ .expects(:ip_address_list)
134
+ .with(where: "subnet_id=#{subnet['subnet_id']} and dhcplease_id > 0")
135
+ .returns(server_response)
136
+ @connection
137
+ .expects(:dhcp_lease_list)
138
+ .with(where: "dhcplease_id IN (#{ids})")
139
+ .returns(leases_resposne)
140
+
141
+ assert_equal @api.leases(network_address), leases
142
+ end
143
+
144
+ def test_add_record
145
+ network_address = '192.168.45.0'
146
+ params = { 'ip' => '192.168.45.65', 'mac' => '1f:83:ea:ee:53:67', 'name' => 'Makita', 'network' => network_address }
147
+ subnet = { 'subnet_id' => '192', 'site_name' => 'Houston', 'start_hostaddr' => network_address }
148
+ subnet_response = stub(body: [subnet].to_json)
149
+
150
+ @connection
151
+ .expects(:ip_subnet_list)
152
+ .with(where: "start_hostaddr='#{network_address}' and is_terminal='1'", limit: 1)
153
+ .returns(subnet_response)
154
+ @connection
155
+ .expects(:ip_address_add)
156
+ .with(site_name: subnet['site_name'], ip_addr: params['ip'], mac_addr: params['mac'], name: params['name'])
157
+ .once
158
+
159
+ @api.add_record(params)
160
+ end
161
+
162
+ def test_delete_record
163
+ subnet_params = { 'subnet_id' => '192', 'site_name' => 'Houston' }
164
+ subnet = stub(network: '192.168.45.0')
165
+ record = stub(subnet: subnet, ip: '192.168.45.65')
166
+ subnet_response = stub(body: [subnet_params].to_json)
167
+
168
+ @connection
169
+ .expects(:ip_subnet_list)
170
+ .with(where: "start_hostaddr='#{subnet.network}' and is_terminal='1'", limit: 1)
171
+ .returns(subnet_response)
172
+ @connection
173
+ .expects(:ip_address_delete)
174
+ .with(site_name: subnet_params['site_name'], hostaddr: record.ip)
175
+ .once
176
+
177
+ @api.delete_record(record)
178
+ end
179
+ end
@@ -0,0 +1,38 @@
1
+ require 'test_helper'
2
+ require 'SOLIDserver'
3
+ require 'dhcp_common/dhcp_common'
4
+ require 'smart_proxy_efficient_ip/api'
5
+ require 'smart_proxy_efficient_ip/main'
6
+ require 'smart_proxy_efficient_ip/configuration'
7
+
8
+ class ConfigurationTest < Test::Unit::TestCase
9
+ def setup
10
+ @settings = {
11
+ username: 'user',
12
+ password: 'password',
13
+ server_id: '10.10.10.10'
14
+ }
15
+ @container = ::Proxy::DependencyInjection::Container.new
16
+ Proxy::DHCP::EfficientIp::Configuration.new.load_dependency_injection_wirings(@container, @settings)
17
+ end
18
+
19
+ def test_connection
20
+ connection = @container.get_dependency(:connection)
21
+
22
+ assert_instance_of ::SOLIDserver::SOLIDserver, connection
23
+ end
24
+
25
+ def test_api
26
+ api = @container.get_dependency(:api)
27
+
28
+ assert_instance_of ::Proxy::DHCP::EfficientIp::Api, api
29
+ end
30
+
31
+ def test_provider
32
+ provider = @container.get_dependency(:dhcp_provider)
33
+
34
+ assert_instance_of ::Proxy::DHCP::EfficientIp::Provider, provider
35
+ end
36
+ end
37
+
38
+
@@ -0,0 +1,142 @@
1
+ require 'test_helper'
2
+ require 'SOLIDserver'
3
+ require 'smart_proxy_efficient_ip/main'
4
+ require 'smart_proxy_efficient_ip/const'
5
+
6
+ SIZE_TO_MASK = ::Proxy::DHCP::EfficientIp::SIZE_TO_MASK
7
+
8
+ class ProviderTest < Test::Unit::TestCase
9
+ def setup
10
+ @connection = ::SOLIDserver::SOLIDserver.new('10.10.10.10', 'username', 'password')
11
+ @api = ::Proxy::DHCP::EfficientIp::Api.new(@connection)
12
+ @provider = ::Proxy::DHCP::EfficientIp::Provider.new(@api, nil)
13
+ end
14
+
15
+ def test_find_subnet
16
+ network_address = '192.168.45.0'
17
+ subnet_params = { 'subnet_id' => '106', 'subnet_size' => '256' }
18
+
19
+ @api.expects(:find_subnet).with(network_address).returns(subnet_params)
20
+
21
+ result = @provider.find_subnet(network_address)
22
+
23
+ assert_instance_of ::Proxy::DHCP::Subnet, result
24
+ assert_equal result.network, network_address
25
+ assert_equal result.netmask, ::Proxy::DHCP::EfficientIp::SIZE_TO_MASK[subnet_params['subnet_size'].to_i]
26
+ end
27
+
28
+ def test_find_subnets
29
+ network_address = '192.168.45.0'
30
+ subnets_params = [
31
+ { 'subnet_id' => '106', 'start_hostaddr' => '192.168.84.0', 'subnet_size' => '256' },
32
+ { 'subnet_id' => '125', 'start_hostaddr' => '192.168.88.0', 'subnet_size' => '128' },
33
+ ]
34
+
35
+ @api.expects(:subnets).returns(subnets_params)
36
+
37
+ result = @provider.subnets
38
+ assert_instance_of ::Proxy::DHCP::Subnet, result[0]
39
+ assert_instance_of ::Proxy::DHCP::Subnet, result[1]
40
+ assert_equal result[0].network, subnets_params[0]['start_hostaddr']
41
+ assert_equal result[1].network, subnets_params[1]['start_hostaddr']
42
+ assert_equal result[0].netmask, SIZE_TO_MASK[subnets_params[0]['subnet_size'].to_i]
43
+ assert_equal result[1].netmask, SIZE_TO_MASK[subnets_params[1]['subnet_size'].to_i]
44
+ end
45
+
46
+ def test_all_hosts
47
+ network_address = '192.168.75.0'
48
+ subnet = { 'subnet_id' => '106', 'subnet_size' => '256' }
49
+ hosts = [
50
+ { 'name' => 'Rick', 'hostaddr' => '192.168.75.23', 'mac_addr' => '8a:9c:3e:c3:5a:6b' },
51
+ { 'name' => 'Morty', 'hostaddr' => '192.168.75.67', 'mac_addr' => 'af:94:2d:6d:7e:7e' }
52
+ ]
53
+
54
+
55
+ @api.expects(:hosts).with(network_address).returns(hosts)
56
+ @api.expects(:find_subnet).with(network_address).returns(subnet)
57
+
58
+ result = @provider.all_hosts(network_address)
59
+
60
+ assert_instance_of ::Proxy::DHCP::Reservation, result[0]
61
+ assert_instance_of ::Proxy::DHCP::Reservation, result[1]
62
+ assert_equal result[0].name, hosts[0]['name']
63
+ assert_equal result[1].name, hosts[1]['name']
64
+ assert_equal result[0].ip, hosts[0]['hostaddr']
65
+ assert_equal result[1].ip, hosts[1]['hostaddr']
66
+ assert_equal result[0].mac, hosts[0]['mac_addr']
67
+ assert_equal result[1].mac, hosts[1]['mac_addr']
68
+ end
69
+
70
+ def test_all_leases
71
+ network_address = '192.168.85.0'
72
+ subnet = { 'subnet_id' => '106', 'subnet_size' => '256' }
73
+ real_mac_address_1 = '8a:9c:3e:c3:5a:6b'
74
+ real_mac_address_2 = 'af:94:2d:6d:7e:7e'
75
+ leases = [
76
+ {
77
+ 'dhcplease_id' => '78',
78
+ 'dhcplease_name' => 'Nick',
79
+ 'dhcplease_addr' => '192.168.75.23',
80
+ 'dhcplease_mac_addr' => "0a:#{real_mac_address_1}",
81
+ 'dhcplease_first_time' => '1617021896',
82
+ 'dhcplease_end_time' => '1617066741',
83
+ 'time_to_expire' => '54632'
84
+ },
85
+ {
86
+ 'dhcplease_id' => '31',
87
+ 'dhcplease_name' => 'Jack',
88
+ 'dhcplease_addr' => '192.168.75.67',
89
+ 'dhcplease_mac_addr' => "0a:#{real_mac_address_2}",
90
+ 'dhcplease_first_time' => '1617021396',
91
+ 'dhcplease_end_time' => '1617066421',
92
+ 'time_to_expire' => '631'
93
+ }
94
+ ]
95
+
96
+
97
+ @api.expects(:leases).with(network_address).returns(leases)
98
+ @api.expects(:find_subnet).with(network_address).returns(subnet)
99
+
100
+ result = @provider.all_leases(network_address)
101
+
102
+ assert_instance_of ::Proxy::DHCP::Lease, result[0]
103
+ assert_instance_of ::Proxy::DHCP::Lease, result[1]
104
+ assert_equal result[0].name, leases[0]['dhcplease_name']
105
+ assert_equal result[1].name, leases[1]['dhcplease_name']
106
+ assert_equal result[0].ip, leases[0]['dhcplease_addr']
107
+ assert_equal result[1].ip, leases[1]['dhcplease_addr']
108
+ assert_equal result[0].mac, real_mac_address_1
109
+ assert_equal result[1].mac, real_mac_address_2
110
+ end
111
+
112
+ def test_unused_ip
113
+ network_address = '192.168.85.0'
114
+ free_ip = '192.168.85.64'
115
+ start_ip = '192.168.85.12'
116
+ end_ip = '192.168.85.112'
117
+ server_response = { 'hostaddr' => free_ip }
118
+
119
+ @api.expects(:find_free).with(network_address, start_ip, end_ip).returns(server_response)
120
+
121
+ result = @provider.unused_ip(network_address, nil, start_ip, end_ip)
122
+
123
+ assert_equal result, free_ip
124
+ end
125
+
126
+ def test_find_record
127
+ network_address = '192.168.95.0'
128
+ ip = '192.168.95.23'
129
+ record_params = { 'hostaddr' => ip, 'mac_addr' => 'e1:2c:07:c1:46:7b', 'name' => 'First' }
130
+ subnet_params = { 'subnet_id' => '577', 'subnet_size' => '256' }
131
+
132
+ @api.expects(:find_subnet).with(network_address).returns(subnet_params)
133
+ @api.expects(:find_record).with(ip).returns(record_params)
134
+
135
+ result = @provider.find_record(network_address, ip)
136
+
137
+ assert_instance_of Proxy::DHCP::Reservation, result
138
+ assert_equal result.ip, record_params['hostaddr']
139
+ assert_equal result.mac, record_params['mac_addr']
140
+ assert_equal result.name, record_params['name']
141
+ end
142
+ end
@@ -0,0 +1,3 @@
1
+ require 'test/unit'
2
+ require 'mocha/test_unit'
3
+ require 'smart_proxy_for_testing'
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: smart_proxy_efficient_ip
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.12
5
+ platform: ruby
6
+ authors:
7
+ - Michal Olejniczak
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-06-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: SOLIDserver
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.11
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.11
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '13.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '13.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mocha
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.11'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.11'
55
+ - !ruby/object:Gem::Dependency
56
+ name: test-unit
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.4'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.4'
69
+ description: Plugin for integration Foreman's smart proxy with EfficientIP
70
+ email:
71
+ - michal.olejniczak@ironin.pl
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - LICENSE
77
+ - README.md
78
+ - bundler.d/efficient_ip.rb
79
+ - config/dhcp_efficient_ip.yml.example
80
+ - config/docker_smart-proxy_settings/settings.d/dhcp.yml
81
+ - config/docker_smart-proxy_settings/settings.d/dhcp_efficient_ip.yml.example
82
+ - config/docker_smart-proxy_settings/settings.yml
83
+ - lib/smart_proxy_efficient_ip.rb
84
+ - lib/smart_proxy_efficient_ip/api.rb
85
+ - lib/smart_proxy_efficient_ip/configuration.rb
86
+ - lib/smart_proxy_efficient_ip/const.rb
87
+ - lib/smart_proxy_efficient_ip/main.rb
88
+ - lib/smart_proxy_efficient_ip/plugin.rb
89
+ - lib/smart_proxy_efficient_ip/version.rb
90
+ - test/api_test.rb
91
+ - test/configuration_test.rb
92
+ - test/provider_test.rb
93
+ - test/test_helper.rb
94
+ homepage: https://gitlab.ironin.it/efficient-ip/smart-proxy-dhcp
95
+ licenses:
96
+ - GPL-3.0
97
+ metadata: {}
98
+ post_install_message:
99
+ rdoc_options: []
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ required_rubygems_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ requirements: []
113
+ rubygems_version: 3.1.2
114
+ signing_key:
115
+ specification_version: 4
116
+ summary: Smart proxy plugin for EfficientIP
117
+ test_files:
118
+ - test/api_test.rb
119
+ - test/configuration_test.rb
120
+ - test/provider_test.rb
121
+ - test/test_helper.rb