summaryrefslogtreecommitdiff
path: root/digitalocean/create.go
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2023-12-31 02:50:20 -0600
committerJeff Carr <[email protected]>2023-12-31 02:50:20 -0600
commitd2f0691744ff677a3d044cad72c1c35d32f85d92 (patch)
tree17d7c6e9b5dd16bc76b8c9ad62bcd0c2045ad1cb /digitalocean/create.go
parent44730e1b91d0aa9d412032aebe2fc0c8367ddf13 (diff)
create takes a name. delete() droplet works
Signed-off-by: Jeff Carr <[email protected]>
Diffstat (limited to 'digitalocean/create.go')
-rw-r--r--digitalocean/create.go161
1 files changed, 161 insertions, 0 deletions
diff --git a/digitalocean/create.go b/digitalocean/create.go
new file mode 100644
index 0000000..03bcf57
--- /dev/null
+++ b/digitalocean/create.go
@@ -0,0 +1,161 @@
+package digitalocean
+
+import (
+ "context"
+ "golang.org/x/oauth2"
+ "github.com/digitalocean/godo"
+
+ "go.wit.com/log"
+ "go.wit.com/gui/gadgets"
+ // "go.wit.com/gui"
+)
+
+/*
+// createDroplet creates a new droplet in the specified region with the given name.
+func createDroplet(token, name, region, size, image string) (*godo.Droplet, error) {
+ // Create an OAuth2 token.
+ tokenSource := &oauth2.Token{
+ AccessToken: token,
+ }
+
+ // Create an OAuth2 client.
+ oauthClient := oauth2.NewClient(context.Background(), tokenSource)
+
+ // Create a DigitalOcean client with the OAuth2 client.
+ client := godo.NewClient(oauthClient)
+
+ // Define the create request.
+ createRequest := &godo.DropletCreateRequest{
+ Name: name,
+ Region: region,
+ Size: size,
+ Image: godo.DropletCreateImage{
+ Slug: image,
+ },
+ }
+
+ // Create the droplet.
+ ctx := context.TODO()
+ newDroplet, _, err := client.Droplets.Create(ctx, createRequest)
+ if err != nil {
+ return nil, err
+ }
+
+ return newDroplet, nil
+}
+*/
+
+func (d *DigitalOcean) Create(name string) {
+ region := "nyc1" // New York City region.
+ size := "s-1vcpu-1gb" // Size of the droplet.
+ image := "ubuntu-20-04-x64" // Image slug for Ubuntu 20.04 (LTS) x64.
+
+ // Create a new droplet.
+ droplet, err := d.createDropletNew(name, region, size, image)
+ if err != nil {
+ log.Fatalf("Something went wrong: %s\n", err)
+ }
+
+ log.Printf("Created droplet ID %d with name %s\n", droplet.ID, droplet.Name)
+}
+
+// createDroplet creates a new droplet in the specified region with the given name.
+func (d *DigitalOcean) createDropletNew(name, region, size, image string) (*godo.Droplet, error) {
+ // Create an OAuth2 token.
+ tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: d.token})
+
+ // Create an OAuth2 client.
+ oauthClient := oauth2.NewClient(context.Background(), tokenSource)
+
+ // Create a DigitalOcean client with the OAuth2 client.
+ client := godo.NewClient(oauthClient)
+
+ var sshKeys []godo.DropletCreateSSHKey
+
+ // Find the key by name.
+ for i, key := range d.sshKeys {
+ log.Info("found ssh i =", i, key.Name)
+ log.Verbose("found ssh key.Name =", key.Name)
+ log.Verbose("found ssh key.Fingerprint =", key.Fingerprint)
+ log.Verbose("found ssh key:", key)
+ /*
+ sshKeys = []godo.DropletCreateSSHKey{
+ {ID: key.ID},
+ }
+ */
+ sshKeys = append(sshKeys, godo.DropletCreateSSHKey{ID: key.ID})
+ }
+
+ // Define the create request.
+ createRequest := &godo.DropletCreateRequest{
+ Name: name,
+ Region: region,
+ Size: size,
+ Image: godo.DropletCreateImage{
+ Slug: image,
+ },
+ IPv6: true, // Enable IPv6
+ SSHKeys: sshKeys, // Add SSH key IDs here
+ }
+
+ // Create the droplet.
+ ctx := context.TODO()
+ newDroplet, _, err := client.Droplets.Create(ctx, createRequest)
+ if err != nil {
+ return nil, err
+ }
+
+ return newDroplet, nil
+}
+
+var myCreate *windowCreate
+
+// This is initializes the main DO object
+// You can only have one of these
+func InitCreateWindow() *windowCreate {
+ if ! myDo.Ready() {return nil}
+ if myCreate != nil {return myCreate}
+ myCreate = new(windowCreate)
+ myCreate.ready = false
+
+ myCreate.window = myDo.parent.NewWindow("Create Droplet")
+
+ // make a group label and a grid
+ myCreate.group = myCreate.window.NewGroup("droplets:").Pad()
+ myCreate.grid = myCreate.group.NewGrid("grid", 2, 1).Pad()
+
+ myCreate.name = gadgets.NewBasicEntry(myCreate.grid, "Name").Set("test.wit.com")
+
+ myCreate.grid.NewLabel("makes a new droplet")
+ myCreate.grid.NewButton("Create", func () {
+ myDo.Create(myCreate.name.Get())
+ })
+
+ myCreate.ready = true
+ myDo.create = myCreate
+ return myCreate
+}
+
+// Returns true if the status is valid
+func (d *windowCreate) Ready() bool {
+ if d == nil {return false}
+ return d.ready
+}
+
+func (d *windowCreate) Show() {
+ if ! d.Ready() {return}
+ log.Info("digitalocean.Show() window")
+ if d.hidden {
+ d.window.Show()
+ }
+ d.hidden = false
+}
+
+func (d *windowCreate) Hide() {
+ if ! d.Ready() {return}
+ log.Info("digitalocean.Hide() window")
+ if ! d.hidden {
+ d.window.Hide()
+ }
+ d.hidden = true
+}