From 44730e1b91d0aa9d412032aebe2fc0c8367ddf13 Mon Sep 17 00:00:00 2001
From: Jeff Carr <jcarr@wit.com>
Date: Sat, 30 Dec 2023 23:30:14 -0600
Subject: [PATCH] digitalocean droplet power on & off work

Signed-off-by: Jeff Carr <jcarr@wit.com>
---
 digitalocean/droplet.go                      |  3 ++
 digitalocean/listKeys.go                     | 25 +++++++----
 digitalocean/main.go                         | 23 +++++-----
 digitalocean/poweron.go                      | 45 ++++++++++++++++++++
 digitalocean/structs.go                      |  2 +
 examples/control-panel-digitalocean/Makefile |  2 +-
 6 files changed, 80 insertions(+), 20 deletions(-)
 create mode 100644 digitalocean/poweron.go

diff --git a/digitalocean/droplet.go b/digitalocean/droplet.go
index 45deb3d..6c0da08 100644
--- a/digitalocean/droplet.go
+++ b/digitalocean/droplet.go
@@ -20,6 +20,7 @@ func (d *DigitalOcean) NewDroplet(dd *godo.Droplet) *Droplet {
 	droplet := new(Droplet)
 	droplet.ready = false
 	droplet.poll = dd // the information polled from the digital ocean API
+	droplet.ID = dd.ID
 
 	if (d.dGrid == nil) {
 		d.dGrid = d.group.NewGrid("grid", 9, 1).Pad()
@@ -104,11 +105,13 @@ func (d *Droplet) Update(dpoll *godo.Droplet) {
 func (d *Droplet) PowerOn() {
 	if ! d.Exists() {return}
 	log.Info("droplet.PowerOn() should do it here")
+	myDo.PowerOn(d.ID)
 }
 
 func (d *Droplet) PowerOff() {
 	if ! d.Exists() {return}
 	log.Info("droplet.PowerOff() here")
+	myDo.PowerOff(d.ID)
 }
 
 func (d *Droplet) Destroy() {
diff --git a/digitalocean/listKeys.go b/digitalocean/listKeys.go
index 000a66d..97c82bb 100644
--- a/digitalocean/listKeys.go
+++ b/digitalocean/listKeys.go
@@ -2,30 +2,37 @@ package digitalocean
 
 import (
 	"context"
-	"fmt"
 
 	"golang.org/x/oauth2"
 
 	"github.com/digitalocean/godo"
+
+	"go.wit.com/log"
 )
 
-func GetSSHKeyID(token, name string) (string, error) {
-	tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token})
+// func (d *DigitalOcean) ListDroplets() bool {
+func (d *DigitalOcean) ListSSHKeyID() error {
+	tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: d.token})
 	oauthClient := oauth2.NewClient(context.Background(), tokenSource)
 	client := godo.NewClient(oauthClient)
 
 	// List all keys.
 	keys, _, err := client.Keys.List(context.Background(), &godo.ListOptions{})
 	if err != nil {
-		return "", err
+		return err
 	}
 
 	// Find the key by name.
-	for _, key := range keys {
-		if key.Name == name {
-			return key.Fingerprint, nil
-		}
+	for i, key := range keys {
+		log.Info("found ssh i =", i)
+		log.Info("found ssh key.Name =", key.Name)
+		log.Info("found ssh key.Fingerprint =", key.Fingerprint)
+		log.Info("found ssh key:", key)
+	//	if key.Name == name {
+	//		return key.Fingerprint, nil
+	//	}
 	}
 
-	return "", fmt.Errorf("SSH Key not found")
+	// return fmt.Errorf("SSH Key not found")
+	return nil
 }
diff --git a/digitalocean/main.go b/digitalocean/main.go
index de96521..5c40498 100644
--- a/digitalocean/main.go
+++ b/digitalocean/main.go
@@ -58,18 +58,21 @@ func (d *DigitalOcean) Hide() {
 
 func (d *DigitalOcean) Update() bool {
 	if ! d.Ready() {return false}
-	if ! d.ListDroplets() {
+	d.ListSSHKeyID()
+	if d.ListDroplets() {
+		for _, droplet := range d.dpolled {
+			// check if the droplet ID already exists
+			if (d.dropMap[droplet.ID] == nil) {
+				d.dropMap[droplet.ID] = d.NewDroplet(&droplet)
+			} else {
+				log.Info("droplet.Update()", droplet.ID, droplet.Name, "already exists")
+				d.dropMap[droplet.ID].Update(&droplet)
+				continue
+			}
+		}
+	} else {
 		log.Error(d.err, "Error listing droplets")
 		return false
 	}
-	for _, droplet := range d.dpolled {
-		// check if the droplet ID already exists
-		if (d.dropMap[droplet.ID] != nil) {
-			log.Info("droplet.Update()", droplet.ID, droplet.Name, "already exists")
-			d.dropMap[droplet.ID].Update(&droplet)
-			continue
-		}
-		d.dropMap[droplet.ID] = d.NewDroplet(&droplet)
-	}
 	return true
 }
diff --git a/digitalocean/poweron.go b/digitalocean/poweron.go
new file mode 100644
index 0000000..d897f6a
--- /dev/null
+++ b/digitalocean/poweron.go
@@ -0,0 +1,45 @@
+package digitalocean
+
+import (
+	"context"
+
+	"golang.org/x/oauth2"
+
+	"github.com/digitalocean/godo"
+
+	"go.wit.com/log"
+)
+
+func (d *DigitalOcean) PowerOn(dropletID int) error {
+	tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: d.token})
+	oauthClient := oauth2.NewClient(context.Background(), tokenSource)
+	client := godo.NewClient(oauthClient)
+
+	ctx := context.TODO()
+
+	// Create a request to power on the droplet.
+	_, _, err := client.DropletActions.PowerOn(ctx, dropletID)
+	if err != nil {
+		return err
+	}
+
+	log.Printf("Power-on signal sent to droplet with ID: %d\n", dropletID)
+	return nil
+}
+
+func (d *DigitalOcean) PowerOff(dropletID int) error {
+	tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: d.token})
+	oauthClient := oauth2.NewClient(context.Background(), tokenSource)
+	client := godo.NewClient(oauthClient)
+
+	ctx := context.TODO()
+
+	// Create a request to power on the droplet.
+	_, _, err := client.DropletActions.PowerOff(ctx, dropletID)
+	if err != nil {
+		return err
+	}
+
+	log.Printf("Power-on signal sent to droplet with ID: %d\n", dropletID)
+	return nil
+}
diff --git a/digitalocean/structs.go b/digitalocean/structs.go
index 6f12994..cfd400d 100644
--- a/digitalocean/structs.go
+++ b/digitalocean/structs.go
@@ -41,6 +41,8 @@ type ipButton struct {
 }
 
 type Droplet struct {
+	ID		int
+
 	ready		bool
 	hidden		bool
 	err		error
diff --git a/examples/control-panel-digitalocean/Makefile b/examples/control-panel-digitalocean/Makefile
index 39a387a..f1edb86 100644
--- a/examples/control-panel-digitalocean/Makefile
+++ b/examples/control-panel-digitalocean/Makefile
@@ -1,6 +1,6 @@
 # export GO111MODULE="off"
 run: build
-	./control-panel-digitalocean --gui-debug
+	./control-panel-digitalocean --gui-debug --log-debug
 
 build-release:
 	go get -v -u -x .