github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/alicloud/slb.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  	"fmt"
    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/slb"
    24  )
    25  
    26  // SlbGenerator Struct for generating AliCloud Elastic Compute Service
    27  type SlbGenerator struct {
    28  	AliCloudService
    29  }
    30  
    31  func resourceFromSlbListener(loadBalancer slb.LoadBalancer, suffix string) terraformutils.Resource {
    32  	id := loadBalancer.LoadBalancerId + ":" + suffix
    33  	return terraformutils.NewResource(
    34  		id, // id
    35  		id+"__"+loadBalancer.LoadBalancerName, // name
    36  		"alicloud_slb_listener",
    37  		"alicloud",
    38  		map[string]string{},
    39  		[]string{},
    40  		map[string]interface{}{},
    41  	)
    42  }
    43  
    44  func resourceFromSlbResponse(loadBalancer slb.LoadBalancer) terraformutils.Resource {
    45  	return terraformutils.NewResource(
    46  		loadBalancer.LoadBalancerId,                                    // id
    47  		loadBalancer.LoadBalancerId+"__"+loadBalancer.LoadBalancerName, // name
    48  		"alicloud_slb",
    49  		"alicloud",
    50  		map[string]string{},
    51  		[]string{},
    52  		map[string]interface{}{},
    53  	)
    54  }
    55  
    56  func resourceFromVServerGroupResponse(vServerGroup slb.VServerGroup) terraformutils.Resource {
    57  	return terraformutils.NewResource(
    58  		vServerGroup.VServerGroupId,                                    // id
    59  		vServerGroup.VServerGroupId+"__"+vServerGroup.VServerGroupName, // name
    60  		"alicloud_slb_server_group",
    61  		"alicloud",
    62  		map[string]string{},
    63  		[]string{},
    64  		map[string]interface{}{},
    65  	)
    66  }
    67  
    68  func initSlb(client *connectivity.AliyunClient) ([]slb.LoadBalancer, error) {
    69  	remaining := 1
    70  	pageNumber := 1
    71  	pageSize := 10
    72  
    73  	allLoadBalancers := make([]slb.LoadBalancer, 0)
    74  
    75  	for remaining > 0 {
    76  		raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) {
    77  			request := slb.CreateDescribeLoadBalancersRequest()
    78  			request.RegionId = client.RegionID
    79  			request.PageSize = requests.NewInteger(pageSize)
    80  			request.PageNumber = requests.NewInteger(pageNumber)
    81  			return slbClient.DescribeLoadBalancers(request)
    82  		})
    83  		if err != nil {
    84  			return nil, err
    85  		}
    86  
    87  		response := raw.(*slb.DescribeLoadBalancersResponse)
    88  		allLoadBalancers = append(allLoadBalancers, response.LoadBalancers.LoadBalancer...)
    89  		remaining = response.TotalCount - pageNumber*pageSize
    90  		pageNumber++
    91  	}
    92  
    93  	return allLoadBalancers, nil
    94  }
    95  
    96  func initVServerGroups(client *connectivity.AliyunClient, allLoadBalancers []slb.LoadBalancer) ([]slb.VServerGroup, error) {
    97  	allVserverGroups := make([]slb.VServerGroup, 0)
    98  	for _, loadBalancer := range allLoadBalancers {
    99  		if loadBalancer.LoadBalancerId == "" {
   100  			continue
   101  		}
   102  		raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) {
   103  			request := slb.CreateDescribeVServerGroupsRequest()
   104  			request.RegionId = client.RegionID
   105  			request.LoadBalancerId = loadBalancer.LoadBalancerId
   106  			return slbClient.DescribeVServerGroups(request)
   107  		})
   108  		if err != nil {
   109  			return nil, err
   110  		}
   111  		response := raw.(*slb.DescribeVServerGroupsResponse)
   112  		allVserverGroups = append(allVserverGroups, response.VServerGroups.VServerGroup...)
   113  	}
   114  
   115  	return allVserverGroups, nil
   116  }
   117  
   118  func initSlbListeners(client *connectivity.AliyunClient, allLoadBalancers []slb.LoadBalancer) ([]slb.LoadBalancer, []string, error) {
   119  	alignedLoadBalancers := make([]slb.LoadBalancer, 0)
   120  	suffixes := make([]string, 0)
   121  	for _, loadBalancer := range allLoadBalancers {
   122  		if loadBalancer.LoadBalancerId == "" {
   123  			continue
   124  		}
   125  		raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) {
   126  			request := slb.CreateDescribeLoadBalancerAttributeRequest()
   127  			request.RegionId = client.RegionID
   128  			request.LoadBalancerId = loadBalancer.LoadBalancerId
   129  			return slbClient.DescribeLoadBalancerAttribute(request)
   130  		})
   131  		if err != nil {
   132  			return nil, nil, err
   133  		}
   134  		response := raw.(*slb.DescribeLoadBalancerAttributeResponse)
   135  		for _, listenerPortAndProtocol := range response.ListenerPortsAndProtocol.ListenerPortAndProtocol {
   136  			suffix := fmt.Sprintf("%s:%d", listenerPortAndProtocol.ListenerProtocol, listenerPortAndProtocol.ListenerPort)
   137  			suffixes = append(suffixes, suffix)
   138  
   139  			alignedLoadBalancers = append(alignedLoadBalancers, loadBalancer)
   140  		}
   141  	}
   142  
   143  	return alignedLoadBalancers, suffixes, nil
   144  }
   145  
   146  // InitResources Gets the list of all slb loadBalancer ids and generates resources
   147  func (g *SlbGenerator) InitResources() error {
   148  	client, err := g.LoadClientFromProfile()
   149  	if err != nil {
   150  		return err
   151  	}
   152  
   153  	allLoadBalancers, err := initSlb(client)
   154  	if err != nil {
   155  		return err
   156  	}
   157  	allVserverGroups, err := initVServerGroups(client, allLoadBalancers)
   158  	if err != nil {
   159  		return err
   160  	}
   161  	alignedLoadBalancers, suffixes, err := initSlbListeners(client, allLoadBalancers)
   162  	if err != nil {
   163  		return err
   164  	}
   165  
   166  	for _, loadBalancer := range allLoadBalancers {
   167  		resource := resourceFromSlbResponse(loadBalancer)
   168  		g.Resources = append(g.Resources, resource)
   169  	}
   170  
   171  	for _, vServerGroup := range allVserverGroups {
   172  		resource := resourceFromVServerGroupResponse(vServerGroup)
   173  		g.Resources = append(g.Resources, resource)
   174  	}
   175  
   176  	for i, alignedSlb := range alignedLoadBalancers {
   177  		resource := resourceFromSlbListener(alignedSlb, suffixes[i])
   178  		g.Resources = append(g.Resources, resource)
   179  	}
   180  
   181  	return nil
   182  }
   183  
   184  // PostConvertHook Runs before HCL files are generated
   185  func (g *SlbGenerator) PostConvertHook() error {
   186  	for _, r := range g.Resources {
   187  		if r.InstanceInfo.Type == "alicloud_slb" {
   188  			// internet is deprecrated
   189  			// https://www.terraform.io/docs/providers/alicloud/r/slb.html#internet
   190  			delete(r.Item, "internet")
   191  
   192  			// https://www.terraform.io/docs/providers/alicloud/r/slb.html#bandwidth
   193  			if r.Item["internet_charge_type"] == "PayByTraffic" {
   194  				delete(r.Item, "bandwidth")
   195  			}
   196  		}
   197  	}
   198  
   199  	return nil
   200  }