alibabacloudstack/data_source_apsarastack_slb_servercertificates.go (145 lines of code) (raw):
package alibabacloudstack
import (
"regexp"
"github.com/aliyun/alibaba-cloud-sdk-go/services/slb"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
func dataSourceAlibabacloudStackSlbServerCertificates() *schema.Resource {
return &schema.Resource{
Read: dataSourceAlibabacloudStackSlbServerCertificatesRead,
Schema: map[string]*schema.Schema{
"output_file": {
Type: schema.TypeString,
Optional: true,
},
"ids": {
Type: schema.TypeList,
Optional: true,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
ForceNew: true,
MinItems: 1,
},
"name_regex": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringIsValidRegExp,
ForceNew: true,
},
"names": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
// Computed values
"certificates": {
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,
},
"fingerprint": {
Type: schema.TypeString,
Computed: true,
},
"created_time": {
Type: schema.TypeString,
Computed: true,
},
"created_timestamp": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
},
}
}
func dataSourceAlibabacloudStackSlbServerCertificatesRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
request := slb.CreateDescribeServerCertificatesRequest()
client.InitRpcRequest(*request.RpcRequest)
idsMap := make(map[string]string)
if v, ok := d.GetOk("ids"); ok {
for _, vv := range v.([]interface{}) {
idsMap[Trim(vv.(string))] = Trim(vv.(string))
}
}
raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) {
return slbClient.DescribeServerCertificates(request)
})
if err != nil {
errmsg := ""
if response, ok := raw.(*slb.DescribeServerCertificatesResponse); ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_server_certificates", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response, _ := raw.(*slb.DescribeServerCertificatesResponse)
var filteredTemp []slb.ServerCertificate
nameRegex, ok := d.GetOk("name_regex")
if (ok && nameRegex.(string) != "") || (len(idsMap) > 0) {
var r *regexp.Regexp
if nameRegex != "" {
r = regexp.MustCompile(nameRegex.(string))
}
for _, certificate := range response.ServerCertificates.ServerCertificate {
if r != nil && !r.MatchString(certificate.ServerCertificateName) {
continue
}
if len(idsMap) > 0 {
if _, ok := idsMap[certificate.ServerCertificateId]; !ok {
continue
}
}
filteredTemp = append(filteredTemp, certificate)
}
} else {
filteredTemp = response.ServerCertificates.ServerCertificate
}
return slbServerCertificatesDescriptionAttributes(d, filteredTemp, meta)
}
func slbServerCertificatesDescriptionAttributes(d *schema.ResourceData, certificates []slb.ServerCertificate, meta interface{}) error {
var ids []string
var names []string
var s []map[string]interface{}
for _, certificate := range certificates {
mapping := map[string]interface{}{
"id": certificate.ServerCertificateId,
"name": certificate.ServerCertificateName,
"fingerprint": certificate.Fingerprint,
"created_time": certificate.CreateTime,
"created_timestamp": certificate.CreateTimeStamp,
}
ids = append(ids, certificate.ServerCertificateId)
names = append(names, certificate.ServerCertificateName)
s = append(s, mapping)
}
d.SetId(dataResourceIdHash(ids))
if err := d.Set("certificates", s); err != nil {
return errmsgs.WrapError(err)
}
if err := d.Set("ids", ids); err != nil {
return errmsgs.WrapError(err)
}
if err := d.Set("names", names); err != nil {
return errmsgs.WrapError(err)
}
// create a json file in current directory and write data source to it.
if output, ok := d.GetOk("output_file"); ok && output.(string) != "" {
if err := writeToFile(output.(string), s); err != nil {
return err
}
}
return nil
}