~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
67 lines · 1.7 KB Raw History
package providermain

import (
	"fmt"
	"log/slog"
	"os"
	"path/filepath"
	"sync"

	"github.com/johnandersen777/socialweb-computer-kcp/internal/clusterprovider"
	"github.com/johnandersen777/socialweb-computer-kcp/internal/instance"
)

type tokenStore struct {
	stateDir string
	log      *slog.Logger

	mu sync.Mutex
	by map[string]instance.Token
}

func newTokenStore(stateDir string, log *slog.Logger) *tokenStore {
	return &tokenStore{stateDir: stateDir, log: log, by: map[string]instance.Token{}}
}

func (s *tokenStore) token(cluster string) instance.Token {
	s.mu.Lock()
	defer s.mu.Unlock()
	if t, ok := s.by[cluster]; ok {
		return t
	}
	t, err := instance.New(nil)
	if err != nil {
		s.log.Error("cluster provider: minting the instance token failed", "cluster", cluster, "error", err.Error())
		return ""
	}
	path, err := s.path(cluster)
	if err != nil {
		s.log.Error("cluster provider: no token path", "cluster", cluster, "error", err.Error())
		return ""
	}
	if err := instance.WriteFile(path, t); err != nil {
		s.log.Error("cluster provider: writing the instance token failed",
			"cluster", cluster, "path", path, "error", err.Error())
		return ""
	}
	s.by[cluster] = t
	s.log.Info("cluster provider: instance token minted and written", "cluster", cluster, "path", path)
	return t
}

func (s *tokenStore) forget(cluster string) {
	s.mu.Lock()
	defer s.mu.Unlock()
	delete(s.by, cluster)
}

func (s *tokenStore) path(cluster string) (string, error) {
	dir, err := clusterprovider.ClusterDataDir(s.stateDir, cluster)
	if err != nil {
		return "", err
	}
	if err := os.MkdirAll(dir, 0o700); err != nil {
		return "", fmt.Errorf("creating %s: %w", dir, err)
	}
	return clusterprovider.TokenPath(filepath.Clean(dir)), nil
}