diff --git a/kubedock/kapi/ippool.py b/kubedock/kapi/ippool.py index f625bfc9d..cd2ab8ae5 100644 --- a/kubedock/kapi/ippool.py +++ b/kubedock/kapi/ippool.py @@ -429,7 +429,8 @@ def get_network_ips(cls, net): busy_ips = allocated_ips.keys() network = ip_network(net) - blocked_blocks = cls.ip_list_by_blocks(sorted(blocked_ips)) + blocked_blocks = cls.ip_list_by_blocks( + sorted(blocked_ips - set(busy_ips))) busy_blocks = cls.ip_list_by_blocks(sorted(busy_ips)) non_free_blocks = sorted(set(blocked_blocks) | set(busy_blocks)) free_blocks = cls.get_missed_intervals(non_free_blocks, diff --git a/kubedock/kapi/tests/test_ippool.py b/kubedock/kapi/tests/test_ippool.py index bf06ee2e4..a07fc2802 100644 --- a/kubedock/kapi/tests/test_ippool.py +++ b/kubedock/kapi/tests/test_ippool.py @@ -454,6 +454,30 @@ def test_get_network_ips_aws(self, LoadBalanceService): 'network': None, 'node': None} ) + @responses.activate + def test_get_network_ips_with_node_overlapped_blocked(self): + network = u'192.168.2.0/24' + self._create_network(network, autoblock='192.168.2.0-192.168.2.10') + + host = 'node1.kuberdock.local' + node = self.fixtures.node(host, u'192.168.2.3') + db.session.add(node) + + res = ippool.IpAddrPool().get_network_ips(network) + self.assertEqual(res, + {'node': self.node.hostname, + 'free_host_count': 245, + 'ipv6': False, + 'id': '192.168.2.0/24', + 'network': '192.168.2.0/24', + 'blocks': [ + (3232236032, 3232236034, 'blocked'), + (3232236035, 3232236035, 'cluster member', host), + (3232236036, 3232236042, 'blocked'), + (3232236043, 3232236287, 'free'), + ]} + ) + if __name__ == '__main__': unittest.main()