github.com/vmware/govmomi@v0.43.0/object/datacenter.go (about) 1 /* 2 Copyright (c) 2015-2024 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 object 18 19 import ( 20 "context" 21 "path" 22 23 "github.com/vmware/govmomi/vim25" 24 "github.com/vmware/govmomi/vim25/methods" 25 "github.com/vmware/govmomi/vim25/mo" 26 "github.com/vmware/govmomi/vim25/types" 27 ) 28 29 type DatacenterFolders struct { 30 VmFolder *Folder 31 HostFolder *Folder 32 DatastoreFolder *Folder 33 NetworkFolder *Folder 34 } 35 36 type Datacenter struct { 37 Common 38 } 39 40 func NewDatacenter(c *vim25.Client, ref types.ManagedObjectReference) *Datacenter { 41 return &Datacenter{ 42 Common: NewCommon(c, ref), 43 } 44 } 45 46 func (d *Datacenter) Folders(ctx context.Context) (*DatacenterFolders, error) { 47 var md mo.Datacenter 48 49 ps := []string{"name", "vmFolder", "hostFolder", "datastoreFolder", "networkFolder"} 50 err := d.Properties(ctx, d.Reference(), ps, &md) 51 if err != nil { 52 return nil, err 53 } 54 55 df := &DatacenterFolders{ 56 VmFolder: NewFolder(d.c, md.VmFolder), 57 HostFolder: NewFolder(d.c, md.HostFolder), 58 DatastoreFolder: NewFolder(d.c, md.DatastoreFolder), 59 NetworkFolder: NewFolder(d.c, md.NetworkFolder), 60 } 61 62 paths := []struct { 63 name string 64 path *string 65 }{ 66 {"vm", &df.VmFolder.InventoryPath}, 67 {"host", &df.HostFolder.InventoryPath}, 68 {"datastore", &df.DatastoreFolder.InventoryPath}, 69 {"network", &df.NetworkFolder.InventoryPath}, 70 } 71 72 dcPath := d.InventoryPath 73 if dcPath == "" { 74 dcPath = "/" + md.Name 75 } 76 for _, p := range paths { 77 *p.path = path.Join(dcPath, p.name) 78 } 79 80 return df, nil 81 } 82 83 func (d Datacenter) Destroy(ctx context.Context) (*Task, error) { 84 req := types.Destroy_Task{ 85 This: d.Reference(), 86 } 87 88 res, err := methods.Destroy_Task(ctx, d.c, &req) 89 if err != nil { 90 return nil, err 91 } 92 93 return NewTask(d.c, res.Returnval), nil 94 } 95 96 // PowerOnVM powers on multiple virtual machines with a single vCenter call. 97 // If called against ESX, serially powers on the list of VMs and the returned *Task will always be nil. 98 func (d Datacenter) PowerOnVM(ctx context.Context, vm []types.ManagedObjectReference, option ...types.BaseOptionValue) (*Task, error) { 99 if d.Client().IsVC() { 100 req := types.PowerOnMultiVM_Task{ 101 This: d.Reference(), 102 Vm: vm, 103 Option: option, 104 } 105 106 res, err := methods.PowerOnMultiVM_Task(ctx, d.c, &req) 107 if err != nil { 108 return nil, err 109 } 110 111 return NewTask(d.c, res.Returnval), nil 112 } 113 114 for _, ref := range vm { 115 obj := NewVirtualMachine(d.Client(), ref) 116 task, err := obj.PowerOn(ctx) 117 if err != nil { 118 return nil, err 119 } 120 121 err = task.Wait(ctx) 122 if err != nil { 123 // Ignore any InvalidPowerState fault, as it indicates the VM is already powered on 124 if f, ok := err.(types.HasFault); ok { 125 if _, ok = f.Fault().(*types.InvalidPowerState); !ok { 126 return nil, err 127 } 128 } 129 } 130 } 131 132 return nil, nil 133 }