20978: Treat "unsupported instance type" as capacity=0.
authorTom Clegg <tom@curii.com>
Thu, 2 Nov 2023 19:26:56 +0000 (15:26 -0400)
committerTom Clegg <tom@curii.com>
Thu, 2 Nov 2023 19:26:56 +0000 (15:26 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

lib/cloud/ec2/ec2.go
lib/cloud/ec2/ec2_test.go

index 816df48d90c7dced2bacc1c864ea71da8dccd3d2..55f9a1e3a36bbc9ab507db96cca99be58cad7b2e 100644 (file)
@@ -711,7 +711,8 @@ func isErrorSubnetSpecific(err error) bool {
        code := aerr.Code()
        return strings.Contains(code, "Subnet") ||
                code == "InsufficientInstanceCapacity" ||
-               code == "InsufficientVolumeCapacity"
+               code == "InsufficientVolumeCapacity" ||
+               code == "Unsupported"
 }
 
 type ec2QuotaError struct {
@@ -737,7 +738,8 @@ func wrapError(err error, throttleValue *atomic.Value) error {
                return rateLimitError{error: err, earliestRetry: time.Now().Add(d)}
        } else if isErrorQuota(err) {
                return &ec2QuotaError{err}
-       } else if aerr, ok := err.(awserr.Error); ok && aerr != nil && aerr.Code() == "InsufficientInstanceCapacity" {
+       } else if aerr, ok := err.(awserr.Error); ok && (aerr.Code() == "InsufficientInstanceCapacity" ||
+               (aerr.Code() == "Unsupported" && strings.Contains(aerr.Message(), "requested instance type"))) {
                return &capacityError{err, true}
        } else if err != nil {
                throttleValue.Store(time.Duration(0))
index a57fcebf76874bea175462da8c272ee746991b82..6ce5aa3cf9aa6899610c937d9dad1ae70e9cb695 100644 (file)
@@ -513,10 +513,18 @@ func (*EC2InstanceSetSuite) TestWrapError(c *check.C) {
        _, ok = wrapped.(cloud.QuotaError)
        c.Check(ok, check.Equals, true)
 
-       capacityError := awserr.New("InsufficientInstanceCapacity", "", nil)
-       wrapped = wrapError(capacityError, nil)
-       caperr, ok := wrapped.(cloud.CapacityError)
-       c.Check(ok, check.Equals, true)
-       c.Check(caperr.IsCapacityError(), check.Equals, true)
-       c.Check(caperr.IsInstanceTypeSpecific(), check.Equals, true)
+       for _, trial := range []struct {
+               code string
+               msg  string
+       }{
+               {"InsufficientInstanceCapacity", ""},
+               {"Unsupported", "Your requested instance type (t3.micro) is not supported in your requested Availability Zone (us-east-1e). Please retry your request by not specifying an Availability Zone or choosing us-east-1a, us-east-1b, us-east-1c, us-east-1d, us-east-1f."},
+       } {
+               capacityError := awserr.New(trial.code, trial.msg, nil)
+               wrapped = wrapError(capacityError, nil)
+               caperr, ok := wrapped.(cloud.CapacityError)
+               c.Check(ok, check.Equals, true)
+               c.Check(caperr.IsCapacityError(), check.Equals, true)
+               c.Check(caperr.IsInstanceTypeSpecific(), check.Equals, true)
+       }
 }