diff --git a/builder/googlecompute/account.go b/builder/googlecompute/account.go index 59baf6044..ea94b11f1 100644 --- a/builder/googlecompute/account.go +++ b/builder/googlecompute/account.go @@ -2,7 +2,10 @@ package googlecompute import ( "encoding/json" + "fmt" + "io/ioutil" "os" + "strings" ) // accountFile represents the structure of the account file JSON file. @@ -13,13 +16,37 @@ type accountFile struct { ClientId string `json:"client_id"` } -func loadJSON(result interface{}, path string) error { - f, err := os.Open(path) - if err != nil { - return err - } - defer f.Close() - - dec := json.NewDecoder(f) +func parseJSON(result interface{}, text string) error { + r := strings.NewReader(text) + dec := json.NewDecoder(r) return dec.Decode(result) } + +func processAccountFile(account_file *accountFile, text string) error { + // Assume text is a JSON string + if err := parseJSON(account_file, text); err != nil { + // If text was not JSON, assume it is a file path instead + if _, err := os.Stat(text); os.IsNotExist(err) { + return fmt.Errorf( + "account_file path does not exist: %s", + text) + } + + b, err := ioutil.ReadFile(text) + if err != nil { + return fmt.Errorf( + "Error reading account_file from path '%s': %s", + text, err) + } + + contents := string(b) + + if err := parseJSON(account_file, contents); err != nil { + return fmt.Errorf( + "Error parsing account file '%s': %s", + contents, err) + } + } + + return nil +} diff --git a/builder/googlecompute/config.go b/builder/googlecompute/config.go index 317d64ace..4ca45c69f 100644 --- a/builder/googlecompute/config.go +++ b/builder/googlecompute/config.go @@ -131,9 +131,8 @@ func NewConfig(raws ...interface{}) (*Config, []string, error) { c.stateTimeout = stateTimeout if c.AccountFile != "" { - if err := loadJSON(&c.account, c.AccountFile); err != nil { - errs = packer.MultiErrorAppend( - errs, fmt.Errorf("Failed parsing account file: %s", err)) + if err := processAccountFile(&c.account, c.AccountFile); err != nil { + errs = packer.MultiErrorAppend(errs, err) } } diff --git a/website/source/docs/builders/googlecompute.html.markdown b/website/source/docs/builders/googlecompute.html.markdown index 56fdafdcd..c97cd672a 100644 --- a/website/source/docs/builders/googlecompute.html.markdown +++ b/website/source/docs/builders/googlecompute.html.markdown @@ -77,7 +77,9 @@ straightforwarded, it is documented here. Below is a fully functioning example. It doesn't do anything useful, since no provisioners are defined, but it will effectively repackage an existing GCE -image. The account file is obtained in the previous section. +image. The account_file is obtained in the previous section. If it parses as +JSON it is assumed to be the file itself, otherwise it is assumed to be +the path to the file containing the JSON. ``` {.javascript} {