Răsfoiți Sursa

temp commit before merging helm updates

Alexander Belanger 5 ani în urmă
părinte
comite
435c9771a2

+ 1 - 0
cmd/app/main.go

@@ -86,6 +86,7 @@ func main() {
 			Scopes:       []string{"repo", "user", "read:user"},
 			BaseURL:      appConf.Server.ServerURL,
 		},
+		appConf.Server,
 	)
 
 	appRouter := router.New(a, store, appConf.Server.CookieName, appConf.Server.StaticFilePath, repo)

+ 9 - 1
docker-compose.dev.yaml

@@ -33,6 +33,13 @@ services:
       - 5400:5432
     volumes:
       - database:/var/lib/postgresql/data
+  chartmuseum:
+    image: docker.io/bitnami/chartmuseum:0-debian-10
+    container_name: chartmuseum
+    ports:
+      - 5000:8080
+    volumes:
+      - chartmuseum:/bitnami/data
   nginx:
     image: nginx:mainline-alpine
     container_name: nginx
@@ -47,4 +54,5 @@ services:
 
 volumes:
   database:
-  metabase:
+  metabase:
+  chartmuseum:

+ 3 - 2
go.mod

@@ -33,7 +33,8 @@ require (
 	github.com/gorilla/websocket v1.4.2
 	github.com/hashicorp/consul/api v1.3.0
 	github.com/imdario/mergo v0.3.11 // indirect
-	github.com/itchyny/gojq v0.11.2
+	github.com/itchyny/gojq v0.11.1
+	github.com/itchyny/timefmt-go v0.1.1 // indirect
 	github.com/jinzhu/gorm v1.9.16
 	github.com/joeshaw/envdecode v0.0.0-20200121155833-099f1fc765bd
 	github.com/json-iterator/go v1.1.10 // indirect
@@ -50,7 +51,7 @@ require (
 	github.com/stretchr/testify v1.6.1
 	golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0
 	golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43
-	golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f
+	golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6
 	golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect
 	google.golang.org/api v0.30.0
 	google.golang.org/genproto v0.0.0-20201014134559-03b6142f0dc9

+ 6 - 0
go.sum

@@ -758,8 +758,11 @@ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod
 github.com/instrumenta/kubeval v0.0.0-20190918223246-8d013ec9fc56/go.mod h1:bpiMYvNpVxWjdJsS0hDRu9TrobT5GfWCZwJseGUstxE=
 github.com/itchyny/astgen-go v0.0.0-20200815150004-12a293722290/go.mod h1:296z3W7Xsrp2mlIY88ruDKscuvrkL6zXCNRtaYVshzw=
 github.com/itchyny/go-flags v1.5.0/go.mod h1:lenkYuCobuxLBAd/HGFE4LRoW8D3B6iXRQfWYJ+MNbA=
+github.com/itchyny/gojq v0.11.1 h1:k54XkzWCGDfRJSZFRW4rXowTVzPlSjU2xUErkaFjfdo=
+github.com/itchyny/gojq v0.11.1/go.mod h1:8MKtgvJwkmRduSuzN25byPdNHfvv6y+/hmOVXei9e7k=
 github.com/itchyny/gojq v0.11.2 h1:lKhMKfH7fTKMWj2Zr8az/9TliCn0TTXVc/BXfQ8Jhfc=
 github.com/itchyny/gojq v0.11.2/go.mod h1:XtmtF1PxeDpwLC1jyz/xAmV78ANlP0S9LVEPsKweK0A=
+github.com/itchyny/timefmt-go v0.1.0/go.mod h1:0osSSCQSASBJMsIZnhAaF1C2fCBTJZXrnj37mG8/c+A=
 github.com/itchyny/timefmt-go v0.1.1 h1:rLpnm9xxb39PEEVzO0n4IRp0q6/RmBc7Dy/rE4HrA0U=
 github.com/itchyny/timefmt-go v0.1.1/go.mod h1:0osSSCQSASBJMsIZnhAaF1C2fCBTJZXrnj37mG8/c+A=
 github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
@@ -960,6 +963,7 @@ github.com/mattn/go-oci8 v0.0.7/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mN
 github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
 github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
 github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
 github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
@@ -1633,6 +1637,7 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200821140526-fda516888d29/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6 h1:DvY3Zkh7KabQE/kfzMvYvKirSiguP9Q/veMtkYyf0o8=
 golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
@@ -1925,6 +1930,7 @@ k8s.io/apimachinery v0.16.8/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnK
 k8s.io/apimachinery v0.18.8 h1:jimPrycCqgx2QPearX3to1JePz7wSbVLq+7PdBTTwQ0=
 k8s.io/apimachinery v0.18.8/go.mod h1:6sQd+iHEqmOtALqOFjSWp2KZ9F0wlU/nWm0ZgsYWMig=
 k8s.io/apimachinery v0.19.4 h1:+ZoddM7nbzrDCp0T3SWnyxqf8cbWPT2fkZImoyvHUG0=
+k8s.io/apimachinery v0.20.0 h1:jjzbTJRXk0unNS71L7h3lxGDH/2HPxMPaQY+MjECKL8=
 k8s.io/apiserver v0.18.8/go.mod h1:12u5FuGql8Cc497ORNj79rhPdiXQC4bf53X/skR/1YM=
 k8s.io/cli-runtime v0.18.8 h1:ycmbN3hs7CfkJIYxJAOB10iW7BVPmXGXkfEyiV9NJ+k=
 k8s.io/cli-runtime v0.18.8/go.mod h1:7EzWiDbS9PFd0hamHHVoCY4GrokSTPSL32MA4rzIu0M=

+ 2 - 0
internal/config/config.go

@@ -27,6 +27,8 @@ type ServerConf struct {
 	TimeoutIdle    time.Duration `env:"SERVER_TIMEOUT_IDLE,default=15s"`
 	IsLocal        bool          `env:"IS_LOCAL,default=false"`
 
+	HelmRepoURL string `env:"HELM_REPO_URL,default=https://porter-dev.github.io/chart-repo/"`
+
 	GithubClientID     string `env:"GITHUB_CLIENT_ID"`
 	GithubClientSecret string `env:"GITHUB_CLIENT_SECRET"`
 }

+ 1 - 0
internal/models/templates.go

@@ -45,6 +45,7 @@ type FormContent struct {
 	Context  *FormContext `yaml:"context" json:"context"`
 	Type     string       `yaml:"type" json:"type"`
 	Label    string       `yaml:"label" json:"label"`
+	Required bool         `json:"required"`
 	Name     string       `yaml:"name,omitempty" json:"name,omitempty"`
 	Variable string       `yaml:"variable,omitempty" json:"variable,omitempty"`
 	Value    interface{}  `yaml:"value,omitempty" json:"value,omitempty"`

+ 9 - 9
internal/templater/dynamic/reader.go

@@ -30,8 +30,8 @@ type Object struct {
 	Name string
 }
 
-// DynamicTemplateReader reads any resource registered with the k8s apiserver
-type DynamicTemplateReader struct {
+// TemplateReader reads any resource registered with the k8s apiserver
+type TemplateReader struct {
 	// The object to read from, identified by its group-version-kind
 	Object *Object
 
@@ -47,7 +47,7 @@ type DynamicTemplateReader struct {
 
 // NewDynamicTemplateReader creates a new DynamicTemplateReader
 func NewDynamicTemplateReader(client dynamic.Interface, obj *Object) templater.TemplateReader {
-	r := &DynamicTemplateReader{
+	r := &TemplateReader{
 		Object: obj,
 		Client: client,
 	}
@@ -66,7 +66,7 @@ func NewDynamicTemplateReader(client dynamic.Interface, obj *Object) templater.T
 }
 
 // ValuesFromTarget retrieves cluster values from the k8s apiserver
-func (r *DynamicTemplateReader) ValuesFromTarget() (map[string]interface{}, error) {
+func (r *TemplateReader) ValuesFromTarget() (map[string]interface{}, error) {
 	// if name is not empty, this is a get operation
 	if r.Object.Name != "" {
 		return r.valuesFromGet()
@@ -76,14 +76,14 @@ func (r *DynamicTemplateReader) ValuesFromTarget() (map[string]interface{}, erro
 }
 
 // RegisterQuery adds a query to the list of queries to execute
-func (r *DynamicTemplateReader) RegisterQuery(query *templater.TemplateReaderQuery) error {
+func (r *TemplateReader) RegisterQuery(query *templater.TemplateReaderQuery) error {
 	r.Queries = append(r.Queries, query)
 
 	return nil
 }
 
 // Read returns the resulting queried data
-func (r *DynamicTemplateReader) Read() (map[string]interface{}, error) {
+func (r *TemplateReader) Read() (map[string]interface{}, error) {
 	values, err := r.ValuesFromTarget()
 
 	if err != nil {
@@ -95,7 +95,7 @@ func (r *DynamicTemplateReader) Read() (map[string]interface{}, error) {
 
 // ReadStream listens for CRUD 	operations on resources and returns resulting
 // queried data
-func (r *DynamicTemplateReader) ReadStream(
+func (r *TemplateReader) ReadStream(
 	on templater.OnDataStream,
 	stopCh <-chan struct{},
 ) error {
@@ -159,7 +159,7 @@ func (r *DynamicTemplateReader) ReadStream(
 	return nil
 }
 
-func (r *DynamicTemplateReader) valuesFromList() (map[string]interface{}, error) {
+func (r *TemplateReader) valuesFromList() (map[string]interface{}, error) {
 	list, err := r.resource.List(context.TODO(), metav1.ListOptions{})
 
 	if err != nil {
@@ -169,7 +169,7 @@ func (r *DynamicTemplateReader) valuesFromList() (map[string]interface{}, error)
 	return list.UnstructuredContent(), nil
 }
 
-func (r *DynamicTemplateReader) valuesFromGet() (map[string]interface{}, error) {
+func (r *TemplateReader) valuesFromGet() (map[string]interface{}, error) {
 	get, err := r.resource.Get(context.TODO(), r.Object.Name, metav1.GetOptions{})
 
 	if err != nil {

+ 12 - 9
internal/templater/dynamic/writer.go

@@ -14,7 +14,9 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-type DynamicTemplateWriter struct {
+// TemplateWriter satisfies the templater.TemplateWriter interface
+// by creating/updating dynamic k8s resources
+type TemplateWriter struct {
 	// The object to read from, identified by its group-version-kind
 	Object *Object
 
@@ -30,12 +32,13 @@ type DynamicTemplateWriter struct {
 	base map[string]interface{}
 }
 
+// NewDynamicTemplateWriter returns a dynamic TemplateWriter
 func NewDynamicTemplateWriter(
 	client dynamic.Interface,
 	obj *Object,
 	base map[string]interface{},
 ) templater.TemplateWriter {
-	w := &DynamicTemplateWriter{
+	w := &TemplateWriter{
 		Object: obj,
 		Client: client,
 		base:   base,
@@ -52,17 +55,15 @@ func NewDynamicTemplateWriter(
 	return w
 }
 
-func (w *DynamicTemplateWriter) Transform() error {
+// Transform merges base configuration with vals
+func (w *TemplateWriter) Transform() error {
 	w.vals = utils.CoalesceValues(w.base, w.vals)
 
 	return nil
 }
 
-func (w *DynamicTemplateWriter) Write() (map[string]interface{}, error) {
-	return nil, nil
-}
-
-func (w *DynamicTemplateWriter) Create(vals map[string]interface{}) (map[string]interface{}, error) {
+// Create creates a new dynamic resource, this must be registered with the API server
+func (w *TemplateWriter) Create(vals map[string]interface{}) (map[string]interface{}, error) {
 	w.vals = vals
 	err := w.Transform()
 
@@ -81,7 +82,9 @@ func (w *DynamicTemplateWriter) Create(vals map[string]interface{}) (map[string]
 	return create.Object, nil
 }
 
-func (w *DynamicTemplateWriter) Update(vals map[string]interface{}) (map[string]interface{}, error) {
+// Update performs an update operation on a k8s resource. The resource must be
+// registered with the API server.
+func (w *TemplateWriter) Update(vals map[string]interface{}) (map[string]interface{}, error) {
 	w.vals = vals
 	err := w.Transform()
 

+ 6 - 6
internal/templater/helm/manifests_reader.go → internal/templater/helm/manifests/reader.go

@@ -10,11 +10,11 @@ import (
 	"sigs.k8s.io/yaml"
 )
 
-// ManifestsTemplateReader implements the TemplateReader for reading from
+// TemplateReader implements the templater.TemplateReader for reading from
 // the Helm manifests of a given release.
 //
 // Note: ReadStream does nothing at the moment.
-type ManifestsTemplateReader struct {
+type TemplateReader struct {
 	Queries []*templater.TemplateReaderQuery
 
 	Release *release.Release
@@ -22,7 +22,7 @@ type ManifestsTemplateReader struct {
 
 // ValuesFromTarget returns a set of values by reading from the Helm release's manifest,
 // unmarshaling from the bytes
-func (r *ManifestsTemplateReader) ValuesFromTarget() (map[string]interface{}, error) {
+func (r *TemplateReader) ValuesFromTarget() (map[string]interface{}, error) {
 	if r.Release == nil {
 		return nil, fmt.Errorf("must set release to read manifest")
 	}
@@ -51,14 +51,14 @@ func (r *ManifestsTemplateReader) ValuesFromTarget() (map[string]interface{}, er
 }
 
 // RegisterQuery adds a new query to be executed against the values
-func (r *ManifestsTemplateReader) RegisterQuery(query *templater.TemplateReaderQuery) error {
+func (r *TemplateReader) RegisterQuery(query *templater.TemplateReaderQuery) error {
 	r.Queries = append(r.Queries, query)
 
 	return nil
 }
 
 // Read executes a set of queries against the helm values in the release/chart
-func (r *ManifestsTemplateReader) Read() (map[string]interface{}, error) {
+func (r *TemplateReader) Read() (map[string]interface{}, error) {
 	values, err := r.ValuesFromTarget()
 
 	if err != nil {
@@ -69,7 +69,7 @@ func (r *ManifestsTemplateReader) Read() (map[string]interface{}, error) {
 }
 
 // ReadStream is unimplemented: stub just to implement TemplateReader
-func (r *ManifestsTemplateReader) ReadStream(
+func (r *TemplateReader) ReadStream(
 	on templater.OnDataStream,
 	stopCh <-chan struct{},
 ) error {

+ 6 - 6
internal/templater/helm/values_reader.go → internal/templater/helm/values/reader.go

@@ -10,11 +10,11 @@ import (
 	"helm.sh/helm/v3/pkg/release"
 )
 
-// ValuesTemplateReader implements the TemplateReader for reading from
+// TemplateReader implements the templater.TemplateReader for reading from
 // the Helm values.
 //
 // Note: ReadStream does nothing at the moment.
-type ValuesTemplateReader struct {
+type TemplateReader struct {
 	Queries []*templater.TemplateReaderQuery
 
 	Release *release.Release
@@ -23,7 +23,7 @@ type ValuesTemplateReader struct {
 
 // ValuesFromTarget returns a set of values by reading from a Helm release if set, otherwise
 // a helm chart.
-func (r *ValuesTemplateReader) ValuesFromTarget() (map[string]interface{}, error) {
+func (r *TemplateReader) ValuesFromTarget() (map[string]interface{}, error) {
 	// if release exists, read values from release
 	if r.Release != nil {
 		// merge config values with overriding values
@@ -37,14 +37,14 @@ func (r *ValuesTemplateReader) ValuesFromTarget() (map[string]interface{}, error
 }
 
 // RegisterQuery adds a new query to be executed against the values
-func (r *ValuesTemplateReader) RegisterQuery(query *templater.TemplateReaderQuery) error {
+func (r *TemplateReader) RegisterQuery(query *templater.TemplateReaderQuery) error {
 	r.Queries = append(r.Queries, query)
 
 	return nil
 }
 
 // Read executes a set of queries against the helm values in the release/chart
-func (r *ValuesTemplateReader) Read() (map[string]interface{}, error) {
+func (r *TemplateReader) Read() (map[string]interface{}, error) {
 	values, err := r.ValuesFromTarget()
 
 	if err != nil {
@@ -55,7 +55,7 @@ func (r *ValuesTemplateReader) Read() (map[string]interface{}, error) {
 }
 
 // ReadStream is unimplemented: stub just to implement TemplateReader
-func (r *ValuesTemplateReader) ReadStream(
+func (r *TemplateReader) ReadStream(
 	on templater.OnDataStream,
 	stopCh <-chan struct{},
 ) error {

+ 5 - 5
internal/templater/helm/writer.go → internal/templater/helm/values/writer.go

@@ -7,8 +7,8 @@ import (
 	"helm.sh/helm/v3/pkg/chart"
 )
 
-// ValuesTemplateWriter upgrades and installs charts by setting Helm values
-type ValuesTemplateWriter struct {
+// TemplateWriter upgrades and installs charts by setting Helm values
+type TemplateWriter struct {
 	// The object to read from, identified by its group-version-kind
 	Agent *helm.Agent
 
@@ -23,12 +23,12 @@ type ValuesTemplateWriter struct {
 }
 
 // Transform does nothing, since Helm handles the transforms internally
-func (w *ValuesTemplateWriter) Transform() error {
+func (w *TemplateWriter) Transform() error {
 	return nil
 }
 
 // Create installs a new chart, ChartPath must be set
-func (w *ValuesTemplateWriter) Create(
+func (w *TemplateWriter) Create(
 	vals map[string]interface{},
 ) (map[string]interface{}, error) {
 	if w.Chart == nil {
@@ -52,7 +52,7 @@ func (w *ValuesTemplateWriter) Create(
 }
 
 // Update upgrades a chart, ReleaseName must be set
-func (w *ValuesTemplateWriter) Update(
+func (w *TemplateWriter) Update(
 	vals map[string]interface{},
 ) (map[string]interface{}, error) {
 	if w.ReleaseName != "" {

+ 48 - 48
internal/templater/parser/parser.go

@@ -13,12 +13,12 @@ import (
 	"sigs.k8s.io/yaml"
 
 	td "github.com/porter-dev/porter/internal/templater/dynamic"
-	th "github.com/porter-dev/porter/internal/templater/helm"
+	tm "github.com/porter-dev/porter/internal/templater/helm/manifests"
+	tv "github.com/porter-dev/porter/internal/templater/helm/values"
 )
 
-// TODO -- handle all continue statements, errors should at least be logged if not
-// thrown
-
+// ClientConfigDefault is a set of default clients to be used if a context in
+// form.yaml does not declare otherwise.
 type ClientConfigDefault struct {
 	DynamicClient dynamic.Interface
 
@@ -27,29 +27,43 @@ type ClientConfigDefault struct {
 	HelmChart   *chart.Chart
 }
 
-func FormYAMLFromBytes(def *ClientConfigDefault, bytes []byte) (*models.FormYAML, error) {
+// ContextConfig can read/write from a specified context (data source)
+type ContextConfig struct {
+	FromType       string   // "live" or "declared"
+	Capabilities   []string // "read", "write"
+	TemplateReader templater.TemplateReader
+	TemplateWriter templater.TemplateWriter
+}
+
+// FormYAMLFromBytes generates a usable form yaml from raw form config and a
+// set of default clients.
+//
+// stateType refers to the types of state that should be read. The two state types
+// are "live" and "declared" -- if stateType is "", this will read both live and
+// declared states.
+func FormYAMLFromBytes(def *ClientConfigDefault, bytes []byte, stateType string) (*models.FormYAML, error) {
 	form, err := unqueriedFormYAMLFromBytes(bytes)
 
 	if err != nil {
 		return nil, err
 	}
 
-	lookup := formToLookupTable(def, form)
+	lookup := formToLookupTable(def, form, stateType)
 
 	// merge data from lookup
 	data := make(map[string]interface{})
 
 	for _, lookupVal := range lookup {
-		queryRes, err := lookupVal.TemplateReader.Read()
+		if lookupVal != nil {
+			queryRes, err := lookupVal.TemplateReader.Read()
 
-		if err != nil {
-			continue
-		}
-
-		for queryResKey, queryResVal := range queryRes {
-			fmt.Printf("PARSER: found value %s, %v\n", queryResKey, queryResVal)
+			if err != nil {
+				continue
+			}
 
-			data[queryResKey] = queryResVal
+			for queryResKey, queryResVal := range queryRes {
+				data[queryResKey] = queryResVal
+			}
 		}
 	}
 
@@ -105,16 +119,9 @@ func unqueriedFormYAMLFromBytes(bytes []byte) (*models.FormYAML, error) {
 	return form, nil
 }
 
-type ContextConfig struct {
-	FromType       string   // "live" or "declared"
-	Capabilities   []string // "read", "write"
-	TemplateReader templater.TemplateReader
-	TemplateWriter templater.TemplateWriter
-}
-
 // create map[*FormContext]*ContextConfig
 // assumes all contexts populated
-func formToLookupTable(def *ClientConfigDefault, form *models.FormYAML) map[*models.FormContext]*ContextConfig {
+func formToLookupTable(def *ClientConfigDefault, form *models.FormYAML, stateType string) map[*models.FormContext]*ContextConfig {
 	lookup := make(map[*models.FormContext]*ContextConfig)
 
 	for i, tab := range form.Tabs {
@@ -125,10 +132,12 @@ func formToLookupTable(def *ClientConfigDefault, form *models.FormYAML) map[*mod
 				}
 
 				if _, ok := lookup[content.Context]; !ok {
-					lookup[content.Context] = formContextToContextConfig(def, content.Context)
+					lookup[content.Context] = formContextToContextConfig(def, content.Context, stateType)
 				}
 
-				fmt.Printf("PARSER: content value %v, variable %s\n", content.Value, content.Variable)
+				if lookup[content.Context] == nil {
+					continue
+				}
 
 				if content.Value != nil && fmt.Sprintf("%v", content.Value) != "" {
 					// TODO -- case on whether value is proper query string, if not resolve it to a
@@ -138,36 +147,28 @@ func formToLookupTable(def *ClientConfigDefault, form *models.FormYAML) map[*mod
 						fmt.Sprintf("%v", content.Value),
 					)
 
-					fmt.Printf(
-						"PARSER: added query %s, %s\n",
-						fmt.Sprintf("tabs[%d].sections[%d].contents[%d]", i, j, k),
-						fmt.Sprintf("%v", content.Value),
-					)
-
 					if err != nil {
 						continue
 					}
 
-					lookup[content.Context].TemplateReader.RegisterQuery(query)
+					if stateType == "" || stateType == lookup[content.Context].FromType {
+						lookup[content.Context].TemplateReader.RegisterQuery(query)
+					}
 				} else if content.Variable != "" {
 					// if variable field set without value field set, make variable field into jsonpath
 					// query
 					query, err := utils.NewQuery(
 						fmt.Sprintf("tabs[%d].sections[%d].contents[%d]", i, j, k),
-						fmt.Sprintf("{ .%v }", content.Variable),
-					)
-
-					fmt.Printf(
-						"PARSER: added query %s, %s\n",
-						fmt.Sprintf("tabs[%d].sections[%d].contents[%d]", i, j, k),
-						fmt.Sprintf("{ .%v }", content.Variable),
+						fmt.Sprintf(".%v", content.Variable),
 					)
 
 					if err != nil {
 						continue
 					}
 
-					lookup[content.Context].TemplateReader.RegisterQuery(query)
+					if stateType == "" || stateType == lookup[content.Context].FromType {
+						lookup[content.Context].TemplateReader.RegisterQuery(query)
+					}
 				}
 			}
 		}
@@ -179,16 +180,15 @@ func formToLookupTable(def *ClientConfigDefault, form *models.FormYAML) map[*mod
 // TODO -- this needs to be able to construct new context configs based on
 // configuration for each context, but right now just uses the default config
 // for everything
-func formContextToContextConfig(def *ClientConfigDefault, context *models.FormContext) *ContextConfig {
+func formContextToContextConfig(def *ClientConfigDefault, context *models.FormContext, stateType string) *ContextConfig {
 	res := &ContextConfig{}
 
-	switch context.Type {
-	case "helm/values":
+	if context.Type == "helm/values" && (stateType == "" || stateType == "declared") {
 		res.FromType = "declared"
 
 		res.Capabilities = []string{"read", "write"}
 
-		res.TemplateReader = &th.ValuesTemplateReader{
+		res.TemplateReader = &tv.TemplateReader{
 			Release: def.HelmRelease,
 			Chart:   def.HelmChart,
 		}
@@ -199,20 +199,20 @@ func formContextToContextConfig(def *ClientConfigDefault, context *models.FormCo
 			relName = def.HelmRelease.Name
 		}
 
-		res.TemplateWriter = &th.ValuesTemplateWriter{
+		res.TemplateWriter = &tv.TemplateWriter{
 			Agent:       def.HelmAgent,
 			Chart:       def.HelmChart,
 			ReleaseName: relName,
 		}
-	case "helm/manifests":
+	} else if context.Type == "helm/manifests" && (stateType == "" || stateType == "live") {
 		res.FromType = "live"
 
 		res.Capabilities = []string{"read"}
 
-		res.TemplateReader = &th.ManifestsTemplateReader{
+		res.TemplateReader = &tm.TemplateReader{
 			Release: def.HelmRelease,
 		}
-	case "cluster":
+	} else if context.Type == "cluster" && (stateType == "" || stateType == "live") {
 		res.FromType = "live"
 
 		res.Capabilities = []string{"read"}
@@ -227,7 +227,7 @@ func formContextToContextConfig(def *ClientConfigDefault, context *models.FormCo
 		}
 
 		res.TemplateReader = td.NewDynamicTemplateReader(def.DynamicClient, obj)
-	default:
+	} else {
 		return nil
 	}
 

+ 0 - 67
internal/templater/utils/query_test.go

@@ -1,67 +0,0 @@
-package utils_test
-
-import (
-	"encoding/json"
-	"testing"
-
-	"github.com/porter-dev/porter/internal/templater"
-	"github.com/porter-dev/porter/internal/templater/utils"
-)
-
-type testType struct {
-	Value interface{} `json:"value,omitempty"`
-}
-
-func TestQueryValues(t *testing.T) {
-	vals := map[string]interface{}{
-		"items": []interface{}{
-			map[string]interface{}{
-				"metadata": map[string]interface{}{
-					"name":      "a",
-					"namespace": "velero",
-				},
-				"array": []interface{}{
-					"1",
-					"2",
-				},
-			},
-			map[string]interface{}{
-				"metadata": map[string]interface{}{
-					"name":      "b",
-					"namespace": "velero",
-				},
-				"array": []interface{}{
-					"3",
-					"4",
-				},
-			},
-		},
-	}
-
-	queries := make([]*templater.TemplateReaderQuery, 0)
-
-	// should get turned into type []map[string]interface{} that can be converted to JSON
-	// query, err := utils.NewQuery("test",
-	// 	`
-	// .items[].metadata |
-	// { name: .name, namespace: .namespace }
-	// `)
-
-	query, err := utils.NewQuery("test", `.items`)
-
-	if err != nil {
-		t.Fatalf("%v\n", err)
-	}
-
-	queries = append(queries, query)
-
-	res, _ := utils.QueryValues(vals, queries)
-
-	test := &testType{
-		Value: res["test"],
-	}
-
-	bytes, _ := json.Marshal(test)
-
-	t.Errorf(string(bytes))
-}

+ 5 - 0
server/api/api.go

@@ -14,6 +14,8 @@ import (
 	lr "github.com/porter-dev/porter/internal/logger"
 	"github.com/porter-dev/porter/internal/repository"
 	"helm.sh/helm/v3/pkg/storage"
+
+	"github.com/porter-dev/porter/internal/config"
 )
 
 // TestAgents are the k8s agents used for testing
@@ -35,6 +37,7 @@ type App struct {
 	cookieName   string
 	testing      bool
 	isLocal      bool
+	ServerConf   config.ServerConf
 	TestAgents   *TestAgents
 	GithubConfig *oauth2.Config
 }
@@ -51,6 +54,7 @@ func New(
 	testing bool,
 	isLocal bool,
 	githubConfig *oauth.Config,
+	serverConf config.ServerConf,
 ) *App {
 	// for now, will just support the english translator from the
 	// validator/translations package
@@ -88,6 +92,7 @@ func New(
 		isLocal:      isLocal,
 		TestAgents:   testAgents,
 		GithubConfig: oauthGithubConf,
+		ServerConf:   serverConf,
 	}
 }
 

+ 1 - 1
server/api/deploy_handler.go

@@ -24,7 +24,7 @@ func (app *App) HandleDeployTemplate(w http.ResponseWriter, r *http.Request) {
 	getChartForm := &forms.ChartForm{
 		Name:    name,
 		Version: version,
-		RepoURL: "https://porter-dev.github.io/chart-repo/",
+		RepoURL: app.ServerConf.HelmRepoURL,
 	}
 
 	// if a repo_url is passed as query param, it will be populated

+ 1 - 1
server/api/helpers_test.go

@@ -79,7 +79,7 @@ func newTester(canQuery bool) *tester {
 	repo := test.NewRepository(canQuery)
 
 	store, _ := sessionstore.NewStore(repo, appConf.Server)
-	app := api.New(logger, nil, repo, validator, store, appConf.Server.CookieName, true, false, nil)
+	app := api.New(logger, nil, repo, validator, store, appConf.Server.CookieName, true, false, nil, appConf.Server)
 	r := router.New(app, store, appConf.Server.CookieName, appConf.Server.StaticFilePath, repo)
 
 	return &tester{

+ 1 - 3
server/api/release_handler.go

@@ -2,7 +2,6 @@ package api
 
 import (
 	"encoding/json"
-	"fmt"
 	"net/http"
 	"net/url"
 	"strconv"
@@ -150,8 +149,7 @@ func (app *App) HandleGetRelease(w http.ResponseWriter, r *http.Request) {
 
 	for _, file := range release.Chart.Files {
 		if strings.Contains(file.Name, "form.yaml") {
-			formYAML, err := parser.FormYAMLFromBytes(parserDef, file.Data)
-			fmt.Println("FORM RESULT:", formYAML, err)
+			formYAML, err := parser.FormYAMLFromBytes(parserDef, file.Data, "")
 
 			if err != nil {
 				break

+ 4 - 3
server/api/template_handler.go

@@ -19,7 +19,8 @@ import (
 // TODO: test and reduce fragility (handle untar/parse error for individual charts)
 // TODO: separate markdown retrieval into its own query if necessary
 func (app *App) HandleListTemplates(w http.ResponseWriter, r *http.Request) {
-	repoIndex, err := loader.LoadRepoIndex("https://porter-dev.github.io/chart-repo/index.yaml")
+	// repoIndex, err := loader.LoadRepoIndex("https://porter-dev.github.io/chart-repo/index.yaml")
+	repoIndex, err := loader.LoadRepoIndex("http://chartmuseum:8080/index.yaml")
 
 	if err != nil {
 		app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
@@ -56,7 +57,7 @@ func (app *App) HandleReadTemplate(w http.ResponseWriter, r *http.Request) {
 	form := &forms.ChartForm{
 		Name:    name,
 		Version: version,
-		RepoURL: "https://porter-dev.github.io/chart-repo/",
+		RepoURL: RepoURL: app.ServerConf.HelmRepoURL,
 	}
 
 	// if a repo_url is passed as query param, it will be populated
@@ -87,7 +88,7 @@ func (app *App) HandleReadTemplate(w http.ResponseWriter, r *http.Request) {
 
 	for _, file := range chart.Files {
 		if strings.Contains(file.Name, "form.yaml") {
-			formYAML, err := parser.FormYAMLFromBytes(parserDef, file.Data)
+			formYAML, err := parser.FormYAMLFromBytes(parserDef, file.Data, "declared")
 
 			fmt.Println("FORM RESULT:", formYAML, err)