github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/gcp/gcp_provider.go (about)

     1  // Copyright 2018 The Terraformer Authors.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package gcp
    16  
    17  import (
    18  	"context"
    19  	"errors"
    20  	"log"
    21  	"os"
    22  
    23  	"github.com/GoogleCloudPlatform/terraformer/terraformutils"
    24  	"google.golang.org/api/compute/v1"
    25  )
    26  
    27  type GCPProvider struct { //nolint
    28  	terraformutils.Provider
    29  	projectName  string
    30  	region       compute.Region
    31  	providerType string
    32  }
    33  
    34  func GetRegions(project string) []string {
    35  	computeService, err := compute.NewService(context.Background())
    36  	if err != nil {
    37  		return []string{}
    38  	}
    39  	regionsList, err := computeService.Regions.List(project).Do()
    40  	if err != nil {
    41  		return []string{}
    42  	}
    43  	regions := []string{}
    44  	for _, region := range regionsList.Items {
    45  		regions = append(regions, region.Name)
    46  	}
    47  	return regions
    48  }
    49  
    50  func getRegion(project, regionName string) *compute.Region {
    51  	computeService, err := compute.NewService(context.Background())
    52  	if err != nil {
    53  		log.Println(err)
    54  		return &compute.Region{}
    55  	}
    56  	region, err := computeService.Regions.Get(project, regionName).Do()
    57  	if err != nil {
    58  		log.Println(err)
    59  		return &compute.Region{}
    60  	}
    61  	return region
    62  }
    63  
    64  // check projectName in env params
    65  func (p *GCPProvider) Init(args []string) error {
    66  	projectName := os.Getenv("GOOGLE_CLOUD_PROJECT")
    67  	if len(args) > 1 {
    68  		projectName = args[1]
    69  	}
    70  	if projectName == "" {
    71  		return errors.New("google cloud project name must be set")
    72  	}
    73  	p.projectName = projectName
    74  	p.region = *getRegion(projectName, args[0])
    75  	p.providerType = args[2]
    76  	return nil
    77  }
    78  
    79  func (p *GCPProvider) GetName() string {
    80  	if p.providerType != "" {
    81  		return "google-" + p.providerType
    82  	}
    83  	return "google"
    84  }
    85  
    86  func (p *GCPProvider) InitService(serviceName string, verbose bool) error {
    87  	var isSupported bool
    88  	if _, isSupported = p.GetSupportedService()[serviceName]; !isSupported {
    89  		return errors.New("gcp: " + serviceName + " not supported service")
    90  	}
    91  	p.Service = p.GetSupportedService()[serviceName]
    92  	p.Service.SetName(serviceName)
    93  	p.Service.SetVerbose(verbose)
    94  	p.Service.SetProviderName(p.GetName())
    95  	p.Service.SetArgs(map[string]interface{}{
    96  		"region":  p.region,
    97  		"project": p.projectName,
    98  	})
    99  	return nil
   100  }
   101  
   102  // GetGCPSupportService return map of support service for GCP
   103  func (p *GCPProvider) GetSupportedService() map[string]terraformutils.ServiceGenerator {
   104  	services := ComputeServices
   105  	services["bigQuery"] = &GCPFacade{service: &BigQueryGenerator{}}
   106  	services["cloudFunctions"] = &GCPFacade{service: &CloudFunctionsGenerator{}}
   107  	services["cloudsql"] = &GCPFacade{service: &CloudSQLGenerator{}}
   108  	services["dataProc"] = &GCPFacade{service: &DataprocGenerator{}}
   109  	services["dns"] = &GCPFacade{service: &CloudDNSGenerator{}}
   110  	services["gcs"] = &GCPFacade{service: &GcsGenerator{}}
   111  	services["gke"] = &GCPFacade{service: &GkeGenerator{}}
   112  	services["iam"] = &GCPFacade{service: &IamGenerator{}}
   113  	services["kms"] = &GCPFacade{service: &KmsGenerator{}}
   114  	services["logging"] = &GCPFacade{service: &LoggingGenerator{}}
   115  	services["memoryStore"] = &GCPFacade{service: &MemoryStoreGenerator{}}
   116  	services["monitoring"] = &GCPFacade{service: &MonitoringGenerator{}}
   117  	services["project"] = &GCPFacade{service: &ProjectGenerator{}}
   118  	services["instances"] = &GCPFacade{service: &InstancesGenerator{}}
   119  	services["pubsub"] = &GCPFacade{service: &PubsubGenerator{}}
   120  	services["schedulerJobs"] = &GCPFacade{service: &SchedulerJobsGenerator{}}
   121  	return services
   122  }
   123  
   124  func (GCPProvider) GetResourceConnections() map[string]map[string][]string {
   125  	return map[string]map[string][]string{
   126  		"backendBuckets": {"gcs": []string{"bucket_name", "name"}},
   127  		"firewall":       {"networks": []string{"network", "self_link"}},
   128  		"gke": {
   129  			"networks":    []string{"network", "self_link"},
   130  			"subnetworks": []string{"subnetwork", "self_link"},
   131  		},
   132  		"instanceTemplates": {
   133  			"networks":    []string{"network", "self_link"},
   134  			"subnetworks": []string{"subnetworks", "self_link"},
   135  		},
   136  		"regionInstanceGroupManagers": {"instanceTemplates": []string{"version.instance_template", "self_link"}},
   137  		"instanceGroups":              {"instanceTemplates": []string{"version.instance_template", "self_link"}},
   138  		"routes":                      {"networks": []string{"network", "self_link"}},
   139  		"subnetworks":                 {"networks": []string{"network", "self_link"}},
   140  		"forwardingRules": {
   141  			"regionBackendServices": []string{"backend_service", "self_link"},
   142  			"networks":              []string{"network", "self_link"},
   143  		},
   144  		"globalForwardingRules": {
   145  			"targetHttpsProxies": []string{"target", "self_link"},
   146  			"targetHttpProxies":  []string{"target", "self_link"},
   147  			"targetSslProxies":   []string{"target", "self_link"},
   148  		},
   149  		"targetHttpsProxies": {
   150  			"urlMaps": []string{"url_map", "self_link"},
   151  		},
   152  		"targetHttpProxies": {
   153  			"urlMaps": []string{"url_map", "self_link"},
   154  		},
   155  		"targetSslProxies": {
   156  			"backendServices": []string{"backend_service", "self_link"},
   157  		},
   158  		"backendServices": {
   159  			"regionInstanceGroupManagers": []string{"backend.group", "instance_group"},
   160  			"instanceGroupManagers":       []string{"backend.group", "instance_group"},
   161  			"healthChecks":                []string{"health_checks", "self_link"},
   162  		},
   163  		"regionBackendServices": {
   164  			"regionInstanceGroupManagers": []string{"backend.group", "instance_group"},
   165  			"instanceGroupManagers":       []string{"backend.group", "instance_group"},
   166  			"healthChecks":                []string{"health_checks", "self_link"},
   167  		},
   168  		"urlMaps": {
   169  			"backendServices": []string{
   170  				"default_service", "self_link",
   171  				"path_matcher.default_service", "self_link",
   172  				"path_matcher.path_rule.service", "self_link",
   173  			},
   174  			"regionBackendServices": []string{
   175  				"default_service", "self_link",
   176  				"path_matcher.default_service", "self_link",
   177  				"path_matcher.path_rule.service", "self_link",
   178  			},
   179  		},
   180  	}
   181  }
   182  func (p GCPProvider) GetProviderData(arg ...string) map[string]interface{} {
   183  	return map[string]interface{}{
   184  		"provider": map[string]interface{}{
   185  			p.GetName(): map[string]interface{}{
   186  				"project": p.projectName,
   187  			},
   188  		},
   189  	}
   190  }