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 }