alibabacloudstack/data_source_apsarastack_cs_kubernetes_clusters.go (396 lines of code) (raw):
package alibabacloudstack
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"regexp"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
yaml "gopkg.in/yaml.v2"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
func dataSourceAlibabacloudStackCSKubernetesClusters() *schema.Resource {
return &schema.Resource{
Read: dataSourceAlibabacloudStackCSKubernetesClustersRead,
Schema: map[string]*schema.Schema{
"ids": {
Type: schema.TypeList,
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Computed: true,
},
"name_regex": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringIsValidRegExp,
},
"state": {
Type: schema.TypeString,
Optional: true,
},
"enable_details": {
Type: schema.TypeBool,
Optional: true,
Default: false,
},
"output_file": {
Type: schema.TypeString,
Optional: true,
},
"kube_config": {
Type: schema.TypeString,
Optional: true,
},
// Computed values
"names": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"clusters": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeString,
Computed: true,
},
"name": {
Type: schema.TypeString,
Computed: true,
},
"availability_zone": {
Type: schema.TypeString,
Computed: true,
},
"slb_internet_enabled": {
Type: schema.TypeBool,
Computed: true,
},
"security_group_id": {
Type: schema.TypeString,
Computed: true,
},
"nat_gateway_id": {
Type: schema.TypeString,
Computed: true,
},
"vpc_id": {
Type: schema.TypeString,
Computed: true,
},
"vswitch_ids": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"master_instance_types": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"worker_instance_types": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"worker_numbers": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"pod_cidr": {
Type: schema.TypeString,
Computed: true,
},
"cluster_network_type": {
Type: schema.TypeString,
Computed: true,
},
"node_cidr_mask": {
Type: schema.TypeString,
Computed: true,
},
"log_config": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"type": {
Type: schema.TypeString,
Computed: true,
},
"project": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"image_id": {
Type: schema.TypeString,
Computed: true,
},
"master_disk_size": {
Type: schema.TypeInt,
Computed: true,
},
"state": {
Type: schema.TypeString,
Computed: true,
},
"master_disk_category": {
Type: schema.TypeString,
Computed: true,
},
"worker_disk_size": {
Type: schema.TypeInt,
Computed: true,
},
"worker_disk_category": {
Type: schema.TypeString,
Computed: true,
},
"master_nodes": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeString,
Computed: true,
},
"name": {
Type: schema.TypeString,
Computed: true,
},
"private_ip": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"worker_nodes": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeString,
Computed: true,
},
"name": {
Type: schema.TypeString,
Computed: true,
},
"private_ip": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"connections": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"api_server_internet": {
Type: schema.TypeString,
Computed: true,
},
"api_server_intranet": {
Type: schema.TypeString,
Computed: true,
},
"master_public_ip": {
Type: schema.TypeString,
Computed: true,
},
"service_domain": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
},
},
},
},
}
}
func dataSourceAlibabacloudStackCSKubernetesClustersRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
request := client.NewCommonRequest("GET", "CS", "2015-12-15", "DescribeClustersV1", "/api/v1/clusters")
request.QueryParams["SignatureVersion"] = "1.0"
request.QueryParams["ProductName"] = "CS"
Cresponse := ClustersV1{}
Clusterresponse := ClustersV1{}
response, err := client.ProcessCommonRequest(request)
if err != nil {
errmsg := ""
if response != nil {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_cs_kubernetes_clusters", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
request.TransToAcsRequest()
log.Printf("clusterResponse1 %v", response)
log.Printf("clusterResponse2 %v", response.GetHttpContentBytes())
err = json.Unmarshal(response.GetHttpContentBytes(), &Clusterresponse)
if err != nil {
return errmsgs.WrapError(err)
}
var r *regexp.Regexp
if nameRegex, ok := d.GetOk("name_regex"); ok && nameRegex.(string) != "" {
r = regexp.MustCompile(nameRegex.(string))
}
var clusterids map[string]string
if v, ok := d.GetOk("ids"); ok {
clusterids = make(map[string]string)
for _, vv := range v.([]interface{}) {
clusterids[vv.(string)] = vv.(string)
}
}
log.Printf("Entering kubeconfig %v 52", clusterids)
for _, cresp := range Clusterresponse.Clusters {
if clusterids != nil && clusterids[cresp.ClusterID] == "" {
continue
}
if r != nil && !r.MatchString(cresp.Name) {
continue
}
Cresponse.Clusters = append(Cresponse.Clusters, cresp)
}
Clusterresponse = Cresponse
log.Printf("Clusterresponse idfiltered %v", Clusterresponse)
var ids []string
var names []string
var s []map[string]interface{}
for _, kc := range Clusterresponse.Clusters {
if r != nil && !r.MatchString(kc.Name) {
continue
}
mapping := map[string]interface{}{
"id": kc.ClusterID,
"name": kc.Name,
"vpc_id": kc.VpcID,
"security_group_id": kc.SecurityGroupID,
"availability_zone": kc.ZoneID,
"state": kc.State,
"cluster_network_type": kc.NetworkMode,
"pod_cidr": kc.SubnetCidr,
}
ids = append(ids, kc.ClusterID)
names = append(names, kc.Name)
s = append(s, mapping)
}
d.SetId(dataResourceIdHash(ids))
if err := d.Set("ids", ids); err != nil {
return errmsgs.WrapError(err)
}
if err := d.Set("names", names); err != nil {
return errmsgs.WrapError(err)
}
if err := d.Set("clusters", s); err != nil {
return errmsgs.WrapError(err)
}
if file, ok := d.GetOk("kube_config"); ok && file.(string) != "" {
log.Printf("Entered kubeconfig")
for i, k := range clusterids {
log.Printf("IDS %v", clusterids)
request := client.NewCommonRequest("POST", "Cs", "2015-12-15", "DescribeClusterUserKubeconfig", "")
request.QueryParams["ClusterId"] = k
request.QueryParams["PrivateIpAddress"] = "false"
raw, err := client.WithEcsClient(func(csClient *ecs.Client) (interface{}, error) {
return csClient.ProcessCommonRequest(request)
})
response, ok := raw.(*responses.CommonResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_cs_kubernetes_clusters", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
var conf KubeConfig
var kubeconf Config
err = json.Unmarshal(response.GetHttpContentBytes(), &conf)
if err != nil {
return errmsgs.WrapError(err)
}
err = yaml.Unmarshal([]byte(conf.Config), &kubeconf)
if err != nil {
log.Fatalf("cannot unmarshal data: %v", err)
}
yamls, err := yaml.Marshal(kubeconf)
filename := fmt.Sprint(file, i, ".yaml")
err = ioutil.WriteFile(filename, yamls, 0777)
if err != nil {
fmt.Println(err)
}
log.Printf("kubeconfig check %v ", conf.Config)
}
}
if output, ok := d.GetOk("output_file"); ok && output.(string) != "" {
if err := writeToFile(output.(string), s); err != nil {
return err
}
}
return nil
}
type KubeConfig struct {
ServerRole string `json:"serverRole"`
EagleEyeTraceID string `json:"eagleEyeTraceId"`
AsapiSuccess bool `json:"asapiSuccess"`
AsapiRequestID string `json:"asapiRequestId"`
Domain string `json:"domain"`
API string `json:"api"`
Config string `json:"config"`
}
type Config struct {
APIVersion string `yaml:"apiVersion"`
Clusters []struct {
Cluster struct {
CertificateAuthorityData string `yaml:"certificate-authority-data"`
Server string `yaml:"server"`
} `yaml:"cluster"`
Name string `yaml:"name"`
} `yaml:"clusters"`
Contexts []struct {
Context struct {
Cluster string `yaml:"cluster"`
User string `yaml:"user"`
} `yaml:"context"`
Name string `yaml:"name"`
} `yaml:"contexts"`
CurrentContext string `yaml:"current-context"`
Kind string `yaml:"kind"`
Preferences struct {
} `yaml:"preferences"`
Users []struct {
Name string `yaml:"name"`
User struct {
ClientCertificateData string `yaml:"client-certificate-data"`
ClientKeyData string `yaml:"client-key-data"`
} `yaml:"user"`
} `yaml:"users"`
}