installer: split up new env creation into chain of tasks
diff --git a/core/installer/tasks/activate.go b/core/installer/tasks/activate.go
new file mode 100644
index 0000000..f8b8018
--- /dev/null
+++ b/core/installer/tasks/activate.go
@@ -0,0 +1,99 @@
+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
+}