github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/alicloud/pvtz.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 alicloud 16 17 import ( 18 "strconv" 19 20 "github.com/GoogleCloudPlatform/terraformer/providers/alicloud/connectivity" 21 "github.com/GoogleCloudPlatform/terraformer/terraformutils" 22 "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" 23 "github.com/aliyun/alibaba-cloud-sdk-go/services/pvtz" 24 ) 25 26 // PvtzGenerator Struct for generating AliCloud private zone 27 type PvtzGenerator struct { 28 AliCloudService 29 } 30 31 func resourceFromZoneResponse(zone pvtz.Zone) terraformutils.Resource { 32 return terraformutils.NewResource( 33 zone.ZoneId, // id 34 zone.ZoneId+"__"+zone.ZoneName, // name 35 "alicloud_pvtz_zone", 36 "alicloud", 37 map[string]string{}, 38 []string{}, 39 map[string]interface{}{}, 40 ) 41 } 42 43 func resourceFromZoneAttachmentResponse(zone pvtz.Zone) terraformutils.Resource { 44 return terraformutils.NewResource( 45 zone.ZoneId, // id 46 zone.ZoneId+"__"+zone.ZoneName+"_attachment", // name 47 "alicloud_pvtz_zone_attachment", 48 "alicloud", 49 map[string]string{}, 50 []string{}, 51 map[string]interface{}{}, 52 ) 53 } 54 55 func resourceFromZoneRecordResponse(record pvtz.Record, zoneID string) terraformutils.Resource { 56 return terraformutils.NewResource( 57 strconv.FormatInt(record.RecordId, 10)+":"+zoneID, // id 58 strconv.FormatInt(record.RecordId, 10)+"__"+record.Rr, // name 59 "alicloud_pvtz_zone_record", 60 "alicloud", 61 map[string]string{}, 62 []string{}, 63 map[string]interface{}{}, 64 ) 65 } 66 67 func initZones(client *connectivity.AliyunClient) ([]pvtz.Zone, error) { 68 remaining := 1 69 pageNumber := 1 70 pageSize := 10 71 72 allZones := make([]pvtz.Zone, 0) 73 74 for remaining > 0 { 75 raw, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { 76 request := pvtz.CreateDescribeZonesRequest() 77 request.RegionId = client.RegionID 78 request.PageSize = requests.NewInteger(pageSize) 79 request.PageNumber = requests.NewInteger(pageNumber) 80 return pvtzClient.DescribeZones(request) 81 }) 82 if err != nil { 83 return nil, err 84 } 85 86 response := raw.(*pvtz.DescribeZonesResponse) 87 allZones = append(allZones, response.Zones.Zone...) 88 remaining = response.TotalItems - pageNumber*pageSize 89 pageNumber++ 90 } 91 return allZones, nil 92 } 93 94 func initZoneRecords(client *connectivity.AliyunClient, allZones []pvtz.Zone) ([]pvtz.Record, []string, error) { 95 allZoneRecords := make([]pvtz.Record, 0) 96 zoneIds := make([]string, 0) 97 98 for _, zone := range allZones { 99 remaining := 1 100 pageNumber := 1 101 pageSize := 10 102 if zone.ZoneId == "" { 103 continue 104 } 105 for remaining > 0 { 106 raw, err := client.WithPvtzClient(func(pvtzClient *pvtz.Client) (interface{}, error) { 107 request := pvtz.CreateDescribeZoneRecordsRequest() 108 request.RegionId = client.RegionID 109 request.ZoneId = zone.ZoneId 110 request.PageSize = requests.NewInteger(pageSize) 111 request.PageNumber = requests.NewInteger(pageNumber) 112 return pvtzClient.DescribeZoneRecords(request) 113 }) 114 if err != nil { 115 return nil, nil, err 116 } 117 118 response := raw.(*pvtz.DescribeZoneRecordsResponse) 119 for _, zoneRecord := range response.Records.Record { 120 allZoneRecords = append(allZoneRecords, zoneRecord) 121 zoneIds = append(zoneIds, zone.ZoneId) 122 } 123 remaining = response.TotalItems - pageNumber*pageSize 124 pageNumber++ 125 } 126 } 127 return allZoneRecords, zoneIds, nil 128 } 129 130 // InitResources Gets the list of all pvtz Zone ids and generates resources 131 func (g *PvtzGenerator) InitResources() error { 132 client, err := g.LoadClientFromProfile() 133 if err != nil { 134 return err 135 } 136 137 allZones, err := initZones(client) 138 if err != nil { 139 return err 140 } 141 142 allRecords, zoneIds, err := initZoneRecords(client, allZones) 143 if err != nil { 144 return err 145 } 146 147 for _, zone := range allZones { 148 resource := resourceFromZoneResponse(zone) 149 g.Resources = append(g.Resources, resource) 150 } 151 152 for _, zone := range allZones { 153 resource := resourceFromZoneAttachmentResponse(zone) 154 g.Resources = append(g.Resources, resource) 155 } 156 157 for i, record := range allRecords { 158 resource := resourceFromZoneRecordResponse(record, zoneIds[i]) 159 g.Resources = append(g.Resources, resource) 160 } 161 162 return nil 163 } 164 165 // PostConvertHook Runs before HCL files are generated 166 func (g *PvtzGenerator) PostConvertHook() error { 167 for _, r := range g.Resources { 168 if r.InstanceInfo.Type == "alicloud_pvtz_zone_record" { 169 // https://www.terraform.io/docs/providers/alicloud/r/pvtz_zone_record.html#priority 170 v, e := strconv.Atoi(r.Item["priority"].(string)) 171 if v < 1 || v > 50 || e != nil { 172 delete(r.Item, "priority") 173 } 174 } 175 } 176 177 return nil 178 }