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 }