smart_proxy_dhcp_kea 0.1.2
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.
- checksums.yaml +7 -0
- data/LICENSE +675 -0
- data/README.md +52 -0
- data/bundler.d/dhcp_kea.rb +4 -0
- data/config/dhcp_remote_kea.yml.example +24 -0
- data/lib/smart_proxy_dhcp_kea.rb +9 -0
- data/lib/smart_proxy_dhcp_kea/dhcp_kea.rb +4 -0
- data/lib/smart_proxy_dhcp_kea/dhcp_kea_main.rb +127 -0
- data/lib/smart_proxy_dhcp_kea/dhcp_kea_plugin.rb +16 -0
- data/lib/smart_proxy_dhcp_kea/keapostgre_dhcp_network.rb +132 -0
- data/lib/smart_proxy_dhcp_kea/plugin_configuration.rb +58 -0
- data/lib/smart_proxy_dhcp_kea/subnet_service_initializer.rb +100 -0
- data/lib/smart_proxy_dhcp_kea/version.rb +7 -0
- data/test/integration_test.rb +134 -0
- data/test/plugin_configuration_test.rb +68 -0
- data/test/test_helper.rb +7 -0
- metadata +160 -0
@@ -0,0 +1,134 @@
|
|
1
|
+
require "rack/test"
|
2
|
+
require 'test_helper'
|
3
|
+
require 'json'
|
4
|
+
require 'dhcp_common/dhcp_common'
|
5
|
+
require 'dhcp_common/subnet_service'
|
6
|
+
require 'dhcp_common/free_ips'
|
7
|
+
require 'dhcp_common/isc/omapi_provider'
|
8
|
+
require 'dhcp_common/isc/configuration_parser'
|
9
|
+
require 'dhcp_common/isc/subnet_service_initialization'
|
10
|
+
require 'smart_proxy_dhcp_remote_isc/subnet_service_initializer'
|
11
|
+
require 'dhcp/dhcp'
|
12
|
+
require 'dhcp/dependency_injection'
|
13
|
+
require 'dhcp/dhcp_api'
|
14
|
+
|
15
|
+
ENV['RACK_ENV'] = 'test'
|
16
|
+
|
17
|
+
class IntegrationTest < ::Test::Unit::TestCase
|
18
|
+
include Rack::Test::Methods
|
19
|
+
|
20
|
+
class SubnetServiceInitializerForTesting < Proxy::DHCP::RemoteISC::SubnetServiceInitializer
|
21
|
+
def read_leases_file
|
22
|
+
return <<EOF
|
23
|
+
host testing-01 { hardware ethernet 11:22:33:a9:61:09; fixed-address 10.0.0.200; dynamic; }
|
24
|
+
EOF
|
25
|
+
end
|
26
|
+
|
27
|
+
def read_config_file
|
28
|
+
return <<EOF
|
29
|
+
subnet 10.0.0.0 netmask 255.255.255.0 {
|
30
|
+
}
|
31
|
+
EOF
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class IscOmapiProviderForTesting < Proxy::DHCP::CommonISC::IscOmapiProvider
|
36
|
+
def om
|
37
|
+
@om ||= StringIO.new
|
38
|
+
end
|
39
|
+
|
40
|
+
def om_disconnect(msg)
|
41
|
+
@om = nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def app
|
46
|
+
app = Proxy::DhcpApi.new
|
47
|
+
app.helpers.server = @server
|
48
|
+
app
|
49
|
+
end
|
50
|
+
|
51
|
+
def setup
|
52
|
+
@subnet_service = ::Proxy::DHCP::SubnetService.new(::Proxy::MemoryStore.new, ::Proxy::MemoryStore.new, ::Proxy::MemoryStore.new,
|
53
|
+
::Proxy::MemoryStore.new, ::Proxy::MemoryStore.new)
|
54
|
+
@parser = ::Proxy::DHCP::CommonISC::ConfigurationParser.new
|
55
|
+
|
56
|
+
subnet_service_initializer =
|
57
|
+
SubnetServiceInitializerForTesting.new("config_path", "leases_path", @parser, @subnet_service)
|
58
|
+
@initialized_subnet_service = subnet_service_initializer.initialized_subnet_service
|
59
|
+
|
60
|
+
@free_ips = ::Proxy::DHCP::FreeIps.new(10)
|
61
|
+
|
62
|
+
@server = IscOmapiProviderForTesting.new("127.0.0.1", '7911', [], 'key', 'secret', @initialized_subnet_service, @free_ips)
|
63
|
+
|
64
|
+
@expected_reservation = {"name" => "testing-01", "ip" => "10.0.0.200", "mac" => "11:22:33:a9:61:09",
|
65
|
+
"subnet" => "10.0.0.0/255.255.255.0", "type" => "reservation", "deleteable" => true,
|
66
|
+
"hostname" => "testing-01", "hardware_type" => "ethernet"}
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
def test_get_subnets
|
71
|
+
get "/"
|
72
|
+
|
73
|
+
assert last_response.ok?, "Last response was not ok: #{last_response.status} #{last_response.body}"
|
74
|
+
parsed_response = JSON.parse(last_response.body)
|
75
|
+
assert_equal 1, parsed_response.size
|
76
|
+
assert_equal "10.0.0.0", parsed_response.first['network']
|
77
|
+
assert_equal "255.255.255.0", parsed_response.first['netmask']
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_get_network
|
81
|
+
get "/10.0.0.0"
|
82
|
+
|
83
|
+
assert last_response.ok?, "Last response was not ok: #{last_response.status} #{last_response.body}"
|
84
|
+
parsed_response = JSON.parse(last_response.body)
|
85
|
+
assert parsed_response.key?('reservations')
|
86
|
+
assert_equal 1, parsed_response['reservations'].size
|
87
|
+
assert parsed_response.key?('leases')
|
88
|
+
assert parsed_response['leases'].empty?
|
89
|
+
assert_equal@expected_reservation, parsed_response['reservations'].first
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_get_unused_ip
|
93
|
+
get "/10.0.0.0/unused_ip"
|
94
|
+
|
95
|
+
assert last_response.ok?, "Last response was not ok: #{last_response.status} #{last_response.body}"
|
96
|
+
parsed_response = JSON.parse(last_response.body)
|
97
|
+
assert parsed_response.key?('ip')
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_get_records_by_ip
|
101
|
+
get "/10.0.0.0/ip/10.0.0.200"
|
102
|
+
assert last_response.ok?, "Last response was not ok: #{last_response.status} #{last_response.body}"
|
103
|
+
parsed_response = JSON.parse(last_response.body)
|
104
|
+
assert_equal 1, parsed_response.size
|
105
|
+
assert_equal @expected_reservation, parsed_response.first
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_get_record_by_mac
|
109
|
+
get "/10.0.0.0/mac/11:22:33:a9:61:09"
|
110
|
+
assert last_response.ok?, "Last response was not ok: #{last_response.status} #{last_response.body}"
|
111
|
+
assert_equal @expected_reservation, JSON.parse(last_response.body)
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_create_record
|
115
|
+
record = {
|
116
|
+
"hostname" => "test-02",
|
117
|
+
"ip" => "10.0.0.250",
|
118
|
+
"mac" => "10:10:10:10:10:10",
|
119
|
+
"network" => "10.0.0.0",
|
120
|
+
}
|
121
|
+
post "/10.0.0.0", record
|
122
|
+
assert last_response.ok?, "Last response was not ok: #{last_response.status} #{last_response.body}"
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_delete_records_by_ip
|
126
|
+
delete "/10.0.0.0/ip/10.0.0.200"
|
127
|
+
assert last_response.ok?, "Last response was not ok: #{last_response.status} #{last_response.body}"
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_delete_record_by_mac
|
131
|
+
delete "/10.0.0.0/mac/11:22:33:a9:61:09"
|
132
|
+
assert last_response.ok?, "Last response was not ok: #{last_response.status} #{last_response.body}"
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
require 'smart_proxy_dhcp_remote_isc/plugin_configuration'
|
5
|
+
require 'smart_proxy_dhcp_remote_isc/dhcp_remote_isc_plugin'
|
6
|
+
require 'dhcp_common/subnet_service'
|
7
|
+
require 'dhcp_common/free_ips'
|
8
|
+
require 'dhcp_common/isc/omapi_provider'
|
9
|
+
require 'rsec'
|
10
|
+
require 'dhcp_common/isc/configuration_parser'
|
11
|
+
require 'dhcp_common/isc/subnet_service_initialization'
|
12
|
+
require 'smart_proxy_dhcp_remote_isc/subnet_service_initializer'
|
13
|
+
|
14
|
+
class ConfigurationTest < ::Test::Unit::TestCase
|
15
|
+
def test_default_configuration
|
16
|
+
Proxy::DHCP::RemoteISC::Plugin.load_test_settings({})
|
17
|
+
assert_equal '7911', Proxy::DHCP::RemoteISC::Plugin.settings.omapi_port
|
18
|
+
assert_equal '/etc/dhcp/dhcpd.conf', Proxy::DHCP::RemoteISC::Plugin.settings.config
|
19
|
+
assert_equal '/var/lib/dhcpd/dhcpd.leases', Proxy::DHCP::RemoteISC::Plugin.settings.leases
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class ProductionDiWiringsTest < Test::Unit::TestCase
|
24
|
+
def setup
|
25
|
+
@settings = {:server => "a_server", :omapi_port => 7911, :key_name => "key_name", :key_secret => "key_secret",
|
26
|
+
:subnets => ["192.168.0.0/255.255.255.0"], :config => Tempfile.new('config').path,
|
27
|
+
:leases => Tempfile.new('leases').path, :blacklist_duration_minutes => 100}
|
28
|
+
@container = ::Proxy::DependencyInjection::Container.new
|
29
|
+
::Proxy::DHCP::RemoteISC::PluginConfiguration.new.load_dependency_injection_wirings(@container, @settings)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_provider_initialization
|
33
|
+
provider = @container.get_dependency(:dhcp_provider)
|
34
|
+
|
35
|
+
assert_equal @settings[:server], provider.name
|
36
|
+
assert_equal @settings[:omapi_port], provider.omapi_port
|
37
|
+
assert_equal @settings[:key_name], provider.key_name
|
38
|
+
assert_equal @settings[:key_secret], provider.key_secret
|
39
|
+
assert_equal Set.new(@settings[:subnets]), provider.managed_subnets
|
40
|
+
assert_equal ::Proxy::DHCP::SubnetService, provider.service.class
|
41
|
+
assert_equal ::Proxy::DHCP::FreeIps, provider.free_ips.class
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_parser_initialization
|
45
|
+
assert @container.get_dependency(:parser)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_subnet_service_initializer_configuration
|
49
|
+
service_initializer = @container.get_dependency(:subnet_service_initializer)
|
50
|
+
|
51
|
+
assert service_initializer
|
52
|
+
assert_equal ::Proxy::DHCP::SubnetService, service_initializer.subnet_service.class
|
53
|
+
assert_equal ::Proxy::DHCP::CommonISC::ConfigurationParser, service_initializer.parser.class
|
54
|
+
assert_equal @settings[:config], service_initializer.config_file_path
|
55
|
+
assert_equal @settings[:leases], service_initializer.leases_file_path
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_initialized_subnet_service
|
59
|
+
assert @container.get_dependency(:initialized_subnet_service)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_free_ips_configuration
|
63
|
+
free_ips = @container.get_dependency(:free_ips)
|
64
|
+
|
65
|
+
assert free_ips
|
66
|
+
assert_equal @settings[:blacklist_duration_minutes], free_ips.blacklist_interval
|
67
|
+
end
|
68
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: smart_proxy_dhcp_kea
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Pierfrancesco Cifra
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-11-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mocha
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: test-unit
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pg
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: ipaddr
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: ipaddress
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: mysql2
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: Dhcp Kea provider plugin for Foreman's smart proxy
|
112
|
+
email:
|
113
|
+
- pierfrancesco.cifra@cern.ch
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- LICENSE
|
119
|
+
- README.md
|
120
|
+
- bundler.d/dhcp_kea.rb
|
121
|
+
- config/dhcp_remote_kea.yml.example
|
122
|
+
- lib/smart_proxy_dhcp_kea.rb
|
123
|
+
- lib/smart_proxy_dhcp_kea/dhcp_kea.rb
|
124
|
+
- lib/smart_proxy_dhcp_kea/dhcp_kea_main.rb
|
125
|
+
- lib/smart_proxy_dhcp_kea/dhcp_kea_plugin.rb
|
126
|
+
- lib/smart_proxy_dhcp_kea/keapostgre_dhcp_network.rb
|
127
|
+
- lib/smart_proxy_dhcp_kea/plugin_configuration.rb
|
128
|
+
- lib/smart_proxy_dhcp_kea/subnet_service_initializer.rb
|
129
|
+
- lib/smart_proxy_dhcp_kea/version.rb
|
130
|
+
- test/integration_test.rb
|
131
|
+
- test/plugin_configuration_test.rb
|
132
|
+
- test/test_helper.rb
|
133
|
+
homepage: https://gitlab.cern.ch/pcifra/smart_proxy_dhcp_kea
|
134
|
+
licenses:
|
135
|
+
- GPL-3.0
|
136
|
+
metadata: {}
|
137
|
+
post_install_message:
|
138
|
+
rdoc_options: []
|
139
|
+
require_paths:
|
140
|
+
- lib
|
141
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - ">="
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0'
|
151
|
+
requirements: []
|
152
|
+
rubyforge_project:
|
153
|
+
rubygems_version: 2.7.6.2
|
154
|
+
signing_key:
|
155
|
+
specification_version: 4
|
156
|
+
summary: Dhcp Kea provider plugin for Foreman's smart proxy
|
157
|
+
test_files:
|
158
|
+
- test/integration_test.rb
|
159
|
+
- test/plugin_configuration_test.rb
|
160
|
+
- test/test_helper.rb
|