diff --git a/cli.go b/cli.go index f207425..6f28013 100644 --- a/cli.go +++ b/cli.go @@ -6,8 +6,8 @@ import ( "io" ) -func gatherResources(s *state) map[string][]string { - groups := make(map[string][]string, 0) +func gatherResources(s *state) map[string]interface{} { + groups := make(map[string]interface{}, 0) for _, res := range s.resources() { for _, grp := range res.Groups() { @@ -16,10 +16,17 @@ func gatherResources(s *state) map[string][]string { groups[grp] = []string{} } - groups[grp] = append(groups[grp], res.Address()) + groups[grp] = append(groups[grp].([]string), res.Address()) } } - return groups + + if len(s.outputs()) > 0 { + groups["all"] = make(map[string]string, 0) + for _, out := range s.outputs() { + groups["all"].(map[string]string)[out.keyName] = out.value + } + } + return groups } func cmdList(stdout io.Writer, stderr io.Writer, s *state) int { @@ -27,32 +34,32 @@ func cmdList(stdout io.Writer, stderr io.Writer, s *state) int { } func cmdInventory(stdout io.Writer, stderr io.Writer, s *state) int { - groups := gatherResources(s) - for group, res := range groups { + groups := gatherResources(s) + for group, res := range groups { - _, err := io.WriteString(stdout, "["+group+"]\n") - if err != nil { - fmt.Fprintf(stderr, "Error writing Invetory: %s\n", err) - return 1; - } + _, err := io.WriteString(stdout, "["+group+"]\n") + if err != nil { + fmt.Fprintf(stderr, "Error writing Invetory: %s\n", err) + return 1 + } - for _, ress := range res { + for _, ress := range res.([]string) { - _, err := io.WriteString(stdout, ress + "\n") - if err != nil { - fmt.Fprintf(stderr, "Error writing Invetory: %s\n", err) - return 1; - } - } + _, err := io.WriteString(stdout, ress+"\n") + if err != nil { + fmt.Fprintf(stderr, "Error writing Invetory: %s\n", err) + return 1 + } + } - _, err = io.WriteString(stdout, "\n") - if err != nil { - fmt.Fprintf(stderr, "Error writing Invetory: %s\n", err) - return 1; - } - } + _, err = io.WriteString(stdout, "\n") + if err != nil { + fmt.Fprintf(stderr, "Error writing Invetory: %s\n", err) + return 1 + } + } - return 0; + return 0 } func cmdHost(stdout io.Writer, stderr io.Writer, s *state, hostname string) int { diff --git a/fixtures/example.tfstate b/fixtures/example.tfstate index c6ba058..21743cb 100644 --- a/fixtures/example.tfstate +++ b/fixtures/example.tfstate @@ -6,7 +6,9 @@ "path": [ "root" ], - "outputs": {}, + "outputs": { + "datacenter": "mydc" + }, "resources": { "aws_instance.alpha.0": { "type": "aws_instance", diff --git a/fixtures/playbook.yml b/fixtures/playbook.yml index a4d802a..2cfbdec 100644 --- a/fixtures/playbook.yml +++ b/fixtures/playbook.yml @@ -1,5 +1,5 @@ - hosts: - - web-aws - - web-do + - alpha + - beta tasks: - command: "echo Hello, world!" diff --git a/output.go b/output.go new file mode 100644 index 0000000..7cb6343 --- /dev/null +++ b/output.go @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" +) + +type Output struct { + + // The keyName and value of the output + keyName string + value string +} + +func NewOutput(keyName string, value string) (*Output, error) { + + // TODO: Warn instead of silently ignore error? + if len(keyName) == 0 { + return nil, fmt.Errorf("couldn't parse keyName: %s", keyName) + } + + return &Output{ + keyName: keyName, + value: value, + }, nil +} diff --git a/parser.go b/parser.go index 6207070..151ae88 100644 --- a/parser.go +++ b/parser.go @@ -29,6 +29,20 @@ func (s *state) read(stateFile io.Reader) error { return nil } +// outputs returns a slice of the Outputs found in the statefile. +func (s *state) outputs() []*Output { + inst := make([]*Output, 0) + + for _, m := range s.Modules { + for k, v := range m.Outputs { + o, _ := NewOutput(k, v) + inst = append(inst, o) + } + } + + return inst +} + // resources returns a slice of the Resources found in the statefile. func (s *state) resources() []*Resource { inst := make([]*Resource, 0) @@ -43,7 +57,6 @@ func (s *state) resources() []*Resource { if err != nil { continue } - if r.IsSupported() { inst = append(inst, r) } @@ -55,6 +68,7 @@ func (s *state) resources() []*Resource { type moduleState struct { ResourceStates map[string]resourceState `json:"resources"` + Outputs map[string]string `json:"outputs"` } // resourceKeys returns a sorted slice of the key names of the resources in this diff --git a/parser_test.go b/parser_test.go index d3f5235..2579d73 100644 --- a/parser_test.go +++ b/parser_test.go @@ -18,7 +18,9 @@ const exampleStateFile = ` "path": [ "root" ], - "outputs": {}, + "outputs": { + "datacenter": "mydc" + }, "resources": { "aws_instance.one.0": { "type": "aws_instance", @@ -122,6 +124,7 @@ const exampleStateFile = ` const expectedListOutput = ` { + "all": {"datacenter": "mydc"}, "one": ["10.0.0.1", "10.0.1.1"], "two": ["50.0.0.1"], "three": ["192.168.0.3"],