neutron-lib/doc/source/contributor/api_attributes.rst
Thomas Morin c8e1389a55 API attribute processing: allow to populate dict attribute default values
Currently, the neutron-lib API code fills defaults values for the
attributes defined in a resource map, but does not fill defaults inside
the attributes that are dictionaries.

This change introduces a 'dict_populate_defaults' flag that allows the
defaults to be filled inside dictionary attributes (attributes of any
dictionary type).

This is useful to incorporate networking-sfc APIs and avoid using
the specific normalize_* converter methods [1] (see follow-up changes).

[1] https://github.com/openstack/networking-sfc/blob/master/networking_sfc/extensions/sfc.py#L226-L239

Change-Id: I0d7ff1981aa92d17811233e29a6ca7264a9ddb6c
2018-04-17 17:25:31 +02:00

4.5 KiB

API Attributes

Neutron's resource attributes are defined in dictionaries in api/definitions.

The map containing all installed resources (for core and active extensions) is in api/attributes.py.

Attribute map structure

Example attribute definitions for dns_name:

'dns_name': {
    'allow_post': True,
    'allow_put': True,
    'default': '',
    'convert_to': convert_to_lowercase,
    'validate': {'type:dns_name': FQDN_MAX_LEN},
    'is_visible': True
},

The validate item specifies rules for validating the attribute.

The convert_to item specifies rules for converting the attribute.

Example attribute definitions for gateway_ip:

'gateway_ip': {
    'allow_post': True,
    'allow_put': True,
    'default': constants.ATTR_NOT_SPECIFIED,
    'validate': {'type:ip_address_or_none': None},
    'is_visible': True
}

Note: a default of ATTR_NOT_SPECIFIED indicates that an attribute is not required, but will be generated by the plugin if it is not specified. Particularly, a value of ATTR_NOT_SPECIFIED is different from an attribute that has been specified with a value of None. For example, if gateway_ip is omitted in a request to create a subnet, the plugin will receive ATTR_NOT_SPECIFIED and the default gateway IP will be generated. However, if gateway_ip is specified as None, this means that the subnet does not have a gateway IP.

The following are the defined keys for attribute maps:

default default value of the attribute (if missing, the attribute becomes mandatory)
allow_post the attribute can be used on POST requests
allow_put the attribute can be used on PUT requests
validate specifies rules for validating data in the attribute
convert_to transformation to apply to the value before it is returned
convert_list_to if the value is a list, apply this transformation to the value before it is returned
is_filter the attribute can be used in GET requests as filter
is_sort_key the attribute can be used in GET requests as sort_key
is_visible the attribute is returned in GET responses
required_by_policy the attribute is required by the policy engine and should therefore be filled by the API layer even if not present in request body
enforce_policy the attribute is actively part of the policy enforcing mechanism, ie: there might be rules which refer to this attribute
primary_key Mark the attribute as a unique key.
default_overrides_none if set, if the value passed is None, it will be replaced by the default value
dict_populate_defaults if set, the default values of keys inside dict attributes, will be filled if not specified

When extending existing sub-resources, the sub-attribute map must define all extension attributes under the parameters object. This instructs the API internals to add the attributes to the existing sub-resource rather than overwrite its existing definition. For example:

SUB_RESOURCE_ATTRIBUTE_MAP = {
    'existing_subresource_to_extend': {
        'parameters': {
            'new_attr1': {
                'allow_post': False,
                # etc..
            }
        }
    }
}