Files
infra-provisioner/resource.go
2020-09-17 13:02:33 +05:30

83 lines
1.8 KiB
Go

package main
import (
"log"
"os"
"os/exec"
"strings"
"text/template"
"github.cmd.navi-tech.in/navi-infra/infra-provisioner/bindata"
"github.com/Masterminds/sprig/v3"
)
const TemplatesDir = "templates"
const InitScript = "./deploy.sh"
func provisionResource(resourceName, resourceDir string, manifest *Manifest, templateOnly, plan bool) error {
err := templateResourceTf(resourceName, resourceDir, manifest, resourceDir)
if err != nil {
log.Fatalf("\nErr: %v", err)
return err
}
if !templateOnly {
err = executeResourceTf(resourceDir, plan)
if err != nil {
log.Fatalf("\nErr: %v", err)
return err
}
}
return nil
}
func templateResourceTf(templateName, resourceDir string, manifest *Manifest, destinationDir string) error {
log.Printf("Creating templates for %s in %s", templateName, resourceDir)
tfFiles, err := bindata.AssetDir(strings.Join([]string{TemplatesDir, resourceDir}, "/"))
if err != nil {
return err
}
for _, tfFile := range tfFiles {
tfBytes := bindata.MustAsset(strings.Join([]string{TemplatesDir, resourceDir, tfFile}, "/"))
t := template.Must(template.New(templateName).Funcs(sprig.TxtFuncMap()).Parse(string(tfBytes)))
tfOut, err := createFile(destinationDir, tfFile)
if err != nil {
log.Fatalf("\nErr: %v", err)
return err
}
err = t.Execute(tfOut, manifest)
if err != nil {
log.Fatalf("\nErr: %v", err)
return err
}
tfOut.Close()
}
return nil
}
func executeResourceTf(resourceDir string, plan bool) error {
var cmd *exec.Cmd
if plan {
cmd = exec.Command(InitScript, "plan")
} else {
log.Printf("Running terraform for %s", resourceDir)
cmd = exec.Command(InitScript)
}
cmd.Dir = resourceDir
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
log.Fatalf("\nErr: %v", err)
return err
}
return err
}