diff --git a/gso/services/ipam.py b/gso/services/ipam.py index 5e8273027983a2a633e72da4272658887dcda36d..dd85f7b81f78f9cf323e11c739ee3edcb7d5979f 100644 --- a/gso/services/ipam.py +++ b/gso/services/ipam.py @@ -73,7 +73,12 @@ def delete_service_host( cname_aliases=[], service_type='' ) -> HostAddresses: - return None + return _ipam.delete_service_host( + hostname=hostname, + host_addresses=host_addresses, + cname_aliases=cname_aliases, + service_type=service_type + ) if __name__ == '__main__': diff --git a/test/test_ipam.py b/test/test_ipam.py index 2a2659c04ab6d179174fbb7c22fa9e4633172946..8db6bda310005ca2671f140725e107765ba273dc 100644 --- a/test/test_ipam.py +++ b/test/test_ipam.py @@ -315,3 +315,96 @@ def test_delete_service_network(data_config_filename): service_type='TRUNK' ) assert service_network is None + + +@responses.activate +def test_delete_service_host(data_config_filename): + + responses.add( + method=responses.GET, + url=re.compile(r'.*/wapi.*record:host.*'), + json=[ + { + '_ref': 'record:host/ZG5zLmhvc3QkLl9kZWZhdWx0Lmdzby5oYV9sbw:ha_lo.gso/default', # noqa: E501 + 'ipv4addrs': [ + { + '_ref': 'record:host_ipv4addr/ZG5zLmhvc3RfYWRkcmVzcyQuX2RlZmF1bHQuZ3NvLmhhX2xvLjEwLjI1NS4yNTUuMS40.255.255.1/ha_lo.gso/default', # noqa: E501 + 'configure_for_dhcp': False, + 'host': 'ha_lo.gso', 'ipv4addr': '10.255.255.1' + } + ], + 'ipv6addrs': [ + { + '_ref': 'record:host_ipv6addr/ZG5zLmhvc3RfYWRkcmVzcyQuX2RlZmF1bHQuZvLmhhX2xvLmRlYWQ6YmVlZjo6MS4:dead%3Abeef%3A%3A1/ha_lo.gso/default', # noqa: E501 + 'configure_for_dhcp': False, + 'host': 'ha_lo.gso', 'ipv6addr': 'dead:beef::1' + } + ], + 'name': 'ha_lo.gso', 'view': 'default' + } + ] + ) + + responses.add( + method=responses.GET, + url=re.compile(r'.*/wapi.*record:cname.*'), + json=[ + { + '_ref': 'record:cname/ZG5zLmJpbmRfY25hbWUkLl9kZWZhdWx0Lmdzby5oYS5hbGlhczE:alias1.ha.gso/default', # noqa: E501 + 'canonical': 'hA_LO.lo', 'name': 'alias1.ha.lo', + 'view': 'default' + }, + { + '_ref': 'record:cname/5zLmJpbmRfY25hbWUkLl9kZWZhdWx0Lmdzby5oYS5hbGlhczI:alias2.ha.gso/default', # noqa: E501 + 'canonical': 'hA_LO.lo', 'name': 'alias2.ha.lo', + 'view': 'default' + } + ] + ) + + responses.add( + method=responses.DELETE, + url=re.compile(r'.*/wapi.*record:host.*'), + body='record:host/ZG5zLmhvc3QkLl9kZWZhdWx0Lmdzby5oYl9sbw:hb_lo.gso/default' # noqa: E501 + ) + + responses.add( + method=responses.DELETE, + url=re.compile(r'.*/wapi.*record:cname.*'), + body='record:cname/ZG5zLmJpbmRfY25hbWUkLl9kZWZhdWx0Lmdzby5oYi5hbGlhczE:alias1.hb.gso/default' # noqa: E501 + ) + + input_host_addresses = ipam.HostAddresses( + v4=ipaddress.ip_address('10.255.255.1'), + v6=ipaddress.ip_address('dead:beef::1') + ) + host_addresses = ipam.delete_service_host( + hostname='ha_lo', + host_addresses=input_host_addresses, + cname_aliases=['alias1.ha', 'alias2.ha'], + service_type='LO' + ) + assert host_addresses == ipam.HostAddresses( + v4=ipaddress.ip_address('10.255.255.1'), + v6=ipaddress.ip_address('dead:beef::1') + ) + + # Fail because missing CNAME + with pytest.raises(AssertionError): + host_addresses = ipam.delete_service_host( + hostname='ha_lo', + host_addresses=input_host_addresses, + cname_aliases=['alias1.ha'], + service_type='LO' + ) + assert host_addresses is None + + # Fail because non-matching CNAME + with pytest.raises(AssertionError): + host_addresses = ipam.delete_service_host( + hostname='ha_lo', + host_addresses=input_host_addresses, + cname_aliases=['alias1.ha', 'alias2.ha', 'alias3.ha'], + service_type='LO' + ) + assert host_addresses is None