[openstack-dev] [api][neutron] Best API for generating subnets from pool
sorlando at nicira.com
Mon Mar 9 13:05:35 UTC 2015
Neutron is adding a new concept of "subnet pool". To put it simply, it is a
collection of IP prefixes from which subnets can be allocated. In this way
a user does not have to specify a full CIDR, but simply a desired prefix
length, and then let the pool generate a CIDR from its prefixes. The full
spec is available at , whereas two patches are up for review at 
(CRUD) and  (integration between subnets and subnet pools).
While  is quite straightforward, I must admit I am not really sure that
the current approach chosen for generating subnets from a pool might be the
best one, and I'm therefore seeking your advice on this matter.
A subnet can be created with or without a pool.
Without a pool the user will pass the desired cidr:
Instead with a pool the user will pass pool id and desired prefix lenght:
The response to the previous call would populate the subnet cidr.
So far it looks quite good. Prefix_len is a bit of duplicated information,
but that's tolerable.
It gets a bit awkward when the user specifies also attributes such as
desired gateway ip or allocation pools, as they have to be specified in a
"cidr-agnostic" way. For instance:
would indicate that the user wishes to use the first address in the range
as the gateway IP, and the API would return something like this:
The problem with this approach is, in my opinion, that attributes such as
gateway_ip are used with different semantics in requests and responses;
this might also need users to write client applications expecting the
values in the response might differ from those in the request.
I have been considering alternatives, but could not find any that I would
regard as winner.
I therefore have some questions for the neutron community and the API
1) (this is more for neutron people) Is there a real use case for
requesting specific gateway IPs and allocation pools when allocating from a
pool? If not, maybe we should let the pool set a default gateway IP and
allocation pools. The user can then update them with another call. Another
option would be to provide "subnet templates" from which a user can choose.
For instance one template could have the gateway as first IP, and then a
single pool for the rest of the CIDR.
2) Is the action of creating a subnet from a pool better realized as a
different way of creating a subnet, or should there be some sort of "pool
which would return a subnet response like this (note prefix_len might not
be needed in this case)
I am generally not a big fan of RESTful actions. But in this case the
semantics of the API operation are that of a subnet creation from within a
pool, so that might be ok.
3) Would it be possible to consider putting information about how to
generate a subnet from a pool in the subnet request body as follows?
This would return a response like the previous.
This approach is in theory simple, but composite attributes proved to a
difficult beast already - for instance you can look at
external_gateway_info in the router definition 
Thanks for your time and thanks in advance for your feedback.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the OpenStack-dev