@@ -1665,12 +1665,124 @@ func validateNutanix(m *machinev1beta1.Machine, config *admissionConfig) (bool,
1665
1665
}
1666
1666
}
1667
1667
1668
+ // validate gpus if configured
1669
+ if len (providerSpec .GPUs ) > 0 {
1670
+ fldPath := field .NewPath ("providerSpec" , "gpus" )
1671
+ for _ , gpu := range providerSpec .GPUs {
1672
+ switch gpu .Type {
1673
+ case machinev1 .NutanixGPUIdentifierDeviceID :
1674
+ if gpu .DeviceID == nil {
1675
+ errs = append (errs , field .Required (fldPath .Child ("deviceID" ), "missing gpu deviceID" ))
1676
+ }
1677
+ case machinev1 .NutanixGPUIdentifierName :
1678
+ if gpu .Name == nil || * gpu .Name == "" {
1679
+ errs = append (errs , field .Required (fldPath .Child ("name" ), "missing gpu name" ))
1680
+ }
1681
+ default :
1682
+ errMsg := fmt .Sprintf ("invalid gpu identifier type, the valid types: %q, %q." , machinev1 .NutanixGPUIdentifierDeviceID , machinev1 .NutanixGPUIdentifierName )
1683
+ errs = append (errs , field .Invalid (fldPath .Child ("type" ), gpu .Type , errMsg ))
1684
+ }
1685
+ }
1686
+ }
1687
+
1688
+ // validate dataDisks if configured
1689
+ if len (providerSpec .DataDisks ) > 0 {
1690
+ for _ , fldErr := range validateNutanixDataDisks (providerSpec .DataDisks ) {
1691
+ errs = append (errs , fldErr )
1692
+ }
1693
+ }
1694
+
1668
1695
if len (errs ) > 0 {
1669
1696
return false , warnings , errs
1670
1697
}
1671
1698
return true , warnings , nil
1672
1699
}
1673
1700
1701
+ func validateNutanixDataDisks (disks []machinev1.NutanixVMDisk ) (fldErrs []* field.Error ) {
1702
+ fldPath := field .NewPath ("providerSpec" , "dataDisks" )
1703
+ var errMsg string
1704
+
1705
+ for _ , disk := range disks {
1706
+ // validate the minimum diskSize of 1Gi
1707
+ diskSizeBytes := disk .DiskSize .Value ()
1708
+ if diskSizeBytes < 1024 * 1024 * 1024 {
1709
+ fldErrs = append (fldErrs , field .Invalid (fldPath .Child ("diskSize" ), fmt .Sprintf ("%v bytes" , diskSizeBytes ), "The minimum diskSize is 1Gi bytes." ))
1710
+ }
1711
+
1712
+ if disk .DeviceProperties != nil {
1713
+ switch disk .DeviceProperties .DeviceType {
1714
+ case machinev1 .NutanixDiskDeviceTypeDisk :
1715
+ switch disk .DeviceProperties .AdapterType {
1716
+ case machinev1 .NutanixDiskAdapterTypeSCSI , machinev1 .NutanixDiskAdapterTypeIDE , machinev1 .NutanixDiskAdapterTypePCI , machinev1 .NutanixDiskAdapterTypeSATA , machinev1 .NutanixDiskAdapterTypeSPAPR :
1717
+ // valid configuration
1718
+ default :
1719
+ // invalid configuration
1720
+ fldErrs = append (fldErrs , field .Invalid (fldPath .Child ("deviceProperties" , "adapterType" ), disk .DeviceProperties .AdapterType ,
1721
+ fmt .Sprintf ("invalid adapter type for the %q device type, the valid values: %q, %q, %q, %q, %q." ,
1722
+ machinev1 .NutanixDiskDeviceTypeDisk , machinev1 .NutanixDiskAdapterTypeSCSI , machinev1 .NutanixDiskAdapterTypeIDE ,
1723
+ machinev1 .NutanixDiskAdapterTypePCI , machinev1 .NutanixDiskAdapterTypeSATA , machinev1 .NutanixDiskAdapterTypeSPAPR )))
1724
+ }
1725
+ case machinev1 .NutanixDiskDeviceTypeCDROM :
1726
+ switch disk .DeviceProperties .AdapterType {
1727
+ case machinev1 .NutanixDiskAdapterTypeIDE , machinev1 .NutanixDiskAdapterTypeSATA :
1728
+ // valid configuration
1729
+ default :
1730
+ // invalid configuration
1731
+ fldErrs = append (fldErrs , field .Invalid (fldPath .Child ("deviceProperties" , "adapterType" ), disk .DeviceProperties .AdapterType ,
1732
+ fmt .Sprintf ("invalid adapter type for the %q device type, the valid values: %q, %q." ,
1733
+ machinev1 .NutanixDiskDeviceTypeCDROM , machinev1 .NutanixDiskAdapterTypeIDE , machinev1 .NutanixDiskAdapterTypeSATA )))
1734
+ }
1735
+ default :
1736
+ fldErrs = append (fldErrs , field .Invalid (fldPath .Child ("deviceProperties" , "deviceType" ), disk .DeviceProperties .DeviceType ,
1737
+ fmt .Sprintf ("invalid device type, the valid types: %q, %q." , machinev1 .NutanixDiskDeviceTypeDisk , machinev1 .NutanixDiskDeviceTypeCDROM )))
1738
+ }
1739
+
1740
+ if disk .DeviceProperties .DeviceIndex < 0 {
1741
+ fldErrs = append (fldErrs , field .Invalid (fldPath .Child ("deviceProperties" , "deviceIndex" ),
1742
+ disk .DeviceProperties .DeviceIndex , "invalid device index, the valid values are non-negative integers." ))
1743
+ }
1744
+ }
1745
+
1746
+ if disk .StorageConfig != nil {
1747
+ if disk .StorageConfig .DiskMode != machinev1 .NutanixDiskModeStandard && disk .StorageConfig .DiskMode != machinev1 .NutanixDiskModeFlash {
1748
+ fldErrs = append (fldErrs , field .Invalid (fldPath .Child ("storageConfig" , "diskMode" ), disk .StorageConfig .DiskMode ,
1749
+ fmt .Sprintf ("invalid disk mode, the valid values: %q, %q." , machinev1 .NutanixDiskModeStandard , machinev1 .NutanixDiskModeFlash )))
1750
+ }
1751
+
1752
+ storageContainerRef := disk .StorageConfig .StorageContainer
1753
+ if storageContainerRef != nil {
1754
+ switch storageContainerRef .Type {
1755
+ case machinev1 .NutanixIdentifierUUID :
1756
+ if storageContainerRef .UUID == nil || * storageContainerRef .UUID == "" {
1757
+ fldErrs = append (fldErrs , field .Required (fldPath .Child ("storageConfig" , "storageContainer" , "uuid" ), "missing storageContainer uuid." ))
1758
+ }
1759
+ default :
1760
+ errMsg = fmt .Sprintf ("invalid storageContainer reference type, the valid values: %q." , machinev1 .NutanixIdentifierUUID )
1761
+ fldErrs = append (fldErrs , field .Invalid (fldPath .Child ("storageConfig" , "storageContainer" , "type" ), storageContainerRef .Type , errMsg ))
1762
+ }
1763
+ }
1764
+ }
1765
+
1766
+ if disk .DataSource != nil {
1767
+ switch disk .DataSource .Type {
1768
+ case machinev1 .NutanixIdentifierUUID :
1769
+ if disk .DataSource .UUID == nil || * disk .DataSource .UUID == "" {
1770
+ fldErrs = append (fldErrs , field .Required (fldPath .Child ("dataSource" , "uuid" ), "missing disk dataSource uuid." ))
1771
+ }
1772
+ case machinev1 .NutanixIdentifierName :
1773
+ if disk .DataSource .Name == nil || * disk .DataSource .Name == "" {
1774
+ fldErrs = append (fldErrs , field .Required (fldPath .Child ("dataSource" , "name" ), "missing disk dataSource name." ))
1775
+ }
1776
+ default :
1777
+ errMsg := fmt .Sprintf ("invalid disk dataSource reference type, the valid values: %q, %q." , machinev1 .NutanixIdentifierUUID , machinev1 .NutanixIdentifierName )
1778
+ fldErrs = append (fldErrs , field .Invalid (fldPath .Child ("dataSource" , "type" ), disk .DataSource .Type , errMsg ))
1779
+ }
1780
+ }
1781
+ }
1782
+
1783
+ return fldErrs
1784
+ }
1785
+
1674
1786
func validateNutanixResourceIdentifier (resource string , identifier machinev1.NutanixResourceIdentifier ) * field.Error {
1675
1787
parentPath := field .NewPath ("providerSpec" )
1676
1788
if identifier .Type == machinev1 .NutanixIdentifierName {
0 commit comments