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 }