From 124b5dd08111d2b3594a53fb03f8b3098d189ae2 Mon Sep 17 00:00:00 2001 From: maheshg Date: Tue, 15 Mar 2022 17:01:49 -0700 Subject: [PATCH 1/6] GH-259 Setting default value for external_dependencies_patterns field in helm docker remote repo --- .../artifactory_remote_helm_repository.md | 6 +- ...ce_artifactory_remote_docker_repository.go | 13 ++++- ...urce_artifactory_remote_helm_repository.go | 18 +++++- ...urce_artifactory_remote_repository_test.go | 58 +++++++++++++++++++ 4 files changed, 88 insertions(+), 7 deletions(-) diff --git a/docs/resources/artifactory_remote_helm_repository.md b/docs/resources/artifactory_remote_helm_repository.md index 448e9d97c..74cbdacf5 100644 --- a/docs/resources/artifactory_remote_helm_repository.md +++ b/docs/resources/artifactory_remote_helm_repository.md @@ -43,9 +43,9 @@ All generic repo arguments are supported, in addition to: * `helm_charts_base_url` - (Optional) - No documentation is available. Hopefully you know what this means * `external_dependencies_enabled` - (Optional) When set, external dependencies are rewritten. * `external_dependencies_patterns` - (Optional) An Allow List of Ant-style path expressions that specify where external - dependencies may be downloaded from. By default, this is an empty list which means that no dependencies may be downloaded - from external sources. Note that the official documentation states the default is '**', which is correct when creating - repositories in the UI, but incorrect for the API. + dependencies may be downloaded from. By default, this is set to ** which means that dependencies may be downloaded + from any external source. Note that the official documentation states the default is '**', which is correct when creating + repositories in the UI, but incorrect for the API. This provider behavior will match to UI. * `xray_index` - (Optional, Default: false) Enable Indexing In Xray. Repository will be indexed with the default retention period. You will be able to change it via Xray settings. * `store_artifacts_locally` - (Optional) When set, the repository should store cached artifacts locally. When not set, artifacts are not stored locally, and direct repository-to-client streaming is used. This can be useful for multi-server setups over a high-speed LAN, with one Artifactory caching certain data on central storage, and streaming it directly to satellite pass-though Artifactory servers. * `socket_timeout_millis` - (Optional) Network timeout (in ms) to use when establishing a connection and for unanswered requests. Timing out on a network operation is considered a retrieval failure. diff --git a/pkg/artifactory/resource_artifactory_remote_docker_repository.go b/pkg/artifactory/resource_artifactory_remote_docker_repository.go index 3c2561206..bf4e9d50d 100644 --- a/pkg/artifactory/resource_artifactory_remote_docker_repository.go +++ b/pkg/artifactory/resource_artifactory_remote_docker_repository.go @@ -56,10 +56,21 @@ func resourceArtifactoryRemoteDockerRepository() *schema.Resource { BlockPushingSchema1: d.getBool("block_pushing_schema1", false), ExternalDependenciesPatterns: d.getList("external_dependencies_patterns"), } + if len(repo.ExternalDependenciesPatterns) == 0 { + repo.ExternalDependenciesPatterns = []string{"**"} + } return repo, repo.Id(), nil } - return mkResourceSchema(dockerRemoteSchema, defaultPacker, unpackDockerRemoteRepo, func() interface{} { + // Special handling for "external_dependencies_patterns" attribute to match default value behavior in UI. + dockerRemoteRepoPacker := universalPack( + allHclPredicate( + ignoreHclPredicate("class", "rclass", "external_dependencies_patterns"), + schemaHasKey(dockerRemoteSchema), + ), + ) + + return mkResourceSchema(dockerRemoteSchema, dockerRemoteRepoPacker, unpackDockerRemoteRepo, func() interface{} { return &DockerRemoteRepository{ RemoteRepositoryBaseParams: RemoteRepositoryBaseParams{ Rclass: "remote", diff --git a/pkg/artifactory/resource_artifactory_remote_helm_repository.go b/pkg/artifactory/resource_artifactory_remote_helm_repository.go index 322c3778b..ff8119fc1 100644 --- a/pkg/artifactory/resource_artifactory_remote_helm_repository.go +++ b/pkg/artifactory/resource_artifactory_remote_helm_repository.go @@ -32,9 +32,10 @@ func resourceArtifactoryRemoteHelmRepository() *schema.Resource { }, RequiredWith: []string{"external_dependencies_enabled"}, Description: "An Allow List of Ant-style path expressions that specify where external dependencies may be downloaded from. " + - "By default, this is an empty list which means that no dependencies may be downloaded from external sources. " + + "By default, this is set to ** which means that dependencies may be downloaded from any external source. " + "Note that the official documentation states the default is '**', " + - "which is correct when creating repositories in the UI, but incorrect for the API.", + "which is correct when creating repositories in the UI, but incorrect for the API. " + + "Provider behavior will match to UI.", }, }, repoLayoutRefSchema("remote", packageType)) @@ -53,10 +54,21 @@ func resourceArtifactoryRemoteHelmRepository() *schema.Resource { ExternalDependenciesEnabled: d.getBool("external_dependencies_enabled", false), ExternalDependenciesPatterns: d.getList("external_dependencies_patterns"), } + if len(repo.ExternalDependenciesPatterns) == 0 { + repo.ExternalDependenciesPatterns = []string{"**"} + } return repo, repo.Id(), nil } - return mkResourceSchema(helmRemoteSchema, defaultPacker, unpackHelmRemoteRepo, func() interface{} { + // Special handling for "external_dependencies_patterns" attribute to match default value behavior in UI. + helmRemoteRepoPacker := universalPack( + allHclPredicate( + ignoreHclPredicate("class", "rclass", "external_dependencies_patterns"), + schemaHasKey(helmRemoteSchema), + ), + ) + + return mkResourceSchema(helmRemoteSchema, helmRemoteRepoPacker, unpackHelmRemoteRepo, func() interface{} { return &HelmRemoteRepo{ RemoteRepositoryBaseParams: RemoteRepositoryBaseParams{ Rclass: "remote", diff --git a/pkg/artifactory/resource_artifactory_remote_repository_test.go b/pkg/artifactory/resource_artifactory_remote_repository_test.go index d473ff508..fe1fac9ee 100644 --- a/pkg/artifactory/resource_artifactory_remote_repository_test.go +++ b/pkg/artifactory/resource_artifactory_remote_repository_test.go @@ -2,6 +2,7 @@ package artifactory import ( "fmt" + "log" "math/rand" "regexp" "strings" @@ -10,6 +11,7 @@ import ( "github.com/go-resty/resty/v2" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccLocalAllowDotsUnderscorersAndDashesInKeyGH129(t *testing.T) { @@ -175,6 +177,62 @@ func TestAccRemoteHelmRepositoryWithAdditionalCheckFunctions(t *testing.T) { })) } +func TestAccRemoteRepository_ExternalDependenciesDefaults(t *testing.T) { + repoTypes := []string{"helm", "docker"} + const remoteRepoExternalDependenciesDefaults = ` + resource "artifactory_remote_%s_repository" "%s" { + key = "%s" + url = "https://testrepo.io/" + external_dependencies_enabled = true + } + ` + type ExternalDependenciesRemoteRepo struct { + ExternalDependenciesEnabled bool `json:"externalDependenciesEnabled"` + ExternalDependenciesPatterns []string `json:"externalDependenciesPatterns"` + } + + for _, repoType := range repoTypes { + id := rand.Int() + name := fmt.Sprintf("terraform-remote-test-%s-repo%d", repoType, id) + fqrn := fmt.Sprintf("artifactory_remote_%s_repository.%s", repoType, name) + + var externalDependenciesCheck = func(state *terraform.State) error { + restyClient := getTestResty(t) + queryRepoResponse := &ExternalDependenciesRemoteRepo{} + _, err := restyClient.R().SetResult(&queryRepoResponse).Get("artifactory/api/repositories/" + name) + if err != nil { + t.Fatal(err) + } + if queryRepoResponse.ExternalDependenciesPatterns != nil && + len(queryRepoResponse.ExternalDependenciesPatterns) == 1 && + queryRepoResponse.ExternalDependenciesPatterns[0] == "**" { + log.Printf("[INFO] external_dependencies_patterns attribute default value '**' set as expected") + } else { + return fmt.Errorf("error: external_dependencies_patterns attribute = %v instead of default '**'", queryRepoResponse.ExternalDependenciesPatterns) + } + return err + } + + t.Run(fmt.Sprintf("TestRemote%sRepo_ExternalDependenciesDefaults", strings.Title(strings.ToLower(repoType))), func(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + CheckDestroy: verifyDeleted(fqrn, testCheckRepo), + ProviderFactories: testAccProviders, + Steps: []resource.TestStep{ + { + Config: fmt.Sprintf(remoteRepoExternalDependenciesDefaults, repoType, name, name), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(fqrn, "key", name), + resource.TestCheckResourceAttr(fqrn, "external_dependencies_enabled", "true"), + externalDependenciesCheck, + ), + }, + }, + }) + }) + } +} + func TestAccRemoteNpmRepository(t *testing.T) { const packageType = "npm" resource.Test(mkNewRemoteTestCase(packageType, t, map[string]interface{}{ From d420c092646fcd88b799965c6d82d3231eb5e076 Mon Sep 17 00:00:00 2001 From: maheshg Date: Tue, 15 Mar 2022 17:12:35 -0700 Subject: [PATCH 2/6] GH-259 Update CHANGELOG.md --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34b0f6e8b..a664d0834 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 2.23.2 (Mar 16, 2022) + +IMPROVEMENTS: + +* resource/artifactory_remote_docker_repository: Setting default value '**' for external_dependencies_patterns field. [GH-363] +* resource/artifactory_remote_helm_repository: Setting default value '**' for external_dependencies_patterns field. [GH-363] + ## 2.23.0 (Mar 11, 2022) FEATURES: From 346b69e525da2a00dd2a9562b75812970d7f141a Mon Sep 17 00:00:00 2001 From: maheshg Date: Tue, 15 Mar 2022 17:43:51 -0700 Subject: [PATCH 3/6] GH-267 Updated description and doc for external_dependencies_patterns field of remote helm repo --- docs/resources/artifactory_remote_helm_repository.md | 2 +- pkg/artifactory/resource_artifactory_remote_helm_repository.go | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/resources/artifactory_remote_helm_repository.md b/docs/resources/artifactory_remote_helm_repository.md index 74cbdacf5..c1338314e 100644 --- a/docs/resources/artifactory_remote_helm_repository.md +++ b/docs/resources/artifactory_remote_helm_repository.md @@ -45,7 +45,7 @@ All generic repo arguments are supported, in addition to: * `external_dependencies_patterns` - (Optional) An Allow List of Ant-style path expressions that specify where external dependencies may be downloaded from. By default, this is set to ** which means that dependencies may be downloaded from any external source. Note that the official documentation states the default is '**', which is correct when creating - repositories in the UI, but incorrect for the API. This provider behavior will match to UI. + repositories in the UI, but incorrect for the API. * `xray_index` - (Optional, Default: false) Enable Indexing In Xray. Repository will be indexed with the default retention period. You will be able to change it via Xray settings. * `store_artifacts_locally` - (Optional) When set, the repository should store cached artifacts locally. When not set, artifacts are not stored locally, and direct repository-to-client streaming is used. This can be useful for multi-server setups over a high-speed LAN, with one Artifactory caching certain data on central storage, and streaming it directly to satellite pass-though Artifactory servers. * `socket_timeout_millis` - (Optional) Network timeout (in ms) to use when establishing a connection and for unanswered requests. Timing out on a network operation is considered a retrieval failure. diff --git a/pkg/artifactory/resource_artifactory_remote_helm_repository.go b/pkg/artifactory/resource_artifactory_remote_helm_repository.go index ff8119fc1..6ed0dcffb 100644 --- a/pkg/artifactory/resource_artifactory_remote_helm_repository.go +++ b/pkg/artifactory/resource_artifactory_remote_helm_repository.go @@ -34,8 +34,7 @@ func resourceArtifactoryRemoteHelmRepository() *schema.Resource { Description: "An Allow List of Ant-style path expressions that specify where external dependencies may be downloaded from. " + "By default, this is set to ** which means that dependencies may be downloaded from any external source. " + "Note that the official documentation states the default is '**', " + - "which is correct when creating repositories in the UI, but incorrect for the API. " + - "Provider behavior will match to UI.", + "which is correct when creating repositories in the UI, but incorrect for the API.", }, }, repoLayoutRefSchema("remote", packageType)) From ca251af3210fce38620af38ce41f3bc969e7e59b Mon Sep 17 00:00:00 2001 From: maheshg Date: Tue, 15 Mar 2022 17:46:50 -0700 Subject: [PATCH 4/6] GH-267 Updated CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a664d0834..97f7a37ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 2.23.2 (Mar 16, 2022) +## 2.23.1 (Mar 15, 2022) IMPROVEMENTS: From 3c08ad2cfe03ee6c388cdbfe10a3f125999d5ec7 Mon Sep 17 00:00:00 2001 From: maheshg Date: Tue, 15 Mar 2022 19:42:20 -0700 Subject: [PATCH 5/6] GH-267 Updated description of external_dependencies_patterns field in helm remote repo --- docs/resources/artifactory_remote_helm_repository.md | 3 +-- .../resource_artifactory_remote_helm_repository.go | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/docs/resources/artifactory_remote_helm_repository.md b/docs/resources/artifactory_remote_helm_repository.md index c1338314e..78ebe6f6e 100644 --- a/docs/resources/artifactory_remote_helm_repository.md +++ b/docs/resources/artifactory_remote_helm_repository.md @@ -44,8 +44,7 @@ All generic repo arguments are supported, in addition to: * `external_dependencies_enabled` - (Optional) When set, external dependencies are rewritten. * `external_dependencies_patterns` - (Optional) An Allow List of Ant-style path expressions that specify where external dependencies may be downloaded from. By default, this is set to ** which means that dependencies may be downloaded - from any external source. Note that the official documentation states the default is '**', which is correct when creating - repositories in the UI, but incorrect for the API. + from any external source. * `xray_index` - (Optional, Default: false) Enable Indexing In Xray. Repository will be indexed with the default retention period. You will be able to change it via Xray settings. * `store_artifacts_locally` - (Optional) When set, the repository should store cached artifacts locally. When not set, artifacts are not stored locally, and direct repository-to-client streaming is used. This can be useful for multi-server setups over a high-speed LAN, with one Artifactory caching certain data on central storage, and streaming it directly to satellite pass-though Artifactory servers. * `socket_timeout_millis` - (Optional) Network timeout (in ms) to use when establishing a connection and for unanswered requests. Timing out on a network operation is considered a retrieval failure. diff --git a/pkg/artifactory/resource_artifactory_remote_helm_repository.go b/pkg/artifactory/resource_artifactory_remote_helm_repository.go index 6ed0dcffb..595b9c791 100644 --- a/pkg/artifactory/resource_artifactory_remote_helm_repository.go +++ b/pkg/artifactory/resource_artifactory_remote_helm_repository.go @@ -32,9 +32,7 @@ func resourceArtifactoryRemoteHelmRepository() *schema.Resource { }, RequiredWith: []string{"external_dependencies_enabled"}, Description: "An Allow List of Ant-style path expressions that specify where external dependencies may be downloaded from. " + - "By default, this is set to ** which means that dependencies may be downloaded from any external source. " + - "Note that the official documentation states the default is '**', " + - "which is correct when creating repositories in the UI, but incorrect for the API.", + "By default, this is set to ** which means that dependencies may be downloaded from any external source.", }, }, repoLayoutRefSchema("remote", packageType)) From c8b86a9e3bf13c128a57b629b298a5b7dbd33eb5 Mon Sep 17 00:00:00 2001 From: maheshg Date: Thu, 17 Mar 2022 11:40:10 -0700 Subject: [PATCH 6/6] GH-267 Updated test check in TestAccRemoteRepository_ExternalDependenciesDefaults --- .../resource_artifactory_remote_repository_test.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/pkg/artifactory/resource_artifactory_remote_repository_test.go b/pkg/artifactory/resource_artifactory_remote_repository_test.go index fe1fac9ee..e3670df53 100644 --- a/pkg/artifactory/resource_artifactory_remote_repository_test.go +++ b/pkg/artifactory/resource_artifactory_remote_repository_test.go @@ -2,7 +2,6 @@ package artifactory import ( "fmt" - "log" "math/rand" "regexp" "strings" @@ -203,11 +202,9 @@ func TestAccRemoteRepository_ExternalDependenciesDefaults(t *testing.T) { if err != nil { t.Fatal(err) } - if queryRepoResponse.ExternalDependenciesPatterns != nil && - len(queryRepoResponse.ExternalDependenciesPatterns) == 1 && - queryRepoResponse.ExternalDependenciesPatterns[0] == "**" { - log.Printf("[INFO] external_dependencies_patterns attribute default value '**' set as expected") - } else { + if queryRepoResponse.ExternalDependenciesPatterns == nil || + len(queryRepoResponse.ExternalDependenciesPatterns) != 1 || + queryRepoResponse.ExternalDependenciesPatterns[0] != "**" { return fmt.Errorf("error: external_dependencies_patterns attribute = %v instead of default '**'", queryRepoResponse.ExternalDependenciesPatterns) } return err