Setting Up the Environment
- Ensure you have Go installed on your machine. Check your version with
go version
.
- Fetch the DigitalOcean Go API client package by running the following command in your terminal:
go get -u github.com/digitalocean/godo
Authentication with the DigitalOcean API
- To interact with the API, you need an access token. Create a function to load this token, making sure it's stored securely or fetched from environment variables:
package main
import (
"context"
"os"
"github.com/digitalocean/godo"
"golang.org/x/oauth2"
)
func main() {
tokenSource := oauth2.StaticTokenSource(
&oauth2.Token{AccessToken: os.Getenv("DIGITALOCEAN_ACCESS_TOKEN")},
)
oauthClient := oauth2.NewClient(context.Background(), tokenSource)
client := godo.NewClient(oauthClient)
// Your code to manage servers goes here
}
Listing All Droplets
- Start by listing all your current droplets with the client created. This can provide a quick overview of your currently managed servers:
func listDroplets(client *godo.Client) {
opt := &godo.ListOptions{}
for {
droplets, resp, err := client.Droplets.List(context.Background(), opt)
if err != nil {
panic(err)
}
for _, d := range droplets {
println("Droplet Name:", d.Name)
println("Droplet ID:", d.ID)
}
if resp.Links == nil || resp.Links.IsLastPage() {
break
}
page, err := resp.Links.CurrentPage()
if err != nil {
panic(err)
}
opt.Page = page + 1
}
}
Creating a New Droplet
- Create new droplets with specific configurations. Use the DigitalOcean API to clearly define the droplet settings:
func createDroplet(client *godo.Client) {
createRequest := &godo.DropletCreateRequest{
Name: "example-droplet",
Region: "nyc3",
Size: "s-1vcpu-1gb",
Image: godo.DropletCreateImage{
Slug: "ubuntu-20-04-x64",
},
SSHKeys: []godo.DropletCreateSSHKey{},
}
ctx := context.TODO()
newDroplet, _, err := client.Droplets.Create(ctx, createRequest)
if err != nil {
panic(err)
}
println("Droplet created with ID:", newDroplet.ID)
}
Deleting a Droplet
- For account and resource management, it's crucial to delete unused droplets. Use the following code to delete a droplet using its ID:
func deleteDroplet(client *godo.Client, dropletID int) {
_, err := client.Droplets.Delete(context.Background(), dropletID)
if err != nil {
panic(err)
}
println("Deleted droplet with ID:", dropletID)
}
Handling Errors and Debugging
- Wrap the API calls with necessary error handling to catch issues such as network problems or authentication errors. Consider logging errors instead of panicking in a production environment:
package main
import (
"fmt"
"log"
"os"
"context"
"github.com/digitalocean/godo"
"golang.org/x/oauth2"
)
func main() {
tokenSource := oauth2.StaticTokenSource(
&oauth2.Token{AccessToken: os.Getenv("DIGITALOCEAN_ACCESS_TOKEN")},
)
oauthClient := oauth2.NewClient(context.Background(), tokenSource)
client := godo.NewClient(oauthClient)
err := performOperations(client)
if err != nil {
log.Fatal(err)
}
}
func performOperations(client *godo.Client) error {
dropletID := 123456 // Replace with actual droplet ID
err := deleteDroplet(client, dropletID)
if err != nil {
return fmt.Errorf("failed to delete droplet: %w", err)
}
return nil
}
Conclusion and Further Enhancements
- You can extend this basic structure to include more sophisticated server management logic, like automated scaling, monitoring, and resource allocation. Consider integrating DigitalOcean Spaces or other API features for more robust applications.
- Additionally, employ libraries such as
cobra
to build command-line applications, enhancing user interaction for managing droplets.