This repository has been archived on 2023-05-06. You can view files and clone it, but cannot push or open issues or pull requests.
helix/internal/stacks/docker_network.go

86 lines
2.4 KiB
Go

package stacks
import (
"context"
"fmt"
"os"
"github.com/pulumi/pulumi/sdk/v3/go/auto"
"github.com/pulumi/pulumi/sdk/v3/go/auto/optdestroy"
"github.com/pulumi/pulumi/sdk/v3/go/auto/optpreview"
"github.com/pulumi/pulumi/sdk/v3/go/auto/optup"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
"gitlab.com/dananglin/forge-platform/internal/config"
"gitlab.com/dananglin/forge-platform/internal/docker"
)
// DockerNetworkStack is a stack for
// managing the Docker network.
type DockerNetworkStack struct {
Name string
Stack auto.Stack
}
// newDockerNetworkStack creates a new DockerNetworkStack value.
func newDockerNetworkStack(ctx context.Context, project, stack string, args config.DockerNetworkConfig) (*DockerNetworkStack, error) {
deployFunc := deployDockerNetworkStack(args.Name, args.Subnet, args.Driver)
s, err := createOrSelectStack(ctx, project, stack, deployFunc)
if err != nil {
return nil, fmt.Errorf("unable to initialise the '%s' stack...\n%w", stack, err)
}
n := DockerNetworkStack{
Name: stack,
Stack: s,
}
return &n, nil
}
func (d *DockerNetworkStack) Preview(ctx context.Context) error {
stdoutStreamer := optpreview.ProgressStreams(os.Stdout)
_, err := d.Stack.Preview(ctx, stdoutStreamer)
if err != nil {
return fmt.Errorf("unable to preview the '%s' stack...\n%w", d.Name, err)
}
return nil
}
func (d *DockerNetworkStack) Update(ctx context.Context) error {
stdoutStreamer := optup.ProgressStreams(os.Stdout)
_, err := d.Stack.Up(ctx, stdoutStreamer)
if err != nil {
return fmt.Errorf("unable to update the '%s' stack...\n%w", d.Name, err)
}
return nil
}
func (d *DockerNetworkStack) Destroy(ctx context.Context) error {
stdoutStreamer := optdestroy.ProgressStreams(os.Stdout)
_, err := d.Stack.Destroy(ctx, stdoutStreamer)
if err != nil {
return fmt.Errorf("unable to destroy the '%s' stack...\n%w", d.Name, err)
}
return nil
}
// DeployDockerNetworkStack returns a Pulumi run function
// that deploys the Docker network stack.
func deployDockerNetworkStack(name, subnet, driver string) pulumi.RunFunc {
return func(ctx *pulumi.Context) error {
config := docker.DockerNetworkConfig{
Name: pulumi.String(name),
Subnet: pulumi.String(subnet),
Driver: pulumi.String(driver),
}
if err := docker.CreateNetwork(ctx, config); err != nil {
return fmt.Errorf("unable to complete the deployment...\n%w", err)
}
return nil
}
}