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.
@@ -0,0 +1,7 @@
1
+ module Proxy
2
+ module DHCP
3
+ module DhcpKea
4
+ VERSION = '0.1.2'
5
+ end
6
+ end
7
+ end
@@ -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
@@ -0,0 +1,7 @@
1
+ require 'test/unit'
2
+ require 'mocha/test_unit'
3
+
4
+ require 'smart_proxy_for_testing'
5
+
6
+ # create log directory in our (not smart-proxy) directory
7
+ FileUtils.mkdir_p File.dirname(Proxy::SETTINGS.log_file)
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