10-05-2017 02:37 AM - edited 03-01-2019 04:00 AM
Hi team,
(NSO 4.4.2, IP allocator 1.3)
I am working on a Python script that uses the ip-allocator package, and trying to use primary and secondary scopes. My code happily creates allocations from pools with free address blocks.
alloc1 = root.resource_pools.ip_address_pool[ippool.name].allocation.create(str(hostname))
alloc1.id = hostname
alloc1.request.subnet_size = 28
alloc1.username = username
print str(alloc1.response.error) # Always returns "None"
However, I want to test pool exhaustion and if needed, getting an allocation from another scope associated to a same site.
I have, for one site, multiple pools (various subnet sizes) : POOL1, POOL2 and POOL3. If I try to get an allocation from a full subnet (let's say POOL1), I don't get an error message at the create() or apply() time. I only see the failed allocation in NSO console :
NAME ID ERROR SUBNET FROM
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
POOL1 test-full-scope - 10.1.1.0/24 10.1.1.0/24
test-device com.tailf.pkg.ipam.exceptions.AddressPoolEmptyException: No addresses available - -
I can also find this out if I read the allocation back from my python script :
com.tailf.pkg.ipam.exceptions.AddressPoolEmptyException: No addresses available
but this happens after the apply, so I can only find out that the allocation failed after commiting the changes.
What is the best way to achieve what I'm trying to do here ? Is there a way to immediately see before calling apply() if the allocation creation won't work due to a full scope ?
Cheers,
Marc
11-06-2017 02:50 PM
As you have noticed, you will not get an error at commit. The reason is that the allocators are implemented using the Reactive FastMap pattern. So the idea is that you write your allocation request, and when it becomes available (or fails) your service is redeployed.
If you use the helper python functions that come with the IP/ID allocators, you'll get this behavior for "free" and when you call the function to receive (net_read below) the allocated ID/IP, it will throw an exception in case something went wrong (e.g. exhausted pool).
import ipaddress_allocator.ipaddress_allocator as ip_allocator
ip_allocator.net_request(service,
"/services/vl:loop-python[name='%s']" % (service.name),
tctx.username,
pool_name,
alloc_name,
service.cidr_length)
net = ip_allocator.net_read(tctx.username, root,
pool_name, alloc_name)
if not net:
self.log.info("Alloc not ready")
return
Discover and save your favorite ideas. Come back to expert answers, step-by-step guides, recent topics, and more.
New here? Get started with these tips. How to use Community New member guide