Skip to content

AKJUS/godo

This branch is up to date with digitalocean/godo:main.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

be2145b · Mar 27, 2025
Mar 21, 2025
Nov 1, 2021
Nov 15, 2022
Feb 14, 2017
Jun 29, 2020
Jul 26, 2021
Jul 16, 2020
Mar 27, 2025
Oct 11, 2023
Jan 3, 2016
Aug 14, 2023
Jul 18, 2023
Jul 18, 2023
Nov 1, 2021
Dec 12, 2019
Mar 18, 2025
Dec 17, 2024
Jan 20, 2025
Jan 20, 2025
Dec 17, 2024
Jun 29, 2022
Dec 11, 2019
Jun 29, 2022
Nov 14, 2022
Dec 12, 2019
Dec 12, 2019
Feb 28, 2024
Feb 28, 2024
Jan 28, 2025
Jan 28, 2025
Oct 7, 2021
Nov 1, 2021
Nov 1, 2021
Nov 5, 2024
Nov 5, 2024
Oct 23, 2024
Oct 23, 2024
Nov 5, 2024
Nov 5, 2024
Sep 25, 2015
Sep 25, 2015
Jul 26, 2021
May 12, 2021
Sep 16, 2022
Jul 26, 2021
Jun 15, 2022
Sep 16, 2022
Nov 29, 2022
Nov 29, 2022
Mar 21, 2025
Sep 10, 2024
Mar 27, 2025
Aug 17, 2023
Nov 15, 2022
Jul 2, 2017
Jul 26, 2021
Nov 13, 2020
Jul 26, 2021
Jul 21, 2020
Dec 12, 2022
Dec 12, 2019
Mar 17, 2025
Mar 17, 2025
Dec 3, 2021
Oct 20, 2023
Feb 13, 2025
Feb 13, 2025
Dec 10, 2019
Oct 23, 2024
Oct 23, 2024
Mar 27, 2025
Mar 27, 2025
Jul 26, 2021
Oct 23, 2023
Jul 26, 2021
Dec 12, 2019
Nov 1, 2024
Nov 1, 2024
Sep 16, 2022
Jun 15, 2022
Jun 15, 2022
Sep 16, 2022
Nov 27, 2024
Nov 22, 2024
Nov 22, 2024
Nov 27, 2024
Oct 25, 2024
Oct 25, 2024
Mar 20, 2025
Mar 20, 2025
Mar 14, 2025
Mar 14, 2025
Jul 26, 2021
Nov 1, 2021
Dec 12, 2019
Dec 10, 2019
Nov 6, 2024
Nov 6, 2024
Sep 20, 2022
Oct 6, 2020
Jul 16, 2015
Dec 21, 2016
Oct 10, 2023
Oct 23, 2023
May 15, 2024
May 15, 2024
May 15, 2024
Nov 14, 2022

Repository files navigation

Godo

GitHub Actions CI GoDoc

Godo is a Go client library for accessing the DigitalOcean V2 API.

You can view the client API docs here: http://godoc.org/github.com/digitalocean/godo

You can view DigitalOcean API docs here: https://docs.digitalocean.com/reference/api/api-reference/

Install

go get github.com/digitalocean/godo@vX.Y.Z

where X.Y.Z is the version you need.

or

go get github.com/digitalocean/godo

for non Go modules usage or latest version.

Usage

import "github.com/digitalocean/godo"

Create a new DigitalOcean client, then use the exposed services to access different parts of the DigitalOcean API.

Authentication

Currently, Personal Access Token (PAT) is the only method of authenticating with the API. You can manage your tokens at the DigitalOcean Control Panel Applications Page.

You can then use your token to create a new client:

package main

import (
    "github.com/digitalocean/godo"
)

func main() {
    client := godo.NewFromToken("my-digitalocean-api-token")
}

If you need to provide a context.Context to your new client, you should use godo.NewClient to manually construct a client instead.

Examples

To create a new Droplet:

dropletName := "super-cool-droplet"

createRequest := &godo.DropletCreateRequest{
    Name:   dropletName,
    Region: "nyc3",
    Size:   "s-1vcpu-1gb",
    Image: godo.DropletCreateImage{
        Slug: "ubuntu-20-04-x64",
    },
}

ctx := context.TODO()

newDroplet, _, err := client.Droplets.Create(ctx, createRequest)

if err != nil {
    fmt.Printf("Something bad happened: %s\n\n", err)
    return err
}

Pagination

If a list of items is paginated by the API, you must request pages individually. For example, to fetch all Droplets:

func DropletList(ctx context.Context, client *godo.Client) ([]godo.Droplet, error) {
    // create a list to hold our droplets
    list := []godo.Droplet{}

    // create options. initially, these will be blank
    opt := &godo.ListOptions{}
    for {
        droplets, resp, err := client.Droplets.List(ctx, opt)
        if err != nil {
            return nil, err
        }

        // append the current page's droplets to our list
        list = append(list, droplets...)

        // if we are at the last page, break out the for loop
        if resp.Links == nil || resp.Links.IsLastPage() {
            break
        }

        page, err := resp.Links.CurrentPage()
        if err != nil {
            return nil, err
        }

        // set the page we want for the next request
        opt.Page = page + 1
    }

    return list, nil
}

Some endpoints offer token based pagination. For example, to fetch all Registry Repositories:

func ListRepositoriesV2(ctx context.Context, client *godo.Client, registryName string) ([]*godo.RepositoryV2, error) {
    // create a list to hold our registries
    list := []*godo.RepositoryV2{}

    // create options. initially, these will be blank
    opt := &godo.TokenListOptions{}
    for {
        repositories, resp, err := client.Registry.ListRepositoriesV2(ctx, registryName, opt)
        if err != nil {
            return nil, err
        }

        // append the current page's registries to our list
        list = append(list, repositories...)

        // if we are at the last page, break out the for loop
        if resp.Links == nil || resp.Links.IsLastPage() {
            break
        }

        // grab the next page token
        nextPageToken, err := resp.Links.NextPageToken()
        if err != nil {
            return nil, err
        }

        // provide the next page token for the next request
        opt.Token = nextPageToken
    }

    return list, nil
}

Automatic Retries and Exponential Backoff

The Godo client can be configured to use automatic retries and exponentional backoff for requests that fail with 429 or 500-level response codes via go-retryablehttp. To configure Godo to enable usage of go-retryablehttp, the RetryConfig.RetryMax must be set.

tokenSrc := oauth2.StaticTokenSource(&oauth2.Token{
    AccessToken: "dop_v1_xxxxxx",
})

oauth_client := oauth2.NewClient(oauth2.NoContext, tokenSrc)

waitMax := godo.PtrTo(6.0)
waitMin := godo.PtrTo(3.0)

retryConfig := godo.RetryConfig{
    RetryMax:     3,
    RetryWaitMin: waitMin,
    RetryWaitMax: waitMax,
}

client, err := godo.New(oauth_client, godo.WithRetryAndBackoffs(retryConfig))

Please refer to the RetryConfig Godo documentation for more information.

Versioning

Each version of the client is tagged and the version is updated accordingly.

To see the list of past versions, run git tag.

Documentation

For a comprehensive list of examples, check out the API documentation.

For details on all the functionality in this library, see the GoDoc documentation.

Contributing

We love pull requests! Please see the contribution guidelines.

Releases

No releases published

Packages

No packages published

Languages

  • Go 100.0%