We hope you find this tutorial helpful. In addition to guides like this one, we provide simple cloud infrastructure for developers. Learn more →

How To Use Droplet Tagging with the DigitalOcean API

PostedMarch 8, 2016 9.8k views API DigitalOcean Configuration Management

Introduction

The DigitalOcean API provides access to most of the features found in the DigitalOcean Control Panel, and offers a straightforward way to manipulate Droplets and other resources from the command line or your own code.

Droplet tagging is a new feature. The feature allows you to group and locate Droplets by applying tags, as well as initiate actions across all the Droplets with a specific tag.

Prerequisites

This guide uses the curl utility and Bash for all examples. It assumes that you are familiar with the use of the DigitalOcean API, and have already generated a personal access token. For details on this process, and the basics of API usage, see How To Use the DigitalOcean API v2.

Once you have a token, begin by setting the $TOKEN variable in your shell. The export command ensures that child processes can read the variable:

  • export TOKEN=your_personal_access_token

We'll use $TOKEN for the rest of the examples in this document, always inside a double-quoted string so that its value, rather than the literal string $TOKEN, will be interpolated. If you receive errors, first make certain that this value is correctly set in your current shell.

Creating, Listing, and Viewing Tags

Tags can either be created before they are applied to resources or created and applied during resource creation.

Creating Tags Independently

Use curl to send a POST to the API endpoint, including headers for the Content-Type, your personal access token, and some JSON data to specify the tag name. Substitute your desired tag name for tag_name:

curl -X POST \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
-d '{"name":"tag_name"}' \
"https://api.digitalocean.com/v2/tags"
Output
{"tag":{"name":"tag_name","resources":{"droplets":{"count":0,"last_tagged":null}}}}

Note: This request, like any other request that makes a change to your account, requires that your token has "write" scope assigned to it.

Creating and Applying Tags When Creating Other Resources

Resources can also include a tags attribute on creation. This is an array of tag names that will be applied upon creation. Tags that do not already exist will be created to satisfy the request. The only supported resource at the time of this writing is a Droplet, but eventually others will be available.

To create a Droplet and apply tags upon creation, you could type:

curl -X POST \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
-d '{"name":"example.com","region":"nyc3","size":"512mb","image":"ubuntu-14-04-x64","tags":["tag_name","another_tag"]}' \
"https://api.digitalocean.com/v2/droplets"

This will create a new Droplet with the tags tag_name and another_tag applied. If the example in the previous section was executed, then this command would apply the existing tag_name tag and create and apply the another_tag tag to the Droplet.

Listing Existing Tags

You can list all of your current tags with a GET request to /v2/tags:

curl -X GET \
-H "Authorization: Bearer $TOKEN" \
"https://api.digitalocean.com/v2/tags"
Output
{"tags":[{"name":"tag_name","resources":{"droplets":{"count":0,"last_tagged":null}}}],"links":{},"meta":{"total":1}}

To view an individual tag, use a GET request to /v2/tags/tag_name:

curl -X GET \
-H "Authorization: Bearer $TOKEN" \
"https://api.digitalocean.com/v2/tags/tag_name"
Output
{"tag":{"name":"tag_name","resources":{"droplets":{"count":0,"last_tagged":null}}}}

The example output above is brief. Notice that the resources.droplets.last_tagged property is null. Once you associate a tag with one or more Droplets, this property will contain detailed information about the last-tagged Droplet.

Tagging and Untagging Droplets

Tags can also be applied to existing resources. The only supported resource at the time of this writing is a Droplet, but eventually others will be available.

Droplets are associated to tags using their id attribute. You can retrieve a JSON object containing a droplets array listing all of your Droplets with a GET request to /v2/droplets:

curl -X GET \
-H "Authorization: Bearer $TOKEN" \
"https://api.digitalocean.com/v2/droplets"

Once you know a Droplet's id, you can associate it with a tag by POSTing to /v2/tags/tag_name/resources, including JSON data which sets resource_id to the Droplet id and resource_type to the string droplet:

