DodoApp: Persist app namespaces in the config repository
Change-Id: I6bb6231ff63a4cfa8b66aa75c3d4cc1d9985d389
diff --git a/core/installer/welcome/dodo_app.go b/core/installer/welcome/dodo_app.go
index f903d9b..8cfa72f 100644
--- a/core/installer/welcome/dodo_app.go
+++ b/core/installer/welcome/dodo_app.go
@@ -2,10 +2,13 @@
import (
"encoding/json"
+ "errors"
"fmt"
"io"
+ "io/fs"
"net/http"
"strings"
+ "sync"
"time"
"github.com/giolekva/pcloud/core/installer"
@@ -14,7 +17,13 @@
"github.com/gorilla/mux"
)
+const (
+ configRepoName = "config"
+ namespacesFile = "/namespaces.json"
+)
+
type DodoAppServer struct {
+ l sync.Locker
port int
self string
sshKey string
@@ -39,8 +48,16 @@
nsc installer.NamespaceCreator,
jc installer.JobCreator,
env installer.EnvConfig,
-) *DodoAppServer {
- return &DodoAppServer{
+) (*DodoAppServer, error) {
+ if ok, err := client.RepoExists(configRepoName); err != nil {
+ return nil, err
+ } else if !ok {
+ if err := client.AddRepository(configRepoName); err != nil {
+ return nil, err
+ }
+ }
+ s := &DodoAppServer{
+ &sync.Mutex{},
port,
self,
sshKey,
@@ -53,6 +70,20 @@
map[string]map[string]struct{}{},
map[string]string{},
}
+ config, err := client.GetRepo(configRepoName)
+ if err != nil {
+ return nil, err
+ }
+ r, err := config.Reader(namespacesFile)
+ if err == nil {
+ defer r.Close()
+ if err := json.NewDecoder(r).Decode(&s.appNs); err != nil {
+ return nil, err
+ }
+ } else if !errors.Is(err, fs.ErrNotExist) {
+ return nil, err
+ }
+ return s, nil
}
func (s *DodoAppServer) Start() error {
@@ -82,7 +113,7 @@
fmt.Println(err)
return
}
- if req.Ref != "refs/heads/master" || strings.HasPrefix(req.Repository.Name, "config") {
+ if req.Ref != "refs/heads/master" || strings.HasPrefix(req.Repository.Name, configRepoName) {
return
}
go func() {
@@ -148,6 +179,8 @@
}
func (s *DodoAppServer) CreateApp(appName, adminPublicKey string) error {
+ s.l.Lock()
+ defer s.l.Unlock()
fmt.Printf("Creating app: %s\n", appName)
if ok, err := s.client.RepoExists(appName); err != nil {
return err
@@ -179,14 +212,7 @@
if err := s.updateDodoApp(appName, namespace); err != nil {
return err
}
- if ok, err := s.client.RepoExists("config"); err != nil {
- return err
- } else if !ok {
- if err := s.client.AddRepository("config"); err != nil {
- return err
- }
- }
- repo, err := s.client.GetRepo("config")
+ repo, err := s.client.GetRepo(configRepoName)
if err != nil {
return err
}
@@ -195,11 +221,33 @@
if err != nil {
return err
}
- if _, err := m.Install(app, appName, "/"+appName, namespace, map[string]any{
- "repoAddr": s.client.GetRepoAddress(appName),
- "repoHost": strings.Split(s.client.Address(), ":")[0],
- "gitRepoPublicKey": s.gitRepoPublicKey,
- }, installer.WithConfig(&s.env)); err != nil {
+ if err := repo.Do(func(fs soft.RepoFS) (string, error) {
+ w, err := fs.Writer(namespacesFile)
+ if err != nil {
+ return "", err
+ }
+ defer w.Close()
+ if err := json.NewEncoder(w).Encode(s.appNs); err != nil {
+ return "", err
+ }
+ if _, err := m.Install(
+ app,
+ appName,
+ "/"+appName,
+ namespace,
+ map[string]any{
+ "repoAddr": s.client.GetRepoAddress(appName),
+ "repoHost": strings.Split(s.client.Address(), ":")[0],
+ "gitRepoPublicKey": s.gitRepoPublicKey,
+ },
+ installer.WithConfig(&s.env),
+ installer.WithNoPublish(),
+ installer.WithNoLock(),
+ ); err != nil {
+ return "", err
+ }
+ return fmt.Sprintf("Installed app: %s", appName), nil
+ }); err != nil {
return err
}
cfg, err := m.FindInstance(appName)