mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 11:50:44 +00:00
Add unit test for the work around.
This commit is contained in:
parent
1b1b444c46
commit
90e91a8989
@ -19,6 +19,7 @@ package dockershim
|
||||
import (
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@ -215,3 +216,69 @@ func TestContainerLogPath(t *testing.T) {
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, fakeOS.Removes, []string{kubeletContainerLogPath})
|
||||
}
|
||||
|
||||
// TestContainerCreationConflict tests the logic to work around docker container
|
||||
// creation naming conflict bug.
|
||||
func TestContainerCreationConflict(t *testing.T) {
|
||||
sConfig := makeSandboxConfig("foo", "bar", "1", 0)
|
||||
config := makeContainerConfig(sConfig, "pause", "iamimage", 0, map[string]string{}, map[string]string{})
|
||||
containerName := makeContainerName(sConfig, config)
|
||||
const sandboxId = "sandboxid"
|
||||
const containerId = "containerid"
|
||||
conflictError := fmt.Errorf("Error response from daemon: Conflict. The name \"/%s\" is already in use by container %s. You have to remove (or rename) that container to be able to reuse that name.",
|
||||
containerName, containerId)
|
||||
noContainerError := fmt.Errorf("Error response from daemon: No such container: %s", containerId)
|
||||
randomError := fmt.Errorf("random error")
|
||||
|
||||
for desc, test := range map[string]struct {
|
||||
createError error
|
||||
removeError error
|
||||
expectError error
|
||||
expectCalls []string
|
||||
expectFields int
|
||||
}{
|
||||
"no create error": {
|
||||
expectCalls: []string{"create"},
|
||||
expectFields: 6,
|
||||
},
|
||||
"random create error": {
|
||||
createError: randomError,
|
||||
expectError: randomError,
|
||||
expectCalls: []string{"create"},
|
||||
expectFields: 1,
|
||||
},
|
||||
"conflict create error with successful remove": {
|
||||
createError: conflictError,
|
||||
expectError: conflictError,
|
||||
expectCalls: []string{"create", "remove"},
|
||||
expectFields: 1,
|
||||
},
|
||||
"conflict create error with random remove error": {
|
||||
createError: conflictError,
|
||||
removeError: randomError,
|
||||
expectError: conflictError,
|
||||
expectCalls: []string{"create", "remove"},
|
||||
expectFields: 1,
|
||||
},
|
||||
"conflict create error with no such container remove error": {
|
||||
createError: conflictError,
|
||||
removeError: noContainerError,
|
||||
expectCalls: []string{"create", "remove", "create"},
|
||||
expectFields: 7,
|
||||
},
|
||||
} {
|
||||
t.Logf("TestCase: %s", desc)
|
||||
ds, fDocker, _ := newTestDockerService()
|
||||
|
||||
if test.createError != nil {
|
||||
fDocker.InjectError("create", test.createError)
|
||||
}
|
||||
if test.removeError != nil {
|
||||
fDocker.InjectError("remove", test.removeError)
|
||||
}
|
||||
name, err := ds.CreateContainer(sandboxId, config, sConfig)
|
||||
assert.Equal(t, test.expectError, err)
|
||||
assert.NoError(t, fDocker.AssertCalls(test.expectCalls))
|
||||
assert.Len(t, strings.Split(name, nameDelimiter), test.expectFields)
|
||||
}
|
||||
}
|
||||
|
@ -236,3 +236,12 @@ func TestParsingCreationConflictError(t *testing.T) {
|
||||
require.Len(t, matches, 2)
|
||||
require.Equal(t, matches[1], "24666ab8c814d16f986449e504ea0159468ddf8da01897144a770f66dce0e14e")
|
||||
}
|
||||
|
||||
func TestParsingRemovalNoContainerError(t *testing.T) {
|
||||
// Expected error message from docker.
|
||||
match := "Error response from daemon: No such container: 96e914f31579e44fe49b239266385330a9b2125abeb9254badd9fca74580c95a"
|
||||
notMatch := "Error response from daemon: Other errors"
|
||||
|
||||
assert.True(t, noContainerRE.MatchString(match))
|
||||
assert.False(t, noContainerRE.MatchString(notMatch))
|
||||
}
|
||||
|
@ -82,3 +82,25 @@ func TestNonParsableContainerNames(t *testing.T) {
|
||||
_, err = parseContainerName("k8s_frontend_foo_bar_iamuid_notanumber")
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
func TestParseRandomizedNames(t *testing.T) {
|
||||
// Test randomized sandbox name.
|
||||
sConfig := makeSandboxConfig("foo", "bar", "iamuid", 3)
|
||||
sActualName := randomizeName(makeSandboxName(sConfig))
|
||||
sActualMetadata, err := parseSandboxName(sActualName)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, sConfig.Metadata, sActualMetadata)
|
||||
|
||||
// Test randomized container name.
|
||||
name, attempt := "pause", uint32(5)
|
||||
config := &runtimeapi.ContainerConfig{
|
||||
Metadata: &runtimeapi.ContainerMetadata{
|
||||
Name: name,
|
||||
Attempt: attempt,
|
||||
},
|
||||
}
|
||||
actualName := randomizeName(makeContainerName(sConfig, config))
|
||||
actualMetadata, err := parseContainerName(actualName)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, config.Metadata, actualMetadata)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user