github.com/vmware/govmomi@v0.43.0/govc/flags/folder.go (about)

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