smart_proxy_dhcp_kea 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|