@@ -22,17 +22,40 @@ import (
2222 "time"
2323
2424 "github.com/stretchr/testify/assert"
25+ "github.com/stretchr/testify/require"
2526 runtime "k8s.io/cri-api/pkg/apis/runtime/v1"
2627)
2728
29+ func setupUserNSPod (t * testing.T ) {
30+ supportsUserNs := supportsUserNS () && supportsIDMap (defaultRoot ) && supportsRuncIDMap () == nil
31+ if ! supportsUserNs {
32+ t .Log ("host or runtime doesn't support userns, skipping pod setup" )
33+ return
34+ }
35+
36+ t .Log ("adding userns pods for containerd restart test" )
37+
38+ containerID := uint32 (0 )
39+ hostID := uint32 (65536 )
40+ size := uint32 (65536 )
41+
42+ sOpts := []PodSandboxOpts {WithPodUserNs (containerID , hostID , size )}
43+ sbCfg := PodSandboxConfig ("sandbox_ready_userns" , "sandbox_ready_userns" , sOpts ... )
44+ _ , err := runtimeService .RunPodSandbox (sbCfg , * runtimeHandler )
45+ assert .NoError (t , err )
46+ }
47+
2848func TestContainerdRestartSandboxRecover (t * testing.T ) {
2949 sbStatuses := map [string ]runtime.PodSandboxState {
3050 // Sandbox with unknown status will be NotReady when returned from ListPodSandbox
31- "sandbox_unknown" : runtime .PodSandboxState_SANDBOX_NOTREADY ,
32- "sandbox_not_ready" : runtime .PodSandboxState_SANDBOX_NOTREADY ,
33- "sandbox_ready" : runtime .PodSandboxState_SANDBOX_READY ,
51+ "sandbox_unknown" : runtime .PodSandboxState_SANDBOX_NOTREADY ,
52+ "sandbox_not_ready" : runtime .PodSandboxState_SANDBOX_NOTREADY ,
53+ "sandbox_ready" : runtime .PodSandboxState_SANDBOX_READY ,
54+ "sandbox_ready_userns" : runtime .PodSandboxState_SANDBOX_READY ,
3455 }
3556
57+ setupUserNSPod (t )
58+
3659 sbReadyConfig := PodSandboxConfig ("sandbox_ready" , "sandbox_ready" )
3760 _ , err := runtimeService .RunPodSandbox (sbReadyConfig , * runtimeHandler )
3861 assert .NoError (t , err )
@@ -67,6 +90,17 @@ func TestContainerdRestartSandboxRecover(t *testing.T) {
6790 foundUnkownSb = true
6891 }
6992 if status , ok := sbStatuses [sb .Metadata .Name ]; ok {
93+ // See: https://github.com/containerd/containerd/issues/10363
94+ //
95+ // Test that sandbox IP is still present after restart.
96+ if sb .State == runtime .PodSandboxState_SANDBOX_READY {
97+ status , _ , err := SandboxInfo (sb .Id )
98+ require .NoError (t , err )
99+
100+ assert .NotNil (t , status .Network )
101+ assert .NotEmpty (t , status .Network .Ip )
102+ }
103+
70104 assert .Equal (t , status , sb .State )
71105 err = runtimeService .StopPodSandbox (sb .Id )
72106 assert .NoError (t , err )
0 commit comments