app: remove JSON based schema, and each App returns single namespace

Change-Id: I2ced82edd1251edc592f7ae0156d5ea3c81865c2
diff --git a/core/installer/app.go b/core/installer/app.go
index 611318d..35c6d11 100644
--- a/core/installer/app.go
+++ b/core/installer/app.go
@@ -328,7 +328,7 @@
 	Description() string
 	Icon() template.HTML
 	Schema() Schema
-	Namespaces() []string
+	Namespace() string
 	Render(derived Derived) (Rendered, error)
 }
 
@@ -386,8 +386,8 @@
 	return a.schema
 }
 
-func (a cueApp) Namespaces() []string {
-	return []string{a.namespace}
+func (a cueApp) Namespace() string {
+	return a.namespace
 }
 
 type PortForward struct {
diff --git a/core/installer/app_manager.go b/core/installer/app_manager.go
index 4684e02..295c8ff 100644
--- a/core/installer/app_manager.go
+++ b/core/installer/app_manager.go
@@ -59,18 +59,13 @@
 	if err != nil {
 		return err
 	}
-	namespaces := make([]string, len(app.Namespaces()))
-	for i, n := range app.Namespaces() {
-		ns, err := ns.Generate(n)
-		if err != nil {
-			return err
-		}
-		namespaces[i] = ns + suffix
+	nms, err := ns.Generate(app.Namespace())
+	if err != nil {
+		return err
 	}
-	for _, n := range namespaces {
-		if err := m.nsCreator.Create(n); err != nil {
-			return err
-		}
+	nms = nms + suffix
+	if err := m.nsCreator.Create(nms); err != nil {
+		return err
 	}
 	globalConfig, err := m.repoIO.ReadConfig()
 	if err != nil {
@@ -85,9 +80,7 @@
 		Global: globalConfig.Values,
 		Values: derivedValues,
 	}
-	if len(namespaces) > 0 {
-		derived.Release.Namespace = namespaces[0]
-	}
+	derived.Release.Namespace = nms
 	fmt.Printf("%+v\n", derived)
 	err = m.repoIO.InstallApp(
 		app,
diff --git a/core/installer/bootstrapper.go b/core/installer/bootstrapper.go
index fa1a997..b981573 100644
--- a/core/installer/bootstrapper.go
+++ b/core/installer/bootstrapper.go
@@ -388,17 +388,12 @@
 		if err != nil {
 			return err
 		}
-		namespaces := make([]string, len(app.Namespaces()))
-		for i, n := range app.Namespaces() {
-			namespaces[i], err = nsGen.Generate(n)
-			if err != nil {
-				return err
-			}
+		nms, err := nsGen.Generate(app.Namespace())
+		if err != nil {
+			return err
 		}
-		for _, n := range namespaces {
-			if err := nsCreator.Create(n); err != nil {
-				return err
-			}
+		if err := nsCreator.Create(nms); err != nil {
+			return err
 		}
 		derived := Derived{
 			Global: Values{
@@ -407,9 +402,7 @@
 			Release: Release{},
 			Values:  make(map[string]any),
 		}
-		if len(namespaces) > 0 {
-			derived.Release.Namespace = namespaces[0]
-		}
+		derived.Release.Namespace = nms
 		values := map[string]any{}
 		return repo.InstallApp(app, filepath.Join("/infrastructure", app.Name()), values, derived)
 	}
@@ -497,17 +490,12 @@
 	if err != nil {
 		return err
 	}
-	namespaces := make([]string, len(app.Namespaces()))
-	for i, n := range app.Namespaces() {
-		namespaces[i], err = nsGen.Generate(n)
-		if err != nil {
-			return err
-		}
+	nms, err := nsGen.Generate(app.Namespace())
+	if err != nil {
+		return err
 	}
-	for _, n := range namespaces {
-		if err := nsCreator.Create(n); err != nil {
-			return err
-		}
+	if err := nsCreator.Create(nms); err != nil {
+		return err
 	}
 	derived := Derived{
 		Global: Values{
@@ -520,9 +508,7 @@
 			"sshPrivateKey": string(keys.RawPrivateKey()),
 		},
 	}
-	if len(namespaces) > 0 {
-		derived.Release.Namespace = namespaces[0]
-	}
+	derived.Release.Namespace = nms
 	return repo.InstallApp(app, filepath.Join("/infrastructure", app.Name()), derived.Values, derived)
 }
 
@@ -532,17 +518,12 @@
 	if err != nil {
 		return err
 	}
-	namespaces := make([]string, len(app.Namespaces()))
-	for i, n := range app.Namespaces() {
-		namespaces[i], err = nsGen.Generate(n)
-		if err != nil {
-			return err
-		}
+	nms, err := nsGen.Generate(app.Namespace())
+	if err != nil {
+		return err
 	}
-	for _, n := range namespaces {
-		if err := nsCreator.Create(n); err != nil {
-			return err
-		}
+	if err := nsCreator.Create(nms); err != nil {
+		return err
 	}
 	derived := Derived{
 		Global: Values{
@@ -550,9 +531,7 @@
 		},
 		Values: map[string]any{},
 	}
-	if len(namespaces) > 0 {
-		derived.Release.Namespace = namespaces[0]
-	}
+	derived.Release.Namespace = nms
 	return repo.InstallApp(app, filepath.Join("/infrastructure", app.Name()), derived.Values, derived)
 }
 
@@ -603,7 +582,7 @@
 	if err != nil {
 		return err
 	}
-	ns, err := nsGen.Generate(app.Namespaces()[0])
+	ns, err := nsGen.Generate(app.Namespace())
 	if err != nil {
 		return err
 	}
diff --git a/core/installer/schema.go b/core/installer/schema.go
index 7e5e08d..de26173 100644
--- a/core/installer/schema.go
+++ b/core/installer/schema.go
@@ -1,9 +1,7 @@
 package installer
 
 import (
-	"encoding/json"
 	"fmt"
-	"strings"
 
 	"cuelang.org/go/cue"
 	"cuelang.org/go/cue/cuecontext"
@@ -175,36 +173,3 @@
 		return nil, fmt.Errorf("SHOULD NOT REACH!")
 	}
 }
-
-func newSchema(schema map[string]any) (Schema, error) {
-	switch schema["type"] {
-	case "string":
-		if r, ok := schema["role"]; ok && r == "network" {
-			return basicSchema{KindNetwork}, nil
-		} else {
-			return basicSchema{KindString}, nil
-		}
-	case "object":
-		s := structSchema{make(map[string]Schema)}
-		props := schema["properties"].(map[string]any)
-		for name, schema := range props {
-			sm, _ := schema.(map[string]any)
-			scm, err := newSchema(sm)
-			if err != nil {
-				return nil, err
-			}
-			s.fields[name] = scm
-		}
-		return s, nil
-	default:
-		return nil, fmt.Errorf("SHOULD NOT REACH!")
-	}
-}
-
-func NewJSONSchema(schema string) (Schema, error) {
-	ret := make(map[string]any)
-	if err := json.NewDecoder(strings.NewReader(schema)).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return newSchema(ret)
-}