Skip to content

Commit

Permalink
Expose env vars with prefix
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrew-Morozko committed Jun 14, 2024
1 parent 1929c3f commit 887bfd1
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 9 deletions.
32 changes: 30 additions & 2 deletions engine/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"github.com/blackstork-io/fabric/eval"
"github.com/blackstork-io/fabric/parser"
"github.com/blackstork-io/fabric/parser/definitions"
"github.com/blackstork-io/fabric/parser/evaluation"
"github.com/blackstork-io/fabric/pkg/diagnostics"
"github.com/blackstork-io/fabric/plugin"
"github.com/blackstork-io/fabric/plugin/resolver"
Expand All @@ -37,6 +38,7 @@ type Engine struct {
lockFile *resolver.LockFile
resolver *resolver.Resolver
fileMap map[string]*hcl.File
env plugin.MapData
}

// New creates a new Engine instance with the provided options.
Expand Down Expand Up @@ -380,6 +382,32 @@ func (e *Engine) FetchData(ctx context.Context, target string) (_ plugin.Data, d
return loadedData.FetchData(ctx)
}

func (e *Engine) loadEnv() plugin.MapData {
requiredPrefix := "FABRIC_"
if e.config != nil && e.config.EnvVarsPrefix != nil {
requiredPrefix = *e.config.EnvVarsPrefix
}
envMap := plugin.MapData{}

env := evaluation.EvalContext().Variables["env"].AsValueMap()
for k, v := range env {
if !strings.HasPrefix(k, requiredPrefix) {
continue
}
envMap[k] = plugin.StringData(v.AsString())
}
return envMap
}

func (e *Engine) initialDataCtx() plugin.MapData {
if e.env == nil {
e.env = e.loadEnv()
}
return plugin.MapData{
"env": e.env,
}
}

func (e *Engine) RenderContent(ctx context.Context, target string) (_ plugin.Content, _ plugin.Data, diags diagnostics.Diag) {
ctx, span := e.tracer.Start(ctx, "Engine.RenderContent", trace.WithAttributes(
attribute.String("target", target),
Expand All @@ -396,7 +424,7 @@ func (e *Engine) RenderContent(ctx context.Context, target string) (_ plugin.Con
if diags.Extend(diag) {
return nil, nil, diags
}
content, data, diag := doc.RenderContent(ctx)
content, data, diag := doc.RenderContent(ctx, e.initialDataCtx())
if diags.Extend(diag) {
return nil, nil, diags
}
Expand All @@ -419,7 +447,7 @@ func (e *Engine) Publish(ctx context.Context, target string) (_ plugin.Content,
if diags.Extend(diag) {
return nil, nil, diags
}
content, data, diag := doc.Publish(ctx)
content, data, diag := doc.Publish(ctx, e.initialDataCtx())
if diags.Extend(diag) {
return nil, nil, diags
}
Expand Down
68 changes: 68 additions & 0 deletions engine/engine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,74 @@ func TestEngineLint(t *testing.T) {
)
}

func TestEnvPrefix(t *testing.T) {
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
AddSource: true,
Level: slog.LevelWarn,
})))
os.Setenv("OTHER_VAR", "OTHER_VAR")
os.Setenv("FABRIC_VAR", "FABRIC_VAR")
os.Setenv("FABRIC_TEST_VAR", "FABRIC_TEST_VAR")

renderTest(
t, "Default",
[]string{
`
document "test-doc" {
content text {
value = "{{.env.OTHER_VAR}}\n{{.env.FABRIC_VAR}}\n{{.env.FABRIC_TEST_VAR}}"
}
}
`,
},
"test-doc",
[]string{
"<no value>\nFABRIC_VAR\nFABRIC_TEST_VAR",
},
diagtest.Asserts{},
)
renderTest(
t, "Custom",
[]string{
`
fabric {
expose_env_vars_with_prefix = "FABRIC_TEST_"
}
document "test-doc" {
content text {
value = "{{.env.OTHER_VAR}}\n{{.env.FABRIC_VAR}}\n{{.env.FABRIC_TEST_VAR}}"
}
}
`,
},
"test-doc",
[]string{
"<no value>\n<no value>\nFABRIC_TEST_VAR",
},
diagtest.Asserts{},
)
renderTest(
t, "Empty",
[]string{
`
fabric {
expose_env_vars_with_prefix = ""
}
document "test-doc" {
content text {
value = "{{.env.OTHER_VAR}}\n{{.env.FABRIC_VAR}}\n{{.env.FABRIC_TEST_VAR}}"
}
}
`,
},
"test-doc",
[]string{
"OTHER_VAR\nFABRIC_VAR\nFABRIC_TEST_VAR",
},
diagtest.Asserts{},
)
}

func TestEngineRenderContent(t *testing.T) {
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
AddSource: true,
Expand Down
13 changes: 6 additions & 7 deletions eval/document.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ func (doc *Document) FetchData(ctx context.Context) (plugin.Data, diagnostics.Di
return result, diags
}

func (doc *Document) RenderContent(ctx context.Context) (plugin.Content, plugin.Data, diagnostics.Diag) {
func (doc *Document) RenderContent(ctx context.Context, docDataCtx plugin.MapData) (plugin.Content, plugin.Data, diagnostics.Diag) {
data, diags := doc.FetchData(ctx)
if diags.HasErrors() {
return nil, nil, diags
Expand All @@ -59,10 +59,9 @@ func (doc *Document) RenderContent(ctx context.Context) (plugin.Content, plugin.
}
// static portion of the data context for this document
// will never change, all changes are made to the clone of this map
docDataCtx := plugin.MapData{
definitions.BlockKindData: data,
definitions.BlockKindDocument: docData,
}
docDataCtx[definitions.BlockKindData] = data
docDataCtx[definitions.BlockKindDocument] = docData

diag := ApplyVars(ctx, doc.Vars, docDataCtx)

if diags.Extend(diag) {
Expand Down Expand Up @@ -106,8 +105,8 @@ func (doc *Document) RenderContent(ctx context.Context) (plugin.Content, plugin.
return result, data, diags
}

func (doc *Document) Publish(ctx context.Context) (plugin.Content, plugin.Data, diagnostics.Diag) {
content, data, diags := doc.RenderContent(ctx)
func (doc *Document) Publish(ctx context.Context, docDataCtx plugin.MapData) (plugin.Content, plugin.Data, diagnostics.Diag) {
content, data, diags := doc.RenderContent(ctx, docDataCtx)
if diags.HasErrors() {
return nil, nil, diags
}
Expand Down
4 changes: 4 additions & 0 deletions parser/definitions/global_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ type GlobalConfig struct {
CacheDir string `hcl:"cache_dir,optional"`
PluginRegistry *PluginRegistry `hcl:"plugin_registry,block"`
PluginVersions map[string]string `hcl:"plugin_versions,optional"`
EnvVarsPrefix *string `hcl:"expose_env_vars_with_prefix,optional"`
}

type PluginRegistry struct {
Expand All @@ -27,5 +28,8 @@ func (g *GlobalConfig) Merge(other *GlobalConfig) {
}
}
}
if other.EnvVarsPrefix != nil {
g.EnvVarsPrefix = other.EnvVarsPrefix
}
g.PluginVersions = other.PluginVersions
}

0 comments on commit 887bfd1

Please sign in to comment.