@@ -27,6 +27,7 @@ import (
2727 "github.com/vmware/govmomi/object"
2828 "github.com/vmware/govmomi/pbm"
2929 pbmTypes "github.com/vmware/govmomi/pbm/types"
30+ "github.com/vmware/govmomi/property"
3031 "github.com/vmware/govmomi/vim25/mo"
3132 "github.com/vmware/govmomi/vim25/types"
3233 "k8s.io/utils/ptr"
@@ -239,12 +240,28 @@ func Clone(ctx context.Context, vmCtx *capvcontext.VMContext, bootstrapData []by
239240 if err != nil {
240241 return errors .Wrapf (err , "failed to get owning cluster of resourcepool %q to calculate datastore based on storage policy" , pool )
241242 }
242- dsGetter := object . NewComputeResource ( vmCtx . Session . Client . Client , cluster . Reference ())
243- datastores , err := dsGetter .Datastores (ctx )
243+
244+ dsList , err := object . NewComputeResource ( vmCtx . Session . Client . Client , cluster . Reference ()) .Datastores (ctx )
244245 if err != nil {
245246 return errors .Wrapf (err , "unable to list datastores from owning cluster of requested resourcepool" )
246247 }
248+
249+ var refs []types.ManagedObjectReference
250+ for i := range dsList {
251+ refs = append (refs , dsList [i ].Reference ())
252+ }
253+
254+ var datastores []mo.Datastore
255+ if err := property .DefaultCollector (vmCtx .Session .Client .Client ).Retrieve (ctx , refs , []string {"summary" }, & datastores ); err != nil {
256+ return errors .Wrapf (err , "unable to collect datastore properties to validate maintenance mode" )
257+ }
258+
247259 for _ , ds := range datastores {
260+ if ds .Summary .MaintenanceMode != string (types .DatastoreSummaryMaintenanceModeStateNormal ) {
261+ log .V (4 ).Info ("datastore is in maintenance mode, skipping" , "datastore" , ds .Summary .Name )
262+ continue
263+ }
264+
248265 hubs = append (hubs , pbmTypes.PbmPlacementHub {
249266 HubType : ds .Reference ().Type ,
250267 HubId : ds .Reference ().Value ,
0 commit comments