@@ -1694,6 +1694,255 @@ func TestUpdateDefaultLabels(t *testing.T) {
1694
1694
}
1695
1695
}
1696
1696
1697
+ func TestReconcileHugePageResource (t * testing.T ) {
1698
+ testKubelet := newTestKubelet (t , false /* controllerAttachDetachEnabled */ )
1699
+ hugePageResourceName64Ki := v1 .ResourceName ("hugepages-64Ki" )
1700
+ hugePageResourceName2Mi := v1 .ResourceName ("hugepages-2Mi" )
1701
+ hugePageResourceName1Gi := v1 .ResourceName ("hugepages-1Gi" )
1702
+
1703
+ cases := []struct {
1704
+ name string
1705
+ testKubelet * TestKubelet
1706
+ initialNode * v1.Node
1707
+ existingNode * v1.Node
1708
+ expectedNode * v1.Node
1709
+ needsUpdate bool
1710
+ }{
1711
+ {
1712
+ name : "no update needed when all huge page resources are similar" ,
1713
+ testKubelet : testKubelet ,
1714
+ needsUpdate : false ,
1715
+ initialNode : & v1.Node {
1716
+ Status : v1.NodeStatus {
1717
+ Capacity : v1.ResourceList {
1718
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1719
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1720
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1721
+ hugePageResourceName2Mi : resource .MustParse ("100Mi" ),
1722
+ hugePageResourceName64Ki : * resource .NewQuantity (0 , resource .BinarySI ),
1723
+ },
1724
+ Allocatable : v1.ResourceList {
1725
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1726
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1727
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1728
+ hugePageResourceName2Mi : resource .MustParse ("100Mi" ),
1729
+ hugePageResourceName64Ki : * resource .NewQuantity (0 , resource .BinarySI ),
1730
+ },
1731
+ },
1732
+ },
1733
+ existingNode : & v1.Node {
1734
+ Status : v1.NodeStatus {
1735
+ Capacity : v1.ResourceList {
1736
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1737
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1738
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1739
+ hugePageResourceName2Mi : resource .MustParse ("100Mi" ),
1740
+ hugePageResourceName64Ki : * resource .NewQuantity (0 , resource .BinarySI ),
1741
+ },
1742
+ Allocatable : v1.ResourceList {
1743
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1744
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1745
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1746
+ hugePageResourceName2Mi : resource .MustParse ("100Mi" ),
1747
+ hugePageResourceName64Ki : * resource .NewQuantity (0 , resource .BinarySI ),
1748
+ },
1749
+ },
1750
+ },
1751
+ expectedNode : & v1.Node {
1752
+ Status : v1.NodeStatus {
1753
+ Capacity : v1.ResourceList {
1754
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1755
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1756
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1757
+ hugePageResourceName2Mi : resource .MustParse ("100Mi" ),
1758
+ hugePageResourceName64Ki : * resource .NewQuantity (0 , resource .BinarySI ),
1759
+ },
1760
+ Allocatable : v1.ResourceList {
1761
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1762
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1763
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1764
+ hugePageResourceName2Mi : resource .MustParse ("100Mi" ),
1765
+ hugePageResourceName64Ki : * resource .NewQuantity (0 , resource .BinarySI ),
1766
+ },
1767
+ },
1768
+ },
1769
+ }, {
1770
+ name : "update needed when new huge page resources is supported" ,
1771
+ testKubelet : testKubelet ,
1772
+ needsUpdate : true ,
1773
+ initialNode : & v1.Node {
1774
+ Status : v1.NodeStatus {
1775
+ Capacity : v1.ResourceList {
1776
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1777
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1778
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1779
+ hugePageResourceName2Mi : * resource .NewQuantity (0 , resource .BinarySI ),
1780
+ hugePageResourceName1Gi : resource .MustParse ("2Gi" ),
1781
+ },
1782
+ Allocatable : v1.ResourceList {
1783
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1784
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1785
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1786
+ hugePageResourceName2Mi : * resource .NewQuantity (0 , resource .BinarySI ),
1787
+ hugePageResourceName1Gi : resource .MustParse ("2Gi" ),
1788
+ },
1789
+ },
1790
+ },
1791
+ existingNode : & v1.Node {
1792
+ Status : v1.NodeStatus {
1793
+ Capacity : v1.ResourceList {
1794
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1795
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1796
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1797
+ hugePageResourceName2Mi : resource .MustParse ("100Mi" ),
1798
+ },
1799
+ Allocatable : v1.ResourceList {
1800
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1801
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1802
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1803
+ hugePageResourceName2Mi : resource .MustParse ("100Mi" ),
1804
+ },
1805
+ },
1806
+ },
1807
+ expectedNode : & v1.Node {
1808
+ Status : v1.NodeStatus {
1809
+ Capacity : v1.ResourceList {
1810
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1811
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1812
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1813
+ hugePageResourceName2Mi : * resource .NewQuantity (0 , resource .BinarySI ),
1814
+ hugePageResourceName1Gi : resource .MustParse ("2Gi" ),
1815
+ },
1816
+ Allocatable : v1.ResourceList {
1817
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1818
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1819
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1820
+ hugePageResourceName2Mi : * resource .NewQuantity (0 , resource .BinarySI ),
1821
+ hugePageResourceName1Gi : resource .MustParse ("2Gi" ),
1822
+ },
1823
+ },
1824
+ },
1825
+ }, {
1826
+ name : "update needed when huge page resource quantity has changed" ,
1827
+ testKubelet : testKubelet ,
1828
+ needsUpdate : true ,
1829
+ initialNode : & v1.Node {
1830
+ Status : v1.NodeStatus {
1831
+ Capacity : v1.ResourceList {
1832
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1833
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1834
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1835
+ hugePageResourceName1Gi : resource .MustParse ("4Gi" ),
1836
+ },
1837
+ Allocatable : v1.ResourceList {
1838
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1839
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1840
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1841
+ hugePageResourceName1Gi : resource .MustParse ("4Gi" ),
1842
+ },
1843
+ },
1844
+ },
1845
+ existingNode : & v1.Node {
1846
+ Status : v1.NodeStatus {
1847
+ Capacity : v1.ResourceList {
1848
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1849
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1850
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1851
+ hugePageResourceName1Gi : resource .MustParse ("2Gi" ),
1852
+ },
1853
+ Allocatable : v1.ResourceList {
1854
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1855
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1856
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1857
+ hugePageResourceName1Gi : resource .MustParse ("2Gi" ),
1858
+ },
1859
+ },
1860
+ },
1861
+ expectedNode : & v1.Node {
1862
+ Status : v1.NodeStatus {
1863
+ Capacity : v1.ResourceList {
1864
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1865
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1866
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1867
+ hugePageResourceName1Gi : resource .MustParse ("4Gi" ),
1868
+ },
1869
+ Allocatable : v1.ResourceList {
1870
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1871
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1872
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1873
+ hugePageResourceName1Gi : resource .MustParse ("4Gi" ),
1874
+ },
1875
+ },
1876
+ },
1877
+ }, {
1878
+ name : "update needed when a huge page resources is no longer supported" ,
1879
+ testKubelet : testKubelet ,
1880
+ needsUpdate : true ,
1881
+ initialNode : & v1.Node {
1882
+ Status : v1.NodeStatus {
1883
+ Capacity : v1.ResourceList {
1884
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1885
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1886
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1887
+ hugePageResourceName1Gi : resource .MustParse ("2Gi" ),
1888
+ },
1889
+ Allocatable : v1.ResourceList {
1890
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1891
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1892
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1893
+ hugePageResourceName1Gi : resource .MustParse ("2Gi" ),
1894
+ },
1895
+ },
1896
+ },
1897
+ existingNode : & v1.Node {
1898
+ Status : v1.NodeStatus {
1899
+ Capacity : v1.ResourceList {
1900
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1901
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1902
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1903
+ hugePageResourceName2Mi : * resource .NewQuantity (0 , resource .BinarySI ),
1904
+ hugePageResourceName1Gi : resource .MustParse ("2Gi" ),
1905
+ },
1906
+ Allocatable : v1.ResourceList {
1907
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1908
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1909
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1910
+ hugePageResourceName2Mi : * resource .NewQuantity (0 , resource .BinarySI ),
1911
+ hugePageResourceName1Gi : resource .MustParse ("2Gi" ),
1912
+ },
1913
+ },
1914
+ },
1915
+ expectedNode : & v1.Node {
1916
+ Status : v1.NodeStatus {
1917
+ Capacity : v1.ResourceList {
1918
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1919
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1920
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1921
+ hugePageResourceName1Gi : resource .MustParse ("2Gi" ),
1922
+ },
1923
+ Allocatable : v1.ResourceList {
1924
+ v1 .ResourceCPU : * resource .NewMilliQuantity (2000 , resource .DecimalSI ),
1925
+ v1 .ResourceMemory : * resource .NewQuantity (10e9 , resource .BinarySI ),
1926
+ v1 .ResourceEphemeralStorage : * resource .NewQuantity (5000 , resource .BinarySI ),
1927
+ hugePageResourceName1Gi : resource .MustParse ("2Gi" ),
1928
+ },
1929
+ },
1930
+ },
1931
+ },
1932
+ }
1933
+
1934
+ for _ , tc := range cases {
1935
+ t .Run (tc .name , func (T * testing.T ) {
1936
+ defer testKubelet .Cleanup ()
1937
+ kubelet := testKubelet .kubelet
1938
+
1939
+ needsUpdate := kubelet .reconcileHugePageResource (tc .initialNode , tc .existingNode )
1940
+ assert .Equal (t , tc .needsUpdate , needsUpdate , tc .name )
1941
+ assert .Equal (t , tc .expectedNode , tc .existingNode , tc .name )
1942
+ })
1943
+ }
1944
+
1945
+ }
1697
1946
func TestReconcileExtendedResource (t * testing.T ) {
1698
1947
testKubelet := newTestKubelet (t , false /* controllerAttachDetachEnabled */ )
1699
1948
testKubelet .kubelet .kubeClient = nil // ensure only the heartbeat client is used
0 commit comments