@@ -38,12 +38,6 @@ type TagManager interface {
3838 GetAttachedTagsOnObjects (ctx context.Context , objectID []mo.Reference ) ([]vapitags.AttachedTags , error )
3939}
4040
41- const (
42- esxi7U2BuildNumber int = 17630552
43- vcenter7U2BuildNumber int = 17694817
44- vcenter7U2Version string = "7.0.2"
45- )
46-
4741var localLogger = logrus .New ()
4842
4943type validationContext struct {
@@ -233,18 +227,49 @@ func validateHostGroups(validationCtx *validationContext, cluster, hostGroup str
233227 return append (allErrs , field .NotFound (fldPath , hostGroup ))
234228}
235229
230+ const (
231+ eolVSphereVersion int = 7
232+
233+ // csi driver requirement.
234+ minimumVCenterBuild int = 17694817
235+ minimumEsxiBuildNumber int = 17630552
236+
237+ supportedVSphereVersion int = 8
238+
239+ // GA build of vCenter 8, there are no constraints with csi.
240+ supportedVCenterBuild int = 20519528
241+ supportedEsxiBuildNumber int = 20513097
242+ )
243+
244+ func getVSphereConstraints () (version.Constraints , version.Constraints , error ) {
245+ eolConstraints , err := version .NewConstraint (fmt .Sprintf (">= %d, < %d" , eolVSphereVersion , supportedVSphereVersion ))
246+ if err != nil {
247+ return nil , nil , err
248+ }
249+
250+ // We support vSphere 8 only, so >= 8 (covers semver minor and patch)
251+ supportedConstraints , err := version .NewConstraint (fmt .Sprintf (">= %d, < %d" , supportedVSphereVersion , supportedVSphereVersion + 1 ))
252+ if err != nil {
253+ return nil , nil , err
254+ }
255+ return eolConstraints , supportedConstraints , nil
256+ }
257+
236258func validateVCenterVersion (validationCtx * validationContext , fldPath * field.Path ) field.ErrorList {
237259 allErrs := field.ErrorList {}
238260
239- constraints , err := version . NewConstraint ( fmt . Sprintf ( "< %s" , vcenter7U2Version ) )
261+ eolConstraints , supportedConstraints , err := getVSphereConstraints ( )
240262 if err != nil {
241263 allErrs = append (allErrs , field .InternalError (fldPath , err ))
242264 }
243265
266+ // Current vCenter version
244267 vCenterVersion , err := version .NewVersion (validationCtx .Client .ServiceContent .About .Version )
245268 if err != nil {
246269 allErrs = append (allErrs , field .InternalError (fldPath , err ))
247270 }
271+
272+ // Current vCenter Build number
248273 build , err := strconv .Atoi (validationCtx .Client .ServiceContent .About .Build )
249274 if err != nil {
250275 allErrs = append (allErrs , field .InternalError (fldPath , err ))
@@ -253,9 +278,25 @@ func validateVCenterVersion(validationCtx *validationContext, fldPath *field.Pat
253278 detail := fmt .Sprintf ("The vSphere storage driver requires a minimum of vSphere 7 Update 2. Current vCenter version: %s, build: %s" ,
254279 validationCtx .Client .ServiceContent .About .Version , validationCtx .Client .ServiceContent .About .Build )
255280
256- if constraints .Check (vCenterVersion ) {
257- allErrs = append (allErrs , field .Required (fldPath , detail ))
258- } else if build < vcenter7U2BuildNumber {
281+ switch {
282+ case eolConstraints .Check (vCenterVersion ):
283+ // While vSphere 7 is EOL we can't block installs because a customer could
284+ // have an extended support and a support exception
285+ logrus .Warnf ("VMware vSphere 7 is end of service as of 10/2/2025. Current vCenter version: %s, build: %d" , vCenterVersion .String (), build )
286+
287+ // Still running vSphere 7 but wrong build to use CSI driver
288+ if build < minimumVCenterBuild {
289+ allErrs = append (allErrs , field .Required (fldPath , detail ))
290+ }
291+ case supportedConstraints .Check (vCenterVersion ):
292+ // This is currently set to the GA build number, all of vSphere 8 is supported
293+ if build < supportedVCenterBuild {
294+ allErrs = append (allErrs , field .Required (fldPath , detail ))
295+ }
296+ // This covers prior to 7 and VCF 9 which is currently not tested
297+ default :
298+ detail = fmt .Sprintf ("Unsupported or untested version of vSphere. Current vCenter version: %s, build: %s" ,
299+ validationCtx .Client .ServiceContent .About .Version , validationCtx .Client .ServiceContent .About .Build )
259300 allErrs = append (allErrs , field .Required (fldPath , detail ))
260301 }
261302
@@ -269,6 +310,11 @@ func validateESXiVersion(validationCtx *validationContext, clusterPath string, v
269310 ctx , cancel := context .WithTimeout (context .TODO (), 60 * time .Second )
270311 defer cancel ()
271312
313+ eolConstraints , supportedConstraints , err := getVSphereConstraints ()
314+ if err != nil {
315+ allErrs = append (allErrs , field .InternalError (vSphereFldPath , err ))
316+ }
317+
272318 clusters , err := finder .ClusterComputeResourceList (ctx , clusterPath )
273319
274320 if err != nil {
@@ -289,11 +335,6 @@ func validateESXiVersion(validationCtx *validationContext, clusterPath string, v
289335 }
290336 }
291337
292- v7 , err := version .NewVersion ("7.0" )
293- if err != nil {
294- return append (allErrs , field .InternalError (vSphereFldPath , err ))
295- }
296-
297338 hosts , err := clusters [0 ].Hosts (context .TODO ())
298339 if err != nil {
299340 err = errors .Wrapf (err , "unable to find hosts from cluster on path: %s" , clusterPath )
@@ -324,16 +365,32 @@ func validateESXiVersion(validationCtx *validationContext, clusterPath string, v
324365 detail := fmt .Sprintf ("The vSphere storage driver requires a minimum of vSphere 7 Update 2. The ESXi host: %s is version: %s and build: %s" ,
325366 h .Name (), mh .Config .Product .Version , mh .Config .Product .Build )
326367
327- if esxiHostVersion .LessThan (v7 ) {
328- allErrs = append (allErrs , field .Required (computeClusterFldPath , detail ))
329- } else {
330- build , err := strconv .Atoi (mh .Config .Product .Build )
331- if err != nil {
332- return append (allErrs , field .InternalError (vSphereFldPath , err ))
368+ build , err := strconv .Atoi (mh .Config .Product .Build )
369+ if err != nil {
370+ return append (allErrs , field .InternalError (vSphereFldPath , err ))
371+ }
372+
373+ switch {
374+ case eolConstraints .Check (esxiHostVersion ):
375+ // While vSphere 7 is EOL we can't block installs because a customer could
376+ // have an extended support and a support exception
377+ logrus .Warnf ("VMware vSphere 7 is end of service as of 10/2/2025. The ESXi host: %s is version: %s and build: %s" ,
378+ h .Name (), mh .Config .Product .Version , mh .Config .Product .Build )
379+
380+ // Still running vSphere 7 but wrong build to use CSI driver
381+ if build < minimumEsxiBuildNumber {
382+ allErrs = append (allErrs , field .Required (vSphereFldPath , detail ))
333383 }
334- if build < esxi7U2BuildNumber {
335- allErrs = append (allErrs , field .Required (computeClusterFldPath , detail ))
384+ case supportedConstraints .Check (esxiHostVersion ):
385+ // This is currently set to the GA build number, all of vSphere 8 is supported
386+ if build < supportedEsxiBuildNumber {
387+ allErrs = append (allErrs , field .Required (vSphereFldPath , detail ))
336388 }
389+ // This covers prior to 7 and VCF 9 which is currently not tested
390+ default :
391+ detail = fmt .Sprintf ("Unsupported or untested version of vSphere. The ESXi host: %s is version: %s and build: %s" ,
392+ h .Name (), mh .Config .Product .Version , mh .Config .Product .Build )
393+ allErrs = append (allErrs , field .Required (vSphereFldPath , detail ))
337394 }
338395 }
339396 return allErrs
0 commit comments