smart_proxy_dhcp_infoblox 0.0.14 → 0.0.15
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 +4 -4
- data/config/dhcp_infoblox.yml.example +20 -11
- data/lib/smart_proxy_dhcp_infoblox/common_crud.rb +15 -2
- data/lib/smart_proxy_dhcp_infoblox/dhcp_infoblox_main.rb +2 -2
- data/lib/smart_proxy_dhcp_infoblox/dhcp_infoblox_plugin.rb +6 -1
- data/lib/smart_proxy_dhcp_infoblox/dhcp_infoblox_version.rb +1 -1
- data/lib/smart_proxy_dhcp_infoblox/grid_restart.rb +15 -4
- data/test/infoblox_provider_test.rb +42 -2
- data/test/plugin_configuration_test.rb +8 -4
- metadata +9 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c031d153855f68611243ce742482f2c3e0274ad9187dc638cb4f691b3d687448
|
4
|
+
data.tar.gz: 330d031ca651443261dd0df8921577f4c545e2aba97018d42953b71178ed1aae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a694d48389e3da2154b4d2d6b1ecca186c2e8e8b91d146c4641b06bd7b1f6912c0679979f362a68b63ec9205b570fd71959f916be109036c9721eb36801b1bab
|
7
|
+
data.tar.gz: 324fe4540b931eedb3c913c52b5bb17a02968646d43abf324a5bd34030199632157750e13618046fbd68fd7c64887fcbbac1657b72d00a3e81fc6443defe56e8
|
@@ -1,15 +1,24 @@
|
|
1
1
|
---
|
2
|
-
#
|
3
2
|
# Configuration file for 'dhcp_infoblox' dhcp provider
|
4
3
|
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
|
8
|
-
|
4
|
+
# Use :server setting in dhcp.yml if you are managing a dhcp server which is not localhost.
|
5
|
+
# Use :subnets setting in dhcp.yml if you want to restrict subnets available to smart-proxy.
|
6
|
+
|
7
|
+
# Credentials for Infoblox API, make sure the DHCP Role is assigned
|
8
|
+
:username: "admin"
|
9
9
|
:password: "infoblox"
|
10
|
-
|
11
|
-
# Record type to manage: can be "host" or "fixedaddress"
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
|
11
|
+
# Record type to manage: can be "host" or "fixedaddress". The latter is recommended as
|
12
|
+
# "host" setting will cause conflicts when using Infoblox DNS smart proxy plugin. When
|
13
|
+
# using "host" setting make sure domain exists in Infoblox.
|
14
|
+
:record_type: 'fixedaddress'
|
15
|
+
|
16
|
+
# View used for fixedaddress record type.
|
17
|
+
#:network_view: 'default'
|
18
|
+
|
19
|
+
# View used for host record type, usually 'default.myview' for custom names.
|
20
|
+
#:dns_view: 'default'
|
21
|
+
|
22
|
+
# Number of seconds to wait after successful Grid restart (make sure to increase Foreman and CLI timeouts).
|
23
|
+
# Set to 0 to disable the delay.
|
24
|
+
#:wait_after_restart: 10
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'resolv'
|
2
2
|
require 'smart_proxy_dhcp_infoblox/ip_address_arithmetic'
|
3
|
+
require 'smart_proxy_dhcp_infoblox/network_address_range_regex_generator'
|
3
4
|
require "proxy/validations"
|
4
5
|
|
5
6
|
module ::Proxy::DHCP::Infoblox
|
@@ -13,8 +14,20 @@ module ::Proxy::DHCP::Infoblox
|
|
13
14
|
@connection = connection
|
14
15
|
end
|
15
16
|
|
16
|
-
def all_leases(network_address)
|
17
|
-
|
17
|
+
def all_leases(network_address, subnet)
|
18
|
+
address_range_regex = NetworkAddressesRegularExpressionGenerator.new.generate_regex(network_address)
|
19
|
+
::Infoblox::Lease.find(@connection, 'address~' => address_range_regex).map do |lease|
|
20
|
+
Proxy::DHCP::Lease.new(
|
21
|
+
lease.client_hostname,
|
22
|
+
lease.address,
|
23
|
+
lease.hardware,
|
24
|
+
subnet,
|
25
|
+
lease.starts,
|
26
|
+
lease.ends,
|
27
|
+
lease.binding_state,
|
28
|
+
:hostname => lease.client_hostname
|
29
|
+
)
|
30
|
+
end
|
18
31
|
end
|
19
32
|
|
20
33
|
def find_record(subnet_address, an_address)
|
@@ -32,7 +32,7 @@ module Proxy::DHCP::Infoblox
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def all_leases(network_address)
|
35
|
-
crud.all_leases(full_network_address(network_address))
|
35
|
+
crud.all_leases(full_network_address(network_address), find_subnet(network_address))
|
36
36
|
end
|
37
37
|
|
38
38
|
def find_record(subnet_address, an_address)
|
@@ -92,7 +92,7 @@ module Proxy::DHCP::Infoblox
|
|
92
92
|
def find_network(network_address)
|
93
93
|
network = ::Infoblox::Network.find(connection, 'network' => network_address, 'network_view' => network_view,
|
94
94
|
'_max_results' => 1).first
|
95
|
-
raise "Subnet #{network_address} not found" if network.nil?
|
95
|
+
raise "Subnet #{network_address} not found in network view #{network_view}" if network.nil?
|
96
96
|
network
|
97
97
|
end
|
98
98
|
|
@@ -2,7 +2,12 @@ module Proxy::DHCP::Infoblox
|
|
2
2
|
class Plugin < ::Proxy::Provider
|
3
3
|
plugin :dhcp_infoblox, ::Proxy::DHCP::Infoblox::VERSION
|
4
4
|
|
5
|
-
default_settings :record_type => '
|
5
|
+
default_settings :record_type => 'fixedaddress',
|
6
|
+
:dns_view => "default",
|
7
|
+
:network_view => "default",
|
8
|
+
:blacklist_duration_minutes => 30 * 60,
|
9
|
+
:wait_after_restart => 10
|
10
|
+
|
6
11
|
validate_presence :username, :password
|
7
12
|
|
8
13
|
requires :dhcp, '>= 1.13'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module ::Proxy::DHCP::Infoblox
|
2
2
|
class GridRestart
|
3
|
-
MAX_ATTEMPTS =
|
3
|
+
MAX_ATTEMPTS = 5
|
4
4
|
|
5
5
|
include ::Proxy::Log
|
6
6
|
attr_reader :connection
|
@@ -10,21 +10,32 @@ module ::Proxy::DHCP::Infoblox
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def try_restart
|
13
|
-
logger.
|
13
|
+
logger.info 'Restarting Infoblox Grid'
|
14
14
|
|
15
|
+
delay = Proxy::DHCP::Infoblox::Plugin.settings.wait_after_restart.to_i
|
15
16
|
MAX_ATTEMPTS.times do |tries|
|
17
|
+
if restart
|
18
|
+
if delay > 0
|
19
|
+
logger.info "Starting post-restart delay of #{delay} seconds..."
|
20
|
+
sleep delay
|
21
|
+
logger.debug "Post-restart delay done"
|
22
|
+
end
|
23
|
+
return
|
24
|
+
end
|
16
25
|
sleep tries
|
17
|
-
return if restart
|
18
26
|
end
|
19
27
|
|
20
|
-
logger.
|
28
|
+
logger.warn 'Restarting Infoblox Grid failed, giving up'
|
21
29
|
false
|
22
30
|
end
|
23
31
|
|
32
|
+
private
|
33
|
+
|
24
34
|
def restart
|
25
35
|
(@grid ||= ::Infoblox::Grid.get(@connection).first).restartservices
|
26
36
|
true
|
27
37
|
rescue Exception => e
|
38
|
+
logger.warn "Error during Grid restart: #{e}"
|
28
39
|
false
|
29
40
|
end
|
30
41
|
end
|
@@ -16,9 +16,49 @@ class InfobloxProviderTest < Test::Unit::TestCase
|
|
16
16
|
@network = Infoblox::Network.new(:network => '192.168.42.0/24')
|
17
17
|
@subnet = ::Proxy::DHCP::Subnet.new('192.168.42.0', '255.255.255.0')
|
18
18
|
|
19
|
-
@network_2 = Infoblox::Network.new(:network => '192.168.
|
19
|
+
@network_2 = Infoblox::Network.new(:network => '192.168.32.0/19')
|
20
|
+
@subnet_2 = ::Proxy::DHCP::Subnet.new('192.168.32.0', '255.255.224.0')
|
21
|
+
|
22
|
+
@network_3 = Infoblox::Network.new(:network => '192.168.43.0/24')
|
23
|
+
|
24
|
+
@provider = Proxy::DHCP::Infoblox::Provider.new(@connection, @crud, @restart_grid,
|
25
|
+
@unused_ips, @managed_subnets, @network_view)
|
26
|
+
|
27
|
+
@lease = Infoblox::Lease.new(:address => '192.168.43.127',
|
28
|
+
:binding_state => 'active',
|
29
|
+
:client_hostname => 'example',
|
30
|
+
:hardware => 'ba:be:fa:ce:ca:fe',
|
31
|
+
:network => @subnet.network,
|
32
|
+
:starts => nil,
|
33
|
+
:ends => nil)
|
34
|
+
|
35
|
+
@lease_2 = Infoblox::Lease.new(:address => '192.168.60.121',
|
36
|
+
:binding_state => 'active',
|
37
|
+
:client_hostname => 'example',
|
38
|
+
:hardware => 'c0:fe:fe:f0:01:bb',
|
39
|
+
:network => @subnet_2.network,
|
40
|
+
:starts => nil,
|
41
|
+
:ends => nil)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_leases
|
45
|
+
@crud = ::Proxy::DHCP::Infoblox::CommonCRUD.new(@connection)
|
20
46
|
@provider = Proxy::DHCP::Infoblox::Provider.new(@connection, @crud, @restart_grid,
|
21
47
|
@unused_ips, @managed_subnets, @network_view)
|
48
|
+
|
49
|
+
@provider.expects(:full_network_address).with(@subnet.network).returns(@network.network)
|
50
|
+
Infoblox::Lease.expects(:find).with(@connection, 'address~' => "192\\.168\\.42\\..+").returns([@lease])
|
51
|
+
assert_equal @lease.hardware, @provider.all_leases(@subnet.network).first.mac
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_nonclass_leases
|
55
|
+
@crud = ::Proxy::DHCP::Infoblox::CommonCRUD.new(@connection)
|
56
|
+
@provider = Proxy::DHCP::Infoblox::Provider.new(@connection, @crud, @restart_grid,
|
57
|
+
@unused_ips, @managed_subnets, @network_view)
|
58
|
+
|
59
|
+
@provider.expects(:full_network_address).with(@subnet_2.network).returns(@network_2.network)
|
60
|
+
Infoblox::Lease.expects(:find).with(@connection, 'address~' => "192\\.168\\.(0?3[3456789]|0?[45][0123456789]|0?6[012])\\..+").returns([@lease_2])
|
61
|
+
assert_equal @lease_2.hardware, @provider.all_leases(@subnet_2.network).first.mac
|
22
62
|
end
|
23
63
|
|
24
64
|
def test_subnets
|
@@ -29,7 +69,7 @@ class InfobloxProviderTest < Test::Unit::TestCase
|
|
29
69
|
def test_subnets_returns_managed_subnets_only
|
30
70
|
provider = Proxy::DHCP::Infoblox::Provider.new(@connection, @crud, @restart_grid,
|
31
71
|
@unused_ips, ['192.168.42.0/255.255.255.0'], @network_view)
|
32
|
-
Infoblox::Network.expects(:all).with(@connection).returns([@network, @
|
72
|
+
Infoblox::Network.expects(:all).with(@connection).returns([@network, @network_3])
|
33
73
|
assert_equal [@subnet], provider.subnets
|
34
74
|
end
|
35
75
|
|
@@ -12,7 +12,11 @@ require 'smart_proxy_dhcp_infoblox/dhcp_infoblox_main'
|
|
12
12
|
|
13
13
|
class PluginDefaultConfigurationTest < Test::Unit::TestCase
|
14
14
|
def test_default_settings
|
15
|
-
assert_equal({ :record_type => '
|
15
|
+
assert_equal({ :record_type => 'fixedaddress',
|
16
|
+
:blacklist_duration_minutes => 30 * 60,
|
17
|
+
:wait_after_restart => 10,
|
18
|
+
:dns_view => "default",
|
19
|
+
:network_view => "default" },
|
16
20
|
Proxy::DHCP::Infoblox::Plugin.default_settings)
|
17
21
|
end
|
18
22
|
end
|
@@ -21,8 +25,8 @@ class InfobloxDhcpProductionWiringTest < Test::Unit::TestCase
|
|
21
25
|
def setup
|
22
26
|
@network_view = "network_view"
|
23
27
|
@dns_view = "dns_view"
|
24
|
-
@settings = { :username => 'user', :password => 'password', :server => '127.0.0.1', :record_type => '
|
25
|
-
:subnets => ['1.1.1.0/255.255.255.0'], :blacklist_duration_minutes => 300,
|
28
|
+
@settings = { :username => 'user', :password => 'password', :server => '127.0.0.1', :record_type => 'fixedaddress',
|
29
|
+
:subnets => ['1.1.1.0/255.255.255.0'], :blacklist_duration_minutes => 300, :wait_after_restart => 1,
|
26
30
|
:dns_view => @dns_view, :network_view => @network_view }
|
27
31
|
@container = ::Proxy::DependencyInjection::Container.new
|
28
32
|
Proxy::DHCP::Infoblox::PluginConfiguration.new.load_dependency_injection_wirings(@container, @settings)
|
@@ -66,7 +70,7 @@ class InfobloxDhcpProductionWiringTest < Test::Unit::TestCase
|
|
66
70
|
assert_not_nil provider.free_ips
|
67
71
|
assert_equal @network_view, provider.network_view
|
68
72
|
assert provider.managed_subnets.include?('1.1.1.0/255.255.255.0')
|
69
|
-
assert provider.crud.instance_of?(::Proxy::DHCP::Infoblox::
|
73
|
+
assert provider.crud.instance_of?(::Proxy::DHCP::Infoblox::FixedAddressCRUD)
|
70
74
|
end
|
71
75
|
|
72
76
|
def test_provider_configuration_with_fixedaddress_crud
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smart_proxy_dhcp_infoblox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Klaas Demter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-08-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: infoblox
|
@@ -16,20 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
- - ">="
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: 2.0.4
|
19
|
+
version: '3.0'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
24
|
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
30
|
-
- - ">="
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: 2.0.4
|
26
|
+
version: '3.0'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: rubocop
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,17 +88,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
88
|
- !ruby/object:Gem::Version
|
95
89
|
version: '0'
|
96
90
|
requirements: []
|
97
|
-
|
98
|
-
rubygems_version: 2.7.6
|
91
|
+
rubygems_version: 3.0.3
|
99
92
|
signing_key:
|
100
93
|
specification_version: 4
|
101
94
|
summary: Infoblox DHCP provider plugin for Foreman's smart proxy
|
102
95
|
test_files:
|
103
|
-
- test/record_type_validator_test.rb
|
104
|
-
- test/regex_generator_test.rb
|
105
96
|
- test/test_helper.rb
|
97
|
+
- test/infoblox_provider_test.rb
|
98
|
+
- test/plugin_configuration_test.rb
|
99
|
+
- test/record_type_validator_test.rb
|
106
100
|
- test/unused_ip_test.rb
|
107
101
|
- test/host_and_fixedaddress_crud_test.rb
|
102
|
+
- test/regex_generator_test.rb
|
108
103
|
- test/integration_test.rb
|
109
|
-
- test/plugin_configuration_test.rb
|
110
|
-
- test/infoblox_provider_test.rb
|