From 6722a52aba2dfa62db91b3872a3a80d44eb2b514 Mon Sep 17 00:00:00 2001 From: Spencer Smith Date: Tue, 31 Dec 2019 09:32:13 -0500 Subject: [PATCH] chore: allow re-use of docker network for local clusters This PR will allow users to use an existing docker network for their talos cluster. Hoping this will be useful for those wanting further control and configuration of their local docker clusters, as well as possibly useful for us during CI. The docker networks can be pre-created with something like: `docker network create my-cluster --subnet 192.168.0.0/24 --label talos.owned=true --label talos.cluster.name=my-cluster`. Note that the labels are pre-reqs for our discovery and re-use of these networks. Signed-off-by: Spencer Smith --- .../pkg/provision/providers/docker/network.go | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/internal/pkg/provision/providers/docker/network.go b/internal/pkg/provision/providers/docker/network.go index 79826d9a9..11d7c9544 100644 --- a/internal/pkg/provision/providers/docker/network.go +++ b/internal/pkg/provision/providers/docker/network.go @@ -6,6 +6,7 @@ package docker import ( "context" + "fmt" "strconv" "github.com/docker/docker/api/types" @@ -16,7 +17,24 @@ import ( "github.com/talos-systems/talos/internal/pkg/provision" ) +// createNetwork will take a network request and check if a network with the same name + cidr exists. +// If so, it simply returns without error and assumes we will re-use that network. Otherwise it will create a new one. func (p *provisioner) createNetwork(ctx context.Context, req provision.NetworkRequest) error { + existingNet, err := p.listNetworks(ctx, req.Name) + if err != nil { + return err + } + + // If named net already exists, see if we can reuse it + if len(existingNet) > 0 { + if existingNet[0].IPAM.Config[0].Subnet != req.CIDR.String() { + return fmt.Errorf("existing network has differing cidr: %s vs %s", existingNet[0].IPAM.Config[0].Subnet, req.CIDR.String()) + } + // CIDRs match, we'll reuse + return nil + } + + // Create new net options := types.NetworkCreate{ Labels: map[string]string{ "talos.owned": "true", @@ -34,7 +52,7 @@ func (p *provisioner) createNetwork(ctx context.Context, req provision.NetworkRe }, } - _, err := p.client.NetworkCreate(ctx, req.Name, options) + _, err = p.client.NetworkCreate(ctx, req.Name, options) return err }