# Nodes

## Setup

In order to interact with this feature you must first retrieve a particular load balancer, like so:

    $loadBalancer = $service->loadBalancer('{id}');

## List Nodes

You can list the nodes attached to a load balancer:

    $nodes = $loadBalancer->nodeList();

    foreach ($nodes as $node) {
        /** @var $node OpenCloud\LoadBalancer\Resource\Node **/
    }

## Add Nodes

You can attach additional nodes to a load balancer. Assume `$loadBalancer` already has two nodes attached to it - `$serverOne` and `$serverTwo` - and you want to attach a third node to it, say `$serverThree`, which provides a service on port 8080.

Important: Remember to call `$loadBalancer->addNodes()` after all the calls to `$loadBalancer->addNode()` as shown below.

    $address = $serverThree->addresses->private[0]->addr;
    $loadBalancer->addNode($address, 8080);
    $loadBalancer->addNodes();

The signature for `addNodes` is as follows:

`addNodes`($address, $port[, $condition = 'ENABLED'[, $type = null[, $weight = null]]])

  Add a node to a load balancer

  Parameters:

  - $address (string) – the IP address of the node
  - $port (integer) – the port number of the node
  - $condition (string) – the initial condition of the code. Defaults to `ENABLED`
  - $type (string) – either `PRIMARY` or `SECONDARY`
  - $weight (integer) – the node weight (for round-robin algorithm)

The `addNode` method accepts three more optional parameters, in addition to the two shown above:

## Modify Nodes

You can modify one or more of the following node attributes:

- `condition`: The condition of the load balancer:
  - `ENABLED` – Node is ready to receive traffic from the load balancer.
  - `DISABLED` – Node should not receive traffic from the load balancer.
  - `DRAINING` – Node should process any traffic it is already receiving but should not receive any further traffic from the load balancer.
- `type`: The type of the node:
  - `PRIMARY` – Nodes defined as PRIMARY are in the normal rotation to receive traffic from the load balancer.
  - `SECONDARY` – Nodes defined as SECONDARY are only in the rotation to receive traffic from the load balancer when all the primary nodes fail.
- `weight`: The weight, between 1 and 100, given to node when distributing traffic using either the `WEIGHTED_ROUND_ROBIN` or the `WEIGHTED_LEAST_CONNECTIONS` load balancing algorithm.

    use OpenCloud\LoadBalancer\Enum\NodeCondition;
    use OpenCloud\LoadBalancer\Enum\NodeType;

    $node->update(array(
        'condition' => NodeCondition::DISABLED,
        'type'      => NodeType::SECONDARY
    ));

## Remove Nodes

There are two ways to remove a node. The first way is on an `OpenCloud\LoadBalancer\Resource\Node` instance, like so:

    $node->delete();

The second is with an `OpenCloud\LoadBalancer\Resource\LoadBalancer` instance and the node’s ID, like so:

    $loadBalancer->removeNode('{nodeId}');

where ‘{nodeId}’ is the integer ID of the node itself - this is a required value.

## View Node Service Events

You can view events associated with the activity between a node and a load balancer:

    $nodeEvents = $loadBalancer->nodeEventList();

    foreach ($nodeEvents as $nodeEvent) {
        /** @var $nodeEvent OpenCloud\LoadBalancer\Resource\NodeEvent **/
    }