alibabacloudstack/data_source_apsarastack_slb_masterslaveservergroups.go (187 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 dataSourceAlibabacloudStackSlbMasterSlaveServerGroups() *schema.Resource {
return &schema.Resource{
Read: dataSourceAlibabacloudStackSlbMasterSlaveServerGroupsRead,
Schema: map[string]*schema.Schema{
"load_balancer_id": {
Type: schema.TypeString,
Required: 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,
},
"output_file": {
Type: schema.TypeString,
Optional: true,
},
// Computed values
"names": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"groups": {
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,
},
"servers": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"instance_id": {
Type: schema.TypeString,
Computed: true,
},
"weight": {
Type: schema.TypeInt,
Computed: true,
},
"port": {
Type: schema.TypeInt,
Computed: true,
},
"server_type": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
},
},
},
},
}
}
func dataSourceAlibabacloudStackSlbMasterSlaveServerGroupsRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
request := slb.CreateDescribeMasterSlaveServerGroupsRequest()
client.InitRpcRequest(*request.RpcRequest)
request.LoadBalancerId = d.Get("load_balancer_id").(string)
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.DescribeMasterSlaveServerGroups(request)
})
response, ok := raw.(*slb.DescribeMasterSlaveServerGroupsResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_master_slave_server_groups", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
var filteredServerGroupsTemp []slb.MasterSlaveServerGroup
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 _, serverGroup := range response.MasterSlaveServerGroups.MasterSlaveServerGroup {
if r != nil && !r.MatchString(serverGroup.MasterSlaveServerGroupName) {
continue
}
if len(idsMap) > 0 {
if _, ok := idsMap[serverGroup.MasterSlaveServerGroupId]; !ok {
continue
}
}
filteredServerGroupsTemp = append(filteredServerGroupsTemp, serverGroup)
}
} else {
filteredServerGroupsTemp = response.MasterSlaveServerGroups.MasterSlaveServerGroup
}
return slbMasterSlaveServerGroupsDescriptionAttributes(d, filteredServerGroupsTemp, meta)
}
func slbMasterSlaveServerGroupsDescriptionAttributes(d *schema.ResourceData, serverGroups []slb.MasterSlaveServerGroup, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
var ids []string
var names []string
var s []map[string]interface{}
for _, serverGroup := range serverGroups {
mapping := map[string]interface{}{
"id": serverGroup.MasterSlaveServerGroupId,
"name": serverGroup.MasterSlaveServerGroupName,
}
request := slb.CreateDescribeMasterSlaveServerGroupAttributeRequest()
client.InitRpcRequest(*request.RpcRequest)
request.MasterSlaveServerGroupId = serverGroup.MasterSlaveServerGroupId
raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) {
return slbClient.DescribeMasterSlaveServerGroupAttribute(request)
})
if err != nil {
errmsg := ""
if response, ok := raw.(*slb.DescribeMasterSlaveServerGroupAttributeResponse); ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_slb_master_slave_server_groups", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response, _ := raw.(*slb.DescribeMasterSlaveServerGroupAttributeResponse)
if response != nil && len(response.MasterSlaveBackendServers.MasterSlaveBackendServer) > 0 {
var backendServerMappings []map[string]interface{}
for _, backendServer := range response.MasterSlaveBackendServers.MasterSlaveBackendServer {
backendServerMapping := map[string]interface{}{
"instance_id": backendServer.ServerId,
"weight": backendServer.Weight,
"server_type": backendServer.ServerType,
}
backendServerMappings = append(backendServerMappings, backendServerMapping)
}
mapping["servers"] = backendServerMappings
}
ids = append(ids, serverGroup.MasterSlaveServerGroupId)
names = append(names, serverGroup.MasterSlaveServerGroupName)
s = append(s, mapping)
}
d.SetId(dataResourceIdHash(ids))
if err := d.Set("groups", 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
}