Skip to content

Commit

Permalink
2nd feedback round
Browse files Browse the repository at this point in the history
  • Loading branch information
jckuester committed Apr 3, 2019
1 parent d14c3fe commit 3dbf0d2
Show file tree
Hide file tree
Showing 5 changed files with 144 additions and 344 deletions.
117 changes: 45 additions & 72 deletions aws/resource_aws_sagemaker_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,8 @@ package aws
import (
"fmt"
"log"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/service/sagemaker"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/helper/schema"
Expand Down Expand Up @@ -66,26 +64,20 @@ func resourceAwsSagemakerEndpointCreate(d *schema.ResourceData, meta interface{}
createOpts.Tags = tagsFromMapSagemaker(v.(map[string]interface{}))
}

log.Printf("[DEBUG] SageMaker endpoint create config: %#v", *createOpts)
log.Printf("[DEBUG] SageMaker Endpoint create config: %#v", *createOpts)
_, err := conn.CreateEndpoint(createOpts)
if err != nil {
return fmt.Errorf("error creating SageMaker endpoint: %s", err)
return fmt.Errorf("error creating SageMaker Endpoint: %s", err)
}

d.SetId(name)
log.Printf("[INFO] SageMaker endpoint ID: %s", d.Id())

log.Printf("[DEBUG] Waiting for SageMaker endpoint (%s) to become available", d.Id())
stateConf := &resource.StateChangeConf{
Pending: []string{"Creating"},
Target: []string{"InService"},
Refresh: SagemakerEndpointStateRefreshFunc(conn, d.Id()),
Timeout: 15 * time.Minute,
describeInput := &sagemaker.DescribeEndpointInput{
EndpointName: aws.String(name),
}
if _, err := stateConf.WaitForState(); err != nil {
return fmt.Errorf(
"error while waiting for SageMaker endpoint (%s) to become available: %s",
d.Id(), err)

if err := conn.WaitUntilEndpointInService(describeInput); err != nil {
return fmt.Errorf("error waiting for SageMaker Endpoint (%s) to be in service: %s", name, err)
}

return resourceAwsSagemakerEndpointRead(d, meta)
Expand All @@ -94,22 +86,25 @@ func resourceAwsSagemakerEndpointCreate(d *schema.ResourceData, meta interface{}
func resourceAwsSagemakerEndpointRead(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*AWSClient).sagemakerconn

endpointRaw, _, err := SagemakerEndpointStateRefreshFunc(conn, d.Id())()
describeInput := &sagemaker.DescribeEndpointInput{
EndpointName: aws.String(d.Id()),
}

endpoint, err := conn.DescribeEndpoint(describeInput)
if err != nil {
if sagemakerErr, ok := err.(awserr.Error); ok && sagemakerErr.Code() == "ValidationException" {
log.Printf("[INFO] unable to find the sagemaker endpoint resource and therefore it is removed from the state: %s", d.Id())
if isAWSErr(err, "ValidationException", "") {
log.Printf("[INFO] unable to find the SageMaker Endpoint resource and therefore it is removed from the state: %s", d.Id())
d.SetId("")
return nil
}
return err
}
if endpointRaw == nil {
if aws.StringValue(endpoint.EndpointStatus) == sagemaker.EndpointStatusDeleting {
log.Printf("[WARN] SageMaker Endpoint (%s) is deleting, removing from state", d.Id())
d.SetId("")
return nil
}

endpoint := endpointRaw.(*sagemaker.DescribeEndpointOutput)

if err := d.Set("name", endpoint.EndpointName); err != nil {
return err
}
Expand All @@ -124,6 +119,10 @@ func resourceAwsSagemakerEndpointRead(d *schema.ResourceData, meta interface{})
tagsOutput, err := conn.ListTags(&sagemaker.ListTagsInput{
ResourceArn: endpoint.EndpointArn,
})
if err != nil {
return fmt.Errorf("error listing tags for SageMaker Endpoint (%s): %s", d.Id(), err)
}

if err := d.Set("tags", tagsToMapSagemaker(tagsOutput.Tags)); err != nil {
return err
}
Expand All @@ -141,30 +140,25 @@ func resourceAwsSagemakerEndpointUpdate(d *schema.ResourceData, meta interface{}
}
d.SetPartial("tags")

if d.HasChange("endpoint_config_name") && !d.IsNewResource() {
if d.HasChange("endpoint_config_name") {
modifyOpts := &sagemaker.UpdateEndpointInput{
EndpointName: aws.String(d.Id()),
EndpointConfigName: aws.String(d.Get("endpoint_config_name").(string)),
}
log.Printf(
"[INFO] Modifying endpoint_config_name attribute for %s: %#v",
d.Id(), modifyOpts)

log.Printf("[INFO] Modifying endpoint_config_name attribute for %s: %#v", d.Id(), modifyOpts)
if _, err := conn.UpdateEndpoint(modifyOpts); err != nil {
return err
return fmt.Errorf("error updating SageMaker Endpoint (%s): %s", d.Id(), err)
}
d.SetPartial("endpoint_config_name")

log.Printf("[DEBUG] Waiting for SageMaker endpoint (%s) to be updated", d.Id())
stateConf := &resource.StateChangeConf{
Pending: []string{"Updating"},
Target: []string{"InService"},
Refresh: SagemakerEndpointStateRefreshFunc(conn, d.Id()),
Timeout: 15 * time.Minute,
describeInput := &sagemaker.DescribeEndpointInput{
EndpointName: aws.String(d.Id()),
}
if _, err := stateConf.WaitForState(); err != nil {
return fmt.Errorf(
"error updating SageMaker endpoint (%s): %s",
d.Id(), err)

err := conn.WaitUntilEndpointInService(describeInput)
if err != nil {
return fmt.Errorf("error waiting for SageMaker Endpoint (%s) to be in service: %s", d.Id(), err)
}
}

Expand All @@ -179,46 +173,25 @@ func resourceAwsSagemakerEndpointDelete(d *schema.ResourceData, meta interface{}
deleteEndpointOpts := &sagemaker.DeleteEndpointInput{
EndpointName: aws.String(d.Id()),
}
log.Printf("[INFO] Deleting Sagemaker endpoint: %s", d.Id())

return resource.Retry(5*time.Minute, func() *resource.RetryError {
_, err := conn.DeleteEndpoint(deleteEndpointOpts)
if err == nil {
return nil
}
log.Printf("[INFO] Deleting SageMaker Endpoint: %s", d.Id())

sagemakerErr, ok := err.(awserr.Error)
if !ok {
return resource.NonRetryableError(err)
}
_, err := conn.DeleteEndpoint(deleteEndpointOpts)

if sagemakerErr.Code() == "ResourceNotFound" {
return resource.RetryableError(err)
}

return resource.NonRetryableError(fmt.Errorf("Error deleting Sagemaker endpoint: %s", err))
})
}
if isAWSErr(err, "ValidationException", "") {
return nil
}

func SagemakerEndpointStateRefreshFunc(conn *sagemaker.SageMaker, name string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
describeEndpointOpts := &sagemaker.DescribeEndpointInput{
EndpointName: aws.String(name),
}
endpoint, err := conn.DescribeEndpoint(describeEndpointOpts)
if err != nil {
if sagemakerErr, ok := err.(awserr.Error); ok && sagemakerErr.Code() == "ResourceNotFound" {
endpoint = nil
} else {
log.Printf("Error on SagemakerEndpointStateRefresh: %s", err)
return nil, "", err
}
}
if err != nil {
return fmt.Errorf("error deleting SageMaker Endpoint (%s): %s", d.Id(), err)
}

if endpoint == nil {
return nil, "", nil
}
describeInput := &sagemaker.DescribeEndpointInput{
EndpointName: aws.String(d.Id()),
}

return endpoint, *endpoint.EndpointStatus, nil
if err := conn.WaitUntilEndpointDeleted(describeInput); err != nil {
return fmt.Errorf("error waiting for SageMaker Endpoint (%s) to be deleted: %s", d.Id(), err)
}

return nil
}
16 changes: 8 additions & 8 deletions aws/resource_aws_sagemaker_endpoint_configuration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func testSweepSagemakerEndpointConfigurations(region string) error {
conn := client.(*AWSClient).sagemakerconn

req := &sagemaker.ListEndpointConfigsInput{
NameContains: aws.String("terraform-testacc-sagemaker-endpoint-config"),
NameContains: aws.String("tf-acc-test"),
}
resp, err := conn.ListEndpointConfigs(req)
if err != nil {
Expand Down Expand Up @@ -250,7 +250,7 @@ func testAccCheckSagemakerEndpointConfigurationExists(n string) resource.TestChe
}
}

func testAccSagemakerEndpointConfig_Base(rName string) string {
func testAccSagemakerEndpointConfigurationConfig_Base(rName string) string {
return fmt.Sprintf(`
resource "aws_sagemaker_model" "foo" {
name = %q
Expand Down Expand Up @@ -281,7 +281,7 @@ data "aws_iam_policy_document" "assume_role" {
}

func testAccSagemakerEndpointConfigurationConfig_Basic(rName string) string {
return testAccSagemakerEndpointConfig_Base(rName) + fmt.Sprintf(`
return testAccSagemakerEndpointConfigurationConfig_Base(rName) + fmt.Sprintf(`
resource "aws_sagemaker_endpoint_configuration" "foo" {
name = %q
Expand All @@ -297,7 +297,7 @@ resource "aws_sagemaker_endpoint_configuration" "foo" {
}

func testAccSagemakerEndpointConfigurationConfig_ProductionVariants_InitialVariantWeight(rName string) string {
return testAccSagemakerEndpointConfig_Base(rName) + fmt.Sprintf(`
return testAccSagemakerEndpointConfigurationConfig_Base(rName) + fmt.Sprintf(`
resource "aws_sagemaker_endpoint_configuration" "foo" {
name = %q
Expand All @@ -320,7 +320,7 @@ resource "aws_sagemaker_endpoint_configuration" "foo" {
}

func testAccSagemakerEndpointConfigurationConfig_ProductionVariant_AcceleratorType(rName string) string {
return testAccSagemakerEndpointConfig_Base(rName) + fmt.Sprintf(`
return testAccSagemakerEndpointConfigurationConfig_Base(rName) + fmt.Sprintf(`
resource "aws_sagemaker_endpoint_configuration" "foo" {
name = %q
Expand All @@ -337,7 +337,7 @@ resource "aws_sagemaker_endpoint_configuration" "foo" {
}

func testAccSagemakerEndpointConfiguration_Config_KmsKeyId(rName string) string {
return testAccSagemakerEndpointConfig_Base(rName) + fmt.Sprintf(`
return testAccSagemakerEndpointConfigurationConfig_Base(rName) + fmt.Sprintf(`
resource "aws_sagemaker_endpoint_configuration" "foo" {
name = %q
kms_key_arn = "${aws_kms_key.foo.arn}"
Expand All @@ -359,7 +359,7 @@ resource "aws_kms_key" "foo" {
}

func testAccSagemakerEndpointConfigurationConfig_Tags(rName string) string {
return testAccSagemakerEndpointConfig_Base(rName) + fmt.Sprintf(`
return testAccSagemakerEndpointConfigurationConfig_Base(rName) + fmt.Sprintf(`
resource "aws_sagemaker_endpoint_configuration" "foo" {
name = %q
Expand All @@ -379,7 +379,7 @@ resource "aws_sagemaker_endpoint_configuration" "foo" {
}

func testAccSagemakerEndpointConfigurationConfig_Tags_Update(rName string) string {
return testAccSagemakerEndpointConfig_Base(rName) + fmt.Sprintf(`
return testAccSagemakerEndpointConfigurationConfig_Base(rName) + fmt.Sprintf(`
resource "aws_sagemaker_endpoint_configuration" "foo" {
name = %q
Expand Down
Loading

0 comments on commit 3dbf0d2

Please sign in to comment.