github.com/hbgames/consul@v1.4.5/command/event/event.go (about) 1 package event 2 3 import ( 4 "flag" 5 "fmt" 6 "regexp" 7 8 "github.com/hashicorp/consul/api" 9 "github.com/hashicorp/consul/command/flags" 10 "github.com/mitchellh/cli" 11 ) 12 13 func New(ui cli.Ui) *cmd { 14 c := &cmd{UI: ui} 15 c.init() 16 return c 17 } 18 19 type cmd struct { 20 UI cli.Ui 21 flags *flag.FlagSet 22 http *flags.HTTPFlags 23 name string 24 node string 25 service string 26 tag string 27 help string 28 } 29 30 func (c *cmd) init() { 31 c.flags = flag.NewFlagSet("", flag.ContinueOnError) 32 c.flags.StringVar(&c.name, "name", "", 33 "Name of the event.") 34 c.flags.StringVar(&c.node, "node", "", 35 "Regular expression to filter on node names.") 36 c.flags.StringVar(&c.service, "service", "", 37 "Regular expression to filter on service instances.") 38 c.flags.StringVar(&c.tag, "tag", "", 39 "Regular expression to filter on service tags. Must be used with -service.") 40 41 c.http = &flags.HTTPFlags{} 42 flags.Merge(c.flags, c.http.ClientFlags()) 43 c.help = flags.Usage(help, c.flags) 44 } 45 46 func (c *cmd) Run(args []string) int { 47 if err := c.flags.Parse(args); err != nil { 48 return 1 49 } 50 51 // Check for a name 52 if c.name == "" { 53 c.UI.Error("Event name must be specified") 54 c.UI.Error("") 55 c.UI.Error(c.Help()) 56 return 1 57 } 58 59 // Validate the filters 60 if c.node != "" { 61 if _, err := regexp.Compile(c.node); err != nil { 62 c.UI.Error(fmt.Sprintf("Failed to compile node filter regexp: %v", err)) 63 return 1 64 } 65 } 66 if c.service != "" { 67 if _, err := regexp.Compile(c.service); err != nil { 68 c.UI.Error(fmt.Sprintf("Failed to compile service filter regexp: %v", err)) 69 return 1 70 } 71 } 72 if c.tag != "" { 73 if _, err := regexp.Compile(c.tag); err != nil { 74 c.UI.Error(fmt.Sprintf("Failed to compile tag filter regexp: %v", err)) 75 return 1 76 } 77 } 78 if c.tag != "" && c.service == "" { 79 c.UI.Error("Cannot provide tag filter without service filter.") 80 return 1 81 } 82 83 // Check for a payload 84 var payload []byte 85 args = c.flags.Args() 86 switch len(args) { 87 case 0: 88 case 1: 89 payload = []byte(args[0]) 90 default: 91 c.UI.Error("Too many command line arguments.") 92 c.UI.Error("") 93 c.UI.Error(c.Help()) 94 return 1 95 } 96 97 // Create and test the HTTP client 98 client, err := c.http.APIClient() 99 if err != nil { 100 c.UI.Error(fmt.Sprintf("Error connecting to Consul agent: %s", err)) 101 return 1 102 } 103 _, err = client.Agent().NodeName() 104 if err != nil { 105 c.UI.Error(fmt.Sprintf("Error querying Consul agent: %s", err)) 106 return 1 107 } 108 109 // Prepare the request 110 event := client.Event() 111 params := &api.UserEvent{ 112 Name: c.name, 113 Payload: payload, 114 NodeFilter: c.node, 115 ServiceFilter: c.service, 116 TagFilter: c.tag, 117 } 118 119 // Fire the event 120 id, _, err := event.Fire(params, nil) 121 if err != nil { 122 c.UI.Error(fmt.Sprintf("Error firing event: %s", err)) 123 return 1 124 } 125 126 // Write out the ID 127 c.UI.Output(fmt.Sprintf("Event ID: %s", id)) 128 return 0 129 } 130 131 func (c *cmd) Synopsis() string { 132 return synopsis 133 } 134 135 func (c *cmd) Help() string { 136 return c.help 137 } 138 139 const synopsis = "Fire a new event" 140 const help = ` 141 Usage: consul event [options] [payload] 142 143 Dispatches a custom user event across a datacenter. An event must provide 144 a name, but a payload is optional. Events support filtering using 145 regular expressions on node name, service, and tag definitions. 146 `