github.com/vmware/govmomi@v0.51.0/object/folder.go (about) 1 // © Broadcom. All Rights Reserved. 2 // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. 3 // SPDX-License-Identifier: Apache-2.0 4 5 package object 6 7 import ( 8 "context" 9 10 "github.com/vmware/govmomi/vim25" 11 "github.com/vmware/govmomi/vim25/methods" 12 "github.com/vmware/govmomi/vim25/mo" 13 "github.com/vmware/govmomi/vim25/types" 14 ) 15 16 type Folder struct { 17 Common 18 } 19 20 func NewFolder(c *vim25.Client, ref types.ManagedObjectReference) *Folder { 21 return &Folder{ 22 Common: NewCommon(c, ref), 23 } 24 } 25 26 func NewRootFolder(c *vim25.Client) *Folder { 27 f := NewFolder(c, c.ServiceContent.RootFolder) 28 f.InventoryPath = "/" 29 return f 30 } 31 32 func (f Folder) Children(ctx context.Context) ([]Reference, error) { 33 var mf mo.Folder 34 35 err := f.Properties(ctx, f.Reference(), []string{"childEntity"}, &mf) 36 if err != nil { 37 return nil, err 38 } 39 40 var rs []Reference 41 for _, e := range mf.ChildEntity { 42 if r := NewReference(f.c, e); r != nil { 43 rs = append(rs, r) 44 } 45 } 46 47 return rs, nil 48 } 49 50 func (f Folder) CreateDatacenter(ctx context.Context, datacenter string) (*Datacenter, error) { 51 req := types.CreateDatacenter{ 52 This: f.Reference(), 53 Name: datacenter, 54 } 55 56 res, err := methods.CreateDatacenter(ctx, f.c, &req) 57 if err != nil { 58 return nil, err 59 } 60 61 // Response will be nil if this is an ESX host that does not belong to a vCenter 62 if res == nil { 63 return nil, nil 64 } 65 66 return NewDatacenter(f.c, res.Returnval), nil 67 } 68 69 func (f Folder) CreateCluster(ctx context.Context, cluster string, spec types.ClusterConfigSpecEx) (*ClusterComputeResource, error) { 70 req := types.CreateClusterEx{ 71 This: f.Reference(), 72 Name: cluster, 73 Spec: spec, 74 } 75 76 res, err := methods.CreateClusterEx(ctx, f.c, &req) 77 if err != nil { 78 return nil, err 79 } 80 81 // Response will be nil if this is an ESX host that does not belong to a vCenter 82 if res == nil { 83 return nil, nil 84 } 85 86 return NewClusterComputeResource(f.c, res.Returnval), nil 87 } 88 89 func (f Folder) CreateFolder(ctx context.Context, name string) (*Folder, error) { 90 req := types.CreateFolder{ 91 This: f.Reference(), 92 Name: name, 93 } 94 95 res, err := methods.CreateFolder(ctx, f.c, &req) 96 if err != nil { 97 return nil, err 98 } 99 100 return NewFolder(f.c, res.Returnval), err 101 } 102 103 func (f Folder) CreateStoragePod(ctx context.Context, name string) (*StoragePod, error) { 104 req := types.CreateStoragePod{ 105 This: f.Reference(), 106 Name: name, 107 } 108 109 res, err := methods.CreateStoragePod(ctx, f.c, &req) 110 if err != nil { 111 return nil, err 112 } 113 114 return NewStoragePod(f.c, res.Returnval), err 115 } 116 117 func (f Folder) AddStandaloneHost(ctx context.Context, spec types.HostConnectSpec, addConnected bool, license *string, compResSpec *types.BaseComputeResourceConfigSpec) (*Task, error) { 118 req := types.AddStandaloneHost_Task{ 119 This: f.Reference(), 120 Spec: spec, 121 AddConnected: addConnected, 122 } 123 124 if license != nil { 125 req.License = *license 126 } 127 128 if compResSpec != nil { 129 req.CompResSpec = *compResSpec 130 } 131 132 res, err := methods.AddStandaloneHost_Task(ctx, f.c, &req) 133 if err != nil { 134 return nil, err 135 } 136 137 return NewTask(f.c, res.Returnval), nil 138 } 139 140 func (f Folder) CreateVM(ctx context.Context, config types.VirtualMachineConfigSpec, pool *ResourcePool, host *HostSystem) (*Task, error) { 141 req := types.CreateVM_Task{ 142 This: f.Reference(), 143 Config: config, 144 Pool: pool.Reference(), 145 } 146 147 if host != nil { 148 ref := host.Reference() 149 req.Host = &ref 150 } 151 152 res, err := methods.CreateVM_Task(ctx, f.c, &req) 153 if err != nil { 154 return nil, err 155 } 156 157 return NewTask(f.c, res.Returnval), nil 158 } 159 160 func (f Folder) RegisterVM(ctx context.Context, path string, name string, asTemplate bool, pool *ResourcePool, host *HostSystem) (*Task, error) { 161 req := types.RegisterVM_Task{ 162 This: f.Reference(), 163 Path: path, 164 AsTemplate: asTemplate, 165 } 166 167 if name != "" { 168 req.Name = name 169 } 170 171 if host != nil { 172 ref := host.Reference() 173 req.Host = &ref 174 } 175 176 if pool != nil { 177 ref := pool.Reference() 178 req.Pool = &ref 179 } 180 181 res, err := methods.RegisterVM_Task(ctx, f.c, &req) 182 if err != nil { 183 return nil, err 184 } 185 186 return NewTask(f.c, res.Returnval), nil 187 } 188 189 func (f Folder) CreateDVS(ctx context.Context, spec types.DVSCreateSpec) (*Task, error) { 190 req := types.CreateDVS_Task{ 191 This: f.Reference(), 192 Spec: spec, 193 } 194 195 res, err := methods.CreateDVS_Task(ctx, f.c, &req) 196 if err != nil { 197 return nil, err 198 } 199 200 return NewTask(f.c, res.Returnval), nil 201 } 202 203 func (f Folder) MoveInto(ctx context.Context, list []types.ManagedObjectReference) (*Task, error) { 204 req := types.MoveIntoFolder_Task{ 205 This: f.Reference(), 206 List: list, 207 } 208 209 res, err := methods.MoveIntoFolder_Task(ctx, f.c, &req) 210 if err != nil { 211 return nil, err 212 } 213 214 return NewTask(f.c, res.Returnval), nil 215 } 216 217 func (f Folder) PlaceVmsXCluster(ctx context.Context, spec types.PlaceVmsXClusterSpec) (*types.PlaceVmsXClusterResult, error) { 218 req := types.PlaceVmsXCluster{ 219 This: f.Reference(), 220 PlacementSpec: spec, 221 } 222 223 res, err := methods.PlaceVmsXCluster(ctx, f.c, &req) 224 if err != nil { 225 return nil, err 226 } 227 228 return &res.Returnval, nil 229 }