@@ -1789,6 +1789,80 @@ func findProcWithName(name string) func(context.Context, *process.Process) (bool
1789
1789
}
1790
1790
}
1791
1791
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
+
1792
1866
func TestCreateVM_Isolated (t * testing.T ) {
1793
1867
prepareIntegTest (t )
1794
1868
0 commit comments