pingable_ipam_plugin 0.0.6 → 0.0.11

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 908ad71e7072a4b86a8f72b60fe937148dc4053638fa4044e6949c1e48ce17b8
4
- data.tar.gz: 310482875a9873683c62e72e36e074307f0f7053c12a93f1f863a44c60b348a9
3
+ metadata.gz: 5c9999d82d23f1b0353168324187fedb2f708b25bb7af845d0a40ffb37328f3f
4
+ data.tar.gz: 462f823e2d9f31936fc45b5353c655a2f4f3e4316e0093f99ae65a38071e7756
5
5
  SHA512:
6
- metadata.gz: d825d67a8ba86b77486e86caeb2ac58f7d8bb987a05f5e98ee2a5ff6b5ce15fa4fc6e904455d68ccaf12eadb9f893fa26b59754d5bccf0acd16eaf11e0e66141
7
- data.tar.gz: a223b1c4aa23c8eb969122dfa3c2252183a99c2853244ce95a1501ba290f6938043a9698add803650b9c79e7394100132682a78e0be26ac93958c65b2c77b141
6
+ metadata.gz: 7ff6409d15a9640cdce612f4cebe2254df3e6486a083f809212bf00d57a23c73b7427d044df7acff4bc27057bc0b529481756a19be09c918e430238dd4c4d662
7
+ data.tar.gz: bddaf430ed9ee3e5b7bcc6a6a505fa8aa2cda271695fe1300623d216e5ab4070326e685d1bfb216c67b32c1add96ade1778785efa0bc2eb8c00105d446160adb
@@ -9,7 +9,7 @@ module IPAM
9
9
  end
10
10
 
11
11
  def random_ip(range)
12
- IPAddr.new(generator.rand(range.first.to_i..range.last.to_i), subnet.family)
12
+ IPAddr.new(range.sample(random: generator), subnet.family)
13
13
  end
14
14
 
15
15
  def tcp_pingable?(ip)
@@ -46,7 +46,7 @@ module IPAM
46
46
  end
47
47
 
48
48
  if bool
49
- logger.info "Succesful telnet ping #{ip}, port #{port}"
49
+ logger.info "[IPAM] Succesful telnet ping #{ip}, port #{port}"
50
50
  end
51
51
 
52
52
  bool
@@ -64,14 +64,14 @@ module IPAM
64
64
  system("ping -c 2 -W 1 #{ip} > /dev/null")
65
65
  end
66
66
  rescue => err
67
- logger.debug "Unable to icmp ping #{ip} because #{err.inspect}."
67
+ logger.warn "[IPAM] Unable to icmp ping #{ip} because #{err.inspect}."
68
68
  true
69
69
  end
70
70
 
71
71
  def ns_resolvable? ip
72
72
  begin
73
73
  name = Resolv.getname ip
74
- logger.warn "Found a DNS resolvable IP #{ip}, resolved name: #{name}."
74
+ logger.warn "[IPAM] Found a DNS resolvable IP #{ip}, resolved name: #{name}."
75
75
  true
76
76
  rescue StandardError
77
77
  false
@@ -88,32 +88,39 @@ module IPAM
88
88
  range = subnet_range.to_a - excluded_ips.to_a
89
89
  range -= subnet.known_ips.to_a
90
90
 
91
- if range.empty?
92
- errors.add(:subnet, _('no free IP could be found in our DB, enlarge subnet range'))
93
- return nil
91
+ unless range.empty?
92
+ logger.info "[IPAM] IP range from #{range.first.to_s} to #{range.last.to_s}, total: #{range.length}"
94
93
  end
95
94
 
96
95
  loop do
97
- # next random IP from the sequence generated by MAC seed
96
+ if range.empty?
97
+ errors.add(:subnet, _('no free IP could be found in our DB, enlarge subnet range'))
98
+ return nil
99
+ end
100
+
98
101
  candidate = random_ip(range)
99
102
  iterations += 1
100
103
  break if iterations >= MAX_ITERATIONS
101
104
  # try to match it
102
105
  ip = candidate.to_s
106
+ logger.info "[IPAM] Searching for free IP - resolving #{ip}"
107
+
103
108
  # Check again if something has been changed.
104
109
  if !excluded_ips.include?(ip) && !subnet.known_ips.include?(ip)
105
- logger.debug "Searching for free IP - pinging #{ip}."
106
110
  if tcp_pingable?(ip) || icmp_pingable?(ip)
107
- logger.warn("Found a pingable IP (#{ip}) address which not marked as known. Skipping it...")
111
+ logger.warn("[IPAM] Found a pingable IP (#{ip}) address which not marked as known. Skipping it...")
108
112
  else
109
113
  unless ns_resolvable?(ip)
110
- logger.debug("Found #{ip} in #{iterations} iterations")
114
+ logger.info("[IPAM] Found #{ip} in #{iterations} iterations")
111
115
  return ip
112
116
  end
113
117
  end
114
118
  end
119
+
120
+ range -= [candidate]
115
121
  end
116
- logger.debug("Not suggesting IP Address for #{subnet} as no free IP found in reasonable time (#{iterations} iterations)")
122
+
123
+ logger.warn("[IPAM] Not suggesting IP Address for #{subnet} as no free IP found in reasonable time (#{iterations} iterations)")
117
124
  errors.add(:subnet, _('no random free IP could be found in our DB, enlarge subnet range'))
118
125
  nil
119
126
  end
@@ -1,3 +1,3 @@
1
1
  module PingableIpamPlugin
2
- VERSION = '0.0.6'.freeze
2
+ VERSION = '0.0.11'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pingable_ipam_plugin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Parshin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-18 00:00:00.000000000 Z
11
+ date: 2021-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop