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