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 } }