Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion integration/addition_gids_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ func TestAdditionalGids(t *testing.T) {
if err != nil {
return false, err
}
if s.GetState() == runtime.ContainerState_CONTAINER_EXITED {
if s.Status.GetState() == runtime.ContainerState_CONTAINER_EXITED {
return true, nil
}
return false, nil
Expand Down
2 changes: 1 addition & 1 deletion integration/container_cgroup_writable_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ func TestContainerCgroupWritable(t *testing.T) {

status, err := runtimeService.ContainerStatus(cn)
require.NoError(t, err)
assert.Equal(t, status.GetState(), runtime.ContainerState_CONTAINER_RUNNING)
assert.Equal(t, status.Status.GetState(), runtime.ContainerState_CONTAINER_RUNNING)

// Execute a command to verify if cgroup is writable
_, stderr, err := runtimeService.ExecSync(cn, []string{"mkdir", "sys/fs/cgroup/dummy-group"}, 2)
Expand Down
4 changes: 2 additions & 2 deletions integration/container_log_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func TestContainerLogWithoutTailingNewLine(t *testing.T) {
if err != nil {
return false, err
}
if s.GetState() == runtime.ContainerState_CONTAINER_EXITED {
if s.Status.GetState() == runtime.ContainerState_CONTAINER_EXITED {
return true, nil
}
return false, nil
Expand Down Expand Up @@ -120,7 +120,7 @@ func TestLongContainerLog(t *testing.T) {
if err != nil {
return false, err
}
if s.GetState() == runtime.ContainerState_CONTAINER_EXITED {
if s.Status.GetState() == runtime.ContainerState_CONTAINER_EXITED {
return true, nil
}
return false, nil
Expand Down
6 changes: 3 additions & 3 deletions integration/container_stop_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ func TestSharedPidMultiProcessContainerStop(t *testing.T) {
t.Log("The container state should be exited")
s, err := runtimeService.ContainerStatus(cn)
require.NoError(t, err)
assert.Equal(t, runtime.ContainerState_CONTAINER_EXITED, s.GetState())
assert.Equal(t, runtime.ContainerState_CONTAINER_EXITED, s.Status.GetState())
})
}
}
Expand Down Expand Up @@ -117,7 +117,7 @@ func TestContainerStopCancellation(t *testing.T) {
if err != nil {
return false, err
}
return s.GetState() == runtime.ContainerState_CONTAINER_RUNNING, nil
return s.Status.GetState() == runtime.ContainerState_CONTAINER_RUNNING, nil
}, 100*time.Millisecond, 5*time.Second))

t.Log("Stop the container with 1s timeout, without shorter context timeout")
Expand All @@ -126,5 +126,5 @@ func TestContainerStopCancellation(t *testing.T) {
t.Log("The container state should be exited")
s, err := runtimeService.ContainerStatus(cn)
require.NoError(t, err)
assert.Equal(t, runtime.ContainerState_CONTAINER_EXITED, s.GetState())
assert.Equal(t, runtime.ContainerState_CONTAINER_EXITED, s.Status.GetState())
}
6 changes: 3 additions & 3 deletions integration/container_update_resources_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ func TestUpdateContainerResources_StatusUpdated(t *testing.T) {

t.Log("Check memory limit in container status")
status, err := runtimeService.ContainerStatus(cn)
checkMemoryLimitInContainerStatus(t, status, 200*1024*1024)
checkMemoryLimitInContainerStatus(t, status.Status, 200*1024*1024)
require.NoError(t, err)

t.Log("Update container memory limit after created")
Expand All @@ -336,7 +336,7 @@ func TestUpdateContainerResources_StatusUpdated(t *testing.T) {

t.Log("Check memory limit in container status")
status, err = runtimeService.ContainerStatus(cn)
checkMemoryLimitInContainerStatus(t, status, 400*1024*1024)
checkMemoryLimitInContainerStatus(t, status.Status, 400*1024*1024)
require.NoError(t, err)

t.Log("Start the container")
Expand All @@ -350,6 +350,6 @@ func TestUpdateContainerResources_StatusUpdated(t *testing.T) {

t.Log("Check memory limit in container status")
status, err = runtimeService.ContainerStatus(cn)
checkMemoryLimitInContainerStatus(t, status, 800*1024*1024)
checkMemoryLimitInContainerStatus(t, status.Status, 800*1024*1024)
require.NoError(t, err)
}
2 changes: 1 addition & 1 deletion integration/container_volume_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ func TestContainerSymlinkVolumes(t *testing.T) {
if err != nil {
return false, err
}
if s.GetState() == runtime.ContainerState_CONTAINER_EXITED {
if s.Status.GetState() == runtime.ContainerState_CONTAINER_EXITED {
return true, nil
}
return false, nil
Expand Down
4 changes: 2 additions & 2 deletions integration/container_without_image_ref_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ func TestContainerLifecycleWithoutImageRef(t *testing.T) {
t.Log("Container status should be running")
status, err := runtimeService.ContainerStatus(cn)
require.NoError(t, err)
assert.Equal(t, runtime.ContainerState_CONTAINER_RUNNING, status.GetState())
assert.Equal(t, runtime.ContainerState_CONTAINER_RUNNING, status.Status.GetState())

t.Logf("Stop container")
err = runtimeService.StopContainer(cn, 1)
Expand All @@ -62,5 +62,5 @@ func TestContainerLifecycleWithoutImageRef(t *testing.T) {
t.Log("Container status should be exited")
status, err = runtimeService.ContainerStatus(cn)
require.NoError(t, err)
assert.Equal(t, runtime.ContainerState_CONTAINER_EXITED, status.GetState())
assert.Equal(t, runtime.ContainerState_CONTAINER_EXITED, status.Status.GetState())
}
4 changes: 2 additions & 2 deletions integration/containerd_image_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,10 +155,10 @@ func TestContainerdImage(t *testing.T) {
if err != nil {
return false, err
}
if s.Resources == nil || (s.Resources.Linux == nil && s.Resources.Windows == nil) {
if s.Status.Resources == nil || (s.Status.Resources.Linux == nil && s.Status.Resources.Windows == nil) {
return false, fmt.Errorf("No Resource field in container status: %+v", s)
}
return s.GetState() == runtime.ContainerState_CONTAINER_RUNNING, nil
return s.Status.GetState() == runtime.ContainerState_CONTAINER_RUNNING, nil
}
require.NoError(t, Eventually(checkContainer, 100*time.Millisecond, 10*time.Second))
require.NoError(t, Consistently(checkContainer, 100*time.Millisecond, time.Second))
Expand Down
2 changes: 1 addition & 1 deletion integration/cri-api/pkg/apis/services.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ type ContainerManager interface {
// ListContainers lists all containers by filters.
ListContainers(filter *runtimeapi.ContainerFilter, opts ...grpc.CallOption) ([]*runtimeapi.Container, error)
// ContainerStatus returns the status of the container.
ContainerStatus(containerID string, opts ...grpc.CallOption) (*runtimeapi.ContainerStatus, error)
ContainerStatus(containerID string, opts ...grpc.CallOption) (*runtimeapi.ContainerStatusResponse, error)
// UpdateContainerResources updates the cgroup resources for the container.
UpdateContainerResources(containerID string, resources *runtimeapi.LinuxContainerResources, windowsResources *runtimeapi.WindowsContainerResources, opts ...grpc.CallOption) error
// ExecSync executes a command in the container, and returns the stdout output.
Expand Down
112 changes: 112 additions & 0 deletions integration/duplicate_name_linux_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
/*
Copyright The containerd Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package integration

import (
"encoding/json"
"os"
"os/exec"
"path/filepath"
"strconv"
"syscall"
"testing"

"github.com/containerd/containerd/v2/integration/images"
"github.com/containerd/containerd/v2/internal/cri/store/container"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
runtime "k8s.io/cri-api/pkg/apis/runtime/v1"
)

type versionedStatus struct {
// Version indicates the version of the versioned container status.
Version string
container.Status
}

// https://github.com/containerd/containerd/issues/7247
func TestDuplicateNameIssue7247(t *testing.T) {
t.Logf("Create a sandbox")
sb, sbConfig := PodSandboxConfigWithCleanup(t, "sandbox", "duplicate-name7247")

t.Logf("Create the sandbox again should fail")
_, err := runtimeService.RunPodSandbox(sbConfig, *runtimeHandler)
require.Error(t, err)

pauseImage := images.Get(images.Pause)
EnsureImageExists(t, pauseImage)

t.Logf("Create a container")

var (
testImage = images.Get(images.BusyBox)
containerName = "test-container"
)

EnsureImageExists(t, testImage)

cnConfig := ContainerConfig(
containerName,
testImage,
WithCommand("sh", "-c", "sleep 1000"),
)

cID, err := runtimeService.CreateContainer(sb, cnConfig, sbConfig)
require.NoError(t, err)
err = runtimeService.StartContainer(cID)
require.NoError(t, err)

status, err := runtimeService.ContainerStatus(cID)
require.NoError(t, err)
assert.Equal(t, status.Status.GetState(), runtime.ContainerState_CONTAINER_RUNNING)

cfg := criRuntimeInfo(t, runtimeService)
rootDir := cfg["rootDir"].(string)
containerDir := filepath.Join(rootDir, "containers", cID)
statusDir := filepath.Join(containerDir, "status")

versioned := &versionedStatus{}
data, err := os.ReadFile(statusDir)
require.NoError(t, err)
err = json.Unmarshal(data, versioned)
require.NoError(t, err)
pid := strconv.Itoa(int(versioned.Pid))

t.Logf("containerid is %s", cID)
t.Logf("pid is %s", pid)
_, err = exec.Command("chattr", "+i", statusDir).CombinedOutput()
require.NoError(t, err)
StopContainerd(t, syscall.SIGTERM)
status.GetInfo()
t.Logf("status is %v", status)

//kill pid make sure container status changed
info := status.GetInfo()
t.Logf("info is %v", info)
_, err = exec.Command("kill", "-9", pid).CombinedOutput()
require.NoError(t, err)
// if can't update status info status file, containerd will exited.
StartContainerd(t)
//let status file can be writed
_, err = exec.Command("chattr", "-i", statusDir).CombinedOutput()
require.NoError(t, err)
StartContainerd(t)

t.Logf("Create the container again should fail")
_, err = runtimeService.CreateContainer(sb, cnConfig, sbConfig)
require.Error(t, err)
}
2 changes: 1 addition & 1 deletion integration/image_load_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,5 +88,5 @@ func TestImageLoad(t *testing.T) {
t.Logf("make sure container is running")
status, err := runtimeService.ContainerStatus(cn)
require.NoError(t, err)
require.Equal(t, runtime.ContainerState_CONTAINER_RUNNING, status.State)
require.Equal(t, runtime.ContainerState_CONTAINER_RUNNING, status.Status.State)
}
4 changes: 2 additions & 2 deletions integration/image_mount_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ func testImageMountSELinux(t *testing.T, testImage, testMountImage, mountPath st
if err != nil {
return false, err
}
if s.GetState() == criruntime.ContainerState_CONTAINER_EXITED {
if s.Status.GetState() == criruntime.ContainerState_CONTAINER_EXITED {
return true, nil
}
return false, nil
Expand Down Expand Up @@ -149,7 +149,7 @@ func testImageMount(t *testing.T, testImage, testMountImage, mountPath string, c
if err != nil {
return false, err
}
if s.GetState() == criruntime.ContainerState_CONTAINER_EXITED {
if s.Status.GetState() == criruntime.ContainerState_CONTAINER_EXITED {
return true, nil
}
return false, nil
Expand Down
26 changes: 26 additions & 0 deletions integration/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,32 @@ func RestartContainerd(t *testing.T, signal syscall.Signal) {
}, time.Second, 30*time.Second), "wait for containerd to be restarted")
}

func StopContainerd(t *testing.T, signal syscall.Signal) {
require.NoError(t, KillProcess(*containerdBin, signal))

// Use assert so that the 3rd wait always runs, this makes sure
// containerd is running before this function returns.
assert.NoError(t, Eventually(func() (bool, error) {
pid, err := PidOf(*containerdBin)
if err != nil {
return false, err
}
return pid == 0, nil
}, time.Second, 30*time.Second), "wait for containerd to be killed")
}

func StartContainerd(t *testing.T) {
require.NoError(t, Eventually(func() (bool, error) {
return ConnectDaemons() == nil, nil
}, time.Second, 30*time.Second), "wait for containerd to be restarted")
}

func StartContainerdFailed(t *testing.T) {
require.Error(t, Eventually(func() (bool, error) {
return ConnectDaemons() == nil, nil
}, time.Second, 30*time.Second), "wait for containerd to be restarted")
}

// EnsureImageExists pulls the given image, ensures that no error was encountered
// while pulling it.
func EnsureImageExists(t *testing.T, imageName string) string {
Expand Down
2 changes: 1 addition & 1 deletion integration/pod_dualstack_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ func TestPodDualStack(t *testing.T) {
if err != nil {
return false, err
}
if s.GetState() == runtime.ContainerState_CONTAINER_EXITED {
if s.Status.GetState() == runtime.ContainerState_CONTAINER_EXITED {
return true, nil
}
return false, nil
Expand Down
2 changes: 1 addition & 1 deletion integration/pod_hostname_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ func TestPodHostname(t *testing.T) {
if err != nil {
return false, err
}
if s.GetState() == runtime.ContainerState_CONTAINER_EXITED {
if s.Status.GetState() == runtime.ContainerState_CONTAINER_EXITED {
return true, nil
}
return false, nil
Expand Down
4 changes: 2 additions & 2 deletions integration/pod_userns_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ func TestPodUserNS(t *testing.T) {
if err != nil {
return false, err
}
if s.GetState() == runtime.ContainerState_CONTAINER_EXITED {
if s.Status.GetState() == runtime.ContainerState_CONTAINER_EXITED {
return true, nil
}
return false, nil
Expand Down Expand Up @@ -410,7 +410,7 @@ func TestIssue10598(t *testing.T) {
return false, err
}

if state := s.GetState(); state != runtime.ContainerState_CONTAINER_RUNNING {
if state := s.Status.GetState(); state != runtime.ContainerState_CONTAINER_RUNNING {
return false, fmt.Errorf("%s is not running\nstate: %s\nlog: %s",
containerName, state, string(content))
}
Expand Down
4 changes: 2 additions & 2 deletions integration/release_upgrade_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -533,7 +533,7 @@ func (pCtx *podTCtx) containerDataDir(cntrID string) string {
cfg := criRuntimeInfo(t, pCtx.rSvc)

rootDir := cfg["rootDir"].(string)
return filepath.Join(rootDir, "containers", status.Id)
return filepath.Join(rootDir, "containers", status.Status.Id)
}

// shimPid returns shim's pid.
Expand Down Expand Up @@ -589,7 +589,7 @@ func checkContainerState(t *testing.T, svc cri.RuntimeService, name string, expe
t.Logf("Checking container %s state", name)
status, err := svc.ContainerStatus(name)
require.NoError(t, err)
assert.Equal(t, expected, status.State)
assert.Equal(t, expected, status.Status.State)
}

// pullImagesByCRI pulls images by CRI.
Expand Down
4 changes: 2 additions & 2 deletions integration/remote/remote_runtime.go
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ func (r *RuntimeService) ListContainers(filter *runtimeapi.ContainerFilter, opts
}

// ContainerStatus returns the container status.
func (r *RuntimeService) ContainerStatus(containerID string, opts ...grpc.CallOption) (*runtimeapi.ContainerStatus, error) {
func (r *RuntimeService) ContainerStatus(containerID string, opts ...grpc.CallOption) (*runtimeapi.ContainerStatusResponse, error) {
klog.V(10).Infof("[RuntimeService] ContainerStatus (containerID=%v, timeout=%v)", containerID, r.timeout)
ctx, cancel := getContextWithTimeout(r.timeout)
defer cancel()
Expand All @@ -359,7 +359,7 @@ func (r *RuntimeService) ContainerStatus(containerID string, opts ...grpc.CallOp
}
}

return resp.Status, nil
return resp, nil
}

// UpdateContainerResources updates a containers resource config
Expand Down
2 changes: 1 addition & 1 deletion integration/truncindex_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ func TestTruncIndex(t *testing.T) {
t.Logf("Get container status by truncindex")
cStatus, err := runtimeService.ContainerStatus(cnTruncIndex)
require.NoError(t, err)
assert.Equal(t, cn, cStatus.Id)
assert.Equal(t, cn, cStatus.Status.Id)

t.Logf("Start the container")
require.NoError(t, runtimeService.StartContainer(cnTruncIndex))
Expand Down
2 changes: 1 addition & 1 deletion integration/windows_device_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func TestWindowsDevice(t *testing.T) {
if err != nil {
return false, err
}
if s.GetState() == runtime.ContainerState_CONTAINER_EXITED {
if s.Status.GetState() == runtime.ContainerState_CONTAINER_EXITED {
return true, nil
}
return false, nil
Expand Down
Loading
Loading