[[digitalocean-component]]
= DigitalOcean Component

*Since Camel 2.19*

// HEADER START
*Only producer is supported*
// HEADER END

The DigitalOcean component allows you to manage Droplets and resources within the DigitalOcean cloud with **Camel** by encapsulating https://www.digitalocean.com/community/projects/api-client-in-java[digitalocean-api-java]. All of the functionality that you are familiar with in the DigitalOcean control panel is also available through this Camel component.

== Prerequisites

You must have a valid DigitalOcean account and a valid OAuth token. You can generate an OAuth token by visiting the [Apps & API] section of the DigitalOcean control panel for your account.

== URI format

The **DigitalOcean Component** uses the following URI format:

```
digitalocean://endpoint?[options]
```
where `endpoint` is a DigitalOcean resource type.

Example : to list your droplets:

```
digitalocean://droplets?operation=list&oAuthToken=XXXXXX&page=1&perPage=10
```

The DigitalOcean component only supports producer endpoints so you cannot use this component at the beginning of a route to listen to messages in a channel.


== Options


// component options: START
The DigitalOcean component supports 3 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
|===
// component options: END

// endpoint options: START
The DigitalOcean endpoint is configured using URI syntax:

----
digitalocean:operation
----

with the following path and query parameters:

=== Path Parameters (1 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *operation* | The operation to perform to the given resource. |  | DigitalOceanOperations
|===


=== Query Parameters (12 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *page* (producer) | Use for pagination. Force the page number. | 1 | Integer
| *perPage* (producer) | Use for pagination. Set the number of item per request. The maximum number of results per page is 200. | 25 | Integer
| *resource* (producer) | *Required* The DigitalOcean resource type on which perform the operation. |  | DigitalOceanResources
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *digitalOceanClient* (advanced) | To use a existing configured DigitalOceanClient as client |  | DigitalOceanClient
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *httpProxyHost* (proxy) | Set a proxy host if needed |  | String
| *httpProxyPassword* (proxy) | Set a proxy password if needed |  | String
| *httpProxyPort* (proxy) | Set a proxy port if needed |  | Integer
| *httpProxyUser* (proxy) | Set a proxy host if needed |  | String
| *oAuthToken* (security) | DigitalOcean OAuth Token |  | String
|===
// endpoint options: END
// spring-boot-auto-configure options: START
== Spring Boot Auto-Configuration

When using Spring Boot make sure to use the following Maven dependency to have support for auto configuration:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel.springboot</groupId>
  <artifactId>camel-digitalocean-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>
----


The component supports 4 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.digitalocean.basic-property-binding* | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | Boolean
| *camel.component.digitalocean.bridge-error-handler* | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | Boolean
| *camel.component.digitalocean.enabled* | Whether to enable auto configuration of the digitalocean component. This is enabled by default. |  | Boolean
| *camel.component.digitalocean.lazy-start-producer* | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | Boolean
|===
// spring-boot-auto-configure options: END



You have to provide an **operation** value for each endpoint, with the `operation` URI option or the `CamelDigitalOceanOperation` message header.

All **operation** values are defined in `DigitalOceanOperations` enumeration.

All **header** names used by the component are defined in `DigitalOceanHeaders` enumeration.


== Message body result

All message bodies returned are using objects provided by the **digitalocean-api-java** library.


== API Rate Limits

DigitalOcean REST API encapsulated by camel-digitalocean component is subjected to API Rate Limiting. You can find the per method limits in the https://developers.digitalocean.com/documentation/v2/#rate-limit[API Rate Limits documentation].


== Account endpoint

[width="100%",cols="2,5,^1,2",options="header"]
|===
| operation | Description | Headers | Result
| `get` | get account info |  | `com.myjeeva.digitalocean.pojo.Account`
|===

== BlockStorages endpoint

[width="100%",cols="2,5,^5a,1",options="header"]
|===
| operation | Description | Headers | Result
| `list`
| list all of the Block Storage volumes available on your account
|
| `List<com.myjeeva.digitalocean.pojo.Volume>`

| `get`
| show information about a Block Storage volume
| `CamelDigitalOceanId` _Integer_
| `com.myjeeva.digitalocean.pojo.Volume`

| `get`
| show information about a Block Storage volume by name
| `CamelDigitalOceanName` _String_, +
  `CamelDigitalOceanRegion` _String_
| `com.myjeeva.digitalocean.pojo.Volume`

| `listSnapshots`
| retrieve the snapshots that have been created from a volume
| `CamelDigitalOceanId` _Integer_
| `List<com.myjeeva.digitalocean.pojo.Snapshot>`

| `create`
| create a new volume
| `CamelDigitalOceanVolumeSizeGigabytes` _Integer_, +
  `CamelDigitalOceanName` _String_, +
  `CamelDigitalOceanDescription`* _String_, +
  `CamelDigitalOceanRegion`* _String_
| `com.myjeeva.digitalocean.pojo.Volume`

| `delete`
| delete a Block Storage volume, destroying all data and removing it from your account
| `CamelDigitalOceanId`  _Integer_
| `com.myjeeva.digitalocean.pojo.Delete`

| `delete`
| delete a Block Storage volume by name
| `CamelDigitalOceanName` _String_, +
  `CamelDigitalOceanRegion` _String_
| `com.myjeeva.digitalocean.pojo.Delete`

| `attach`
| attach a Block Storage volume to a Droplet
| `CamelDigitalOceanId` _Integer_, +
  `CamelDigitalOceanDropletId` _Integer_, +
  `CamelDigitalOceanDropletRegion` _String_
| `com.myjeeva.digitalocean.pojo.Action`

| `attach`
| attach a Block Storage volume to a Droplet by name
| `CamelDigitalOceanName` _String_, +
  `CamelDigitalOceanDropletId` _Integer_, +
  `CamelDigitalOceanDropletRegion` _String_
| `com.myjeeva.digitalocean.pojo.Action`

| `detach`
| detach a Block Storage volume from a Droplet
| `CamelDigitalOceanId` _Integer_, +
  `CamelDigitalOceanDropletId` _Integer_, +
  `CamelDigitalOceanDropletRegion` _String_
| `com.myjeeva.digitalocean.pojo.Action`

| `attach`
| detach a Block Storage volume from a Droplet by name
| `CamelDigitalOceanName` _String_, +
  `CamelDigitalOceanDropletId` _Integer_, +
  `CamelDigitalOceanDropletRegion` _String_
| `com.myjeeva.digitalocean.pojo.Action`

| `resize`
| resize a Block Storage volume
| `CamelDigitalOceanVolumeSizeGigabytes` _Integer_, +
  `CamelDigitalOceanRegion` _String_
| `com.myjeeva.digitalocean.pojo.Action`

| `listActions`
| retrieve all actions that have been executed on a volume
| `CamelDigitalOceanId`  _Integer_
| `List<com.myjeeva.digitalocean.pojo.Action>`
|===

== Droplets endpoint

[width="100%",cols="2,5,^1,2",options="header"]
|===
| operation | Description | Headers | Result
| `list` | list all Droplets in your account |  | `List<com.myjeeva.digitalocean.pojo.Droplet>`
| `get` | show an individual droplet | `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Droplet`

| `create`
| create a new Droplet
| `CamelDigitalOceanName` _String_, +
  `CamelDigitalOceanDropletImage` _String_, +
  `CamelDigitalOceanRegion` _String_, +
  `CamelDigitalOceanDropletSize` _String_, +
  `CamelDigitalOceanDropletSSHKeys`* _List<String>_, +
  `CamelDigitalOceanDropletEnableBackups`* _Boolean_, +
  `CamelDigitalOceanDropletEnableIpv6`* _Boolean_, +
  `CamelDigitalOceanDropletEnablePrivateNetworking`* _Boolean_, +
  `CamelDigitalOceanDropletUserData`* _String_, +
  `CamelDigitalOceanDropletVolumes`* _List<String>_, +
  `CamelDigitalOceanDropletTags` _List<String>_
| `com.myjeeva.digitalocean.pojo.Droplet`

| `create`
| create multiple Droplets
| `CamelDigitalOceanNames` _List<String>_, +
  `CamelDigitalOceanDropletImage` _String_, +
  `CamelDigitalOceanRegion` _String_, +
  `CamelDigitalOceanDropletSize` _String_, +
  `CamelDigitalOceanDropletSSHKeys`* _List<String>_, +
  `CamelDigitalOceanDropletEnableBackups`* _Boolean_, +
  `CamelDigitalOceanDropletEnableIpv6`* _Boolean_, +
  `CamelDigitalOceanDropletEnablePrivateNetworking`* _Boolean_, +
  `CamelDigitalOceanDropletUserData`* _String_, +
  `CamelDigitalOceanDropletVolumes`* _List<String>_, +
  `CamelDigitalOceanDropletTags` _List<String>_
| `com.myjeeva.digitalocean.pojo.Droplet`

| `delete` | delete a Droplet, | `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Delete`
| `enableBackups` | enable backups on an existing Droplet | `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Action`
| `disableBackups` | disable backups on an existing Droplet | `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Action`
| `enableIpv6` | enable IPv6 networking on an existing Droplet | `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Action`
| `enablePrivateNetworking` | enable private networking on an existing Droplet | `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Action`
| `reboot` | reboot a Droplet | `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Action`
| `powerCycle` | power cycle a Droplet | `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Action`
| `shutdown` | shutdown a Droplet | `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Action`
| `powerOff` | power off a Droplet | `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Action`
| `powerOn` | power on a Droplet | `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Action`

| `restore`
| shutdown a Droplet
| `CamelDigitalOceanId` _Integer_, +
  `CamelDigitalOceanImageId` _Integer_
| `com.myjeeva.digitalocean.pojo.Action`

| `passwordReset` | reset the password for a Droplet | `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Action`

| `resize`
| resize a Droplet
| `CamelDigitalOceanId` _Integer_, +
  `CamelDigitalOceanDropletSize` _String_
| `com.myjeeva.digitalocean.pojo.Action`

| `rebuild`
| rebuild a Droplet
| `CamelDigitalOceanId` _Integer_, +
  `CamelDigitalOceanImageId` _Integer_
| `com.myjeeva.digitalocean.pojo.Action`

| `rename`
| rename a Droplet
| `CamelDigitalOceanId` _Integer_, +
  `CamelDigitalOceanName` _String_
| `com.myjeeva.digitalocean.pojo.Action`

| `changeKernel`
| change the kernel of a Droplet
| `CamelDigitalOceanId` _Integer_, +
  `CamelDigitalOceanKernelId` _Integer_
| `com.myjeeva.digitalocean.pojo.Action`

| `takeSnapshot`
| snapshot a Droplet
| `CamelDigitalOceanId` _Integer_, +
  `CamelDigitalOceanName`* _String_
| `com.myjeeva.digitalocean.pojo.Action`

| `tag`
| tag a Droplet
| `CamelDigitalOceanId` _Integer_, +
  `CamelDigitalOceanName` _String_
| `com.myjeeva.digitalocean.pojo.Response`

| `untag`
| untag a Droplet
| `CamelDigitalOceanId` _Integer_, +
  `CamelDigitalOceanName` _String_
| `com.myjeeva.digitalocean.pojo.Response`

| `listKernels` | retrieve a list of all kernels available to a Droplet | `CamelDigitalOceanId` _Integer_ | `List<com.myjeeva.digitalocean.pojo.Kernel>`
| `listSnapshots` | retrieve the snapshots that have been created from a Droplet | `CamelDigitalOceanId` _Integer_ | `List<com.myjeeva.digitalocean.pojo.Snapshot>`
| `listBackups` |  retrieve any backups associated with a Droplet | `CamelDigitalOceanId` _Integer_ | `List<com.myjeeva.digitalocean.pojo.Backup>`
| `listActions` |  retrieve all actions that have been executed on a Droplet | `CamelDigitalOceanId` _Integer_ | `List<com.myjeeva.digitalocean.pojo.Action>`
| `listNeighbors` |  retrieve a list of droplets that are running on the same physical server | `CamelDigitalOceanId` _Integer_ | `List<com.myjeeva.digitalocean.pojo.Droplet>`
| `listAllNeighbors` |  retrieve a list of any droplets that are running on the same physical hardware | | `List<com.myjeeva.digitalocean.pojo.Droplet>`
|===

== Images endpoint

[width="100%",cols="2,5,^1,2",options="header"]
|===
| operation | Description | Headers | Result
| `list` | list images available on your account | `CamelDigitalOceanType`* _DigitalOceanImageTypes_ | `List<com.myjeeva.digitalocean.pojo.Image>`
| `ownList` | retrieve only the private images of a user | | `List<com.myjeeva.digitalocean.pojo.Image>`
| `listActions` |  retrieve all actions that have been executed on a Image | `CamelDigitalOceanId` _Integer_ | `List<com.myjeeva.digitalocean.pojo.Action>`
| `get` | retrieve information about an image (public or private) by id| `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Image`
| `get` | retrieve information about an public image by slug| `CamelDigitalOceanDropletImage` _String_| `com.myjeeva.digitalocean.pojo.Image`

| `update`
| update an image
| `CamelDigitalOceanId` _Integer_, +
  `CamelDigitalOceanName` _String_
| `com.myjeeva.digitalocean.pojo.Image`

| `delete` | delete an image| `CamelDigitalOceanId` _Integer_ | `com.myjeeva.digitalocean.pojo.Delete`

| `transfer`
| transfer an image to another region
| `CamelDigitalOceanId` _Integer_, +
  `CamelDigitalOceanRegion` _String_
| `com.myjeeva.digitalocean.pojo.Action`

| `convert` | convert an image, for example, a backup to a snapshot| `CamelDigitalOceanId` _Integer_ | `com.myjeeva.digitalocean.pojo.Action`
|===

== Snapshots endpoint

[width="100%",cols="2,5,^1,2",options="header"]
|===
| operation | Description | Headers | Result
| `list` | list all of the snapshots available on your account | `CamelDigitalOceanType`* _DigitalOceanSnapshotTypes_ | `List<com.myjeeva.digitalocean.pojo.Snapshot>`
| `get` | retrieve information about a snapshot| `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Snapshot`
| `delete` | delete an snapshot| `CamelDigitalOceanId` _Integer_ | `com.myjeeva.digitalocean.pojo.Delete`
|===

== Keys endpoint

[width="100%",cols="2,5,^1,2",options="header"]
|===
| operation | Description | Headers | Result
| `list` |  list all of the keys in your account | | `List<com.myjeeva.digitalocean.pojo.Key>`
| `get` | retrieve information about a key by id| `CamelDigitalOceanId` _Integer_| `com.myjeeva.digitalocean.pojo.Key`
| `get` | retrieve information about a key by fingerprint| `CamelDigitalOceanKeyFingerprint` _String_| `com.myjeeva.digitalocean.pojo.Key`

| `update`
| update a key by id
| `CamelDigitalOceanId` _Integer_, +
  `CamelDigitalOceanName` _String_
| `com.myjeeva.digitalocean.pojo.Key`

| `update`
| update a key by fingerprint
| `CamelDigitalOceanKeyFingerprint` _String_, +
  `CamelDigitalOceanName` _String_
| `com.myjeeva.digitalocean.pojo.Key`

| `delete` | delete a key by id| `CamelDigitalOceanId` _Integer_ | `com.myjeeva.digitalocean.pojo.Delete`
| `delete` | delete a key by fingerprint| `CamelDigitalOceanKeyFingerprint` _String_ | `com.myjeeva.digitalocean.pojo.Delete`
|===

== Regions endpoint

[width="100%",cols="2,5,^1,2",options="header"]
|===
| operation | Description | Headers | Result
| `list` |  list all of the regions that are available | | `List<com.myjeeva.digitalocean.pojo.Region>`
|===

== Sizes endpoint

[width="100%",cols="2,5,^1,2",options="header"]
|===
| operation | Description | Headers | Result
| `list` |  list all of the sizes that are available | | `List<com.myjeeva.digitalocean.pojo.Size>`
|===

== Floating IPs endpoint

[width="100%",cols="2,5,^1,2",options="header"]
|===
| operation | Description | Headers | Result
| `list` |  list all of the Floating IPs available on your account | | `List<com.myjeeva.digitalocean.pojo.FloatingIP>`
| `create` |  create a new Floating IP assigned to a Droplet | `CamelDigitalOceanId` _Integer_ | `List<com.myjeeva.digitalocean.pojo.FloatingIP>`
| `create` |  create a new Floating IP assigned to a Region | `CamelDigitalOceanRegion` _String_ | `List<com.myjeeva.digitalocean.pojo.FloatingIP>`
| `get` | retrieve information about a Floating IP| `CamelDigitalOceanFloatingIPAddress` _String_| `com.myjeeva.digitalocean.pojo.Key`
| `delete` | delete a Floating IP and remove it from your account| `CamelDigitalOceanFloatingIPAddress` _String_| `com.myjeeva.digitalocean.pojo.Delete`

| `assign`
| assign a Floating IP to a Droplet
| `CamelDigitalOceanFloatingIPAddress` _String_, +
  `CamelDigitalOceanDropletId` _Integer_
| `com.myjeeva.digitalocean.pojo.Action`

| `unassign` | unassign a Floating IP | `CamelDigitalOceanFloatingIPAddress` _String_ | `com.myjeeva.digitalocean.pojo.Action`
| `listActions` |  retrieve all actions that have been executed on a Floating IP | `CamelDigitalOceanFloatingIPAddress` _String_ | `List<com.myjeeva.digitalocean.pojo.Action>`
|===

== Tags endpoint

[width="100%",cols="2,5,^4,2",options="header"]
|===
| operation | Description | Headers | Result
| `list` |  list all of your tags | | `List<com.myjeeva.digitalocean.pojo.Tag>`
| `create` |  create a Tag | `CamelDigitalOceanName` _String_ | `com.myjeeva.digitalocean.pojo.Tag`
| `get` |  retrieve an individual tag | `CamelDigitalOceanName` _String_ | `com.myjeeva.digitalocean.pojo.Tag`
| `delete` |  delete a tag | `CamelDigitalOceanName` _String_ | `com.myjeeva.digitalocean.pojo.Delete`

| `update`
|  update a tag
| `CamelDigitalOceanName` _String_, +
  `CamelDigitalOceanNewName` _String_
| `com.myjeeva.digitalocean.pojo.Tag`
|===

== Examples

Get your account info

```
from("direct:getAccountInfo")
    .setHeader(DigitalOceanConstants.OPERATION, constant(DigitalOceanOperations.get))
    .to("digitalocean:account?oAuthToken=XXXXXX")
```

Create a droplet

```
from("direct:createDroplet")
    .setHeader(DigitalOceanConstants.OPERATION, constant("create"))
    .setHeader(DigitalOceanHeaders.NAME, constant("myDroplet"))
    .setHeader(DigitalOceanHeaders.REGION, constant("fra1"))
    .setHeader(DigitalOceanHeaders.DROPLET_IMAGE, constant("ubuntu-14-04-x64"))
    .setHeader(DigitalOceanHeaders.DROPLET_SIZE, constant("512mb"))
    .to("digitalocean:droplet?oAuthToken=XXXXXX")
```

List all your droplets

```
from("direct:getDroplets")
    .setHeader(DigitalOceanConstants.OPERATION, constant("list"))
    .to("digitalocean:droplets?oAuthToken=XXXXXX")
```

Retrieve information for the Droplet (dropletId = 34772987)

```
from("direct:getDroplet")
    .setHeader(DigitalOceanConstants.OPERATION, constant("get"))
    .setHeader(DigitalOceanConstants.ID, 34772987)
    .to("digitalocean:droplet?oAuthToken=XXXXXX")
```

Shutdown  information for the Droplet (dropletId = 34772987)

```
from("direct:shutdown")
    .setHeader(DigitalOceanConstants.ID, 34772987)
    .to("digitalocean:droplet?operation=shutdown&oAuthToken=XXXXXX")
```
