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 }