databricks-cli/experimental/tfprovider/load.go

122 lines
2.5 KiB
Go

package tfprovider
import (
"context"
"encoding/json"
"errors"
"fmt"
"log"
"os"
"path/filepath"
"github.com/hashicorp/hc-install/product"
"github.com/hashicorp/hc-install/releases"
"github.com/hashicorp/terraform-exec/tfexec"
tfjson "github.com/hashicorp/terraform-json"
)
const DatabricksProvider = "registry.terraform.io/databricks/databricks"
func writeTfJson(path string) error {
var body = map[string]interface{}{
"terraform": map[string]interface{}{
"required_providers": map[string]interface{}{
"databricks": map[string]interface{}{
"source": "databricks/databricks",
"version": ">= 1.0.0",
},
},
},
}
f, err := os.Create(path)
if err != nil {
return err
}
defer f.Close()
enc := json.NewEncoder(f)
err = enc.Encode(body)
if err != nil {
return err
}
return nil
}
func ProduceProviderSchema() (*tfjson.ProviderSchema, error) {
dir := "./tmp"
err := os.Mkdir(dir, 0755)
if err != nil && !errors.Is(err, os.ErrExist) {
log.Fatal(err)
}
err = writeTfJson(filepath.Join(dir, "main.tf.json"))
if err != nil {
log.Fatalf("writing main.tf.json: %s", err)
}
installer := &releases.LatestVersion{
Product: product.Terraform,
}
log.Printf("[INFO] Installing Terraform")
execPath, err := installer.Install(context.Background())
if err != nil {
log.Fatal(err)
}
tf, err := tfexec.NewTerraform(dir, execPath)
if err != nil {
log.Fatal(err)
}
log.Printf("[INFO] Running `terraform init`")
err = tf.Init(context.Background(), tfexec.Upgrade(true))
if err != nil {
log.Fatal(err)
}
log.Printf("[INFO] Acquiring provider schema")
schemas, err := tf.ProvidersSchema(context.Background())
if err != nil {
log.Fatal(err)
}
// Find the databricks provider definition.
schema, ok := schemas.Schemas[DatabricksProvider]
if !ok {
return nil, fmt.Errorf("schema file doesn't include schema for %s", DatabricksProvider)
}
return schema, nil
}
func LoadSchema(path string) (*tfjson.ProviderSchema, error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
var document tfjson.ProviderSchemas
dec := json.NewDecoder(f)
err = dec.Decode(&document)
if err != nil {
return nil, err
}
err = document.Validate()
if err != nil {
return nil, fmt.Errorf("invalid schema: %w", err)
}
// Find the databricks provider definition.
schema, ok := document.Schemas[DatabricksProvider]
if !ok {
return nil, fmt.Errorf("schema file doesn't include schema for %s", DatabricksProvider)
}
return schema, nil
}