Skip to content

Commit

Permalink
feat: dump configuration as ytt values
Browse files Browse the repository at this point in the history
  • Loading branch information
Zebradil committed Jun 14, 2023
1 parent c9b726a commit af65436
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 16 deletions.
21 changes: 21 additions & 0 deletions internal/myks/assets/env-data.ytt.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,24 @@ helm:
#! Used by myks.
#! If defined, passed as a value of `--namespace` for `helm template`.
namespace: ""
#! Myks configuration and runtime data.
myks:
applicationDataFileName: ""
applicationNames: [""]
environmentBaseDir: ""
environmentDataFileName: ""
gitRepoUrl: ""
helmChartsDirName: ""
namespacePrefix: ""
prototypesDir: ""
renderedDir: ""
renderedEnvironmentDataFileName: ""
rootDir: ""
searchPaths: [""]
serviceDirName: ""
tempDirName: ""
vendirConfigFileName: ""
vendirLockFileName: ""
vendorDirName: ""
yttLibraryDirName: ""
yttStepDirName: ""
70 changes: 54 additions & 16 deletions internal/myks/globe.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package myks

import (
"bytes"
"embed"
"fmt"
"io"
Expand All @@ -11,6 +12,7 @@ import (

"github.com/creasty/defaults"
"github.com/rs/zerolog/log"
yaml "gopkg.in/yaml.v3"
)

//go:embed assets/env-data.ytt.yaml
Expand All @@ -30,40 +32,42 @@ type Globe struct {
/// Globe configuration

// Project root directory
RootDir string
RootDir string `default:"." yaml:"rootDir"`
// Base directory for environments
EnvironmentBaseDir string `default:"envs"`
EnvironmentBaseDir string `default:"envs" yaml:"environmentBaseDir"`
// Application prototypes directory
PrototypesDir string `default:"prototypes"`
PrototypesDir string `default:"prototypes" yaml:"prototypesDir"`
// Rendered kubernetes manifests directory
RenderedDir string `default:"rendered"`
RenderedDir string `default:"rendered" yaml:"renderedDir"`
// Prefix for kubernetes namespaces
NamespacePrefix string `default:""`
NamespacePrefix string `default:"" yaml:"namespacePrefix"`

/// Globe constants

// Service directory name
ServiceDirName string `default:".myks"`
ServiceDirName string `default:".myks" yaml:"serviceDirName"`
// Temporary directory name
TempDirName string `default:"tmp"`
TempDirName string `default:"tmp" yaml:"tempDirName"`
// Application data file name
ApplicationDataFileName string `default:"app-data.ytt.yaml"`
ApplicationDataFileName string `default:"app-data.ytt.yaml" yaml:"applicationDataFileName"`
// Environment data file name
EnvironmentDataFileName string `default:"env-data.ytt.yaml"`
EnvironmentDataFileName string `default:"env-data.ytt.yaml" yaml:"environmentDataFileName"`
// Rendered environment data file name
RenderedEnvironmentDataFileName string `default:"env-data.yaml"`
RenderedEnvironmentDataFileName string `default:"env-data.yaml" yaml:"renderedEnvironmentDataFileName"`
// Rendered vendir config file name
VendirConfigFileName string `default:"vendir.yaml"`
VendirConfigFileName string `default:"vendir.yaml" yaml:"vendirConfigFileName"`
// Rendered vendir lock file name
VendirLockFileName string `default:"vendir.lock.yaml"`
VendirLockFileName string `default:"vendir.lock.yaml" yaml:"vendirLockFileName"`
// Downloaded third-party sources
VendorDirName string `default:"vendor"`
VendorDirName string `default:"vendor" yaml:"vendorDirName"`
// Helm charts directory name
HelmChartsDirName string `default:"charts"`
HelmChartsDirName string `default:"charts" yaml:"helmChartsDirName"`
// Ytt step directory name
YttStepDirName string `default:"ytt"`
YttStepDirName string `default:"ytt" yaml:"yttStepDirName"`
// Ytt library directory name
YttLibraryDirName string `default:"lib"`
YttLibraryDirName string `default:"lib" yaml:"yttLibraryDirName"`
// Myks runtime config file name
MyksDataFileName string `default:"myks-data.ytt.yaml" yaml:"myksDataFileName"`

/// User input

Expand Down Expand Up @@ -98,6 +102,12 @@ func New(rootDir string) *Globe {
g.extraYttPaths = append(g.extraYttPaths, yttLibraryDir)
}

if configFileName, err := g.dumpConfigAsYaml(); err != nil {
log.Warn().Err(err).Msg("Unable to dump config as yaml")
} else {
g.extraYttPaths = append(g.extraYttPaths, configFileName)
}

if err := g.setGitRepoUrl(); err != nil {
log.Warn().Err(err).Msg("Unable to set git repo url")
}
Expand Down Expand Up @@ -171,6 +181,34 @@ func (g *Globe) Bootstrap() error {
return nil
}

// dumpConfigAsYaml dumps the globe config as yaml to a file and returns the file name
func (g *Globe) dumpConfigAsYaml() (string, error) {
configData := struct {
Myks *Globe `yaml:"myks"`
}{
Myks: g,
}
var yamlData bytes.Buffer
enc := yaml.NewEncoder(&yamlData)
enc.SetIndent(2)
if err := enc.Encode(configData); err != nil {
return "", err
}
yttData := fmt.Sprintf("#@data/values\n---\n%s", yamlData.String())

configFileName := filepath.Join(g.RootDir, g.ServiceDirName, g.TempDirName, g.MyksDataFileName)
if err := os.MkdirAll(filepath.Dir(configFileName), 0o755); err != nil {
return "", err
}
if err := os.WriteFile(configFileName, []byte(yttData), 0o644); err != nil {
return "", err
}

log.Trace().Str("config file", configFileName).Str("content", yttData).Msg("Dumped config as yaml")

return configFileName, nil
}

func (g *Globe) createBaseFileStructure() error {
envDir := filepath.Join(g.RootDir, g.EnvironmentBaseDir)
protoDir := filepath.Join(g.RootDir, g.PrototypesDir)
Expand Down

0 comments on commit af65436

Please sign in to comment.