1package get
2
3import (
4	"flag"
5	"fmt"
6	"io"
7	"sort"
8	"time"
9
10	"github.com/hashicorp/consul/command/flags"
11	"github.com/hashicorp/consul/command/intention/finder"
12	"github.com/mitchellh/cli"
13	"github.com/ryanuber/columnize"
14)
15
16func New(ui cli.Ui) *cmd {
17	c := &cmd{UI: ui}
18	c.init()
19	return c
20}
21
22type cmd struct {
23	UI    cli.Ui
24	flags *flag.FlagSet
25	http  *flags.HTTPFlags
26	help  string
27
28	// testStdin is the input for testing.
29	testStdin io.Reader
30}
31
32func (c *cmd) init() {
33	c.flags = flag.NewFlagSet("", flag.ContinueOnError)
34	c.http = &flags.HTTPFlags{}
35	flags.Merge(c.flags, c.http.ClientFlags())
36	flags.Merge(c.flags, c.http.ServerFlags())
37	c.help = flags.Usage(help, c.flags)
38}
39
40func (c *cmd) Run(args []string) int {
41	if err := c.flags.Parse(args); err != nil {
42		return 1
43	}
44
45	// Create and test the HTTP client
46	client, err := c.http.APIClient()
47	if err != nil {
48		c.UI.Error(fmt.Sprintf("Error connecting to Consul agent: %s", err))
49		return 1
50	}
51
52	// Get the intention ID to load
53	f := &finder.Finder{Client: client}
54	id, err := f.IDFromArgs(c.flags.Args())
55	if err != nil {
56		c.UI.Error(fmt.Sprintf("Error: %s", err))
57		return 1
58	}
59
60	// Read the intention
61	ixn, _, err := client.Connect().IntentionGet(id, nil)
62	if err != nil {
63		c.UI.Error(fmt.Sprintf("Error reading the intention: %s", err))
64		return 1
65	}
66
67	// Format the tabular data
68	data := []string{
69		fmt.Sprintf("Source:|%s", ixn.SourceString()),
70		fmt.Sprintf("Destination:|%s", ixn.DestinationString()),
71		fmt.Sprintf("Action:|%s", ixn.Action),
72		fmt.Sprintf("ID:|%s", ixn.ID),
73	}
74	if v := ixn.Description; v != "" {
75		data = append(data, fmt.Sprintf("Description:|%s", v))
76	}
77	if len(ixn.Meta) > 0 {
78		var keys []string
79		for k := range ixn.Meta {
80			keys = append(keys, k)
81		}
82		sort.Strings(keys)
83		for _, k := range keys {
84			data = append(data, fmt.Sprintf("Meta[%s]:|%s", k, ixn.Meta[k]))
85		}
86	}
87	data = append(data,
88		fmt.Sprintf("Created At:|%s", ixn.CreatedAt.Local().Format(time.RFC850)),
89	)
90
91	c.UI.Output(columnize.SimpleFormat(data))
92	return 0
93}
94
95func (c *cmd) Synopsis() string {
96	return synopsis
97}
98
99func (c *cmd) Help() string {
100	return c.help
101}
102
103const synopsis = "Show information about an intention."
104const help = `
105Usage: consul intention get [options] SRC DST
106Usage: consul intention get [options] ID
107
108  Read and show the details about an intention. The intention can be looked
109  up via an exact source/destination match or via the unique intention ID.
110
111      $ consul intention get web db
112
113`
114