1
1
mirror of https://github.com/adammck/terraform-inventory synced 2024-11-23 00:12:13 +01:00

Merge pull request #30 from lazartravica/master

Showing Terraform outputs as "global" variables
This commit is contained in:
Adam Mckaig 2016-04-09 12:16:38 -04:00
commit 9debcb4a47
6 changed files with 81 additions and 30 deletions

23
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,7 +16,14 @@ 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())
}
}
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
@ -33,26 +40,26 @@ func cmdInventory(stdout io.Writer, stderr io.Writer, s *state) int {
_, err := io.WriteString(stdout, "["+group+"]\n")
if err != nil {
fmt.Fprintf(stderr, "Error writing Invetory: %s\n", err)
return 1;
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;
return 1
}
}
_, err = io.WriteString(stdout, "\n")
if err != nil {
fmt.Fprintf(stderr, "Error writing Invetory: %s\n", err)
return 1;
return 1
}
}
return 0;
return 0
}
func cmdHost(stdout io.Writer, stderr io.Writer, s *state, hostname string) int {

@ -6,7 +6,9 @@
"path": [
"root"
],
"outputs": {},
"outputs": {
"datacenter": "mydc"
},
"resources": {
"aws_instance.alpha.0": {
"type": "aws_instance",

@ -1,5 +1,5 @@
- hosts:
- web-aws
- web-do
- alpha
- beta
tasks:
- command: "echo Hello, world!"

25
output.go Normal file

@ -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
}

@ -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

@ -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"],