github.com/vmware/govmomi@v0.43.0/vslm/global_object_manager.go (about) 1 /* 2 Copyright (c) 2019 VMware, Inc. All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package vslm 18 19 import ( 20 "context" 21 "time" 22 23 "github.com/vmware/govmomi/object" 24 "github.com/vmware/govmomi/vim25/mo" 25 "github.com/vmware/govmomi/vim25/soap" 26 vim "github.com/vmware/govmomi/vim25/types" 27 "github.com/vmware/govmomi/vslm/methods" 28 "github.com/vmware/govmomi/vslm/types" 29 ) 30 31 type Task struct { 32 c *Client 33 object.Common 34 vim.ManagedObjectReference 35 } 36 37 func NewTask(client *Client, mref vim.ManagedObjectReference) *Task { 38 m := Task{ 39 ManagedObjectReference: mref, 40 c: client, 41 } 42 return &m 43 } 44 45 func (this *Task) QueryResult(ctx context.Context) (vim.AnyType, error) { 46 req := types.VslmQueryTaskResult{ 47 This: this.ManagedObjectReference, 48 } 49 res, err := methods.VslmQueryTaskResult(ctx, this.c, &req) 50 if err != nil { 51 return nil, err 52 } 53 return res.Returnval, nil 54 } 55 56 func (this *Task) QueryInfo(ctx context.Context) (*types.VslmTaskInfo, error) { 57 req := types.VslmQueryInfo{ 58 This: this.ManagedObjectReference, 59 } 60 res, err := methods.VslmQueryInfo(ctx, this.c, &req) 61 if err != nil { 62 return nil, err 63 } 64 return &res.Returnval, nil 65 } 66 67 func (this *Task) Cancel(ctx context.Context) error { 68 req := types.VslmCancelTask{ 69 This: this.ManagedObjectReference, 70 } 71 _, err := methods.VslmCancelTask(ctx, this.c, &req) 72 return err 73 } 74 75 func (this *Task) Wait(ctx context.Context, timeoutNS time.Duration) (vim.AnyType, error) { 76 return this.WaitNonDefault(ctx, timeoutNS, 10000, true, 10000000) 77 } 78 79 func (this *Task) WaitNonDefault(ctx context.Context, timeoutNS time.Duration, startIntervalNS time.Duration, 80 exponential bool, maxIntervalNS time.Duration) (vim.AnyType, error) { 81 waitIntervalNS := startIntervalNS 82 startTimeNS := time.Now() 83 for time.Now().Sub(startTimeNS) < timeoutNS { 84 info, err := this.QueryInfo(ctx) 85 if err != nil { 86 return nil, err 87 } 88 if info.State == types.VslmTaskInfoStateQueued || info.State == types.VslmTaskInfoStateRunning { 89 time.Sleep(waitIntervalNS) 90 if exponential { 91 waitIntervalNS = waitIntervalNS * 2 92 if maxIntervalNS > 0 && waitIntervalNS > maxIntervalNS { 93 waitIntervalNS = maxIntervalNS 94 } 95 } 96 } else if info.State == types.VslmTaskInfoStateError { 97 return nil, soap.WrapVimFault(info.Error.Fault) 98 } else { 99 break 100 } 101 // Check context here to see if we should exit 102 } 103 return this.QueryResult(ctx) 104 } 105 106 type GlobalObjectManager struct { 107 vim.ManagedObjectReference 108 c *Client 109 } 110 111 // NewGlobalObjectManager returns an ObjectManager referecing the vslm VcenterVStorageObjectManager endpoint. 112 // This endpoint is always connected to vpxd and utilizes the global catalog to locate objects and does 113 // not require a datastore. To connect to the VStorageObjectManager on the host or in vpxd use the 114 // vslm.ObjectManager type. 115 func NewGlobalObjectManager(client *Client) *GlobalObjectManager { 116 mref := client.ServiceContent.VStorageObjectManager 117 118 m := GlobalObjectManager{ 119 ManagedObjectReference: mref, 120 c: client, 121 } 122 123 return &m 124 } 125 126 func (this *GlobalObjectManager) CreateDisk(ctx context.Context, spec vim.VslmCreateSpec) (*Task, error) { 127 req := types.VslmCreateDisk_Task{ 128 This: this.Reference(), 129 Spec: spec, 130 } 131 132 res, err := methods.VslmCreateDisk_Task(ctx, this.c, &req) 133 if err != nil { 134 return nil, err 135 } 136 137 return NewTask(this.c, res.Returnval), nil 138 } 139 140 func (this *GlobalObjectManager) RegisterDisk(ctx context.Context, path string, name string) (*vim.VStorageObject, error) { 141 req := types.VslmRegisterDisk{ 142 This: this.Reference(), 143 Path: path, 144 Name: name, 145 } 146 147 res, err := methods.VslmRegisterDisk(ctx, this.c, &req) 148 if err != nil { 149 return nil, err 150 } 151 152 return &res.Returnval, nil 153 } 154 155 func (this *GlobalObjectManager) ExtendDisk(ctx context.Context, id vim.ID, newCapacityInMB int64) (*Task, error) { 156 req := types.VslmExtendDisk_Task{ 157 This: this.Reference(), 158 Id: id, 159 NewCapacityInMB: newCapacityInMB, 160 } 161 162 res, err := methods.VslmExtendDisk_Task(ctx, this.c, &req) 163 if err != nil { 164 return nil, err 165 } 166 167 return NewTask(this.c, res.Returnval), nil 168 } 169 170 func (this *GlobalObjectManager) InflateDisk(ctx context.Context, id vim.ID) (*Task, error) { 171 req := types.VslmInflateDisk_Task{ 172 This: this.Reference(), 173 Id: id, 174 } 175 176 res, err := methods.VslmInflateDisk_Task(ctx, this.c, &req) 177 if err != nil { 178 return nil, err 179 } 180 181 return NewTask(this.c, res.Returnval), nil 182 } 183 184 func (this *GlobalObjectManager) Rename(ctx context.Context, id vim.ID, name string) error { 185 req := types.VslmRenameVStorageObject{ 186 This: this.Reference(), 187 Id: id, 188 Name: name, 189 } 190 191 _, err := methods.VslmRenameVStorageObject(ctx, this.c, &req) 192 193 return err 194 } 195 196 func (this *GlobalObjectManager) UpdatePolicy(ct context.Context, id vim.ID, profile []vim.VirtualMachineProfileSpec) ( 197 *Task, error) { 198 req := types.VslmUpdateVstorageObjectPolicy_Task{ 199 This: this.Reference(), 200 Id: id, 201 Profile: profile, 202 } 203 204 res, err := methods.VslmUpdateVstorageObjectPolicy_Task(ct, this.c, &req) 205 206 if err != nil { 207 return nil, err 208 } 209 210 return NewTask(this.c, res.Returnval), nil 211 } 212 213 func (this *GlobalObjectManager) UpdateInfrastructurePolicy(ct context.Context, 214 spec vim.VslmInfrastructureObjectPolicySpec) (*Task, error) { 215 req := types.VslmUpdateVStorageInfrastructureObjectPolicy_Task{ 216 This: this.Reference(), 217 Spec: spec, 218 } 219 220 res, err := methods.VslmUpdateVStorageInfrastructureObjectPolicy_Task(ct, this.c, &req) 221 222 if err != nil { 223 return nil, err 224 } 225 226 return NewTask(this.c, res.Returnval), nil 227 } 228 229 func (this *GlobalObjectManager) RetrieveInfrastructurePolicy(ct context.Context, datastore mo.Reference) ( 230 []vim.VslmInfrastructureObjectPolicy, error) { 231 req := types.VslmRetrieveVStorageInfrastructureObjectPolicy{ 232 This: this.Reference(), 233 Datastore: datastore.Reference(), 234 } 235 236 res, err := methods.VslmRetrieveVStorageInfrastructureObjectPolicy(ct, this.c, &req) 237 if err != nil { 238 return nil, err 239 } 240 241 return res.Returnval, nil 242 } 243 244 func (this *GlobalObjectManager) Delete(ctx context.Context, id vim.ID) (*Task, error) { 245 req := types.VslmDeleteVStorageObject_Task{ 246 This: this.Reference(), 247 Id: id, 248 } 249 250 res, err := methods.VslmDeleteVStorageObject_Task(ctx, this.c, &req) 251 if err != nil { 252 return nil, err 253 } 254 255 return NewTask(this.c, res.Returnval), nil 256 } 257 258 func (this *GlobalObjectManager) Retrieve(ctx context.Context, id vim.ID) (*vim.VStorageObject, error) { 259 req := types.VslmRetrieveVStorageObject{ 260 This: this.Reference(), 261 Id: id, 262 } 263 264 res, err := methods.VslmRetrieveVStorageObject(ctx, this.c, &req) 265 if err != nil { 266 return nil, err 267 } 268 269 return &res.Returnval, nil 270 } 271 272 func (this *GlobalObjectManager) RetrieveState(ct context.Context, id vim.ID) (*vim.VStorageObjectStateInfo, error) { 273 req := types.VslmRetrieveVStorageObjectState{ 274 This: this.Reference(), 275 Id: id, 276 } 277 278 res, err := methods.VslmRetrieveVStorageObjectState(ct, this.c, &req) 279 if err != nil { 280 return nil, err 281 } 282 283 return &res.Returnval, nil 284 } 285 286 func (this *GlobalObjectManager) RetrieveAssociations(ct context.Context, ids []vim.ID) ( 287 []types.VslmVsoVStorageObjectAssociations, error) { 288 req := types.VslmRetrieveVStorageObjectAssociations{ 289 This: this.Reference(), 290 Ids: ids, 291 } 292 293 res, err := methods.VslmRetrieveVStorageObjectAssociations(ct, this.c, &req) 294 if err != nil { 295 return nil, err 296 } 297 298 return res.Returnval, nil 299 } 300 301 func (this *GlobalObjectManager) ListObjectsForSpec(ctx context.Context, query []types.VslmVsoVStorageObjectQuerySpec, 302 maxResult int32) (*types.VslmVsoVStorageObjectQueryResult, error) { 303 req := types.VslmListVStorageObjectForSpec{ 304 This: this.Reference(), 305 Query: query, 306 MaxResult: maxResult, 307 } 308 309 res, err := methods.VslmListVStorageObjectForSpec(ctx, this.c, &req) 310 if err != nil { 311 return nil, err 312 } 313 314 return res.Returnval, nil 315 } 316 317 func (this *GlobalObjectManager) Clone(ctx context.Context, id vim.ID, spec vim.VslmCloneSpec) (*Task, error) { 318 req := types.VslmCloneVStorageObject_Task{ 319 This: this.Reference(), 320 Id: id, 321 Spec: spec, 322 } 323 324 res, err := methods.VslmCloneVStorageObject_Task(ctx, this.c, &req) 325 if err != nil { 326 return nil, err 327 } 328 329 return NewTask(this.c, res.Returnval), nil 330 } 331 332 func (this *GlobalObjectManager) Relocate(ct context.Context, id vim.ID, spec vim.VslmRelocateSpec) (*Task, error) { 333 req := types.VslmRelocateVStorageObject_Task{ 334 This: this.Reference(), 335 Id: id, 336 Spec: spec, 337 } 338 339 res, err := methods.VslmRelocateVStorageObject_Task(ct, this.c, &req) 340 341 if err != nil { 342 return nil, err 343 } 344 345 return NewTask(this.c, res.Returnval), nil 346 } 347 348 func (this *GlobalObjectManager) SetControlFlags(ct context.Context, id vim.ID, controlFlags []string) error { 349 req := types.VslmSetVStorageObjectControlFlags{ 350 This: this.Reference(), 351 Id: id, 352 ControlFlags: controlFlags, 353 } 354 355 _, err := methods.VslmSetVStorageObjectControlFlags(ct, this.c, &req) 356 if err != nil { 357 return err 358 } 359 360 return nil 361 } 362 363 func (this *GlobalObjectManager) ClearControlFlags(ct context.Context, id vim.ID) error { 364 req := types.VslmClearVStorageObjectControlFlags{ 365 This: this.Reference(), 366 Id: id, 367 } 368 369 _, err := methods.VslmClearVStorageObjectControlFlags(ct, this.c, &req) 370 371 return err 372 } 373 374 func (this *GlobalObjectManager) AttachTag(ctx context.Context, id vim.ID, category string, tag string) error { 375 req := types.VslmAttachTagToVStorageObject{ 376 This: this.Reference(), 377 Id: id, 378 Category: category, 379 Tag: tag, 380 } 381 382 _, err := methods.VslmAttachTagToVStorageObject(ctx, this.c, &req) 383 384 return err 385 } 386 387 func (this *GlobalObjectManager) DetachTag(ctx context.Context, id vim.ID, category string, tag string) error { 388 req := types.VslmDetachTagFromVStorageObject{ 389 This: this.Reference(), 390 Id: id, 391 Category: category, 392 Tag: tag, 393 } 394 395 _, err := methods.VslmDetachTagFromVStorageObject(ctx, this.c, &req) 396 397 return err 398 } 399 400 func (this *GlobalObjectManager) ListObjectsAttachedToTag(ctx context.Context, id vim.ID, category string, tag string) ( 401 []vim.ID, error) { 402 req := types.VslmListVStorageObjectsAttachedToTag{ 403 This: this.Reference(), 404 Category: category, 405 Tag: tag, 406 } 407 408 res, err := methods.VslmListVStorageObjectsAttachedToTag(ctx, this.c, &req) 409 if err != nil { 410 return nil, err 411 } 412 413 return res.Returnval, err 414 } 415 416 func (this *GlobalObjectManager) ListAttachedTags(ctx context.Context, id vim.ID) ([]vim.VslmTagEntry, error) { 417 req := types.VslmListTagsAttachedToVStorageObject{ 418 This: this.Reference(), 419 Id: id, 420 } 421 422 res, err := methods.VslmListTagsAttachedToVStorageObject(ctx, this.c, &req) 423 if err != nil { 424 return nil, err 425 } 426 427 return res.Returnval, nil 428 } 429 430 func (this *GlobalObjectManager) ReconcileDatastoreInventory(ctx context.Context, datastore mo.Reference) (*Task, error) { 431 req := &types.VslmReconcileDatastoreInventory_Task{ 432 This: this.Reference(), 433 Datastore: datastore.Reference(), 434 } 435 436 res, err := methods.VslmReconcileDatastoreInventory_Task(ctx, this.c, req) 437 if err != nil { 438 return nil, err 439 } 440 return NewTask(this.c, res.Returnval), nil 441 } 442 443 func (this *GlobalObjectManager) ScheduleReconcileDatastoreInventory(ctx context.Context, datastore mo.Reference) error { 444 req := &types.VslmScheduleReconcileDatastoreInventory{ 445 This: this.Reference(), 446 Datastore: datastore.Reference(), 447 } 448 449 _, err := methods.VslmScheduleReconcileDatastoreInventory(ctx, this.c, req) 450 451 return err 452 } 453 454 func (this *GlobalObjectManager) CreateSnapshot(ctx context.Context, id vim.ID, description string) (*Task, error) { 455 req := types.VslmCreateSnapshot_Task{ 456 This: this.Reference(), 457 Id: id, 458 Description: description, 459 } 460 461 res, err := methods.VslmCreateSnapshot_Task(ctx, this.c, &req) 462 if err != nil { 463 return nil, err 464 } 465 466 return NewTask(this.c, res.Returnval), nil 467 } 468 469 func (this *GlobalObjectManager) DeleteSnapshot(ctx context.Context, id vim.ID, snapshotID vim.ID) (*Task, error) { 470 req := types.VslmDeleteSnapshot_Task{ 471 This: this.Reference(), 472 Id: id, 473 SnapshotId: snapshotID, 474 } 475 476 res, err := methods.VslmDeleteSnapshot_Task(ctx, this.c, &req) 477 if err != nil { 478 return nil, err 479 } 480 481 return NewTask(this.c, res.Returnval), nil 482 } 483 484 func (this *GlobalObjectManager) RetrieveSnapshotInfo(ctx context.Context, id vim.ID) ( 485 []vim.VStorageObjectSnapshotInfoVStorageObjectSnapshot, error) { 486 req := types.VslmRetrieveSnapshotInfo{ 487 This: this.Reference(), 488 Id: id, 489 } 490 491 res, err := methods.VslmRetrieveSnapshotInfo(ctx, this.c, &req) 492 if err != nil { 493 return nil, err 494 } 495 496 return res.Returnval.Snapshots, nil 497 } 498 499 func (this *GlobalObjectManager) CreateDiskFromSnapshot(ctx context.Context, id vim.ID, snapshotId vim.ID, name string, 500 profile []vim.VirtualMachineProfileSpec, crypto *vim.CryptoSpec, 501 path string) (*Task, error) { 502 req := types.VslmCreateDiskFromSnapshot_Task{ 503 This: this.Reference(), 504 Id: id, 505 SnapshotId: snapshotId, 506 Name: name, 507 Profile: profile, 508 Crypto: crypto, 509 Path: path, 510 } 511 512 res, err := methods.VslmCreateDiskFromSnapshot_Task(ctx, this.c, &req) 513 if err != nil { 514 return nil, err 515 } 516 517 return NewTask(this.c, res.Returnval), nil 518 } 519 520 func (this *GlobalObjectManager) Revert(ctx context.Context, id vim.ID, snapshotID vim.ID) (*Task, error) { 521 req := types.VslmRevertVStorageObject_Task{ 522 This: this.Reference(), 523 Id: id, 524 SnapshotId: snapshotID, 525 } 526 527 res, err := methods.VslmRevertVStorageObject_Task(ctx, this.c, &req) 528 if err != nil { 529 return nil, err 530 } 531 532 return NewTask(this.c, res.Returnval), nil 533 } 534 535 func (this *GlobalObjectManager) RetrieveSnapshotDetails(ctx context.Context, id vim.ID, snapshotId vim.ID) ( 536 *vim.VStorageObjectSnapshotDetails, error) { 537 req := types.VslmRetrieveSnapshotDetails{ 538 This: this.Reference(), 539 Id: id, 540 SnapshotId: snapshotId, 541 } 542 543 res, err := methods.VslmRetrieveSnapshotDetails(ctx, this.c, &req) 544 if err != nil { 545 return nil, err 546 } 547 548 return &res.Returnval, nil 549 } 550 551 func (this *GlobalObjectManager) QueryChangedDiskAreas(ctx context.Context, id vim.ID, snapshotId vim.ID, startOffset int64, 552 changeId string) (*vim.DiskChangeInfo, error) { 553 req := types.VslmQueryChangedDiskAreas{ 554 This: this.Reference(), 555 Id: id, 556 SnapshotId: snapshotId, 557 StartOffset: startOffset, 558 ChangeId: changeId, 559 } 560 561 res, err := methods.VslmQueryChangedDiskAreas(ctx, this.c, &req) 562 if err != nil { 563 return nil, err 564 } 565 566 return &res.Returnval, nil 567 } 568 569 func (this *GlobalObjectManager) QueryGlobalCatalogSyncStatus(ct context.Context) ([]types.VslmDatastoreSyncStatus, error) { 570 req := types.VslmQueryGlobalCatalogSyncStatus{ 571 This: this.Reference(), 572 } 573 574 res, err := methods.VslmQueryGlobalCatalogSyncStatus(ct, this.c, &req) 575 if err != nil { 576 return nil, err 577 } 578 579 return res.Returnval, nil 580 } 581 582 func (this *GlobalObjectManager) QueryGlobalCatalogSyncStatusForDatastore(ct context.Context, datastoreURL string) ( 583 *types.VslmDatastoreSyncStatus, error) { 584 req := types.VslmQueryGlobalCatalogSyncStatusForDatastore{ 585 This: this.Reference(), 586 DatastoreURL: datastoreURL, 587 } 588 589 res, err := methods.VslmQueryGlobalCatalogSyncStatusForDatastore(ct, this.c, &req) 590 if err != nil { 591 return nil, err 592 } 593 594 return res.Returnval, nil 595 } 596 597 func (this *GlobalObjectManager) UpdateMetadata(ctx context.Context, id vim.ID, metadata []vim.KeyValue, 598 deleteKeys []string) (*Task, error) { 599 req := &types.VslmUpdateVStorageObjectMetadata_Task{ 600 This: this.Reference(), 601 Id: id, 602 Metadata: metadata, 603 DeleteKeys: deleteKeys, 604 } 605 606 res, err := methods.VslmUpdateVStorageObjectMetadata_Task(ctx, this.c, req) 607 if err != nil { 608 return nil, err 609 } 610 return NewTask(this.c, res.Returnval), nil 611 } 612 613 func (this *GlobalObjectManager) RetrieveMetadata(ct context.Context, id vim.ID, snapshotID *vim.ID, prefix string) ( 614 []vim.KeyValue, error) { 615 req := types.VslmRetrieveVStorageObjectMetadata{ 616 This: this.Reference(), 617 Id: id, 618 SnapshotId: snapshotID, 619 Prefix: prefix, 620 } 621 622 res, err := methods.VslmRetrieveVStorageObjectMetadata(ct, this.c, &req) 623 if err != nil { 624 return nil, err 625 } 626 627 return res.Returnval, nil 628 } 629 630 func (this *GlobalObjectManager) RetrieveMetadataValue(ct context.Context, id vim.ID, snapshotID *vim.ID, key string) ( 631 string, error) { 632 req := types.VslmRetrieveVStorageObjectMetadataValue{ 633 This: this.Reference(), 634 Id: id, 635 SnapshotId: snapshotID, 636 Key: key, 637 } 638 639 res, err := methods.VslmRetrieveVStorageObjectMetadataValue(ct, this.c, &req) 640 if err != nil { 641 return "", err 642 } 643 644 return res.Returnval, nil 645 } 646 647 func (this *GlobalObjectManager) RetrieveObjects(ct context.Context, ids []vim.ID) ([]types.VslmVsoVStorageObjectResult, 648 error) { 649 req := types.VslmRetrieveVStorageObjects{ 650 This: this.Reference(), 651 Ids: ids, 652 } 653 654 res, err := methods.VslmRetrieveVStorageObjects(ct, this.c, &req) 655 if err != nil { 656 return nil, err 657 } 658 659 return res.Returnval, nil 660 } 661 662 func (this *GlobalObjectManager) AttachDisk(ct context.Context, id vim.ID, vm mo.Reference, controllerKey int32, 663 unitNumber int32) (*Task, error) { 664 req := types.VslmAttachDisk_Task{ 665 This: this.Reference(), 666 Id: id, 667 Vm: vm.Reference(), 668 ControllerKey: controllerKey, 669 UnitNumber: &unitNumber, 670 } 671 672 res, err := methods.VslmAttachDisk_Task(ct, this.c, &req) 673 if err != nil { 674 return nil, err 675 } 676 677 return NewTask(this.c, res.Returnval), nil 678 }