Skip to content

Commit 074acbf

Browse files
authored
Merge pull request #1096 from jfrog/GH-1091-add-curated-attribute-for-nuget-and-huggingface-remote-repos
Add curated attribute for remote repos
2 parents 8e1e80d + 481349a commit 074acbf

28 files changed

+285
-54
lines changed

CHANGELOG.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
## 12.2.0 (October 14, 2024). Tested on Artifactory 7.90.14 with Terraform 1.9.7 and OpenTofu 1.8.3
1+
## 12.2.0 (October 15, 2024). Tested on Artifactory 7.90.14 with Terraform 1.9.7 and OpenTofu 1.8.3
22

33
IMPROVEMENTS:
44

55
* resource/artifactory_local_repository_multi_replication: Add `disable_proxy` attribute to `replication` to support not using proxy. Issue: [#1088](https://github.com/jfrog/terraform-provider-artifactory/issues/1088) PR: [#1095](https://github.com/jfrog/terraform-provider-artifactory/pull/1095)
6+
* resource/artifactory_remote_conan_repository, resource/artifactory_remote_gems_repository, resource/artifactory_remote_go_repository, resource/artifactory_remote_gradle_repository, resource/artifactory_remote_huggingfaceml_repository, resource/artifactory_remote_nuget_repository: Add `curated` attribute to support enabled Curation for these package types. Issue: [#1091](https://github.com/jfrog/terraform-provider-artifactory/issues/1091) PR: [#1096](https://github.com/jfrog/terraform-provider-artifactory/pull/1096)
67

78
## 12.1.1 (October 2, 2024). Tested on Artifactory 7.90.13 with Terraform 1.9.6 and OpenTofu 1.8.2
89

docs/resources/remote_conan_repository.md

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ The following arguments are supported, along with the [common list of arguments
2727
* `notes` - (Optional)
2828
* `url` - (Required) The remote repo URL.
2929
* `force_conan_authentication` - (Optional) Force basic authentication credentials in order to use this repository. Default value is `false`.
30+
* `curated` - (Optional, Default: `false`) Enable repository to be protected by the Curation service.
3031

3132
## Import
3233

docs/resources/remote_gems_repository.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ The following arguments are supported, along with the [common list of arguments
2626
* `description` - (Optional)
2727
* `notes` - (Optional)
2828
* `url` - (Required) The remote repo URL.
29-
29+
* `curated` - (Optional, Default: `false`) Enable repository to be protected by the Curation service.
3030

3131

3232
## Import

docs/resources/remote_go_repository.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ The following arguments are supported, along with the [common list of arguments
2828
* `notes` - (Optional)
2929
* `url` - (Required) The remote repo URL.
3030
* `vcs_git_provider` - (Optional) Artifactory supports proxying the following Git providers out-of-the-box: GitHub or a remote Artifactory instance. Default value is `ARTIFACTORY`.
31-
31+
* `curated` - (Optional, Default: `false`) Enable repository to be protected by the Curation service.
3232

3333

3434
## Import

docs/resources/remote_gradle_repository.md

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ The following arguments are supported, along with the [common list of arguments
3838
* `reject_invalid_jars` - (Optional, Default: `false`) Reject the caching of jar files that are found to be invalid. For example, pseudo jars retrieved behind a "captive portal".
3939
* `remote_repo_checksum_policy_type` - (Optional, Default: `generate-if-absent`) Checking the Checksum effectively verifies the integrity of a deployed resource. The Checksum Policy determines how the system behaves when a client checksum for a remote resource is missing or conflicts with the locally calculated checksum. Available policies are `generate-if-absent`, `fail`, `ignore-and-generate`, and `pass-thru`.
4040
* `max_unique_snapshots` - (Optional) The maximum number of unique snapshots of a single artifact to store. Once the number of snapshots exceeds this setting, older versions are removed. A value of 0 (default) indicates there is no limit, and unique snapshots are not cleaned up.
41+
* `curated` - (Optional, Default: `false`) Enable repository to be protected by the Curation service.
4142

4243
## Import
4344

docs/resources/remote_huggingfaceml_repository.md

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ The following arguments are supported, along with the [common list of arguments
2525
contain spaces or special characters.
2626
* `description` - (Optional)
2727
* `notes` - (Optional)
28+
* `curated` - (Optional, Default: `false`) Enable repository to be protected by the Curation service.
2829

2930
## Import
3031

docs/resources/remote_nuget_repository.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ The following arguments are supported, along with the [common list of arguments
3737
* `v3_feed_url` - (Optional) The URL to the NuGet v3 feed. Default value is `https://api.nuget.org/v3/index.json`.
3838
* `force_nuget_authentication` - (Optional) Force basic authentication credentials in order to use this repository. Default value is `false`.
3939
* `symbol_server_url` - (Optional) NuGet symbol server URL. Default value is `https://symbols.nuget.org/download/symbols`.
40-
40+
* `curated` - (Optional, Default: `false`) Enable repository to be protected by the Curation service.
4141

4242

4343
## Import

pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_repository_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -927,7 +927,7 @@ func makeFederatedGradleLikeRepoTestCase(repoType string, t *testing.T) (*testin
927927
}
928928

929929
func TestAccDataSourceFederatedAllGradleLikePackageTypes(t *testing.T) {
930-
for _, packageType := range repository.GradleLikePackageTypes {
930+
for _, packageType := range repository.PackageTypesLikeGradle {
931931
t.Run(packageType, func(t *testing.T) {
932932
resource.Test(makeFederatedGradleLikeRepoTestCase(packageType, t))
933933
})

pkg/artifactory/datasource/repository/local/datasource_artifactory_local_repository_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,7 @@ func TestAccDataSourceLocalHelmOciRepository(t *testing.T) {
641641
}
642642

643643
func TestAccDataSourceLocalAllGradleLikePackageTypes(t *testing.T) {
644-
for _, packageType := range repository.GradleLikePackageTypes {
644+
for _, packageType := range repository.PackageTypesLikeGradle {
645645
t.Run(packageType, func(t *testing.T) {
646646
resource.Test(makeDataSourceLocalGradleLikeRepoTestCase(packageType, t))
647647
})

pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_repository_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ func makeDataSourceRemoteGradleLikeRepoTestCase(packageType string, t *testing.T
521521
}
522522

523523
func TestAccDataSourceRemoteAllGradleLikePackageTypes(t *testing.T) {
524-
for _, packageType := range repository.GradleLikePackageTypes {
524+
for _, packageType := range repository.PackageTypesLikeGradle {
525525
t.Run(packageType, func(t *testing.T) {
526526
resource.Test(makeDataSourceRemoteGradleLikeRepoTestCase(packageType, t))
527527
})

pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_repository_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func TestAccDataSourceVirtualAllGenericLikeRetrievalPackageTypes(t *testing.T) {
3636
}
3737

3838
func TestAccDataSourceVirtualAllGradleLikePackageTypes(t *testing.T) {
39-
for _, packageType := range repository.GradleLikePackageTypes {
39+
for _, packageType := range repository.PackageTypesLikeGradle {
4040
t.Run(packageType, func(t *testing.T) {
4141
resource.Test(mkNewVirtualTestCase(packageType, t, map[string]interface{}{
4242
"description": fmt.Sprintf("%s virtual repository public description testing.", packageType),

pkg/artifactory/provider/datasources.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func datasourcesMap() map[string]*schema.Resource {
8888
"artifactory_federated_terraform_provider_repository": datasource_federated.DataSourceArtifactoryFederatedTerraformRepository("provider"),
8989
}
9090

91-
for _, packageType := range repository.GradleLikePackageTypes {
91+
for _, packageType := range repository.PackageTypesLikeGradle {
9292
localResourceName := fmt.Sprintf("artifactory_local_%s_repository", packageType)
9393
dataSourcesMap[localResourceName] = datasource_local.DataSourceArtifactoryLocalJavaRepository(packageType, true)
9494

pkg/artifactory/provider/resources.go

+27-24
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,20 @@ func resourcesMap() map[string]*schema.Resource {
5353
"artifactory_remote_composer_repository": remote.ResourceArtifactoryRemoteComposerRepository(),
5454
"artifactory_remote_conan_repository": remote.ResourceArtifactoryRemoteConanRepository(),
5555
"artifactory_remote_docker_repository": remote.ResourceArtifactoryRemoteDockerRepository(),
56+
"artifactory_remote_gems_repository": remote.ResourceArtifactoryRemoteGemsRepository(),
5657
"artifactory_remote_generic_repository": remote.ResourceArtifactoryRemoteGenericRepository(),
5758
"artifactory_remote_go_repository": remote.ResourceArtifactoryRemoteGoRepository(),
59+
"artifactory_remote_gradle_repository": remote.ResourceArtifactoryRemoteGradleRepository(),
5860
"artifactory_remote_helm_repository": remote.ResourceArtifactoryRemoteHelmRepository(),
5961
"artifactory_remote_helmoci_repository": remote.ResourceArtifactoryRemoteHelmOciRepository(),
6062
"artifactory_remote_huggingfaceml_repository": remote.ResourceArtifactoryRemoteHuggingFaceRepository(),
63+
"artifactory_remote_ivy_repository": remote.ResourceArtifactoryRemoteJavaRepository(repository.IvyPackageType, true),
6164
"artifactory_remote_maven_repository": remote.ResourceArtifactoryRemoteMavenRepository(),
6265
"artifactory_remote_npm_repository": remote.ResourceArtifactoryRemoteNpmRepository(),
6366
"artifactory_remote_nuget_repository": remote.ResourceArtifactoryRemoteNugetRepository(),
6467
"artifactory_remote_oci_repository": remote.ResourceArtifactoryRemoteOciRepository(),
6568
"artifactory_remote_pypi_repository": remote.ResourceArtifactoryRemotePypiRepository(),
69+
"artifactory_remote_sbt_repository": remote.ResourceArtifactoryRemoteJavaRepository(repository.SBTPackageType, true),
6670
"artifactory_remote_terraform_repository": remote.ResourceArtifactoryRemoteTerraformRepository(),
6771
"artifactory_remote_vcs_repository": remote.ResourceArtifactoryRemoteVcsRepository(),
6872
"artifactory_virtual_alpine_repository": virtual.ResourceArtifactoryVirtualAlpineRepository(),
@@ -88,39 +92,38 @@ func resourcesMap() map[string]*schema.Resource {
8892
"artifactory_ldap_group_setting": configuration.ResourceArtifactoryLdapGroupSetting(),
8993
}
9094

91-
for _, repoType := range local.PackageTypesLikeGeneric {
92-
localResourceName := fmt.Sprintf("artifactory_local_%s_repository", repoType)
93-
resourcesMap[localResourceName] = local.ResourceArtifactoryLocalGenericRepository(repoType)
95+
for _, packageType := range local.PackageTypesLikeGeneric {
96+
localResourceName := fmt.Sprintf("artifactory_local_%s_repository", packageType)
97+
resourcesMap[localResourceName] = local.ResourceArtifactoryLocalGenericRepository(packageType)
9498
}
9599

96-
for _, repoType := range remote.PackageTypesLikeBasic {
97-
remoteResourceName := fmt.Sprintf("artifactory_remote_%s_repository", repoType)
98-
resourcesMap[remoteResourceName] = remote.ResourceArtifactoryRemoteBasicRepository(repoType)
100+
for _, packageType := range remote.PackageTypesLikeBasic {
101+
remoteResourceName := fmt.Sprintf("artifactory_remote_%s_repository", packageType)
102+
resourcesMap[remoteResourceName] = remote.ResourceArtifactoryRemoteBasicRepository(packageType)
99103
}
100104

101-
for _, repoType := range repository.GradleLikePackageTypes {
102-
localResourceName := fmt.Sprintf("artifactory_local_%s_repository", repoType)
103-
resourcesMap[localResourceName] = local.ResourceArtifactoryLocalJavaRepository(repoType, true)
104-
remoteResourceName := fmt.Sprintf("artifactory_remote_%s_repository", repoType)
105-
resourcesMap[remoteResourceName] = remote.ResourceArtifactoryRemoteJavaRepository(repoType, true)
106-
virtualResourceName := fmt.Sprintf("artifactory_virtual_%s_repository", repoType)
107-
resourcesMap[virtualResourceName] = virtual.ResourceArtifactoryVirtualJavaRepository(repoType)
108-
federatedResourceName := fmt.Sprintf("artifactory_federated_%s_repository", repoType)
109-
resourcesMap[federatedResourceName] = federated.ResourceArtifactoryFederatedJavaRepository(repoType, true)
105+
for _, packageType := range repository.PackageTypesLikeGradle {
106+
localResourceName := fmt.Sprintf("artifactory_local_%s_repository", packageType)
107+
resourcesMap[localResourceName] = local.ResourceArtifactoryLocalJavaRepository(packageType, true)
108+
virtualResourceName := fmt.Sprintf("artifactory_virtual_%s_repository", packageType)
109+
resourcesMap[virtualResourceName] = virtual.ResourceArtifactoryVirtualJavaRepository(packageType)
110+
federatedResourceName := fmt.Sprintf("artifactory_federated_%s_repository", packageType)
111+
resourcesMap[federatedResourceName] = federated.ResourceArtifactoryFederatedJavaRepository(packageType, true)
110112
}
111113

112-
for _, repoType := range virtual.PackageTypesLikeGeneric {
113-
virtualResourceName := fmt.Sprintf("artifactory_virtual_%s_repository", repoType)
114-
resourcesMap[virtualResourceName] = virtual.ResourceArtifactoryVirtualGenericRepository(repoType)
114+
for _, packageType := range virtual.PackageTypesLikeGeneric {
115+
virtualResourceName := fmt.Sprintf("artifactory_virtual_%s_repository", packageType)
116+
resourcesMap[virtualResourceName] = virtual.ResourceArtifactoryVirtualGenericRepository(packageType)
115117
}
116-
for _, repoType := range virtual.PackageTypesLikeGenericWithRetrievalCachePeriodSecs {
117-
virtualResourceName := fmt.Sprintf("artifactory_virtual_%s_repository", repoType)
118-
resourcesMap[virtualResourceName] = virtual.ResourceArtifactoryVirtualRepositoryWithRetrievalCachePeriodSecs(repoType)
118+
119+
for _, packageType := range virtual.PackageTypesLikeGenericWithRetrievalCachePeriodSecs {
120+
virtualResourceName := fmt.Sprintf("artifactory_virtual_%s_repository", packageType)
121+
resourcesMap[virtualResourceName] = virtual.ResourceArtifactoryVirtualRepositoryWithRetrievalCachePeriodSecs(packageType)
119122
}
120123

121-
for _, repoType := range federated.PackageTypesLikeGeneric {
122-
federatedResourceName := fmt.Sprintf("artifactory_federated_%s_repository", repoType)
123-
resourcesMap[federatedResourceName] = federated.ResourceArtifactoryFederatedGenericRepository(repoType)
124+
for _, packageType := range federated.PackageTypesLikeGeneric {
125+
federatedResourceName := fmt.Sprintf("artifactory_federated_%s_repository", packageType)
126+
resourcesMap[federatedResourceName] = federated.ResourceArtifactoryFederatedGenericRepository(packageType)
124127
}
125128

126129
return utilsdk.AddTelemetry(productId, resourcesMap)

pkg/artifactory/resource/repository/federated/resource_artifactory_federated_repository_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1391,7 +1391,7 @@ func makeFederatedGradleLikeRepoTestCase(repoType string, t *testing.T) (*testin
13911391
}
13921392

13931393
func TestAccFederatedAllGradleLikePackageTypes(t *testing.T) {
1394-
for _, packageType := range repository.GradleLikePackageTypes {
1394+
for _, packageType := range repository.PackageTypesLikeGradle {
13951395
t.Run(packageType, func(t *testing.T) {
13961396
resource.Test(makeFederatedGradleLikeRepoTestCase(packageType, t))
13971397
})

pkg/artifactory/resource/repository/local/resource_artifactory_local_repository_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1285,7 +1285,7 @@ func makeLocalGradleLikeRepoTestCase(repoType string, t *testing.T) (*testing.T,
12851285
}
12861286

12871287
func TestAccAllGradleLikeLocalRepoTypes(t *testing.T) {
1288-
for _, packageType := range repository.GradleLikePackageTypes {
1288+
for _, packageType := range repository.PackageTypesLikeGradle {
12891289
t.Run(packageType, func(t *testing.T) {
12901290
resource.Test(makeLocalGradleLikeRepoTestCase(packageType, t))
12911291
})

pkg/artifactory/resource/repository/remote/curation.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package remote
22

3-
import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
3+
import (
4+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
5+
)
46

57
type RepositoryCurationParams struct {
68
Curated bool `json:"curated"`
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package remote_test
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
8+
"github.com/jfrog/terraform-provider-artifactory/v12/pkg/acctest"
9+
"github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository"
10+
"github.com/jfrog/terraform-provider-shared/testutil"
11+
"github.com/jfrog/terraform-provider-shared/util"
12+
"github.com/jfrog/terraform-provider-shared/validator"
13+
)
14+
15+
var curationPackageTypes = []string{
16+
repository.ConanPackageType,
17+
repository.DockerPackageType,
18+
repository.GemsPackageType,
19+
repository.GoPackageType,
20+
repository.GradlePackageType,
21+
repository.HuggingFacePackageType,
22+
repository.MavenPackageType,
23+
repository.NPMPackageType,
24+
repository.NugetPackageType,
25+
repository.PyPiPackageType,
26+
}
27+
28+
func TestAccRemoteRepository_with_curated(t *testing.T) {
29+
for _, packageType := range curationPackageTypes {
30+
t.Run(packageType, func(t *testing.T) {
31+
rs := fmt.Sprintf("artifactory_remote_%s_repository", packageType)
32+
_, fqrn, resourceName := testutil.MkNames("test-remote-curated-repo", rs)
33+
34+
const temp = `
35+
resource "artifactory_remote_{{ .package_type }}_repository" "{{ .name }}" {
36+
key = "{{ .name }}"
37+
description = "This is a test"
38+
url = "https://tempurl.org/"
39+
repo_layout_ref = "simple-default"
40+
curated = true
41+
}
42+
`
43+
44+
testData := map[string]string{
45+
"name": resourceName,
46+
"package_type": packageType,
47+
}
48+
49+
config := util.ExecuteTemplate("TestAccRemoteRepository_with_curated", temp, testData)
50+
51+
resource.Test(t, resource.TestCase{
52+
PreCheck: func() { acctest.PreCheck(t) },
53+
ProviderFactories: acctest.ProviderFactories,
54+
CheckDestroy: acctest.VerifyDeleted(fqrn, "", acctest.CheckRepo),
55+
Steps: []resource.TestStep{
56+
{
57+
Config: config,
58+
Check: resource.ComposeTestCheckFunc(
59+
resource.TestCheckResourceAttr(fqrn, "key", resourceName),
60+
resource.TestCheckResourceAttr(fqrn, "package_type", packageType),
61+
resource.TestCheckResourceAttr(fqrn, "curated", "true"),
62+
),
63+
},
64+
{
65+
ResourceName: fqrn,
66+
ImportState: true,
67+
ImportStateVerify: true,
68+
ImportStateCheck: validator.CheckImportState(resourceName, "key"),
69+
},
70+
},
71+
})
72+
})
73+
}
74+
}

pkg/artifactory/resource/repository/remote/remote.go

-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ var PackageTypesLikeBasic = []string{
9999
repository.CondaPackageType,
100100
repository.CranPackageType,
101101
repository.DebianPackageType,
102-
repository.GemsPackageType,
103102
repository.GitLFSPackageType,
104103
repository.OpkgPackageType,
105104
repository.P2PackageType,

pkg/artifactory/resource/repository/remote/resource_artifactory_remote_conan_repository.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ import (
1010

1111
type ConanRepo struct {
1212
RepositoryRemoteBaseParams
13+
RepositoryCurationParams
1314
repository.ConanBaseParams
1415
}
1516

1617
var conanSchema = lo.Assign(
1718
baseSchema,
19+
CurationRemoteRepoSchema,
1820
repository.ConanBaseSchema,
1921
repository.RepoLayoutRefSchema(Rclass, repository.ConanPackageType),
2022
)
@@ -26,6 +28,9 @@ func ResourceArtifactoryRemoteConanRepository() *schema.Resource {
2628
d := &utilsdk.ResourceData{ResourceData: s}
2729
repo := ConanRepo{
2830
RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.ConanPackageType),
31+
RepositoryCurationParams: RepositoryCurationParams{
32+
Curated: d.GetBool("curated", false),
33+
},
2934
ConanBaseParams: repository.ConanBaseParams{
3035
EnableConanSupport: true,
3136
ForceConanAuthentication: d.GetBool("force_conan_authentication", false),
@@ -46,9 +51,6 @@ func ResourceArtifactoryRemoteConanRepository() *schema.Resource {
4651
PackageType: repository.ConanPackageType,
4752
RepoLayoutRef: repoLayout.(string),
4853
},
49-
ConanBaseParams: repository.ConanBaseParams{
50-
EnableConanSupport: true,
51-
},
5254
}, nil
5355
}
5456

0 commit comments

Comments
 (0)