providers/alicloud/slb.go (155 lines of code) (raw):

// Copyright 2018 The Terraformer Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package alicloud import ( "fmt" "github.com/GoogleCloudPlatform/terraformer/providers/alicloud/connectivity" "github.com/GoogleCloudPlatform/terraformer/terraformutils" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" ) // SlbGenerator Struct for generating AliCloud Elastic Compute Service type SlbGenerator struct { AliCloudService } func resourceFromSlbListener(loadBalancer slb.LoadBalancer, suffix string) terraformutils.Resource { id := loadBalancer.LoadBalancerId + ":" + suffix return terraformutils.NewResource( id, // id id+"__"+loadBalancer.LoadBalancerName, // name "alicloud_slb_listener", "alicloud", map[string]string{}, []string{}, map[string]interface{}{}, ) } func resourceFromSlbResponse(loadBalancer slb.LoadBalancer) terraformutils.Resource { return terraformutils.NewResource( loadBalancer.LoadBalancerId, // id loadBalancer.LoadBalancerId+"__"+loadBalancer.LoadBalancerName, // name "alicloud_slb", "alicloud", map[string]string{}, []string{}, map[string]interface{}{}, ) } func resourceFromVServerGroupResponse(vServerGroup slb.VServerGroup) terraformutils.Resource { return terraformutils.NewResource( vServerGroup.VServerGroupId, // id vServerGroup.VServerGroupId+"__"+vServerGroup.VServerGroupName, // name "alicloud_slb_server_group", "alicloud", map[string]string{}, []string{}, map[string]interface{}{}, ) } func initSlb(client *connectivity.AliyunClient) ([]slb.LoadBalancer, error) { remaining := 1 pageNumber := 1 pageSize := 10 allLoadBalancers := make([]slb.LoadBalancer, 0) for remaining > 0 { raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { request := slb.CreateDescribeLoadBalancersRequest() request.RegionId = client.RegionID request.PageSize = requests.NewInteger(pageSize) request.PageNumber = requests.NewInteger(pageNumber) return slbClient.DescribeLoadBalancers(request) }) if err != nil { return nil, err } response := raw.(*slb.DescribeLoadBalancersResponse) allLoadBalancers = append(allLoadBalancers, response.LoadBalancers.LoadBalancer...) remaining = response.TotalCount - pageNumber*pageSize pageNumber++ } return allLoadBalancers, nil } func initVServerGroups(client *connectivity.AliyunClient, allLoadBalancers []slb.LoadBalancer) ([]slb.VServerGroup, error) { allVserverGroups := make([]slb.VServerGroup, 0) for _, loadBalancer := range allLoadBalancers { if loadBalancer.LoadBalancerId == "" { continue } raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { request := slb.CreateDescribeVServerGroupsRequest() request.RegionId = client.RegionID request.LoadBalancerId = loadBalancer.LoadBalancerId return slbClient.DescribeVServerGroups(request) }) if err != nil { return nil, err } response := raw.(*slb.DescribeVServerGroupsResponse) allVserverGroups = append(allVserverGroups, response.VServerGroups.VServerGroup...) } return allVserverGroups, nil } func initSlbListeners(client *connectivity.AliyunClient, allLoadBalancers []slb.LoadBalancer) ([]slb.LoadBalancer, []string, error) { alignedLoadBalancers := make([]slb.LoadBalancer, 0) suffixes := make([]string, 0) for _, loadBalancer := range allLoadBalancers { if loadBalancer.LoadBalancerId == "" { continue } raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) { request := slb.CreateDescribeLoadBalancerAttributeRequest() request.RegionId = client.RegionID request.LoadBalancerId = loadBalancer.LoadBalancerId return slbClient.DescribeLoadBalancerAttribute(request) }) if err != nil { return nil, nil, err } response := raw.(*slb.DescribeLoadBalancerAttributeResponse) for _, listenerPortAndProtocol := range response.ListenerPortsAndProtocol.ListenerPortAndProtocol { suffix := fmt.Sprintf("%s:%d", listenerPortAndProtocol.ListenerProtocol, listenerPortAndProtocol.ListenerPort) suffixes = append(suffixes, suffix) alignedLoadBalancers = append(alignedLoadBalancers, loadBalancer) } } return alignedLoadBalancers, suffixes, nil } // InitResources Gets the list of all slb loadBalancer ids and generates resources func (g *SlbGenerator) InitResources() error { client, err := g.LoadClientFromProfile() if err != nil { return err } allLoadBalancers, err := initSlb(client) if err != nil { return err } allVserverGroups, err := initVServerGroups(client, allLoadBalancers) if err != nil { return err } alignedLoadBalancers, suffixes, err := initSlbListeners(client, allLoadBalancers) if err != nil { return err } for _, loadBalancer := range allLoadBalancers { resource := resourceFromSlbResponse(loadBalancer) g.Resources = append(g.Resources, resource) } for _, vServerGroup := range allVserverGroups { resource := resourceFromVServerGroupResponse(vServerGroup) g.Resources = append(g.Resources, resource) } for i, alignedSlb := range alignedLoadBalancers { resource := resourceFromSlbListener(alignedSlb, suffixes[i]) g.Resources = append(g.Resources, resource) } return nil } // PostConvertHook Runs before HCL files are generated func (g *SlbGenerator) PostConvertHook() error { for _, r := range g.Resources { if r.InstanceInfo.Type == "alicloud_slb" { // internet is deprecrated // https://www.terraform.io/docs/providers/alicloud/r/slb.html#internet delete(r.Item, "internet") // https://www.terraform.io/docs/providers/alicloud/r/slb.html#bandwidth if r.Item["internet_charge_type"] == "PayByTraffic" { delete(r.Item, "bandwidth") } } } return nil }