From 0b63007142cdd0577bc566fc79b91212f5b42253 Mon Sep 17 00:00:00 2001 From: He Guimin Date: Tue, 6 Jun 2017 01:24:25 +0800 Subject: [PATCH] fix vpc and vswitch bug while creating vpc and vswitch (#15082) --- builtin/providers/alicloud/errors.go | 3 +++ .../alicloud/resource_alicloud_vpc.go | 19 +++++++++++++++---- .../alicloud/resource_alicloud_vswitch.go | 16 ++++++++++++++-- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/builtin/providers/alicloud/errors.go b/builtin/providers/alicloud/errors.go index 06d29642b6..c159d5c65a 100644 --- a/builtin/providers/alicloud/errors.go +++ b/builtin/providers/alicloud/errors.go @@ -36,6 +36,9 @@ const ( // ess InvalidScalingGroupIdNotFound = "InvalidScalingGroupId.NotFound" IncorrectScalingConfigurationLifecycleState = "IncorrectScalingConfigurationLifecycleState" + + //unknown Error + UnknownError = "UnknownError" ) func GetNotFoundErrorFromString(str string) error { diff --git a/builtin/providers/alicloud/resource_alicloud_vpc.go b/builtin/providers/alicloud/resource_alicloud_vpc.go index 7418395fd2..5362c638a8 100644 --- a/builtin/providers/alicloud/resource_alicloud_vpc.go +++ b/builtin/providers/alicloud/resource_alicloud_vpc.go @@ -2,11 +2,11 @@ package alicloud import ( "fmt" - "strings" - + "github.com/denverdino/aliyungo/common" "github.com/denverdino/aliyungo/ecs" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "strings" "time" ) @@ -73,9 +73,20 @@ func resourceAliyunVpcCreate(d *schema.ResourceData, meta interface{}) error { ecsconn := meta.(*AliyunClient).ecsconn - vpc, err := ecsconn.CreateVpc(args) + var vpc *ecs.CreateVpcResponse + err = resource.Retry(3*time.Minute, func() *resource.RetryError { + resp, err := ecsconn.CreateVpc(args) + if err != nil { + if e, ok := err.(*common.Error); ok && (e.StatusCode == 400 || e.Code == UnknownError) { + return resource.RetryableError(fmt.Errorf("Vpc is still creating result from some unknown error -- try again")) + } + return resource.NonRetryableError(err) + } + vpc = resp + return nil + }) if err != nil { - return err + return fmt.Errorf("Create vpc got an error :%#v", err) } d.SetId(vpc.VpcId) diff --git a/builtin/providers/alicloud/resource_alicloud_vswitch.go b/builtin/providers/alicloud/resource_alicloud_vswitch.go index d4149b9ca8..89e24108e4 100644 --- a/builtin/providers/alicloud/resource_alicloud_vswitch.go +++ b/builtin/providers/alicloud/resource_alicloud_vswitch.go @@ -56,9 +56,21 @@ func resourceAliyunSwitchCreate(d *schema.ResourceData, meta interface{}) error return err } - vswitchID, err := conn.CreateVSwitch(args) + var vswitchID string + err = resource.Retry(3*time.Minute, func() *resource.RetryError { + vswId, err := conn.CreateVSwitch(args) + if err != nil { + if e, ok := err.(*common.Error); ok && (e.StatusCode == 400 || e.Code == UnknownError) { + return resource.RetryableError(fmt.Errorf("Vswitch is still creating result from some unknown error -- try again")) + } + return resource.NonRetryableError(err) + } + vswitchID = vswId + return nil + }) + if err != nil { - return fmt.Errorf("Create subnet got a error :%s", err) + return fmt.Errorf("Create subnet got an error :%s", err) } d.SetId(vswitchID)