From 66362307b82d214fb7f501bde61c40d5defb8ba1 Mon Sep 17 00:00:00 2001 From: Harichandan Pulagam Date: Mon, 15 Jun 2020 19:02:42 -0700 Subject: [PATCH] feature(sagemaker notebook): Add support for DefaultCodeRepository --- ...esource_aws_sagemaker_notebook_instance.go | 14 +++ ...ce_aws_sagemaker_notebook_instance_test.go | 86 +++++++++++++++++++ .../sagemaker_notebook_instance.html.markdown | 1 + 3 files changed, 101 insertions(+) diff --git a/aws/resource_aws_sagemaker_notebook_instance.go b/aws/resource_aws_sagemaker_notebook_instance.go index 41219975ceae..1c41441b510e 100644 --- a/aws/resource_aws_sagemaker_notebook_instance.go +++ b/aws/resource_aws_sagemaker_notebook_instance.go @@ -85,6 +85,12 @@ func resourceAwsSagemakerNotebookInstance() *schema.Resource { }, false), }, + "default_code_repository": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + }, + "tags": tagsSchema(), }, } @@ -106,6 +112,10 @@ func resourceAwsSagemakerNotebookInstanceCreate(d *schema.ResourceData, meta int createOpts.DirectInternetAccess = aws.String(v.(string)) } + if v, ok := d.GetOk("default_code_repository"); ok { + createOpts.DefaultCodeRepository = aws.String(v.(string)) + } + if s, ok := d.GetOk("subnet_id"); ok { createOpts.SubnetId = aws.String(s.(string)) } @@ -199,6 +209,10 @@ func resourceAwsSagemakerNotebookInstanceRead(d *schema.ResourceData, meta inter return fmt.Errorf("error setting direct_internet_access for sagemaker notebook instance (%s): %s", d.Id(), err) } + if err := d.Set("default_code_repository", notebookInstance.DefaultCodeRepository); err != nil { + return fmt.Errorf("error setting default_code_repository for sagemaker notebook instance (%s): %s", d.Id(), err) + } + tags, err := keyvaluetags.SagemakerListTags(conn, aws.StringValue(notebookInstance.NotebookInstanceArn)) if err != nil { diff --git a/aws/resource_aws_sagemaker_notebook_instance_test.go b/aws/resource_aws_sagemaker_notebook_instance_test.go index cb27c8790653..2236061eb6c9 100644 --- a/aws/resource_aws_sagemaker_notebook_instance_test.go +++ b/aws/resource_aws_sagemaker_notebook_instance_test.go @@ -368,6 +368,42 @@ func testAccCheckAWSSagemakerNotebookDirectInternetAccess(notebook *sagemaker.De } } +func TestAccAWSSagemakerNotebookInstance_default_code_repository(t *testing.T) { + var notebook sagemaker.DescribeNotebookInstanceOutput + notebookName := resource.PrefixedUniqueId(sagemakerTestAccSagemakerNotebookInstanceResourceNamePrefix) + var resourceName = "aws_sagemaker_notebook_instance.foo" + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSSagemakerNotebookInstanceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSSagemakerNotebookInstanceConfigDefaultCodeRepository(notebookName, "https://github.com/terraform-providers/terraform-provider-aws.git"), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSSagemakerNotebookInstanceExists(resourceName, ¬ebook), + testAccCheckAWSSagemakerNotebookDefaultCodeRepository(¬ebook, "https://github.com/terraform-providers/terraform-provider-aws.git"), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testAccCheckAWSSagemakerNotebookDefaultCodeRepository(notebook *sagemaker.DescribeNotebookInstanceOutput, expected string) resource.TestCheckFunc { + return func(s *terraform.State) error { + defaultCodeRepository := notebook.DefaultCodeRepository + if *defaultCodeRepository != expected { + return fmt.Errorf("default_code_repository setting is incorrect: %s", *notebook.DefaultCodeRepository) + } + + return nil + } +} + func testAccCheckAWSSagemakerNotebookInstanceTags(notebook *sagemaker.DescribeNotebookInstanceOutput, key string, value string) resource.TestCheckFunc { return func(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).sagemakerconn @@ -593,3 +629,53 @@ resource "aws_subnet" "sagemaker" { } `, notebookName, directInternetAccess) } + +func testAccAWSSagemakerNotebookInstanceConfigDefaultCodeRepository(notebookName string, defaultCodeRepository string) string { + return fmt.Sprintf(` +resource "aws_sagemaker_notebook_instance" "foo" { + name = %[1]q + role_arn = aws_iam_role.foo.arn + instance_type = "ml.t2.medium" + security_groups = [aws_security_group.test.id] + subnet_id = aws_subnet.sagemaker.id + default_code_repository = %[2]q +} + +resource "aws_iam_role" "foo" { + name = %[1]q + path = "/" + assume_role_policy = data.aws_iam_policy_document.assume_role.json +} + +data "aws_iam_policy_document" "assume_role" { + statement { + actions = [ "sts:AssumeRole" ] + principals { + type = "Service" + identifiers = [ "sagemaker.amazonaws.com" ] + } + } +} + +resource "aws_vpc" "test" { + cidr_block = "10.0.0.0/16" + + tags = { + Name = "tf-acc-test-sagemaker-notebook-instance-default-code-repository" + } +} + +resource "aws_security_group" "test" { + vpc_id = aws_vpc.test.id +} + +resource "aws_subnet" "sagemaker" { + vpc_id = aws_vpc.test.id + cidr_block = "10.0.0.0/24" + + tags = { + Name = "tf-acc-test-sagemaker-notebook-instance-default-code-repository" + } +} +`, notebookName, defaultCodeRepository) +} diff --git a/website/docs/r/sagemaker_notebook_instance.html.markdown b/website/docs/r/sagemaker_notebook_instance.html.markdown index 056293a33a29..5a5030322964 100644 --- a/website/docs/r/sagemaker_notebook_instance.html.markdown +++ b/website/docs/r/sagemaker_notebook_instance.html.markdown @@ -38,6 +38,7 @@ The following arguments are supported: * `kms_key_id` - (Optional) The AWS Key Management Service (AWS KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption. * `lifecycle_config_name` - (Optional) The name of a lifecycle configuration to associate with the notebook instance. * `direct_internet_access` - (Optional) Set to `Disabled` to disable internet access to notebook. Requires `security_groups` and `subnet_id` to be set. Supported values: `Enabled` (Default) or `Disabled`. If set to `Disabled`, the notebook instance will be able to access resources only in your VPC, and will not be able to connect to Amazon SageMaker training and endpoint services unless your configure a NAT Gateway in your VPC. +* `default_code_repository` - (Optional) The Git repository associated with the notebook instance as its default code repository * `tags` - (Optional) A map of tags to assign to the resource. ## Attributes Reference