Skip to content

Commit

Permalink
fix: skip connection if the DLE container is already connected to an …
Browse files Browse the repository at this point in the history
…internal network
  • Loading branch information
agneum committed Feb 7, 2022
1 parent 5d503c7 commit 9422003
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 8 deletions.
32 changes: 24 additions & 8 deletions pkg/util/networks/networks.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
}

Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
28 changes: 28 additions & 0 deletions pkg/util/networks/networks_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package networks
import (
"testing"

"github.com/docker/docker/api/types"
"github.com/stretchr/testify/assert"
)

Expand All @@ -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))
}
})
}

0 comments on commit 9422003

Please sign in to comment.