2021-06-30 06:03:02 +01:00
|
|
|
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"
|
2021-07-03 15:32:09 +01:00
|
|
|
"gitlab.com/dananglin/helix/internal/config"
|
|
|
|
"gitlab.com/dananglin/helix/internal/docker"
|
2021-06-30 06:03:02 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
// 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
|
|
|
|
}
|
|
|
|
}
|