github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/ibm/ibm_is_lb.go (about) 1 // Copyright 2019 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 ibm 16 17 import ( 18 "fmt" 19 "os" 20 21 "github.com/GoogleCloudPlatform/terraformer/terraformutils" 22 "github.com/IBM/go-sdk-core/v4/core" 23 "github.com/IBM/vpc-go-sdk/vpcv1" 24 ) 25 26 // LBGenerator ... 27 type LBGenerator struct { 28 IBMService 29 } 30 31 func (g LBGenerator) createLBResources(lbID, lbName string) terraformutils.Resource { 32 resource := terraformutils.NewResource( 33 lbID, 34 normalizeResourceName(lbName, true), 35 "ibm_is_lb", 36 "ibm", 37 map[string]string{}, 38 []string{}, 39 map[string]interface{}{}) 40 41 // Deprecated parameters 42 resource.IgnoreKeys = append(resource.IgnoreKeys, 43 "^profile$", 44 ) 45 return resource 46 } 47 48 func (g LBGenerator) createLBPoolResources(lbID, lbPoolID, lbPoolName string, dependsOn []string) terraformutils.Resource { 49 resources := terraformutils.NewResource( 50 fmt.Sprintf("%s/%s", lbID, lbPoolID), 51 normalizeResourceName(lbPoolName, true), 52 "ibm_is_lb_pool", 53 "ibm", 54 map[string]string{}, 55 []string{}, 56 map[string]interface{}{ 57 "depends_on": dependsOn, 58 }) 59 return resources 60 } 61 62 func (g LBGenerator) createLBPoolMemberResources(lbID, lbPoolID, lbPoolMemberID, lbPoolMemberName string, dependsOn []string) terraformutils.Resource { 63 resources := terraformutils.NewResource( 64 fmt.Sprintf("%s/%s/%s", lbID, lbPoolID, lbPoolMemberID), 65 normalizeResourceName(lbPoolMemberName, true), 66 "ibm_is_lb_pool_member", 67 "ibm", 68 map[string]string{}, 69 []string{}, 70 map[string]interface{}{ 71 "depends_on": dependsOn, 72 }) 73 return resources 74 } 75 76 func (g LBGenerator) createLBListenerResources(lbID, lbListenerID, lbListenerName string, dependsOn []string) terraformutils.Resource { 77 resources := terraformutils.NewResource( 78 fmt.Sprintf("%s/%s", lbID, lbListenerID), 79 normalizeResourceName(lbListenerName, true), 80 "ibm_is_lb_listener", 81 "ibm", 82 map[string]string{}, 83 []string{}, 84 map[string]interface{}{ 85 "depends_on": dependsOn, 86 }) 87 return resources 88 } 89 90 func (g LBGenerator) createLBListenerPolicyResources(lbID, lbListenerID, lbListenerPolicyID, lbListenerPolicyName string, dependsOn []string) terraformutils.Resource { 91 resources := terraformutils.NewResource( 92 fmt.Sprintf("%s/%s/%s", lbID, lbListenerID, lbListenerPolicyID), 93 normalizeResourceName(lbListenerPolicyName, true), 94 "ibm_is_lb_listener_policy", 95 "ibm", 96 map[string]string{}, 97 []string{}, 98 map[string]interface{}{ 99 "depends_on": dependsOn, 100 }) 101 return resources 102 } 103 104 func (g LBGenerator) createLBListenerPolicyRuleResources(lbID, lbListenerID, lbListenerPolicyID, lbListenerPolicyRuleID, lbListenerPolicyName string, dependsOn []string) terraformutils.Resource { 105 resources := terraformutils.NewResource( 106 fmt.Sprintf("%s/%s/%s/%s", lbID, lbListenerID, lbListenerPolicyID, lbListenerPolicyRuleID), 107 normalizeResourceName(lbListenerPolicyName, true), 108 "ibm_is_lb_listener_policy_rule", 109 "ibm", 110 map[string]string{}, 111 []string{}, 112 map[string]interface{}{ 113 "depends_on": dependsOn, 114 }) 115 return resources 116 } 117 118 // InitResources ... 119 func (g *LBGenerator) InitResources() error { 120 region := g.Args["region"].(string) 121 apiKey := os.Getenv("IC_API_KEY") 122 if apiKey == "" { 123 return fmt.Errorf("no API key set") 124 } 125 126 rg := g.Args["resource_group"] 127 if rg != nil { 128 _ = rg.(string) 129 } 130 131 vpcurl := fmt.Sprintf("https://%s.iaas.cloud.ibm.com/v1", region) 132 vpcoptions := &vpcv1.VpcV1Options{ 133 URL: envFallBack([]string{"IBMCLOUD_IS_API_ENDPOINT"}, vpcurl), 134 Authenticator: &core.IamAuthenticator{ 135 ApiKey: apiKey, 136 }, 137 } 138 vpcclient, err := vpcv1.NewVpcV1(vpcoptions) 139 if err != nil { 140 return err 141 } 142 var allrecs []vpcv1.LoadBalancer 143 144 listLoadBalancersOptions := &vpcv1.ListLoadBalancersOptions{} 145 lbs, response, err := vpcclient.ListLoadBalancers(listLoadBalancersOptions) 146 if err != nil { 147 return fmt.Errorf("Error Fetching vpcs %s\n%s", err, response) 148 } 149 allrecs = append(allrecs, lbs.LoadBalancers...) 150 151 for _, lb := range allrecs { 152 var dependsOn []string 153 g.Resources = append(g.Resources, g.createLBResources(*lb.ID, *lb.Name)) 154 resourceName := g.Resources[len(g.Resources)-1:][0].ResourceName 155 dependsOn = append(dependsOn, 156 "ibm_is_lb."+resourceName) 157 listLoadBalancerPoolsOptions := &vpcv1.ListLoadBalancerPoolsOptions{ 158 LoadBalancerID: lb.ID, 159 } 160 lbPools, response, err := vpcclient.ListLoadBalancerPools(listLoadBalancerPoolsOptions) 161 if err != nil { 162 return fmt.Errorf("Error Fetching Load Balancer Pools %s\n%s", err, response) 163 } 164 for _, lbPool := range lbPools.Pools { 165 g.Resources = append(g.Resources, g.createLBPoolResources(*lb.ID, *lbPool.ID, *lbPool.Name, dependsOn)) 166 lbPoolResourceName := g.Resources[len(g.Resources)-1:][0].ResourceName 167 dependsOn1 := makeDependsOn(dependsOn, 168 "ibm_is_lb_pool."+lbPoolResourceName) 169 listLoadBalancerPoolMembersOptions := &vpcv1.ListLoadBalancerPoolMembersOptions{ 170 LoadBalancerID: lb.ID, 171 PoolID: lbPool.ID, 172 } 173 lbPoolMembers, response, err := vpcclient.ListLoadBalancerPoolMembers(listLoadBalancerPoolMembersOptions) 174 if err != nil { 175 return fmt.Errorf("Error Fetching Load Balancer Pool Members %s\n%s", err, response) 176 } 177 for _, lbPoolMember := range lbPoolMembers.Members { 178 g.Resources = append(g.Resources, g.createLBPoolMemberResources(*lb.ID, *lbPool.ID, *lbPoolMember.ID, *lbPool.Name, dependsOn1)) 179 } 180 } 181 182 listLoadBalancerListenersOptions := &vpcv1.ListLoadBalancerListenersOptions{ 183 LoadBalancerID: lb.ID, 184 } 185 lbListeners, response, err := vpcclient.ListLoadBalancerListeners(listLoadBalancerListenersOptions) 186 if err != nil { 187 return fmt.Errorf("Error Fetching Load Balancer Listeners %s\n%s", err, response) 188 } 189 for _, lbListener := range lbListeners.Listeners { 190 g.Resources = append(g.Resources, g.createLBListenerResources(*lb.ID, *lbListener.ID, *lbListener.ID, dependsOn)) 191 lbListenerResourceName := g.Resources[len(g.Resources)-1:][0].ResourceName 192 var dependsOn2 = append(dependsOn, //nolint:goimports,gofmt 193 "ibm_is_lb_listener."+lbListenerResourceName) 194 listLoadBalancerListenerPoliciesOptions := &vpcv1.ListLoadBalancerListenerPoliciesOptions{ 195 LoadBalancerID: lb.ID, 196 ListenerID: lbListener.ID, 197 } 198 lbListenerPolicies, response, err := vpcclient.ListLoadBalancerListenerPolicies(listLoadBalancerListenerPoliciesOptions) 199 if err != nil { 200 return fmt.Errorf("Error Fetching Load Balancer Listener Policies %s\n%s", err, response) 201 } 202 for _, lbListenerPolicy := range lbListenerPolicies.Policies { 203 g.Resources = append(g.Resources, g.createLBListenerPolicyResources(*lb.ID, *lbListener.ID, *lbListenerPolicy.ID, *lbListenerPolicy.Name, dependsOn2)) 204 lbListenerPolicyResourceName := g.Resources[len(g.Resources)-1:][0].ResourceName 205 dependsOn2 = append(dependsOn2, 206 "ibm_is_lb_listener_policy."+lbListenerPolicyResourceName) 207 listLoadBalancerListenerPolicyRulesOptions := &vpcv1.ListLoadBalancerListenerPolicyRulesOptions{ 208 LoadBalancerID: lb.ID, 209 ListenerID: lbListener.ID, 210 PolicyID: lbListenerPolicy.ID, 211 } 212 lbListenerPolicyRules, response, err := vpcclient.ListLoadBalancerListenerPolicyRules(listLoadBalancerListenerPolicyRulesOptions) 213 if err != nil { 214 return fmt.Errorf("Error Fetching Load Balancer Listener Policy Rules %s\n%s", err, response) 215 } 216 for _, lbListenerPolicyRule := range lbListenerPolicyRules.Rules { 217 g.Resources = append(g.Resources, g.createLBListenerPolicyRuleResources(*lb.ID, *lbListener.ID, *lbListenerPolicy.ID, *lbListenerPolicyRule.ID, *lbListenerPolicyRule.ID, dependsOn2)) 218 219 } 220 } 221 } 222 } 223 return nil 224 }