From 94220037c444919fb59020b03f71449186976e12 Mon Sep 17 00:00:00 2001 From: Artyom Kartasov Date: Mon, 7 Feb 2022 08:58:37 +0000 Subject: [PATCH] fix: skip connection if the DLE container is already connected to an internal network --- pkg/util/networks/networks.go | 32 ++++++++++++++++++++++-------- pkg/util/networks/networks_test.go | 28 ++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/pkg/util/networks/networks.go b/pkg/util/networks/networks.go index d45bc8c6..261a41de 100644 --- a/pkg/util/networks/networks.go +++ b/pkg/util/networks/networks.go @@ -28,15 +28,19 @@ const ( ) // Setup creates a new internal Docker network and connects container to it. -func Setup(ctx context.Context, dockerCLI *client.Client, instanceID, containerID string) (string, error) { +func Setup(ctx context.Context, dockerCLI *client.Client, instanceID, containerName string) (string, error) { networkName := getNetworkName(instanceID) log.Dbg("Discovering internal network:", networkName) networkResource, err := dockerCLI.NetworkInspect(ctx, networkName, types.NetworkInspectOptions{}) if err == nil { - if err := dockerCLI.NetworkConnect(ctx, networkResource.ID, containerID, &network.EndpointSettings{}); err != nil { - return "", err + if !hasContainerConnected(networkResource, containerName) { + if err := dockerCLI.NetworkConnect(ctx, networkResource.ID, containerName, &network.EndpointSettings{}); err != nil { + return "", err + } + + log.Dbg(fmt.Sprintf("Container %s has been connected to %s", containerName, networkName)) } return networkResource.ID, nil @@ -61,7 +65,7 @@ func Setup(ctx context.Context, dockerCLI *client.Client, instanceID, containerI log.Dbg("A new internal network has been created:", internalNetwork.ID) - if err := dockerCLI.NetworkConnect(ctx, internalNetwork.ID, containerID, &network.EndpointSettings{}); err != nil { + if err := dockerCLI.NetworkConnect(ctx, internalNetwork.ID, containerName, &network.EndpointSettings{}); err != nil { return "", err } @@ -108,11 +112,13 @@ func Connect(ctx context.Context, dockerCLI *client.Client, instanceID, containe return fmt.Errorf("internal network not found: %w", err) } - if err := dockerCLI.NetworkConnect(ctx, networkResource.ID, containerID, &network.EndpointSettings{}); err != nil { - return err - } + if !hasContainerConnected(networkResource, containerID) { + if err := dockerCLI.NetworkConnect(ctx, networkResource.ID, containerID, &network.EndpointSettings{}); err != nil { + return err + } - log.Dbg(fmt.Sprintf("Container %s has been connected to %s", instanceID, networkName)) + log.Dbg(fmt.Sprintf("Container %s has been connected to %s", instanceID, networkName)) + } return nil } @@ -147,6 +153,16 @@ func Reconnect(ctx context.Context, dockerCLI *client.Client, instanceID, contai return nil } +func hasContainerConnected(networkResource types.NetworkResource, containerID string) bool { + for _, container := range networkResource.Containers { + if container.Name == containerID { + return true + } + } + + return false +} + func getNetworkName(instanceID string) string { return networkPrefix + instanceID } diff --git a/pkg/util/networks/networks_test.go b/pkg/util/networks/networks_test.go index 869bf75b..8b8393fb 100644 --- a/pkg/util/networks/networks_test.go +++ b/pkg/util/networks/networks_test.go @@ -7,6 +7,7 @@ package networks import ( "testing" + "github.com/docker/docker/api/types" "github.com/stretchr/testify/assert" ) @@ -17,3 +18,30 @@ func TestInternalNetworks(t *testing.T) { assert.Equal(t, "dle_network_testInstanceID", getNetworkName(instanceID)) }) } + +func TestIfContainerConnected(t *testing.T) { + t.Run("test if container connected", func(t *testing.T) { + resource := types.NetworkResource{ + Containers: map[string]types.EndpointResource{ + "testID": {Name: "test_server"}, + }, + } + testCases := []struct { + containerName string + result bool + }{ + { + containerName: "test_server", + result: true, + }, + { + containerName: "not_connected_server", + result: false, + }, + } + + for _, tc := range testCases { + assert.Equal(t, tc.result, hasContainerConnected(resource, tc.containerName)) + } + }) +}