github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/digitalocean/kubernetes_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 digitalocean
    16  
    17  import (
    18  	"context"
    19  
    20  	"github.com/GoogleCloudPlatform/terraformer/terraformutils"
    21  	"github.com/digitalocean/godo"
    22  )
    23  
    24  // the default node pool has a custom tag added by terraform
    25  const digitaloceanKubernetesDefaultNodePoolTag = "terraform:default-node-pool"
    26  
    27  type KubernetesClusterGenerator struct {
    28  	DigitalOceanService
    29  }
    30  
    31  func (g *KubernetesClusterGenerator) loadKubernetesClusters(ctx context.Context, client *godo.Client) ([]*godo.KubernetesCluster, error) {
    32  	list := []*godo.KubernetesCluster{}
    33  
    34  	// create options. initially, these will be blank
    35  	opt := &godo.ListOptions{}
    36  	for {
    37  		clusters, resp, err := client.Kubernetes.List(ctx, opt)
    38  		if err != nil {
    39  			return nil, err
    40  		}
    41  
    42  		for _, cluster := range clusters {
    43  			g.Resources = append(g.Resources, terraformutils.NewSimpleResource(
    44  				cluster.ID,
    45  				cluster.Name,
    46  				"digitalocean_kubernetes_cluster",
    47  				"digitalocean",
    48  				[]string{}))
    49  			list = append(list, cluster)
    50  		}
    51  
    52  		// if we are at the last page, break out the for loop
    53  		if resp.Links == nil || resp.Links.IsLastPage() {
    54  			break
    55  		}
    56  
    57  		page, err := resp.Links.CurrentPage()
    58  		if err != nil {
    59  			return nil, err
    60  		}
    61  
    62  		// set the page we want for the next request
    63  		opt.Page = page + 1
    64  	}
    65  
    66  	return list, nil
    67  }
    68  
    69  func (g *KubernetesClusterGenerator) loadKubernetesNodePools(cluster *godo.KubernetesCluster) {
    70  	for _, nodePool := range cluster.NodePools {
    71  		isDefaultPool := false
    72  		for _, tag := range nodePool.Tags {
    73  			if tag == digitaloceanKubernetesDefaultNodePoolTag {
    74  				isDefaultPool = true
    75  				break
    76  			}
    77  		}
    78  
    79  		// skip default node pool since it is included in the digitalocean_kubernetes_cluster resource
    80  		if !isDefaultPool {
    81  			g.Resources = append(g.Resources, terraformutils.NewResource(
    82  				nodePool.ID,
    83  				nodePool.Name,
    84  				"digitalocean_kubernetes_node_pool",
    85  				"digitalocean",
    86  				map[string]string{"cluster_id": cluster.ID},
    87  				[]string{},
    88  				map[string]interface{}{}))
    89  		}
    90  	}
    91  }
    92  
    93  func (g *KubernetesClusterGenerator) InitResources() error {
    94  	client := g.generateClient()
    95  	clusters, err := g.loadKubernetesClusters(context.TODO(), client)
    96  	if err != nil {
    97  		return err
    98  	}
    99  	for _, cluster := range clusters {
   100  		g.loadKubernetesNodePools(cluster)
   101  	}
   102  	return nil
   103  }