@@ -1789,6 +1789,80 @@ func findProcWithName(name string) func(context.Context, *process.Process) (bool
17891789 }
17901790}
17911791
1792+ func TestOOM_Isolated (t * testing.T ) {
1793+ prepareIntegTest (t )
1794+
1795+ client , err := containerd .New (containerdSockPath , containerd .WithDefaultRuntime (firecrackerRuntime ))
1796+ require .NoError (t , err , "unable to create client to containerd service at %s, is containerd running?" , containerdSockPath )
1797+ defer client .Close ()
1798+
1799+ ctx := namespaces .WithNamespace (context .Background (), "default" )
1800+
1801+ // If we don't have enough events within 30 seconds, the context will be cancelled and the loop below will be interrupted
1802+ subscribeCtx , subscribeCancel := context .WithTimeout (ctx , 30 * time .Second )
1803+ defer subscribeCancel ()
1804+ eventCh , errCh := client .Subscribe (subscribeCtx , "topic" )
1805+
1806+ image , err := alpineImage (ctx , client , defaultSnapshotterName )
1807+ require .NoError (t , err , "failed to get alpine image" )
1808+
1809+ pluginClient , err := ttrpcutil .NewClient (containerdSockPath + ".ttrpc" )
1810+ require .NoError (t , err , "failed to create ttrpc client" )
1811+
1812+ vmID := testNameToVMID (t .Name ())
1813+
1814+ fcClient := fccontrol .NewFirecrackerClient (pluginClient .Client ())
1815+ _ , err = fcClient .CreateVM (ctx , & proto.CreateVMRequest {VMID : vmID })
1816+ require .NoError (t , err )
1817+
1818+ c , err := client .NewContainer (ctx ,
1819+ "container-" + vmID ,
1820+ containerd .WithSnapshotter (defaultSnapshotterName ),
1821+ containerd .WithNewSnapshot ("snapshot-" + vmID , image ),
1822+ containerd .WithNewSpec (
1823+ oci .WithProcessArgs ("/bin/dd" , "if=/dev/zero" , "ibs=10M" ),
1824+ firecrackeroci .WithVMID (vmID ),
1825+ oci .WithMemoryLimit (2 * 1024 * 1024 ),
1826+ ),
1827+ )
1828+ require .NoError (t , err )
1829+
1830+ task , err := c .NewTask (ctx , cio .NewCreator (cio .WithStreams (nil , os .Stdout , os .Stderr )))
1831+ require .NoError (t , err , "failed to create task for container %s" , c .ID ())
1832+
1833+ err = task .Start (ctx )
1834+ require .NoError (t , err , "failed to create task for container %s" , c .ID ())
1835+
1836+ _ , err = task .Wait (ctx )
1837+ require .NoError (t , err )
1838+
1839+ expected := []string {
1840+ "/snapshot/prepare" ,
1841+ "/snapshot/commit" ,
1842+ "/firecracker-vm/start" ,
1843+ "/snapshot/prepare" ,
1844+ "/containers/create" ,
1845+ "/tasks/create" ,
1846+ "/tasks/start" ,
1847+ "/tasks/oom" ,
1848+ "/tasks/exit" ,
1849+ }
1850+ var actual []string
1851+
1852+ loop:
1853+ for len (actual ) < len (expected ) {
1854+ select {
1855+ case event := <- eventCh :
1856+ actual = append (actual , event .Topic )
1857+ case err := <- errCh :
1858+ t .Logf ("events = %v" , actual )
1859+ assert .NoError (t , err )
1860+ break loop
1861+ }
1862+ }
1863+ require .Equal (t , expected , actual )
1864+ }
1865+
17921866func TestCreateVM_Isolated (t * testing.T ) {
17931867 prepareIntegTest (t )
17941868
0 commit comments