From 0280f9d2e99b47fd778ebcae710853bcc351af43 Mon Sep 17 00:00:00 2001 From: akartasov Date: Wed, 26 Jan 2022 10:44:10 +0700 Subject: [PATCH 1/2] fix: check if DLE container is already connected to an internal network --- pkg/util/networks/networks.go | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/pkg/util/networks/networks.go b/pkg/util/networks/networks.go index d45bc8c60..261a41de4 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 } -- GitLab From b2232d692817a83c49b395a41f32d99173b86311 Mon Sep 17 00:00:00 2001 From: akartasov Date: Wed, 26 Jan 2022 17:11:46 +0700 Subject: [PATCH 2/2] add tests --- pkg/util/networks/networks_test.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/pkg/util/networks/networks_test.go b/pkg/util/networks/networks_test.go index 869bf75b3..8b8393fb6 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)) + } + }) +} -- GitLab