// Parse parses the given input and returns the root object. // // The input format can be either HCL or JSON. func Parse(input string) (*ast.File, error) { switch lexMode(input) { case lexModeHcl: return hclParser.Parse([]byte(input)) case lexModeJson: return jsonParser.Parse([]byte(input)) } return nil, fmt.Errorf("unknown config format") }
func parse(in []byte) (*ast.File, error) { switch lexMode(in) { case lexModeHcl: return hclParser.Parse(in) case lexModeJson: return jsonParser.Parse(in) } return nil, fmt.Errorf("unknown config format") }
// hclParse parses the given JSON input and updates the internal hcl object // representation func (t *Template) hclParse(jsonIn string) error { file, err := parser.Parse([]byte(jsonIn)) if err != nil { return err } if node, ok := file.Node.(*ast.ObjectList); ok { t.node = node } else { return errors.New("template should be of type objectList") } return nil }
func (t *TerraformTarget) Finish(taskMap map[string]fi.Task) error { resourcesByType := make(map[string]map[string]interface{}) for _, res := range t.resources { resources := resourcesByType[res.ResourceType] if resources == nil { resources = make(map[string]interface{}) resourcesByType[res.ResourceType] = resources } tfName := tfSanitize(res.ResourceName) if resources[tfName] != nil { return fmt.Errorf("duplicate resource found: %s.%s", res.ResourceType, tfName) } resources[tfName] = res.Item } providersByName := make(map[string]map[string]interface{}) if t.Cloud.ProviderID() == fi.CloudProviderGCE { providerGoogle := make(map[string]interface{}) providerGoogle["project"] = t.Project providerGoogle["region"] = t.Region providersByName["google"] = providerGoogle } else if t.Cloud.ProviderID() == fi.CloudProviderAWS { providerAWS := make(map[string]interface{}) providerAWS["region"] = t.Region providersByName["aws"] = providerAWS } data := make(map[string]interface{}) data["resource"] = resourcesByType if len(providersByName) != 0 { data["provider"] = providersByName } jsonBytes, err := json.MarshalIndent(data, "", " ") if err != nil { return fmt.Errorf("error marshalling terraform data to json: %v", err) } useJson := false if useJson { t.files["kubernetes.tf"] = jsonBytes } else { f, err := hcl_parser.Parse(jsonBytes) if err != nil { return fmt.Errorf("error parsing terraform json: %v", err) } b, err := hclPrint(f) if err != nil { return fmt.Errorf("error writing terraform data to output: %v", err) } t.files["kubernetes.tf"] = b } for relativePath, contents := range t.files { p := path.Join(t.outDir, relativePath) err = os.MkdirAll(path.Dir(p), os.FileMode(0755)) if err != nil { return fmt.Errorf("error creating output directory %q: %v", path.Dir(p), err) } err = ioutil.WriteFile(p, contents, os.FileMode(0644)) if err != nil { return fmt.Errorf("error writing terraform data to output file %q: %v", p, err) } } glog.Infof("Terraform output is in %s", t.outDir) return nil }