From 99cf3dca174e793d93f783bca79fff5918d409be Mon Sep 17 00:00:00 2001 From: Dan Anglin Date: Sun, 11 Jul 2021 10:49:53 +0100 Subject: [PATCH] feat: the docker stack Here we rename the containers stack to the docker stack. The docker_network stack is now deleted and the docker network is now managed in the docker stack. --- internal/docker/network.go | 18 +++- internal/stacks/{containers.go => docker.go} | 49 +++++++---- internal/stacks/docker_network.go | 86 -------------------- internal/stacks/{manage.go => management.go} | 30 ++----- 4 files changed, 53 insertions(+), 130 deletions(-) rename internal/stacks/{containers.go => docker.go} (65%) delete mode 100644 internal/stacks/docker_network.go rename internal/stacks/{manage.go => management.go} (76%) diff --git a/internal/docker/network.go b/internal/docker/network.go index 7de0f12..4218fd4 100644 --- a/internal/docker/network.go +++ b/internal/docker/network.go @@ -15,8 +15,14 @@ type DockerNetworkConfig struct { Driver pulumi.StringInput } +type DockerNetworkResults struct { + Name pulumi.StringOutput +} + // CreateNetwork creates the forge platform's Docker network. -func CreateNetwork(ctx *pulumi.Context, c DockerNetworkConfig) error { +func CreateNetwork(ctx *pulumi.Context, c DockerNetworkConfig) (DockerNetworkResults, error) { + var result DockerNetworkResults + args := docker.NetworkArgs{ Name: c.Name, IpamDriver: c.Driver, @@ -27,10 +33,14 @@ func CreateNetwork(ctx *pulumi.Context, c DockerNetworkConfig) error { }, } - _, err := docker.NewNetwork(ctx, "docker_network", &args) + n, err := docker.NewNetwork(ctx, "docker_network", &args) if err != nil { - return fmt.Errorf("unable to create the docker network...\n%w", err) + return result, fmt.Errorf("unable to create the docker network...\n%w", err) } - return nil + result = DockerNetworkResults{ + Name: n.Name, + } + + return result, nil } diff --git a/internal/stacks/containers.go b/internal/stacks/docker.go similarity index 65% rename from internal/stacks/containers.go rename to internal/stacks/docker.go index a733d24..ec67b70 100644 --- a/internal/stacks/containers.go +++ b/internal/stacks/docker.go @@ -16,9 +16,9 @@ import ( "gitlab.com/dananglin/helix/internal/docker" ) -// ContainerStack is a stack for managing the containers +// DockerStack is a stack for managing the containers // for the forge platform. -type ContainerStack struct { +type DockerStack struct { Name string Stack auto.Stack } @@ -30,24 +30,24 @@ var templateTraefikDockerfile string var templateTraefikStaticConfig string // newContainerStack creates the ContainerStack value. -func newContainerStack(ctx context.Context, project, stack, dockerNetwork string, conf config.TraefikConfig) (*ContainerStack, error) { - deployFunc := deployContainerStack(project, dockerNetwork, conf) +func newDockerStack(ctx context.Context, project, stack string, c config.Config) (*DockerStack, error) { + deployFunc := deployDockerStack(project, c.Docker.Network, c.Services) s, err := createOrSelectStack(ctx, project, stack, deployFunc) if err != nil { return nil, fmt.Errorf("unable to initialise the '%s' stack...\n%w", stack, err) } - c := ContainerStack{ + d := DockerStack{ Name: stack, Stack: s, } - return &c, nil + return &d, nil } // Preview the proposed changes to the container stack. -func (c *ContainerStack) Preview(ctx context.Context) error { +func (c *DockerStack) Preview(ctx context.Context) error { streamer := optpreview.ProgressStreams(os.Stdout) _, err := c.Stack.Preview(ctx, streamer) if err != nil { @@ -57,7 +57,7 @@ func (c *ContainerStack) Preview(ctx context.Context) error { } // Update the container stack. -func (c *ContainerStack) Update(ctx context.Context) error { +func (c *DockerStack) Update(ctx context.Context) error { streamer := optup.ProgressStreams(os.Stdout) _, err := c.Stack.Up(ctx, streamer) if err != nil { @@ -67,7 +67,7 @@ func (c *ContainerStack) Update(ctx context.Context) error { } // Destroy the container stack. -func (c *ContainerStack) Destroy(ctx context.Context) error { +func (c *DockerStack) Destroy(ctx context.Context) error { streamer := optdestroy.ProgressStreams(os.Stdout) _, err := c.Stack.Destroy(ctx, streamer) if err != nil { @@ -76,26 +76,41 @@ func (c *ContainerStack) Destroy(ctx context.Context) error { return nil } -// deployContainerStack returns a Pulumi run function -// that is used to deploy the container stack. -func deployContainerStack(project, dockerNetwork string, t config.TraefikConfig) pulumi.RunFunc { +// deployDockerStack returns a Pulumi run function +// that is used to deploy the docker stack. +func deployDockerStack(project string, network config.DockerNetworkConfig, services config.ServicesConfig) pulumi.RunFunc { return func(ctx *pulumi.Context) error { + // TODO: Create the provider when we start playing with remote hosts + + // Create the docker network + config := docker.DockerNetworkConfig{ + Name: pulumi.String(network.Name), + Subnet: pulumi.String(network.Subnet), + Driver: pulumi.String(network.Driver), + } + + network, err := docker.CreateNetwork(ctx, config) + if err != nil { + return err + } + base_cache, err := os.UserCacheDir() if err != nil { return fmt.Errorf("unable to get the base cache directory...\n%w", err) } + // Create the Traefik service traefikContextDir := filepath.Join(base_cache, "helix", project, "traefik") if err := os.MkdirAll(traefikContextDir, 0700); err != nil { return fmt.Errorf("unable to make the cache directory for traefik...\n%w", err) } - if err := generateFile(t, templateTraefikDockerfile, "traefikDocker", filepath.Join(traefikContextDir, "Dockerfile")); err != nil { + if err := generateFile(services.Traefik, templateTraefikDockerfile, "traefikDocker", filepath.Join(traefikContextDir, "Dockerfile")); err != nil { return fmt.Errorf("unable to generate the Traefik Dockerfile from template...\n%w", err) } - if err := generateFile(t, templateTraefikStaticConfig, "traefikStaticConf", filepath.Join(traefikContextDir, "traefik.yml")); err != nil { + if err := generateFile(services.Traefik, templateTraefikStaticConfig, "traefikStaticConf", filepath.Join(traefikContextDir, "traefik.yml")); err != nil { return fmt.Errorf("unable to generate the Traefik static configuration from template...\n%w", err) } @@ -103,7 +118,7 @@ func deployContainerStack(project, dockerNetwork string, t config.TraefikConfig) BuildContext: pulumi.String(traefikContextDir), Dockerfile: pulumi.String(filepath.Join(traefikContextDir, "Dockerfile")), ImageName: pulumi.String("helix-traefik"), - ImageTag: pulumi.String(t.Version), + ImageTag: pulumi.String(services.Traefik.Version), UniqueLabel: "traefik-image", } @@ -114,9 +129,9 @@ func deployContainerStack(project, dockerNetwork string, t config.TraefikConfig) traefikContainerInput := docker.DockerContainerInput{ Image: traefikImage.ImageName, - Ipv4Address: pulumi.String(t.ContainerIp), + Ipv4Address: pulumi.String(services.Traefik.ContainerIp), Name: pulumi.String("helix-traefik"), - Network: pulumi.String(dockerNetwork), + Network: network.Name, UniqueLabel: "traefik-container", } diff --git a/internal/stacks/docker_network.go b/internal/stacks/docker_network.go deleted file mode 100644 index dbb7d4d..0000000 --- a/internal/stacks/docker_network.go +++ /dev/null @@ -1,86 +0,0 @@ -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/helix/internal/config" - "gitlab.com/dananglin/helix/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 - } -} diff --git a/internal/stacks/manage.go b/internal/stacks/management.go similarity index 76% rename from internal/stacks/manage.go rename to internal/stacks/management.go index ee2ddfa..0ee87c8 100644 --- a/internal/stacks/manage.go +++ b/internal/stacks/management.go @@ -15,8 +15,7 @@ import ( ) const ( - dockerNetworkStackName string = "docker_network" - containerStackName string = "containers" + dockerStackName string = "docker" ) type Previewer interface { @@ -36,13 +35,8 @@ func NewPreviewer(ctx context.Context, stack string, c config.Config) (Previewer var err error switch stack { - case dockerNetworkStackName: - p, err = newDockerNetworkStack(ctx, c.ProjectName, stack, c.Docker.Network) - if err != nil { - return nil, fmt.Errorf("unable to initialise '%s' stack...\n%w", stack, err) - } - case containerStackName: - p, err = newContainerStack(ctx, c.ProjectName, stack, c.Docker.Network.Name, c.Services.Traefik) + case dockerStackName: + p, err = newDockerStack(ctx, c.ProjectName, stack, c) if err != nil { return nil, fmt.Errorf("unable to initialise '%s' stack...\n%w", stack, err) } @@ -58,13 +52,8 @@ func NewUpdater(ctx context.Context, stack string, c config.Config) (Updater, er var err error switch stack { - case dockerNetworkStackName: - u, err = newDockerNetworkStack(ctx, c.ProjectName, stack, c.Docker.Network) - if err != nil { - return nil, fmt.Errorf("unable to initialise '%s' stack...\n%w", stack, err) - } - case containerStackName: - u, err = newContainerStack(ctx, c.ProjectName, stack, c.Docker.Network.Name, c.Services.Traefik) + case dockerStackName: + u, err = newDockerStack(ctx, c.ProjectName, stack, c) if err != nil { return nil, fmt.Errorf("unable to initialise '%s' stack...\n%w", stack, err) } @@ -80,13 +69,8 @@ func NewDestroyer(ctx context.Context, stack string, c config.Config) (Destroyer var err error switch stack { - case dockerNetworkStackName: - d, err = newDockerNetworkStack(ctx, c.ProjectName, stack, c.Docker.Network) - if err != nil { - return nil, fmt.Errorf("unable to initialise '%s' stack...\n%w", stack, err) - } - case containerStackName: - d, err = newContainerStack(ctx, c.ProjectName, stack, c.Docker.Network.Name, c.Services.Traefik) + case dockerStackName: + d, err = newDockerStack(ctx, c.ProjectName, stack, c) if err != nil { return nil, fmt.Errorf("unable to initialise '%s' stack...\n%w", stack, err) }