github.com/clly/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  `