diff --git a/aws/resource_aws_codebuild_project.go b/aws/resource_aws_codebuild_project.go index 7a5cc1b2326..f8b1862f0af 100644 --- a/aws/resource_aws_codebuild_project.go +++ b/aws/resource_aws_codebuild_project.go @@ -33,7 +33,7 @@ func resourceAwsCodeBuildProject() *schema.Resource { Computed: true, }, "artifacts": { - Type: schema.TypeSet, + Type: schema.TypeList, Required: true, MaxItems: 1, Elem: &schema.Resource{ @@ -41,6 +41,12 @@ func resourceAwsCodeBuildProject() *schema.Resource { "name": { Type: schema.TypeString, Optional: true, + DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { + if old == d.Get("name") && new == "" { + return true + } + return false + }, }, "encryption_disabled": { Type: schema.TypeBool, @@ -54,6 +60,12 @@ func resourceAwsCodeBuildProject() *schema.Resource { "namespace_type": { Type: schema.TypeString, Optional: true, + DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { + if d.Get("artifacts.0.type") == codebuild.ArtifactsTypeS3 { + return old == codebuild.ArtifactNamespaceNone && new == "" + } + return false + }, ValidateFunc: validation.StringInSlice([]string{ codebuild.ArtifactNamespaceNone, codebuild.ArtifactNamespaceBuildId, @@ -62,6 +74,15 @@ func resourceAwsCodeBuildProject() *schema.Resource { "packaging": { Type: schema.TypeString, Optional: true, + DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { + switch d.Get("artifacts.0.type") { + case codebuild.ArtifactsTypeCodepipeline: + return new == "" + case codebuild.ArtifactsTypeS3: + return old == codebuild.ArtifactPackagingNone && new == "" + } + return false + }, }, "path": { Type: schema.TypeString, @@ -83,7 +104,6 @@ func resourceAwsCodeBuildProject() *schema.Resource { }, }, }, - Set: resourceAwsCodeBuildProjectArtifactsHash, }, "cache": { Type: schema.TypeList, @@ -659,7 +679,7 @@ func expandProjectSecondaryArtifacts(d *schema.ResourceData) []*codebuild.Projec } func expandProjectArtifacts(d *schema.ResourceData) codebuild.ProjectArtifacts { - configs := d.Get("artifacts").(*schema.Set).List() + configs := d.Get("artifacts").([]interface{}) data := configs[0].(map[string]interface{}) return expandProjectArtifactData(data) @@ -1215,17 +1235,8 @@ func flattenAwsCodeBuildProjectSecondaryArtifacts(artifactsList []*codebuild.Pro return &artifactSet } -func flattenAwsCodeBuildProjectArtifacts(artifacts *codebuild.ProjectArtifacts) *schema.Set { - - artifactSet := schema.Set{ - F: resourceAwsCodeBuildProjectArtifactsHash, - } - - values := flattenAwsCodeBuildProjectArtifactsData(*artifacts) - - artifactSet.Add(values) - - return &artifactSet +func flattenAwsCodeBuildProjectArtifacts(artifacts *codebuild.ProjectArtifacts) []interface{} { + return []interface{}{flattenAwsCodeBuildProjectArtifactsData(*artifacts)} } func flattenAwsCodeBuildProjectArtifactsData(artifacts codebuild.ProjectArtifacts) map[string]interface{} { diff --git a/aws/resource_aws_codebuild_project_test.go b/aws/resource_aws_codebuild_project_test.go index d89c21a9e8a..f40389ee5b6 100644 --- a/aws/resource_aws_codebuild_project_test.go +++ b/aws/resource_aws_codebuild_project_test.go @@ -910,6 +910,7 @@ func TestAccAWSCodeBuildProject_Artifacts_EncryptionDisabled(t *testing.T) { Check: resource.ComposeTestCheckFunc( testAccCheckAWSCodeBuildProjectExists(resourceName, &project), resource.TestCheckResourceAttr(resourceName, "artifacts.#", "1"), + resource.TestCheckResourceAttr(resourceName, "artifacts.0.encryption_disabled", "true"), ), }, { @@ -917,6 +918,49 @@ func TestAccAWSCodeBuildProject_Artifacts_EncryptionDisabled(t *testing.T) { ImportState: true, ImportStateVerify: true, }, + { + Config: testAccAWSCodebuildProjectConfig_Artifacts_EncryptionDisabled(rName, bName, false), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSCodeBuildProjectExists(resourceName, &project), + resource.TestCheckResourceAttr(resourceName, "artifacts.#", "1"), + resource.TestCheckResourceAttr(resourceName, "artifacts.0.encryption_disabled", "false"), + ), + }, + }, + }) +} + +func TestAccAWSCodeBuildProject_Artifacts_NamespaceType(t *testing.T) { + var project codebuild.Project + rName := acctest.RandomWithPrefix("tf-acc-test") + resourceName := "aws_codebuild_project.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t); testAccPreCheckAWSCodeBuild(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSCodeBuildProjectDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSCodebuildProjectConfig_Artifacts_NamespaceType(rName, codebuild.ArtifactNamespaceBuildId), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSCodeBuildProjectExists(resourceName, &project), + resource.TestCheckResourceAttr(resourceName, "artifacts.#", "1"), + resource.TestCheckResourceAttr(resourceName, "artifacts.0.namespace_type", codebuild.ArtifactNamespaceBuildId), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccAWSCodebuildProjectConfig_Artifacts_NamespaceType(rName, codebuild.ArtifactNamespaceNone), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSCodeBuildProjectExists(resourceName, &project), + resource.TestCheckResourceAttr(resourceName, "artifacts.#", "1"), + resource.TestCheckResourceAttr(resourceName, "artifacts.0.namespace_type", codebuild.ArtifactNamespaceNone), + ), + }, }, }) } @@ -955,6 +999,76 @@ func TestAccAWSCodeBuildProject_Artifacts_OverrideArtifactName(t *testing.T) { }) } +func TestAccAWSCodeBuildProject_Artifacts_Packaging(t *testing.T) { + var project codebuild.Project + rName := acctest.RandomWithPrefix("tf-acc-test") + resourceName := "aws_codebuild_project.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t); testAccPreCheckAWSCodeBuild(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSCodeBuildProjectDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSCodebuildProjectConfig_Artifacts_Packaging(rName, codebuild.ArtifactPackagingZip), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSCodeBuildProjectExists(resourceName, &project), + resource.TestCheckResourceAttr(resourceName, "artifacts.#", "1"), + resource.TestCheckResourceAttr(resourceName, "artifacts.0.packaging", codebuild.ArtifactPackagingZip), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccAWSCodebuildProjectConfig_Artifacts_Packaging(rName, codebuild.ArtifactPackagingNone), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSCodeBuildProjectExists(resourceName, &project), + resource.TestCheckResourceAttr(resourceName, "artifacts.#", "1"), + resource.TestCheckResourceAttr(resourceName, "artifacts.0.packaging", codebuild.ArtifactPackagingNone), + ), + }, + }, + }) +} + +func TestAccAWSCodeBuildProject_Artifacts_Path(t *testing.T) { + var project codebuild.Project + rName := acctest.RandomWithPrefix("tf-acc-test") + resourceName := "aws_codebuild_project.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t); testAccPreCheckAWSCodeBuild(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSCodeBuildProjectDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSCodebuildProjectConfig_Artifacts_Path(rName, "path1"), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSCodeBuildProjectExists(resourceName, &project), + resource.TestCheckResourceAttr(resourceName, "artifacts.#", "1"), + resource.TestCheckResourceAttr(resourceName, "artifacts.0.path", "path1"), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccAWSCodebuildProjectConfig_Artifacts_Path(rName, "path2"), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSCodeBuildProjectExists(resourceName, &project), + resource.TestCheckResourceAttr(resourceName, "artifacts.#", "1"), + resource.TestCheckResourceAttr(resourceName, "artifacts.0.path", "path2"), + ), + }, + }, + }) +} + func TestAccAWSCodeBuildProject_SecondaryArtifacts(t *testing.T) { var project codebuild.Project rName := acctest.RandomWithPrefix("tf-acc-test") @@ -2203,6 +2317,32 @@ resource "aws_codebuild_project" "test" { `, rName, encryptionDisabled) } +func testAccAWSCodebuildProjectConfig_Artifacts_NamespaceType(rName, namespaceType string) string { + return testAccAWSCodeBuildProjectConfig_Base_ServiceRole(rName) + testAccAWSCodeBuildProjectConfig_Base_Bucket(rName) + fmt.Sprintf(` +resource "aws_codebuild_project" "test" { + name = %[1]q + service_role = "${aws_iam_role.test.arn}" + + artifacts { + location = "${aws_s3_bucket.test.bucket}" + namespace_type = %[2]q + type = "S3" + } + + environment { + compute_type = "BUILD_GENERAL1_SMALL" + image = "2" + type = "LINUX_CONTAINER" + } + + source { + type = "GITHUB" + location = "https://github.com/hashicorp/packer.git" + } +} +`, rName, namespaceType) +} + func testAccAWSCodebuildProjectConfig_Artifacts_OverrideArtifactName(rName string, bName string, overrideArtifactName bool) string { return testAccAWSCodeBuildProjectConfig_Base_ServiceRole(rName) + testAccAWSCodeBuildProjectConfig_Base_Bucket(bName) + fmt.Sprintf(` resource "aws_codebuild_project" "test" { @@ -2229,6 +2369,58 @@ resource "aws_codebuild_project" "test" { `, rName, overrideArtifactName) } +func testAccAWSCodebuildProjectConfig_Artifacts_Packaging(rName, packaging string) string { + return testAccAWSCodeBuildProjectConfig_Base_ServiceRole(rName) + testAccAWSCodeBuildProjectConfig_Base_Bucket(rName) + fmt.Sprintf(` +resource "aws_codebuild_project" "test" { + name = %[1]q + service_role = "${aws_iam_role.test.arn}" + + artifacts { + location = "${aws_s3_bucket.test.bucket}" + packaging = %[2]q + type = "S3" + } + + environment { + compute_type = "BUILD_GENERAL1_SMALL" + image = "2" + type = "LINUX_CONTAINER" + } + + source { + type = "GITHUB" + location = "https://github.com/hashicorp/packer.git" + } +} +`, rName, packaging) +} + +func testAccAWSCodebuildProjectConfig_Artifacts_Path(rName, path string) string { + return testAccAWSCodeBuildProjectConfig_Base_ServiceRole(rName) + testAccAWSCodeBuildProjectConfig_Base_Bucket(rName) + fmt.Sprintf(` +resource "aws_codebuild_project" "test" { + name = %[1]q + service_role = "${aws_iam_role.test.arn}" + + artifacts { + location = "${aws_s3_bucket.test.bucket}" + path = %[2]q + type = "S3" + } + + environment { + compute_type = "BUILD_GENERAL1_SMALL" + image = "2" + type = "LINUX_CONTAINER" + } + + source { + type = "GITHUB" + location = "https://github.com/hashicorp/packer.git" + } +} +`, rName, path) +} + func testAccAWSCodebuildProjectConfig_SecondaryArtifacts(rName string, bName string) string { return testAccAWSCodeBuildProjectConfig_Base_ServiceRole(rName) + testAccAWSCodeBuildProjectConfig_Base_Bucket(bName) + fmt.Sprintf(` resource "aws_codebuild_project" "test" {