github.com/vmware/govmomi@v0.51.0/cli/flags/virtual_app.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 VirtualAppFlag struct {
    17  	common
    18  
    19  	*DatacenterFlag
    20  	*SearchFlag
    21  
    22  	name string
    23  	app  *object.VirtualApp
    24  }
    25  
    26  var virtualAppFlagKey = flagKey("virtualApp")
    27  
    28  func NewVirtualAppFlag(ctx context.Context) (*VirtualAppFlag, context.Context) {
    29  	if v := ctx.Value(virtualAppFlagKey); v != nil {
    30  		return v.(*VirtualAppFlag), ctx
    31  	}
    32  
    33  	v := &VirtualAppFlag{}
    34  	v.DatacenterFlag, ctx = NewDatacenterFlag(ctx)
    35  	v.SearchFlag, ctx = NewSearchFlag(ctx, SearchVirtualApps)
    36  	ctx = context.WithValue(ctx, virtualAppFlagKey, v)
    37  	return v, ctx
    38  }
    39  
    40  func (flag *VirtualAppFlag) Register(ctx context.Context, f *flag.FlagSet) {
    41  	flag.RegisterOnce(func() {
    42  		flag.DatacenterFlag.Register(ctx, f)
    43  		flag.SearchFlag.Register(ctx, f)
    44  
    45  		env := "GOVC_VAPP"
    46  		value := os.Getenv(env)
    47  		usage := fmt.Sprintf("Virtual App [%s]", env)
    48  		f.StringVar(&flag.name, "vapp", value, usage)
    49  	})
    50  }
    51  
    52  func (flag *VirtualAppFlag) Process(ctx context.Context) error {
    53  	return flag.ProcessOnce(func() error {
    54  		if err := flag.DatacenterFlag.Process(ctx); err != nil {
    55  			return err
    56  		}
    57  		if err := flag.SearchFlag.Process(ctx); err != nil {
    58  			return err
    59  		}
    60  		return nil
    61  	})
    62  }
    63  
    64  func (flag *VirtualAppFlag) VirtualApp() (*object.VirtualApp, error) {
    65  	ctx := context.TODO()
    66  
    67  	if flag.app != nil {
    68  		return flag.app, nil
    69  	}
    70  
    71  	// Use search flags if specified.
    72  	if flag.SearchFlag.IsSet() {
    73  		app, err := flag.SearchFlag.VirtualApp()
    74  		if err != nil {
    75  			return nil, err
    76  		}
    77  
    78  		flag.app = app
    79  		return flag.app, nil
    80  	}
    81  
    82  	// Never look for a default virtual app.
    83  	if flag.name == "" {
    84  		return nil, nil
    85  	}
    86  
    87  	finder, err := flag.Finder()
    88  	if err != nil {
    89  		return nil, err
    90  	}
    91  
    92  	flag.app, err = finder.VirtualApp(ctx, flag.name)
    93  	return flag.app, err
    94  }