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  }