github.com/vmware/govmomi@v0.51.0/cli/alarm/create.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 alarm
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  
    12  	"github.com/vmware/govmomi/alarm"
    13  	"github.com/vmware/govmomi/cli"
    14  	"github.com/vmware/govmomi/cli/flags"
    15  	"github.com/vmware/govmomi/vim25/methods"
    16  	"github.com/vmware/govmomi/vim25/mo"
    17  	"github.com/vmware/govmomi/vim25/types"
    18  )
    19  
    20  type create struct {
    21  	*flags.DatacenterFlag
    22  
    23  	types.AlarmSpec
    24  
    25  	r    bool
    26  	kind string
    27  
    28  	green, yellow, red string
    29  }
    30  
    31  func init() {
    32  	cli.Register("alarm.create", &create{}, true)
    33  }
    34  
    35  func (cmd *create) Register(ctx context.Context, f *flag.FlagSet) {
    36  	cmd.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx)
    37  	cmd.DatacenterFlag.Register(ctx, f)
    38  
    39  	f.StringVar(&cmd.AlarmSpec.Name, "n", "", "Alarm name")
    40  	f.StringVar(&cmd.AlarmSpec.Description, "d", "", "Alarm description")
    41  	f.BoolVar(&cmd.Enabled, "enabled", true, "Enabled")
    42  
    43  	f.StringVar(&cmd.kind, "type", "VirtualMachine", "Object type")
    44  	f.BoolVar(&cmd.r, "r", false, "Reconfigure existing alarm")
    45  
    46  	f.StringVar(&cmd.green, "green", "", "green status event type")
    47  	f.StringVar(&cmd.yellow, "yellow", "", "yellow status event type")
    48  	f.StringVar(&cmd.red, "red", "", "red status event type")
    49  }
    50  
    51  func (cmd *create) Usage() string {
    52  	return "[PATH]"
    53  }
    54  
    55  func (cmd *create) Description() string {
    56  	return `Create alarm.
    57  
    58  Examples:
    59    govc alarm.create -n "My Alarm" -green my.alarm.success -yellow my.alarm.failure
    60    govc event.post -i my.alarm.failure $vm
    61    govc alarms $vm`
    62  }
    63  
    64  func (cmd *create) Run(ctx context.Context, f *flag.FlagSet) error {
    65  	c, err := cmd.Client()
    66  	if err != nil {
    67  		return err
    68  	}
    69  
    70  	obj := c.ServiceContent.RootFolder
    71  	if f.NArg() == 1 {
    72  		obj, err = cmd.ManagedObject(ctx, f.Arg(0))
    73  		if err != nil {
    74  			return err
    75  		}
    76  	}
    77  
    78  	var or types.OrAlarmExpression
    79  
    80  	expressions := []struct {
    81  		status types.ManagedEntityStatus
    82  		typeID string
    83  	}{
    84  		{types.ManagedEntityStatusGreen, cmd.green},
    85  		{types.ManagedEntityStatusYellow, cmd.yellow},
    86  		{types.ManagedEntityStatusRed, cmd.red},
    87  	}
    88  
    89  	for _, exp := range expressions {
    90  		if exp.typeID != "" {
    91  			or.Expression = append(or.Expression, &types.EventAlarmExpression{
    92  				EventType:   "vim.event.EventEx",
    93  				EventTypeId: exp.typeID,
    94  				ObjectType:  "vim." + cmd.kind,
    95  				Status:      exp.status,
    96  			})
    97  		}
    98  	}
    99  
   100  	cmd.AlarmSpec.Expression = &or
   101  
   102  	m, err := alarm.GetManager(c)
   103  	if err != nil {
   104  		return err
   105  	}
   106  
   107  	if cmd.r {
   108  		alarms, err := m.GetAlarm(ctx, obj)
   109  		if err != nil {
   110  			return err
   111  		}
   112  
   113  		var alarm *mo.Alarm
   114  		for i := range alarms {
   115  			if alarms[i].Info.Name == cmd.AlarmSpec.Name {
   116  				alarm = &alarms[i]
   117  				break
   118  			}
   119  		}
   120  		if alarm == nil {
   121  			return fmt.Errorf("%s not found", cmd.AlarmSpec.Name)
   122  		}
   123  
   124  		_, err = methods.ReconfigureAlarm(ctx, c, &types.ReconfigureAlarm{
   125  			This: alarm.Self,
   126  			Spec: &cmd.AlarmSpec,
   127  		})
   128  		return err
   129  	}
   130  
   131  	ref, err := m.CreateAlarm(ctx, obj, &cmd.AlarmSpec)
   132  	if err != nil {
   133  		return err
   134  	}
   135  
   136  	fmt.Println(ref.Value)
   137  
   138  	return nil
   139  }