Blame vendor/github.com/vmware/govmomi/find/finder.go

Packit Service 4d2de5
/*
Packit Service 4d2de5
Copyright (c) 2014-2017 VMware, Inc. All Rights Reserved.
Packit Service 4d2de5
Packit Service 4d2de5
Licensed under the Apache License, Version 2.0 (the "License");
Packit Service 4d2de5
you may not use this file except in compliance with the License.
Packit Service 4d2de5
You may obtain a copy of the License at
Packit Service 4d2de5
Packit Service 4d2de5
    http://www.apache.org/licenses/LICENSE-2.0
Packit Service 4d2de5
Packit Service 4d2de5
Unless required by applicable law or agreed to in writing, software
Packit Service 4d2de5
distributed under the License is distributed on an "AS IS" BASIS,
Packit Service 4d2de5
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service 4d2de5
See the License for the specific language governing permissions and
Packit Service 4d2de5
limitations under the License.
Packit Service 4d2de5
*/
Packit Service 4d2de5
Packit Service 4d2de5
package find
Packit Service 4d2de5
Packit Service 4d2de5
import (
Packit Service 4d2de5
	"context"
Packit Service 4d2de5
	"errors"
Packit Service 4d2de5
	"path"
Packit Service 4d2de5
	"strings"
Packit Service 4d2de5
Packit Service 4d2de5
	"github.com/vmware/govmomi/list"
Packit Service 4d2de5
	"github.com/vmware/govmomi/object"
Packit Service 4d2de5
	"github.com/vmware/govmomi/property"
Packit Service 4d2de5
	"github.com/vmware/govmomi/vim25"
Packit Service 4d2de5
	"github.com/vmware/govmomi/vim25/mo"
Packit Service 4d2de5
	"github.com/vmware/govmomi/vim25/types"
Packit Service 4d2de5
)
Packit Service 4d2de5
Packit Service 4d2de5
type Finder struct {
Packit Service 4d2de5
	client  *vim25.Client
Packit Service 4d2de5
	r       recurser
Packit Service 4d2de5
	dc      *object.Datacenter
Packit Service 4d2de5
	si      *object.SearchIndex
Packit Service 4d2de5
	folders *object.DatacenterFolders
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func NewFinder(client *vim25.Client, all ...bool) *Finder {
Packit Service 4d2de5
	props := false
Packit Service 4d2de5
	if len(all) == 1 {
Packit Service 4d2de5
		props = all[0]
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	f := &Finder{
Packit Service 4d2de5
		client: client,
Packit Service 4d2de5
		si:     object.NewSearchIndex(client),
Packit Service 4d2de5
		r: recurser{
Packit Service 4d2de5
			Collector: property.DefaultCollector(client),
Packit Service 4d2de5
			All:       props,
Packit Service 4d2de5
		},
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(all) == 0 {
Packit Service 4d2de5
		// attempt to avoid SetDatacenter() requirement
Packit Service 4d2de5
		f.dc, _ = f.DefaultDatacenter(context.Background())
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return f
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) SetDatacenter(dc *object.Datacenter) *Finder {
Packit Service 4d2de5
	f.dc = dc
Packit Service 4d2de5
	f.folders = nil
Packit Service 4d2de5
	return f
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// findRoot makes it possible to use "find" mode with a different root path.
Packit Service 4d2de5
// Example: ResourcePoolList("/dc1/host/cluster1/...")
Packit Service 4d2de5
func (f *Finder) findRoot(ctx context.Context, root *list.Element, parts []string) bool {
Packit Service 4d2de5
	if len(parts) == 0 {
Packit Service 4d2de5
		return false
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	ix := len(parts) - 1
Packit Service 4d2de5
Packit Service 4d2de5
	if parts[ix] != "..." {
Packit Service 4d2de5
		return false
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if ix == 0 {
Packit Service 4d2de5
		return true // We already have the Object for root.Path
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	// Lookup the Object for the new root.Path
Packit Service 4d2de5
	rootPath := path.Join(root.Path, path.Join(parts[:ix]...))
Packit Service 4d2de5
Packit Service 4d2de5
	ref, err := f.si.FindByInventoryPath(ctx, rootPath)
Packit Service 4d2de5
	if err != nil || ref == nil {
Packit Service 4d2de5
		// If we get an error or fail to match, fall through to find() with the original root and path
Packit Service 4d2de5
		return false
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	root.Path = rootPath
Packit Service 4d2de5
	root.Object = ref
Packit Service 4d2de5
Packit Service 4d2de5
	return true
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) find(ctx context.Context, arg string, s *spec) ([]list.Element, error) {
Packit Service 4d2de5
	isPath := strings.Contains(arg, "/")
Packit Service 4d2de5
Packit Service 4d2de5
	root := list.Element{
Packit Service 4d2de5
		Path:   "/",
Packit Service 4d2de5
		Object: object.NewRootFolder(f.client),
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	parts := list.ToParts(arg)
Packit Service 4d2de5
Packit Service 4d2de5
	if len(parts) > 0 {
Packit Service 4d2de5
		switch parts[0] {
Packit Service 4d2de5
		case "..": // Not supported; many edge case, little value
Packit Service 4d2de5
			return nil, errors.New("cannot traverse up a tree")
Packit Service 4d2de5
		case ".": // Relative to whatever
Packit Service 4d2de5
			pivot, err := s.Relative(ctx)
Packit Service 4d2de5
			if err != nil {
Packit Service 4d2de5
				return nil, err
Packit Service 4d2de5
			}
Packit Service 4d2de5
Packit Service 4d2de5
			mes, err := mo.Ancestors(ctx, f.client, f.client.ServiceContent.PropertyCollector, pivot.Reference())
Packit Service 4d2de5
			if err != nil {
Packit Service 4d2de5
				return nil, err
Packit Service 4d2de5
			}
Packit Service 4d2de5
Packit Service 4d2de5
			for _, me := range mes {
Packit Service 4d2de5
				// Skip root entity in building inventory path.
Packit Service 4d2de5
				if me.Parent == nil {
Packit Service 4d2de5
					continue
Packit Service 4d2de5
				}
Packit Service 4d2de5
				root.Path = path.Join(root.Path, me.Name)
Packit Service 4d2de5
			}
Packit Service 4d2de5
Packit Service 4d2de5
			root.Object = pivot
Packit Service 4d2de5
			parts = parts[1:]
Packit Service 4d2de5
		}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if s.listMode(isPath) {
Packit Service 4d2de5
		if f.findRoot(ctx, &root, parts) {
Packit Service 4d2de5
			parts = []string{"*"}
Packit Service 4d2de5
		} else {
Packit Service 4d2de5
			return f.r.List(ctx, s, root, parts)
Packit Service 4d2de5
		}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	s.Parents = append(s.Parents, s.Nested...)
Packit Service 4d2de5
Packit Service 4d2de5
	return f.r.Find(ctx, s, root, parts)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) datacenter() (*object.Datacenter, error) {
Packit Service 4d2de5
	if f.dc == nil {
Packit Service 4d2de5
		return nil, errors.New("please specify a datacenter")
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return f.dc, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// datacenterPath returns the absolute path to the Datacenter containing the given ref
Packit Service 4d2de5
func (f *Finder) datacenterPath(ctx context.Context, ref types.ManagedObjectReference) (string, error) {
Packit Service 4d2de5
	mes, err := mo.Ancestors(ctx, f.client, f.client.ServiceContent.PropertyCollector, ref)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return "", err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	// Chop leaves under the Datacenter
Packit Service 4d2de5
	for i := len(mes) - 1; i > 0; i-- {
Packit Service 4d2de5
		if mes[i].Self.Type == "Datacenter" {
Packit Service 4d2de5
			break
Packit Service 4d2de5
		}
Packit Service 4d2de5
		mes = mes[:i]
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	var p string
Packit Service 4d2de5
Packit Service 4d2de5
	for _, me := range mes {
Packit Service 4d2de5
		// Skip root entity in building inventory path.
Packit Service 4d2de5
		if me.Parent == nil {
Packit Service 4d2de5
			continue
Packit Service 4d2de5
		}
Packit Service 4d2de5
Packit Service 4d2de5
		p = p + "/" + me.Name
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return p, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) dcFolders(ctx context.Context) (*object.DatacenterFolders, error) {
Packit Service 4d2de5
	if f.folders != nil {
Packit Service 4d2de5
		return f.folders, nil
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	dc, err := f.datacenter()
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	folders, err := dc.Folders(ctx)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	f.folders = folders
Packit Service 4d2de5
Packit Service 4d2de5
	return f.folders, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) dcReference(_ context.Context) (object.Reference, error) {
Packit Service 4d2de5
	dc, err := f.datacenter()
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return dc, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) vmFolder(ctx context.Context) (object.Reference, error) {
Packit Service 4d2de5
	folders, err := f.dcFolders(ctx)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return folders.VmFolder, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) hostFolder(ctx context.Context) (object.Reference, error) {
Packit Service 4d2de5
	folders, err := f.dcFolders(ctx)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return folders.HostFolder, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) datastoreFolder(ctx context.Context) (object.Reference, error) {
Packit Service 4d2de5
	folders, err := f.dcFolders(ctx)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return folders.DatastoreFolder, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) networkFolder(ctx context.Context) (object.Reference, error) {
Packit Service 4d2de5
	folders, err := f.dcFolders(ctx)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return folders.NetworkFolder, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) rootFolder(_ context.Context) (object.Reference, error) {
Packit Service 4d2de5
	return object.NewRootFolder(f.client), nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) managedObjectList(ctx context.Context, path string, tl bool, include []string) ([]list.Element, error) {
Packit Service 4d2de5
	fn := f.rootFolder
Packit Service 4d2de5
Packit Service 4d2de5
	if f.dc != nil {
Packit Service 4d2de5
		fn = f.dcReference
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if path == "" {
Packit Service 4d2de5
		path = "."
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	s := &spec{
Packit Service 4d2de5
		Relative: fn,
Packit Service 4d2de5
		Parents:  []string{"ComputeResource", "ClusterComputeResource", "HostSystem", "VirtualApp", "StoragePod"},
Packit Service 4d2de5
		Include:  include,
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if tl {
Packit Service 4d2de5
		s.Contents = true
Packit Service 4d2de5
		s.ListMode = types.NewBool(true)
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return f.find(ctx, path, s)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// Element returns an Element for the given ManagedObjectReference
Packit Service 4d2de5
// This method is only useful for looking up the InventoryPath of a ManagedObjectReference.
Packit Service 4d2de5
func (f *Finder) Element(ctx context.Context, ref types.ManagedObjectReference) (*list.Element, error) {
Packit Service 4d2de5
	rl := func(_ context.Context) (object.Reference, error) {
Packit Service 4d2de5
		return ref, nil
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	s := &spec{
Packit Service 4d2de5
		Relative: rl,
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	e, err := f.find(ctx, "./", s)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(e) == 0 {
Packit Service 4d2de5
		return nil, &NotFoundError{ref.Type, ref.Value}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(e) > 1 {
Packit Service 4d2de5
		panic("ManagedObjectReference must be unique")
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return &e[0], nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// ObjectReference converts the given ManagedObjectReference to a type from the object package via object.NewReference
Packit Service 4d2de5
// with the object.Common.InventoryPath field set.
Packit Service 4d2de5
func (f *Finder) ObjectReference(ctx context.Context, ref types.ManagedObjectReference) (object.Reference, error) {
Packit Service 4d2de5
	e, err := f.Element(ctx, ref)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	r := object.NewReference(f.client, ref)
Packit Service 4d2de5
Packit Service 4d2de5
	type common interface {
Packit Service 4d2de5
		SetInventoryPath(string)
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	r.(common).SetInventoryPath(e.Path)
Packit Service 4d2de5
Packit Service 4d2de5
	if f.dc != nil {
Packit Service 4d2de5
		if ds, ok := r.(*object.Datastore); ok {
Packit Service 4d2de5
			ds.DatacenterPath = f.dc.InventoryPath
Packit Service 4d2de5
		}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return r, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) ManagedObjectList(ctx context.Context, path string, include ...string) ([]list.Element, error) {
Packit Service 4d2de5
	return f.managedObjectList(ctx, path, false, include)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) ManagedObjectListChildren(ctx context.Context, path string, include ...string) ([]list.Element, error) {
Packit Service 4d2de5
	return f.managedObjectList(ctx, path, true, include)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DatacenterList(ctx context.Context, path string) ([]*object.Datacenter, error) {
Packit Service 4d2de5
	s := &spec{
Packit Service 4d2de5
		Relative: f.rootFolder,
Packit Service 4d2de5
		Include:  []string{"Datacenter"},
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	es, err := f.find(ctx, path, s)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	var dcs []*object.Datacenter
Packit Service 4d2de5
	for _, e := range es {
Packit Service 4d2de5
		ref := e.Object.Reference()
Packit Service 4d2de5
		if ref.Type == "Datacenter" {
Packit Service 4d2de5
			dc := object.NewDatacenter(f.client, ref)
Packit Service 4d2de5
			dc.InventoryPath = e.Path
Packit Service 4d2de5
			dcs = append(dcs, dc)
Packit Service 4d2de5
		}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(dcs) == 0 {
Packit Service 4d2de5
		return nil, &NotFoundError{"datacenter", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return dcs, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) Datacenter(ctx context.Context, path string) (*object.Datacenter, error) {
Packit Service 4d2de5
	dcs, err := f.DatacenterList(ctx, path)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(dcs) > 1 {
Packit Service 4d2de5
		return nil, &MultipleFoundError{"datacenter", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return dcs[0], nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DefaultDatacenter(ctx context.Context) (*object.Datacenter, error) {
Packit Service 4d2de5
	dc, err := f.Datacenter(ctx, "*")
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, toDefaultError(err)
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return dc, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DatacenterOrDefault(ctx context.Context, path string) (*object.Datacenter, error) {
Packit Service 4d2de5
	if path != "" {
Packit Service 4d2de5
		dc, err := f.Datacenter(ctx, path)
Packit Service 4d2de5
		if err != nil {
Packit Service 4d2de5
			return nil, err
Packit Service 4d2de5
		}
Packit Service 4d2de5
		return dc, nil
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return f.DefaultDatacenter(ctx)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DatastoreList(ctx context.Context, path string) ([]*object.Datastore, error) {
Packit Service 4d2de5
	s := &spec{
Packit Service 4d2de5
		Relative: f.datastoreFolder,
Packit Service 4d2de5
		Parents:  []string{"StoragePod"},
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	es, err := f.find(ctx, path, s)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	var dss []*object.Datastore
Packit Service 4d2de5
	for _, e := range es {
Packit Service 4d2de5
		ref := e.Object.Reference()
Packit Service 4d2de5
		if ref.Type == "Datastore" {
Packit Service 4d2de5
			ds := object.NewDatastore(f.client, ref)
Packit Service 4d2de5
			ds.InventoryPath = e.Path
Packit Service 4d2de5
Packit Service 4d2de5
			if f.dc == nil {
Packit Service 4d2de5
				// In this case SetDatacenter was not called and path is absolute
Packit Service 4d2de5
				ds.DatacenterPath, err = f.datacenterPath(ctx, ref)
Packit Service 4d2de5
				if err != nil {
Packit Service 4d2de5
					return nil, err
Packit Service 4d2de5
				}
Packit Service 4d2de5
			} else {
Packit Service 4d2de5
				ds.DatacenterPath = f.dc.InventoryPath
Packit Service 4d2de5
			}
Packit Service 4d2de5
Packit Service 4d2de5
			dss = append(dss, ds)
Packit Service 4d2de5
		}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(dss) == 0 {
Packit Service 4d2de5
		return nil, &NotFoundError{"datastore", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return dss, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) Datastore(ctx context.Context, path string) (*object.Datastore, error) {
Packit Service 4d2de5
	dss, err := f.DatastoreList(ctx, path)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(dss) > 1 {
Packit Service 4d2de5
		return nil, &MultipleFoundError{"datastore", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return dss[0], nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DefaultDatastore(ctx context.Context) (*object.Datastore, error) {
Packit Service 4d2de5
	ds, err := f.Datastore(ctx, "*")
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, toDefaultError(err)
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return ds, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DatastoreOrDefault(ctx context.Context, path string) (*object.Datastore, error) {
Packit Service 4d2de5
	if path != "" {
Packit Service 4d2de5
		ds, err := f.Datastore(ctx, path)
Packit Service 4d2de5
		if err != nil {
Packit Service 4d2de5
			return nil, err
Packit Service 4d2de5
		}
Packit Service 4d2de5
		return ds, nil
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return f.DefaultDatastore(ctx)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DatastoreClusterList(ctx context.Context, path string) ([]*object.StoragePod, error) {
Packit Service 4d2de5
	s := &spec{
Packit Service 4d2de5
		Relative: f.datastoreFolder,
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	es, err := f.find(ctx, path, s)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	var sps []*object.StoragePod
Packit Service 4d2de5
	for _, e := range es {
Packit Service 4d2de5
		ref := e.Object.Reference()
Packit Service 4d2de5
		if ref.Type == "StoragePod" {
Packit Service 4d2de5
			sp := object.NewStoragePod(f.client, ref)
Packit Service 4d2de5
			sp.InventoryPath = e.Path
Packit Service 4d2de5
			sps = append(sps, sp)
Packit Service 4d2de5
		}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(sps) == 0 {
Packit Service 4d2de5
		return nil, &NotFoundError{"datastore cluster", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return sps, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DatastoreCluster(ctx context.Context, path string) (*object.StoragePod, error) {
Packit Service 4d2de5
	sps, err := f.DatastoreClusterList(ctx, path)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(sps) > 1 {
Packit Service 4d2de5
		return nil, &MultipleFoundError{"datastore cluster", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return sps[0], nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DefaultDatastoreCluster(ctx context.Context) (*object.StoragePod, error) {
Packit Service 4d2de5
	sp, err := f.DatastoreCluster(ctx, "*")
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, toDefaultError(err)
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return sp, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DatastoreClusterOrDefault(ctx context.Context, path string) (*object.StoragePod, error) {
Packit Service 4d2de5
	if path != "" {
Packit Service 4d2de5
		sp, err := f.DatastoreCluster(ctx, path)
Packit Service 4d2de5
		if err != nil {
Packit Service 4d2de5
			return nil, err
Packit Service 4d2de5
		}
Packit Service 4d2de5
		return sp, nil
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return f.DefaultDatastoreCluster(ctx)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) ComputeResourceList(ctx context.Context, path string) ([]*object.ComputeResource, error) {
Packit Service 4d2de5
	s := &spec{
Packit Service 4d2de5
		Relative: f.hostFolder,
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	es, err := f.find(ctx, path, s)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	var crs []*object.ComputeResource
Packit Service 4d2de5
	for _, e := range es {
Packit Service 4d2de5
		var cr *object.ComputeResource
Packit Service 4d2de5
Packit Service 4d2de5
		switch o := e.Object.(type) {
Packit Service 4d2de5
		case mo.ComputeResource, mo.ClusterComputeResource:
Packit Service 4d2de5
			cr = object.NewComputeResource(f.client, o.Reference())
Packit Service 4d2de5
		default:
Packit Service 4d2de5
			continue
Packit Service 4d2de5
		}
Packit Service 4d2de5
Packit Service 4d2de5
		cr.InventoryPath = e.Path
Packit Service 4d2de5
		crs = append(crs, cr)
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(crs) == 0 {
Packit Service 4d2de5
		return nil, &NotFoundError{"compute resource", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return crs, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) ComputeResource(ctx context.Context, path string) (*object.ComputeResource, error) {
Packit Service 4d2de5
	crs, err := f.ComputeResourceList(ctx, path)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(crs) > 1 {
Packit Service 4d2de5
		return nil, &MultipleFoundError{"compute resource", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return crs[0], nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DefaultComputeResource(ctx context.Context) (*object.ComputeResource, error) {
Packit Service 4d2de5
	cr, err := f.ComputeResource(ctx, "*")
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, toDefaultError(err)
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return cr, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) ComputeResourceOrDefault(ctx context.Context, path string) (*object.ComputeResource, error) {
Packit Service 4d2de5
	if path != "" {
Packit Service 4d2de5
		cr, err := f.ComputeResource(ctx, path)
Packit Service 4d2de5
		if err != nil {
Packit Service 4d2de5
			return nil, err
Packit Service 4d2de5
		}
Packit Service 4d2de5
		return cr, nil
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return f.DefaultComputeResource(ctx)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) ClusterComputeResourceList(ctx context.Context, path string) ([]*object.ClusterComputeResource, error) {
Packit Service 4d2de5
	s := &spec{
Packit Service 4d2de5
		Relative: f.hostFolder,
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	es, err := f.find(ctx, path, s)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	var ccrs []*object.ClusterComputeResource
Packit Service 4d2de5
	for _, e := range es {
Packit Service 4d2de5
		var ccr *object.ClusterComputeResource
Packit Service 4d2de5
Packit Service 4d2de5
		switch o := e.Object.(type) {
Packit Service 4d2de5
		case mo.ClusterComputeResource:
Packit Service 4d2de5
			ccr = object.NewClusterComputeResource(f.client, o.Reference())
Packit Service 4d2de5
		default:
Packit Service 4d2de5
			continue
Packit Service 4d2de5
		}
Packit Service 4d2de5
Packit Service 4d2de5
		ccr.InventoryPath = e.Path
Packit Service 4d2de5
		ccrs = append(ccrs, ccr)
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(ccrs) == 0 {
Packit Service 4d2de5
		return nil, &NotFoundError{"cluster", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return ccrs, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DefaultClusterComputeResource(ctx context.Context) (*object.ClusterComputeResource, error) {
Packit Service 4d2de5
	cr, err := f.ClusterComputeResource(ctx, "*")
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, toDefaultError(err)
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return cr, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) ClusterComputeResource(ctx context.Context, path string) (*object.ClusterComputeResource, error) {
Packit Service 4d2de5
	ccrs, err := f.ClusterComputeResourceList(ctx, path)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(ccrs) > 1 {
Packit Service 4d2de5
		return nil, &MultipleFoundError{"cluster", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return ccrs[0], nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) ClusterComputeResourceOrDefault(ctx context.Context, path string) (*object.ClusterComputeResource, error) {
Packit Service 4d2de5
	if path != "" {
Packit Service 4d2de5
		cr, err := f.ClusterComputeResource(ctx, path)
Packit Service 4d2de5
		if err != nil {
Packit Service 4d2de5
			return nil, err
Packit Service 4d2de5
		}
Packit Service 4d2de5
		return cr, nil
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return f.DefaultClusterComputeResource(ctx)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) HostSystemList(ctx context.Context, path string) ([]*object.HostSystem, error) {
Packit Service 4d2de5
	s := &spec{
Packit Service 4d2de5
		Relative: f.hostFolder,
Packit Service 4d2de5
		Parents:  []string{"ComputeResource", "ClusterComputeResource"},
Packit Service 4d2de5
		Include:  []string{"HostSystem"},
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	es, err := f.find(ctx, path, s)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	var hss []*object.HostSystem
Packit Service 4d2de5
	for _, e := range es {
Packit Service 4d2de5
		var hs *object.HostSystem
Packit Service 4d2de5
Packit Service 4d2de5
		switch o := e.Object.(type) {
Packit Service 4d2de5
		case mo.HostSystem:
Packit Service 4d2de5
			hs = object.NewHostSystem(f.client, o.Reference())
Packit Service 4d2de5
Packit Service 4d2de5
			hs.InventoryPath = e.Path
Packit Service 4d2de5
			hss = append(hss, hs)
Packit Service 4d2de5
		case mo.ComputeResource, mo.ClusterComputeResource:
Packit Service 4d2de5
			cr := object.NewComputeResource(f.client, o.Reference())
Packit Service 4d2de5
Packit Service 4d2de5
			cr.InventoryPath = e.Path
Packit Service 4d2de5
Packit Service 4d2de5
			hosts, err := cr.Hosts(ctx)
Packit Service 4d2de5
			if err != nil {
Packit Service 4d2de5
				return nil, err
Packit Service 4d2de5
			}
Packit Service 4d2de5
Packit Service 4d2de5
			hss = append(hss, hosts...)
Packit Service 4d2de5
		}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(hss) == 0 {
Packit Service 4d2de5
		return nil, &NotFoundError{"host", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return hss, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) HostSystem(ctx context.Context, path string) (*object.HostSystem, error) {
Packit Service 4d2de5
	hss, err := f.HostSystemList(ctx, path)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(hss) > 1 {
Packit Service 4d2de5
		return nil, &MultipleFoundError{"host", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return hss[0], nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DefaultHostSystem(ctx context.Context) (*object.HostSystem, error) {
Packit Service 4d2de5
	hs, err := f.HostSystem(ctx, "*")
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, toDefaultError(err)
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return hs, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) HostSystemOrDefault(ctx context.Context, path string) (*object.HostSystem, error) {
Packit Service 4d2de5
	if path != "" {
Packit Service 4d2de5
		hs, err := f.HostSystem(ctx, path)
Packit Service 4d2de5
		if err != nil {
Packit Service 4d2de5
			return nil, err
Packit Service 4d2de5
		}
Packit Service 4d2de5
		return hs, nil
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return f.DefaultHostSystem(ctx)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) NetworkList(ctx context.Context, path string) ([]object.NetworkReference, error) {
Packit Service 4d2de5
	s := &spec{
Packit Service 4d2de5
		Relative: f.networkFolder,
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	es, err := f.find(ctx, path, s)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	var ns []object.NetworkReference
Packit Service 4d2de5
	for _, e := range es {
Packit Service 4d2de5
		ref := e.Object.Reference()
Packit Service 4d2de5
		switch ref.Type {
Packit Service 4d2de5
		case "Network":
Packit Service 4d2de5
			r := object.NewNetwork(f.client, ref)
Packit Service 4d2de5
			r.InventoryPath = e.Path
Packit Service 4d2de5
			ns = append(ns, r)
Packit Service 4d2de5
		case "OpaqueNetwork":
Packit Service 4d2de5
			r := object.NewOpaqueNetwork(f.client, ref)
Packit Service 4d2de5
			r.InventoryPath = e.Path
Packit Service 4d2de5
			ns = append(ns, r)
Packit Service 4d2de5
		case "DistributedVirtualPortgroup":
Packit Service 4d2de5
			r := object.NewDistributedVirtualPortgroup(f.client, ref)
Packit Service 4d2de5
			r.InventoryPath = e.Path
Packit Service 4d2de5
			ns = append(ns, r)
Packit Service 4d2de5
		case "DistributedVirtualSwitch", "VmwareDistributedVirtualSwitch":
Packit Service 4d2de5
			r := object.NewDistributedVirtualSwitch(f.client, ref)
Packit Service 4d2de5
			r.InventoryPath = e.Path
Packit Service 4d2de5
			ns = append(ns, r)
Packit Service 4d2de5
		}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(ns) == 0 {
Packit Service 4d2de5
		return nil, &NotFoundError{"network", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return ns, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) Network(ctx context.Context, path string) (object.NetworkReference, error) {
Packit Service 4d2de5
	networks, err := f.NetworkList(ctx, path)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(networks) > 1 {
Packit Service 4d2de5
		return nil, &MultipleFoundError{"network", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return networks[0], nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DefaultNetwork(ctx context.Context) (object.NetworkReference, error) {
Packit Service 4d2de5
	network, err := f.Network(ctx, "*")
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, toDefaultError(err)
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return network, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) NetworkOrDefault(ctx context.Context, path string) (object.NetworkReference, error) {
Packit Service 4d2de5
	if path != "" {
Packit Service 4d2de5
		network, err := f.Network(ctx, path)
Packit Service 4d2de5
		if err != nil {
Packit Service 4d2de5
			return nil, err
Packit Service 4d2de5
		}
Packit Service 4d2de5
		return network, nil
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return f.DefaultNetwork(ctx)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) ResourcePoolList(ctx context.Context, path string) ([]*object.ResourcePool, error) {
Packit Service 4d2de5
	s := &spec{
Packit Service 4d2de5
		Relative: f.hostFolder,
Packit Service 4d2de5
		Parents:  []string{"ComputeResource", "ClusterComputeResource", "VirtualApp"},
Packit Service 4d2de5
		Nested:   []string{"ResourcePool"},
Packit Service 4d2de5
		Contents: true,
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	es, err := f.find(ctx, path, s)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	var rps []*object.ResourcePool
Packit Service 4d2de5
	for _, e := range es {
Packit Service 4d2de5
		var rp *object.ResourcePool
Packit Service 4d2de5
Packit Service 4d2de5
		switch o := e.Object.(type) {
Packit Service 4d2de5
		case mo.ResourcePool:
Packit Service 4d2de5
			rp = object.NewResourcePool(f.client, o.Reference())
Packit Service 4d2de5
			rp.InventoryPath = e.Path
Packit Service 4d2de5
			rps = append(rps, rp)
Packit Service 4d2de5
		}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(rps) == 0 {
Packit Service 4d2de5
		return nil, &NotFoundError{"resource pool", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return rps, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) ResourcePool(ctx context.Context, path string) (*object.ResourcePool, error) {
Packit Service 4d2de5
	rps, err := f.ResourcePoolList(ctx, path)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(rps) > 1 {
Packit Service 4d2de5
		return nil, &MultipleFoundError{"resource pool", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return rps[0], nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DefaultResourcePool(ctx context.Context) (*object.ResourcePool, error) {
Packit Service 4d2de5
	rp, err := f.ResourcePool(ctx, "*/Resources")
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, toDefaultError(err)
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return rp, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) ResourcePoolOrDefault(ctx context.Context, path string) (*object.ResourcePool, error) {
Packit Service 4d2de5
	if path != "" {
Packit Service 4d2de5
		rp, err := f.ResourcePool(ctx, path)
Packit Service 4d2de5
		if err != nil {
Packit Service 4d2de5
			return nil, err
Packit Service 4d2de5
		}
Packit Service 4d2de5
		return rp, nil
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return f.DefaultResourcePool(ctx)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// ResourcePoolListAll combines ResourcePoolList and VirtualAppList
Packit Service 4d2de5
// VirtualAppList is only called if ResourcePoolList does not find any pools with the given path.
Packit Service 4d2de5
func (f *Finder) ResourcePoolListAll(ctx context.Context, path string) ([]*object.ResourcePool, error) {
Packit Service 4d2de5
	pools, err := f.ResourcePoolList(ctx, path)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		if _, ok := err.(*NotFoundError); !ok {
Packit Service 4d2de5
			return nil, err
Packit Service 4d2de5
		}
Packit Service 4d2de5
Packit Service 4d2de5
		vapps, _ := f.VirtualAppList(ctx, path)
Packit Service 4d2de5
Packit Service 4d2de5
		if len(vapps) == 0 {
Packit Service 4d2de5
			return nil, err
Packit Service 4d2de5
		}
Packit Service 4d2de5
Packit Service 4d2de5
		for _, vapp := range vapps {
Packit Service 4d2de5
			pools = append(pools, vapp.ResourcePool)
Packit Service 4d2de5
		}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return pools, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) DefaultFolder(ctx context.Context) (*object.Folder, error) {
Packit Service 4d2de5
	ref, err := f.vmFolder(ctx)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, toDefaultError(err)
Packit Service 4d2de5
	}
Packit Service 4d2de5
	folder := object.NewFolder(f.client, ref.Reference())
Packit Service 4d2de5
Packit Service 4d2de5
	// Set the InventoryPath of the newly created folder object
Packit Service 4d2de5
	// The default foler becomes the datacenter's "vm" folder.
Packit Service 4d2de5
	// The "vm" folder always exists for a datacenter. It cannot be
Packit Service 4d2de5
	// removed or replaced
Packit Service 4d2de5
	folder.SetInventoryPath(path.Join(f.dc.InventoryPath, "vm"))
Packit Service 4d2de5
Packit Service 4d2de5
	return folder, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) FolderOrDefault(ctx context.Context, path string) (*object.Folder, error) {
Packit Service 4d2de5
	if path != "" {
Packit Service 4d2de5
		folder, err := f.Folder(ctx, path)
Packit Service 4d2de5
		if err != nil {
Packit Service 4d2de5
			return nil, err
Packit Service 4d2de5
		}
Packit Service 4d2de5
		return folder, nil
Packit Service 4d2de5
	}
Packit Service 4d2de5
	return f.DefaultFolder(ctx)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) VirtualMachineList(ctx context.Context, path string) ([]*object.VirtualMachine, error) {
Packit Service 4d2de5
	s := &spec{
Packit Service 4d2de5
		Relative: f.vmFolder,
Packit Service 4d2de5
		Parents:  []string{"VirtualApp"},
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	es, err := f.find(ctx, path, s)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	var vms []*object.VirtualMachine
Packit Service 4d2de5
	for _, e := range es {
Packit Service 4d2de5
		switch o := e.Object.(type) {
Packit Service 4d2de5
		case mo.VirtualMachine:
Packit Service 4d2de5
			vm := object.NewVirtualMachine(f.client, o.Reference())
Packit Service 4d2de5
			vm.InventoryPath = e.Path
Packit Service 4d2de5
			vms = append(vms, vm)
Packit Service 4d2de5
		}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(vms) == 0 {
Packit Service 4d2de5
		return nil, &NotFoundError{"vm", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return vms, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) VirtualMachine(ctx context.Context, path string) (*object.VirtualMachine, error) {
Packit Service 4d2de5
	vms, err := f.VirtualMachineList(ctx, path)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(vms) > 1 {
Packit Service 4d2de5
		return nil, &MultipleFoundError{"vm", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return vms[0], nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) VirtualAppList(ctx context.Context, path string) ([]*object.VirtualApp, error) {
Packit Service 4d2de5
	s := &spec{
Packit Service 4d2de5
		Relative: f.vmFolder,
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	es, err := f.find(ctx, path, s)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	var apps []*object.VirtualApp
Packit Service 4d2de5
	for _, e := range es {
Packit Service 4d2de5
		switch o := e.Object.(type) {
Packit Service 4d2de5
		case mo.VirtualApp:
Packit Service 4d2de5
			app := object.NewVirtualApp(f.client, o.Reference())
Packit Service 4d2de5
			app.InventoryPath = e.Path
Packit Service 4d2de5
			apps = append(apps, app)
Packit Service 4d2de5
		}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(apps) == 0 {
Packit Service 4d2de5
		return nil, &NotFoundError{"app", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return apps, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) VirtualApp(ctx context.Context, path string) (*object.VirtualApp, error) {
Packit Service 4d2de5
	apps, err := f.VirtualAppList(ctx, path)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(apps) > 1 {
Packit Service 4d2de5
		return nil, &MultipleFoundError{"app", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return apps[0], nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) FolderList(ctx context.Context, path string) ([]*object.Folder, error) {
Packit Service 4d2de5
	es, err := f.ManagedObjectList(ctx, path)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	var folders []*object.Folder
Packit Service 4d2de5
Packit Service 4d2de5
	for _, e := range es {
Packit Service 4d2de5
		switch o := e.Object.(type) {
Packit Service 4d2de5
		case mo.Folder, mo.StoragePod:
Packit Service 4d2de5
			folder := object.NewFolder(f.client, o.Reference())
Packit Service 4d2de5
			folder.InventoryPath = e.Path
Packit Service 4d2de5
			folders = append(folders, folder)
Packit Service 4d2de5
		case *object.Folder:
Packit Service 4d2de5
			// RootFolder
Packit Service 4d2de5
			folders = append(folders, o)
Packit Service 4d2de5
		}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(folders) == 0 {
Packit Service 4d2de5
		return nil, &NotFoundError{"folder", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return folders, nil
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func (f *Finder) Folder(ctx context.Context, path string) (*object.Folder, error) {
Packit Service 4d2de5
	folders, err := f.FolderList(ctx, path)
Packit Service 4d2de5
	if err != nil {
Packit Service 4d2de5
		return nil, err
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	if len(folders) > 1 {
Packit Service 4d2de5
		return nil, &MultipleFoundError{"folder", path}
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	return folders[0], nil
Packit Service 4d2de5
}