diff --git a/api-ref/source/v2/intro.inc b/api-ref/source/v2/intro.inc index 5bf61a665..cb71d115b 100644 --- a/api-ref/source/v2/intro.inc +++ b/api-ref/source/v2/intro.inc @@ -11,3 +11,496 @@ API guide This section introduces readers to OpenStack Networking (v2) API, providers guidelines on how to use it, and describes common features available to users throughout all Networking APIs. + +General information +=================== + +The Networking API v2.0 is a ReSTful HTTP service that uses all aspects of the +HTTP protocol including methods, URIs, media types, response codes, and so on. +Providers can use existing features of the protocol including caching, +persistent connections, and content compression. For example, providers who +employ a caching layer can respond with a 203 code instead of a 200 code when a +request is served from the cache. Additionally, providers can offer support +for conditional **GET** requests by using ETags, or they may send a redirect in +response to a **GET** request. Create clients so that these differences are +accounted for. + +Authentication and authorization +================================ + +The Networking API v2.0 uses the `OpenStack Identity service +<https://docs.openstack.org/developer/keystone>`_ as the default authentication +service. When Keystone is enabled, users that submit requests to the OpenStack +Networking service must provide an authentication token in **X-Auth-Token** +request header. You obtain the token by authenticating to the Keystone +endpoint. + +When Keystone is enabled, the ``tenant_id`` attribute is not required in create +requests because the tenant ID is derived from the authentication token. + +The default authorization settings allow only administrative users to create +resources on behalf of a different tenant. + +OpenStack Networking uses information received from Keystone to authorize user +requests. OpenStack Networking handles the following types of authorization +policies: + +- **Operation-based policies** specify access criteria for specific + operations, possibly with fine-grained control over specific attributes. + +- **Resource-based policies** access a specific resource. Permissions might or + might not be granted depending on the permissions configured for the + resource. Currently available for only the network resource. + +The actual authorization policies enforced in OpenStack Networking might vary +from deployment to deployment. + +Request and response formats +============================ + +The Networking API v2.0 supports both JSON and XML data serialization request +and response formats. + +Request format +-------------- + +Use the ``Content-Type`` request header to specify the request format. This +header is required for operations that have a request body. + +The syntax for the ``Content-Type`` header is: + +.. code:: + + Content-Type: application/FORMAT + +Where *FORMAT* is either ``json`` or ``xml``. + +Response format +--------------- + +Use one of the following methods to specify the response format: + +``Accept`` header + The syntax for the ``Accept`` header is: + + .. code:: + + Accept: application/FORMAT + + Where *FORMAT* is either ``json`` or ``xml``. The default format is + ``json``. + +Query extension + Add an ``.xml`` or ``.json`` extension to the request URI. For example, the + ``.xml`` extension in the following list networks URI request specifies + that the response body is to be returned in XML format: + + **GET** *publicURL*/networks.xml + +If you do not specify a response format, JSON is the default. + +If the ``Accept`` header and the query extension specify conflicting formats, +the format specified in the query extension takes precedence. For example, if +the query extension is ``.xml`` and the ``Accept`` header specifies +``application/json``, the response is returned in XML format. + +You can serialize a response in a different format from the request format. + +Filtering and column selection +============================== + +The Networking API v2.0 supports filtering based on all top level attributes of +a resource. Filters are applicable to all list requests. + +For example, the following request returns all networks named ``foobar``: + +.. code:: + + GET /v2.0/networks?name=foobar + +When you specify multiple filters, the Networking API v2.0 returns only objects +that meet all filtering criteria. The operation applies an AND condition among +the filters. + +Note +---- + +OpenStack Networking does not offer an OR mechanism for filters. + +Alternatively, you can issue a distinct request for each filter and build a +response set from the received responses on the client-side. + +By default, OpenStack Networking returns all attributes for any show or list +call. The Networking API v2.0 has a mechanism to limit the set of attributes +returned. For example, return ``id``. + +You can use the ``fields`` query parameter to control the attributes returned +from the Networking API v2.0. + +For example, the following request returns only ``id`` and ``name`` for each +network: + +.. code:: + + GET /v2.0/networks.json?fields=id&fields=name + +Synchronous versus asynchronous plug-in behavior +================================================ + +The Networking API v2.0 presents a logical model of network connectivity +consisting of networks, ports, and subnets. It is up to the OpenStack +Networking plug-in to communicate with the underlying infrastructure to ensure +packet forwarding is consistent with the logical model. A plug-in might perform +these operations asynchronously. + +When an API client modifies the logical model by issuing an HTTP **POST**, +**PUT**, or **DELETE** request, the API call might return before the plug-in +modifies underlying virtual and physical switching devices. However, an API +client is guaranteed that all subsequent API calls properly reflect the changed +logical model. + +For example, if a client issues an HTTP **PUT** request to set the attachment +for a port, there is no guarantee that packets sent by the interface named in +the attachment are forwarded immediately when the HTTP call returns. However, +it is guaranteed that a subsequent HTTP **GET** request to view the attachment +on that port returns the new attachment value. + +You can use the ``status`` attribute with the network and port resources to +determine whether the OpenStack Networking plug-in has successfully completed +the configuration of the resource. + +Bulk-create +=========== + +The Networking API v2.0 enables you to create several objects of the same type +in the same API request. Bulk create operations use exactly the same API syntax +as single create operations except that you specify a list of objects rather +than a single object in the request body. + +Bulk operations are always performed atomically, meaning that either all or +none of the objects in the request body are created. If a particular plug-in +does not support atomic operations, the Networking API v2.0 emulates the atomic +behavior so that users can expect the same behavior regardless of the +particular plug-in running in the background. + +OpenStack Networking might be deployed without support for bulk operations and +when the client attempts a bulk create operation, a 400 Bad request error is +returned. + +Pagination +========== + +To reduce load on the service, list operations will return a maximum number of +items at a time. To navigate the collection, the parameters limit, marker and +page\_reverse can be set in the URI. For example: + +.. code:: + + ?limit=100&marker=1234&page_reverse=False + +The ``marker`` parameter is the ID of the last item in the previous list. The +``limit`` parameter sets the page size. The ``page_reverse`` parameter sets +the page direction. These parameters are optional. If the client requests a +limit beyond the maximum limit configured by the deployment, the server returns +the maximum limit number of items. + +For convenience, list responses contain atom "next" links and "previous" links. +The last page in the list requested with 'page\_reverse=False' will not contain +"next" link, and the last page in the list requested with 'page\_reverse=True' +will not contain "previous" link. The following examples illustrate two pages +with three items. The first page was retrieved through: + +.. code:: + + GET http://127.0.0.1:9696/v2.0/networks.json?limit=2 + +Pagination is an optional feature of OpenStack Networking API, and it might be +disabled. If pagination is disabled, the pagination parameters will be ignored +and return all the items. + +If a particular plug-in does not support pagination operations, and pagination +is enabled, the Networking API v2.0 will emulate the pagination behavior so +that users can expect the same behavior regardless of the particular plug-in +running in the background. + +To determine if pagination is supported, a user can check whether the +'pagination' extension API is available. + +**Example Network collection, first page: JSON request** + +.. code:: + + GET /v2.0/networks.json?limit=2 HTTP/1.1 + Host: 127.0.0.1:9696 + Content-Type: application/json + Accept: application/json + + + +**Example Network collection, first page: JSON response** + +.. code:: + + { + "networks": [ + { + "admin_state_up": true, + "id": "396f12f8-521e-4b91-8e21-2e003500433a", + "name": "net3", + "provider:network_type": "vlan", + "provider:physical_network": "physnet1", + "provider:segmentation_id": 1002, + "router:external": false, + "shared": false, + "status": "ACTIVE", + "subnets": [], + "tenant_id": "20bd52ff3e1b40039c312395b04683cf" + }, + { + "admin_state_up": true, + "id": "71c1e68c-171a-4aa2-aca5-50ea153a3718", + "name": "net2", + "provider:network_type": "vlan", + "provider:physical_network": "physnet1", + "provider:segmentation_id": 1001, + "router:external": false, + "shared": false, + "status": "ACTIVE", + "subnets": [], + "tenant_id": "20bd52ff3e1b40039c312395b04683cf" + } + ], + "networks_links": [ + { + "href": "http://127.0.0.1:9696/v2.0/networks.json?limit=2&marker=71c1e68c-171a-4aa2-aca5-50ea153a3718", + "rel": "next" + }, + { + "href": "http://127.0.0.1:9696/v2.0/networks.json?limit=2&marker=396f12f8-521e-4b91-8e21-2e003500433a&page_reverse=True", + "rel": "previous" + } + ] + } + + + +**Example Network collection, first page: XML request** + +.. code:: + + GET /v2.0/networks.xml?limit=2 HTTP/1.1 + Host: 127.0.0.1:9696 + Content-Type: application/xml + Accept: application/xml + + + +**Example Network collection, first page: XML response** + +.. code:: + + <?xml version="1.0" ?> + <networks xmlns="http://openstack.org/neutron/api/v2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:provider="http://docs.openstack.org/ext/provider/api/v1.0" xmlns:neutron="http://openstack.org/neutron/api/v2.0" xmlns:router="http://docs.openstack.org/ext/neutron/router/api/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <network> + <status>ACTIVE</status> + <subnets neutron:type="list"/> + <name>net3</name> + <provider:physical_network>physnet1</provider:physical_network> + <admin_state_up neutron:type="bool">True</admin_state_up> + <tenant_id>20bd52ff3e1b40039c312395b04683cf</tenant_id> + <provider:network_type>vlan</provider:network_type> + <router:external neutron:type="bool">False</router:external> + <shared neutron:type="bool">False</shared> + <id>396f12f8-521e-4b91-8e21-2e003500433a</id> + <provider:segmentation_id neutron:type="long">1002</provider:segmentation_id> + </network> + <network> + <status>ACTIVE</status> + <subnets neutron:type="list"/> + <name>net2</name> + <provider:physical_network>physnet1</provider:physical_network> + <admin_state_up neutron:type="bool">True</admin_state_up> + <tenant_id>20bd52ff3e1b40039c312395b04683cf</tenant_id> + <provider:network_type>vlan</provider:network_type> + <router:external neutron:type="bool">False</router:external> + <shared neutron:type="bool">False</shared> + <id>71c1e68c-171a-4aa2-aca5-50ea153a3718</id> + <provider:segmentation_id neutron:type="long">1001</provider:segmentation_id> + </network> + <atom:link href="http://127.0.0.1:9696/v2.0/networks.xml?limit=2&marker=71c1e68c-171a-4aa2-aca5-50ea153a3718" rel="next"/> + <atom:link href="http://127.0.0.1:9696/v2.0/networks.xml?limit=2&marker=396f12f8-521e-4b91-8e21-2e003500433a&page_reverse=True" rel="previous"/> + </networks> + + + +The last page won't show the "next" links + +**Example Network collection, last page: JSON request** + +.. code:: + + GET /v2.0/networks.json?limit=2&marker=71c1e68c-171a-4aa2-aca5-50ea153a3718 HTTP/1.1 + Host: 127.0.0.1:9696 + Content-Type: application/json + Accept: application/json + + + +**Example Network collection, last page: JSON response** + +.. code:: + + { + "networks": [ + { + "admin_state_up": true, + "id": "b3680498-03da-4691-896f-ef9ee1d856a7", + "name": "net1", + "provider:network_type": "vlan", + "provider:physical_network": "physnet1", + "provider:segmentation_id": 1000, + "router:external": false, + "shared": false, + "status": "ACTIVE", + "subnets": [], + "tenant_id": "c05140b3dc7c4555afff9fab6b58edc2" + } + ], + "networks_links": [ + { + "href": "http://127.0.0.1:9696/v2.0/networks.json?limit=2&marker=b3680498-03da-4691-896f-ef9ee1d856a7&page_reverse=True", + "rel": "previous" + } + ] + } + + + +**Example Network collection, last page: XML request** + +.. code:: + + GET /v2.0/networks.xml?limit=2&marker=71c1e68c-171a-4aa2-aca5-50ea153a3718 HTTP/1.1 + Host: 127.0.0.1:9696 + Content-Type: application/xml + Accept: application/xml + + + +**Example Network collection, last page: XML response** + +.. code:: + + <?xml version="1.0" ?> + <networks xmlns="http://openstack.org/neutron/api/v2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:provider="http://docs.openstack.org/ext/provider/api/v1.0" xmlns:neutron="http://openstack.org/neutron/api/v2.0" xmlns:router="http://docs.openstack.org/ext/neutron/router/api/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <network> + <status>ACTIVE</status> + <subnets neutron:type="list"/> + <name>net1</name> + <provider:physical_network>physnet1</provider:physical_network> + <admin_state_up neutron:type="bool">True</admin_state_up> + <tenant_id>c05140b3dc7c4555afff9fab6b58edc2</tenant_id> + <provider:network_type>vlan</provider:network_type> + <router:external neutron:type="bool">False</router:external> + <shared neutron:type="bool">False</shared> + <id>b3680498-03da-4691-896f-ef9ee1d856a7</id> + <provider:segmentation_id neutron:type="long">1000</provider:segmentation_id> + </network> + <atom:link href="http://127.0.0.1:9696/v2.0/networks.xml?limit=2&marker=b3680498-03da-4691-896f-ef9ee1d856a7&page_reverse=True" rel="previous"/> + </networks> + + + +Sorting +======= + +You can use the ``sort_key`` and ``sort_dir`` parameters to sort the +results of list operations. Currently sorting does not work with extended +attributes of resource. The ``sort_key`` and ``sort_dir`` can be repeated, +and the number of ``sort_key`` and ``sort_dir`` provided must be same. The +``sort_dir`` parameter indicates in which direction to sort. Acceptable +values are ``asc`` (ascending) and ``desc`` (descending). + +Sorting is optional feature of OpenStack Networking API, and it might be +disabled. If sorting is disabled, the sorting parameters are ignored. + +If a particular plug-in does not support sorting operations and sorting is +enabled, the Networking API v2.0 emulates the sorting behavior so that users +can expect the same behavior regardless of the particular plug-in that runs in +the background. + +To determine if sorting is supported, a user can check whether the 'sorting' +extension API is available. + +Extensions +========== + +The Networking API v2.0 is extensible. + +The purpose of Networking API v2.0 extensions is to: + +- Introduce new features in the API without requiring a version change. + +- Introduce vendor-specific niche functionality. + +- Act as a proving ground for experimental functionalities that might be + included in a future version of the API. + +To programmatically determine which extensions are available, issue a **GET** +request on the **v2.0/extensions** URI. + +To query extensions individually by unique alias, issue a **GET** request on +the ``/v2.0/extensions/*alias_name*`` URI. Use this method to easily +determine if an extension is available. If the extension is not available, a +404 Not Found response is returned. + +You can extend existing core API resources with new actions or extra +attributes. Also, you can add new resources as extensions. Extensions usually +have tags that prevent conflicts with other extensions that define attributes +or resources with the same names, and with core resources and attributes. +Because an extension might not be supported by all plug-ins, the availability +of an extension varies with deployments and the specific plug-in in use. + + +Faults +====== + +The Networking API v2.0 returns an error response if a failure occurs while +processing a request. OpenStack Networking uses only standard HTTP error codes. +4\ *nn* errors indicate problems in the particular request being sent from +the client. + ++-------+--------------------------------------------------------------+ +| Error | Description | ++=======+==============================================================+ +| 400 | Bad request | +| | Malformed request URI or body requested admin state invalid | +| | Invalid values entered | +| | Bulk operations disallowed | +| | Validation failed | +| | Method not allowed for request body (such as trying to | +| | update attributes that can be specified at create-time only) | ++-------+--------------------------------------------------------------+ +| 404 | Not Found | +| | Non existent URI | +| | Resource not found | ++-------+--------------------------------------------------------------+ +| 409 | Conflict | +| | Port configured on network | +| | IP allocated on subnet | +| | Conflicting IP allocation pools for subnet | ++-------+--------------------------------------------------------------+ +| 500 | Internal server error | +| | Internal OpenStack Networking error | ++-------+--------------------------------------------------------------+ +| 503 | Service unavailable | +| | Failure in Mac address generation | ++-------+--------------------------------------------------------------+ + +Users submitting requests to the Networking API v2.0 might also receive the +following errors: + +- 401 Unauthorized - If invalid credentials are provided. + +- 403 Forbidden - If the user cannot access a specific resource or perform the + requested operation.