github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/cloudflare/dns.go (about) 1 // Copyright 2019 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 cloudflare 16 17 import ( 18 "fmt" 19 "log" 20 21 "github.com/GoogleCloudPlatform/terraformer/terraformutils" 22 cf "github.com/cloudflare/cloudflare-go" 23 ) 24 25 type DNSGenerator struct { 26 CloudflareService 27 } 28 29 func (*DNSGenerator) createZonesResource(api *cf.API, zoneID string) ([]terraformutils.Resource, error) { 30 zoneDetails, err := api.ZoneDetails(zoneID) 31 if err != nil { 32 log.Println(err) 33 return []terraformutils.Resource{}, err 34 } 35 36 resource := terraformutils.NewResource( 37 zoneDetails.ID, 38 zoneDetails.Name, 39 "cloudflare_zone", 40 "cloudflare", 41 map[string]string{ 42 "id": zoneDetails.ID, 43 }, 44 []string{}, 45 map[string]interface{}{}, 46 ) 47 resource.IgnoreKeys = append(resource.IgnoreKeys, "^meta$") 48 49 return []terraformutils.Resource{resource}, nil 50 } 51 52 func (*DNSGenerator) createRecordsResources(api *cf.API, zoneID string) ([]terraformutils.Resource, error) { 53 resources := []terraformutils.Resource{} 54 records, err := api.DNSRecords(zoneID, cf.DNSRecord{}) 55 if err != nil { 56 log.Println(err) 57 return resources, err 58 } 59 60 for _, record := range records { 61 r := terraformutils.NewResource( 62 record.ID, 63 fmt.Sprintf("%s_%s_%s", record.Type, record.ZoneName, record.ID), 64 "cloudflare_record", 65 "cloudflare", 66 map[string]string{ 67 "zone_id": zoneID, 68 "domain": record.ZoneName, 69 "name": record.Name, 70 }, 71 []string{}, 72 map[string]interface{}{}, 73 ) 74 75 r.IgnoreKeys = append(r.IgnoreKeys, "^metadata") 76 resources = append(resources, r) 77 } 78 79 return resources, nil 80 } 81 82 func (g *DNSGenerator) InitResources() error { 83 api, err := g.initializeAPI() 84 if err != nil { 85 log.Println(err) 86 return err 87 } 88 89 zones, err := api.ListZones() 90 if err != nil { 91 log.Println(err) 92 return err 93 } 94 95 funcs := []func(*cf.API, string) ([]terraformutils.Resource, error){ 96 g.createZonesResource, 97 g.createRecordsResources, 98 } 99 100 for _, zone := range zones { 101 for _, f := range funcs { 102 tmpRes, err := f(api, zone.ID) 103 if err != nil { 104 log.Println(err) 105 return err 106 } 107 g.Resources = append(g.Resources, tmpRes...) 108 } 109 } 110 return nil 111 } 112 113 func (g *DNSGenerator) PostConvertHook() error { 114 // 'record' resource have 'data' and 'value' is mutual-exclude 115 // delete which one have empty value 116 for i, resource := range g.Resources { 117 if resource.InstanceInfo.Type == "cloudflare_record" { 118 if val, ok := resource.Item["data"]; ok && len(val.(map[string]interface{})) == 0 { 119 delete(g.Resources[i].Item, "data") 120 } else if val, ok := resource.Item["value"]; ok && len(val.(string)) == 0 { 121 delete(g.Resources[i].Item, "value") 122 } 123 } 124 } 125 126 return nil 127 }