github.com/vmware/govmomi@v0.51.0/cli/flags/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 flags
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  	"os"
    12  
    13  	"github.com/vmware/govmomi/object"
    14  )
    15  
    16  type FolderFlag struct {
    17  	common
    18  
    19  	*DatacenterFlag
    20  
    21  	name   string
    22  	folder *object.Folder
    23  }
    24  
    25  var folderFlagKey = flagKey("folder")
    26  
    27  func NewFolderFlag(ctx context.Context) (*FolderFlag, context.Context) {
    28  	if v := ctx.Value(folderFlagKey); v != nil {
    29  		return v.(*FolderFlag), ctx
    30  	}
    31  
    32  	v := &FolderFlag{}
    33  	v.DatacenterFlag, ctx = NewDatacenterFlag(ctx)
    34  	ctx = context.WithValue(ctx, folderFlagKey, v)
    35  	return v, ctx
    36  }
    37  
    38  func (flag *FolderFlag) Register(ctx context.Context, f *flag.FlagSet) {
    39  	flag.RegisterOnce(func() {
    40  		flag.DatacenterFlag.Register(ctx, f)
    41  
    42  		env := "GOVC_FOLDER"
    43  		value := os.Getenv(env)
    44  		usage := fmt.Sprintf("Inventory folder [%s]", env)
    45  		f.StringVar(&flag.name, "folder", value, usage)
    46  	})
    47  }
    48  
    49  func (flag *FolderFlag) Process(ctx context.Context) error {
    50  	return flag.ProcessOnce(func() error {
    51  		if err := flag.DatacenterFlag.Process(ctx); err != nil {
    52  			return err
    53  		}
    54  		return nil
    55  	})
    56  }
    57  
    58  func (flag *FolderFlag) IsSet() bool {
    59  	return flag.name != ""
    60  }
    61  
    62  func (flag *FolderFlag) Folder() (*object.Folder, error) {
    63  	if flag.folder != nil {
    64  		return flag.folder, nil
    65  	}
    66  
    67  	finder, err := flag.Finder()
    68  	if err != nil {
    69  		return nil, err
    70  	}
    71  
    72  	if flag.folder, err = finder.FolderOrDefault(context.TODO(), flag.name); err != nil {
    73  		return nil, err
    74  	}
    75  
    76  	return flag.folder, nil
    77  }
    78  
    79  func (flag *FolderFlag) FolderIfSpecified() (*object.Folder, error) {
    80  	if flag.name == "" {
    81  		return nil, nil
    82  	}
    83  	return flag.Folder()
    84  }
    85  
    86  func (flag *FolderFlag) FolderOrDefault(kind string) (*object.Folder, error) {
    87  	if flag.folder != nil {
    88  		return flag.folder, nil
    89  	}
    90  
    91  	if flag.name != "" {
    92  		return flag.Folder()
    93  	}
    94  
    95  	// RootFolder, no dc required
    96  	if kind == "/" {
    97  		client, err := flag.Client()
    98  		if err != nil {
    99  			return nil, err
   100  		}
   101  
   102  		flag.folder = object.NewRootFolder(client)
   103  		return flag.folder, nil
   104  	}
   105  
   106  	dc, err := flag.Datacenter()
   107  	if err != nil {
   108  		return nil, err
   109  	}
   110  
   111  	folders, err := dc.Folders(context.TODO())
   112  	if err != nil {
   113  		return nil, err
   114  	}
   115  
   116  	switch kind {
   117  	case "vm":
   118  		flag.folder = folders.VmFolder
   119  	case "host":
   120  		flag.folder = folders.HostFolder
   121  	case "datastore":
   122  		flag.folder = folders.DatastoreFolder
   123  	case "network":
   124  		flag.folder = folders.NetworkFolder
   125  	default:
   126  		panic(kind)
   127  	}
   128  
   129  	return flag.folder, nil
   130  }