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 }