curl -X POST \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
-d '{"resources":[{"resource_id":droplet_id,"resource_type":"droplet"}]}' \
"https://api.digitalocean.com/v2/tags/tag_name/resources" 

Try a GET request for the tag again, and the resources.droplets.last_tagged property should contain detailed information on the Droplet you just tagged:

curl -X GET \
-H "Authorization: Bearer $TOKEN" \
"https://api.digitalocean.com/v2/tags/tag_name"

To remove a tag from a specific Droplet, you can issue a DELETE request to /v2/tags/tag_name/resources/, with the same data you used to tag the Droplet in the first place:

curl -X DELETE \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
-d '{"resources":[{"resource_id":droplet_id,"resource_type":"droplet"}]}' \
"https://api.digitalocean.com/v2/tags/tag_name/resources" 

This will remove the tag from the resource.

Finding Droplets by Tag

To find all Droplets associated with a particular tag, issue a GET request to /v2/droplets?tag_name=tag_name:

curl -X GET \
-H "Authorization: Bearer $TOKEN" \
"https://api.digitalocean.com/v2/droplets?tag_name=tag_name"

This will filter your Droplets by the requested tag.

Performing Actions on Tagged Droplets

You can perform a number of actions on all the Droplets associated with a specific tag:

Data Notes
{"type":"power_cycle"} Turn Droplets off and back on again.
{"type":"power_on"} Power Droplets on. Must be off.
{"type":"power_off"} Power Droplets off. Must be on.
{"type":"shutdown"} Shutdown Droplets, similar to powering down from the command line.
{"type":"enable_private_networking"} Enable private networking.
{"type":"enable_ipv6"} Enable IPv6 addresses for Droplets.
{"type":"enable_backups"} Enable backups for Droplets.
{"type":"disable_backups"} Disable backups.
{"type":"snapshot, "name": "snapshot_name"} Take snapshots of Droplets. Droplets must be powered off first, and a name is mandatory.

In order to perform an action, send a POST to /v2/droplets/actions?tag_name=tag_name with JSON data specifying a type and any additional values required by the action:

curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"type":"action_type"}' \
"https://api.digitalocean.com/v2/droplets/actions?tag_name=tag_name"

You can retrieve a history of recent actions, including their completion status, with a GET request to /v2/actions:

curl -X GET \
-H "Authorization: Bearer $TOKEN" \
"https://api.digitalocean.com/v2/actions"

This is a useful way to determine whether actions have completed or are still in-progress.

Example: Snapshotting Tagged Droplets

Suppose that you have a collection of Droplets associated with a tag named fileserver, and you want to snapshot all of them.

First issue a shutdown action:

curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"type":"shutdown"}' \
"https://api.digitalocean.com/v2/droplets/actions?tag_name=fileserver"

Wait for the shutdown to finish on all Droplets, and issue a snapshot action, including a name value for the snapshot:

curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"type":"snapshot", "name":"snapshot_name"}' \
"https://api.digitalocean.com/v2/droplets/actions?tag_name=fileserver"

Bear in mind that snapshots may take an hour or more to complete, depending on the size of the Droplet. Once the snapshots have finished, you can bring the Droplets back online with a power_on action:

curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"type":"power_on"}' \
"https://api.digitalocean.com/v2/droplets/actions?tag_name=fileserver"

This will start the Droplet again.

Deleting Tags

You can delete a tag itself, and remove its association to all resources, with a DELETE request to /v2/tags/tag_name:

curl -X DELETE \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
"https://api.digitalocean.com/v2/tags/tag_name"

The tag will be completely removed.

Conclusion

Tagging is a simple abstraction, but in combination with basic scripting tools, it can offer a powerful mechanism for inventorying and managing your systems.

From here, you may wish to dig deeper into the detailed DigitalOcean API documentation, or investigate libraries which wrap the API for popular programming languages.

6 Comments

Creative Commons License