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  }