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  }