diff --git a/cli.go b/cli.go index f617f56..f80529a 100644 --- a/cli.go +++ b/cli.go @@ -7,19 +7,26 @@ import ( ) func cmdList(stdout io.Writer, stderr io.Writer, s *state) int { - groups := make(map[string][]string, 0) + groups := make(map[string]interface{}, 0) for _, res := range s.resources() { for _, grp := range res.Groups() { + tmpGroup := []string{} _, ok := groups[grp] - if !ok { - groups[grp] = []string{} + if ok { + tmpGroup = groups[grp].([]string) } - groups[grp] = append(groups[grp], res.Address()) + tmpGroup = append(tmpGroup, res.Address()) + groups[grp] = tmpGroup } } + groups["all"] = make(map[string]string, 0) + for _, out := range s.outputs() { + groups["all"].(map[string]string)[out.keyName] = out.value + } + return output(stdout, stderr, groups) } 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/output.go b/output.go new file mode 100644 index 0000000..f459429 --- /dev/null +++ b/output.go @@ -0,0 +1,26 @@ +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..a20fd26 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