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  }