github.com/GoogleCloudPlatform/terraformer@v0.8.18/build/main.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"log"
     8  	"os"
     9  	"os/exec"
    10  	"strings"
    11  )
    12  
    13  const filePrefix = "provider_cmd_"
    14  const fileSuffix = ".go"
    15  const packageCmdPath = "cmd"
    16  
    17  func main() {
    18  	provider := os.Args[1]
    19  	log.Println("Build terraformer with " + provider + " provider...")
    20  	files, err := ioutil.ReadDir(packageCmdPath)
    21  	if err != nil {
    22  		log.Println(err)
    23  	}
    24  	deletedProvider := []string{}
    25  	for _, f := range files {
    26  		if strings.HasPrefix(f.Name(), filePrefix) {
    27  			if !strings.HasPrefix(f.Name(), filePrefix+provider+fileSuffix) {
    28  				providerName := strings.ReplaceAll(f.Name(), filePrefix, "")
    29  				providerName = strings.ReplaceAll(providerName, fileSuffix, "")
    30  				deletedProvider = append(deletedProvider, providerName)
    31  			}
    32  		}
    33  	}
    34  	// move files for deleted providers
    35  	err = os.MkdirAll(packageCmdPath+"/tmp", os.ModePerm)
    36  	if err != nil {
    37  		log.Println(err)
    38  	}
    39  	for _, provider := range deletedProvider {
    40  		err := os.Rename(packageCmdPath+"/"+filePrefix+provider+fileSuffix, packageCmdPath+"/tmp/"+filePrefix+provider+fileSuffix)
    41  		if err != nil {
    42  			log.Println(err)
    43  		}
    44  	}
    45  
    46  	// comment deleted providers in code
    47  	rootCode, err := ioutil.ReadFile(packageCmdPath + "/root.go")
    48  	if err != nil {
    49  		log.Println(err)
    50  	}
    51  	lines := strings.Split(string(rootCode), "\n")
    52  	newRootCodeLines := make([]string, len(lines))
    53  	for i, line := range lines {
    54  		for _, provider := range deletedProvider {
    55  			if strings.Contains(strings.ToLower(line), "newcmd"+provider+"importer") {
    56  				line = "// " + line
    57  			}
    58  			if strings.Contains(strings.ToLower(line), "new"+provider+"provider") {
    59  				line = "// " + line
    60  			}
    61  		}
    62  		newRootCodeLines[i] = line
    63  	}
    64  	newRootCode := strings.Join(newRootCodeLines, "\n")
    65  	err = ioutil.WriteFile(packageCmdPath+"/root.go", []byte(newRootCode), os.ModePerm)
    66  	if err != nil {
    67  		log.Println(err)
    68  	}
    69  	// build....
    70  	cmd := exec.Command("go", "build", "-o", "terraformer-"+provider)
    71  	var outb, errb bytes.Buffer
    72  	cmd.Stdout = &outb
    73  	cmd.Stderr = &errb
    74  	err = cmd.Run()
    75  	if err != nil {
    76  		log.Fatal("err:", errb.String())
    77  	}
    78  	fmt.Println(outb.String())
    79  
    80  	// revert code and files
    81  	err = ioutil.WriteFile(packageCmdPath+"/root.go", rootCode, os.ModePerm)
    82  	if err != nil {
    83  		log.Println(err)
    84  	}
    85  	for _, provider := range deletedProvider {
    86  		err := os.Rename(packageCmdPath+"/tmp/"+filePrefix+provider+fileSuffix, "cmd/"+filePrefix+provider+fileSuffix)
    87  		if err != nil {
    88  			log.Println(err)
    89  		}
    90  	}
    91  }