github.com/vmware/govmomi@v0.51.0/cli/fields/set.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 fields
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"strings"
    11  
    12  	"github.com/vmware/govmomi/cli"
    13  	"github.com/vmware/govmomi/cli/flags"
    14  	"github.com/vmware/govmomi/object"
    15  )
    16  
    17  type set struct {
    18  	*flags.DatacenterFlag
    19  	add  bool
    20  	kind string
    21  }
    22  
    23  func init() {
    24  	cli.Register("fields.set", &set{})
    25  }
    26  
    27  func (cmd *set) Register(ctx context.Context, f *flag.FlagSet) {
    28  	cmd.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx)
    29  	cmd.DatacenterFlag.Register(ctx, f)
    30  
    31  	f.StringVar(&cmd.kind, "type", "", "Managed object type on which to add "+
    32  		"the field if it does not exist. This flag is ignored unless -add=true")
    33  	f.BoolVar(&cmd.add, "add", false, "Adds the field if it does not exist. "+
    34  		"Use the -type flag to specify the managed object type to which the "+
    35  		"field is added. Using -add and omitting -kind causes a new, global "+
    36  		"field to be created if a field with the provided name does not "+
    37  		"already exist.")
    38  }
    39  
    40  func (cmd *set) Usage() string {
    41  	return "KEY VALUE PATH..."
    42  }
    43  
    44  func (cmd *set) Description() string {
    45  	return `Set custom field values for PATH.
    46  
    47  Examples:
    48    govc fields.set my-field-name field-value vm/my-vm
    49    govc fields.set -add my-new-global-field-name field-value vm/my-vm
    50    govc fields.set -add -type VirtualMachine my-new-vm-field-name field-value vm/my-vm`
    51  }
    52  
    53  func (cmd *set) Run(ctx context.Context, f *flag.FlagSet) error {
    54  	if f.NArg() < 3 {
    55  		return flag.ErrHelp
    56  	}
    57  
    58  	c, err := cmd.Client()
    59  	if err != nil {
    60  		return err
    61  	}
    62  
    63  	m, err := object.GetCustomFieldsManager(c)
    64  	if err != nil {
    65  		return err
    66  	}
    67  
    68  	args := f.Args()
    69  
    70  	key, err := m.FindKey(ctx, args[0])
    71  	if err != nil {
    72  		if !(cmd.add && strings.Contains(err.Error(), "key name not found")) {
    73  			return err
    74  		}
    75  		// Add the missing field.
    76  		def, err := m.Add(ctx, args[0], cmd.kind, nil, nil)
    77  		if err != nil {
    78  			return err
    79  		}
    80  		// Assign the new field's key to the "key" var used below when
    81  		// setting the key/value pair on the provided list of objects.
    82  		key = def.Key
    83  	}
    84  
    85  	val := args[1]
    86  
    87  	objs, err := cmd.ManagedObjects(ctx, args[2:])
    88  	if err != nil {
    89  		return err
    90  	}
    91  
    92  	for _, ref := range objs {
    93  		err := m.Set(ctx, ref, key, val)
    94  		if err != nil {
    95  			return err
    96  		}
    97  	}
    98  
    99  	return nil
   100  }