mirror of
https://github.com/adammck/terraform-inventory
synced 2024-11-26 11:53:48 +01:00
ff15699be0
This change is really overkill for just defining the state path. However, this opens the door for additional configuration options such as choosing the keys to match on for the "host" argument.
62 lines
1.2 KiB
Go
62 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"io/ioutil"
|
|
"strings"
|
|
)
|
|
|
|
type state struct {
|
|
Modules []moduleState `json:"modules"`
|
|
}
|
|
|
|
// read populates the state object from a statefile.
|
|
func (s *state) read(stateFile io.Reader) error {
|
|
|
|
// read statefile contents
|
|
b, err := ioutil.ReadAll(stateFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// parse into struct
|
|
err = json.Unmarshal(b, s)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// hosts returns a map of name to instanceState, for each of the aws_instance
|
|
// resources found in the statefile.
|
|
func (s *state) instances() map[string]instanceState {
|
|
inst := make(map[string]instanceState)
|
|
|
|
for _, m := range s.Modules {
|
|
for k, r := range m.Resources {
|
|
if r.Type == "aws_instance" {
|
|
name := strings.TrimPrefix(k, "aws_instance.")
|
|
inst[name] = r.Primary
|
|
}
|
|
}
|
|
}
|
|
|
|
return inst
|
|
}
|
|
|
|
type moduleState struct {
|
|
Resources map[string]resourceState `json:"resources"`
|
|
}
|
|
|
|
type resourceState struct {
|
|
Type string `json:"type"`
|
|
Primary instanceState `json:"primary"`
|
|
}
|
|
|
|
type instanceState struct {
|
|
ID string `json:"id"`
|
|
Attributes map[string]string `json:"attributes,omitempty"`
|
|
}
|