Jump to: navigation, search

Difference between revisions of "Atlas-LB"

m (added to neutron)
 
(72 intermediate revisions by 4 users not shown)
Line 1: Line 1:
__NOTOC__
+
 
= [[OpenStack]] [[LoadBalancers]] API 1.1 =
+
<!-- #acl [[YoucefLaribi]]:read,write,delete,revert,admin [[UmaGoring]]:read,write,delete,revert,admin Uma.Goring:read,write,delete,revert,admin All:read -->
<<[[TableOfContents]]()>>
+
 
 +
<pre><nowiki>#!wiki caution
 +
'''Note'''
 +
 
 +
If you want to discuss changes to this spec or found an error, please contact uma.goring AT rackspace.com or youcef.laribi AT citrix.com
 +
</nowiki></pre>
 +
 
 +
= OpenStack LoadBalancers API 1.1 =
 +
__TOC__
  
 
== Overview ==
 
== Overview ==
 
=== Intended Audience ===
 
=== Intended Audience ===
This guide is intended for software developers who want to create applications using the [[OpenStackLoad]] Balancers API. It assumes the reader has a general understanding of load balancing concepts and is familiar with:  
+
This guide is intended for software developers who want to create applications using the OpenStack Load Balancers API. It assumes the reader has a general understanding of load balancing concepts and is familiar with:
  
 
* ReSTful web services
 
* ReSTful web services
Line 12: Line 20:
  
 
=== Document Change History ===
 
=== Document Change History ===
This version of the Developer Guide replaces and obsoletes all previous versions. The most recentchanges are described in the table below:  
+
This version of the Developer Guide replaces and obsoletes all previous versions. The most recent changes are described in the table below:
  
 
==== Revision Date Summary of Changes ====
 
==== Revision Date Summary of Changes ====
Line 18: Line 26:
 
| '''Revision Date'''  
 
| '''Revision Date'''  
 
|-
 
|-
| May 18, 2011  
+
| Feb 9, 2012
 +
|-
 +
| Jan. 24, 2012
 +
|-
 +
| May 27, 2011  
 
|-
 
|-
 
| Apr. 19, 2011  
 
| Apr. 19, 2011  
Line 26: Line 38:
  
 
== Concepts ==
 
== Concepts ==
To use [[OpenStack]] Load Balancers API effectively, you should understand several key concepts:
+
To use OpenStack Load Balancers API effectively, you should understand several key concepts:
  
 
=== Load Balancer ===
 
=== Load Balancer ===
Line 37: Line 49:
 
A node is a back-end device providing a service on a specified IP and port.
 
A node is a back-end device providing a service on a specified IP and port.
  
=== Health Monitor ===
+
=== Health Monitoring ===
A health monitor is a feature of each load balancer. It is used to determine whether or not a back- end node is usable for processing a request. The load balancing service supports two types of health monitors: passive and active.
+
A health monitor is a feature of each load balancer. It is used to determine whether or not a back-end node of the load balancer is usable for processing a request. The load balancing service supports two health monitoring modes: passive and active.
  
==== Passive Health Monitor ====
+
==== Passive Health Monitoring ====
By default, all load balancing configurations utilize a passive health monitor, which is the default monitoring and does not require configuration from the user. If the passive health monitoring determines that a node is down, unreachable or malfunctioning, it puts the node in an OFFLINE state and stops sending traffic to it.
+
By default, all load balancing configurations utilize passive health monitoring, which is the default monitoring and does not require any configuration from the user. If the passive health monitoring determines that a node is down, unreachable or malfunctioning, it puts the node in an OFFLINE state and stops sending traffic to it.
  
==== Active Health Monitor ====
+
==== Active Health Monitoring ====
Active health monitoring is a technique that is configured by users. It uses synthetic transactions executed at periodic intervals to determine the condition of a node. When active monitoring is configured, it takes over the monitoring of the nodes, and passive monitoring is disabled. Conversely, when active monitoring configuration is removed by the user, passive monitoring is re-enabled for the nodes of the load balancer.  
+
Active health monitoring is a technique that is explicitly configured by users. It uses synthetic transactions executed at periodic intervals to determine the condition of a node. When active monitoring is activated, it takes over the monitoring of the nodes, and passive monitoring is disabled. Conversely, when active monitoring is removed by the user, passive monitoring is re-enabled for the nodes of the load balancer. This guarantees that the nodes health is always monitored.
  
The active health monitor can use one of three types of probes:  
+
When configuring active health monitoring, a user can choose between using one of three types of probes:
  
 
* CONNECT
 
* CONNECT
Line 55: Line 67:
  
 
=== Session Persistence ===
 
=== Session Persistence ===
Session persistence is a feature of the load balancing service. It attempts to force subsequent connections to a service to be redirected to the same node as long as it is online.
+
Session persistence is a feature of the load balancing service. It attempts to force subsequent connections or requests in the same session to be redirected to the same node as long as it is online.
 
 
=== Connection Logging ===
 
The connection logging feature allows for retrieving access logs (for HTTP-based protocol traffic) or connection and transfer logs (for all other traffic)
 
  
 
== General API Information ==
 
== General API Information ==
Sections in this chapter describe operations and guidelines that are common to all [[OpenStack]] APIs, not specific to the Load Balancing API.
+
Sections in this chapter describe operations and guidelines that are common to all OpenStack APIs, and are not specific to the Load Balancing API.
  
 
=== Authentication ===
 
=== Authentication ===
Load Balancing API will use the standard defined by [[OpenStack]] for authentication. Once this is finalized, this section will describe how users can authenticate and obtain a token from the [[OpenStack]] Authentication service, and how they can present this token using the Load Balancing API.
+
This API uses the standard defined by OpenStack for authentication. This is currently a work in progress. Once this is finalized, this section will describe how users can authenticate and obtain a token from the OpenStack Authentication service, and how they can present this token in the Load Balancing API.
  
Refer to current status of [[OpenStack]] Authentication at http://wiki.openstack.org/openstack-authn for detailed information
+
Refer to current status of OpenStack Authentication at http://wiki.openstack.org/openstack-authn and to OpenStack project [[KeyStone]] for detailed information.
  
 
=== Service Access/Endpoints ===
 
=== Service Access/Endpoints ===
Your service provider will publish the endpoints that you can use to connect to their LB service.
+
Your service provider will publish the endpoints that you can use to connect to the LB service it operates.
  
 
=== Request/Response Types ===
 
=== Request/Response Types ===
Line 110: Line 119:
  
 
=== Persistent Connections ===
 
=== Persistent Connections ===
By default, the API supports persistent connections via HTTP/1.1keepalives. All connections will be kept alive unless the connection header is set to close.
+
By default, the API supports persistent connections via HTTP/1.1 keep-alives. All connections will be kept alive unless the connection header is set to close.
 
 
== General API Information ==
 
Sections in this chapter describe operations and guidelines that are common to all [[OpenStack]] APIs, not specific to the Load Balancing API.
 
 
 
=== Authentication ===
 
Load Balancing API will use the standard defined by [[OpenStack]] for authentication. Once this is finalized, this section will describe how users can authenticate and obtain a token from the [[OpenStack]] Authentication service, and how they can present this token using the Load Balancing API.
 
 
 
Refer to current status of [[OpenStack]] Authentication at http://wiki.openstack.org/openstack-authn for detailed information
 
 
 
=== Service Access/Endpoints ===
 
Your service provider will publish the endpoints that you can use to connect to their LB service.
 
 
 
=== Request/Response Types ===
 
The Cloud Load Balancers API supports both the JSON and XML data serialization formats. The request format is specified using the Content-Type header and is required for operations that have a request body. The response format can be specified in requests using either the Accept header or adding an .xml or .json extension to the request URI.
 
 
 
Note that it is possible for a response to be serialized using a format different from the request. If no response format is specified, JSON is the default. If conflicting formats are specified using both an Accept header and a query extension, the query extension takes precedence.
 
 
 
'''Table 3.1. JSON and XML Response Formats'''
 
{| border="1" cellpadding="2" cellspacing="0"
 
| Format
 
| Accept Header
 
| Query Extension
 
|-
 
| JSON
 
| application/json
 
| .json
 
|-
 
| XML
 
| application/xml
 
| .xml
 
|}
 
 
 
=== Content Compression ===
 
Request and response body data may be encoded with gzip compression to accelerate interactive performance of API calls and responses. This is controlled using the Accept-Encoding header in the request from the client and indicated by the Content-Encoding header in the server response.
 
 
 
Unless the header is explicitly set, encoding defaults to disabled.
 
 
 
'''Table 3.2. Encoding Headers'''
 
{| border="1" cellpadding="2" cellspacing="0"
 
| Header
 
| Type
 
| Name
 
|-
 
| HTTP/1.1
 
| Request
 
| Accept-Encoding
 
|-
 
| HTTP/1.1
 
| Response
 
| Content-Encoding
 
|}
 
 
 
=== Persistent Connections ===
 
By default, the API supports persistent connections via HTTP/1.1 keepalives. All connections will be kept alive unless the connection header is set to close.
 
  
  
Line 172: Line 127:
 
The server may close the connection at any time and clients should not rely on this behavior.
 
The server may close the connection at any time and clients should not rely on this behavior.
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
=== Paginated Collections ===
 
=== Paginated Collections ===
Line 178: Line 132:
  
 
=== Limits ===
 
=== Limits ===
Accounts may be preconfigured set of thresholds (or limits) to manage capacity and prevent abuse ofthe system. The system recognizes two kinds of limits: rate limits and absolute limits. Rate limits are thresholds that are reset after a certain amount of time passes. Absolute limits are fixed.
+
Accounts may be preconfigured with a set of thresholds (or limits) to manage capacity and prevent abuse of the system. The system recognizes two kinds of limits: rate limits and absolute limits. Rate limits are thresholds that are reset after a certain amount of time passes. Absolute limits are fixed.
  
 
==== Rate Limits ====
 
==== Rate Limits ====
Line 185: Line 139:
 
'''Table 3.3. Default Rate Limits'''
 
'''Table 3.3. Default Rate Limits'''
 
{| border="1" cellpadding="2" cellspacing="0"
 
{| border="1" cellpadding="2" cellspacing="0"
| '''Verb'''
+
| '''Verb'''  
| '''URI'''
+
| '''URI'''  
| '''RegEx'''
+
| '''RegEx'''  
 
|-
 
|-
 
| GET  
 
| GET  
Line 210: Line 164:
 
|}
 
|}
  
