wisski-cloud-distillery/internal/dis/component/binder/binder.go
Tom Wiesing e969351f8e
config/network: Prepare for multiple networks
This commit futures proofs the code to allow for usage of more than one
docker network.
2023-03-13 10:11:28 +01:00

88 lines
1.9 KiB
Go

package binder
import (
"bytes"
"embed"
"io"
"path/filepath"
"github.com/FAU-CDI/wisski-distillery/internal/dis/component"
"github.com/tkw1536/pkglib/yamlx"
"gopkg.in/yaml.v3"
)
type Binder struct {
component.Base
}
var (
_ component.Installable = (*Binder)(nil)
)
func (binder *Binder) Path() string {
return filepath.Join(binder.Still.Config.Paths.Root, "core", "binder")
}
func (binder *Binder) Context(parent component.InstallationContext) component.InstallationContext {
return parent
}
//go:embed docker-compose.yml
var composeTemplate []byte
func (binder *Binder) buildYML() ([]byte, error) {
var dockerCompose yaml.Node
if err := yaml.Unmarshal(composeTemplate, &dockerCompose); err != nil {
return nil, err
}
for dockerCompose.Kind == yaml.DocumentNode {
dockerCompose = *dockerCompose.Content[0]
}
{
ports := binder.Config.Listen.ComposePorts("8000")
portsNode, err := yamlx.Marshal(ports)
if err != nil {
return nil, err
}
if err := yamlx.Replace(&dockerCompose, *portsNode, "services", "binder", "ports"); err != nil {
return nil, err
}
}
{
command := binder.Config.HTTP.TCPMuxCommand("0.0.0.0:8000", "http:80", "http:443", "ssh:2222")
commandNode, err := yamlx.Marshal(command)
if err != nil {
return nil, err
}
if err := yamlx.Replace(&dockerCompose, *commandNode, "services", "binder", "command"); err != nil {
return nil, err
}
}
// do the final marshal
return yaml.Marshal(dockerCompose)
}
//go:embed binder.env
var resources embed.FS
func (binder *Binder) Stack() component.StackWithResources {
return component.MakeStack(binder, component.StackWithResources{
Resources: resources,
EnvPath: "binder.env",
ReadComposeFile: func() (io.Reader, error) {
data, err := binder.buildYML()
if err != nil {
return nil, err
}
return bytes.NewReader(data), nil
},
EnvContext: map[string]string{
"DOCKER_NETWORK_NAME": binder.Config.Docker.Network(),
},
})
}