account_file can be verbatim JSON string

pull/2811/head
Dave Cunningham 11 years ago
parent 31d3678814
commit 1fea962a3a

@ -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
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)
}
}
defer f.Close()
dec := json.NewDecoder(f)
return dec.Decode(result)
return nil
}

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

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

Loading…
Cancel
Save