github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/gcp/pubsub.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 "log" 20 "strings" 21 22 "google.golang.org/api/pubsub/v1" 23 24 "github.com/GoogleCloudPlatform/terraformer/terraformutils" 25 ) 26 27 var pubsubAllowEmptyValues = []string{""} 28 29 var pubsubAdditionalFields = map[string]interface{}{} 30 31 type PubsubGenerator struct { 32 GCPService 33 } 34 35 // Run on subscriptionsList and create for each TerraformResource 36 func (g PubsubGenerator) createSubscriptionsResources(ctx context.Context, subscriptionsList *pubsub.ProjectsSubscriptionsListCall) []terraformutils.Resource { 37 resources := []terraformutils.Resource{} 38 if err := subscriptionsList.Pages(ctx, func(page *pubsub.ListSubscriptionsResponse) error { 39 for _, obj := range page.Subscriptions { 40 t := strings.Split(obj.Name, "/") 41 name := t[len(t)-1] 42 resources = append(resources, terraformutils.NewResource( 43 name, 44 obj.Name, 45 "google_pubsub_subscription", 46 g.ProviderName, 47 map[string]string{ 48 "name": name, 49 "project": g.GetArgs()["project"].(string), 50 }, 51 pubsubAllowEmptyValues, 52 pubsubAdditionalFields, 53 )) 54 } 55 return nil 56 }); err != nil { 57 log.Println(err) 58 } 59 return resources 60 } 61 62 // Run on topicsList and create for each TerraformResource 63 func (g PubsubGenerator) createTopicsListResources(ctx context.Context, topicsList *pubsub.ProjectsTopicsListCall) []terraformutils.Resource { 64 resources := []terraformutils.Resource{} 65 if err := topicsList.Pages(ctx, func(page *pubsub.ListTopicsResponse) error { 66 for _, obj := range page.Topics { 67 t := strings.Split(obj.Name, "/") 68 name := t[len(t)-1] 69 resources = append(resources, terraformutils.NewResource( 70 g.GetArgs()["project"].(string)+"/"+name, 71 obj.Name, 72 "google_pubsub_topic", 73 g.ProviderName, 74 map[string]string{ 75 "name": name, 76 "project": g.GetArgs()["project"].(string), 77 }, 78 pubsubAllowEmptyValues, 79 pubsubAdditionalFields, 80 )) 81 } 82 return nil 83 }); err != nil { 84 log.Println(err) 85 } 86 return resources 87 } 88 89 // Generate TerraformResources from GCP API, 90 func (g *PubsubGenerator) InitResources() error { 91 ctx := context.Background() 92 pubsubService, err := pubsub.NewService(ctx) 93 if err != nil { 94 return err 95 } 96 97 subscriptionsList := pubsubService.Projects.Subscriptions.List("projects/" + g.GetArgs()["project"].(string)) 98 subscriptionsResources := g.createSubscriptionsResources(ctx, subscriptionsList) 99 100 topicsList := pubsubService.Projects.Topics.List("projects/" + g.GetArgs()["project"].(string)) 101 topicsResources := g.createTopicsListResources(ctx, topicsList) 102 103 g.Resources = append(g.Resources, subscriptionsResources...) 104 g.Resources = append(g.Resources, topicsResources...) 105 106 return nil 107 } 108 109 func (g *PubsubGenerator) PostConvertHook() error { 110 for i, r := range g.Resources { 111 for _, topic := range g.Resources { 112 if r.InstanceState.Attributes["topic"] == "projects/"+g.GetArgs()["project"].(string)+"/topics/"+topic.InstanceState.Attributes["name"] { 113 g.Resources[i].Item["topic"] = "${google_pubsub_topic." + topic.ResourceName + ".name}" 114 } 115 } 116 } 117 return nil 118 }