mirror of https://github.com/databricks/cli.git
122 lines
2.5 KiB
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
|
|
}
|