in alibabacloudstack/resource_apsarastack_slb_vservergroup.go [163:342]
func resourceAlibabacloudStackSlbServerGroupUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
d.Partial(true)
var removeserverSet, addServerSet, updateServerSet *schema.Set
serverUpdate := false
step := 20
if d.HasChange("servers") {
o, n := d.GetChange("servers")
os := o.(*schema.Set)
ns := n.(*schema.Set)
remove := os.Difference(ns).List()
add := ns.Difference(os).List()
oldIdPort := getIdPortSetFromServers(remove)
newIdPort := getIdPortSetFromServers(add)
updateServerSet = oldIdPort.Intersection(newIdPort)
removeserverSet = oldIdPort.Difference(newIdPort)
addServerSet = newIdPort.Difference(oldIdPort)
if removeserverSet.Len() > 0 {
rmservers := make([]interface{}, 0)
for _, rmserver := range remove {
rms := rmserver.(map[string]interface{})
if v, ok := rms["server_ids"]; ok {
server_ids := v.([]interface{})
for _, id := range server_ids {
idPort := fmt.Sprintf("%s:%d", id, rms["port"])
if removeserverSet.Contains(idPort) {
rmsm := map[string]interface{}{
"server_id": id,
"port": rms["port"],
"type": rms["type"],
"weight": rms["weight"],
}
rmservers = append(rmservers, rmsm)
}
}
}
}
request := slb.CreateRemoveVServerGroupBackendServersRequest()
client.InitRpcRequest(*request.RpcRequest)
request.VServerGroupId = d.Id()
segs := len(rmservers)/step + 1
for i := 0; i < segs; i++ {
start := i * step
end := (i + 1) * step
if end >= len(rmservers) {
end = len(rmservers)
}
request.BackendServers = expandBackendServersWithPortToString(rmservers[start:end])
raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) {
return slbClient.RemoveVServerGroupBackendServers(request)
})
if err != nil {
errmsg := ""
if response, ok := raw.(*slb.RemoveVServerGroupBackendServersResponse); ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
}
if addServerSet.Len() > 0 {
addservers := make([]interface{}, 0)
for _, addserver := range add {
adds := addserver.(map[string]interface{})
if v, ok := adds["server_ids"]; ok {
server_ids := v.([]interface{})
for _, id := range server_ids {
idPort := fmt.Sprintf("%s:%d", id, adds["port"])
if addServerSet.Contains(idPort) {
addsm := map[string]interface{}{
"server_id": id,
"port": adds["port"],
"type": adds["type"],
"weight": adds["weight"],
}
addservers = append(addservers, addsm)
}
}
}
}
request := slb.CreateAddVServerGroupBackendServersRequest()
client.InitRpcRequest(*request.RpcRequest)
request.VServerGroupId = d.Id()
segs := len(addservers)/step + 1
for i := 0; i < segs; i++ {
start := i * step
end := (i + 1) * step
if end >= len(addservers) {
end = len(addservers)
}
request.BackendServers = expandBackendServersWithPortToString(addservers[start:end])
raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) {
return slbClient.AddVServerGroupBackendServers(request)
})
if err != nil {
errmsg := ""
if response, ok := raw.(*slb.AddVServerGroupBackendServersResponse); ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
}
}
name := connectivity.GetResourceData(d, "vserver_group_name", "name").(string)
nameUpdate := false
if d.HasChanges("name", "vserver_group_name") {
nameUpdate = true
}
if d.HasChange("servers") {
serverUpdate = true
}
if serverUpdate || nameUpdate {
request := slb.CreateSetVServerGroupAttributeRequest()
client.InitRpcRequest(*request.RpcRequest)
request.VServerGroupId = d.Id()
if nameUpdate {
request.VServerGroupName = name
}
if serverUpdate {
servers := make([]interface{}, 0)
for _, server := range d.Get("servers").(*schema.Set).List() {
s := server.(map[string]interface{})
if v, ok := s["server_ids"]; ok {
server_ids := v.([]interface{})
for _, id := range server_ids {
idPort := fmt.Sprintf("%s:%d", id, s["port"])
if updateServerSet.Contains(idPort) {
sm := map[string]interface{}{
"server_id": id,
"port": s["port"],
"type": s["type"],
"weight": s["weight"],
}
servers = append(servers, sm)
}
}
}
}
segs := len(servers)/step + 1
for i := 0; i < segs; i++ {
start := i * step
end := (i + 1) * step
if end >= len(servers) {
end = len(servers)
}
request.BackendServers = expandBackendServersWithPortToString(servers[start:end])
raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) {
return slbClient.SetVServerGroupAttribute(request)
})
if err != nil {
errmsg := ""
if response, ok := raw.(*slb.SetVServerGroupAttributeResponse); ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
} else {
raw, err := client.WithSlbClient(func(slbClient *slb.Client) (interface{}, error) {
return slbClient.SetVServerGroupAttribute(request)
})
if err != nil {
errmsg := ""
if response, ok := raw.(*slb.SetVServerGroupAttributeResponse); ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
}
d.Partial(false)
return nil
}