Rate limits are applied in order relative to the verb, going from least to most specific. For example, although the threshold for POST to /v1.1/* is 25 per minute, one cannot POST to /v1.1/* more than2 times per second because the rate limit for any POST is 2 per second. In the event you exceed the thresholds established for your account, a 413 (Rate Control) HTTP response will be returned with a Retry-After header to notify the client when they can attempt to try again.
+
Rate limits are applied in order relative to the verb, going from least to most specific. For example, although the threshold for POST to /v1.1/* is 25 per minute, one cannot POST to /v1.1/* more than 2 times per second because the rate limit for any POST is 2 per second. In the event you exceed the thresholds established for your account, a 413 (Rate Control) HTTP response will be returned with a Retry-After header to notify the client when they can attempt to try again.
  
 
==== Absolute Limits ====
 
==== Absolute Limits ====
Line 217: Line 171:
 
The following table shows some of these limits and example values:
 
The following table shows some of these limits and example values:
 
{| border="1" cellpadding="2" cellspacing="0"
 
{| border="1" cellpadding="2" cellspacing="0"
| '''Name'''
+
| '''Name'''  
| '''Value'''
+
| '''Value'''  
 
|-
 
|-
| maxLoadBalancers
+
| maxLoadBalancers  
| 20
+
| 20  
 
|-
 
|-
| maxNodesPerLoadBalancer
+
| maxNodesPerLoadBalancer  
| 5
+
| 5  
 
|-
 
|-
| maxVIPsperLoadBalancer
+
| maxVIPsPerLoadBalancer
| 2
+
| 1
 
|-
 
|-
| maxDaysForDeletedLoadBalancers
+
| maxDaysKeptForDeletedLoadBalancers
| 15
+
| 15  
 
|-
 
|-
| maxLoadBalancerNameLength
+
| maxLoadBalancerNameLength  
| 15
+
| 15  
 
|}
 
|}
  
 
==== Determining Limits Programmatically ====
 
==== Determining Limits Programmatically ====
Applications can programmatically determine current account limits using the /limitsURI as  follows:
+
Applications can programmatically determine current account limits using the /limits URI as  follows:
 
 
 
{| border="1" cellpadding="2" cellspacing="0"
 
{| border="1" cellpadding="2" cellspacing="0"
| '''Verb'''
+
| '''Verb'''  
| '''URI'''
+
| '''URI'''  
 
|-
 
|-
| GET
+
| GET  
| /limits
+
| /limits  
 
|}
 
|}
  
Line 257: Line 210:
  
 
<pre><nowiki>#!highlight xml numbers=disable
 
<pre><nowiki>#!highlight xml numbers=disable
<limits xmlns="http://docs.openstack.org/common/api/v1.1">
+
<limits xmlns="http://docs.openstack.org/common/api/v1.1">
   <rates>
+
   <rates>
 
       <rate uri="/v1.1/*" regex="^/1.1/.*">
 
       <rate uri="/v1.1/*" regex="^/1.1/.*">
           <limit  verb="GET"  value="600000"
+
           <limit  verb="GET"  value="600000"
                   remaining="426852"  unit="HOUR"      
+
                   remaining="426852"  unit="HOUR"
 
                   next-available="2011-02-22T19:32:43.835Z"/>
 
                   next-available="2011-02-22T19:32:43.835Z"/>
       </rate>  
+
       </rate>
   </rates>  
+
   </rates>
  
   <absolute>  
+
   <absolute>
       <limit name="maxNodesPerLoadBalancer" value="5"/>
+
       <limit name="maxNodesPerLoadBalancer" value="5"/>
       <limit name="maxVIPsperLoadBalancer" value="2"/>
+
       <limit name="maxVIPsPerLoadBalancer" value="1"/>
   </absolute>  
+
   </absolute>
 
</limits>
 
</limits>
 
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
''' Example 3.2. List Limits Response: JSON '''
 
''' Example 3.2. List Limits Response: JSON '''
Line 280: Line 231:
 
<pre><nowiki>#!highlight javascript numbers=disable
 
<pre><nowiki>#!highlight javascript numbers=disable
 
  {
 
  {
     "limits" :  
+
     "limits" :
 
           {
 
           {
 
             "rate" : {
 
             "rate" : {
 
                       "values": [
 
                       "values": [
                                   {
+
                                   {
                                     "uri" : "/v1.1/*",
+
                                     "uri" : "/v1.1/*",
                                     "regex" : "^/1./.*",  
+
                                     "regex" : "^/1./.*",
 
                                     "limit" : [
 
                                     "limit" : [
                                               {
+
                                               {
                                                 "verb" : "GET",
+
                                                 "verb" : "GET",
                                                 "value" : 600000,
+
                                                 "value" : 600000,
                                                 "remaining" : 426852,
+
                                                 "remaining" : 426852,
                                                 "unit" : "HOUR",
+
                                                 "unit" : "HOUR",
 
                                                 "next-available" : "2011-02-22T19:32:43.835Z"
 
                                                 "next-available" : "2011-02-22T19:32:43.835Z"
 
                                               }
 
                                               }
                                               ]  
+
                                               ]
 
                                   }
 
                                   }
  
                                 ]  
+
                                 ]
                     },  
+
                     },
 
             "absolute" : {
 
             "absolute" : {
                           "values" : {  
+
                           "values" : {
                                         "maxNodesPerLoadBalancer" : 5,
+
                                         "maxNodesPerLoadBalancer" : "5",
                                         "maxVIPsperLoadBalancer" : 2
+
                                         "maxVIPsPerLoadBalancer" : "1"
 
                                       }
 
                                       }
                         }  
+
                         }
           }  
+
           }
 
}
 
}
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
=== Faults ===
 
=== Faults ===
 
+
API calls that return an error return one of the following fault objects. All fault objects extend from the base fault, serviceFault, for easier exception handling for languages that support it.
API calls that return an error return one of the following fault objects. All fault objects extend from thebase fault, serviceFault, for easier exception handling for languages that support it.  
 
  
 
==== serviceFault ====
 
==== serviceFault ====
The serviceFault and by extension all other faults include message and detailelements which  contain strings describing the nature of the fault as well as a code attribute representing the HTTP response code for convenience. The code attribute of the fault is for the convenience of the caller so  that they may retrieve the response code from the HTTP response headers or directly from the fault object if they choose. The caller should not expect the serviceFault to be returned directly but should instead expect only one of the child faults to be returned.
+
The serviceFault and by extension all other faults include message and detail elements which  contain strings describing the nature of the fault as well as a code attribute representing the HTTP response code for convenience. The code attribute of the fault is for the convenience of the caller so  that they may retrieve the response code from the HTTP response headers or directly from the fault object if they choose. The caller should not expect the serviceFault to be returned directly but should instead expect only one of the child faults to be returned.
  
 
==== badRequest ====
 
==== badRequest ====
Line 325: Line 274:
  
 
<pre><nowiki>#!highlight xml numbers=disable
 
<pre><nowiki>#!highlight xml numbers=disable
<badRequest xmlns="http://docs.openstack.org/loadbalancers/api/v1.1" code="400">
+
<badRequest xmlns="http://docs.openstack.org/atlas/api/v1.1" code="400">
   <message>Validation fault</message>  
+
   <message>Validation fault</message>
 
   <details>The object is not valid</details>
 
   <details>The object is not valid</details>
 
   <validationErrors>
 
   <validationErrors>
       <message>Node ip is invalid. Please specify a valid ip.</message>
+
       <message>Node IP address is invalid. Please specify a valid IP address.</message>
   </validationErrors>  
+
   </validationErrors>
 
</badRequest>
 
</badRequest>
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
==== immutableEntity ====
 
==== immutableEntity ====
This fault is returned when a user attempts to modify an item that is not currently in a state that allows modification. For example, load balancers in a status of PENDING_UPDATE,BUILD, or DELETED may not be modified.  
+
This fault is returned when a user attempts to modify an item that is not currently in a state that allows modification. For example, load balancers in a status of BUILD,PENDING_UPDATE or DELETED may not be modified.
  
 
''' Example 3.4. Fault Response, immutableEntity '''
 
''' Example 3.4. Fault Response, immutableEntity '''
Line 342: Line 290:
  
 
<pre><nowiki>#!highlight xml numbers=disable
 
<pre><nowiki>#!highlight xml numbers=disable
<immutableEntity code="422" xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">  
+
<immutableEntity code="422" xmlns="http://docs.openstack.org/atlas/api/v1.1">
   <message>The object at the specified URI is immutable and can not be overwritten.</message> </immutableEntity>
+
   <message>The object at the specified URI is immutable and cannot be modified.
 +
  </message>
 +
</immutableEntity>
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
==== itemNotFound ====
 
==== itemNotFound ====
 
 
'''Example 3.5. Fault Response, itemNotFound '''
 
'''Example 3.5. Fault Response, itemNotFound '''
  
  
 
<pre><nowiki>#!highlight xml numbers=disable
 
<pre><nowiki>#!highlight xml numbers=disable
<itemNotFound code="404" xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">  
+
<itemNotFound code="404" xmlns="http://docs.openstack.org/atlas/api/v1.1">
   <message>Object not Found</message>  
+
   <message>Object not Found</message>
 
</itemNotFound>
 
</itemNotFound>
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
==== loadBalancerFault ====
 
==== loadBalancerFault ====
Line 366: Line 313:
  
 
<pre><nowiki>#!highlight xml numbers=disable
 
<pre><nowiki>#!highlight xml numbers=disable
<loadBalancerFault code="500" xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">  
+
<loadBalancerFault code="500" xmlns="http://docs.openstack.org/atlas/api/v1.1">
 
   <message>Load Balancer has experienced an internal error</message>
 
   <message>Load Balancer has experienced an internal error</message>
 
</loadBalancerFault>
 
</loadBalancerFault>
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
==== outOfVirtualIps ====
 
==== outOfVirtualIps ====
This fault indicates that there are no virtual IPs left to assign to a new load balancer. In practice, this fault should not occur, as virtual IPs will be ordered as capacity is required. If you do experience this fault, contact support so that we may make more IPs available.  
+
This fault indicates that there are no virtual IPs left to assign to a new load balancer. In practice, this fault should not occur, as virtual IPs will be ordered as capacity is required.
  
 
''' Example 3.7. Fault Response, outOfVirtualIps '''
 
''' Example 3.7. Fault Response, outOfVirtualIps '''
Line 379: Line 325:
  
 
<pre><nowiki>#!highlight xml numbers=disable
 
<pre><nowiki>#!highlight xml numbers=disable
<outOfVirtualIps code="500" xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">
+
<outOfVirtualIps code="500" xmlns="http://docs.openstack.org/atlas/api/v1.1">
   <message>  
+
   <message>
       Out of virtual IPs. Please contact support so they can allocate more virtual IPs.  
+
       Out of virtual IPs. Please contact support so they can allocate more virtual IPs.
   </message>  
+
   </message>
</outOfVirtualips>
+
</outOfVirtualIps>
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
==== overLimit ====
 
==== overLimit ====
Line 394: Line 339:
  
 
<pre><nowiki>#!highlight xml numbers=disable
 
<pre><nowiki>#!highlight xml numbers=disable
<overLimit code="413" xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">
+
<overLimit code="413" xmlns="http://docs.openstack.org/atlas/api/v1.1">
 
   <message>
 
   <message>
     Your account is currently over the limit so your requestcould not be processed.
+
     Load balancer cannot be created. You have reached your maximum number of load balancers.
   </message>  
+
   </message>
 
</overLimit>
 
</overLimit>
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
==== serviceUnavailable ====
 
==== serviceUnavailable ====
Line 409: Line 353:
  
 
<pre><nowiki>#!highlight xml numbers=disable
 
<pre><nowiki>#!highlight xml numbers=disable
<serviceUnavailable code="500" xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">
+
<serviceUnavailable code="500" xmlns="http://docs.openstack.org/atlas/api/v1.1">
   <message>The Load balancing service is currently not available</message>
+
   <message>The Load balancing service is currently not available</message>
 
</serviceUnavailable>
 
</serviceUnavailable>
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
==== unauthorized ====
 
==== unauthorized ====
Line 422: Line 365:
  
 
<pre><nowiki>#!highlight xml numbers=disable
 
<pre><nowiki>#!highlight xml numbers=disable
<unauthorized code="401" xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">  
+
<unauthorized code="401" xmlns="http://docs.openstack.org/atlas/api/v1.1">
     <message>You are not authorized to execute this operation.</message>
+
     <message>You are not authorized to execute this operation.</message>
 
</unauthorized>
 
</unauthorized>
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
==== unprocessableEntity ====
 
==== unprocessableEntity ====
This fault is returned when an operation is requested on an item that was unabled to be followed due to semantic errors.  
+
This fault is returned when an entity cannot be processed due to semantic errors.
  
 
'''Example 3.11. Fault Response, unprocessableEntity'''
 
'''Example 3.11. Fault Response, unprocessableEntity'''
 +
  
 
<pre><nowiki>#!highlight xml numbers=disable
 
<pre><nowiki>#!highlight xml numbers=disable
<unprocessableEntity code="422" xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">
+
<unprocessableEntity code="422" xmlns="http://docs.openstack.org/atlas/api/v1.1">
   <message>The Object at the specified URI is unprocessable.</message>  
+
   <message>The Object at the specified URI is unprocessable.</message>
</unprocessableEntity>  
+
</unprocessableEntity>
 
</nowiki></pre>
 
</nowiki></pre>
  
 
^l
 
 
== API Operations ==
 
== API Operations ==
 
+
This chapter explains specific API operations. For ideas relevant to all API operations, see the "General API Information" chapter.
This chapter explains specific API operations. For ideas relevant to all API operations, see the "GeneralAPI Information" chapter.  
 
  
 
=== Load Balancers ===
 
=== Load Balancers ===
 
 
==== List Load Balancers ====
 
==== List Load Balancers ====
 
 
{| border="1" cellpadding="2" cellspacing="0"
 
{| border="1" cellpadding="2" cellspacing="0"
| Verb
+
| Verb  
| URI
+
| URI  
| Description
+
| Description  
 
|-
 
|-
| GET
+
| GET  
| /loadbalancers
+
| /loadbalancers  
| List all load balancers configured for theaccount.
+
| List all load balancers configured for the account.  
 
|}
 
|}
  
'''Normal Response Code(s)''': 200  
+
'''Normal Response Code(s)''': 200
 +
 
 +
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
  
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
+
This operation provides a list of all load balancers configured and associated with your account.
  
This operation provides a list of all load balancers configured and associated with your account.  
+
To view deleted load balancers, add "?status=DELETED" to the end of the  GET URI. A deleted loadbalancer is immutable and irrecoverable.
  
To view deleted load balancers, add "?status=DELETED" to the end of the get url. A deleted loadbalancer is immutable and irrecoverable.
+
This operation returns the following attributes for each load balancer:
  
* id  
+
* id
* name  
+
* name
 
* algorithm
 
* algorithm
 
* protocol
 
* protocol
 
* port
 
* port
* created  
+
* status
 +
* created
 
* updated
 
* updated
  
This operation does not require a request body.  
+
This operation does not require a request body.
  
 
'''Example 4.1. List Load Balancers Response: XML '''
 
'''Example 4.1. List Load Balancers Response: XML '''
 +
  
 
<pre><nowiki>#!highlight xml numbers=disable
 
<pre><nowiki>#!highlight xml numbers=disable
<?xml version="1.0" ?>  
+
<?xml version="1.0" ?>
<loadBalancers xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">  
+
<loadBalancers xmlns="http://docs.openstack.org/atlas/api/v1.1">
   <loadBalancer id="71" name="lb-site1" status="ACTIVE"  
+
   <loadBalancer id="71" name="lb-site1" status="ACTIVE"
                 protocol="HTTP" port="80" algorithm="RANDOM">
+
                 protocol="HTTP" port="80" algorithm="LEAST_CONNECTIONS" created="2010-12-13T15:38:27-06:00" updated="2010-12-13T15:38:38-06:00" >
    <virtualIps>
 
        <virtualIp id="403" address="206.55.130.1"
 
                  ipVersion="IPV4" type="PUBLIC" />
 
    </virtualIps>
 
 
 
    <created time="2010-12-13T15:38:27-06:00" />
 
    <updated time="2010-12-13T15:38:38-06:00" />  
 
 
   </loadBalancer>
 
   </loadBalancer>
  
   <loadBalancer id="166" name="lb-site2" status="ACTIVE"  
+
   <loadBalancer id="166" name="lb-site2" status="ACTIVE"
                 protocol="HTTP" port="80" algorithm="RANDOM">
+
                 protocol="HTTP" port="80" algorithm="ROUND_ROBIN" created="2010-12-13T15:38:27-06:00" updated="2010-12-13T15:38:38-06:00" >
    <virtualIps>
 
      <virtualIp id="401" address="206.55.130.2" ipVersion="IPV4"
 
                type="PUBLIC" />
 
    </virtualIps>
 
 
 
    <created time="2010-12-13T15:38:27-06:00" />
 
    <updated time="2010-12-13T15:38:38-06:00" />  
 
 
   </loadBalancer>
 
   </loadBalancer>
</loadBalancers>  
+
</loadBalancers>
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
'''Example 4.2. List Load Balancers Response: JSON'''
 
'''Example 4.2. List Load Balancers Response: JSON'''
 +
  
 
<pre><nowiki>#!highlight javascript numbers=disable
 
<pre><nowiki>#!highlight javascript numbers=disable
{  
+
{
 
   "loadBalancers":[
 
   "loadBalancers":[
         {  
+
         {
           "name":"lb-site1",  
+
           "name":"lb-site1",
           "id":"71",  
+
           "id":"71",
           "protocol":"HTTP",  
+
           "protocol":"HTTP",
           "port":"80",  
+
           "port":"80",
           "algorithm":"ROUND_ROBIN",  
+
           "algorithm":"LEAST_CONNECTIONS",
           "status":"ACTIVE",
+
           "status":"ACTIVE",
          "virtualIps": [
+
           "created":"2010-11-30T03:23:42Z",
                      {
+
           "updated":"2010-11-30T03:23:44Z"
                        "id":"403",
 
                        "address":"206.55.130.1",
 
                        "type":"PUBLIC",
 
                        "ipVersion":"IPV4"
 
                        }
 
                      ],
 
           "created": {
 
                        "time":"2010-11-30T03:23:42Z"  
 
                      },
 
           "updated": {
 
                        "time":"2010-11-30T03:23:44Z"
 
                      }
 
 
         },
 
         },
         {  
+
         {
           "name":"lb-site2",  
+
           "name":"lb-site2",
           "id":"166",  
+
           "id":"166",
           "protocol":"TCP",  
+
           "protocol":"TCP",
           "port":"9123",  
+
           "port":"9123",
           "algorithm":"LEAST_CONNECTIONS",  
+
           "algorithm":"ROUND_ROBIN",
           "status":"ACTIVE",
+
           "status":"ACTIVE",
          "virtualIps": [
+
           "created":"2010-11-30T03:23:42Z",
                          {
+
           "updated":"2010-11-30T03:23:44Z"
                            "id":"401",
 
                            "address":"206.55.130.2",
 
                            "type":"PUBLIC",
 
                            "ipVersion":"IPV4"
 
                          }
 
                      ],
 
           "created":  {
 
                        "time":"2010-11-30T03:23:42Z"  
 
                      },
 
           "updated":  {
 
                        "time":"2010-11-30T03:23:44Z"  
 
                      }
 
 
         }
 
         }
 
       ]
 
       ]
}  
+
}
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
==== List Load Balancer Details ====
 
==== List Load Balancer Details ====
 
 
{| border="1" cellpadding="2" cellspacing="0"
 
{| border="1" cellpadding="2" cellspacing="0"
| Verb
+
| Verb  
| URI
+
| URI  
| Description
+
| Description  
 
|-
 
|-
| GET
+
| GET  
| /loadbalancers/''loadBalancerId''
+
| /loadbalancers/''loadBalancerId''  
| List details of the specified load balancer.
+
| List details of the specified load balancer.  
 
|}
 
|}
  
'''Normal Response Code(s)''': 200  
+
'''Normal Response Code(s)''': 200
 +
 
 +
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
  
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
+
This operation provides detailed output for a specific load balancer configured and associated with your account. This operation is not capable of returning details for a load balancer which has been deleted.
  
This operation provides detailed output for a specific load balancer configured and associated with your account. This operation is not capable of returning details for a load balancer which has been deleted.  
+
This operation does not require a request body.
  
This operation does not require a request body.  
+
'''Example 4.3. List Load Balancer Details Response: XML'''
  
'''Example 4.3. List Load Balancer Details Request: XML'''
 
  
 
<pre><nowiki>#!highlight xml numbers=disable
 
<pre><nowiki>#!highlight xml numbers=disable
<loadBalancer xmlns="http://docs.openstack.org/loadbalancers/api/v1.1"
+
<loadBalancer xmlns="http://docs.openstack.org/atlas/api/v1.1"
   id="2000"  
+
   id="2000"
 
   name="sample-loadbalancer"
 
   name="sample-loadbalancer"
   protocol="HTTP"  
+
   protocol="HTTP"
   port="80"  
+
   port="80"
   algorithm="ROUND_ROBIN"  
+
   algorithm="ROUND_ROBIN"
   status="ACTIVE">  
+
   status="ACTIVE"
 +
  created="2010-11-30T03:23:42Z"
 +
  updated="2010-11-30T03:23:44Z">
  
 
   <virtualIps>
 
   <virtualIps>
     <virtualIp id="1000" address="206.10.10.210" type="PUBLIC" ipVersion="IPV4" />  
+
     <virtualIp id="1000" address="2001:cdba:0000:0000:0000:0000:3257:9652" type="PUBLIC" ipVersion="IPV6" />
 
   </virtualIps>
 
   </virtualIps>
  
   <nodes>  
+
   <nodes>
     <node id="1041" address="10.1.1.1" port="80" condition="ENABLED" status="ONLINE" />  
+
     <node id="1041" address="10.1.1.1" port="80" condition="ENABLED" status="ONLINE" />
     <node id="1411" address="10.1.1.2" port="80" condition="ENABLED" status="ONLINE" />  
+
     <node id="1411" address="10.1.1.2" port="80" condition="ENABLED" status="ONLINE" />
 
   </nodes>
 
   </nodes>
  
   <sessionPersistence persistenceType="HTTP_COOKIE"/>
+
   <sessionPersistence persistenceType="HTTP_COOKIE"/>
 
 
  <connectionLogging enabled="false" />  
 
  
   <connectionThrottle maxRequestRate="50" rateInterval="60" />  
+
   <connectionThrottle maxRequestRate="50" rateInterval="60" />
  
  <cluster name="c1.dfw1" />
+
</loadBalancer>
  <created time="2010-11-30T03:23:42Z" />
 
  <updated time="2010-11-30T03:23:44Z" />
 
</loadBalancer>  
 
 
</nowiki></pre>
 
</nowiki></pre>
  
 +
'''Example 4.4. List Load Balancers Details Response: JSON'''
  
'''Example 4.4. List Load Balancers Details Response: JSON'''
 
  
 
<pre><nowiki>#!highlight javascript numbers=disable
 
<pre><nowiki>#!highlight javascript numbers=disable
{  
+
{
  "loadBalancer": {
+
      "id": "2000",
                    "id": 2000,  
+
      "name":"sample-loadbalancer",
                    "name":"sample-loadbalancer",  
+
      "protocol":"HTTP",
                    "protocol":"HTTP",  
+
      "port": "80",
                    "port": 80,  
+
      "algorithm":"ROUND_ROBIN",
                    "algorithm":"ROUND_ROBIN",  
+
      "status":"ACTIVE",
                    "status":"ACTIVE",  
+
      "created":"2010-11-30T03:23:42Z",
 +
      "updated":"2010-11-30T03:23:44Z",
 +
      "virtualIps":[
 +
                    {
 +
                      "id": "1000",
 +
                      "address":"2001:cdba:0000:0000:0000:0000:3257:9652",
 +
                      "type":"PUBLIC",
 +
                      "ipVersion":"IPV6"
 +
                    }
 +
                  ],
  
                    "virtualIps":[
+
      "nodes":    [
                                    {
+
                      {
                                    "id": 1000,
+
                        "id": "1041",
                                    "address":"206.10.10.210",
+
                        "address":"10.1.1.1",
                                    "type":"PUBLIC",
+
                        "port": "80",
                                    "ipVersion":"IPV4"
+
                        "condition":"ENABLED",
                                    }
+
                        "status":"ONLINE"
                                  ],
+
                      },
 
+
                      {
                    "nodes":    [
+
                        "id": "1411",
                                    {
+
                        "address":"10.1.1.2",
                                    "id": 1041,  
+
                        "port": "80",
                                    "address":"10.1.1.1",  
+
                        "condition":"ENABLED",
                                    "port": 80,  
+
                        "status":"ONLINE"
                                    "condition":"ENABLED",  
+
                      }
                                    "status":"ONLINE"
+
                    ],
                                    },
+
      "sessionPersistence":{
                                    {  
+
                              "persistenceType":"HTTP_COOKIE"
                                    "id": 1411,  
+
                            },
                                    "address":"10.1.1.2",  
+
      "connectionThrottle":{
                                    "port": 80,  
+
                              "maxRequestRate": "50",
                                    "condition":"ENABLED",  
+
                              "rateInterval": "60"
                                    "status":"ONLINE"
+
                            }
                                    }
 
                                  ],
 
                    "sessionPersistence":{
 
                                  "persistenceType":"HTTP_COOKIE"  
 
                                  },
 
                    "connectionLogging": {
 
                                    "enabled":"true"
 
                                  },
 
                    "connectionThrottle":{
 
                                    "maxRequestRate": 50,  
 
                                    "rateInterval": 60  
 
                                  },
 
                    "cluster":  {
 
                                    "name":"c1.dfw1"  
 
                                  },
 
                    "created":  {
 
                                    "time":"2010-11-30T03:23:42Z"
 
                                  },
 
                    "updated":  {
 
                                    "time":"2010-11-30T03:23:44Z"
 
                                  }
 
                  }            
 
 
}
 
}
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
==== Create Load Balancer ====
 
==== Create Load Balancer ====
 
 
{| border="1" cellpadding="2" cellspacing="0"
 
{| border="1" cellpadding="2" cellspacing="0"
| Verb
+
| Verb  
| URI
+
| URI  
| Description
+
| Description  
 
|-
 
|-
| POST
+
| POST  
| /loadbalancers
+
| /loadbalancers  
| Create a new load balancer with the configuration defined by the request.
+
| Create a new load balancer with the configuration defined by the request.  
 
|}
 
|}
  
'''Normal Response Code(s)''': 202  
+
'''Normal Response Code(s)''': 202
  
'''Error Response Code(s)''': loadbalancerFault (500), serviceUnavailable (503), unauthorized (401),badRequest (400), overLimit (413)  
+
'''Error Response Code(s)''': loadbalancerFault (500), serviceUnavailable (503), unauthorized (401),badRequest (400), overLimit (413)
  
This operation provisions a new load balancer based on the configuration defined in the request object. Once the request is validated and progress has started on the provisioning process, a response object will be returned. The object will contain a unique identifier and status of the request.  
+
This operation provisions a new load balancer based on the configuration defined in the request object. Once the request is validated and progress has started on the provisioning process, a response object will be returned. The object will contain a unique identifier and status of the request.
  
If the status returned is set to "BUILD", then using the identifier of the load balancer, the caller can check on the progress of the creation operation by performing a GET on loadbalancers/''loadbalancerid''. When the status of the load balancer returned
+
If the status returned is set to "BUILD", then using the identifier of the load balancer, the caller can check on the progress of the creation operation by performing a GET on loadbalancers/''loadbalancerid''. When the status of the load balancer returned changes to "ACTIVE", then the load balancer has been successfully provisioned and is now operational.
changes to "ACTIVE", then the load balancer has been successfully provisioned and is now operational.  
 
  
The caller of this operation must specify at least the following attributes of the load balancer:  
+
The caller of this operation must specify at least the following attributes of the load balancer:
  
* name  
+
* name
* protocol
 
* port
 
* At least one [[VirtualIp]]
 
 
* At least one node
 
* At least one node
  
If the request cannot be fulfilled due to insufficient or invalid data, an HTTP 400 (Bad Request)
+
If the request cannot be fulfilled due to insufficient or invalid data, an HTTP 400 (Bad Request) error response will be returned with information regarding the nature of the failure in the body of the response. Failures in the validation process are non-recoverable and require the caller to correct the cause of the failure and POST the request again.
error response will be returned with information regarding the nature of the failure in the body of the response. Failures in the validation process are non-recoverable and require the caller to correct the cause of the failure and POST the request again.  
 
  
  
 
<pre><nowiki>#!wiki caution
 
<pre><nowiki>#!wiki caution
Note  
+
Note
  
A load balancer's name has a max length that can be queried when querying limits.  
+
By default the system will create a loadbalancer with protocol set to HTTP, port set to 80 (or 443 if protocol is HTTPS), and assign a public IPV6 address to the loadbalancer. The default algorithm used is set to ROUND_ROBIN.
 
</nowiki></pre>
 
</nowiki></pre>
  
  
Users may configure all documented features of the load balancer at creation time by simply providing the additional elements or attributes in the request. This document provides an overview of all the features the load balancing service supports.  
+
<pre><nowiki>#!wiki caution
 +
Note
 +
 
 +
A load balancer's name has a max length that can be queried when querying limits.
 +
</nowiki></pre>
 +
 
 +
Users may configure all documented features of the load balancer at creation time by simply providing the additional elements or attributes in the request. This document provides an overview of all the features the load balancing service supports.
  
  
 
<pre><nowiki>#!wiki caution
 
<pre><nowiki>#!wiki caution
Note  
+
Note
 +
 
 +
Users may request either an IPv4 or IPV6 address by specifying the version in the create request. For example to request a public IPV6 virtual IP address for the load balancer, use the following virtualIP element in the request:
 +
 
 +
<virtualIp type="PUBLIC" ipVersion="IPV6"/>
  
Users may request either a IPv4 or IPV6 address by specifying the version in the create request. For example to request a public IPV6 virtual IP address for the load balancer, use the following
+
If the version attribute is not specified, then an IPv6 IP address is allocated by default.
virtualIP element in the request:
 
        <virtualIp type="PUBLIC" version="IPV6"/>
 
 
If the version attribute is not specified, then an IPv4 IP address is allocated.
 
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
'''Example 4.5. Create Load Balancer (Required Attributes) Request: XML'''
 
'''Example 4.5. Create Load Balancer (Required Attributes) Request: XML'''
Line 733: Line 618:
  
 
<pre><nowiki>#!highlight xml numbers=disable
 
<pre><nowiki>#!highlight xml numbers=disable
<loadBalancer xmlns="http://docs.openstack.org/loadbalancers/api/v1.1"  
+
<loadBalancer xmlns="http://docs.openstack.org/atlas/api/v1.1"
               name="a-new-loadbalancer" port="80" protocol="HTTP">  
+
               name="a-new-loadbalancer">
    <virtualIps>
+
      <nodes>
      <virtualIp type="PUBLIC"/>
+
       <node address="10.1.1.1" port="80" />
    </virtualIps>
+
       <node address="10.1.1.2" port="81" />
 
 
    <nodes>  
 
       <node address="10.1.1.1" port="80" condition="DISABLED"/>  
 
       <node address="10.1.1.2" port="81" />  
 
 
     </nodes>
 
     </nodes>
</loadBalancer>  
+
</loadBalancer>
 
</nowiki></pre>
 
</nowiki></pre>
 
  
 
'''Example 4.6. Create Load Balancer (Required Attributes) Request: JSON '''
 
'''Example 4.6. Create Load Balancer (Required Attributes) Request: JSON '''
Line 751: Line 631:
  
 
<pre><nowiki>#!highlight javascript numbers=disable
 
<pre><nowiki>#!highlight javascript numbers=disable
{  
+
{
  "loadBalancer": {
+
    "name": "a-new-loadbalancer",
                    "name": "a-new-loadbalancer",  
+
    "nodes":      [
                    "port": "80",
+
                    {
                    "protocol": "HTTP",
+
                      "address": "10.1.1.1",
                    "virtualIps": [
+
                      "port": "80"
                                  {
+
                    },
                                    "type": "PUBLIC"
+
                    {
                                  }
+
                      "address": "10.1.1.2",
                                  ],
+
                      "port": "81"
                    "nodes":      [
+
                    }
                                  {  
+
                  ]
                                    "address": "10.1.1.1",  
+
}
                                    "port": "80",
 
                                    "condition": "DISABLED"
 
                                  },
 
                                  {  
 
                                    "address": "10.1.1.2",  
 
                                    "port": "81"
 
                                  }
 
                                  ]
 
                  }
 
}  
 
 
</nowiki></pre>
 
</nowiki></pre>
  
 +
If you have at least one load balancer, you may create subsequent load balancers that share a single virtual IP by issuing a POST and supplying a virtual IP ID instead of a type. Additionally, this feature is highly desirable if you wish to load balance both an unsecured and secure protocol using one IP address. For example, this method makes it possible to use the same load balancing configuration to support an HTTP and an HTTPS load balancer.
  
If you have at least one load balancer, you may create subsequent load balancers that share a singlevirtual IP by issuing a POST and supplying a virtual IP ID instead of a type. Additionally, this featureis highly desirable if you wish to load balance both an unsecured and secure protocol using one IP orDNS name. For example, this method makes it possible to use the same load balancing configuration tosupport HTTPand HTTPS).
 
  
Note  
+
<pre><nowiki>#!wiki caution
 +
Note
  
Load balancers sharing a virtual IP must utilize a unique port.  
+
Load balancers sharing a virtual IP must utilize a unique port.
 +
</nowiki></pre>
  
16
+
'''Example 4.7. Create Load Balancer (Required Attributes with Shared IP) Request: XML '''
  
^l
 
API Operations
 
  
Example 4.7. Create Load Balancer (Required Attributes with Shared IP)
+
<pre><nowiki>#!hightlight xml
Request: XML
+
<loadBalancer xmlns="http://docs.openstack.org/atlas/api/v1.1"
 +
              name="a-new-loadbalancer" port="83" protocol="HTTP">
 +
      <virtualIps>
 +
        <virtualIp id="39"/>
 +
      </virtualIps>
  
<loadBalancer xmlns="http://docs.openstack.org/loadbalancers/api/v1.1"  
+
      <nodes>
name="a-new-loadbalancer"
+
        <node address="10.1.1.1" port="80" condition="ENABLED" />
port="80"  
+
      </nodes>
protocol="HTTP">  
+
</loadBalancer>
<virtualIps>
+
</nowiki></pre>
  
<virtualIp id="39"/>
+
'''Example 4.8. Create Load Balancer (Required Attributes with Shared IP) Request: JSON '''
</virtualIps>
 
<nodes>
 
  
<node address="10.1.1.1" port="80" condition="ENABLED" />
 
</nodes>
 
</loadBalancer>
 
  
Example 4.8. Create Load Balancer (Required Attributes with Shared IP)
+
<pre><nowiki>#!highlight javascript numbers=disable
Request: JSON
+
{
 
+
  "name":"a-new-loadbalancer",
{
+
  "port":"83",
 
+
  "protocol":"HTTP",
"loadBalancer":{
+
  "virtualIps": [
"name":"a-new-loadbalancer",  
+
                  {
"port":"80",  
+
                      "id":"39"
"protocol":"HTTP",  
+
                  }
"virtualIps":[
+
                ],
 
+
  "nodes":     [
{  
+
                  {
"id":"39"
+
                      "address":"10.1.1.1",
 
+
                      "port":"80",
}
+
                      "condition":"ENABLED"
],
+
                  }
"nodes":[
+
                ]
 
 
{  
 
"address":"10.1.1.1",  
 
"port":"80",  
 
"condition":"ENABLED"
 
 
 
}
 
]
 
 
}
 
}
}
+
</nowiki></pre>
  
17
+
''' Example 4.9. Create Load Balancer (Required Attributes with Shared IP) Response: XML '''
  
^l
 
API Operations
 
  
Example 4.9. Create Load Balancer (Required Attributes with Shared IP)
+
<pre><nowiki>#!highlight xml numbers=disable
Response: XML
+
<loadBalancer xmlns="http://docs.openstack.org/atlas/api/v1.1"
 +
              id="144" name="a-new-loadbalancer" algorithm="ROUND_ROBIN"
 +
              protocol="HTTP"
 +
              port="83"
 +
              status="BUILD"
 +
              created="2011-02-08T21:19:55Z"
 +
              updated="2011-02-08T21:19:55Z" >
  
<loadBalancer xmlns="http://docs.openstack.org/loadbalancers/api/v1.1"
+
    <virtualIps>
id="144"  
+
      <virtualIp id="39" address="3ffe:1900:4545:3:200:f8ff:fe21:67cf" ipVersion="IPV6" type="PUBLIC" />
name="a-new-loadbalancer"  
+
    </virtualIps>
algorithm="ROUND_ROBIN"  
 
protocol="HTTP"
 
port="83"
 
status="BUILD">  
 
<virtualIps>
 
  
<virtualIp
+
    <nodes>
id="39"  
+
      <node id="653" address="10.1.1.1" port="80" condition="ENABLED" status="ONLINE" />
address="206.10.10.210"  
+
    </nodes>
ipVersion="IPV4"  
+
</loadBalancer>
type="PUBLIC" />
+
</nowiki></pre>
  
</virtualIps>
+
'''Example 4.10. Create Load Balancer (Required Attributes with Shared IP) Response: JSON '''
<nodes>
 
  
<node
 
id="653"
 
address="10.1.1.1"
 
port="80"
 
condition="ENABLED"
 
status="ONLINE" />
 
 
</nodes>
 
<cluster name="ztm-n03.staging1.lbaas.demo.net" />
 
<created time="2011-02-08T21:19:55Z" />
 
<updated time="2011-02-08T21:19:55Z" />
 
<connectionLogging enabled="false" />
 
 
</loadBalancer>
 
 
18
 
 
^l
 
API Operations
 
 
Example 4.10. Create Load Balancer (Required Attributes with Shared IP)
 
Response: JSON
 
  
 +
<pre><nowiki>#!highlight javascript numbers=disable
 
{
 
{
 
+
    "name": "a-new-loadbalancer",
"loadBalancer": {
+
    "id": "144",
"name": "a-new-loadbalancer",  
+
    "protocol": "HTTP",
"id": 144,  
+
    "port": "83",
"protocol": "HTTP",
+
    "algorithm": "ROUND_ROBIN",
"port": 83,
+
    "status": "BUILD",
"algorithm": "ROUND_ROBIN",
+
    "created": "2011-04-13T14:18:07Z",
"status": "BUILD",  
+
    "updated":"2011-04-13T14:18:07Z",
"cluster": {
+
    "virtualIps": [
 
+
                    {
"name": "ztm-n01.staging1.lbaas.demo.net"
+
                      "address": "3ffe:1900:4545:3:200:f8ff:fe21:67cf",
},
+
                      "id": "39",
"nodes": [
+
                      "type": "PUBLIC",
 
+
                      "ipVersion": "IPV6"
{  
+
                    }
"address": "10.1.1.1",  
+
                  ],
"id": 653,
+
    "nodes":     [
"port": 80,
+
                    {
"status": "ONLINE",  
+
                      "address": "10.1.1.1",
"condition": "ENABLED"
+
                      "id": "653",
 
+
                      "port": "80",
}
+
                      "status": "ONLINE",
],
+
                      "condition": "ENABLED"
"virtualIps": [
+
                    }
 
+
                  ]
{  
 
"address": "206.10.10.210",  
 
"id": 39,  
 
"type": "PUBLIC",
 
"ipVersion": "IPV4"
 
 
 
 
}
 
}
],
+
</nowiki></pre>
"created": {
 
  
"time": "2011-04-13T14:18:07Z"
+
==== Update Load Balancer Attributes ====
},
+
{| border="1" cellpadding="2" cellspacing="0"
"updated": {
+
| '''Verb'''
 +
| '''URI'''
 +
| '''Description'''
 +
|-
 +
| PUT
 +
| /loadbalancers/''loadBalancerId''
 +
| Update the properties of a loadbalancer.
 +
|}
  
"time": "2011-04-13T14:18:07Z"
+
'''Normal Response Code(s)''': 202
},
 
"connectionLogging": {
 
  
"enabled": false
+
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
}
 
}
 
}
 
  
4.1.4. Update Load Balancer Attributes
+
This operation updates the attributes of the specified load balancer. Upon successful validation of the request, the service will return a 202 (Accepted) response code. A caller should check that the load balancer status is ACTIVE to confirm that the update has taken effect. If the load balancer status is "PENDING_UPDATE" then the caller can poll the load balancer with its ID (using a GET operation) to wait for the changes to be applied and the load balancer to return to an ACTIVE status.
Verb URI Description Representation
 
PUT /loadbalancers/loadBalancerIdUpdate the properties of a loadbalancer.  
 
XML, JSON
 
Normal Response Code(s): 202
 
  
Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401),
+
This operation allows the caller to change one or more of the following attributes:
badRequest (400), overLimit (413)
 
  
This operation updates the attributes of the specified load balancer. Upon successful validation of therequest, the service will return a 202 (Accepted) response code. A caller should check that the loadbalancer status is ACTIVE to confirm that the update has taken effect. If the load balancer status is
+
* name
 +
* algorithm
  
19
+
This operation does not return a response body.
  
^l
 
API Operations
 
  
"PENDING_UPDATE" then the caller can poll the load balancer with its ID (using a GET operation) towait for the changes to be applied and the load balancer to return to an ACTIVEstatus.
+
<pre><nowiki>#!wiki caution
 +
Note
  
This operation allows the caller to change one or more of the following attributes:
+
The load balancer's ID, status, port and protocol are immutable attributes and cannot be modified by the caller. Supplying an unsupported attribute will result in a 400 (badRequest) fault.
 +
</nowiki></pre>
  
• name
+
'''Example 4.11. Update Load Balancer Attributes Request: XML '''
• algorithm
 
This operation does not return a response body.  
 
  
Note
 
  
The load balancer's ID, status, port and protocol are immutable attributes and cannotbe modified by the caller. Supplying an unsupported attribute will result in a 400(badRequest) fault.  
+
<pre><nowiki>#!highlight xml numbers=disable
 +
<loadBalancer xmlns="http://docs.openstack.org/atlas/api/v1.1"
 +
              name="newname-loadbalancer" algorithm="LEAST_CONNECTIONS" />
 +
</nowiki></pre>
  
Example 4.11. Update Load Balancer Attributes Request: XML
+
'''Example 4.12. Update Load Balancer Attributes Request: JSON '''
  
<loadBalancer xmlns="http://docs.openstack.org/loadbalancers/api/v1.1"
 
name="sample-loadbalancer"
 
algorithm="ROUND_ROBIN" />
 
  
Example 4.12. Update Load Balancer Attributes Request: JSON
+
<pre><nowiki>#!highlight javascript numbers=disable
 
+
{
{"loadBalancer":{
+
  "name": "newname-loadbalancer",
"name": "sample-loadbalancer",  
+
  "algorithm": "LEAST_CONNECTIONS"
"algorithm": "ROUND_ROBIN"  
 
 
}
 
}
 +
</nowiki></pre>
  
}  
+
'''Table 4.1. Load Balancer Statuses'''
 +
{| border="1" cellpadding="2" cellspacing="0"
 +
| '''Name'''
 +
|-
 +
| ACTIVE
 +
|-
 +
| BUILD
 +
|-
 +
| PENDING_UPDATE
 +
|-
 +
| PENDING_DELETE
 +
|-
 +
| DELETED
 +
|-
 +
| SUSPENDED
 +
|-
 +
| ERROR
 +
|}
  
The load balancer's status attribute reflects the current configuration status of the device. This status isimmutable by the caller and is updated automatically based on state changes within the service. Whena load balancer is first created, it may be placed into a BUILDstatus while the configuration is beinggenerated and applied based on the request. Once the configuration is applied and finalized, it will be in
+
Note that a load balancer whose status is SUSPENDED is not operational and traffic to it is rejected and will not be forwarded to back-end nodes.
an ACTIVEstatus. In the event of a configuration change or update, the status of the load balancer maychange to PENDING_UPDATEto signify configuration changes are in progress but have not yet beenfinalized. Load balancers in a SUSPENDEDstatus reject traffic and will not forward requests to back-
 
end nodes.  
 
  
Table 4.1. Load Balancer Statuses
+
==== Remove Load Balancer ====
 +
{| border="1" cellpadding="2" cellspacing="0"
 +
| '''Verb'''
 +
| '''URI'''
 +
| '''Description'''
 +
|-
 +
| DELETE
 +
| /loadbalancers/''loadBalancerId''
 +
| Remove a load balancer from the account.  
 +
|}
  
Name Description
+
'''Normal Response Code(s)''': 202
ACTIVE Load balancer is configured properly and ready to serve traffic to incoming requests via theconfigured virtual IPs.
 
BUILD Load balancer is being provisioned for the first time and configuration is being applied to bringthe service online. The service will not yet be ready to serve incoming requests.
 
PENDING_UPDATE Load balancer is online but configuration changes are being applied to update the service basedon a previous request.
 
PENDING_DELETE Load balancer is online but configuration changes are being applied to begin deletion of theservice based on a previous request.
 
SUSPENDED Load balancer has been taken offline and disabled.
 
ERROR The system encountered an error when attempting to configure the load balancer.
 
  
20
+
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
  
^l
+
The remove load balancer function removes the specified load balancer and its associated configuration from the account. Any and all configuration data is immediately purged and is not recoverable.
API Operations
 
  
Name
+
This operation does not require a request body.
  
Description
+
This operation does not return a response body.
  
DELETED Load balancers in DELETEDstatus can be displayed for a certain number of days after deletion.
+
Deleted load balancers are still displayed for a number of days after deletion when listing load balancers of an account. Their status is changed to DELETED.The updated date of a DELETED load balancer reflects the time/date of its deletion.
The number of days is queryable.  
 
  
4.1.5. Remove Load Balancer
+
=== Nodes ===
Verb
+
The nodes defined by the load balancer are responsible for servicing the requests received through the load balancer's virtual IP. By default, the load balancer employs a basic health check that ensures the node is listening on its defined port. The node is checked at the time of addition and at regular intervals as defined by the load balancer health check configuration. If a back-end node is not listening on its port or does not meet the conditions of the defined active health check for the load balancer, then the loadbalancer will not forward connections or requests to it and its status will be listed as OFFLINE. Only nodes that are in an ONLINE status will receive and be able to service traffic from the load balancer.
  
URI
+
The status of the node can be determined by passive or active health monitoring.
  
Description
+
The caller can assign the relevant weights to nodes using the weight attribute of the node element.
  
DELETE
+
The weight of a node determines the portion of requests or connections it services compared to the other nodes of the load balancer. For example, if node A has a weight of 2 and node B has a weight of 1, then the loadbalancer will forward twice as many requests to node A than to node B. If the weight attribute is not specified, then the node's weight is implicitly set to "1".
  
/loadbalancers/loadBalancerId  
+
==== List Nodes ====
 +
{| border="1" cellpadding="2" cellspacing="0"
 +
| '''Verb'''
 +
| '''URI'''
 +
| '''Description'''
 +
|-
 +
| GET
 +
| /loadbalancers/''loadBalancerId''/nodes
 +
| List node(s) configured for the load balancer.
 +
|}
  
Remove a load balancer from the account.  
+
List all nodes of a load balancer.
  
Normal Response Code(s): 202
+
'''Normal Response Code(s)''': 200
  
Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401),
+
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
badRequest (400), overLimit (413)  
 
  
The remove load balancer function removes the specified load balancer and its associated configurationfrom the account. Any and all configuration data is immediately purged and is not recoverable.  
+
This operation does not require a request body.
  
This operation does not require a request body.  
+
'''Example 4.13. List Nodes Response: XML '''
  
This operation does not return a response body.
 
  
4.2. Nodes
+
<pre><nowiki>#!highlight xml numbers=disable
The nodes defined by the load balancer are responsible for servicing the requests received through theload balancer's virtual IP. By default, the load balancer employs a basic health check that ensures thenode is listening on its defined port. The node is checked at the time of addition and at regular intervalsas defined by the load balancer health check configuration. If a back-end node is not listening on its portor does not meet the conditions of the defined active health check for the load balancer, then the loadbalancer will not forward connections and its status will be listed as OFFLINE. Only nodes that are in
+
<nodes>
an ONLINEstatus will receive and be able to service traffic from the load balancer.
+
  <node id="410" address="10.1.1.1" port="80" condition="ENABLED" status="ONLINE" />
 +
  <node id="236" address="10.1.1.2" port="80" condition="ENABLED" status="ONLINE" />
 +
  <node id="2815" address="10.1.1.3" port="83" condition="DISABLED" status="OFFLINE" />
 +
</nodes>
 +
</nowiki></pre>
  
The status of the node can be determined by passive or active health monitoring.  
+
'''Example 4.14. List Node Response: JSON'''
  
The caller can assign the relevant weights to the node using the weight attribute of the node element.
 
The weight of a node determines the portion of requests it services compared to the other nodes of theload balancer. For exampl, if node A has a weight of 2 and node B has a weight of 1, then the loadbalancer will forward twice as many requests to node A than to node B. If the weight attribute is notspecified, then the node's weight is implicitly set to "1".
 
  
4.2.1. List Nodes
+
<pre><nowiki>#!highlight javascript numbers=disable
Verb URI Description
+
{
GET /loadbalancers/loadBalancerId/nodes List node(s) configured for the load balancer.
+
  "nodes" : [
GET /loadbalancers/loadBalancerId/nodes/nodeId
+
              {
List details of a specific node.
+
                "id":"410",
 +
                "address":"10.1.1.1",
 +
                "port":"80",
 +
                "condition":"ENABLED",
 +
                "status":"ONLINE"
 +
              },
 +
              {
 +
                "id":"236",
 +
                "address":"10.1.1.2",
 +
                "port":"80",
 +
                "condition":"ENABLED",
 +
                "status":"ONLINE"
 +
              },
 +
              {
 +
                "id":"2815",
 +
                "address":"10.1.1.3",
 +
                "port":"83",
 +
                "condition":"DISABLED",
 +
                "status":"OFFLINE"
 +
              },
 +
            ]
 +
}
 +
</nowiki></pre>
  
Normal Response Code(s): 200
+
==== Retrieve a Node ====
 +
{| border="1" cellpadding="2" cellspacing="0"
 +
| '''Verb'''
 +
| '''URI'''
 +
| '''Description'''
 +
|-
 +
| GET
 +
| /loadbalancers/''loadBalancerId''/nodes/''nodeId''
 +
| Retrieve the configuration of node ''nodeid'' of loadbalancer ''loadbalancerId''.
 +
|}
  
Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401),
+
This operation retrieves the configuration of a node.
badRequest (400), overLimit (413)
 
This operation does not require a request body.  
 
  
21
+
'''Normal Response Code(s)''': 200
  
^l
+
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
API Operations
 
  
Example 4.13. List Node Response: XML
+
This operation does not require a request body.
  
<node
+
'''Example 4.15. Retrieve the configuration of a node Response: XML '''
id="410"
 
address="10.1.1.1"
 
port="80"
 
condition="ENABLED"
 
status="ONLINE" />
 
  
Example 4.14. List Node Response: JSON
 
  
{"node": {
+
<pre><nowiki>#!highlight xml numbers=disable
"id":"410",
+
<node id="236" address="10.1.1.2" port="80" condition="ENABLED" status="ONLINE" />
"address":"10.1.1.1",
+
</nowiki></pre>
"port":80,
 
"condition":"ENABLED",
 
"status":"ONLINE"
 
  
}
+
'''Example 4.16. Retrieve a node Response: JSON'''
}
 
  
Example 4.15. List Nodes Response: XML
 
  
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
<pre><nowiki>#!highlight javascript numbers=disable
 +
{
 +
  "id":"236",
 +
  "address":"10.1.1.2",
 +
  "port":"80",
 +
  "condition":"ENABLED",
 +
  "status":"ONLINE"
 +
}
 +
</nowiki></pre>
  
<nodes xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">
+
==== Add Nodes ====
<node
+
{| border="1" cellpadding="2" cellspacing="0"
id="650"
+
| '''Verb'''
address="10.1.1.1"
+
| '''URI'''
port="80"
+
| '''Description'''
condition="ENABLED"
+
|-
status="ONLINE"/>
+
| POST
<node
+
| /loadbalancers/''loadBalancerId''/nodes
id="183"  
+
| Add a new node to the load balancer.
address="10.2.2.1"  
+
|}
port="80"  
 
condition="ENABLED"
 
status="ONLINE"/>
 
<node
 
id="184"
 
address="10.2.2.2"
 
port="88"
 
condition="ENABLED"
 
status="ONLINE"/>
 
  
</nodes>
+
'''Normal Response Code(s)''': 202
  
22
+
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
  
^l
+
When a node is added, it is assigned a unique identifier that can be used for mutating operations such as changing the condition or the weight of a node, or removing the node from the load balancer.
API Operations
 
  
Example 4.16. List Nodes Response: JSON
+
Every load balancer is dual-homed on both the public Internet and the internal network; as a result, nodes can either be internal private addresses or addresses on the public Internet.
  
{
 
"nodes": [
 
  
{
+
<pre><nowiki>#!wiki caution
"address": "10.1.1.1",
+
Note:
"id": 650,
 
"port": 80,
 
"status": "ONLINE",
 
"condition": "ENABLED"
 
  
},
+
When a node is added to a load balancer, it is enabled by default.
 +
</nowiki></pre>
  
{
+
'''Example 4.17. Add Nodes Request: XML'''
"address": "10.2.2.1",
 
"id": 183,
 
"port": 80,
 
"status": "ONLINE",
 
"condition": "ENABLED"
 
  
},
 
  
{
+
<pre><nowiki>#!highlight xml numbers=disable
"address": "10.2.2.2",
+
<nodes xmlns="http://docs.openstack.org/atlas/api/v1.1">
"id": 184,
+
  <node address="10.1.1.1" port="80" />
"port": 88,
+
  <node address="10.2.2.1" port="80" weight="2" />
"status": "ONLINE",
+
  <node address="10.2.2.2" port="88" condition="DISABLED" weight="2" />
"condition": "ENABLED"
+
</nodes>
 +
</nowiki></pre>
  
}
+
'''Example 4.18. Add Nodes Request: JSON'''
]
 
}
 
  
4.2.2. Add Nodes
 
Verb
 
  
URI
+
<pre><nowiki>#!highlight javascript numbers=disable
 +
{
 +
  "nodes": [
 +
            {
 +
              "address": "10.1.1.1",
 +
              "port": "80"
 +
            },
 +
            {
 +
              "address": "10.2.2.1",
 +
              "port": "80",
 +
              "weight": "2"
 +
            },
 +
            {
 +
              "address": "10.2.2.2",
 +
              "port": "88",
 +
              "condition": "DISABLED",
 +
              "weight": "2"
 +
            }
 +
          ]
 +
}
 +
</nowiki></pre>
  
Description
+
'''Example 4.19. Add Nodes Response: XML'''
  
POST
 
  
/loadbalancers/loadBalancerId/nodes  
+
<pre><nowiki>#!highlight xml numbers=disable
 +
<nodes xmlns="http://docs.openstack.org/atlas/api/v1.1">
 +
<node id="7298" address="10.1.1.1" port="80" condition="ENABLED" status="ONLINE" />
 +
<node id="293" address="10.2.2.1" port="80" weight="2" condition="ENABLED" status="OFFLINE" />
 +
<node id="183" address="10.2.2.2" port="88" weight="2" condition="DISABLED" status="OFFLINE" />
 +
</nodes>
 +
</nowiki></pre>
  
Add a new node to the load balancer.
+
'''Example 4.20. Add Nodes Response: JSON'''
  
Normal Response Code(s): 202
 
  
Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401),
+
<pre><nowiki>#!highlight javascript numbers=disable
badRequest (400), overLimit (413)
+
{
 +
  "nodes": [
 +
            {
 +
              "id": "7298",
 +
              "address": "10.1.1.1",
 +
              "port": "80",
 +
              "condition": "ENABLED",
 +
              "status": "ONLINE"
 +
            },
 +
            {
 +
              "id": "293",
 +
              "address": "10.2.2.1",
 +
              "port": "80",
 +
              "weight": "2",
 +
              "condition": "ENABLED",
 +
              "status": "OFFLINE"
 +
            },
 +
            {
 +
              "id": "183",
 +
              "address": "10.2.2.4",
 +
              "port": "88",
 +
              "weight": "2",
 +
              "condition": "DISABLED",
 +
              "status": "OFFLINE"
 +
            }
 +
          ]
 +
}
 +
</nowiki></pre>
  
When a node is added, it is assigned a unique identifier that can be used for mutating operations suchas changing the condition or removing it. Every load balancer is dual-homed on both the public Internetand internal; as a result, nodes can either be internal private addresses or addresses on the publicInternet.  
+
==== Modify Nodes ====
 +
{| border="1" cellpadding="2" cellspacing="0"
 +
| Verb
 +
| URI
 +
| Description
 +
|-
 +
| PUT
 +
| /loadbalancers/''loadBalancerId''/nodes/''nodeId''
 +
| Modify the configuration of a node on the load balancer.  
 +
|}
  
Example 4.17. Add Nodes Request: XML
+
'''Normal Response Code(s)''': 202
  
<nodes xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">
+
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
<node address="10.1.1.1" port="80" condition="ENABLED" />
 
<node address="10.2.2.1" port="80" condition="ENABLED" />
 
<node address="10.2.2.2" port="88" condition="ENABLED" />
 
  
</nodes>
+
This operation does not return a response body.
  
23
 
  
^l
+
<pre><nowiki>#!wiki caution
API Operations
+
Note
  
Example 4.18. Add Nodes Request: JSON
+
The node's IP and port are immutable attributes and cannot be modified with a PUT
 +
request. Supplying an unsupported attribute will result in a 400 (badRequest) fault. A load balancer supports a maximum number of nodes. The maximum number of nodes per loadbalancer is returned when querying the limits of the LB service.
 +
</nowiki></pre>
  
{"nodes": [
+
Every node in the load balancer is either enabled or disabled which determines its role within the load balancer. When the node has condition="ENABLED" the node is permitted to accept new connections. Its status will eventually become ONLINE to reflect this configuration. When the node has condition="DISABLED" the node is not permitted to accept any new connections regardless of session persistence configuration. Existing connections to the node are forcibly terminated. The node's status changes to OFFLINE once the configuration has been successfully applied.
  
{
+
'''Example 4.21. Disable a node Request: XML'''
"address": "10.1.1.1",
 
"port": 80,
 
"condition": "ENABLED"
 
  
},
 
  
{
+
<pre><nowiki>#!highlight xml numbers=disable
"address": "10.2.2.1",
+
<node condition="DISABLED" />
"port": 80,
+
</nowiki></pre>
"condition": "ENABLED"
 
  
},
+
'''Example 4.22. Disable a node Request: JSON'''
  
{
 
"address": "10.2.2.2",
 
"port": 88,
 
"condition": "ENABLED",
 
"weight": 10
 
  
}
+
<pre><nowiki>#!highlight javascript numbers=disable
]
+
{
}  
+
  "condition": "DISABLED"
 +
}
 +
</nowiki></pre>
  
Example 4.19. Add Nodes Response: XML
+
Even if a node is configured with condition="ENABLED", its status may remain as OFFLINE if there is a configuration or operational error of the node or its load balancer.
  
<nodes xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">
+
==== Remove Nodes ====
 +
{| border="1" cellpadding="2" cellspacing="0"
 +
| '''Verb'''
 +
| '''URI'''
 +
| '''Description'''
 +
|-
 +
| DELETE
 +
| /loadbalancers/''loadBalancerId''/nodes/''nodeId''
 +
| Remove a node from the load balancer.  
 +
|}
  
<node
+
'''Normal Response Code(s)''': 200, 202
address="10.2.2.3"
 
id="185"
 
port="80"
 
condition="ENABLED"
 
status="ONLINE" />
 
  
<node
+
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
address="10.2.2.4"
 
id="186"
 
port="80"
 
condition="ENABLED"
 
status="ONLINE" />
 
  
</nodes>
+
This operation does not require a request body.
  
24
+
This operation does not return a response body.
  
^l
 
API Operations
 
  
Example 4.20. Add Nodes Response: JSON
+
<pre><nowiki>#!wiki caution
 +
Note
  
{"nodes": [
+
A load balancer must have at least one node. Attempting to remove the last node of a loadbalancer will result in a badRequest (400) error.
 +
</nowiki></pre>
  
{
+
=== Virtual IPs ===
"address": "10.2.2.3",  
+
A virtual IP (VIP) makes a load balancer accessible by clients. The load balancing service supports either a public VIP, routable on the public Internet, or a private address, routable only within the region in which the load balancer resides.
"id": 185,  
 
"port": 80,  
 
"status": "ONLINE",
 
"condition": "ENABLED"
 
  
},
+
'''Table 4.3. Virtual IP Types'''
 +
{| border="1" cellpadding="2" cellspacing="0"
 +
| '''Name'''
 +
|-
 +
| PUBLIC
 +
|-
 +
| INTERNAL
 +
|}
  
{  
+
==== List Virtual IPs ====
"address": "10.2.2.4",
+
{| border="1" cellpadding="2" cellspacing="0"
"id": 186,
+
| '''Verb'''
"port": 80,
+
| '''URI'''
"status": "ONLINE",
+
| '''Description'''
"condition": "ENABLED"
+
|-
 +
| GET
 +
| /loadbalancers/''loadBalancerId''/virtualips
 +
| List all virtual IPs associated with a load balancer.
 +
|}
  
}
+
'''Normal Response Code(s): 200'''
]
 
}
 
  
4.2.3. Modify Nodes
+
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
Verb
 
  
URI
+
This operation lists all the virtual IP addresses of a load balancer.
  
Description
+
This request does not require a request body.
PUT
 
  
/loadbalancers/loadBalancerId/nodes/nodeId
 
  
Modify the configuration of a node on the loadbalancer.
+
<pre><nowiki>#!wiki caution
 +
Note
  
Normal Response Code(s): 202
+
The maximum number of VIPs that can be configured when creating a load balancer can be discovered by querying the limits of the LB service.
 +
</nowiki></pre>
  
Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401),
+
'''Example 4.23. List Virtual IPs Response: XML'''
badRequest (400), overLimit (413)
 
  
This operation does not return a response body.
 
  
Note
+
<pre><nowiki>#!highlight xml numbers=disable
 +
<virtualIps xmlns="http://docs.openstack.org/atlas/api/v1.1">
 +
  <virtualIp id="1021" address="206.10.10.210" type="PUBLIC" ipVersion="IPV4"/>
 +
</virtualIps>
 +
</nowiki></pre>
  
The node's IP and port are immutable attributes and cannot be modified with a PUT
+
'''Example 4.24. List Virtual IPs Response: JSON'''
request. Supplying an unsupported attribute will result in a 400 (badRequest) fault. Aload balancer supports a maximum number of nodes. The maximum number of nodes perloadbalancer is a queryable limit.  
 
  
Every node in the load balancer has an associated condition which determines its role within the loadbalancer.
 
  
Table 4.2. Load Balancer Node Conditions
+
<pre><nowiki>#!highlight javascript numbers=disable
 
+
{
Name Description
+
  "virtualIps": [
ENABLED Node is permitted to accept new connections. Its status will eventually become ONLINE toreflect this configuration.
+
                {
DISABLED Node is not permitted to accept any new connections regardless of session persistenceconfiguration. Existing connections are forcibly terminated. The node's status will change toOFFLINE once the configuration has been successfully appplied.
+
                  "id": "1021",
 
+
                  "address": "206.10.10.210",
Example 4.21. Update Node Condition Request: XML
+
                  "type": "PUBLIC",
 
+
                  "ipVersion": "IPV4"
<node condition="ENABLED" />
+
                }
 
+
                ]
25
 
 
 
^l
 
API Operations
 
 
 
Example 4.22. Update Node Condition Request: JSON
 
 
 
{"node":{
 
"condition": "ENABLED"  
 
 
}
 
}
}
+
</nowiki></pre>
  
4.2.4. Remove Nodes
+
=== Usage Reports ===
Verb
+
==== List Usage ====
 +
{| border="1" cellpadding="2" cellspacing="0"
 +
| '''Name'''
 +
| '''URI'''
 +
| '''Description'''
 +
|-
 +
| GET
 +
| /loadbalancers/''loadBalancerId''/usage
 +
| List current and historical usage.  
 +
|}
  
URI
+
'''Normal Response Code(s): 200'''
  
Description
+
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
  
DELETE
+
This operation does not require a request body.
  
/loadbalancers/loadBalancerId/nodes/nodeId
+
The load balancer usage reports provide a set of usage counters. This list will contain at least the ''transferBytesIn'' and ''transferBytesOut ''usage counters that represent respectively the amount of traffic in bytes received by the load balancer from clients requests, and the amount fo traffic sent from the nodes as responses to clients.
  
Remove a node from the load balancer.  
+
'''Example 4.25. Report Load Balancer Usage Response: XML'''
  
Normal Response Code(s): 200, 202
 
  
Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401),
+
<pre><nowiki>#!highlight xml numbers=disable
badRequest (400), overLimit (413)
+
<loadBalancerUsageRecords xmlns="http://docs.openstack.org/atlas/api/v1.1">
 +
  <loadBalancerUsageRecord  id="394"  transferBytesIn="2819204"
 +
                            transferBytesOut="84923069" />
 +
  <loadBalancerUsageRecord  id="473" transferBytesIn="0" transferBytesOut="0" />
 +
</loadBalancerUsageRecords>
 +
</nowiki></pre>
  
Note
+
'''Example 4.26. Report Load Balancer Usage Response: JSON'''
  
A load balancer must have at least one node. Attempting to remove the last node of a loadbalancer will result in a badRequest error.
 
  
This operation does not return a response body.
+
<pre><nowiki>#!highlight javascript numbers=disable
 +
{
 +
  "loadBalancerUsageRecords": [
 +
                                {
 +
                                  "id": "394",
 +
                                  "transferBytesIn": "2819204",
 +
                                  "transferBytesOut": "84923069"
 +
                                },
 +
                                {
 +
                                  "id": "473",
 +
                                  "transferBytesIn": "0",
 +
                                  "transferBytesOut": "0"
 +
                                }
 +
                              ]
 +
}
 +
</nowiki></pre>
  
4.3. Virtual IPs
+
=== Monitors ===
A virtual IP (VIP) makes a load balancer accessible by clients. The load balancing service supportseither a public VIP, routable on the public Internet, or a private address, routable only within the regionin which the load balancer resides.  
+
{| border="1" cellpadding="2" cellspacing="0"
 +
| '''Verb'''
 +
| '''URI'''
 +
| '''Description'''
 +
|-
 +
| GET
 +
| /loadbalancers/''loadBalancerId''/healthmonitor
 +
| Retrieve the health monitor configuration, if one exists.  
 +
|-
 +
| PUT
 +
| /loadbalancers/''loadBalancerId''/healthmonitor
 +
| Update the settings for a health monitor.  
 +
|-
 +
| DELETE
 +
| /loadbalancers/loadBalancerId/healthmonitor
 +
| Remove the health monitor.  
 +
|}
  
Table 4.3. Virtual IP Types
+
'''Normal Response Code(s)''': 200, 202
  
Name Description
+
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
PUBLIC An address that is routable on the public Internet.
 
INTERNAL An address that is routable only on internal network.
 
  
4.3.1. List Virtual IPs
+
In addition to the default passive monitoring, the load balancing service includes an active health monitoring operation which periodically checks your back-end nodes to ensure they are responding correctly.
Verb
 
  
URI
+
Active health monitoring provides 3 types of health monitors. The caller can configure one health monitor on the load blancer.
  
Description
+
The health monitor has a type attribute to signify which of the 3 types it is. The 3 types available in this specification are described below.
  
GET
+
'''Table 4.4. Health Monitor Types'''
 +
{| border="1" cellpadding="2" cellspacing="0"
 +
| '''Name'''
 +
|-
 +
| CONNECT
 +
|-
 +
| HTTP
 +
|-
 +
| HTTPS
 +
|}
  
/loadbalancers/loadBalancerId/virtualips
+
===== Monitor CONNECT =====
 +
The monitor connects to each node on its defined port to ensure that the node is listening properly.
  
List all virtual IPs associated with a load balancer.  
+
The CONNECT monitor is the most basic type of health check and does not perform post-processing or protocol specific health checks. It includes several configurable properties:
  
Normal Response Code(s): 200, 202
+
* '''delay''': This is the minimum time in seconds between regular calls to a monitor.
 +
* '''timeout''': Maximum number of seconds for a monitor to  wait for a connection to be established to the node before it times out. The value must be less than the delay value.
 +
* '''attemptsBeforeDeactivation''': Number of permissible monitor failures before removing a node from rotation. Must be a number between 1 and 10.
  
Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401),
+
'''Example 4.27. Monitor CONNECT Request: XML'''
badRequest (400), overLimit (413)
 
This request does not require a request body.
 
  
Note
 
  
The number of VIPs that can be configured when creating a load balancer is a queryablelimit.  
+
<pre><nowiki>#!highlight xml numbers=disable
 +
<healthMonitor xmlns="http://docs.openstack.org/atlas/api/v1.1"
 +
              type="CONNECT" delay="20" timeout="10"
 +
              attemptsBeforeDeactivation="3" />
 +
</nowiki></pre>
  
26
+
'''Example 4.28. Monitor CONNECT Request: JSON'''
  
^l
 
API Operations
 
  
Example 4.23. List Virtual IPs Response: XML
+
<pre><nowiki>#!highlight javascript numbers=disable
 
 
<virtualIps xmlns="http://docs.openstack.org/
 
loadbalancers/api/v1.1">
 
 
 
<virtualIp
 
id="1000"
 
address="206.10.10.210"
 
type="PUBLIC"/>
 
 
 
</virtualIps>
 
 
 
Example 4.24. List Virtual IPs Response: JSON
 
 
 
{"virtualIps": [
 
 
{
 
{
"id": "1000",  
+
  "type": "CONNECT",
"address": "206.10.10.210",  
+
  "delay": "20",
"type": "PUBLIC"  
+
  "timeout": "10",
 +
  "attemptsBeforeDeactivation": "3"
 
}
 
}
 +
</nowiki></pre>
  
]
+
'''Example 4.29. Monitor Connections Response: XML'''
}
 
  
4.4. Usage Reports
 
4.4.1. List Usage
 
Name
 
  
URI
+
<pre><nowiki>#!highlight xml numbers=disable
 +
<healthMonitor xmlns="http://docs.openstack.org/atlas/api/v1.1"
 +
              type="CONNECT" delay="10" timeout="10"
 +
              attemptsBeforeDeactivation="3" />
 +
</nowiki></pre>
  
Description
+
'''Example 4.30. Monitor Connections Response: JSON'''
  
GET
 
  
/loadbalancers/loadBalancerId/usage
+
<pre><nowiki>#!highlight javascript numbers=disable
 +
{
 +
  "type": "CONNECT",
 +
  "delay": "20",
 +
  "timeout": "10",
 +
  "attemptsBeforeDeactivation": "3"
 +
}
 +
</nowiki></pre>
  
List current and historical usage.  
+
===== Monitor HTTP and HTTPS =====
 +
The HTTP and HTTPS monitor is more intelligent than the CONNECT monitor. It is capable of processing an HTTP or HTTPS response to determine the condition of a node. It supports the same basic properties as the CONNECT monitor and includes the additional attribute of ''path ''that is used to evaluate the HTTP response to a monitor probe.
  
Normal Response Code(s): 200  
+
* '''path''': The HTTP path used in the HTTP request by the monitor. This must be a string beginning with a / (forward slash). The monitor expects a response from the node with an HTTP status code of 200.
  
Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401),
+
'''Example 4.31. Monitor HTTP Response: XML'''
badRequest (400), overLimit (413)
 
  
This operation does not require a request body.
 
  
The load balancer usage reports provide a set of usage counters. This list will contain at least thetransferBytesIn and transferBytesOut usage counters that represent respectively the amount of traffic inbytes received by the load balancer from clients requests, and the amount fo traffic sent from the loadbalancer as responses to clients.  
+
<pre><nowiki>#!highlight xml numbers=disable
 +
<healthMonitor xmlns="http://docs.openstack.org/atlas/api/v1.1"
 +
              type="HTTP" delay="10" timeout="3" attemptsBeforeDeactivation="2"
 +
              path="/"
 +
/>
 +
</nowiki></pre>
  
Example 4.25. Report Load Balancer Usage Response: XML  
+
'''Example 4.32. Monitor HTTPS Response: XML'''
  
<loadBalancerUsage xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">
 
  
<loadBalancerUsageRecord
+
<pre><nowiki>#!highlight xml numbers=disable
id="394"  
+
<healthMonitor xmlns="http://docs.openstack.org/atlas/api/v1.1"
transferBytesIn="0"  
+
              type="HTTPS" delay="10" timeout="3"
transferBytesOut="0" />  
+
              attemptsBeforeDeactivation="3"
 +
              path="/healthcheck"
 +
/>
 +
</nowiki></pre>
  
<loadBalancerUsageRecord
+
'''Example 4.33. Monitor HTTPS Response: JSON'''
id="473"
 
transferBytesIn="0"
 
transferBytesOut="0" />
 
  
</loadBalancerUsage>
 
  
27
+
<pre><nowiki>#!highlight javascript numbers=disable
 +
{
 +
  "type": "HTTPS",
 +
  "delay": "10",
 +
  "timeout": "3",
 +
  "attemptsBeforeDeactivation": "3",
 +
  "path": "/healthcheck"
 +
}
 +
</nowiki></pre>
  
^l
+
If a load balancer has no health monitoring configuration, then the LB service will return an empty response when retrieving (GET request) a health monitoring configuration.
API Operations
 
  
Example 4.26. Report Load Balancer Usage Response: JSON
+
=== Sessions ===
 +
==== Manage Session Persistence ====
 +
{| border="1" cellpadding="2" cellspacing="0"
 +
| '''Verb'''
 +
| '''URI'''
 +
| '''Description'''
 +
|-
 +
| GET
 +
| /loadbalancers/''loadBalancerId''/sessionpersistence
 +
| List session persistence configuration.  
 +
|-
 +
| PUT
 +
| /loadbalancers/''loadBalancerId''/sessionpersistence
 +
| Enable session persistence.  
 +
|-
 +
| DELETE
 +
| /loadbalancers/''loadBalancerId''/sessionpersistence
 +
| Disable session persistence.
 +
|}
  
{
+
'''Normal Response Code(s)''': 200, 202
"loadBalancerUsageRecords": [
 
  
{
+
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
"id": "394",  
 
"transferBytesIn": "0",  
 
"transferBytesOut": "0"
 
  
},
+
Session persistence is a feature of the load balancing service which forces multiple requests from clients to be directed to the same node. This is common with many web applications that do not inherently share application state between back-end servers.
  
{  
+
'''Table 4.5. Session Persistence Modes'''
"id": "473",
+
{| border="1" cellpadding="2" cellspacing="0"
"transferBytesIn": "0",
+
| '''Name'''
"transferBytesOut": "0"
+
|-
 +
| HTTP_COOKIE
 +
|}
  
}
+
'''Example 4.34. List Session Persistence Configuration Response: XML'''
]
 
}
 
  
4.5. Monitors
 
In addition to the default passive monitoring, the load balancing service includes an active healthmonitoring operation which periodically checks your back-end nodes to ensure they are respondingcorrectly.
 
  
Active health monitoring provides 3 types of health monitors. The caller can configure one healthmonitor on the load blancer.  
+
<pre><nowiki>#!highlight xml numbers=disable
 +
<sessionPersistence xmlns="http://docs.openstack.org/atlas/api/v1.1"
 +
                    persistenceType="HTTP_COOKIE" />
 +
</nowiki></pre>
  
The health monitor has a typeattribute to signify what kind of monitor it is. This specification supports3 types of health monitor.  
+
'''Example 4.35. List Session Persistence Configuration Response: JSON'''
  
Table 4.4. Health Monitor Types
 
  
Name Description
+
<pre><nowiki>#!highlight javascript numbers=disable
CONNECT Health monitor is a CONNECT monitor.
+
{
HTTP Health monitor is an HTTP monitor.
+
  "persistenceType":"HTTP_COOKIE"
HTTPS Health monitor is an HTTPS monitor.
+
}
 +
</nowiki></pre>
  
4.5.1. Monitor Health
+
'''Example 4.36. Set Session Persistence Type Request: XML'''
Verb URI Description
 
GET /loadbalancers/loadBalancerId/healthmonitor Retrieve the health monitor configuration, if oneexists.
 
PUT /loadbalancers/loadBalancerId/healthmonitor Update the settings for a health monitor.
 
DELETE /loadbalancers/loadBalancerId/healthmonitor Remove the health monitor.  
 
  
Normal Response Code(s): 200, 202
 
  
Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401),
+
<pre><nowiki>#!highlight xml numbers=disable
badRequest (400), overLimit (413)
+
<sessionPersistence xmlns="http://docs.openstack.org/atlas/api/v1.1"
 +
                    persistenceType="HTTP_COOKIE" />
 +
</nowiki></pre>
  
4.5.1.1. Monitor CONNECT
+
'''Example 4.37. Set Session Persistence Type Request: JSON'''
The monitor connects to each node on its defined port to ensure that the service is listening properly.
 
The CONNECT monitor is the most basic type of health check and does not perform post-processing orprotocol specific health checks. It includes several configurable properties:  
 
  
28
 
  
^l
+
<pre><nowiki>#!highlight javascript numbers=disable
API Operations
+
{
 +
    "persistenceType":"HTTP_COOKIE"
 +
}
 +
</nowiki></pre>
  
+
=== Connections ===
delay: This is the minimum time between calls to a monitor.
+
==== Throttle Connections ====
+
{| border="1" cellpadding="2" cellspacing="0"
timeout: Maximum number of seconds to wait for a connection to be established by the monitorbefore timing out. The value must be less than the delay value.
+
| '''Verb'''
+
| '''URI'''
attemptsBeforeDeactivation: Number of permissible monitor failures before removing anode from rotation. (Must be a number between 1 and 10)
+
| '''Description'''
Example 4.27. Monitor Connections Request: XML
+
|-
 +
| GET
 +
| /loadbalancers/''loadBalancerId''/connectionthrottle
 +
| List connection throttling configuration.  
 +
|-
 +
| PUT
 +
| /loadbalancers/''loadBalancerId''/connectionthrottle
 +
| Update throttling configuration.  
 +
|-
 +
| DELETE
 +
| /loadbalancers/''loadBalancerId''/connectionthrottle
 +
| Remove connection throttling configurations.  
 +
|}
  
<healthMonitor xmlns="http://docs.openstack.org/loadbalancers/api/v1.1"
+
'''Normal Response Code(s)''': 200, 202
type="CONNECT"
 
delay="20"
 
timeout="10"
 
attemptsBeforeDeactivation="3" />
 
  
Example 4.28. Monitor Connections Request: JSON
+
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
  
{"healthMonitor": {
+
The connection throttling feature imposes limits on the number of connections per client IP address to help mitigate malicious or abusive traffic to your applications. The following properties can be configured based on the traffic patterns for your sites.
"type": "CONNECT",
 
"delay": 20,
 
"timeout": 10,
 
"attemptsBeforeDeactivation": 3
 
  
  }
+
* '''maxRequestRate''': Maximum number of HTTP requests (or TCP connections) allowed from a single IP address in the defined ''rateInterval''. Setting a value of 0 allows an unlimited connection or request rate.
}
+
* '''rateInterval''': Frequency (in seconds) at which the '''maxRequestRate '''is assessed. For example, a maxRequestRate of 30 with a rateInterval of 60 would allow a maximum of 30 HTTP requests or TCP connections per minute from a single IP address. This attribute must have a value between 1 and 3600.
  
Example 4.29. Monitor Connections Response: XML
 
  
<healthMonitor xmlns="http://docs.openstack.org/loadbalancers/api/v1.1"
+
<pre><nowiki>#!wiki caution
type="CONNECT"
+
Note
delay="10"
 
timeout="10"
 
attemptsBeforeDeactivation="3" />
 
  
Example 4.30. Monitor Connections Response: JSON
+
When the rate is exceeded, the load balancer returns a serviceUnavailable (503) error to new requests for HTTP/HTTPS loadbalancers. For TCP loadbalancers, new connections are refused.
 +
</nowiki></pre>
  
{"healthMonitor": {
+
'''Example 4.42. List Connection Throttling Configuration Response: XML'''
"type": "CONNECT",
 
"delay": 20,
 
"timeout": 10,
 
"attemptsBeforeDeactivation": 3
 
  
}
 
}
 
  
4.5.1.2. Monitor HTTP and HTTPS
+
<pre><nowiki>#!highlight xml numbers=disable
The HTTP and HTTPS monitor is more intelligent than the connect monitor. It is capable of processingan HTTP or HTTPS response to determine the condition of a node. It supports the same basic propertiesas the CONNECT monitor and includes additional attributes of path that is used to evaluate the HTTP
+
<connectionThrottle xmlns="http://docs.openstack.org/atlas/api/v1.1"
response.
+
                    maxRequestRate="50" rateInterval="60" />
 +
</nowiki></pre>
  
+
'''Example 4.43. List Connection Throttling Configuration Response: JSON'''
path: The HTTP path used in the request by the monitor. This must be a string beginning with a /
 
(forward slash). The monitor expects a response from the node with an HTTP status code of 200.
 
29
 
  
^l
 
API Operations
 
  
Example 4.31. Monitor HTTP Response: XML
+
<pre><nowiki>#!highlight javascript numbers=disable
 
+
{
<healthMonitor xmlns="http://docs.openstack.org/loadbalancers/api/v1.1"
+
    "maxRequestRate": "50",
type="HTTP"
+
    "rateInterval": "60"
delay="10"
 
timeout="3"
 
attemptsBeforeDeactivation="2"
 
path="/"
 
 
 
/>  
 
 
 
Example 4.32. Monitor HTTPS Response: XML
 
 
 
<healthMonitor xmlns="http://docs.openstack.org/loadbalancers/api/v1.1"
 
type="HTTPS"
 
delay="10"  
 
timeout="3"
 
attemptsBeforeDeactivation="2"
 
path="/"
 
 
 
/>
 
 
 
4.6. Sessions
 
4.6.1. Manage Session Persistence
 
Session persistence is a feature of the load balancing service which forces multiple requests from clientsto be directed to the same node. This is common with many web applications that do not inherentlyshare application state between back-end servers.
 
 
 
Table 4.5. Session Persistence Modes
 
 
 
Name
 
 
 
Description
 
 
 
HTTP_COOKIE A session persistence mechanism that inserts an HTTP cookie and is used to determine thedestination back-end node. This is supported for HTTP load balancing only.
 
 
 
Verb URI Description
 
GET /loadbalancers/loadBalancerId/
 
sessionpersistence
 
List session persistence configuration.
 
PUT /loadbalancers/loadBalancerId/
 
sessionpersistence
 
Enable session persistence.
 
DELETE /loadbalancers/loadBalancerId/
 
sessionpersistence
 
Disable session persistence.
 
 
 
Normal Response Code(s): 200, 202
 
 
 
Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401),
 
badRequest (400), overLimit (413)
 
 
 
Example 4.33. List Session Persistence Configuration Response: XML
 
 
 
<sessionPersistence xmlns="http://docs.openstack.org/loadbalancers/api/v1.1" persistenceType="HTTP_COOKIE"/>
 
 
 
30
 
 
 
^l
 
API Operations
 
 
 
Example 4.34. List Session Persistence Configuration Response: JSON
 
 
 
{
 
"sessionPersistence":{
 
"persistenceType":"HTTP_COOKIE"  
 
 
}
 
}
}
+
</nowiki></pre>
  
Example 4.35. Set Session Persistence Type Request: XML  
+
'''Example 4.44. Update Connection Throttling Configuration Request: XML'''
  
<sessionPersistence xmlns="http://docs.openstack.org/loadbalancers/api/v1.1" persistenceType="HTTP_COOKIE"/>
 
  
Example 4.36. Set Session Persistence Type Request: JSON
+
<pre><nowiki>#!highlight xml numbers=disable
 +
<connectionThrottle xmlns="http://docs.openstack.org/atlas/api/v1.1"
 +
                    maxRequestRate="40" />
 +
</nowiki></pre>
  
{
+
'''Example 4.45. Update Connection Throttling Configuration Request: JSON'''
"sessionPersistence":{
 
"persistenceType":"HTTP_COOKIE"
 
}
 
}
 
  
4.7. Connections
 
4.7.1. Log Connections
 
Verb URI Description
 
GET /loadbalancers/loadBalancerId/connectionlogging View current configuration of connection logging.
 
PUT /loadbalancers/loadBalancerId/connectionlogging Enable or disable connection logging.
 
  
Normal Response Code(s): 200, 202
+
<pre><nowiki>#!highlight javascript numbers=disable
 
+
{
Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401),
+
  "maxRequestRate": "40"
badRequest (400), overLimit (413)
 
 
 
This operation allows the user to view the current connection logging configuration, enable connectionlogging, or disable connection logging.
 
 
 
The service provider is responsible for providing an out-of-band method for users of the service toretrieve the access and connection logs of their load balancers.
 
 
 
Example 4.37. List Connection Logging Configuration Response: XML
 
 
 
<connectionLogging xmlns="http://docs.openstack.org/loadbalancers/api/v1.1" enabled="true"/>
 
 
 
31
 
 
 
^l
 
API Operations
 
 
 
Example 4.38. List Connection Logging Configuration Response: JSON
 
 
 
{
 
"connectionLogging": {
 
"enabled": "true"  
 
 
}
 
}
}
+
</nowiki></pre>
  
Example 4.39. Enable Connection Logging Request: XML
+
=== Protocols ===
 +
==== List Load Balancing Protocols ====
 +
{| border="1" cellpadding="2" cellspacing="0"
 +
| '''Verb'''
 +
| '''URI'''
 +
| '''Description'''
 +
|-
 +
| GET
 +
| /protocols
 +
| List all supported load balancing protocols.  
 +
|}
  
<connectionLogging xmlns="http://docs.openstack.org/loadbalancers/api/v1.1" enabled="true"/>
+
'''Normal Response Code(s)''': 200
  
Example 4.40. Enable Connection Logging Request: JSON
+
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
  
{
+
This operation does not require a request body.
"connectionLogging":{
 
"enabled":"true"
 
}
 
}
 
  
4.7.2. Throttle Connections
+
All load balancers must be configured with the protocol of the service which is being load balanced. The protocol selection should be based on the protocol of the back-end nodes. The current specification supports HTTP, HTTPS and TCP services.
Verb URI Description
 
GET /loadbalancers/loadBalancerId/
 
connectionthrottle
 
List connection throttling configuration.
 
PUT /loadbalancers/loadBalancerId/
 
connectionthrottle
 
Update throttling configuration.
 
DELETE /loadbalancers/loadBalancerId/
 
connectionthrottle
 
Remove connection throttlingconfigurations.  
 
  
Normal Response Code(s): 200, 202
+
When configuring an HTTP or HTTPS load balancer, the default port for the given protocol will be selected unless otherwise specified. For TCP load balancers, the port attribute must be provided.
  
Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401),
+
'''Example 4.46. List Load Balancing Protocols Response: XML'''
badRequest (400), overLimit (413)
 
  
The connection throttling feature imposes limits on the number of connections per client IP addressto help mitigate malicious or abusive traffic to your applications. The following properties can beconfigured based on the traffic patterns for your sites.
 
  
Note
+
<pre><nowiki>#!highlight xml numbers=disable
 +
<protocols xmlns="http://docs.openstack.org/atlas/api/v1.1">
 +
    <protocol name="HTTP" port="80" />
 +
    <protocol name="HTTPS" port="443" />
 +
    <protocol name="TCP" port="*" />
 +
</protocols>
 +
</nowiki></pre>
  
Whent the rate is exceeded, the load balancer returns a serviceUnavailable (503) for HTTP/
+
'''Example 4.47. List Load Balancing Protocols Response: JSON'''
HTTPS loadbalancers and refuses connections for TCP loadbalancers.  
 
  
 
maxRequestRate: Maximum number of HHTP requests (or TCP connections) allowed froma single IP address in the defined rateInterval. Setting a value of 0 allows an unlimitedconnection rate.
 
 
rateInterval: Frequency (in seconds) at which the maxRequestRateis assessed. For
 
example, a maxRequestRateof 30 with a rateIntervalof 60 would allow a maximum of 30
 
connections per minute for a single IP address. This value must be specified between 1 and 3600.
 
32
 
  
^l
+
<pre><nowiki>#!highlight javascript numbers=disable
API Operations
+
{
 
+
  "protocols": [
Example 4.41. List Connection Throttling Configuration Response: XML
+
              {
 
+
                "name": "HTTP",
<connectionThrottle xmlns="http://docs.openstack.org/loadbalancers/api/v1.1"
+
                "port": "80"
maxRequestRate="50"
+
              },
rateInterval="60" />  
+
              {
 
+
                "name": "HTTPS",
Example 4.42. List Connection Throttling Configuration Response: JSON
+
                "port": "443"
 
+
              },
{"connectionThrottle":{
+
              {
"maxRequestRate": 50,
+
                "name": "TCP",
"rateInterval": 60
+
                "port": "*"
 
+
              }
}
+
              ]
}
 
 
 
Example 4.43. Update Connection Throttling Configuration Request: XML
 
 
 
<connectionThrottle xmlns="http://docs.openstack.org/loadbalancers/api/v1.1"
 
maxRequestRate="50"
 
rateInterval="60" />
 
 
 
Example 4.44. Update Connection Throttling Configuration Request: JSON
 
 
 
{"connectionThrottle":{
 
"maxRequestRate": 50,
 
"rateInterval": 60
 
 
 
  }
 
}
 
 
 
4.8. Protocols
 
4.8.1. List Load Balancing Protocols
 
Verb URI Description
 
GET /loadbalancers/protocols List all supported load balancingprotocols.
 
 
 
Normal Response Code(s): 200
 
 
 
Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401),
 
badRequest (400), overLimit (413)
 
 
 
This operation does not require a request body.
 
 
 
All load balancers must define the protocol of the service which is being load balanced. The protocolselection should be based on the protocol of the back-end nodes. When configuring a HTTP or HTTPSload balancer, the default port for the given protocol will be selected unless otherwise specified. ForTCP load balancers, the port attribute must be provided.
 
 
 
33
 
 
 
^l
 
API Operations
 
 
 
Example 4.45. List Load Balancing Protocols Response: XML
 
 
 
<protocols xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">
 
<protocol name="TCP"/>
 
<protocol name="HTTP" port="80" />
 
<protocol name="HTTPS" port="443" />
 
 
 
</protocols>
 
 
 
Example 4.46. List Load Balancing Protocols Response: JSON
 
 
 
{"protocols": [
 
 
 
{  
 
"name": "HTTP",  
 
"port": "80"
 
 
 
},
 
 
 
{  
 
"name": "HTTPS",  
 
"port": "443"
 
 
 
},
 
{  
 
"name": "TCP"  
 
 
}
 
}
]
+
</nowiki></pre>
}
 
  
4.9. Algorithms  
+
=== Algorithms ===
All load balancers utilize an algorithm that defines how traffic should be directed between back-
+
All load balancers utilize an algorithm that defines how traffic should be directed between back- end nodes. The default algorithm for newly created load balancers is ROUND_ROBIN, which can be overridden at creation time or changed after the load balancer has been initially provisioned.
end nodes. The default algorithm for newly created load balancers is ROUND_ROBIN, which canbe overridden at creation time or changed after the load balancer has been initially provisioned. Thealgorithm name is to be constant within a major revision of the load balancing API, though newalgorithms may be created with a unique algorithm name within a given major revision of the serviceAPI.  
 
  
Table 4.6. Load Balancing Algorithms
+
The algorithm name is to be constant within a major revision of the load balancing API, though new algorithms may be created with a unique algorithm name within a given major revision of this API.
  
Name Description
+
'''Table 4.6. Load Balancing Algorithms'''
LEAST_CONNECTIONS The node with the lowest number of connections will receive requests.
+
{| border="1" cellpadding="2" cellspacing="0"
Weights can be defined as part of the node configuration.
+
| '''Name'''
ROUND_ROBIN Connections are routed to each of the back-end servers in turn. This is the
+
|-
default algorithm. Weights can be defined as part of the node configuration.
+
| LEAST_CONNECTIONS  
 +
|-
 +
| ROUND_ROBIN  
 +
|}
  
4.9.1. List Load Balancing Algorithms  
+
==== List Load Balancing Algorithms ====
Verb  
+
{| border="1" cellpadding="2" cellspacing="0"
 +
| '''Verb'''
 +
| '''URI'''
 +
| '''Description'''
 +
|-
 +
| GET
 +
| /algorithms
 +
| List all supported load balancing algorithms.
 +
|}
  
URI
+
'''Normal Response Code(s)''': 200
  
Description
+
'''Error Response Code(s)''': loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)
  
GET
+
This operation does not require a request body.
  
/loadbalancers/algorithms
+
'''Example 4.48. List Load Balancing Algorithms Response: XML'''
  
List all supported load balancing algorithms.
 
  
Normal Response Code(s): 200
+
<pre><nowiki>#!highlight xml numbers=disable
 +
<algorithms xmlns="http://docs.openstack.org/atlas/api/v1.1">
 +
  <algorithm name="ROUND_ROBIN" />
 +
  <algorithm name="LEAST_CONNECTIONS" />
 +
</algorithms>
 +
</nowiki></pre>
  
Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401),
+
'''Example 4.49. List Load Balancing Algorithms Response: JSON'''
badRequest (400), overLimit (413)
 
This operation does not require a request body.
 
  
34
 
  
^l
+
<pre><nowiki>#!highlight javascript numbers=disable
API Operations
+
{
 
+
  "algorithms": [
Example 4.47. List Load Balancing Algorithms Response: XML
+
                  {
 
+
                    "name": "ROUND_ROBIN"
<algorithms xmlns="http://docs.openstack.org/loadbalancers/api/v1.1">
+
                  },
<algorithm name="LEAST_CONNECTIONS" />  
+
                  {
<algorithm name="ROUND_ROBIN" />
+
                    "name": "LEAST_CONNECTIONS"
 
+
                  }
</algorithms>
+
                ]
 
 
Example 4.48. List Load Balancing Algorithms Response: JSON
 
 
 
{"algorithms": [
 
{  
 
 
 
"name": "LEAST_CONNECTIONS"  
 
},
 
{  
 
 
 
"name": "ROUND_ROBIN"  
 
 
}
 
}
]
+
</nowiki></pre>
}
 
 
 
35
 
 
 
^l
 
Chapter 5. API Extensions
 
  
Implementations of this API specifications are free to augment this core API with extensions as they seeappropriate to extend Load Balancing features (e.g. support for new LB algorithms) or offer new ones.
+
== API Extensions ==
All client applications written to this core specification however (using this core API) must be supportedby extended implementations. Therefore, these applications should not receive payloads or values notspecified in this specification nor should they obtain a different behavior than the one described in thisdocumentation.  
+
Implementations of this API specifications are free to augment this core API with extensions as they see appropriate (e.g. support for new LB algorithms or protocols).
  
For a detailed description of how to use Extension APIs in [[OpenStack]] services, refer to [[OpenStackCompute]] API1.1 documentation on the [[OpenStack]] website.  
+
All client applications written to this core specification however must be supported by extended implementations. Therefore, an application using this API should not receive payloads or values not specified in this specification nor should it need to specify extra information in requests not described in this specification.
  
36
+
For a detailed description of how to develop and use Extension APIs in OpenStack services, refer to OpenStack Compute API 1.1 documentation on the OpenStack website.
  
^l
+
[[Category: Neutron]]

Latest revision as of 21:01, 9 January 2015


#!wiki caution
'''Note'''

If you want to discuss changes to this spec or found an error, please contact uma.goring AT rackspace.com or youcef.laribi AT citrix.com

OpenStack LoadBalancers API 1.1

Contents

Overview

Intended Audience

This guide is intended for software developers who want to create applications using the OpenStack Load Balancers API. It assumes the reader has a general understanding of load balancing concepts and is familiar with:

  • ReSTful web services
  • HTTP/1.1 conventions
  • JSON and/or XML serialization formats

Document Change History

This version of the Developer Guide replaces and obsoletes all previous versions. The most recent changes are described in the table below:

Revision Date Summary of Changes

Revision Date
Feb 9, 2012
Jan. 24, 2012
May 27, 2011
Apr. 19, 2011
Feb. 23, 2011

Concepts

To use OpenStack Load Balancers API effectively, you should understand several key concepts:

Load Balancer

A load balancer is a logical device. It is used to distribute workloads between multiple back-end systems or services called nodes, based on the criteria defined as part of its configuration.

Virtual IP

A virtual IP is an Internet Protocol (IP) address configured on the load balancer for use by clients connecting to a service that is load balanced. Incoming connections and requests are distributed to back-end nodes based on the configuration of the load balancer.

Node

A node is a back-end device providing a service on a specified IP and port.

Health Monitoring

A health monitor is a feature of each load balancer. It is used to determine whether or not a back-end node of the load balancer is usable for processing a request. The load balancing service supports two health monitoring modes: passive and active.

Passive Health Monitoring

By default, all load balancing configurations utilize passive health monitoring, which is the default monitoring and does not require any configuration from the user. If the passive health monitoring determines that a node is down, unreachable or malfunctioning, it puts the node in an OFFLINE state and stops sending traffic to it.

Active Health Monitoring

Active health monitoring is a technique that is explicitly configured by users. It uses synthetic transactions executed at periodic intervals to determine the condition of a node. When active monitoring is activated, it takes over the monitoring of the nodes, and passive monitoring is disabled. Conversely, when active monitoring is removed by the user, passive monitoring is re-enabled for the nodes of the load balancer. This guarantees that the nodes health is always monitored.

When configuring active health monitoring, a user can choose between using one of three types of probes:

  • CONNECT
  • HTTP
  • HTTPS

These probes are executed at configured intervals; in the event of a failure, the node status changes to OFFLINE and the node will not receive traffic. If, after running a subsequent test, the probe detects that the node has recovered, then the node's status is changed to ONLINE and it is capable of servicing requests.

Session Persistence

Session persistence is a feature of the load balancing service. It attempts to force subsequent connections or requests in the same session to be redirected to the same node as long as it is online.

General API Information

Sections in this chapter describe operations and guidelines that are common to all OpenStack APIs, and are not specific to the Load Balancing API.

Authentication

This API uses the standard defined by OpenStack for authentication. This is currently a work in progress. Once this is finalized, this section will describe how users can authenticate and obtain a token from the OpenStack Authentication service, and how they can present this token in the Load Balancing API.

Refer to current status of OpenStack Authentication at http://wiki.openstack.org/openstack-authn and to OpenStack project KeyStone for detailed information.

Service Access/Endpoints

Your service provider will publish the endpoints that you can use to connect to the LB service it operates.

Request/Response Types

The Cloud Load Balancers API supports both the JSON and XML data serialization formats. The request format is specified using the Content-Type header and is required for operations that have a request body. The response format can be specified in requests using either the Accept header or adding an .xml or .json extension to the request URI. Note that it is possible for a response to be serialized using a format different from the request. If no response format is specified, JSON is the default. If conflicting formats are specified using both an Accept header and a query extension, the query extension takes precedence.

Table 3.1. JSON and XML Response Formats

Format Accept Header Query Extension
JSON application/json .json
XML application/xml .xml

Content Compression

Request and response body data may be encoded with gzip compression to accelerate interactive performance of API calls and responses. This is controlled using the Accept-Encoding header in the request from the client and indicated by the Content-Encoding header in the server response.

Unless the header is explicitly set, encoding defaults to disabled.

Table 3.2. Encoding Headers

Header Type Name
HTTP/1.1 Request Accept-Encoding
HTTP/1.1 Response Content-Encoding

Persistent Connections

By default, the API supports persistent connections via HTTP/1.1 keep-alives. All connections will be kept alive unless the connection header is set to close.


#!wiki caution
'''Note'''

The server may close the connection at any time and clients should not rely on this behavior.

Paginated Collections

To reduce load on the service, list operations will return a maximum of 100 items at a time. To navigate the collection, the limit and marker parameters (for example, ?limit=50&marker=1) can be set in the URI. If a marker beyond the end of a list is given, an empty list is returned. Note that list operations never return 404 (itemNotFound) faults.

Limits

Accounts may be preconfigured with a set of thresholds (or limits) to manage capacity and prevent abuse of the system. The system recognizes two kinds of limits: rate limits and absolute limits. Rate limits are thresholds that are reset after a certain amount of time passes. Absolute limits are fixed.

Rate Limits

We specify rate limits in terms of both a human-readable wild-card URI and a machine-processable regular expression. The regular expression boundary matcher '^' takes effect after the root URI path. For example, the regular expression/v1.1/1234/loadbalancers would match the bold portion of the following URI: https://loadbalancers.api.openstack.org/v1.1/1234/loadbalancers.

Table 3.3. Default Rate Limits

Verb URI RegEx
GET /v1.1/* ^/1.1/.*
POST /v1.1/* ^/1.1/.*
POST /v1.1/* ^/1.1/.*
PUT /v1.1/* ^/1.1/.*
DELETE /v1.1/* ^/1.1/.*

Rate limits are applied in order relative to the verb, going from least to most specific. For example, although the threshold for POST to /v1.1/* is 25 per minute, one cannot POST to /v1.1/* more than 2 times per second because the rate limit for any POST is 2 per second. In the event you exceed the thresholds established for your account, a 413 (Rate Control) HTTP response will be returned with a Retry-After header to notify the client when they can attempt to try again.

Absolute Limits

Absolute limits are specified as name/value pairs. Then name of the absolute limit uniquely identifies the limit within a deployment. For example maxNodesPerLoadbalancer identifies the total number of nodes that may be associated with a given load balancer.

The following table shows some of these limits and example values:

Name Value
maxLoadBalancers 20
maxNodesPerLoadBalancer 5
maxVIPsPerLoadBalancer 1
maxDaysKeptForDeletedLoadBalancers 15
maxLoadBalancerNameLength 15

Determining Limits Programmatically

Applications can programmatically determine current account limits using the /limits URI as follows:

Verb URI
GET /limits

Normal Response Code(s): 200

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

This operation does not require a request body.

Example 3.1. List Limits Response: XML


#!highlight xml numbers=disable
<limits xmlns="http://docs.openstack.org/common/api/v1.1">
   <rates>
      <rate uri="/v1.1/*" regex="^/1.1/.*">
          <limit  verb="GET"  value="600000"
                  remaining="426852"  unit="HOUR"
                  next-available="2011-02-22T19:32:43.835Z"/>
      </rate>
   </rates>

   <absolute>
       <limit name="maxNodesPerLoadBalancer" value="5"/>
       <limit name="maxVIPsPerLoadBalancer" value="1"/>
   </absolute>
</limits>

Example 3.2. List Limits Response: JSON


#!highlight javascript numbers=disable
 {
    "limits" :
          {
            "rate" : {
                       "values": [
                                  {
                                    "uri" : "/v1.1/*",
                                    "regex" : "^/1./.*",
                                    "limit" : [
                                               {
                                                 "verb" : "GET",
                                                 "value" : 600000,
                                                 "remaining" : 426852,
                                                 "unit" : "HOUR",
                                                 "next-available" : "2011-02-22T19:32:43.835Z"
                                               }
                                              ]
                                  }

                                ]
                     },
            "absolute" : {
                           "values" : {
                                        "maxNodesPerLoadBalancer" : "5",
                                        "maxVIPsPerLoadBalancer" : "1"
                                      }
                         }
          }
}

Faults

API calls that return an error return one of the following fault objects. All fault objects extend from the base fault, serviceFault, for easier exception handling for languages that support it.

serviceFault

The serviceFault and by extension all other faults include message and detail elements which contain strings describing the nature of the fault as well as a code attribute representing the HTTP response code for convenience. The code attribute of the fault is for the convenience of the caller so that they may retrieve the response code from the HTTP response headers or directly from the fault object if they choose. The caller should not expect the serviceFault to be returned directly but should instead expect only one of the child faults to be returned.

badRequest

This fault indicates that the data in the request object is invalid; for example, a string was used in a parameter that was expecting an integer. The fault will wrap validation errors.

Example 3.3. Fault Response, badRequest


#!highlight xml numbers=disable
<badRequest xmlns="http://docs.openstack.org/atlas/api/v1.1" code="400">
   <message>Validation fault</message>
   <details>The object is not valid</details>
   <validationErrors>
      <message>Node IP address is invalid. Please specify a valid IP address.</message>
   </validationErrors>
</badRequest>

immutableEntity

This fault is returned when a user attempts to modify an item that is not currently in a state that allows modification. For example, load balancers in a status of BUILD,PENDING_UPDATE or DELETED may not be modified.

Example 3.4. Fault Response, immutableEntity


#!highlight xml numbers=disable
<immutableEntity code="422" xmlns="http://docs.openstack.org/atlas/api/v1.1">
  <message>The object at the specified URI is immutable and cannot be modified.
  </message>
</immutableEntity>

itemNotFound

Example 3.5. Fault Response, itemNotFound


#!highlight xml numbers=disable
<itemNotFound code="404" xmlns="http://docs.openstack.org/atlas/api/v1.1">
  <message>Object not Found</message>
</itemNotFound>

loadBalancerFault

The loadBalancerFault fault shall be returned in the event that an unpexpected error occurred during a loadbalancer operation.

Example 3.6. Fault Response, loadBalancerFault


#!highlight xml numbers=disable
<loadBalancerFault code="500" xmlns="http://docs.openstack.org/atlas/api/v1.1">
  <message>Load Balancer has experienced an internal error</message>
</loadBalancerFault>

outOfVirtualIps

This fault indicates that there are no virtual IPs left to assign to a new load balancer. In practice, this fault should not occur, as virtual IPs will be ordered as capacity is required.

Example 3.7. Fault Response, outOfVirtualIps


#!highlight xml numbers=disable
<outOfVirtualIps code="500" xmlns="http://docs.openstack.org/atlas/api/v1.1">
   <message>
       Out of virtual IPs. Please contact support so they can allocate more virtual IPs.
   </message>
</outOfVirtualIps>

overLimit

This fault is returned when the user has exceeded a currently allocated limit.

Example 3.8. Fault Response, overLimit


#!highlight xml numbers=disable
<overLimit code="413" xmlns="http://docs.openstack.org/atlas/api/v1.1">
  <message>
    Load balancer cannot be created. You have reached your maximum number of load balancers.
  </message>
</overLimit>

serviceUnavailable

This fault is returned when the service is unavailable, such as when the service is undergoing maintenance. Note that this does not necessarily mean that the currently configured load balancers are unable to process traffic; it simply means that the API is currently unable to service requests.

Example 3.9. Fault Response, serviceUnavailable


#!highlight xml numbers=disable
<serviceUnavailable code="500" xmlns="http://docs.openstack.org/atlas/api/v1.1">
   <message>The Load balancing service is currently not available</message>
</serviceUnavailable>

unauthorized

This fault is returned when the user is not authorized to perform an attempted operation.

Example 3.10. Fault Response, unauthorized


#!highlight xml numbers=disable
<unauthorized code="401" xmlns="http://docs.openstack.org/atlas/api/v1.1">
    <message>You are not authorized to execute this operation.</message>
</unauthorized>

unprocessableEntity

This fault is returned when an entity cannot be processed due to semantic errors.

Example 3.11. Fault Response, unprocessableEntity


#!highlight xml numbers=disable
<unprocessableEntity code="422" xmlns="http://docs.openstack.org/atlas/api/v1.1">
   <message>The Object at the specified URI is unprocessable.</message>
</unprocessableEntity>

API Operations

This chapter explains specific API operations. For ideas relevant to all API operations, see the "General API Information" chapter.

Load Balancers

List Load Balancers

Verb URI Description
GET /loadbalancers List all load balancers configured for the account.

Normal Response Code(s): 200

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

This operation provides a list of all load balancers configured and associated with your account.

To view deleted load balancers, add "?status=DELETED" to the end of the GET URI. A deleted loadbalancer is immutable and irrecoverable.

This operation returns the following attributes for each load balancer:

  • id
  • name
  • algorithm
  • protocol
  • port
  • status
  • created
  • updated

This operation does not require a request body.

Example 4.1. List Load Balancers Response: XML


#!highlight xml numbers=disable
<?xml version="1.0" ?>
<loadBalancers xmlns="http://docs.openstack.org/atlas/api/v1.1">
  <loadBalancer id="71" name="lb-site1" status="ACTIVE"
                protocol="HTTP" port="80" algorithm="LEAST_CONNECTIONS" created="2010-12-13T15:38:27-06:00" updated="2010-12-13T15:38:38-06:00" >
  </loadBalancer>

  <loadBalancer id="166" name="lb-site2" status="ACTIVE"
                protocol="HTTP" port="80" algorithm="ROUND_ROBIN"  created="2010-12-13T15:38:27-06:00" updated="2010-12-13T15:38:38-06:00" >
  </loadBalancer>
</loadBalancers>

Example 4.2. List Load Balancers Response: JSON


#!highlight javascript numbers=disable
{
  "loadBalancers":[
         {
           "name":"lb-site1",
           "id":"71",
           "protocol":"HTTP",
           "port":"80",
           "algorithm":"LEAST_CONNECTIONS",
           "status":"ACTIVE",
           "created":"2010-11-30T03:23:42Z",
           "updated":"2010-11-30T03:23:44Z"
         },
         {
           "name":"lb-site2",
           "id":"166",
           "protocol":"TCP",
           "port":"9123",
           "algorithm":"ROUND_ROBIN",
           "status":"ACTIVE",
           "created":"2010-11-30T03:23:42Z",
           "updated":"2010-11-30T03:23:44Z"
         }
      ]
}

List Load Balancer Details

Verb URI Description
GET /loadbalancers/loadBalancerId List details of the specified load balancer.

Normal Response Code(s): 200

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

This operation provides detailed output for a specific load balancer configured and associated with your account. This operation is not capable of returning details for a load balancer which has been deleted.

This operation does not require a request body.

Example 4.3. List Load Balancer Details Response: XML


#!highlight xml numbers=disable
<loadBalancer xmlns="http://docs.openstack.org/atlas/api/v1.1"
   id="2000"
   name="sample-loadbalancer"
   protocol="HTTP"
   port="80"
   algorithm="ROUND_ROBIN"
   status="ACTIVE"
   created="2010-11-30T03:23:42Z"
   updated="2010-11-30T03:23:44Z">

   <virtualIps>
     <virtualIp id="1000" address="2001:cdba:0000:0000:0000:0000:3257:9652" type="PUBLIC" ipVersion="IPV6" />
   </virtualIps>

   <nodes>
     <node id="1041" address="10.1.1.1" port="80" condition="ENABLED" status="ONLINE" />
     <node id="1411" address="10.1.1.2" port="80" condition="ENABLED" status="ONLINE" />
   </nodes>

   <sessionPersistence persistenceType="HTTP_COOKIE"/>

   <connectionThrottle maxRequestRate="50" rateInterval="60" />

</loadBalancer>

Example 4.4. List Load Balancers Details Response: JSON


#!highlight javascript numbers=disable
{
      "id": "2000",
      "name":"sample-loadbalancer",
      "protocol":"HTTP",
      "port": "80",
      "algorithm":"ROUND_ROBIN",
      "status":"ACTIVE",
      "created":"2010-11-30T03:23:42Z",
      "updated":"2010-11-30T03:23:44Z",
      "virtualIps":[
                    {
                       "id": "1000",
                       "address":"2001:cdba:0000:0000:0000:0000:3257:9652",
                       "type":"PUBLIC",
                       "ipVersion":"IPV6"
                    }
                   ],

       "nodes":     [
                      {
                         "id": "1041",
                         "address":"10.1.1.1",
                         "port": "80",
                         "condition":"ENABLED",
                         "status":"ONLINE"
                       },
                       {
                         "id": "1411",
                         "address":"10.1.1.2",
                         "port": "80",
                         "condition":"ENABLED",
                         "status":"ONLINE"
                       }
                     ],
       "sessionPersistence":{
                              "persistenceType":"HTTP_COOKIE"
                            },
       "connectionThrottle":{
                              "maxRequestRate": "50",
                              "rateInterval": "60"
                            }
}

Create Load Balancer

Verb URI Description
POST /loadbalancers Create a new load balancer with the configuration defined by the request.

Normal Response Code(s): 202

Error Response Code(s): loadbalancerFault (500), serviceUnavailable (503), unauthorized (401),badRequest (400), overLimit (413)

This operation provisions a new load balancer based on the configuration defined in the request object. Once the request is validated and progress has started on the provisioning process, a response object will be returned. The object will contain a unique identifier and status of the request.

If the status returned is set to "BUILD", then using the identifier of the load balancer, the caller can check on the progress of the creation operation by performing a GET on loadbalancers/loadbalancerid. When the status of the load balancer returned changes to "ACTIVE", then the load balancer has been successfully provisioned and is now operational.

The caller of this operation must specify at least the following attributes of the load balancer:

  • name
  • At least one node

If the request cannot be fulfilled due to insufficient or invalid data, an HTTP 400 (Bad Request) error response will be returned with information regarding the nature of the failure in the body of the response. Failures in the validation process are non-recoverable and require the caller to correct the cause of the failure and POST the request again.


#!wiki caution
Note

By default the system will create a loadbalancer with protocol set to HTTP, port set to 80 (or 443 if protocol is HTTPS), and assign a public IPV6 address to the loadbalancer. The default algorithm used is set to ROUND_ROBIN.


#!wiki caution
Note

A load balancer's name has a max length that can be queried when querying limits.

Users may configure all documented features of the load balancer at creation time by simply providing the additional elements or attributes in the request. This document provides an overview of all the features the load balancing service supports.


#!wiki caution
Note

Users may request either an IPv4 or IPV6 address by specifying the version in the create request. For example to request a public IPV6 virtual IP address for the load balancer, use the following virtualIP element in the request:

<virtualIp type="PUBLIC" ipVersion="IPV6"/>

If the version attribute is not specified, then an IPv6 IP address is allocated by default.

Example 4.5. Create Load Balancer (Required Attributes) Request: XML


#!highlight xml numbers=disable
<loadBalancer xmlns="http://docs.openstack.org/atlas/api/v1.1"
              name="a-new-loadbalancer">
      <nodes>
      <node address="10.1.1.1" port="80" />
      <node address="10.1.1.2" port="81" />
    </nodes>
</loadBalancer>

Example 4.6. Create Load Balancer (Required Attributes) Request: JSON


#!highlight javascript numbers=disable
{
    "name": "a-new-loadbalancer",
    "nodes":      [
                    {
                      "address": "10.1.1.1",
                      "port": "80"
                    },
                    {
                      "address": "10.1.1.2",
                      "port": "81"
                    }
                   ]
}

If you have at least one load balancer, you may create subsequent load balancers that share a single virtual IP by issuing a POST and supplying a virtual IP ID instead of a type. Additionally, this feature is highly desirable if you wish to load balance both an unsecured and secure protocol using one IP address. For example, this method makes it possible to use the same load balancing configuration to support an HTTP and an HTTPS load balancer.


#!wiki caution
Note

Load balancers sharing a virtual IP must utilize a unique port.

Example 4.7. Create Load Balancer (Required Attributes with Shared IP) Request: XML


#!hightlight xml
<loadBalancer xmlns="http://docs.openstack.org/atlas/api/v1.1"
              name="a-new-loadbalancer" port="83" protocol="HTTP">
      <virtualIps>
         <virtualIp id="39"/>
      </virtualIps>

      <nodes>
         <node address="10.1.1.1" port="80" condition="ENABLED" />
      </nodes>
</loadBalancer>

Example 4.8. Create Load Balancer (Required Attributes with Shared IP) Request: JSON


#!highlight javascript numbers=disable
{
   "name":"a-new-loadbalancer",
   "port":"83",
   "protocol":"HTTP",
   "virtualIps": [
                   {
                      "id":"39"
                   }
                 ],
   "nodes":      [
                   {
                      "address":"10.1.1.1",
                      "port":"80",
                      "condition":"ENABLED"
                   }
                 ]
}

Example 4.9. Create Load Balancer (Required Attributes with Shared IP) Response: XML


#!highlight xml numbers=disable
<loadBalancer xmlns="http://docs.openstack.org/atlas/api/v1.1"
              id="144" name="a-new-loadbalancer" algorithm="ROUND_ROBIN"
              protocol="HTTP"
              port="83"
              status="BUILD"
              created="2011-02-08T21:19:55Z"
              updated="2011-02-08T21:19:55Z" >

    <virtualIps>
       <virtualIp id="39" address="3ffe:1900:4545:3:200:f8ff:fe21:67cf" ipVersion="IPV6" type="PUBLIC" />
    </virtualIps>

    <nodes>
       <node id="653" address="10.1.1.1" port="80" condition="ENABLED" status="ONLINE" />
    </nodes>
</loadBalancer>

Example 4.10. Create Load Balancer (Required Attributes with Shared IP) Response: JSON


#!highlight javascript numbers=disable
{
    "name": "a-new-loadbalancer",
    "id": "144",
    "protocol": "HTTP",
    "port": "83",
    "algorithm": "ROUND_ROBIN",
    "status": "BUILD",
    "created": "2011-04-13T14:18:07Z",
    "updated":"2011-04-13T14:18:07Z",
    "virtualIps": [
                    {
                      "address": "3ffe:1900:4545:3:200:f8ff:fe21:67cf",
                      "id": "39",
                      "type": "PUBLIC",
                      "ipVersion": "IPV6"
                    }
                  ],
    "nodes":      [
                    {
                      "address": "10.1.1.1",
                      "id": "653",
                      "port": "80",
                      "status": "ONLINE",
                      "condition": "ENABLED"
                    }
                  ]
}

Update Load Balancer Attributes

Verb URI Description
PUT /loadbalancers/loadBalancerId Update the properties of a loadbalancer.

Normal Response Code(s): 202

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

This operation updates the attributes of the specified load balancer. Upon successful validation of the request, the service will return a 202 (Accepted) response code. A caller should check that the load balancer status is ACTIVE to confirm that the update has taken effect. If the load balancer status is "PENDING_UPDATE" then the caller can poll the load balancer with its ID (using a GET operation) to wait for the changes to be applied and the load balancer to return to an ACTIVE status.

This operation allows the caller to change one or more of the following attributes:

  • name
  • algorithm

This operation does not return a response body.


#!wiki caution
Note

The load balancer's ID, status, port and protocol are immutable attributes and cannot be modified by the caller. Supplying an unsupported attribute will result in a 400 (badRequest) fault.

Example 4.11. Update Load Balancer Attributes Request: XML


#!highlight xml numbers=disable
<loadBalancer xmlns="http://docs.openstack.org/atlas/api/v1.1"
              name="newname-loadbalancer" algorithm="LEAST_CONNECTIONS" />

Example 4.12. Update Load Balancer Attributes Request: JSON


#!highlight javascript numbers=disable
{
   "name": "newname-loadbalancer",
   "algorithm": "LEAST_CONNECTIONS"
}

Table 4.1. Load Balancer Statuses

Name
ACTIVE
BUILD
PENDING_UPDATE
PENDING_DELETE
DELETED
SUSPENDED
ERROR

Note that a load balancer whose status is SUSPENDED is not operational and traffic to it is rejected and will not be forwarded to back-end nodes.

Remove Load Balancer

Verb URI Description
DELETE /loadbalancers/loadBalancerId Remove a load balancer from the account.

Normal Response Code(s): 202

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

The remove load balancer function removes the specified load balancer and its associated configuration from the account. Any and all configuration data is immediately purged and is not recoverable.

This operation does not require a request body.

This operation does not return a response body.

Deleted load balancers are still displayed for a number of days after deletion when listing load balancers of an account. Their status is changed to DELETED.The updated date of a DELETED load balancer reflects the time/date of its deletion.

Nodes

The nodes defined by the load balancer are responsible for servicing the requests received through the load balancer's virtual IP. By default, the load balancer employs a basic health check that ensures the node is listening on its defined port. The node is checked at the time of addition and at regular intervals as defined by the load balancer health check configuration. If a back-end node is not listening on its port or does not meet the conditions of the defined active health check for the load balancer, then the loadbalancer will not forward connections or requests to it and its status will be listed as OFFLINE. Only nodes that are in an ONLINE status will receive and be able to service traffic from the load balancer.

The status of the node can be determined by passive or active health monitoring.

The caller can assign the relevant weights to nodes using the weight attribute of the node element.

The weight of a node determines the portion of requests or connections it services compared to the other nodes of the load balancer. For example, if node A has a weight of 2 and node B has a weight of 1, then the loadbalancer will forward twice as many requests to node A than to node B. If the weight attribute is not specified, then the node's weight is implicitly set to "1".

List Nodes

Verb URI Description
GET /loadbalancers/loadBalancerId/nodes List node(s) configured for the load balancer.

List all nodes of a load balancer.

Normal Response Code(s): 200

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

This operation does not require a request body.

Example 4.13. List Nodes Response: XML


#!highlight xml numbers=disable
<nodes>
   <node id="410" address="10.1.1.1" port="80" condition="ENABLED" status="ONLINE" />
   <node id="236" address="10.1.1.2" port="80" condition="ENABLED" status="ONLINE" />
   <node id="2815" address="10.1.1.3" port="83" condition="DISABLED" status="OFFLINE" />
</nodes>

Example 4.14. List Node Response: JSON


#!highlight javascript numbers=disable
{
  "nodes" : [
              {
                "id":"410",
                "address":"10.1.1.1",
                "port":"80",
                "condition":"ENABLED",
                "status":"ONLINE"
              },
              {
                "id":"236",
                "address":"10.1.1.2",
                "port":"80",
                "condition":"ENABLED",
                "status":"ONLINE"
              },
              {
                "id":"2815",
                "address":"10.1.1.3",
                "port":"83",
                "condition":"DISABLED",
                "status":"OFFLINE"
              },
            ]
}

Retrieve a Node

Verb URI Description
GET /loadbalancers/loadBalancerId/nodes/nodeId Retrieve the configuration of node nodeid of loadbalancer loadbalancerId.

This operation retrieves the configuration of a node.

Normal Response Code(s): 200

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

This operation does not require a request body.

Example 4.15. Retrieve the configuration of a node Response: XML


#!highlight xml numbers=disable
<node id="236" address="10.1.1.2" port="80" condition="ENABLED" status="ONLINE" />

Example 4.16. Retrieve a node Response: JSON


#!highlight javascript numbers=disable
{
  "id":"236",
  "address":"10.1.1.2",
  "port":"80",
  "condition":"ENABLED",
  "status":"ONLINE"
}

Add Nodes

Verb URI Description
POST /loadbalancers/loadBalancerId/nodes Add a new node to the load balancer.

Normal Response Code(s): 202

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

When a node is added, it is assigned a unique identifier that can be used for mutating operations such as changing the condition or the weight of a node, or removing the node from the load balancer.

Every load balancer is dual-homed on both the public Internet and the internal network; as a result, nodes can either be internal private addresses or addresses on the public Internet.


#!wiki caution
Note:

When a node is added to a load balancer, it is enabled by default.

Example 4.17. Add Nodes Request: XML


#!highlight xml numbers=disable
<nodes xmlns="http://docs.openstack.org/atlas/api/v1.1">
  <node address="10.1.1.1" port="80" />
  <node address="10.2.2.1" port="80" weight="2" />
  <node address="10.2.2.2" port="88" condition="DISABLED" weight="2" />
</nodes>

Example 4.18. Add Nodes Request: JSON


#!highlight javascript numbers=disable
{
  "nodes": [
             {
               "address": "10.1.1.1",
               "port": "80"
             },
             {
               "address": "10.2.2.1",
               "port": "80",
               "weight": "2"
             },
             {
               "address": "10.2.2.2",
               "port": "88",
               "condition": "DISABLED",
               "weight": "2"
             }
           ]
}

Example 4.19. Add Nodes Response: XML


#!highlight xml numbers=disable
<nodes xmlns="http://docs.openstack.org/atlas/api/v1.1">
 <node id="7298" address="10.1.1.1" port="80" condition="ENABLED" status="ONLINE" />
 <node id="293" address="10.2.2.1" port="80" weight="2" condition="ENABLED" status="OFFLINE" />
 <node id="183" address="10.2.2.2" port="88" weight="2" condition="DISABLED" status="OFFLINE" />
</nodes>

Example 4.20. Add Nodes Response: JSON


#!highlight javascript numbers=disable
{
  "nodes": [
             {
               "id": "7298",
               "address": "10.1.1.1",
               "port": "80",
               "condition": "ENABLED",
               "status": "ONLINE"
             },
             {
               "id": "293",
               "address": "10.2.2.1",
               "port": "80",
               "weight": "2",
               "condition": "ENABLED",
               "status": "OFFLINE"
             },
             {
               "id": "183",
               "address": "10.2.2.4",
               "port": "88",
               "weight": "2",
               "condition": "DISABLED",
               "status": "OFFLINE"
             }
           ]
}

Modify Nodes

Verb URI Description
PUT /loadbalancers/loadBalancerId/nodes/nodeId Modify the configuration of a node on the load balancer.

Normal Response Code(s): 202

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

This operation does not return a response body.


#!wiki caution
Note

The node's IP and port are immutable attributes and cannot be modified with a PUT
request. Supplying an unsupported attribute will result in a 400 (badRequest) fault. A load balancer supports a maximum number of nodes. The maximum number of nodes per loadbalancer is returned when querying the limits of the LB service.

Every node in the load balancer is either enabled or disabled which determines its role within the load balancer. When the node has condition="ENABLED" the node is permitted to accept new connections. Its status will eventually become ONLINE to reflect this configuration. When the node has condition="DISABLED" the node is not permitted to accept any new connections regardless of session persistence configuration. Existing connections to the node are forcibly terminated. The node's status changes to OFFLINE once the configuration has been successfully applied.

Example 4.21. Disable a node Request: XML


#!highlight xml numbers=disable
<node condition="DISABLED" />

Example 4.22. Disable a node Request: JSON


#!highlight javascript numbers=disable
{
  "condition": "DISABLED"
}

Even if a node is configured with condition="ENABLED", its status may remain as OFFLINE if there is a configuration or operational error of the node or its load balancer.

Remove Nodes

Verb URI Description
DELETE /loadbalancers/loadBalancerId/nodes/nodeId Remove a node from the load balancer.

Normal Response Code(s): 200, 202

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

This operation does not require a request body.

This operation does not return a response body.


#!wiki caution
Note

A load balancer must have at least one node. Attempting to remove the last node of a loadbalancer will result in a badRequest (400) error.

Virtual IPs

A virtual IP (VIP) makes a load balancer accessible by clients. The load balancing service supports either a public VIP, routable on the public Internet, or a private address, routable only within the region in which the load balancer resides.

Table 4.3. Virtual IP Types

Name
PUBLIC
INTERNAL

List Virtual IPs

Verb URI Description
GET /loadbalancers/loadBalancerId/virtualips List all virtual IPs associated with a load balancer.

Normal Response Code(s): 200

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

This operation lists all the virtual IP addresses of a load balancer.

This request does not require a request body.


#!wiki caution
Note

The maximum number of VIPs that can be configured when creating a load balancer can be discovered by querying the limits of the LB service.

Example 4.23. List Virtual IPs Response: XML


#!highlight xml numbers=disable
<virtualIps xmlns="http://docs.openstack.org/atlas/api/v1.1">
  <virtualIp id="1021" address="206.10.10.210" type="PUBLIC" ipVersion="IPV4"/>
</virtualIps>

Example 4.24. List Virtual IPs Response: JSON


#!highlight javascript numbers=disable
{
  "virtualIps": [
                 {
                   "id": "1021",
                   "address": "206.10.10.210",
                   "type": "PUBLIC",
                   "ipVersion": "IPV4"
                 }
                ]
}

Usage Reports

List Usage

Name URI Description
GET /loadbalancers/loadBalancerId/usage List current and historical usage.

Normal Response Code(s): 200

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

This operation does not require a request body.

The load balancer usage reports provide a set of usage counters. This list will contain at least the transferBytesIn and transferBytesOut usage counters that represent respectively the amount of traffic in bytes received by the load balancer from clients requests, and the amount fo traffic sent from the nodes as responses to clients.

Example 4.25. Report Load Balancer Usage Response: XML


#!highlight xml numbers=disable
<loadBalancerUsageRecords xmlns="http://docs.openstack.org/atlas/api/v1.1">
   <loadBalancerUsageRecord  id="394"  transferBytesIn="2819204"
                             transferBytesOut="84923069" />
   <loadBalancerUsageRecord  id="473" transferBytesIn="0" transferBytesOut="0" />
</loadBalancerUsageRecords>

Example 4.26. Report Load Balancer Usage Response: JSON


#!highlight javascript numbers=disable
{
  "loadBalancerUsageRecords": [
                                {
                                  "id": "394",
                                  "transferBytesIn": "2819204",
                                  "transferBytesOut": "84923069"
                                },
                                {
                                  "id": "473",
                                  "transferBytesIn": "0",
                                  "transferBytesOut": "0"
                                }
                              ]
}

Monitors

Verb URI Description
GET /loadbalancers/loadBalancerId/healthmonitor Retrieve the health monitor configuration, if one exists.
PUT /loadbalancers/loadBalancerId/healthmonitor Update the settings for a health monitor.
DELETE /loadbalancers/loadBalancerId/healthmonitor Remove the health monitor.

Normal Response Code(s): 200, 202

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

In addition to the default passive monitoring, the load balancing service includes an active health monitoring operation which periodically checks your back-end nodes to ensure they are responding correctly.

Active health monitoring provides 3 types of health monitors. The caller can configure one health monitor on the load blancer.

The health monitor has a type attribute to signify which of the 3 types it is. The 3 types available in this specification are described below.

Table 4.4. Health Monitor Types

Name
CONNECT
HTTP
HTTPS
Monitor CONNECT

The monitor connects to each node on its defined port to ensure that the node is listening properly.

The CONNECT monitor is the most basic type of health check and does not perform post-processing or protocol specific health checks. It includes several configurable properties:

  • delay: This is the minimum time in seconds between regular calls to a monitor.
  • timeout: Maximum number of seconds for a monitor to wait for a connection to be established to the node before it times out. The value must be less than the delay value.
  • attemptsBeforeDeactivation: Number of permissible monitor failures before removing a node from rotation. Must be a number between 1 and 10.

Example 4.27. Monitor CONNECT Request: XML


#!highlight xml numbers=disable
<healthMonitor xmlns="http://docs.openstack.org/atlas/api/v1.1"
               type="CONNECT" delay="20" timeout="10"
               attemptsBeforeDeactivation="3" />

Example 4.28. Monitor CONNECT Request: JSON


#!highlight javascript numbers=disable
{
  "type": "CONNECT",
  "delay": "20",
  "timeout": "10",
  "attemptsBeforeDeactivation": "3"
}

Example 4.29. Monitor Connections Response: XML


#!highlight xml numbers=disable
<healthMonitor xmlns="http://docs.openstack.org/atlas/api/v1.1"
               type="CONNECT" delay="10" timeout="10"
               attemptsBeforeDeactivation="3" />

Example 4.30. Monitor Connections Response: JSON


#!highlight javascript numbers=disable
{
  "type": "CONNECT",
  "delay": "20",
  "timeout": "10",
  "attemptsBeforeDeactivation": "3"
}
Monitor HTTP and HTTPS

The HTTP and HTTPS monitor is more intelligent than the CONNECT monitor. It is capable of processing an HTTP or HTTPS response to determine the condition of a node. It supports the same basic properties as the CONNECT monitor and includes the additional attribute of path that is used to evaluate the HTTP response to a monitor probe.

  • path: The HTTP path used in the HTTP request by the monitor. This must be a string beginning with a / (forward slash). The monitor expects a response from the node with an HTTP status code of 200.

Example 4.31. Monitor HTTP Response: XML


#!highlight xml numbers=disable
<healthMonitor xmlns="http://docs.openstack.org/atlas/api/v1.1"
               type="HTTP" delay="10" timeout="3" attemptsBeforeDeactivation="2"
               path="/"
/>

Example 4.32. Monitor HTTPS Response: XML


#!highlight xml numbers=disable
<healthMonitor xmlns="http://docs.openstack.org/atlas/api/v1.1"
               type="HTTPS" delay="10" timeout="3"
               attemptsBeforeDeactivation="3"
               path="/healthcheck"
/>

Example 4.33. Monitor HTTPS Response: JSON


#!highlight javascript numbers=disable
{
   "type": "HTTPS",
   "delay": "10",
   "timeout": "3",
   "attemptsBeforeDeactivation": "3",
   "path": "/healthcheck"
}

If a load balancer has no health monitoring configuration, then the LB service will return an empty response when retrieving (GET request) a health monitoring configuration.

Sessions

Manage Session Persistence

Verb URI Description
GET /loadbalancers/loadBalancerId/sessionpersistence List session persistence configuration.
PUT /loadbalancers/loadBalancerId/sessionpersistence Enable session persistence.
DELETE /loadbalancers/loadBalancerId/sessionpersistence Disable session persistence.

Normal Response Code(s): 200, 202

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

Session persistence is a feature of the load balancing service which forces multiple requests from clients to be directed to the same node. This is common with many web applications that do not inherently share application state between back-end servers.

Table 4.5. Session Persistence Modes

Name
HTTP_COOKIE

Example 4.34. List Session Persistence Configuration Response: XML


#!highlight xml numbers=disable
<sessionPersistence xmlns="http://docs.openstack.org/atlas/api/v1.1"
                    persistenceType="HTTP_COOKIE" />

Example 4.35. List Session Persistence Configuration Response: JSON


#!highlight javascript numbers=disable
{
   "persistenceType":"HTTP_COOKIE"
}

Example 4.36. Set Session Persistence Type Request: XML


#!highlight xml numbers=disable
<sessionPersistence xmlns="http://docs.openstack.org/atlas/api/v1.1"
                    persistenceType="HTTP_COOKIE" />

Example 4.37. Set Session Persistence Type Request: JSON


#!highlight javascript numbers=disable
{
    "persistenceType":"HTTP_COOKIE"
}

Connections

Throttle Connections

Verb URI Description
GET /loadbalancers/loadBalancerId/connectionthrottle List connection throttling configuration.
PUT /loadbalancers/loadBalancerId/connectionthrottle Update throttling configuration.
DELETE /loadbalancers/loadBalancerId/connectionthrottle Remove connection throttling configurations.

Normal Response Code(s): 200, 202

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

The connection throttling feature imposes limits on the number of connections per client IP address to help mitigate malicious or abusive traffic to your applications. The following properties can be configured based on the traffic patterns for your sites.

  • maxRequestRate: Maximum number of HTTP requests (or TCP connections) allowed from a single IP address in the defined rateInterval. Setting a value of 0 allows an unlimited connection or request rate.
  • rateInterval: Frequency (in seconds) at which the maxRequestRate is assessed. For example, a maxRequestRate of 30 with a rateInterval of 60 would allow a maximum of 30 HTTP requests or TCP connections per minute from a single IP address. This attribute must have a value between 1 and 3600.


#!wiki caution
Note

When the rate is exceeded, the load balancer returns a serviceUnavailable (503) error to new requests for HTTP/HTTPS loadbalancers. For TCP loadbalancers, new connections are refused.

Example 4.42. List Connection Throttling Configuration Response: XML


#!highlight xml numbers=disable
<connectionThrottle xmlns="http://docs.openstack.org/atlas/api/v1.1"
                    maxRequestRate="50" rateInterval="60" />

Example 4.43. List Connection Throttling Configuration Response: JSON


#!highlight javascript numbers=disable
{
    "maxRequestRate": "50",
    "rateInterval": "60"
}

Example 4.44. Update Connection Throttling Configuration Request: XML


#!highlight xml numbers=disable
<connectionThrottle xmlns="http://docs.openstack.org/atlas/api/v1.1"
                    maxRequestRate="40" />

Example 4.45. Update Connection Throttling Configuration Request: JSON


#!highlight javascript numbers=disable
{
   "maxRequestRate": "40"
}

Protocols

List Load Balancing Protocols

Verb URI Description
GET /protocols List all supported load balancing protocols.

Normal Response Code(s): 200

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

This operation does not require a request body.

All load balancers must be configured with the protocol of the service which is being load balanced. The protocol selection should be based on the protocol of the back-end nodes. The current specification supports HTTP, HTTPS and TCP services.

When configuring an HTTP or HTTPS load balancer, the default port for the given protocol will be selected unless otherwise specified. For TCP load balancers, the port attribute must be provided.

Example 4.46. List Load Balancing Protocols Response: XML


#!highlight xml numbers=disable
<protocols xmlns="http://docs.openstack.org/atlas/api/v1.1">
     <protocol name="HTTP" port="80" />
     <protocol name="HTTPS" port="443" />
     <protocol name="TCP" port="*" />
</protocols>

Example 4.47. List Load Balancing Protocols Response: JSON


#!highlight javascript numbers=disable
{
 "protocols": [
               {
                 "name": "HTTP",
                 "port": "80"
               },
               {
                 "name": "HTTPS",
                 "port": "443"
               },
               {
                 "name": "TCP",
                 "port": "*"
               }
              ]
}

Algorithms

All load balancers utilize an algorithm that defines how traffic should be directed between back- end nodes. The default algorithm for newly created load balancers is ROUND_ROBIN, which can be overridden at creation time or changed after the load balancer has been initially provisioned.

The algorithm name is to be constant within a major revision of the load balancing API, though new algorithms may be created with a unique algorithm name within a given major revision of this API.

Table 4.6. Load Balancing Algorithms

Name
LEAST_CONNECTIONS
ROUND_ROBIN

List Load Balancing Algorithms

Verb URI Description
GET /algorithms List all supported load balancing algorithms.

Normal Response Code(s): 200

Error Response Code(s): loadbalancerFault (400, 500), serviceUnavailable (503), unauthorized (401), badRequest (400), overLimit (413)

This operation does not require a request body.

Example 4.48. List Load Balancing Algorithms Response: XML


#!highlight xml numbers=disable
<algorithms xmlns="http://docs.openstack.org/atlas/api/v1.1">
   <algorithm name="ROUND_ROBIN" />
   <algorithm name="LEAST_CONNECTIONS" />
</algorithms>

Example 4.49. List Load Balancing Algorithms Response: JSON


#!highlight javascript numbers=disable
{
   "algorithms": [
                  {
                    "name": "ROUND_ROBIN"
                  },
                  {
                    "name": "LEAST_CONNECTIONS"
                  }
                 ]
}

API Extensions

Implementations of this API specifications are free to augment this core API with extensions as they see appropriate (e.g. support for new LB algorithms or protocols).

All client applications written to this core specification however must be supported by extended implementations. Therefore, an application using this API should not receive payloads or values not specified in this specification nor should it need to specify extra information in requests not described in this specification.

For a detailed description of how to develop and use Extension APIs in OpenStack services, refer to OpenStack Compute API 1.1 documentation on the OpenStack website.