forked from toolshed/abra
new package envfile and move GetComposeFiles to recipe package
This commit is contained in:
@ -1,14 +1,19 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"coopcloud.tech/abra/pkg/client"
|
||||
"coopcloud.tech/abra/pkg/config"
|
||||
"coopcloud.tech/abra/pkg/envfile"
|
||||
"coopcloud.tech/abra/pkg/formatter"
|
||||
"coopcloud.tech/abra/pkg/recipe"
|
||||
"coopcloud.tech/abra/pkg/upstream/convert"
|
||||
"coopcloud.tech/abra/pkg/upstream/stack"
|
||||
|
||||
@ -81,19 +86,13 @@ type App struct {
|
||||
Name AppName
|
||||
Recipe string
|
||||
Domain string
|
||||
Env AppEnv
|
||||
Env envfile.AppEnv
|
||||
Server string
|
||||
Path string
|
||||
}
|
||||
|
||||
// Type aliases to make code hints easier to understand
|
||||
|
||||
// AppEnv is a map of the values in an apps env config
|
||||
type AppEnv = map[string]string
|
||||
|
||||
// AppModifiers is a map of modifiers in an apps env config
|
||||
type AppModifiers = map[string]map[string]string
|
||||
|
||||
// AppName is AppName
|
||||
type AppName = string
|
||||
|
||||
@ -162,7 +161,7 @@ func (a App) Filters(appendServiceNames, exactMatch bool, services ...string) (f
|
||||
return filters, nil
|
||||
}
|
||||
|
||||
composeFiles, err := GetComposeFiles(a.Recipe, a.Env)
|
||||
composeFiles, err := recipe.GetComposeFiles(a.Recipe, a.Env)
|
||||
if err != nil {
|
||||
return filters, err
|
||||
}
|
||||
@ -231,7 +230,7 @@ func (a ByName) Less(i, j int) bool {
|
||||
}
|
||||
|
||||
func ReadAppEnvFile(appFile AppFile, name AppName) (App, error) {
|
||||
env, err := ReadEnv(appFile.Path)
|
||||
env, err := envfile.ReadEnv(appFile.Path)
|
||||
if err != nil {
|
||||
return App{}, fmt.Errorf("env file for %s couldn't be read: %s", name, err.Error())
|
||||
}
|
||||
@ -247,7 +246,7 @@ func ReadAppEnvFile(appFile AppFile, name AppName) (App, error) {
|
||||
}
|
||||
|
||||
// NewApp creates new App object
|
||||
func NewApp(env AppEnv, name string, appFile AppFile) (App, error) {
|
||||
func NewApp(env envfile.AppEnv, name string, appFile AppFile) (App, error) {
|
||||
domain := env["DOMAIN"]
|
||||
|
||||
recipe, exists := env["RECIPE"]
|
||||
@ -318,7 +317,7 @@ func GetAppServiceNames(appName string) ([]string, error) {
|
||||
return serviceNames, err
|
||||
}
|
||||
|
||||
composeFiles, err := GetComposeFiles(app.Recipe, app.Env)
|
||||
composeFiles, err := recipe.GetComposeFiles(app.Recipe, app.Env)
|
||||
if err != nil {
|
||||
return serviceNames, err
|
||||
}
|
||||
@ -481,7 +480,7 @@ func GetAppStatuses(apps []App, MachineReadable bool) (map[string]map[string]str
|
||||
// GetAppComposeConfig retrieves a compose specification for a recipe. This
|
||||
// specification is the result of a merge of all the compose.**.yml files in
|
||||
// the recipe repository.
|
||||
func GetAppComposeConfig(recipe string, opts stack.Deploy, appEnv AppEnv) (*composetypes.Config, error) {
|
||||
func GetAppComposeConfig(recipe string, opts stack.Deploy, appEnv envfile.AppEnv) (*composetypes.Config, error) {
|
||||
compose, err := loader.LoadComposefile(opts, appEnv)
|
||||
if err != nil {
|
||||
return &composetypes.Config{}, err
|
||||
@ -493,7 +492,7 @@ func GetAppComposeConfig(recipe string, opts stack.Deploy, appEnv AppEnv) (*comp
|
||||
}
|
||||
|
||||
// ExposeAllEnv exposes all env variables to the app container
|
||||
func ExposeAllEnv(stackName string, compose *composetypes.Config, appEnv AppEnv) {
|
||||
func ExposeAllEnv(stackName string, compose *composetypes.Config, appEnv envfile.AppEnv) {
|
||||
for _, service := range compose.Services {
|
||||
if service.Name == "app" {
|
||||
logrus.Debugf("Add the following environment to the app service config of %s:", stackName)
|
||||
@ -508,3 +507,73 @@ func ExposeAllEnv(stackName string, compose *composetypes.Config, appEnv AppEnv)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func CheckEnv(app App) ([]envfile.EnvVar, error) {
|
||||
var envVars []envfile.EnvVar
|
||||
|
||||
envSamplePath := path.Join(config.RECIPES_DIR, app.Recipe, ".env.sample")
|
||||
if _, err := os.Stat(envSamplePath); err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return envVars, fmt.Errorf("%s does not exist?", envSamplePath)
|
||||
}
|
||||
return envVars, err
|
||||
}
|
||||
|
||||
envSample, err := envfile.ReadEnv(envSamplePath)
|
||||
if err != nil {
|
||||
return envVars, err
|
||||
}
|
||||
|
||||
var keys []string
|
||||
for key := range envSample {
|
||||
keys = append(keys, key)
|
||||
}
|
||||
|
||||
sort.Strings(keys)
|
||||
|
||||
for _, key := range keys {
|
||||
if _, ok := app.Env[key]; ok {
|
||||
envVars = append(envVars, envfile.EnvVar{Name: key, Present: true})
|
||||
} else {
|
||||
envVars = append(envVars, envfile.EnvVar{Name: key, Present: false})
|
||||
}
|
||||
}
|
||||
|
||||
return envVars, nil
|
||||
}
|
||||
|
||||
// ReadAbraShCmdNames reads the names of commands.
|
||||
func ReadAbraShCmdNames(abraSh string) ([]string, error) {
|
||||
var cmdNames []string
|
||||
|
||||
file, err := os.Open(abraSh)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return cmdNames, nil
|
||||
}
|
||||
return cmdNames, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
cmdNameRegex, err := regexp.Compile(`(\w+)(\(\).*\{)`)
|
||||
if err != nil {
|
||||
return cmdNames, err
|
||||
}
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
matches := cmdNameRegex.FindStringSubmatch(line)
|
||||
if len(matches) > 0 {
|
||||
cmdNames = append(cmdNames, matches[1])
|
||||
}
|
||||
}
|
||||
|
||||
if len(cmdNames) > 0 {
|
||||
logrus.Debugf("read %s from %s", strings.Join(cmdNames, " "), abraSh)
|
||||
} else {
|
||||
logrus.Debugf("read 0 command names from %s", abraSh)
|
||||
}
|
||||
|
||||
return cmdNames, nil
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
|
||||
"coopcloud.tech/abra/pkg/envfile"
|
||||
composetypes "github.com/docker/cli/cli/compose/types"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
@ -46,7 +47,7 @@ func SetChaosVersionLabel(compose *composetypes.Config, stackName string, chaosV
|
||||
// SetUpdateLabel adds env ENABLE_AUTO_UPDATE as label to enable/disable the
|
||||
// auto update process for this app. The default if this variable is not set is to disable
|
||||
// the auto update process.
|
||||
func SetUpdateLabel(compose *composetypes.Config, stackName string, appEnv AppEnv) {
|
||||
func SetUpdateLabel(compose *composetypes.Config, stackName string, appEnv envfile.AppEnv) {
|
||||
for _, service := range compose.Services {
|
||||
if service.Name == "app" {
|
||||
enable_auto_update, exists := appEnv["ENABLE_AUTO_UPDATE"]
|
||||
|
159
pkg/app/env.go
159
pkg/app/env.go
@ -1,159 +0,0 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"coopcloud.tech/abra/pkg/config"
|
||||
"git.coopcloud.tech/coop-cloud/godotenv"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// ReadEnv loads an app envivornment into a map.
|
||||
func ReadEnv(filePath string) (AppEnv, error) {
|
||||
var envVars AppEnv
|
||||
|
||||
envVars, _, err := godotenv.Read(filePath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
logrus.Debugf("read %s from %s", envVars, filePath)
|
||||
|
||||
return envVars, nil
|
||||
}
|
||||
|
||||
// ReadEnv loads an app envivornment and their modifiers in two different maps.
|
||||
func ReadEnvWithModifiers(filePath string) (AppEnv, AppModifiers, error) {
|
||||
var envVars AppEnv
|
||||
|
||||
envVars, mods, err := godotenv.Read(filePath)
|
||||
if err != nil {
|
||||
return nil, mods, err
|
||||
}
|
||||
|
||||
logrus.Debugf("read %s from %s", envVars, filePath)
|
||||
|
||||
return envVars, mods, nil
|
||||
}
|
||||
|
||||
// ReadAbraShEnvVars reads env vars from an abra.sh recipe file.
|
||||
func ReadAbraShEnvVars(abraSh string) (map[string]string, error) {
|
||||
envVars := make(map[string]string)
|
||||
|
||||
file, err := os.Open(abraSh)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return envVars, nil
|
||||
}
|
||||
return envVars, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
exportRegex, err := regexp.Compile(`^export\s+(\w+=\w+)`)
|
||||
if err != nil {
|
||||
return envVars, err
|
||||
}
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
txt := scanner.Text()
|
||||
if exportRegex.MatchString(txt) {
|
||||
splitVals := strings.Split(txt, "export ")
|
||||
envVarDef := splitVals[len(splitVals)-1]
|
||||
keyVal := strings.Split(envVarDef, "=")
|
||||
if len(keyVal) != 2 {
|
||||
return envVars, fmt.Errorf("couldn't parse %s", txt)
|
||||
}
|
||||
envVars[keyVal[0]] = keyVal[1]
|
||||
}
|
||||
}
|
||||
|
||||
if len(envVars) > 0 {
|
||||
logrus.Debugf("read %s from %s", envVars, abraSh)
|
||||
} else {
|
||||
logrus.Debugf("read 0 env var exports from %s", abraSh)
|
||||
}
|
||||
|
||||
return envVars, nil
|
||||
}
|
||||
|
||||
type EnvVar struct {
|
||||
Name string
|
||||
Present bool
|
||||
}
|
||||
|
||||
func CheckEnv(app App) ([]EnvVar, error) {
|
||||
var envVars []EnvVar
|
||||
|
||||
envSamplePath := path.Join(config.RECIPES_DIR, app.Recipe, ".env.sample")
|
||||
if _, err := os.Stat(envSamplePath); err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return envVars, fmt.Errorf("%s does not exist?", envSamplePath)
|
||||
}
|
||||
return envVars, err
|
||||
}
|
||||
|
||||
envSample, err := ReadEnv(envSamplePath)
|
||||
if err != nil {
|
||||
return envVars, err
|
||||
}
|
||||
|
||||
var keys []string
|
||||
for key := range envSample {
|
||||
keys = append(keys, key)
|
||||
}
|
||||
|
||||
sort.Strings(keys)
|
||||
|
||||
for _, key := range keys {
|
||||
if _, ok := app.Env[key]; ok {
|
||||
envVars = append(envVars, EnvVar{Name: key, Present: true})
|
||||
} else {
|
||||
envVars = append(envVars, EnvVar{Name: key, Present: false})
|
||||
}
|
||||
}
|
||||
|
||||
return envVars, nil
|
||||
}
|
||||
|
||||
// ReadAbraShCmdNames reads the names of commands.
|
||||
func ReadAbraShCmdNames(abraSh string) ([]string, error) {
|
||||
var cmdNames []string
|
||||
|
||||
file, err := os.Open(abraSh)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return cmdNames, nil
|
||||
}
|
||||
return cmdNames, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
cmdNameRegex, err := regexp.Compile(`(\w+)(\(\).*\{)`)
|
||||
if err != nil {
|
||||
return cmdNames, err
|
||||
}
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
matches := cmdNameRegex.FindStringSubmatch(line)
|
||||
if len(matches) > 0 {
|
||||
cmdNames = append(cmdNames, matches[1])
|
||||
}
|
||||
}
|
||||
|
||||
if len(cmdNames) > 0 {
|
||||
logrus.Debugf("read %s from %s", strings.Join(cmdNames, " "), abraSh)
|
||||
} else {
|
||||
logrus.Debugf("read 0 command names from %s", abraSh)
|
||||
}
|
||||
|
||||
return cmdNames, nil
|
||||
}
|
@ -1,277 +0,0 @@
|
||||
package app_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"reflect"
|
||||
"slices"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"coopcloud.tech/abra/pkg/app"
|
||||
appPkg "coopcloud.tech/abra/pkg/app"
|
||||
"coopcloud.tech/abra/pkg/config"
|
||||
"coopcloud.tech/abra/pkg/recipe"
|
||||
)
|
||||
|
||||
var (
|
||||
TestFolder = os.ExpandEnv("$PWD/../../tests/resources/test_folder")
|
||||
ValidAbraConf = os.ExpandEnv("$PWD/../../tests/resources/valid_abra_config")
|
||||
)
|
||||
|
||||
// make sure these are in alphabetical order
|
||||
var (
|
||||
TFolders = []string{"folder1", "folder2"}
|
||||
TFiles = []string{"bar.env", "foo.env"}
|
||||
)
|
||||
|
||||
var (
|
||||
AppName = "ecloud"
|
||||
ServerName = "evil.corp"
|
||||
)
|
||||
|
||||
var ExpectedAppEnv = app.AppEnv{
|
||||
"DOMAIN": "ecloud.evil.corp",
|
||||
"RECIPE": "ecloud",
|
||||
}
|
||||
|
||||
var ExpectedApp = app.App{
|
||||
Name: AppName,
|
||||
Recipe: ExpectedAppEnv["RECIPE"],
|
||||
Domain: ExpectedAppEnv["DOMAIN"],
|
||||
Env: ExpectedAppEnv,
|
||||
Path: ExpectedAppFile.Path,
|
||||
Server: ExpectedAppFile.Server,
|
||||
}
|
||||
|
||||
var ExpectedAppFile = app.AppFile{
|
||||
Path: path.Join(ValidAbraConf, "servers", ServerName, AppName+".env"),
|
||||
Server: ServerName,
|
||||
}
|
||||
|
||||
var ExpectedAppFiles = map[string]app.AppFile{
|
||||
AppName: ExpectedAppFile,
|
||||
}
|
||||
|
||||
func TestGetAllFoldersInDirectory(t *testing.T) {
|
||||
folders, err := config.GetAllFoldersInDirectory(TestFolder)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !reflect.DeepEqual(folders, TFolders) {
|
||||
t.Fatalf("did not get expected folders. Expected: (%s), Got: (%s)", strings.Join(TFolders, ","), strings.Join(folders, ","))
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetAllFilesInDirectory(t *testing.T) {
|
||||
files, err := config.GetAllFilesInDirectory(TestFolder)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var fileNames []string
|
||||
for _, file := range files {
|
||||
fileNames = append(fileNames, file.Name())
|
||||
}
|
||||
if !reflect.DeepEqual(fileNames, TFiles) {
|
||||
t.Fatalf("did not get expected files. Expected: (%s), Got: (%s)", strings.Join(TFiles, ","), strings.Join(fileNames, ","))
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadEnv(t *testing.T) {
|
||||
env, err := app.ReadEnv(ExpectedAppFile.Path)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !reflect.DeepEqual(env, ExpectedAppEnv) {
|
||||
t.Fatalf(
|
||||
"did not get expected application settings. Expected: DOMAIN=%s RECIPE=%s; Got: DOMAIN=%s RECIPE=%s",
|
||||
ExpectedAppEnv["DOMAIN"],
|
||||
ExpectedAppEnv["RECIPE"],
|
||||
env["DOMAIN"],
|
||||
env["RECIPE"],
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadAbraShEnvVars(t *testing.T) {
|
||||
offline := true
|
||||
r, err := recipe.Get("abra-test-recipe", offline)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
abraShPath := fmt.Sprintf("%s/%s/%s", config.RECIPES_DIR, r.Name, "abra.sh")
|
||||
abraShEnv, err := app.ReadAbraShEnvVars(abraShPath)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if len(abraShEnv) == 0 {
|
||||
t.Error("at least one env var should be exported")
|
||||
}
|
||||
|
||||
if _, ok := abraShEnv["INNER_FOO"]; ok {
|
||||
t.Error("INNER_FOO should not be exported")
|
||||
}
|
||||
|
||||
if _, ok := abraShEnv["INNER_BAZ"]; ok {
|
||||
t.Error("INNER_BAZ should not be exported")
|
||||
}
|
||||
|
||||
if _, ok := abraShEnv["OUTER_FOO"]; !ok {
|
||||
t.Error("OUTER_FOO should be exported")
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadAbraShCmdNames(t *testing.T) {
|
||||
offline := true
|
||||
r, err := recipe.Get("abra-test-recipe", offline)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
abraShPath := fmt.Sprintf("%s/%s/%s", config.RECIPES_DIR, r.Name, "abra.sh")
|
||||
cmdNames, err := app.ReadAbraShCmdNames(abraShPath)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if len(cmdNames) == 0 {
|
||||
t.Error("at least one command name should be found")
|
||||
}
|
||||
|
||||
expectedCmdNames := []string{"test_cmd", "test_cmd_args"}
|
||||
for _, cmdName := range expectedCmdNames {
|
||||
if !slices.Contains(cmdNames, cmdName) {
|
||||
t.Fatalf("%s should have been found in %s", cmdName, abraShPath)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestCheckEnv(t *testing.T) {
|
||||
offline := true
|
||||
r, err := recipe.Get("abra-test-recipe", offline)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
envSamplePath := path.Join(config.RECIPES_DIR, r.Name, ".env.sample")
|
||||
envSample, err := app.ReadEnv(envSamplePath)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
app := app.App{
|
||||
Name: "test-app",
|
||||
Recipe: r.Name,
|
||||
Domain: "example.com",
|
||||
Env: envSample,
|
||||
Path: "example.com.env",
|
||||
Server: "example.com",
|
||||
}
|
||||
|
||||
envVars, err := appPkg.CheckEnv(app)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for _, envVar := range envVars {
|
||||
if !envVar.Present {
|
||||
t.Fatalf("%s should be present", envVar.Name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestCheckEnvError(t *testing.T) {
|
||||
offline := true
|
||||
r, err := recipe.Get("abra-test-recipe", offline)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
envSamplePath := path.Join(config.RECIPES_DIR, r.Name, ".env.sample")
|
||||
envSample, err := app.ReadEnv(envSamplePath)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
delete(envSample, "DOMAIN")
|
||||
|
||||
app := app.App{
|
||||
Name: "test-app",
|
||||
Recipe: r.Name,
|
||||
Domain: "example.com",
|
||||
Env: envSample,
|
||||
Path: "example.com.env",
|
||||
Server: "example.com",
|
||||
}
|
||||
|
||||
envVars, err := appPkg.CheckEnv(app)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for _, envVar := range envVars {
|
||||
if envVar.Name == "DOMAIN" && envVar.Present {
|
||||
t.Fatalf("%s should not be present", envVar.Name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestEnvVarCommentsRemoved(t *testing.T) {
|
||||
offline := true
|
||||
r, err := recipe.Get("abra-test-recipe", offline)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
envSamplePath := path.Join(config.RECIPES_DIR, r.Name, ".env.sample")
|
||||
envSample, err := app.ReadEnv(envSamplePath)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
envVar, exists := envSample["WITH_COMMENT"]
|
||||
if !exists {
|
||||
t.Fatal("WITH_COMMENT env var should be present in .env.sample")
|
||||
}
|
||||
|
||||
if strings.Contains(envVar, "should be removed") {
|
||||
t.Fatalf("comment from '%s' should be removed", envVar)
|
||||
}
|
||||
|
||||
envVar, exists = envSample["SECRET_TEST_PASS_TWO_VERSION"]
|
||||
if !exists {
|
||||
t.Fatal("WITH_COMMENT env var should be present in .env.sample")
|
||||
}
|
||||
|
||||
if strings.Contains(envVar, "length") {
|
||||
t.Fatal("comment from env var SECRET_TEST_PASS_TWO_VERSION should have been removed")
|
||||
}
|
||||
}
|
||||
|
||||
func TestEnvVarModifiersIncluded(t *testing.T) {
|
||||
offline := true
|
||||
r, err := recipe.Get("abra-test-recipe", offline)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
envSamplePath := path.Join(config.RECIPES_DIR, r.Name, ".env.sample")
|
||||
envSample, modifiers, err := app.ReadEnvWithModifiers(envSamplePath)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if !strings.Contains(envSample["SECRET_TEST_PASS_TWO_VERSION"], "v1") {
|
||||
t.Errorf("value should be 'v1', got: '%s'", envSample["SECRET_TEST_PASS_TWO_VERSION"])
|
||||
}
|
||||
if modifiers == nil || modifiers["SECRET_TEST_PASS_TWO_VERSION"] == nil {
|
||||
t.Errorf("no modifiers included")
|
||||
} else {
|
||||
if modifiers["SECRET_TEST_PASS_TWO_VERSION"]["length"] != "10" {
|
||||
t.Errorf("length modifier should be '10', got: '%s'", modifiers["SECRET_TEST_PASS_TWO_VERSION"]["length"])
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user