github.com/vmware/govmomi@v0.51.0/cli/flags/host_system.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 HostSystemFlag struct {
    17  	common
    18  
    19  	*ClientFlag
    20  	*DatacenterFlag
    21  	*SearchFlag
    22  
    23  	name string
    24  	host *object.HostSystem
    25  	pool *object.ResourcePool
    26  }
    27  
    28  var hostSystemFlagKey = flagKey("hostSystem")
    29  
    30  func NewHostSystemFlag(ctx context.Context) (*HostSystemFlag, context.Context) {
    31  	if v := ctx.Value(hostSystemFlagKey); v != nil {
    32  		return v.(*HostSystemFlag), ctx
    33  	}
    34  
    35  	v := &HostSystemFlag{}
    36  	v.ClientFlag, ctx = NewClientFlag(ctx)
    37  	v.DatacenterFlag, ctx = NewDatacenterFlag(ctx)
    38  	v.SearchFlag, ctx = NewSearchFlag(ctx, SearchHosts)
    39  	ctx = context.WithValue(ctx, hostSystemFlagKey, v)
    40  	return v, ctx
    41  }
    42  
    43  func (flag *HostSystemFlag) Register(ctx context.Context, f *flag.FlagSet) {
    44  	flag.RegisterOnce(func() {
    45  		flag.ClientFlag.Register(ctx, f)
    46  		flag.DatacenterFlag.Register(ctx, f)
    47  		flag.SearchFlag.Register(ctx, f)
    48  
    49  		env := "GOVC_HOST"
    50  		value := os.Getenv(env)
    51  		usage := fmt.Sprintf("Host system [%s]", env)
    52  		f.StringVar(&flag.name, "host", value, usage)
    53  	})
    54  }
    55  
    56  func (flag *HostSystemFlag) Process(ctx context.Context) error {
    57  	return flag.ProcessOnce(func() error {
    58  		if err := flag.ClientFlag.Process(ctx); err != nil {
    59  			return err
    60  		}
    61  		if err := flag.DatacenterFlag.Process(ctx); err != nil {
    62  			return err
    63  		}
    64  		if err := flag.SearchFlag.Process(ctx); err != nil {
    65  			return err
    66  		}
    67  		return nil
    68  	})
    69  }
    70  
    71  func (flag *HostSystemFlag) HostSystemIfSpecified() (*object.HostSystem, error) {
    72  	if flag.host != nil {
    73  		return flag.host, nil
    74  	}
    75  
    76  	// Use search flags if specified.
    77  	if flag.SearchFlag.IsSet() && flag.SearchFlag.t == SearchHosts {
    78  		host, err := flag.SearchFlag.HostSystem()
    79  		if err != nil {
    80  			return nil, err
    81  		}
    82  
    83  		flag.host = host
    84  		return flag.host, nil
    85  	}
    86  
    87  	// Never look for a default host system.
    88  	// A host system parameter is optional for vm creation. It uses a mandatory
    89  	// resource pool parameter to determine where the vm should be placed.
    90  	if flag.name == "" {
    91  		return nil, nil
    92  	}
    93  
    94  	finder, err := flag.Finder()
    95  	if err != nil {
    96  		return nil, err
    97  	}
    98  
    99  	flag.host, err = finder.HostSystem(context.TODO(), flag.name)
   100  	return flag.host, err
   101  }
   102  
   103  func (flag *HostSystemFlag) HostSystem() (*object.HostSystem, error) {
   104  	host, err := flag.HostSystemIfSpecified()
   105  	if err != nil {
   106  		return nil, err
   107  	}
   108  
   109  	if host != nil {
   110  		return host, nil
   111  	}
   112  
   113  	finder, err := flag.Finder()
   114  	if err != nil {
   115  		return nil, err
   116  	}
   117  
   118  	flag.host, err = finder.DefaultHostSystem(context.TODO())
   119  	return flag.host, err
   120  }
   121  
   122  func (flag *HostSystemFlag) HostNetworkSystem() (*object.HostNetworkSystem, error) {
   123  	host, err := flag.HostSystem()
   124  	if err != nil {
   125  		return nil, err
   126  	}
   127  
   128  	return host.ConfigManager().NetworkSystem(context.TODO())
   129  }