good morning!!!!

Skip to content
Snippets Groups Projects
discoverer.go 2.7 KiB
Newer Older
Garet Halliday's avatar
Garet Halliday committed
package digitalocean
Garet Halliday's avatar
do
Garet Halliday committed

import (
	"context"
Garet Halliday's avatar
Garet Halliday committed
	"fmt"
Garet Halliday's avatar
do
Garet Halliday committed
	"net"
	"strconv"

Garet Halliday's avatar
Garet Halliday committed
	"github.com/caddyserver/caddy/v2"
Garet Halliday's avatar
do
Garet Halliday committed
	"github.com/digitalocean/godo"

Garet Halliday's avatar
Garet Halliday committed
	"gfx.cafe/gfx/pggat/lib/gat/handlers/discovery"
Garet Halliday's avatar
do
Garet Halliday committed
)

Garet Halliday's avatar
Garet Halliday committed
func init() {
	caddy.RegisterModule((*Discoverer)(nil))
}

Garet Halliday's avatar
do
Garet Halliday committed
type Discoverer struct {
Garet Halliday's avatar
Garet Halliday committed
	Config
Garet Halliday's avatar
do
Garet Halliday committed

Garet Halliday's avatar
Garet Halliday committed
	filter Filter

Garet Halliday's avatar
do
Garet Halliday committed
	do *godo.Client
}

Garet Halliday's avatar
Garet Halliday committed
func (T *Discoverer) CaddyModule() caddy.ModuleInfo {
	return caddy.ModuleInfo{
Garet Halliday's avatar
Garet Halliday committed
		ID: "pggat.handlers.discovery.discoverers.digitalocean",
Garet Halliday's avatar
Garet Halliday committed
		New: func() caddy.Module {
			return new(Discoverer)
		},
	}
}

func (T *Discoverer) Provision(ctx caddy.Context) error {
Garet Halliday's avatar
Garet Halliday committed
	if T.Filter != nil {
		val, err := ctx.LoadModule(T, "Filter")
		if err != nil {
			return fmt.Errorf("loading filter module: %v", err)
Garet Halliday's avatar
Garet Halliday committed
		T.filter = val.(Filter)
Garet Halliday's avatar
Garet Halliday committed

	T.do = godo.NewFromToken(T.APIKey)
	return nil
Garet Halliday's avatar
Garet Halliday committed
func (T *Discoverer) Clusters() ([]discovery.Cluster, error) {
Garet Halliday's avatar
do
Garet Halliday committed
	clusters, _, err := T.do.Databases.List(context.Background(), nil)
	if err != nil {
		return nil, err
	}

	res := make([]discovery.Cluster, 0, len(clusters))
	for _, cluster := range clusters {
		if cluster.EngineSlug != "pg" {
			continue
		}

		// filter by tags
Garet Halliday's avatar
Garet Halliday committed
		if T.filter != nil && !T.filter.Allow(cluster) {
Garet Halliday's avatar
do
Garet Halliday committed
		var primaryAddr string
Garet Halliday's avatar
Garet Halliday committed
		if T.Private {
Garet Halliday's avatar
do
Garet Halliday committed
			primaryAddr = net.JoinHostPort(cluster.PrivateConnection.Host, strconv.Itoa(cluster.PrivateConnection.Port))
		} else {
			primaryAddr = net.JoinHostPort(cluster.Connection.Host, strconv.Itoa(cluster.Connection.Port))
		}

		c := discovery.Cluster{
			ID: cluster.ID,
			Primary: discovery.Node{
Garet Halliday's avatar
a  
Garet Halliday committed
				Address: primaryAddr,
Garet Halliday's avatar
do
Garet Halliday committed
			Databases: cluster.DBNames,
			Users:     make([]discovery.User, 0, len(cluster.Users)),
		}

		for _, user := range cluster.Users {
Garet Halliday's avatar
do
Garet Halliday committed
			c.Users = append(c.Users, discovery.User{
				Username: user.Name,
Garet Halliday's avatar
do
Garet Halliday committed
				Password: user.Password,
			})
		}

		replicas, _, err := T.do.Databases.ListReplicas(context.Background(), cluster.ID, nil)
		if err != nil {
			return nil, err
		}

		c.Replicas = make(map[string]discovery.Node, len(replicas))
Garet Halliday's avatar
do
Garet Halliday committed
		for _, replica := range replicas {
			// filter by tags
Garet Halliday's avatar
Garet Halliday committed
			if T.filter != nil && !T.filter.AllowReplica(replica) {
Garet Halliday's avatar
do
Garet Halliday committed
			var replicaAddr string
Garet Halliday's avatar
Garet Halliday committed
			if T.Private {
Garet Halliday's avatar
do
Garet Halliday committed
				replicaAddr = net.JoinHostPort(replica.PrivateConnection.Host, strconv.Itoa(replica.PrivateConnection.Port))
			} else {
				replicaAddr = net.JoinHostPort(replica.Connection.Host, strconv.Itoa(replica.Connection.Port))
			}
			c.Replicas[replica.ID] = discovery.Node{
Garet Halliday's avatar
a  
Garet Halliday committed
				Address: replicaAddr,
Garet Halliday's avatar
do
Garet Halliday committed
		}

		res = append(res, c)
	}

	return res, nil
}

Garet Halliday's avatar
Garet Halliday committed
func (T *Discoverer) Added() <-chan discovery.Cluster {
Garet Halliday's avatar
do
Garet Halliday committed
	return nil
}

Garet Halliday's avatar
Garet Halliday committed
func (T *Discoverer) Removed() <-chan string {
Garet Halliday's avatar
do
Garet Halliday committed
	return nil
}

var _ discovery.Discoverer = (*Discoverer)(nil)
Garet Halliday's avatar
Garet Halliday committed
var _ caddy.Module = (*Discoverer)(nil)