Skip to content

Commit

Permalink
Merge pull request #244 from GoogleCloudPlatform/build-by-provider
Browse files Browse the repository at this point in the history
Build by provider
  • Loading branch information
sergeylanzman committed Oct 17, 2019
2 parents 8003284 + bae8f92 commit 6c6bbbd
Show file tree
Hide file tree
Showing 15 changed files with 89 additions and 9 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ $ terraformer import plan generated/google/my-project/terraformer/plan.json
From source:
1. Run `git clone <terraformer repo>`
2. Run `GO111MODULE=on go mod vendor`
3. Run `go build -v`
3. Run `go build -v` for all providers OR build with one provider `go run build/main.go {google,aws,azure,kubernetes and etc}`
4. Run ```terraform init``` against an ```init.tf``` file to install the plugins required for your platform. For example, if you need plugins for the google provider, ```init.tf``` should contain:
```
provider "google" {}
Expand Down
80 changes: 80 additions & 0 deletions build/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package main

import (
"bytes"
"fmt"
"io/ioutil"
"log"
"os"
"os/exec"
"strings"
)

const filePrefix = "provider_cmd_"
const fileSuffix = ".go"
const packageCmdPath = "cmd"

func main() {
provider := os.Args[1]
log.Println("Build terraformer with " + provider + " provider...")
files, err := ioutil.ReadDir(packageCmdPath)
if err != nil {
log.Println(err)
}
deletedProvider := []string{}
for _, f := range files {
if strings.HasPrefix(f.Name(), filePrefix) {
if !strings.HasPrefix(f.Name(), filePrefix+provider+fileSuffix) {
providerName := strings.Replace(f.Name(), filePrefix, "", -1)
providerName = strings.Replace(providerName, fileSuffix, "", -1)
deletedProvider = append(deletedProvider, providerName)
}
}
}
// move files for deleted providers
os.MkdirAll(packageCmdPath+"/tmp", os.ModePerm)
for _, provider := range deletedProvider {
err := os.Rename(packageCmdPath+"/"+filePrefix+provider+fileSuffix, packageCmdPath+"/tmp/"+filePrefix+provider+fileSuffix)
if err != nil {
log.Println(err)
}
}

// comment deleted providers in code
rootCode, err := ioutil.ReadFile(packageCmdPath + "/root.go")
lines := strings.Split(string(rootCode), "\n")
newRootCodeLines := make([]string, len(lines))
for i, line := range lines {
for _, provider := range deletedProvider {
if strings.Contains(strings.ToLower(line), "newcmd"+provider+"importer") {
line = "// " + line
}
if strings.Contains(strings.ToLower(line), "new"+provider+"provider") {
line = "// " + line
}
}
newRootCodeLines[i] = line
}
newRootCode := strings.Join(newRootCodeLines, "\n")
ioutil.WriteFile(packageCmdPath+"/root.go", []byte(newRootCode), os.ModePerm)

// build....
cmd := exec.Command("go", "build", "-o", "terraformer-"+provider)
var outb, errb bytes.Buffer
cmd.Stdout = &outb
cmd.Stderr = &errb
err = cmd.Run()
if err != nil {
log.Fatal("err:", errb.String())
}
fmt.Println(outb.String())

//revert code and files
ioutil.WriteFile(packageCmdPath+"/root.go", []byte(rootCode), os.ModePerm)
for _, provider := range deletedProvider {
err := os.Rename(packageCmdPath+"/tmp/"+filePrefix+provider+fileSuffix, "cmd/"+filePrefix+provider+fileSuffix)
if err != nil {
log.Println(err)
}
}
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
6 changes: 3 additions & 3 deletions cmd/cloudflare.go → cmd/provider_cmd_cloudflare.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func newCmdCloudflareImporter(options ImportOptions) *cobra.Command {
Short: "Import current state to Terraform configuration from Cloudflare",
Long: "Import current state to Terraform configuration from Cloudflare",
RunE: func(cmd *cobra.Command, args []string) error {
provider := newClouflareProvider()
provider := newCloudflareProvider()
err := Import(provider, options, []string{})
if err != nil {
return err
Expand All @@ -35,7 +35,7 @@ func newCmdCloudflareImporter(options ImportOptions) *cobra.Command {
},
}

cmd.AddCommand(listCmd(newClouflareProvider()))
cmd.AddCommand(listCmd(newCloudflareProvider()))
cmd.PersistentFlags().BoolVarP(&options.Connect, "connect", "c", true, "")
cmd.PersistentFlags().StringSliceVarP(&options.Resources, "resources", "r", []string{}, "zone")
cmd.PersistentFlags().StringVarP(&options.PathPattern, "path-pattern", "p", DefaultPathPattern, "{output}/{provider}/custom/{service}/")
Expand All @@ -45,6 +45,6 @@ func newCmdCloudflareImporter(options ImportOptions) *cobra.Command {
return cmd
}

func newClouflareProvider() terraform_utils.ProviderGenerator {
func newCloudflareProvider() terraform_utils.ProviderGenerator {
return &cloudflare_terraforming.CloudflareProvider{}
}
File renamed without changes.
File renamed without changes.
6 changes: 3 additions & 3 deletions cmd/google.go → cmd/provider_cmd_google.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func newCmdGoogleImporter(options ImportOptions) *cobra.Command {
originalPathPattern := options.PathPattern
for _, project := range options.Projects {
for _, region := range options.Regions {
provider := newGCPProvider()
provider := newGoogleProvider()
options.PathPattern = originalPathPattern
options.PathPattern = strings.Replace(options.PathPattern, "{provider}/{service}", "{provider}/"+project+"/{service}/"+region, -1)
log.Println(provider.GetName() + " importing project " + project + " region " + region)
Expand All @@ -44,7 +44,7 @@ func newCmdGoogleImporter(options ImportOptions) *cobra.Command {
return nil
},
}
cmd.AddCommand(listCmd(newGCPProvider()))
cmd.AddCommand(listCmd(newGoogleProvider()))
cmd.PersistentFlags().BoolVarP(&options.Connect, "connect", "c", true, "")
cmd.PersistentFlags().StringSliceVarP(&options.Resources, "resources", "r", []string{}, "firewalls,networks")
cmd.PersistentFlags().StringVarP(&options.PathPattern, "path-pattern", "p", DefaultPathPattern, "{output}/{provider}/custom/{service}/")
Expand All @@ -58,6 +58,6 @@ func newCmdGoogleImporter(options ImportOptions) *cobra.Command {
return cmd
}

func newGCPProvider() terraform_utils.ProviderGenerator {
func newGoogleProvider() terraform_utils.ProviderGenerator {
return &gcp_terraforming.GCPProvider{}
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
4 changes: 2 additions & 2 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func providerGenerators() map[string]func() terraform_utils.ProviderGenerator {
list := make(map[string]func() terraform_utils.ProviderGenerator)
for _, providerGen := range []func() terraform_utils.ProviderGenerator{
// Major Cloud
newGCPProvider,
newGoogleProvider,
newAWSProvider,
newAzureProvider,
newAliCloudProvider,
Expand All @@ -74,7 +74,7 @@ func providerGenerators() map[string]func() terraform_utils.ProviderGenerator {
// Infrastructure Software
newKubernetesProvider,
// Network
newClouflareProvider,
newCloudflareProvider,
// VCS
newGitHubProvider,
// Monitoring & System Management
Expand Down

0 comments on commit 6c6bbbd

Please sign in to comment.