in alibabacloudstack/resource_apsarastack_ecs_networkinterface.go [178:364]
func resourceNetworkInterfaceUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
ecsService := EcsService{client}
d.Partial(true)
attributeUpdate := false
request := ecs.CreateModifyNetworkInterfaceAttributeRequest()
client.InitRpcRequest(*request.RpcRequest)
request.NetworkInterfaceId = d.Id()
if !d.IsNewResource() && d.HasChange("description") {
request.Description = d.Get("description").(string)
attributeUpdate = true
}
if !d.IsNewResource() && (d.HasChange("network_interface_name") || d.HasChange("name")) {
request.NetworkInterfaceName = connectivity.GetResourceData(d, "network_interface_name", "name").(string)
attributeUpdate = true
}
if d.HasChange("security_groups") {
securityGroups := expandStringList(d.Get("security_groups").(*schema.Set).List())
if len(securityGroups) > 1 || !d.IsNewResource() {
request.SecurityGroupId = &securityGroups
attributeUpdate = true
}
}
if attributeUpdate {
raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.ModifyNetworkInterfaceAttribute(request)
})
bresponse, ok := raw.(*ecs.ModifyNetworkInterfaceAttributeResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackGoClientFailure, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
if d.HasChange("private_ips") {
oldIps, newIps := d.GetChange("private_ips")
oldIpsSet := oldIps.(*schema.Set)
newIpsSet := newIps.(*schema.Set)
unAssignIps := oldIpsSet.Difference(newIpsSet)
if unAssignIps.Len() > 0 {
unAssignIpList := expandStringList(unAssignIps.List())
unAssignPrivateIpAddressesRequest := ecs.CreateUnassignPrivateIpAddressesRequest()
client.InitRpcRequest(*unAssignPrivateIpAddressesRequest.RpcRequest)
unAssignPrivateIpAddressesRequest.NetworkInterfaceId = d.Id()
unAssignPrivateIpAddressesRequest.PrivateIpAddress = &unAssignIpList
err := resource.Retry(DefaultTimeout*time.Second, func() *resource.RetryError {
raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.UnassignPrivateIpAddresses(unAssignPrivateIpAddressesRequest)
})
bresponse, ok := raw.(*ecs.UnassignPrivateIpAddressesResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, errmsgs.NetworkInterfaceInvalidOperations) {
return resource.RetryableError(err)
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), unAssignPrivateIpAddressesRequest.GetActionName(), errmsgs.AlibabacloudStackGoClientFailure, errmsg))
}
addDebug(unAssignPrivateIpAddressesRequest.GetActionName(), raw, unAssignPrivateIpAddressesRequest.RpcRequest, unAssignPrivateIpAddressesRequest)
return nil
})
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), unAssignPrivateIpAddressesRequest.GetActionName(), errmsgs.AlibabacloudStackGoClientFailure)
}
}
assignIps := newIpsSet.Difference(oldIpsSet)
if assignIps.Len() > 0 {
assignIpList := expandStringList(assignIps.List())
assignPrivateIpAddressesRequest := ecs.CreateAssignPrivateIpAddressesRequest()
client.InitRpcRequest(*assignPrivateIpAddressesRequest.RpcRequest)
assignPrivateIpAddressesRequest.NetworkInterfaceId = d.Id()
assignPrivateIpAddressesRequest.PrivateIpAddress = &assignIpList
err := resource.Retry(DefaultTimeout*time.Second, func() *resource.RetryError {
raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.AssignPrivateIpAddresses(assignPrivateIpAddressesRequest)
})
bresponse, ok := raw.(*ecs.AssignPrivateIpAddressesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), assignPrivateIpAddressesRequest.GetActionName(), errmsgs.AlibabacloudStackGoClientFailure, errmsg))
}
addDebug(assignPrivateIpAddressesRequest.GetActionName(), raw, assignPrivateIpAddressesRequest.RpcRequest, assignPrivateIpAddressesRequest)
return nil
})
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), assignPrivateIpAddressesRequest.GetActionName(), errmsgs.AlibabacloudStackGoClientFailure)
}
}
if err := ecsService.WaitForPrivateIpsListChanged(d.Id(), expandStringList(newIpsSet.List())); err != nil {
return errmsgs.WrapError(err)
}
}
if d.HasChange("private_ips_count") {
privateIpList := expandStringList(d.Get("private_ips").(*schema.Set).List())
oldIpsCount, newIpsCount := d.GetChange("private_ips_count")
if oldIpsCount != nil && newIpsCount != nil && newIpsCount != len(privateIpList) {
diff := newIpsCount.(int) - oldIpsCount.(int)
if diff > 0 {
assignPrivateIpAddressesRequest := ecs.CreateAssignPrivateIpAddressesRequest()
client.InitRpcRequest(*assignPrivateIpAddressesRequest.RpcRequest)
assignPrivateIpAddressesRequest.NetworkInterfaceId = d.Id()
assignPrivateIpAddressesRequest.SecondaryPrivateIpAddressCount = requests.NewInteger(diff)
err := resource.Retry(DefaultTimeout*time.Second, func() *resource.RetryError {
raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.AssignPrivateIpAddresses(assignPrivateIpAddressesRequest)
})
bresponse, ok := raw.(*ecs.AssignPrivateIpAddressesResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, errmsgs.NetworkInterfaceInvalidOperations) {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return resource.RetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), assignPrivateIpAddressesRequest.GetActionName(), errmsgs.AlibabacloudStackGoClientFailure, errmsg))
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), assignPrivateIpAddressesRequest.GetActionName(), errmsgs.AlibabacloudStackGoClientFailure, errmsg))
}
addDebug(assignPrivateIpAddressesRequest.GetActionName(), raw, assignPrivateIpAddressesRequest.RpcRequest, assignPrivateIpAddressesRequest)
return nil
})
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), assignPrivateIpAddressesRequest.GetActionName(), errmsgs.AlibabacloudStackGoClientFailure)
}
}
if diff < 0 {
diff *= -1
unAssignIps := privateIpList[:diff]
unAssignPrivateIpAddressesRequest := ecs.CreateUnassignPrivateIpAddressesRequest()
client.InitRpcRequest(*unAssignPrivateIpAddressesRequest.RpcRequest)
unAssignPrivateIpAddressesRequest.NetworkInterfaceId = d.Id()
unAssignPrivateIpAddressesRequest.PrivateIpAddress = &unAssignIps
err := resource.Retry(DefaultTimeout*time.Second, func() *resource.RetryError {
raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.UnassignPrivateIpAddresses(unAssignPrivateIpAddressesRequest)
})
if err != nil {
if errmsgs.IsExpectedErrors(err, errmsgs.NetworkInterfaceInvalidOperations) {
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(unAssignPrivateIpAddressesRequest.GetActionName(), raw, unAssignPrivateIpAddressesRequest.RpcRequest, unAssignPrivateIpAddressesRequest)
return nil
})
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), unAssignPrivateIpAddressesRequest.GetActionName(), errmsgs.AlibabacloudStackGoClientFailure)
}
}
err := ecsService.WaitForPrivateIpsCountChanged(d.Id(), newIpsCount.(int))
if err != nil {
return errmsgs.WrapError(err)
}
}
}
if err := setTags(client, TagResourceEni, d); err != nil {
return errmsgs.WrapError(err)
}
d.Partial(false)
return nil
}