generated from TBD54566975/tbd-project-template
-
Notifications
You must be signed in to change notification settings - Fork 5
/
from_environment.go
71 lines (66 loc) 路 1.97 KB
/
from_environment.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package modulecontext
import (
"context"
"fmt"
"os"
"strings"
cf "github.com/TBD54566975/ftl/common/configuration"
)
// UpdateFromEnvironment adds configs, secrets and databases from the environment.
//
// This is useful for testing and development, where the environment is used to provide
// configurations, secrets and DSNs. The context is built from a combination of
// the ftl-project.toml file and (for now) environment variables.
func (b *Builder) UpdateFromEnvironment(ctx context.Context) (*Builder, error) {
// TODO: split this func into separate purposes: explicitly reading a particular project file, and reading DSNs from environment
cm, err := cf.NewDefaultConfigurationManagerFromEnvironment(ctx)
if err != nil {
return &Builder{}, err
}
configs, err := cm.MapForModule(ctx, b.module)
if err != nil {
return &Builder{}, err
}
for name, data := range configs {
b.configs[name] = data
}
sm, err := cf.NewDefaultSecretsManagerFromEnvironment(ctx)
if err != nil {
return &Builder{}, err
}
secrets, err := sm.MapForModule(ctx, b.module)
if err != nil {
return &Builder{}, err
}
for name, data := range secrets {
b.secrets[name] = data
}
for _, entry := range os.Environ() {
if !strings.HasPrefix(entry, "FTL_POSTGRES_DSN_") {
continue
}
parts := strings.SplitN(entry, "=", 2)
if len(parts) != 2 {
return &Builder{}, fmt.Errorf("invalid DSN environment variable: %s", entry)
}
key := parts[0]
value := parts[1]
// FTL_POSTGRES_DSN_MODULE_DBNAME
parts = strings.Split(key, "_")
if len(parts) != 5 {
return &Builder{}, fmt.Errorf("invalid DSN environment variable: %s", entry)
}
moduleName := parts[3]
dbName := parts[4]
if !strings.EqualFold(moduleName, b.module) {
continue
}
dbName = strings.ToLower(dbName)
db, err := NewDatabase(DBTypePostgres, value)
if err != nil {
return &Builder{}, fmt.Errorf("could not create database %q with DSN %q: %w", dbName, value, err)
}
b.databases[dbName] = db
}
return b, nil
}