[[digitalocean-component]]
= DigitalOcean Component
:page-source: components/camel-digitalocean/src/main/docs/digitalocean-component.adoc

*Available as of Camel version 2.19*

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 1 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
|===
// 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</groupId>
  <artifactId>camel-digitalocean-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>
----


The component supports 2 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.enabled* | Enable digitalocean component | true | 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")
```
