smart_proxy_dhcp_kea 0.1.2

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