@@ -2032,6 +2032,93 @@ func TestCreateVM_Isolated(t *testing.T) {
20322032 }
20332033}
20342034
2035+ func TestPauseResumeVM_Isolated (t * testing.T ) {
2036+ prepareIntegTest (t )
2037+ client , err := containerd .New (containerdSockPath , containerd .WithDefaultRuntime (firecrackerRuntime ))
2038+ require .NoError (t , err , "unable to create client to containerd service at %s, is containerd running?" , containerdSockPath )
2039+ defer client .Close ()
2040+
2041+ ctx := namespaces .WithNamespace (context .Background (), "default" )
2042+
2043+ pluginClient , err := ttrpcutil .NewClient (containerdSockPath + ".ttrpc" )
2044+ require .NoError (t , err , "failed to create ttrpc client" )
2045+
2046+ fcClient := fccontrol .NewFirecrackerClient (pluginClient .Client ())
2047+
2048+ type subtest struct {
2049+ name string
2050+ request proto.CreateVMRequest
2051+ validate func (* testing.T , error )
2052+ stopVM bool
2053+ }
2054+
2055+ subtests := []subtest {
2056+ {
2057+ name : "Happy Case" ,
2058+ request : proto.CreateVMRequest {},
2059+ validate : func (t * testing.T , err error ) {
2060+ require .NoError (t , err )
2061+ },
2062+ stopVM : true ,
2063+ },
2064+ }
2065+
2066+ runTest := func (t * testing.T , request proto.CreateVMRequest , s subtest ) {
2067+ vmID := testNameToVMID (t .Name ())
2068+
2069+ tempDir , err := ioutil .TempDir ("" , vmID )
2070+ require .NoError (t , err )
2071+ defer os .RemoveAll (tempDir )
2072+
2073+ logFile := filepath .Join (tempDir , "log.fifo" )
2074+ metricsFile := filepath .Join (tempDir , "metrics.fifo" )
2075+
2076+ request .VMID = vmID
2077+ request .LogFifoPath = logFile
2078+ request .MetricsFifoPath = metricsFile
2079+
2080+ resp , createVMErr := fcClient .CreateVM (ctx , & request )
2081+
2082+ // Even CreateVM fails, the log file and the metrics file must have some data.
2083+ requireNonEmptyFifo (t , logFile )
2084+ requireNonEmptyFifo (t , metricsFile )
2085+
2086+ // Some test cases are expected to have an error, some are not.
2087+ s .validate (t , createVMErr )
2088+
2089+ _ , errPause := fcClient .PauseVM (ctx , & proto.PauseVMRequest {VMID : request .VMID })
2090+ require .NoError (t , errPause )
2091+
2092+ _ , errResume := fcClient .ResumeVM (ctx , & proto.ResumeVMRequest {VMID : request .VMID })
2093+ require .NoError (t , errResume )
2094+
2095+ if createVMErr == nil && s .stopVM {
2096+ // Ensure the response fields are populated correctly
2097+ assert .Equal (t , request .VMID , resp .VMID )
2098+
2099+ _ , err = fcClient .StopVM (ctx , & proto.StopVMRequest {VMID : request .VMID })
2100+ require .Equal (t , status .Code (err ), codes .OK )
2101+ }
2102+ }
2103+
2104+ for _ , _s := range subtests {
2105+ s := _s
2106+ request := s .request
2107+ t .Run (s .name , func (t * testing.T ) {
2108+ runTest (t , request , s )
2109+ })
2110+
2111+ requestWithJailer := s .request
2112+ requestWithJailer .JailerConfig = & proto.JailerConfig {
2113+ UID : 30000 ,
2114+ GID : 30000 ,
2115+ }
2116+ t .Run (s .name + "/Jailer" , func (t * testing.T ) {
2117+ runTest (t , requestWithJailer , s )
2118+ })
2119+ }
2120+ }
2121+
20352122func TestAttach_Isolated (t * testing.T ) {
20362123 prepareIntegTest (t )
20372124
0 commit comments