forked from toolshed/abra
67 lines
1.6 KiB
Go
67 lines
1.6 KiB
Go
package stack // https://github.com/docker/cli/blob/master/cli/command/stack/loader/loader.go
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
|
|
"coopcloud.tech/abra/pkg/i18n"
|
|
composeGoCli "github.com/compose-spec/compose-go/v2/cli"
|
|
composeGoTypes "github.com/compose-spec/compose-go/v2/types"
|
|
"github.com/pkg/errors"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type LoadConf struct {
|
|
ComposeFiles []string
|
|
AppEnv map[string]string
|
|
}
|
|
|
|
func LoadCompose(conf LoadConf) (*composeGoTypes.Project, error) {
|
|
var project *composeGoTypes.Project
|
|
|
|
// NOTE(d1): silence compose-go internal logger
|
|
logrus.SetOutput(io.Discard)
|
|
|
|
var projectOptions *composeGoCli.ProjectOptions
|
|
if len(conf.ComposeFiles) == 0 {
|
|
return project, errors.New(i18n.G("LoadCompose: provide compose files"))
|
|
}
|
|
|
|
if len(conf.AppEnv) == 0 {
|
|
var err error
|
|
projectOptions, err = composeGoCli.NewProjectOptions(
|
|
conf.ComposeFiles,
|
|
composeGoCli.WithInterpolation(false),
|
|
)
|
|
if err != nil {
|
|
return project, err
|
|
}
|
|
} else {
|
|
var env []string
|
|
for k, v := range conf.AppEnv {
|
|
env = append(env, fmt.Sprintf("%s=%s", k, v))
|
|
}
|
|
|
|
var err error
|
|
newProjectOptions := []composeGoCli.ProjectOptionsFn{
|
|
composeGoCli.WithEnv(env),
|
|
}
|
|
stackName, ok := conf.AppEnv["STACK_NAME"]
|
|
if ok && stackName != "" {
|
|
newProjectOptions = append(newProjectOptions, composeGoCli.WithName(stackName))
|
|
}
|
|
projectOptions, err = composeGoCli.NewProjectOptions(conf.ComposeFiles, newProjectOptions...)
|
|
if err != nil {
|
|
return project, err
|
|
}
|
|
}
|
|
|
|
project, err := projectOptions.LoadProject(context.Background())
|
|
if err != nil {
|
|
return project, err
|
|
}
|
|
|
|
return project, nil
|
|
}
|