Skip to content
Snippets Groups Projects
Commit db0f1613 authored by JORGE SASIAIN's avatar JORGE SASIAIN
Browse files

NAT-186: implement cname record support

parent 1c5f45a3
No related branches found
No related tags found
2 merge requests!27Merge develop into NAT-185,!15Nat 185
...@@ -224,6 +224,7 @@ def _find_next_available_ip(infoblox_params, network_ref): ...@@ -224,6 +224,7 @@ def _find_next_available_ip(infoblox_params, network_ref):
def _allocate_host(hostname=None, def _allocate_host(hostname=None,
addrs=None, addrs=None,
networks=None, networks=None,
cname_aliases=None,
extattrs={} extattrs={}
) -> HostAddresses: ) -> HostAddresses:
""" """
...@@ -266,7 +267,7 @@ def _allocate_host(hostname=None, ...@@ -266,7 +267,7 @@ def _allocate_host(hostname=None,
assert _ip_addr_version(ipv4_addr) == 4 assert _ip_addr_version(ipv4_addr) == 4
assert _ip_addr_version(ipv6_addr) == 6 assert _ip_addr_version(ipv6_addr) == 6
ip_req_payload = { req_payload = {
"ipv4addrs": [ "ipv4addrs": [
{ {
"ipv4addr": ipv4_addr "ipv4addr": ipv4_addr
...@@ -285,7 +286,7 @@ def _allocate_host(hostname=None, ...@@ -285,7 +286,7 @@ def _allocate_host(hostname=None,
r = requests.post( r = requests.post(
f'{_wapi(infoblox_params)}/record:host', f'{_wapi(infoblox_params)}/record:host',
json=ip_req_payload, json=req_payload,
auth=HTTPBasicAuth(infoblox_params.username, auth=HTTPBasicAuth(infoblox_params.username,
infoblox_params.password), infoblox_params.password),
verify=False verify=False
...@@ -295,6 +296,28 @@ def _allocate_host(hostname=None, ...@@ -295,6 +296,28 @@ def _allocate_host(hostname=None,
assert isinstance(r.json(), str) assert isinstance(r.json(), str)
assert r.json().startswith("record:host/") assert r.json().startswith("record:host/")
if cname_aliases:
cname_req_payload = {
"name": "",
"canonical": hostname,
"view": "default",
"extattrs": extattrs
}
for alias in cname_aliases:
cname_req_payload["name"] = alias
r = requests.post(
f'{_wapi(infoblox_params)}/record:cname',
json=cname_req_payload,
auth=HTTPBasicAuth(infoblox_params.username,
infoblox_params.password),
verify=False
)
assert r.status_code >= 200 and r.status_code < 300, \
f"HTTP error {r.status_code}: {r.reason}\n\n{r.text}"
assert r.json().startswith("record:cname/")
return HostAddresses(v4=ipaddress.ip_address(ipv4_addr), return HostAddresses(v4=ipaddress.ip_address(ipv4_addr),
v6=ipaddress.ip_address(ipv6_addr)) v6=ipaddress.ip_address(ipv6_addr))
...@@ -303,6 +326,7 @@ def allocate_service_host(hostname=None, ...@@ -303,6 +326,7 @@ def allocate_service_host(hostname=None,
service_type=None, service_type=None,
service_networks: ServiceNetworks = None, service_networks: ServiceNetworks = None,
host_addresses: HostAddresses = None, host_addresses: HostAddresses = None,
cname_aliases=None,
extattrs={} extattrs={}
) -> HostAddresses: ) -> HostAddresses:
""" """
...@@ -327,6 +351,9 @@ def allocate_service_host(hostname=None, ...@@ -327,6 +351,9 @@ def allocate_service_host(hostname=None,
ipv6_containers = getattr(ipam_params, service_type).V6.containers ipv6_containers = getattr(ipam_params, service_type).V6.containers
domain_name = getattr(ipam_params, service_type).domain_name domain_name = getattr(ipam_params, service_type).domain_name
if cname_aliases:
cname_aliases = [alias + domain_name for alias in cname_aliases]
if not service_networks and not host_addresses: if not service_networks and not host_addresses:
# IPv4 # IPv4
ipv4_network = str(allocate_service_ipv4_network( ipv4_network = str(allocate_service_ipv4_network(
...@@ -343,6 +370,7 @@ def allocate_service_host(hostname=None, ...@@ -343,6 +370,7 @@ def allocate_service_host(hostname=None,
network_tuple = (ipv4_network, ipv6_network) network_tuple = (ipv4_network, ipv6_network)
host = _allocate_host(hostname=hostname+domain_name, host = _allocate_host(hostname=hostname+domain_name,
networks=network_tuple, networks=network_tuple,
cname_aliases=cname_aliases,
extattrs=extattrs) extattrs=extattrs)
elif service_networks: elif service_networks:
...@@ -359,6 +387,7 @@ def allocate_service_host(hostname=None, ...@@ -359,6 +387,7 @@ def allocate_service_host(hostname=None,
host = _allocate_host( host = _allocate_host(
hostname=hostname+domain_name, hostname=hostname+domain_name,
networks=(str(ipv4_network), str(ipv6_network)), networks=(str(ipv4_network), str(ipv6_network)),
cname_aliases=cname_aliases,
extattrs=extattrs extattrs=extattrs
) )
...@@ -376,6 +405,7 @@ def allocate_service_host(hostname=None, ...@@ -376,6 +405,7 @@ def allocate_service_host(hostname=None,
host = _allocate_host( host = _allocate_host(
hostname=hostname+domain_name, hostname=hostname+domain_name,
addrs=(str(ipv4_addr), str(ipv6_addr)), addrs=(str(ipv4_addr), str(ipv6_addr)),
cname_aliases=cname_aliases,
extattrs=extattrs extattrs=extattrs
) )
......
...@@ -46,31 +46,35 @@ def new_service_host(hostname, ...@@ -46,31 +46,35 @@ def new_service_host(hostname,
service_type, service_type,
service_networks: ServiceNetworks = None, service_networks: ServiceNetworks = None,
host_addresses: HostAddresses = None, host_addresses: HostAddresses = None,
cname_aliases=None,
extattrs={}) -> HostAddresses: extattrs={}) -> HostAddresses:
return _ipam.allocate_service_host( return _ipam.allocate_service_host(
hostname=hostname, hostname=hostname,
service_type=service_type, service_type=service_type,
service_networks=service_networks, service_networks=service_networks,
host_addresses=host_addresses, host_addresses=host_addresses,
cname_aliases=cname_aliases,
extattrs=extattrs) extattrs=extattrs)
if __name__ == '__main__': if __name__ == '__main__':
# sample call flow to allocate two loopback interfaces and a trunk service # sample call flow to allocate two loopback interfaces and a trunk service
# new_service_host can be called passing networks or addresses # new_service_host can be called passing networks or addresses
# - host h1 for service LO uses a specific ipv4/ipv6 address pair # - host h3 for service LO uses a specific ipv4/ipv6 address pair
# - the rest use the ipv4/ipv6 network pair # - the rest use the ipv4/ipv6 network pair
# networks and hosts can be allocated with extensible attributes # networks and hosts can be allocated with extensible attributes
# - host h2 for service LO uses extattrs for both network and address/DNS # - host h4 for service LO uses extattrs for both network and address/DNS
# - the rest don't use extattrs # - the rest don't use extattrs
# CNAME records can be optionally created
# - hosts for service TRUNK use some alias names
hostname_A = 'h1' hostname_A = 'h3'
hostname_B = 'h2' hostname_B = 'h4'
# h1 LO (loopback) # h3 LO (loopback)
lo1_service_networks = new_service_networks( lo1_service_networks = new_service_networks(
service_type='LO', service_type='LO',
comment="Network for h1 LO" comment="Network for h3 LO"
) )
lo1_v4_host_address = lo1_service_networks.v4.network_address lo1_v4_host_address = lo1_service_networks.v4.network_address
lo1_v6_host_address = lo1_service_networks.v6.network_address lo1_v6_host_address = lo1_service_networks.v6.network_address
...@@ -80,7 +84,7 @@ if __name__ == '__main__': ...@@ -80,7 +84,7 @@ if __name__ == '__main__':
service_type='LO', service_type='LO',
host_addresses=lo1_host_addresses) host_addresses=lo1_host_addresses)
# h2 LO (loopback) # h4 LO (loopback)
lo2_network_extattrs = { lo2_network_extattrs = {
"vrf_name": {"value": "dummy_vrf"}, "vrf_name": {"value": "dummy_vrf"},
} }
...@@ -89,21 +93,23 @@ if __name__ == '__main__': ...@@ -89,21 +93,23 @@ if __name__ == '__main__':
} }
lo2_service_networks = \ lo2_service_networks = \
new_service_networks(service_type='LO', new_service_networks(service_type='LO',
comment="Network for h2 LO", comment="Network for h4 LO",
extattrs=lo2_network_extattrs) extattrs=lo2_network_extattrs)
new_service_host(hostname=hostname_B+"_LO", new_service_host(hostname=hostname_B+"_LO",
service_type='LO', service_type='LO',
service_networks=lo2_service_networks, service_networks=lo2_service_networks,
extattrs=lo2_host_extattrs) extattrs=lo2_host_extattrs)
# h1-h2 TRUNK # h3-h4 TRUNK
trunk12_service_networks = new_service_networks( trunk12_service_networks = new_service_networks(
service_type='TRUNK', service_type='TRUNK',
comment="Network for h1-h2 TRUNK" comment="Network for h3-h4 TRUNK"
) )
new_service_host(hostname=hostname_A+"_TRUNK", new_service_host(hostname=hostname_A+"_TRUNK",
service_type='TRUNK', service_type='TRUNK',
cname_aliases=["alias1.h3", "alias2.h3"],
service_networks=trunk12_service_networks) service_networks=trunk12_service_networks)
new_service_host(hostname=hostname_B+"_TRUNK", new_service_host(hostname=hostname_B+"_TRUNK",
service_type='TRUNK', service_type='TRUNK',
cname_aliases=["alias1.h4"],
service_networks=trunk12_service_networks) service_networks=trunk12_service_networks)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment