blob: f8b8018f228ce6f87c1a324cfb91d1dd201a98ee [file] [log] [blame]
package tasks
import (
"bytes"
"embed"
"encoding/base64"
"fmt"
"path"
"strings"
"text/template"
"github.com/charmbracelet/keygen"
"github.com/giolekva/pcloud/core/installer"
)
//go:embed env-tmpl
var filesTmpls embed.FS
type activateEnvTask struct {
basicTask
env Env
st *state
}
func NewActivateEnvTask(env Env, st *state) Task {
return &activateEnvTask{
basicTask: basicTask{
title: fmt.Sprintf("Activate %s environment", env.Name),
},
env: env,
st: st,
}
}
func (t *activateEnvTask) Start() {
ssPublicKeys, err := t.st.ssClient.GetPublicKeys()
if err != nil {
t.callDoneListeners(err)
return
}
if err := t.addNewEnv(
t.st.repo,
strings.Split(t.st.ssClient.Addr, ":")[0],
t.st.keys,
ssPublicKeys,
); err != nil {
t.callDoneListeners(err)
return
}
t.callDoneListeners(nil)
}
func (t *activateEnvTask) addNewEnv(
repoIO installer.RepoIO,
repoHost string,
keys *keygen.KeyPair,
configRepoPublicKeys []string,
) error {
kust, err := repoIO.ReadKustomization("environments/kustomization.yaml")
if err != nil {
return err
}
kust.AddResources(t.env.Name)
tmpls, err := template.ParseFS(filesTmpls, "env-tmpl/*.yaml")
if err != nil {
return err
}
var knownHosts bytes.Buffer
for _, key := range configRepoPublicKeys {
fmt.Fprintf(&knownHosts, "%s %s\n", repoHost, key)
}
for _, tmpl := range tmpls.Templates() {
dstPath := path.Join("environments", t.env.Name, tmpl.Name())
dst, err := repoIO.Writer(dstPath)
if err != nil {
return err
}
defer dst.Close()
if err := tmpl.Execute(dst, map[string]string{
"Name": t.env.Name,
"PrivateKey": base64.StdEncoding.EncodeToString(keys.RawPrivateKey()),
"PublicKey": base64.StdEncoding.EncodeToString(keys.RawAuthorizedKey()),
"RepoHost": repoHost,
"RepoName": "config",
"KnownHosts": base64.StdEncoding.EncodeToString(knownHosts.Bytes()),
}); err != nil {
return err
}
}
if err := repoIO.WriteKustomization("environments/kustomization.yaml", *kust); err != nil {
return err
}
if err := repoIO.CommitAndPush(fmt.Sprintf("%s: initialize environment", t.env.Name)); err != nil {
return err
}
return nil
}