github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/ibm/container_cluster.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  	bluemix "github.com/IBM-Cloud/bluemix-go"
    23  	"github.com/IBM-Cloud/bluemix-go/api/container/containerv1"
    24  	"github.com/IBM-Cloud/bluemix-go/session"
    25  )
    26  
    27  type ContainerClusterGenerator struct {
    28  	IBMService
    29  }
    30  
    31  func (g ContainerClusterGenerator) loadcluster(clustersID, clusterName string) terraformutils.Resource {
    32  	resource := terraformutils.NewResource(
    33  		clustersID,
    34  		normalizeResourceName(clusterName, false),
    35  		"ibm_container_cluster",
    36  		"ibm",
    37  		map[string]string{
    38  			"force_delete_storage":   "true",
    39  			"update_all_workers":     "false",
    40  			"wait_for_worker_update": "true",
    41  		},
    42  		[]string{},
    43  		map[string]interface{}{})
    44  
    45  	resource.IgnoreKeys = append(resource.IgnoreKeys,
    46  		"^worker_num$", "^region$",
    47  	)
    48  	return resource
    49  }
    50  
    51  func (g ContainerClusterGenerator) loadWorkerPools(clustersID, poolID, poolName string, dependsOn []string) terraformutils.Resource {
    52  	resources := terraformutils.NewResource(
    53  		fmt.Sprintf("%s/%s", clustersID, poolID),
    54  		normalizeResourceName(poolName, true),
    55  		"ibm_container_worker_pool",
    56  		"ibm",
    57  		map[string]string{},
    58  		[]string{},
    59  		map[string]interface{}{
    60  			"depends_on": dependsOn,
    61  		})
    62  	return resources
    63  }
    64  
    65  func (g ContainerClusterGenerator) loadWorkerPoolZones(clustersID, poolID, zoneID string, dependsOn []string) terraformutils.Resource {
    66  	resources := terraformutils.NewResource(
    67  		fmt.Sprintf("%s/%s/%s", clustersID, poolID, zoneID),
    68  		normalizeResourceName("ibm_container_worker_pool_zone_attachment", true),
    69  		"ibm_container_worker_pool_zone_attachment",
    70  		"ibm",
    71  		map[string]string{},
    72  		[]string{},
    73  		map[string]interface{}{
    74  			"depends_on": dependsOn,
    75  		})
    76  	return resources
    77  }
    78  
    79  func (g *ContainerClusterGenerator) InitResources() error {
    80  	bmxConfig := &bluemix.Config{
    81  		BluemixAPIKey: os.Getenv("IC_API_KEY"),
    82  	}
    83  	sess, err := session.New(bmxConfig)
    84  	if err != nil {
    85  		return err
    86  	}
    87  	client, err := containerv1.New(sess)
    88  	if err != nil {
    89  		return err
    90  	}
    91  
    92  	clusters, err := client.Clusters().List(containerv1.ClusterTargetHeader{})
    93  	if err != nil {
    94  		return err
    95  	}
    96  
    97  	for _, cs := range clusters {
    98  		g.Resources = append(g.Resources, g.loadcluster(cs.ID, cs.Name))
    99  		clusterResourceName := g.Resources[len(g.Resources)-1:][0].ResourceName
   100  		workerPools, err := client.WorkerPools().ListWorkerPools(cs.ID, containerv1.ClusterTargetHeader{
   101  			ResourceGroup: cs.ResourceGroupID,
   102  		})
   103  		if err != nil {
   104  			return err
   105  		}
   106  		for _, pool := range workerPools {
   107  			var dependsOn []string
   108  			dependsOn = append(dependsOn,
   109  				"ibm_container_cluster."+clusterResourceName)
   110  			g.Resources = append(g.Resources, g.loadWorkerPools(cs.ID, pool.ID, pool.Name, dependsOn))
   111  			poolResourceName := g.Resources[len(g.Resources)-1:][0].ResourceName
   112  
   113  			dependsOn = append(dependsOn,
   114  				"ibm_container_worker_pool."+poolResourceName)
   115  			zones := pool.Zones
   116  			for _, zone := range zones {
   117  				g.Resources = append(g.Resources, g.loadWorkerPoolZones(cs.ID, pool.ID, zone.ID, dependsOn))
   118  			}
   119  		}
   120  	}
   121  	return nil
   122  }