@@ -1481,10 +1481,40 @@ pub enum NvidiaDeviceIdStrategy {
14811481}
14821482
14831483#[ derive( Debug , Clone , Eq , PartialEq , Hash , Serialize , Deserialize ) ]
1484- #[ serde( rename_all = "kebab-case" ) ]
1484+ #[ serde( untagged ) ]
14851485pub enum NvidiaDeviceListStrategy {
1486+ Scalar ( NvidiaDeviceListStrategyValues ) ,
1487+ Vector ( Vec < NvidiaDeviceListStrategyValues > ) ,
1488+ }
1489+
1490+ #[ derive( Debug , Clone , Eq , PartialEq , Hash , Serialize , Deserialize ) ]
1491+ #[ serde( rename_all = "kebab-case" ) ]
1492+ pub enum NvidiaDeviceListStrategyValues {
14861493 Envvar ,
14871494 VolumeMounts ,
1495+ CdiCri ,
1496+ }
1497+
1498+ impl NvidiaDeviceListStrategy {
1499+ pub fn iter ( & self ) -> Box < dyn Iterator < Item = & NvidiaDeviceListStrategyValues > + ' _ > {
1500+ match self {
1501+ Self :: Scalar ( inner) => Box :: new ( std:: iter:: once ( inner) ) ,
1502+ Self :: Vector ( inner) => Box :: new ( inner. iter ( ) ) ,
1503+ }
1504+ }
1505+ }
1506+
1507+ impl IntoIterator for NvidiaDeviceListStrategy {
1508+ type Item = NvidiaDeviceListStrategyValues ;
1509+ type IntoIter = std:: vec:: IntoIter < Self :: Item > ;
1510+
1511+ fn into_iter ( self ) -> Self :: IntoIter {
1512+ match self {
1513+ Self :: Scalar ( inner) => vec ! [ inner] ,
1514+ Self :: Vector ( inner) => inner,
1515+ }
1516+ . into_iter ( )
1517+ }
14881518}
14891519
14901520#[ derive( Debug , Clone , PartialEq , Serialize , Deserialize ) ]
@@ -1580,6 +1610,15 @@ string_impls_for!(MigProfile, "MigProfile");
15801610mod test_nvidia_device_plugins {
15811611 use super :: * ;
15821612
1613+ fn helper_with_device_list_strategy (
1614+ device_list_strategy : Option < NvidiaDeviceListStrategy > ,
1615+ ) -> NvidiaDevicePluginSettings {
1616+ NvidiaDevicePluginSettings {
1617+ device_list_strategy : device_list_strategy,
1618+ ..NvidiaDevicePluginSettings :: default ( )
1619+ }
1620+ }
1621+
15831622 #[ test]
15841623 fn valid_gpu_model ( ) {
15851624 for ok in & [ "a100.40gb" , "a100.80gb" , "h100.80gb" , "h100.141gb" ] {
@@ -1628,7 +1667,9 @@ mod test_nvidia_device_plugins {
16281667 NvidiaDevicePluginSettings {
16291668 pass_device_specs: Some ( false ) ,
16301669 device_id_strategy: Some ( NvidiaDeviceIdStrategy :: Uuid ) ,
1631- device_list_strategy: Some ( NvidiaDeviceListStrategy :: Envvar ) ,
1670+ device_list_strategy: Some ( NvidiaDeviceListStrategy :: Scalar (
1671+ NvidiaDeviceListStrategyValues :: Envvar
1672+ ) , ) ,
16321673 device_sharing_strategy: None ,
16331674 time_slicing: None ,
16341675 device_partitioning_strategy: None ,
@@ -1649,7 +1690,9 @@ mod test_nvidia_device_plugins {
16491690 NvidiaDevicePluginSettings {
16501691 pass_device_specs: Some ( false ) ,
16511692 device_id_strategy: Some ( NvidiaDeviceIdStrategy :: Uuid ) ,
1652- device_list_strategy: Some ( NvidiaDeviceListStrategy :: Envvar ) ,
1693+ device_list_strategy: Some ( NvidiaDeviceListStrategy :: Scalar (
1694+ NvidiaDeviceListStrategyValues :: Envvar
1695+ ) , ) ,
16531696 device_sharing_strategy: Some ( NvidiaDeviceSharingStrategy :: TimeSlicing ) ,
16541697 time_slicing: None ,
16551698 device_partitioning_strategy: None ,
@@ -1678,7 +1721,9 @@ mod test_nvidia_device_plugins {
16781721 NvidiaDevicePluginSettings {
16791722 pass_device_specs: Some ( false ) ,
16801723 device_id_strategy: Some ( NvidiaDeviceIdStrategy :: Uuid ) ,
1681- device_list_strategy: Some ( NvidiaDeviceListStrategy :: Envvar ) ,
1724+ device_list_strategy: Some ( NvidiaDeviceListStrategy :: Scalar (
1725+ NvidiaDeviceListStrategyValues :: Envvar
1726+ ) , ) ,
16821727 device_sharing_strategy: None ,
16831728 time_slicing: None ,
16841729 device_partitioning_strategy: Some ( NvidiaDevicePartitioningStrategy :: MIG ) ,
@@ -1700,7 +1745,9 @@ mod test_nvidia_device_plugins {
17001745 NvidiaDevicePluginSettings {
17011746 pass_device_specs: Some ( false ) ,
17021747 device_id_strategy: Some ( NvidiaDeviceIdStrategy :: Uuid ) ,
1703- device_list_strategy: Some ( NvidiaDeviceListStrategy :: Envvar ) ,
1748+ device_list_strategy: Some ( NvidiaDeviceListStrategy :: Scalar (
1749+ NvidiaDeviceListStrategyValues :: Envvar
1750+ ) , ) ,
17041751 device_sharing_strategy: None ,
17051752 time_slicing: None ,
17061753 device_partitioning_strategy: Some ( NvidiaDevicePartitioningStrategy :: MIG ) ,
@@ -1716,4 +1763,94 @@ mod test_nvidia_device_plugins {
17161763 let results = serde_json:: to_string ( & nvidia_device_plugins) . unwrap ( ) ;
17171764 assert_eq ! ( results, test_json) ;
17181765 }
1766+
1767+ #[ test]
1768+ fn test_serde_nvidia_device_plugins_with_list_shape_nvidia_list_stradegy ( ) {
1769+ let test_json_1 = r#"{"device-list-strategy":["volume-mounts","envvar","cdi-cri"]}"# ;
1770+ let test_json_2 = r#"{"device-list-strategy":["volume-mounts","cdi-cri","envvar"]}"# ;
1771+ let test_json_3 = r#"{"device-list-strategy":["envvar","volume-mounts","cdi-cri"]}"# ;
1772+ let test_json_4 = r#"{"device-list-strategy":["envvar","cdi-cri","volume-mounts"]}"# ;
1773+ let test_json_5 = r#"{"device-list-strategy":["cdi-cri","volume-mounts","envvar"]}"# ;
1774+ let test_json_6 = r#"{"device-list-strategy":["cdi-cri","envvar","volume-mounts"]}"# ;
1775+
1776+ let device_plugins_1: NvidiaDevicePluginSettings =
1777+ serde_json:: from_str ( test_json_1) . unwrap ( ) ;
1778+ assert_eq ! (
1779+ device_plugins_1,
1780+ helper_with_device_list_strategy( Some ( NvidiaDeviceListStrategy :: Vector ( vec![
1781+ NvidiaDeviceListStrategyValues :: VolumeMounts ,
1782+ NvidiaDeviceListStrategyValues :: Envvar ,
1783+ NvidiaDeviceListStrategyValues :: CdiCri ,
1784+ ] ) ) )
1785+ ) ;
1786+
1787+ let device_plugins_2: NvidiaDevicePluginSettings =
1788+ serde_json:: from_str ( test_json_2) . unwrap ( ) ;
1789+ assert_eq ! (
1790+ device_plugins_2,
1791+ helper_with_device_list_strategy( Some ( NvidiaDeviceListStrategy :: Vector ( vec![
1792+ NvidiaDeviceListStrategyValues :: VolumeMounts ,
1793+ NvidiaDeviceListStrategyValues :: CdiCri ,
1794+ NvidiaDeviceListStrategyValues :: Envvar ,
1795+ ] ) ) ) ,
1796+ ) ;
1797+
1798+ let device_plugins_3: NvidiaDevicePluginSettings =
1799+ serde_json:: from_str ( test_json_3) . unwrap ( ) ;
1800+ assert_eq ! (
1801+ device_plugins_3,
1802+ helper_with_device_list_strategy( Some ( NvidiaDeviceListStrategy :: Vector ( vec![
1803+ NvidiaDeviceListStrategyValues :: Envvar ,
1804+ NvidiaDeviceListStrategyValues :: VolumeMounts ,
1805+ NvidiaDeviceListStrategyValues :: CdiCri ,
1806+ ] ) ) ) ,
1807+ ) ;
1808+
1809+ let device_plugins_4: NvidiaDevicePluginSettings =
1810+ serde_json:: from_str ( test_json_4) . unwrap ( ) ;
1811+ assert_eq ! (
1812+ device_plugins_4,
1813+ helper_with_device_list_strategy( Some ( NvidiaDeviceListStrategy :: Vector ( vec![
1814+ NvidiaDeviceListStrategyValues :: Envvar ,
1815+ NvidiaDeviceListStrategyValues :: CdiCri ,
1816+ NvidiaDeviceListStrategyValues :: VolumeMounts ,
1817+ ] ) ) ) ,
1818+ ) ;
1819+
1820+ let device_plugins_5: NvidiaDevicePluginSettings =
1821+ serde_json:: from_str ( test_json_5) . unwrap ( ) ;
1822+ assert_eq ! (
1823+ device_plugins_5,
1824+ helper_with_device_list_strategy( Some ( NvidiaDeviceListStrategy :: Vector ( vec![
1825+ NvidiaDeviceListStrategyValues :: CdiCri ,
1826+ NvidiaDeviceListStrategyValues :: VolumeMounts ,
1827+ NvidiaDeviceListStrategyValues :: Envvar ,
1828+ ] ) ) ) ,
1829+ ) ;
1830+
1831+ let device_plugins_6: NvidiaDevicePluginSettings =
1832+ serde_json:: from_str ( test_json_6) . unwrap ( ) ;
1833+ assert_eq ! (
1834+ device_plugins_6,
1835+ helper_with_device_list_strategy( Some ( NvidiaDeviceListStrategy :: Vector ( vec![
1836+ NvidiaDeviceListStrategyValues :: CdiCri ,
1837+ NvidiaDeviceListStrategyValues :: Envvar ,
1838+ NvidiaDeviceListStrategyValues :: VolumeMounts ,
1839+ ] ) ) ) ,
1840+ ) ;
1841+
1842+ let results_1 = serde_json:: to_string ( & device_plugins_1) . unwrap ( ) ;
1843+ let results_2 = serde_json:: to_string ( & device_plugins_2) . unwrap ( ) ;
1844+ let results_3 = serde_json:: to_string ( & device_plugins_3) . unwrap ( ) ;
1845+ let results_4 = serde_json:: to_string ( & device_plugins_4) . unwrap ( ) ;
1846+ let results_5 = serde_json:: to_string ( & device_plugins_5) . unwrap ( ) ;
1847+ let results_6 = serde_json:: to_string ( & device_plugins_6) . unwrap ( ) ;
1848+
1849+ assert_eq ! ( results_1, test_json_1) ;
1850+ assert_eq ! ( results_2, test_json_2) ;
1851+ assert_eq ! ( results_3, test_json_3) ;
1852+ assert_eq ! ( results_4, test_json_4) ;
1853+ assert_eq ! ( results_5, test_json_5) ;
1854+ assert_eq ! ( results_6, test_json_6) ;
1855+ }
17191856}
0 commit comments