github.com/vmware/govmomi@v0.51.0/cli/flags/resource_pool.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/find"
    14  	"github.com/vmware/govmomi/object"
    15  )
    16  
    17  type ResourcePoolFlag struct {
    18  	common
    19  
    20  	*DatacenterFlag
    21  
    22  	name string
    23  	pool *object.ResourcePool
    24  }
    25  
    26  var resourcePoolFlagKey = flagKey("resourcePool")
    27  
    28  func NewResourcePoolFlag(ctx context.Context) (*ResourcePoolFlag, context.Context) {
    29  	if v := ctx.Value(resourcePoolFlagKey); v != nil {
    30  		return v.(*ResourcePoolFlag), ctx
    31  	}
    32  
    33  	v := &ResourcePoolFlag{}
    34  	v.DatacenterFlag, ctx = NewDatacenterFlag(ctx)
    35  	ctx = context.WithValue(ctx, resourcePoolFlagKey, v)
    36  	return v, ctx
    37  }
    38  
    39  func (flag *ResourcePoolFlag) Register(ctx context.Context, f *flag.FlagSet) {
    40  	flag.RegisterOnce(func() {
    41  		flag.DatacenterFlag.Register(ctx, f)
    42  
    43  		env := "GOVC_RESOURCE_POOL"
    44  		value := os.Getenv(env)
    45  		usage := fmt.Sprintf("Resource pool [%s]", env)
    46  		f.StringVar(&flag.name, "pool", value, usage)
    47  	})
    48  }
    49  
    50  func (flag *ResourcePoolFlag) Process(ctx context.Context) error {
    51  	return flag.ProcessOnce(func() error {
    52  		if err := flag.DatacenterFlag.Process(ctx); err != nil {
    53  			return err
    54  		}
    55  		return nil
    56  	})
    57  }
    58  
    59  func (flag *ResourcePoolFlag) IsSet() bool {
    60  	return flag.name != ""
    61  }
    62  
    63  func (flag *ResourcePoolFlag) ResourcePool() (*object.ResourcePool, error) {
    64  	if flag.pool != nil {
    65  		return flag.pool, nil
    66  	}
    67  
    68  	finder, err := flag.Finder()
    69  	if err != nil {
    70  		return nil, err
    71  	}
    72  
    73  	flag.pool, err = finder.ResourcePoolOrDefault(context.TODO(), flag.name)
    74  	if err != nil {
    75  		if _, ok := err.(*find.NotFoundError); ok {
    76  			vapp, verr := finder.VirtualApp(context.TODO(), flag.name)
    77  			if verr != nil {
    78  				return nil, err
    79  			}
    80  			flag.pool = vapp.ResourcePool
    81  		} else {
    82  			return nil, err
    83  		}
    84  	}
    85  
    86  	return flag.pool, nil
    87  }
    88  
    89  func (flag *ResourcePoolFlag) ResourcePoolIfSpecified() (*object.ResourcePool, error) {
    90  	if flag.name == "" {
    91  		return nil, nil
    92  	}
    93  	return flag.ResourcePool()
    94  }