From 2590134005f9d50a32d0d48552a45171a7a06ceb Mon Sep 17 00:00:00 2001 From: Alex Hung Date: Thu, 19 Sep 2024 15:38:15 -0700 Subject: [PATCH 1/3] Refactor all repository resources Clean up duplicate code Refactor tests to manage project resource in configuration vs using code/api calls Fix repository doc with unescaped asterisks Replace hardcoded package types with constants --- docs/resources/local.md | 7 +- docs/resources/remote.md | 9 +- docs/resources/virtual.md | 7 +- ...artifactory_federated_alpine_repository.go | 14 +- ...rtifactory_federated_ansible_repository.go | 14 +- ..._artifactory_federated_cargo_repository.go | 14 +- ..._artifactory_federated_conan_repository.go | 10 +- ...artifactory_federated_debian_repository.go | 14 +- ...artifactory_federated_docker_repository.go | 26 +- ...rtifactory_federated_generic_repository.go | 10 +- ...rtifactory_federated_helmoci_repository.go | 12 +- ...e_artifactory_federated_java_repository.go | 8 +- ..._artifactory_federated_nuget_repository.go | 14 +- ...ce_artifactory_federated_oci_repository.go | 14 +- ...ce_artifactory_federated_rpm_repository.go | 14 +- ...ifactory_federated_terraform_repository.go | 10 +- .../repository/federated/federated.go | 2 - ...rce_artifactory_local_alpine_repository.go | 15 +- ...ce_artifactory_local_ansible_repository.go | 15 +- ...urce_artifactory_local_cargo_repository.go | 9 +- ...urce_artifactory_local_conan_repository.go | 6 +- ...rce_artifactory_local_debian_repository.go | 9 +- ...rce_artifactory_local_docker_repository.go | 21 +- ...ce_artifactory_local_generic_repository.go | 14 +- ...ce_artifactory_local_helmoci_repository.go | 9 +- ...ource_artifactory_local_java_repository.go | 14 +- ...urce_artifactory_local_nuget_repository.go | 9 +- ...source_artifactory_local_oci_repository.go | 9 +- ...source_artifactory_local_rpm_repository.go | 9 +- ..._artifactory_local_terraform_repository.go | 9 +- ...e_artifactory_remote_ansible_repository.go | 8 +- ...rce_artifactory_remote_basic_repository.go | 11 +- ...rce_artifactory_remote_bower_repository.go | 8 +- ...rce_artifactory_remote_cargo_repository.go | 10 +- ...artifactory_remote_cocoapods_repository.go | 8 +- ..._artifactory_remote_composer_repository.go | 8 +- ...rce_artifactory_remote_conan_repository.go | 6 +- ...ce_artifactory_remote_docker_repository.go | 8 +- ...e_artifactory_remote_generic_repository.go | 8 +- ...source_artifactory_remote_go_repository.go | 8 +- ...urce_artifactory_remote_helm_repository.go | 8 +- ...e_artifactory_remote_helmoci_repository.go | 8 +- ...urce_artifactory_remote_java_repository.go | 6 +- ...rce_artifactory_remote_maven_repository.go | 10 +- ...ource_artifactory_remote_npm_repository.go | 8 +- ...rce_artifactory_remote_nuget_repository.go | 8 +- ...ource_artifactory_remote_oci_repository.go | 8 +- ...urce_artifactory_remote_pypi_repository.go | 8 +- ...artifactory_remote_terraform_repository.go | 8 +- ...ource_artifactory_remote_vcs_repository.go | 8 +- .../datasource/repository/remote/remote.go | 14 +- .../datasource/repository/repository.go | 36 +- ...e_artifactory_virtual_alpine_repository.go | 10 +- ...ce_artifactory_virtual_bower_repository.go | 10 +- ...ce_artifactory_virtual_conan_repository.go | 6 +- ...e_artifactory_virtual_debian_repository.go | 10 +- ...e_artifactory_virtual_docker_repository.go | 10 +- ..._artifactory_virtual_generic_repository.go | 24 +- ...ource_artifactory_virtual_go_repository.go | 10 +- ...rce_artifactory_virtual_helm_repository.go | 10 +- ..._artifactory_virtual_helmoci_repository.go | 8 +- ...rce_artifactory_virtual_java_repository.go | 19 +- ...urce_artifactory_virtual_npm_repository.go | 10 +- ...ce_artifactory_virtual_nuget_repository.go | 10 +- ...urce_artifactory_virtual_oci_repository.go | 8 +- ...rce_artifactory_virtual_repository_test.go | 20 +- ...urce_artifactory_virtual_rpm_repository.go | 10 +- .../datasource/repository/virtual/virtual.go | 3 - pkg/artifactory/resource/repository/conan.go | 2 - .../repository/default_repo_layout_map.go | 110 +-- .../repository/federated/federated.go | 50 +- ...artifactory_federated_alpine_repository.go | 12 +- ...rtifactory_federated_ansible_repository.go | 15 +- ..._artifactory_federated_cargo_repository.go | 16 +- ..._artifactory_federated_conan_repository.go | 11 +- ...artifactory_federated_debian_repository.go | 12 +- ...artifactory_federated_docker_repository.go | 32 +- ...rtifactory_federated_generic_repository.go | 12 +- ...rtifactory_federated_helmoci_repository.go | 18 +- ...e_artifactory_federated_java_repository.go | 16 +- ..._artifactory_federated_nuget_repository.go | 16 +- ...ce_artifactory_federated_oci_repository.go | 18 +- ...ce_artifactory_federated_rpm_repository.go | 16 +- ...ifactory_federated_terraform_repository.go | 12 +- .../resource/repository/local/local.go | 149 +++-- ...rce_artifactory_local_alpine_repository.go | 27 +- ...ce_artifactory_local_ansible_repository.go | 27 +- ...urce_artifactory_local_cargo_repository.go | 27 +- ...urce_artifactory_local_conan_repository.go | 16 +- ...rce_artifactory_local_debian_repository.go | 27 +- ...rce_artifactory_local_docker_repository.go | 56 +- ...ce_artifactory_local_generic_repository.go | 28 +- ...ce_artifactory_local_helmoci_repository.go | 28 +- ...ource_artifactory_local_java_repository.go | 36 +- ...urce_artifactory_local_nuget_repository.go | 27 +- ...source_artifactory_local_oci_repository.go | 29 +- ...ource_artifactory_local_repository_test.go | 12 +- ...source_artifactory_local_rpm_repository.go | 27 +- ..._artifactory_local_terraform_repository.go | 32 +- .../resource/repository/remote/remote.go | 626 +++++++++--------- ...e_artifactory_remote_ansible_repository.go | 47 +- ...rce_artifactory_remote_bower_repository.go | 50 +- ...rce_artifactory_remote_cargo_repository.go | 73 +- ...artifactory_remote_cocoapods_repository.go | 33 +- ..._artifactory_remote_composer_repository.go | 50 +- ...rce_artifactory_remote_conan_repository.go | 25 +- ...ce_artifactory_remote_docker_repository.go | 110 +-- ...e_artifactory_remote_generic_repository.go | 67 +- ...source_artifactory_remote_go_repository.go | 48 +- ...urce_artifactory_remote_helm_repository.go | 96 +-- ...e_artifactory_remote_helmoci_repository.go | 100 +-- ...factory_remote_huggingfaceml_repository.go | 47 +- ...urce_artifactory_remote_java_repository.go | 12 +- ...rce_artifactory_remote_maven_repository.go | 80 ++- ...ource_artifactory_remote_npm_repository.go | 32 +- ...rce_artifactory_remote_nuget_repository.go | 98 +-- ...ource_artifactory_remote_oci_repository.go | 100 +-- ...urce_artifactory_remote_pypi_repository.go | 62 +- ...artifactory_remote_terraform_repository.go | 64 +- ...ource_artifactory_remote_vcs_repository.go | 52 +- .../resource/repository/repository.go | 100 ++- .../resource/repository/repository_test.go | 116 +++- ...e_artifactory_virtual_alpine_repository.go | 21 +- ...ce_artifactory_virtual_bower_repository.go | 19 +- ...ce_artifactory_virtual_conan_repository.go | 10 +- ...e_artifactory_virtual_debian_repository.go | 21 +- ...e_artifactory_virtual_docker_repository.go | 30 +- ..._artifactory_virtual_generic_repository.go | 39 +- ...ource_artifactory_virtual_go_repository.go | 18 +- ...rce_artifactory_virtual_helm_repository.go | 19 +- ..._artifactory_virtual_helmoci_repository.go | 39 +- ...rce_artifactory_virtual_java_repository.go | 24 +- ...urce_artifactory_virtual_npm_repository.go | 27 +- ...ce_artifactory_virtual_nuget_repository.go | 32 +- ...urce_artifactory_virtual_oci_repository.go | 18 +- ...urce_artifactory_virtual_rpm_repository.go | 18 +- .../resource/repository/virtual/virtual.go | 89 ++- 137 files changed, 2273 insertions(+), 1893 deletions(-) delete mode 100644 pkg/artifactory/datasource/repository/virtual/virtual.go diff --git a/docs/resources/local.md b/docs/resources/local.md index 286e2f217..6cef62430 100644 --- a/docs/resources/local.md +++ b/docs/resources/local.md @@ -28,9 +28,9 @@ The following arguments are supported: Before Artifactory 7.53.1, up to 2 values (`DEV` and `PROD`) are allowed. From 7.53.1 onward, only one value is allowed. The attribute should only be used if the repository is already assigned to the existing project. If not, the attribute will be ignored by Artifactory, but will remain in the Terraform state, which will create state drift during the update. * `includes_pattern` - (Optional) List of artifact patterns to include when evaluating artifact requests in the form -of x/y/**/z/\*. When used, only artifacts matching one of the include patterns are served. By default, all artifacts are included (\*\*/*). +of `x/y/**/z/\*`. When used, only artifacts matching one of the include patterns are served. By default, all artifacts are included (`**/*`). * `excludes_pattern` - (Optional) List of artifact patterns to exclude when evaluating artifact requests, in the form -of x/y/**/z/*. By default no artifacts are excluded. +of `x/y/**/z/*`. By default no artifacts are excluded. * `repo_layout_ref` - (Optional) Sets the layout that the repository should use for storing and identifying modules. A recommended layout that corresponds to the package type defined is suggested, and index packages uploaded and calculate metadata accordingly. * `blacked_out` - (Optional, Default: `false`) When set, the repository does not participate in artifact resolution and @@ -47,3 +47,6 @@ uploading content that may compromise security (e.g., cross-site scripting attac the artifact directly from the cloud storage provider. Available in Enterprise+ and Edge licenses only. * `cdn_redirect` - (Optional) When set, download requests to this repository will redirect the client to download the artifact directly from AWS CloudFront. Available in Enterprise+ and Edge licenses only. +* `allow_delete` - (Optional) When unset or set to `true`, provider will delete the repository even if it contains artifacts. Must be set to `false` for the provider to return error when destroying the resource. + +~>To maintain backward compatibility with provider version 12.0.0 and earlier, the state value for `allow_delete` is automatically set to `true` for existing resources. diff --git a/docs/resources/remote.md b/docs/resources/remote.md index da942298f..569e61f51 100644 --- a/docs/resources/remote.md +++ b/docs/resources/remote.md @@ -45,8 +45,8 @@ All generic repo arguments are supported, in addition to: * `password` - (Optional) * `proxy` - (Optional) Proxy key from Artifactory Proxies settings. Default is empty field. Can't be set if `disable_proxy = true`. * `disable_proxy` - (Optional, Default: `false`) When set to `true`, the proxy is disabled, and not returned in the API response body. If there is a default proxy set for the Artifactory instance, it will be ignored, too. Introduced since Artifactory 7.41.7. -* `includes_pattern` - (Optional, Default: `**/*`) List of comma-separated artifact patterns to include when evaluating artifact requests in the form of x/y/**/z/*. When used, only artifacts matching one of the include patterns are served. By default, all artifacts are included. -* `excludes_pattern` - (Optional) List of comma-separated artifact patterns to exclude when evaluating artifact requests, in the form of x/y/**/z/*. By default, no artifacts are excluded. +* `includes_pattern` - (Optional, Default: `**/*`) List of comma-separated artifact patterns to include when evaluating artifact requests in the form of `x/y/**/z/*`. When used, only artifacts matching one of the include patterns are served. By default, all artifacts are included. +* `excludes_pattern` - (Optional) List of comma-separated artifact patterns to exclude when evaluating artifact requests, in the form of `x/y/**/z/*`. By default, no artifacts are excluded. * `repo_layout_ref` - (Optional) Sets the layout that the repository should use for storing and identifying modules. A recommended layout that corresponds to the package type defined is suggested, and index packages uploaded and calculate metadata accordingly. * `remote_repo_layout_ref` - (Optional) Repository layout key for the remote layout mapping. Repository can be created without this attribute (or set to an empty string). Once it's set, it can't be removed by passing an empty string or removing the attribute. UI shows an error message, if the user tries to remove the value, the provider mimics this behavior and errors out. * `hard_fail` - (Optional, Default: `false`) When set, Artifactory will return an error to the client that causes the build to fail if there is a failure to communicate with this repository. @@ -83,4 +83,7 @@ the artifact directly from the cloud storage provider. Available in Enterprise+ * `cdn_redirect` - (Optional) When set, download requests to this repository will redirect the client to download the artifact directly from AWS CloudFront. Available in Enterprise+ and Edge licenses only. * `disable_url_normalization` - (Optional) Whether to disable URL normalization, default is `false`. -* `archive_browsing_enabled` - (Optional) When set, you may view content such as HTML or Javadoc files directly from Artifactory. This may not be safe and therefore requires strict content moderation to prevent malicious users from uploading content that may compromise security (e.g., cross-site scripting attacks). \ No newline at end of file +* `archive_browsing_enabled` - (Optional) When set, you may view content such as HTML or Javadoc files directly from Artifactory. This may not be safe and therefore requires strict content moderation to prevent malicious users from uploading content that may compromise security (e.g., cross-site scripting attacks). +* `allow_delete` - (Optional) When unset or set to `true`, provider will delete the repository even if it contains artifacts. Must be set to `false` for the provider to return error when destroying the resource. + +~>To maintain backward compatibility with provider version 12.0.0 and earlier, the state value for `allow_delete` is automatically set to `true` for existing resources. \ No newline at end of file diff --git a/docs/resources/virtual.md b/docs/resources/virtual.md index 82b070852..1e67dd3de 100644 --- a/docs/resources/virtual.md +++ b/docs/resources/virtual.md @@ -33,11 +33,14 @@ The following arguments are supported: The attribute should only be used if the repository is already assigned to the existing project. If not, the attribute will be ignored by Artifactory, but will remain in the Terraform state, which will create state drift during the update. * `description` - (Optional) * `notes` - (Optional) -* `includes_pattern` - (Optional) List of artifact patterns to include when evaluating artifact requests in the form of x/y/\*\*/z/\*. When used, only artifacts matching one of the include patterns are served. By default, all artifacts are included (**/\*). -* `excludes_pattern` - (Optional) List of artifact patterns to exclude when evaluating artifact requests, in the form of x/y/*\*/z/\*. By default no artifacts are excluded. +* `includes_pattern` - (Optional) List of artifact patterns to include when evaluating artifact requests in the form of `x/y/**/z/\*`. When used, only artifacts matching one of the include patterns are served. By default, all artifacts are included (`**/*`). +* `excludes_pattern` - (Optional) List of artifact patterns to exclude when evaluating artifact requests, in the form of `x/y/**/z/*`. By default no artifacts are excluded. * `repo_layout_ref` - (Optional) Repository layout key for the virtual repository. * `artifactory_requests_can_retrieve_remote_artifacts` - (Optional, Default: `false`) Whether the virtual repository should search through remote repositories when trying to resolve an artifact requested by another Artifactory instance. * `default_deployment_repo` - (Optional) Default repository to deploy artifacts. +* `allow_delete` - (Optional) When unset or set to `true`, provider will delete the repository even if it contains artifacts. Must be set to `false` for the provider to return error when destroying the resource. + +~>To maintain backward compatibility with provider version 12.0.0 and earlier, the state value for `allow_delete` is automatically set to `true` for existing resources. ## Import diff --git a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_alpine_repository.go b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_alpine_repository.go index 97f3bdd79..3f4644805 100644 --- a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_alpine_repository.go +++ b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_alpine_repository.go @@ -8,16 +8,14 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) func DataSourceArtifactoryFederatedAlpineRepository() *schema.Resource { - packageType := "alpine" - - alpineFederatedSchema := utilsdk.MergeMaps( - local.AlpineLocalSchema, + alpineFederatedSchema := lo.Assign( + local.AlpineLocalSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - resource_repository.RepoLayoutRefSchema(rclass, packageType), + resource_repository.RepoLayoutRefSchema(federated.Rclass, resource_repository.AlpinePackageType), ) var packAlpineMembers = func(repo interface{}, d *schema.ResourceData) error { @@ -39,8 +37,8 @@ func DataSourceArtifactoryFederatedAlpineRepository() *schema.Resource { return &federated.AlpineRepositoryParams{ AlpineLocalRepoParams: local.AlpineLocalRepoParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: resource_repository.AlpinePackageType, + Rclass: federated.Rclass, }, }, }, nil diff --git a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_ansible_repository.go b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_ansible_repository.go index 2cac4aca3..e333effd1 100644 --- a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_ansible_repository.go +++ b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_ansible_repository.go @@ -8,16 +8,14 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) func DataSourceArtifactoryFederatedAnsibleRepository() *schema.Resource { - packageType := "ansible" - - ansibleFederatedSchema := utilsdk.MergeMaps( - local.AnsibleLocalSchema, + ansibleFederatedSchema := lo.Assign( + local.AnsibleSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - resource_repository.RepoLayoutRefSchema(rclass, packageType), + resource_repository.RepoLayoutRefSchema(federated.Rclass, resource_repository.AnsiblePackageType), ) var packMembers = func(repo interface{}, d *schema.ResourceData) error { @@ -38,8 +36,8 @@ func DataSourceArtifactoryFederatedAnsibleRepository() *schema.Resource { constructor := func() (interface{}, error) { return &federated.AnsibleRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: resource_repository.AnsiblePackageType, + Rclass: federated.Rclass, }, }, nil } diff --git a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_cargo_repository.go b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_cargo_repository.go index 85a3b4547..1071c2342 100644 --- a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_cargo_repository.go +++ b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_cargo_repository.go @@ -8,16 +8,14 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) func DataSourceArtifactoryFederatedCargoRepository() *schema.Resource { - packageType := "cargo" - - cargoFederatedSchema := utilsdk.MergeMaps( - local.CargoLocalSchema, + cargoFederatedSchema := lo.Assign( + local.CargoSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - resource_repository.RepoLayoutRefSchema(rclass, packageType), + resource_repository.RepoLayoutRefSchema(federated.Rclass, resource_repository.CargoPackageType), ) var packCargoMembers = func(repo interface{}, d *schema.ResourceData) error { @@ -39,8 +37,8 @@ func DataSourceArtifactoryFederatedCargoRepository() *schema.Resource { return &federated.CargoFederatedRepositoryParams{ CargoLocalRepoParams: local.CargoLocalRepoParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: resource_repository.CargoPackageType, + Rclass: federated.Rclass, }, }, }, nil diff --git a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_conan_repository.go b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_conan_repository.go index 01339656f..53e4345b1 100644 --- a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_conan_repository.go +++ b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_conan_repository.go @@ -8,14 +8,14 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) func DataSourceArtifactoryFederatedConanRepository() *schema.Resource { - conanSchema := utilsdk.MergeMaps( - local.ConanSchema, + conanSchema := lo.Assign( + local.ConanSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - resource_repository.RepoLayoutRefSchema(rclass, resource_repository.ConanPackageType), + resource_repository.RepoLayoutRefSchema(federated.Rclass, resource_repository.ConanPackageType), ) var packConanMembers = func(repo interface{}, d *schema.ResourceData) error { @@ -38,7 +38,7 @@ func DataSourceArtifactoryFederatedConanRepository() *schema.Resource { ConanRepoParams: local.ConanRepoParams{ RepositoryBaseParams: local.RepositoryBaseParams{ PackageType: resource_repository.ConanPackageType, - Rclass: rclass, + Rclass: federated.Rclass, }, }, }, nil diff --git a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_debian_repository.go b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_debian_repository.go index 9341df874..e20699d3a 100644 --- a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_debian_repository.go +++ b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_debian_repository.go @@ -8,16 +8,14 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) func DataSourceArtifactoryFederatedDebianRepository() *schema.Resource { - packageType := "debian" - - debianFederatedSchema := utilsdk.MergeMaps( - local.DebianLocalSchema, + debianFederatedSchema := lo.Assign( + local.DebianSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - resource_repository.RepoLayoutRefSchema(rclass, packageType), + resource_repository.RepoLayoutRefSchema(federated.Rclass, resource_repository.DebianPackageType), ) var packDebianMembers = func(repo interface{}, d *schema.ResourceData) error { @@ -39,8 +37,8 @@ func DataSourceArtifactoryFederatedDebianRepository() *schema.Resource { return &federated.DebianFederatedRepositoryParams{ DebianLocalRepositoryParams: local.DebianLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: resource_repository.DebianPackageType, + Rclass: federated.Rclass, }, }, }, nil diff --git a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_docker_repository.go b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_docker_repository.go index 09e7a4ef3..c0ad1e4f1 100644 --- a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_docker_repository.go +++ b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_docker_repository.go @@ -8,16 +8,14 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) func DataSourceArtifactoryFederatedDockerV2Repository() *schema.Resource { - packageType := "docker" - - dockerV2FederatedSchema := utilsdk.MergeMaps( - local.DockerV2LocalSchema, + dockerV2FederatedSchema := lo.Assign( + local.DockerV2Schemas[local.CurrentSchemaVersion], federatedSchemaV4, - resource_repository.RepoLayoutRefSchema(rclass, packageType), + resource_repository.RepoLayoutRefSchema(federated.Rclass, resource_repository.DockerPackageType), ) var packDockerMembers = func(repo interface{}, d *schema.ResourceData) error { @@ -39,8 +37,8 @@ func DataSourceArtifactoryFederatedDockerV2Repository() *schema.Resource { return &federated.DockerFederatedRepositoryParams{ DockerLocalRepositoryParams: local.DockerLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: resource_repository.DockerPackageType, + Rclass: federated.Rclass, }, }, }, nil @@ -54,12 +52,10 @@ func DataSourceArtifactoryFederatedDockerV2Repository() *schema.Resource { } func DataSourceArtifactoryFederatedDockerV1Repository() *schema.Resource { - packageType := "docker" - - dockerFederatedSchema := utilsdk.MergeMaps( - local.DockerV1LocalSchema, + dockerFederatedSchema := lo.Assign( + local.DockerV1Schemas[local.CurrentSchemaVersion], federatedSchemaV4, - resource_repository.RepoLayoutRefSchema(rclass, packageType), + resource_repository.RepoLayoutRefSchema(federated.Rclass, resource_repository.DockerPackageType), ) var packDockerMembers = func(repo interface{}, d *schema.ResourceData) error { @@ -78,8 +74,8 @@ func DataSourceArtifactoryFederatedDockerV1Repository() *schema.Resource { return &federated.DockerFederatedRepositoryParams{ DockerLocalRepositoryParams: local.DockerLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: resource_repository.DockerPackageType, + Rclass: federated.Rclass, }, }, }, nil diff --git a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_generic_repository.go b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_generic_repository.go index 9fbb4462e..552775092 100644 --- a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_generic_repository.go +++ b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_generic_repository.go @@ -10,14 +10,14 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) func DataSourceArtifactoryFederatedGenericRepository(packageType string) *schema.Resource { - var genericSchema = utilsdk.MergeMaps( - local.GetGenericRepoSchema(packageType), + var genericSchema = lo.Assign( + local.GetGenericSchemas(packageType)[local.CurrentSchemaVersion], federatedSchemaV4, - resource_repository.RepoLayoutRefSchema(rclass, packageType), + resource_repository.RepoLayoutRefSchema(federated.Rclass, packageType), ) var packGenericMembers = func(repo interface{}, d *schema.ResourceData) error { @@ -39,7 +39,7 @@ func DataSourceArtifactoryFederatedGenericRepository(packageType string) *schema return &federated.GenericRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ PackageType: local.GetPackageType(packageType), - Rclass: rclass, + Rclass: federated.Rclass, }, }, nil } diff --git a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_helmoci_repository.go b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_helmoci_repository.go index ef126461c..95fffecd7 100644 --- a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_helmoci_repository.go +++ b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_helmoci_repository.go @@ -8,14 +8,14 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) func DataSourceArtifactoryFederatedHelmOciRepository() *schema.Resource { - ociFederatedSchema := utilsdk.MergeMaps( - local.HelmOciLocalSchema, + ociFederatedSchema := lo.Assign( + local.HelmOCISchemas[local.CurrentSchemaVersion], federatedSchemaV4, - resource_repository.RepoLayoutRefSchema(rclass, local.HelmOciPackageType), + resource_repository.RepoLayoutRefSchema(federated.Rclass, resource_repository.HelmOCIPackageType), ) var packOciMembers = func(repo interface{}, d *schema.ResourceData) error { @@ -37,8 +37,8 @@ func DataSourceArtifactoryFederatedHelmOciRepository() *schema.Resource { return &federated.HelmOciFederatedRepositoryParams{ HelmOciLocalRepositoryParams: local.HelmOciLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: local.HelmOciPackageType, - Rclass: rclass, + PackageType: resource_repository.HelmOCIPackageType, + Rclass: federated.Rclass, }, }, }, nil diff --git a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_java_repository.go b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_java_repository.go index 68de8e958..f15e995cf 100644 --- a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_java_repository.go +++ b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_java_repository.go @@ -10,13 +10,13 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) func DataSourceArtifactoryFederatedJavaRepository(packageType string, suppressPom bool) *schema.Resource { - javaFederatedSchema := utilsdk.MergeMaps( - local.GetJavaRepoSchema(packageType, suppressPom), + javaFederatedSchema := lo.Assign( + local.GetJavaSchemas(packageType, suppressPom)[local.CurrentSchemaVersion], federatedSchemaV4, resource_repository.RepoLayoutRefSchema("federated", packageType), ) @@ -41,7 +41,7 @@ func DataSourceArtifactoryFederatedJavaRepository(packageType string, suppressPo JavaLocalRepositoryParams: local.JavaLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ PackageType: packageType, - Rclass: rclass, + Rclass: federated.Rclass, }, SuppressPomConsistencyChecks: suppressPom, }, diff --git a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_nuget_repository.go b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_nuget_repository.go index aed4d69e3..d0a34802e 100644 --- a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_nuget_repository.go +++ b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_nuget_repository.go @@ -8,16 +8,14 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) func DataSourceArtifactoryFederatedNugetRepository() *schema.Resource { - packageType := "nuget" - - nugetFederatedSchema := utilsdk.MergeMaps( - local.NugetLocalSchema, + nugetFederatedSchema := lo.Assign( + local.NugetSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - resource_repository.RepoLayoutRefSchema(rclass, packageType), + resource_repository.RepoLayoutRefSchema(federated.Rclass, resource_repository.NugetPackageType), ) var packNugetMembers = func(repo interface{}, d *schema.ResourceData) error { @@ -39,8 +37,8 @@ func DataSourceArtifactoryFederatedNugetRepository() *schema.Resource { return &federated.NugetFederatedRepositoryParams{ NugetLocalRepositoryParams: local.NugetLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: resource_repository.NugetPackageType, + Rclass: federated.Rclass, }, }, }, nil diff --git a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_oci_repository.go b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_oci_repository.go index d1d070fd9..c8bcc5031 100644 --- a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_oci_repository.go +++ b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_oci_repository.go @@ -8,16 +8,14 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) func DataSourceArtifactoryFederatedOciRepository() *schema.Resource { - packageType := "oci" - - ociFederatedSchema := utilsdk.MergeMaps( - local.OciLocalSchema, + ociFederatedSchema := lo.Assign( + local.OCILocalSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - resource_repository.RepoLayoutRefSchema(rclass, packageType), + resource_repository.RepoLayoutRefSchema(federated.Rclass, resource_repository.OCIPackageType), ) var packOciMembers = func(repo interface{}, d *schema.ResourceData) error { @@ -39,8 +37,8 @@ func DataSourceArtifactoryFederatedOciRepository() *schema.Resource { return &federated.OciFederatedRepositoryParams{ OciLocalRepositoryParams: local.OciLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: resource_repository.OCIPackageType, + Rclass: federated.Rclass, }, }, }, nil diff --git a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_rpm_repository.go b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_rpm_repository.go index 006e026a9..bd208057a 100644 --- a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_rpm_repository.go +++ b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_rpm_repository.go @@ -8,16 +8,14 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) func DataSourceArtifactoryFederatedRpmRepository() *schema.Resource { - packageType := "rpm" - - rpmFederatedSchema := utilsdk.MergeMaps( - local.RpmLocalSchema, + rpmFederatedSchema := lo.Assign( + local.RPMSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - resource_repository.RepoLayoutRefSchema(rclass, packageType), + resource_repository.RepoLayoutRefSchema(federated.Rclass, resource_repository.RPMPackageType), ) var packRpmMembers = func(repo interface{}, d *schema.ResourceData) error { @@ -39,8 +37,8 @@ func DataSourceArtifactoryFederatedRpmRepository() *schema.Resource { return &federated.RpmFederatedRepositoryParams{ RpmLocalRepositoryParams: local.RpmLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: resource_repository.RPMPackageType, + Rclass: federated.Rclass, }, RootDepth: 0, CalculateYumMetadata: false, diff --git a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_terraform_repository.go b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_terraform_repository.go index bad9e5969..52e6b9e65 100644 --- a/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_terraform_repository.go +++ b/pkg/artifactory/datasource/repository/federated/datasource_artifactory_federated_terraform_repository.go @@ -10,16 +10,16 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) func DataSourceArtifactoryFederatedTerraformRepository(registryType string) *schema.Resource { packageType := "terraform_" + registryType - terraformFederatedSchema := utilsdk.MergeMaps( - local.GetTerraformLocalSchema(registryType), + terraformFederatedSchema := lo.Assign( + local.GetTerraformSchemas(registryType)[local.CurrentSchemaVersion], federatedSchemaV4, - resource_repository.RepoLayoutRefSchema(rclass, packageType), + resource_repository.RepoLayoutRefSchema(federated.Rclass, packageType), ) var packTerraformMembers = func(repo interface{}, d *schema.ResourceData) error { @@ -41,7 +41,7 @@ func DataSourceArtifactoryFederatedTerraformRepository(registryType string) *sch return &federated.TerraformFederatedRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ PackageType: packageType, - Rclass: rclass, + Rclass: federated.Rclass, }, }, nil } diff --git a/pkg/artifactory/datasource/repository/federated/federated.go b/pkg/artifactory/datasource/repository/federated/federated.go index 5b8f3bb64..915aedc9f 100644 --- a/pkg/artifactory/datasource/repository/federated/federated.go +++ b/pkg/artifactory/datasource/repository/federated/federated.go @@ -4,6 +4,4 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/federated" ) -const rclass = "federated" - var federatedSchemaV4 = federated.SchemaGeneratorV4(false) diff --git a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_alpine_repository.go b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_alpine_repository.go index d14217ab3..2398a160e 100644 --- a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_alpine_repository.go +++ b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_alpine_repository.go @@ -3,23 +3,24 @@ package local import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/datasource/repository" + resource_repository "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" ) -func DataSourceArtifactoryLocalAnsibleRepository() *schema.Resource { +func DataSourceArtifactoryLocalAlpineRepository() *schema.Resource { constructor := func() (interface{}, error) { - return &local.AnsibleLocalRepoParams{ + return &local.AlpineLocalRepoParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: "ansible", - Rclass: rclass, + PackageType: resource_repository.AlpinePackageType, + Rclass: local.Rclass, }, }, nil } return &schema.Resource{ - Schema: local.AnsibleLocalSchema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(local.AnsibleLocalSchema), constructor), - Description: "Data source for a local Ansible repository", + Schema: local.AlpineLocalSchemas[local.CurrentSchemaVersion], + ReadContext: repository.MkRepoReadDataSource(packer.Default(local.AlpineLocalSchemas[local.CurrentSchemaVersion]), constructor), + Description: "Data source for a local alpine repository", } } diff --git a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_ansible_repository.go b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_ansible_repository.go index 2783ec475..690a9ec6c 100644 --- a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_ansible_repository.go +++ b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_ansible_repository.go @@ -3,23 +3,24 @@ package local import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/datasource/repository" + resource_repository "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" ) -func DataSourceArtifactoryLocalAlpineRepository() *schema.Resource { +func DataSourceArtifactoryLocalAnsibleRepository() *schema.Resource { constructor := func() (interface{}, error) { - return &local.AlpineLocalRepoParams{ + return &local.AnsibleLocalRepoParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: "alpine", - Rclass: rclass, + PackageType: resource_repository.AnsiblePackageType, + Rclass: local.Rclass, }, }, nil } return &schema.Resource{ - Schema: local.AlpineLocalSchema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(local.AlpineLocalSchema), constructor), - Description: "Data source for a local alpine repository", + Schema: local.AnsibleSchemas[local.CurrentSchemaVersion], + ReadContext: repository.MkRepoReadDataSource(packer.Default(local.AnsibleSchemas[local.CurrentSchemaVersion]), constructor), + Description: "Data source for a local Ansible repository", } } diff --git a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_cargo_repository.go b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_cargo_repository.go index 9b766f819..9143f30bb 100644 --- a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_cargo_repository.go +++ b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_cargo_repository.go @@ -3,6 +3,7 @@ package local import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/datasource/repository" + resource_repository "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" ) @@ -11,15 +12,15 @@ func DataSourceArtifactoryLocalCargoRepository() *schema.Resource { constructor := func() (interface{}, error) { return &local.CargoLocalRepoParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: "cargo", - Rclass: rclass, + PackageType: resource_repository.CargoPackageType, + Rclass: local.Rclass, }, }, nil } return &schema.Resource{ - Schema: local.CargoLocalSchema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(local.CargoLocalSchema), constructor), + Schema: local.CargoSchemas[local.CurrentSchemaVersion], + ReadContext: repository.MkRepoReadDataSource(packer.Default(local.CargoSchemas[local.CurrentSchemaVersion]), constructor), Description: "Data source for local cargo repository", } } diff --git a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_conan_repository.go b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_conan_repository.go index bdcd2b967..7cf27cbc9 100644 --- a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_conan_repository.go +++ b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_conan_repository.go @@ -13,14 +13,14 @@ func DataSourceArtifactoryLocalConanRepository() *schema.Resource { return &local.ConanRepoParams{ RepositoryBaseParams: local.RepositoryBaseParams{ PackageType: resource_repository.ConanPackageType, - Rclass: rclass, + Rclass: local.Rclass, }, }, nil } return &schema.Resource{ - Schema: local.ConanSchema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(local.ConanSchema), constructor), + Schema: local.ConanSchemas[local.CurrentSchemaVersion], + ReadContext: repository.MkRepoReadDataSource(packer.Default(local.ConanSchemas[local.CurrentSchemaVersion]), constructor), Description: "Data source for local Conan repository", } } diff --git a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_debian_repository.go b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_debian_repository.go index e2d643e1c..ff4094cff 100644 --- a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_debian_repository.go +++ b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_debian_repository.go @@ -3,6 +3,7 @@ package local import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/datasource/repository" + resource_repository "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" ) @@ -11,15 +12,15 @@ func DataSourceArtifactoryLocalDebianRepository() *schema.Resource { constructor := func() (interface{}, error) { return &local.DebianLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: "debian", - Rclass: rclass, + PackageType: resource_repository.DebianPackageType, + Rclass: local.Rclass, }, }, nil } return &schema.Resource{ - Schema: local.DebianLocalSchema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(local.DebianLocalSchema), constructor), + Schema: local.DebianSchemas[local.CurrentSchemaVersion], + ReadContext: repository.MkRepoReadDataSource(packer.Default(local.DebianSchemas[local.CurrentSchemaVersion]), constructor), Description: "Data source for local debian repository", } } diff --git a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_docker_repository.go b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_docker_repository.go index 8256203a0..272ab6939 100644 --- a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_docker_repository.go +++ b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_docker_repository.go @@ -3,19 +3,19 @@ package local import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/datasource/repository" + resource_repository "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" ) func DataSourceArtifactoryLocalDockerV2Repository() *schema.Resource { - pkr := packer.Default(local.DockerV2LocalSchema) + pkr := packer.Default(local.DockerV2Schemas[local.CurrentSchemaVersion]) constructor := func() (interface{}, error) { return &local.DockerLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: local.DockerPackageType, - Rclass: rclass, + PackageType: resource_repository.DockerPackageType, + Rclass: local.Rclass, }, DockerApiVersion: "V2", TagRetention: 1, @@ -25,20 +25,17 @@ func DataSourceArtifactoryLocalDockerV2Repository() *schema.Resource { } return &schema.Resource{ - Schema: local.DockerV2LocalSchema, + Schema: local.DockerV2Schemas[local.CurrentSchemaVersion], ReadContext: repository.MkRepoReadDataSource(pkr, constructor), } } func DataSourceArtifactoryLocalDockerV1Repository() *schema.Resource { - // this is necessary because of the pointers - skeema := utilsdk.MergeMaps(local.DockerV1LocalSchema) - constructor := func() (interface{}, error) { return &local.DockerLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: local.DockerPackageType, - Rclass: rclass, + PackageType: resource_repository.DockerPackageType, + Rclass: local.Rclass, }, DockerApiVersion: "V1", TagRetention: 1, @@ -48,8 +45,8 @@ func DataSourceArtifactoryLocalDockerV1Repository() *schema.Resource { } return &schema.Resource{ - Schema: skeema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(local.DockerV1LocalSchema), constructor), + Schema: local.DockerV1Schemas[local.CurrentSchemaVersion], + ReadContext: repository.MkRepoReadDataSource(packer.Default(local.DockerV1Schemas[local.CurrentSchemaVersion]), constructor), Description: "Provides a data source for a local docker (v1) repository", } } diff --git a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_generic_repository.go b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_generic_repository.go index 720d0c8ee..d5f179e8f 100644 --- a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_generic_repository.go +++ b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_generic_repository.go @@ -7,19 +7,19 @@ import ( "github.com/jfrog/terraform-provider-shared/packer" ) -func DataSourceArtifactoryLocalGenericRepository(repoType string) *schema.Resource { +func DataSourceArtifactoryLocalGenericRepository(packageType string) *schema.Resource { constructor := func() (interface{}, error) { return &local.RepositoryBaseParams{ - PackageType: repoType, - Rclass: rclass, + PackageType: packageType, + Rclass: local.Rclass, }, nil } - genericRepoSchema := local.GetGenericRepoSchema(repoType) + genericRepoSchemas := local.GetGenericSchemas(packageType) return &schema.Resource{ - Schema: genericRepoSchema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(genericRepoSchema), constructor), - Description: "Provides a data source for a local " + repoType + " repository", + Schema: genericRepoSchemas[local.CurrentSchemaVersion], + ReadContext: repository.MkRepoReadDataSource(packer.Default(genericRepoSchemas[local.CurrentSchemaVersion]), constructor), + Description: "Provides a data source for a local " + packageType + " repository", } } diff --git a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_helmoci_repository.go b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_helmoci_repository.go index 38f5a0094..dec18fc8b 100644 --- a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_helmoci_repository.go +++ b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_helmoci_repository.go @@ -3,18 +3,19 @@ package local import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/datasource/repository" + resource_repository "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" ) func DataSourceArtifactoryLocalHelmOciRepository() *schema.Resource { - pkr := packer.Default(local.OciLocalSchema) + pkr := packer.Default(local.HelmOCISchemas[local.CurrentSchemaVersion]) constructor := func() (interface{}, error) { return &local.HelmOciLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: local.HelmOciPackageType, - Rclass: rclass, + PackageType: resource_repository.HelmOCIPackageType, + Rclass: local.Rclass, }, TagRetention: 1, MaxUniqueTags: 0, // no limit @@ -22,7 +23,7 @@ func DataSourceArtifactoryLocalHelmOciRepository() *schema.Resource { } return &schema.Resource{ - Schema: local.HelmOciLocalSchema, + Schema: local.HelmOCISchemas[local.CurrentSchemaVersion], ReadContext: repository.MkRepoReadDataSource(pkr, constructor), } } diff --git a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_java_repository.go b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_java_repository.go index ef17b4c27..bac6c0a6a 100644 --- a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_java_repository.go +++ b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_java_repository.go @@ -7,22 +7,22 @@ import ( "github.com/jfrog/terraform-provider-shared/packer" ) -func DataSourceArtifactoryLocalJavaRepository(repoType string, suppressPom bool) *schema.Resource { - javaLocalSchema := local.GetJavaRepoSchema(repoType, suppressPom) +func DataSourceArtifactoryLocalJavaRepository(packageType string, suppressPom bool) *schema.Resource { + javaLocalSchemas := local.GetJavaSchemas(packageType, suppressPom) constructor := func() (interface{}, error) { return &local.JavaLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: repoType, - Rclass: rclass, + PackageType: packageType, + Rclass: local.Rclass, }, SuppressPomConsistencyChecks: suppressPom, }, nil } return &schema.Resource{ - Schema: javaLocalSchema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(javaLocalSchema), constructor), - Description: "Data source for a local Java repository of type: " + repoType, + Schema: javaLocalSchemas[local.CurrentSchemaVersion], + ReadContext: repository.MkRepoReadDataSource(packer.Default(javaLocalSchemas[local.CurrentSchemaVersion]), constructor), + Description: "Data source for a local Java repository of type: " + packageType, } } diff --git a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_nuget_repository.go b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_nuget_repository.go index ba132d37d..af78606a0 100644 --- a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_nuget_repository.go +++ b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_nuget_repository.go @@ -3,6 +3,7 @@ package local import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/datasource/repository" + resource_repository "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" ) @@ -11,8 +12,8 @@ func DataSourceArtifactoryLocalNugetRepository() *schema.Resource { constructor := func() (interface{}, error) { return &local.NugetLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: "nuget", - Rclass: rclass, + PackageType: resource_repository.NugetPackageType, + Rclass: local.Rclass, }, MaxUniqueSnapshots: 0, ForceNugetAuthentication: false, @@ -20,8 +21,8 @@ func DataSourceArtifactoryLocalNugetRepository() *schema.Resource { } return &schema.Resource{ - Schema: local.NugetLocalSchema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(local.NugetLocalSchema), constructor), + Schema: local.NugetSchemas[local.CurrentSchemaVersion], + ReadContext: repository.MkRepoReadDataSource(packer.Default(local.NugetSchemas[local.CurrentSchemaVersion]), constructor), Description: "Data Source for a local nuget repository", } } diff --git a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_oci_repository.go b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_oci_repository.go index 9c0539945..8060d8b0c 100644 --- a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_oci_repository.go +++ b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_oci_repository.go @@ -3,18 +3,19 @@ package local import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/datasource/repository" + resource_repository "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" ) func DataSourceArtifactoryLocalOciRepository() *schema.Resource { - pkr := packer.Default(local.OciLocalSchema) + pkr := packer.Default(local.OCILocalSchemas[local.CurrentSchemaVersion]) constructor := func() (interface{}, error) { return &local.OciLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: local.OciPackageType, - Rclass: rclass, + PackageType: resource_repository.OCIPackageType, + Rclass: local.Rclass, }, DockerApiVersion: "V2", TagRetention: 1, @@ -23,7 +24,7 @@ func DataSourceArtifactoryLocalOciRepository() *schema.Resource { } return &schema.Resource{ - Schema: local.OciLocalSchema, + Schema: local.OCILocalSchemas[local.CurrentSchemaVersion], ReadContext: repository.MkRepoReadDataSource(pkr, constructor), } } diff --git a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_rpm_repository.go b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_rpm_repository.go index e8381d610..84e03c9d4 100644 --- a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_rpm_repository.go +++ b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_rpm_repository.go @@ -3,6 +3,7 @@ package local import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/datasource/repository" + resource_repository "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" ) @@ -11,8 +12,8 @@ func DataSourceArtifactoryLocalRpmRepository() *schema.Resource { constructor := func() (interface{}, error) { return &local.RpmLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: "rpm", - Rclass: rclass, + PackageType: resource_repository.RPMPackageType, + Rclass: local.Rclass, }, RootDepth: 0, CalculateYumMetadata: false, @@ -22,8 +23,8 @@ func DataSourceArtifactoryLocalRpmRepository() *schema.Resource { } return &schema.Resource{ - Schema: local.RpmLocalSchema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(local.RpmLocalSchema), constructor), + Schema: local.RPMSchemas[local.CurrentSchemaVersion], + ReadContext: repository.MkRepoReadDataSource(packer.Default(local.RPMSchemas[local.CurrentSchemaVersion]), constructor), Description: "Data source for a local rpm repository", } } diff --git a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_terraform_repository.go b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_terraform_repository.go index b968e254b..92c6a0f80 100644 --- a/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_terraform_repository.go +++ b/pkg/artifactory/datasource/repository/local/datasource_artifactory_local_terraform_repository.go @@ -10,19 +10,18 @@ import ( ) func DataSourceArtifactoryLocalTerraformRepository(registryType string) *schema.Resource { - - terraformLocalSchema := local.GetTerraformLocalSchema(registryType) + terraformLocalSchemas := local.GetTerraformSchemas(registryType) constructor := func() (interface{}, error) { return &local.RepositoryBaseParams{ PackageType: "terraform_" + registryType, - Rclass: rclass, + Rclass: local.Rclass, }, nil } return &schema.Resource{ - Schema: terraformLocalSchema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(terraformLocalSchema), constructor), + Schema: terraformLocalSchemas[local.CurrentSchemaVersion], + ReadContext: repository.MkRepoReadDataSource(packer.Default(terraformLocalSchemas[local.CurrentSchemaVersion]), constructor), Description: fmt.Sprintf("Data Source for a local terraform_%s repository", registryType), } } diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_ansible_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_ansible_repository.go index 432729c53..df62a6662 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_ansible_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_ansible_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteAnsibleRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.AnsiblePackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.AnsiblePackageType)() if err != nil { return nil, err } return &remote.AnsibleRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.AnsiblePackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.AnsiblePackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - ansibleSchema := remote.AnsibleSchema(false) + ansibleSchema := getSchema(remote.AnsibleSchemas) return &schema.Resource{ Schema: ansibleSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_basic_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_basic_repository.go index 720286e3d..2b1419d84 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_basic_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_basic_repository.go @@ -12,23 +12,24 @@ import ( func DataSourceArtifactoryRemoteBasicRepository(packageType string) *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, packageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, packageType)() if err != nil { return nil, err } return &remote.RepositoryRemoteBaseParams{ PackageType: packageType, - Rclass: rclass, + Rclass: remote.Rclass, RepoLayoutRef: repoLayout.(string), }, nil } - basicRepoSchema := remote.BasicRepoSchema(packageType, false) + basicSchemas := remote.GetSchemas(remote.BasicSchema(packageType)) + basicSchema := getSchema(basicSchemas) return &schema.Resource{ - Schema: basicRepoSchema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(basicRepoSchema), constructor), + Schema: basicSchema, + ReadContext: repository.MkRepoReadDataSource(packer.Default(basicSchema), constructor), Description: fmt.Sprintf("Provides a data source for a remote %s repository", packageType), } } diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_bower_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_bower_repository.go index cf0d2da28..8bd525685 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_bower_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_bower_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteBowerRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.BowerPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.BowerPackageType)() if err != nil { return nil, err } return &remote.BowerRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.BowerPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.BowerPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - bowerSchema := remote.BowerRemoteSchema(false) + bowerSchema := getSchema(remote.BowerSchemas) return &schema.Resource{ Schema: bowerSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_cargo_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_cargo_repository.go index bd3b1f8f8..3ab16323b 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_cargo_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_cargo_repository.go @@ -10,21 +10,23 @@ import ( func DataSourceArtifactoryRemoteCargoRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.CargoPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.CargoPackageType)() if err != nil { return nil, err } return &remote.CargoRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.CargoPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.CargoPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - cargoSchema := remote.CargoRemoteSchema(false) + cargoSchema := getSchema(remote.CargoSchemas) + cargoSchema["git_registry_url"].Required = false + cargoSchema["git_registry_url"].Optional = true return &schema.Resource{ Schema: cargoSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_cocoapods_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_cocoapods_repository.go index 238d6a761..855d268af 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_cocoapods_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_cocoapods_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteCoapodsRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.CocoapodsPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.CocoapodsPackageType)() if err != nil { return nil, err } return &remote.CocoapodsRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.CocoapodsPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.CocoapodsPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - cocoapodsSchema := remote.CocoapodsRemoteSchema(false) + cocoapodsSchema := getSchema(remote.CocoapodsSchemas) return &schema.Resource{ Schema: cocoapodsSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_composer_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_composer_repository.go index c0c64cae2..109fb60ed 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_composer_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_composer_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteComposerRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.ComposerPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.ComposerPackageType)() if err != nil { return nil, err } return &remote.ComposerRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.ComposerPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.ComposerPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - composerSchema := remote.ComposerRemoteSchema(false) + composerSchema := getSchema(remote.ComposerSchemas) return &schema.Resource{ Schema: composerSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_conan_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_conan_repository.go index 3d7f7f6d0..c0940d829 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_conan_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_conan_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteConanRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, resource_repository.ConanPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.ConanPackageType)() if err != nil { return nil, err } return &remote.ConanRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, + Rclass: remote.Rclass, PackageType: resource_repository.ConanPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - conanSchema := remote.ConanSchema(false) + conanSchema := getSchema(remote.ConanSchemas) return &schema.Resource{ Schema: conanSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_docker_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_docker_repository.go index 0e0aa3430..8a78649b3 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_docker_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_docker_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteDockerRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.DockerPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.DockerPackageType)() if err != nil { return nil, err } return &remote.DockerRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.DockerPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.DockerPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - dockerSchema := remote.DockerRemoteSchema(false) + dockerSchema := getSchema(remote.DockerSchemas) return &schema.Resource{ Schema: dockerSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_generic_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_generic_repository.go index 65c3dd127..ac956b6b1 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_generic_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_generic_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteGenericRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.GenericPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.GenericPackageType)() if err != nil { return nil, err } return &remote.GenericRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.GenericPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.GenericPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - genericSchema := remote.GenericRemoteSchema(false) + genericSchema := getSchema(remote.GenericSchemas) return &schema.Resource{ Schema: genericSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_go_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_go_repository.go index 68325cc34..448afc936 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_go_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_go_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteGoRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.GoPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.GoPackageType)() if err != nil { return nil, err } return &remote.GoRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.GoPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.GoPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - goSchema := remote.GoRemoteSchema(false) + goSchema := getSchema(remote.GoSchemas) return &schema.Resource{ Schema: goSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_helm_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_helm_repository.go index 1b1ebb6ab..02d9ea1d4 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_helm_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_helm_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteHelmRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.HelmPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.HelmPackageType)() if err != nil { return nil, err } return &remote.HelmRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.HelmPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.HelmPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - helmSchema := remote.HelmRemoteSchema(false) + helmSchema := getSchema(remote.HelmSchemas) return &schema.Resource{ Schema: helmSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_helmoci_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_helmoci_repository.go index 7735125f0..b91617786 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_helmoci_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_helmoci_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteHelmOciRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.HelmOciPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.HelmOCIPackageType)() if err != nil { return nil, err } return &remote.HelmOciRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.HelmOciPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.HelmOCIPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - ociSchema := remote.HelmOciRemoteSchema(false) + ociSchema := getSchema(remote.HelmOCISchemas) return &schema.Resource{ Schema: ociSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_java_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_java_repository.go index 4d006d0c1..9ac8bea83 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_java_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_java_repository.go @@ -10,14 +10,14 @@ import ( func DataSourceArtifactoryRemoteJavaRepository(packageType string, suppressPom bool) *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, packageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, packageType)() if err != nil { return nil, err } return &remote.JavaRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, + Rclass: remote.Rclass, PackageType: packageType, RepoLayoutRef: repoLayout.(string), }, @@ -25,7 +25,7 @@ func DataSourceArtifactoryRemoteJavaRepository(packageType string, suppressPom b }, nil } - javaSchema := remote.JavaRemoteSchema(false, packageType, suppressPom) + javaSchema := getSchema(remote.GetSchemas(remote.JavaSchema(packageType, suppressPom))) return &schema.Resource{ Schema: javaSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_maven_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_maven_repository.go index 1ad215e34..9bfcbaa66 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_maven_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_maven_repository.go @@ -10,7 +10,7 @@ import ( func DataSourceArtifactoryRemoteMavenRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.MavenPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.MavenPackageType)() if err != nil { return nil, err } @@ -18,8 +18,8 @@ func DataSourceArtifactoryRemoteMavenRepository() *schema.Resource { return &remote.MavenRemoteRepo{ JavaRemoteRepo: remote.JavaRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.MavenPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.MavenPackageType, RepoLayoutRef: repoLayout.(string), }, SuppressPomConsistencyChecks: false, @@ -27,7 +27,9 @@ func DataSourceArtifactoryRemoteMavenRepository() *schema.Resource { }, nil } - mavenSchema := remote.MavenRemoteSchema(false) + mavenSchema := remote.MavenSchemas[remote.MavenCurrentSchemaVersion] + mavenSchema["url"].Required = false + mavenSchema["url"].Optional = true return &schema.Resource{ Schema: mavenSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_npm_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_npm_repository.go index dd99a2fef..17c95dee4 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_npm_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_npm_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteNpmRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.GenericPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.NPMPackageType)() if err != nil { return nil, err } return &remote.NpmRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.NpmPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.NPMPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - npmSchema := remote.NpmRemoteSchema(false) + npmSchema := getSchema(remote.NPMSchemas) return &schema.Resource{ Schema: npmSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_nuget_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_nuget_repository.go index 627d6ff87..12cd73a26 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_nuget_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_nuget_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteNugetRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.NugetPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.NugetPackageType)() if err != nil { return nil, err } return &remote.NugetRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.NugetPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.NugetPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - nugetSchema := remote.NugetRemoteSchema(false) + nugetSchema := getSchema(remote.NugetSchemas) return &schema.Resource{ Schema: nugetSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_oci_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_oci_repository.go index 6a35dced2..9fd45fb45 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_oci_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_oci_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteOciRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.OciPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.OCIPackageType)() if err != nil { return nil, err } return &remote.OciRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.OciPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.OCIPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - ociSchema := remote.OciRemoteSchema(false) + ociSchema := getSchema(remote.OCISchemas) return &schema.Resource{ Schema: ociSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_pypi_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_pypi_repository.go index b355b35d8..a26489add 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_pypi_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_pypi_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemotePypiRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.NugetPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.PyPiPackageType)() if err != nil { return nil, err } return &remote.PypiRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.PypiPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.PyPiPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - pypiSchema := remote.PypiRemoteSchema(false) + pypiSchema := getSchema(remote.PyPiSchemas) return &schema.Resource{ Schema: pypiSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_terraform_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_terraform_repository.go index 905212e21..4bfb5b090 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_terraform_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_terraform_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteTerraformRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.TerraformPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.TerraformPackageType)() if err != nil { return nil, err } return &remote.TerraformRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.TerraformPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.TerraformPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - terraformSchema := remote.TerraformRemoteSchema(false) + terraformSchema := getSchema(remote.TerraformSchemas) return &schema.Resource{ Schema: terraformSchema, diff --git a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_vcs_repository.go b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_vcs_repository.go index aa30d162a..4d06ecebe 100644 --- a/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_vcs_repository.go +++ b/pkg/artifactory/datasource/repository/remote/datasource_artifactory_remote_vcs_repository.go @@ -10,21 +10,21 @@ import ( func DataSourceArtifactoryRemoteVcsRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, remote.VcsPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(remote.Rclass, resource_repository.VCSPackageType)() if err != nil { return nil, err } return &remote.VcsRemoteRepo{ RepositoryRemoteBaseParams: remote.RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: remote.VcsPackageType, + Rclass: remote.Rclass, + PackageType: resource_repository.VCSPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - vcsSchema := remote.VcsRemoteSchema(false) + vcsSchema := getSchema(remote.VCSSchemas) return &schema.Resource{ Schema: vcsSchema, diff --git a/pkg/artifactory/datasource/repository/remote/remote.go b/pkg/artifactory/datasource/repository/remote/remote.go index 9c67d49dd..b3506fc7b 100644 --- a/pkg/artifactory/datasource/repository/remote/remote.go +++ b/pkg/artifactory/datasource/repository/remote/remote.go @@ -1,3 +1,15 @@ package remote -const rclass = "remote" +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/remote" +) + +var getSchema = func(schemas map[int16]map[string]*schema.Schema) map[string]*schema.Schema { + s := schemas[remote.CurrentSchemaVersion] + + s["url"].Required = false + s["url"].Optional = true + + return s +} diff --git a/pkg/artifactory/datasource/repository/repository.go b/pkg/artifactory/datasource/repository/repository.go index 135a6369f..a21daca02 100644 --- a/pkg/artifactory/datasource/repository/repository.go +++ b/pkg/artifactory/datasource/repository/repository.go @@ -13,7 +13,41 @@ import ( ) var validRepositoryTypes = []string{"local", "remote", "virtual", "federated", "distribution"} -var validPackageTypes = []string{"alpine", "bower", "cargo", "chef", "cocoapods", "composer", "conan", "conda", "cran", "debian", "docker", "gems", "generic", "gitlfs", "go", "gradle", "helm", "huggingfaceml", "ivy", "maven", "npm", "nuget", "opkg", "p2", "pub", "puppet", "pypi", "rpm", "sbt", "swift", " terraform", "terraformbackend", "vagrant", "yum"} +var validPackageTypes = []string{ + repository.AlpinePackageType, + repository.BowerPackageType, + repository.CargoPackageType, + repository.ChefPackageType, + repository.CocoapodsPackageType, + repository.ComposerPackageType, + repository.ConanPackageType, + repository.CondaPackageType, + repository.CranPackageType, + repository.DebianPackageType, + repository.DockerPackageType, + repository.GemsPackageType, + repository.GenericPackageType, + repository.GitLFSPackageType, + repository.GoPackageType, + repository.GradlePackageType, + repository.HelmPackageType, + repository.HuggingFacePackageType, + repository.IvyPackageType, + repository.MavenPackageType, + repository.NPMPackageType, + repository.NugetPackageType, + repository.OpkgPackageType, + repository.P2PackageType, + repository.PubPackageType, + repository.PuppetPackageType, + repository.PyPiPackageType, + repository.RPMPackageType, + repository.SBTPackageType, + repository.SwiftPackageType, + repository.TerraformPackageType, + repository.TerraformBackendPackageType, + repository.VagrantPackageType, +} func MkRepoReadDataSource(pack packer.PackFunc, construct repository.Constructor) schema.ReadContextFunc { return func(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_alpine_repository.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_alpine_repository.go index 750886bab..c93257e51 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_alpine_repository.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_alpine_repository.go @@ -12,23 +12,23 @@ import ( func DatasourceArtifactoryVirtualAlpineRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, virtual.AlpinePackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, resource_repository.AlpinePackageType)() if err != nil { return nil, err } return &virtual.RepositoryBaseParams{ - PackageType: virtual.AlpinePackageType, - Rclass: rclass, + PackageType: resource_repository.AlpinePackageType, + Rclass: virtual.Rclass, RepoLayoutRef: repoLayout.(string), }, nil } - alpineSchema := virtual.AlpineVirtualSchema + alpineSchema := virtual.AlpineSchemas[virtual.CurrentSchemaVersion] return &schema.Resource{ Schema: alpineSchema, ReadContext: repository.MkRepoReadDataSource(packer.Default(alpineSchema), constructor), - Description: fmt.Sprintf("Provides a data source for a virtual %s repository", virtual.AlpinePackageType), + Description: fmt.Sprintf("Provides a data source for a virtual %s repository", resource_repository.AlpinePackageType), } } diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_bower_repository.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_bower_repository.go index f1d032b25..1a4928594 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_bower_repository.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_bower_repository.go @@ -12,23 +12,23 @@ import ( func DatasourceArtifactoryVirtualBowerRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, virtual.BowerPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, resource_repository.BowerPackageType)() if err != nil { return nil, err } return &virtual.RepositoryBaseParams{ - PackageType: virtual.BowerPackageType, - Rclass: rclass, + PackageType: resource_repository.BowerPackageType, + Rclass: virtual.Rclass, RepoLayoutRef: repoLayout.(string), }, nil } - bowerSchema := virtual.BowerVirtualSchema + bowerSchema := virtual.BowerSchemas[virtual.CurrentSchemaVersion] return &schema.Resource{ Schema: bowerSchema, ReadContext: repository.MkRepoReadDataSource(packer.Default(bowerSchema), constructor), - Description: fmt.Sprintf("Provides a data source for a virtual %s repository", virtual.BowerPackageType), + Description: fmt.Sprintf("Provides a data source for a virtual %s repository", resource_repository.BowerPackageType), } } diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_conan_repository.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_conan_repository.go index 97b13ab2e..302414826 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_conan_repository.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_conan_repository.go @@ -12,7 +12,7 @@ import ( func DatasourceArtifactoryVirtualConanRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, resource_repository.ConanPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, resource_repository.ConanPackageType)() if err != nil { return nil, err } @@ -20,7 +20,7 @@ func DatasourceArtifactoryVirtualConanRepository() *schema.Resource { return &virtual.ConanRepoParams{ RepositoryBaseParamsWithRetrievalCachePeriodSecs: virtual.RepositoryBaseParamsWithRetrievalCachePeriodSecs{ RepositoryBaseParams: virtual.RepositoryBaseParams{ - Rclass: rclass, + Rclass: virtual.Rclass, PackageType: resource_repository.ConanPackageType, RepoLayoutRef: repoLayout.(string), }, @@ -31,7 +31,7 @@ func DatasourceArtifactoryVirtualConanRepository() *schema.Resource { }, nil } - conanSchema := virtual.ConanSchema + conanSchema := virtual.ConanSchemas[virtual.CurrentSchemaVersion] return &schema.Resource{ Schema: conanSchema, diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_debian_repository.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_debian_repository.go index 9acc24fcc..7168da598 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_debian_repository.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_debian_repository.go @@ -12,23 +12,23 @@ import ( func DatasourceArtifactoryVirtualDebianRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, virtual.DebianPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, resource_repository.DebianPackageType)() if err != nil { return nil, err } return &virtual.RepositoryBaseParams{ - PackageType: virtual.DebianPackageType, - Rclass: rclass, + PackageType: resource_repository.DebianPackageType, + Rclass: virtual.Rclass, RepoLayoutRef: repoLayout.(string), }, nil } - debianSchema := virtual.DebianVirtualSchema + debianSchema := virtual.DebianSchemas[virtual.CurrentSchemaVersion] return &schema.Resource{ Schema: debianSchema, ReadContext: repository.MkRepoReadDataSource(packer.Default(debianSchema), constructor), - Description: fmt.Sprintf("Provides a data source for a virtual %s repository", virtual.DebianPackageType), + Description: fmt.Sprintf("Provides a data source for a virtual %s repository", resource_repository.DebianPackageType), } } diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_docker_repository.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_docker_repository.go index 73422fbe9..96f9f19c9 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_docker_repository.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_docker_repository.go @@ -12,23 +12,23 @@ import ( func DatasourceArtifactoryVirtualDockerRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, virtual.DockerPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, resource_repository.DockerPackageType)() if err != nil { return nil, err } return &virtual.RepositoryBaseParams{ - PackageType: virtual.DockerPackageType, - Rclass: rclass, + PackageType: resource_repository.DockerPackageType, + Rclass: virtual.Rclass, RepoLayoutRef: repoLayout.(string), }, nil } - dockerSchema := virtual.DockerVirtualSchema + dockerSchema := virtual.DockerSchemas[virtual.CurrentSchemaVersion] return &schema.Resource{ Schema: dockerSchema, ReadContext: repository.MkRepoReadDataSource(packer.Default(dockerSchema), constructor), - Description: fmt.Sprintf("Provides a data source for a virtual %s repository", virtual.DockerPackageType), + Description: fmt.Sprintf("Provides a data source for a virtual %s repository", resource_repository.DockerPackageType), } } diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_generic_repository.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_generic_repository.go index 1093c0426..ee8df99e7 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_generic_repository.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_generic_repository.go @@ -8,55 +8,51 @@ import ( resource_repository "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/virtual" "github.com/jfrog/terraform-provider-shared/packer" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" ) func DataSourceArtifactoryVirtualGenericRepository(packageType string) *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, packageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, packageType)() if err != nil { return nil, err } return &virtual.RepositoryBaseParams{ PackageType: packageType, - Rclass: rclass, + Rclass: virtual.Rclass, RepoLayoutRef: repoLayout.(string), }, nil } - genericSchema := virtual.BaseVirtualRepoSchema + genericSchemas := virtual.GetSchemas(resource_repository.RepoLayoutRefSchema(virtual.Rclass, packageType)) return &schema.Resource{ - Schema: genericSchema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(genericSchema), constructor), + Schema: genericSchemas[virtual.CurrentSchemaVersion], + ReadContext: repository.MkRepoReadDataSource(packer.Default(genericSchemas[virtual.CurrentSchemaVersion]), constructor), Description: fmt.Sprintf("Provides a data source for a virtual %s repository", packageType), } } func DataSourceArtifactoryVirtualRepositoryWithRetrievalCachePeriodSecs(packageType string) *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, packageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, packageType)() if err != nil { return nil, err } return &virtual.RepositoryBaseParamsWithRetrievalCachePeriodSecs{ RepositoryBaseParams: virtual.RepositoryBaseParams{ - Rclass: rclass, + Rclass: virtual.Rclass, PackageType: packageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - var repoWithRetrievalCachePeriodSecsVirtualSchema = utilsdk.MergeMaps( - virtual.BaseVirtualRepoSchema, - virtual.RetrievalCachePeriodSecondsSchema, - ) + repoWithRetrivalCachePeriodSecsVirtualSchemas := virtual.RepoWithRetrivalCachePeriodSecsVirtualSchemas(packageType) return &schema.Resource{ - Schema: repoWithRetrievalCachePeriodSecsVirtualSchema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(repoWithRetrievalCachePeriodSecsVirtualSchema), constructor), + Schema: repoWithRetrivalCachePeriodSecsVirtualSchemas[virtual.CurrentSchemaVersion], + ReadContext: repository.MkRepoReadDataSource(packer.Default(repoWithRetrivalCachePeriodSecsVirtualSchemas[virtual.CurrentSchemaVersion]), constructor), Description: fmt.Sprintf("Provides a data source for a virtual %s repository", packageType), } } diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_go_repository.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_go_repository.go index 148547be6..83d4f4c33 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_go_repository.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_go_repository.go @@ -12,23 +12,23 @@ import ( func DatasourceArtifactoryVirtualGoRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, virtual.GoPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, resource_repository.GoPackageType)() if err != nil { return nil, err } return &virtual.RepositoryBaseParams{ - PackageType: virtual.GoPackageType, - Rclass: rclass, + PackageType: resource_repository.GoPackageType, + Rclass: virtual.Rclass, RepoLayoutRef: repoLayout.(string), }, nil } - goSchema := virtual.GoVirtualSchema + goSchema := virtual.GoSchemas[virtual.CurrentSchemaVersion] return &schema.Resource{ Schema: goSchema, ReadContext: repository.MkRepoReadDataSource(packer.Default(goSchema), constructor), - Description: fmt.Sprintf("Provides a data source for a virtual %s repository", virtual.GoPackageType), + Description: fmt.Sprintf("Provides a data source for a virtual %s repository", resource_repository.GoPackageType), } } diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_helm_repository.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_helm_repository.go index cf34ee990..9c2e6eae6 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_helm_repository.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_helm_repository.go @@ -12,23 +12,23 @@ import ( func DatasourceArtifactoryVirtualHelmRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, virtual.HelmPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, resource_repository.HelmPackageType)() if err != nil { return nil, err } return &virtual.RepositoryBaseParams{ - PackageType: virtual.HelmPackageType, - Rclass: rclass, + PackageType: resource_repository.HelmPackageType, + Rclass: virtual.Rclass, RepoLayoutRef: repoLayout.(string), }, nil } - helmSchema := virtual.HelmVirtualSchema + helmSchema := virtual.HelmSchemas[virtual.CurrentSchemaVersion] return &schema.Resource{ Schema: helmSchema, ReadContext: repository.MkRepoReadDataSource(packer.Default(helmSchema), constructor), - Description: fmt.Sprintf("Provides a data source for a virtual %s repository", virtual.HelmPackageType), + Description: fmt.Sprintf("Provides a data source for a virtual %s repository", resource_repository.HelmPackageType), } } diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_helmoci_repository.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_helmoci_repository.go index ade77329c..928c46c33 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_helmoci_repository.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_helmoci_repository.go @@ -10,19 +10,19 @@ import ( func DatasourceArtifactoryVirtualHelmOciRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, virtual.HelmOciPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, resource_repository.HelmOCIPackageType)() if err != nil { return nil, err } return &virtual.RepositoryBaseParams{ - PackageType: virtual.HelmOciPackageType, - Rclass: rclass, + PackageType: resource_repository.HelmOCIPackageType, + Rclass: virtual.Rclass, RepoLayoutRef: repoLayout.(string), }, nil } - ociSchema := virtual.HelmOciVirtualSchema + ociSchema := virtual.HelmOCISchemas[virtual.CurrentSchemaVersion] return &schema.Resource{ Schema: ociSchema, diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_java_repository.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_java_repository.go index f041c698e..4412af14e 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_java_repository.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_java_repository.go @@ -8,31 +8,32 @@ import ( resource_repository "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/virtual" "github.com/jfrog/terraform-provider-shared/packer" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) func DataSourceArtifactoryVirtualJavaRepository(packageType string) *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, packageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, packageType)() if err != nil { return nil, err } return &virtual.RepositoryBaseParams{ PackageType: packageType, - Rclass: rclass, + Rclass: virtual.Rclass, RepoLayoutRef: repoLayout.(string), }, nil } - - var javaSchema = utilsdk.MergeMaps( - virtual.BaseVirtualRepoSchema, - virtual.JavaVirtualSchema, + var mavenSchema = lo.Assign( + virtual.JavaSchema, + resource_repository.RepoLayoutRefSchema(virtual.Rclass, packageType), ) + var mavenSchemas = virtual.GetSchemas(mavenSchema) + return &schema.Resource{ - Schema: javaSchema, - ReadContext: repository.MkRepoReadDataSource(packer.Default(javaSchema), constructor), + Schema: mavenSchemas[virtual.CurrentSchemaVersion], + ReadContext: repository.MkRepoReadDataSource(packer.Default(mavenSchemas[virtual.CurrentSchemaVersion]), constructor), Description: fmt.Sprintf("Provides a data source for a virtual %s repository", packageType), } } diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_npm_repository.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_npm_repository.go index 37c0de276..fcaa7c524 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_npm_repository.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_npm_repository.go @@ -12,23 +12,23 @@ import ( func DatasourceArtifactoryVirtualNpmRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, virtual.NpmPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, resource_repository.NPMPackageType)() if err != nil { return nil, err } return &virtual.RepositoryBaseParams{ - PackageType: virtual.NpmPackageType, - Rclass: rclass, + PackageType: resource_repository.NPMPackageType, + Rclass: virtual.Rclass, RepoLayoutRef: repoLayout.(string), }, nil } - npmSchema := virtual.NpmVirtualSchema + npmSchema := virtual.NPMSchemas[virtual.CurrentSchemaVersion] return &schema.Resource{ Schema: npmSchema, ReadContext: repository.MkRepoReadDataSource(packer.Default(npmSchema), constructor), - Description: fmt.Sprintf("Provides a data source for a virtual %s repository", virtual.NpmPackageType), + Description: fmt.Sprintf("Provides a data source for a virtual %s repository", resource_repository.NPMPackageType), } } diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_nuget_repository.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_nuget_repository.go index dc4d50c9f..bf4654ea3 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_nuget_repository.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_nuget_repository.go @@ -12,23 +12,23 @@ import ( func DatasourceArtifactoryVirtualNugetRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, virtual.NugetPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, resource_repository.NugetPackageType)() if err != nil { return nil, err } return &virtual.RepositoryBaseParams{ - PackageType: virtual.NugetPackageType, - Rclass: rclass, + PackageType: resource_repository.NugetPackageType, + Rclass: virtual.Rclass, RepoLayoutRef: repoLayout.(string), }, nil } - nugetSchema := virtual.NugetVirtualSchema + nugetSchema := virtual.NugetSchemas[virtual.CurrentSchemaVersion] return &schema.Resource{ Schema: nugetSchema, ReadContext: repository.MkRepoReadDataSource(packer.Default(nugetSchema), constructor), - Description: fmt.Sprintf("Provides a data source for a virtual %s repository", virtual.NugetPackageType), + Description: fmt.Sprintf("Provides a data source for a virtual %s repository", resource_repository.NugetPackageType), } } diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_oci_repository.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_oci_repository.go index 1f3b1bb48..67f415311 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_oci_repository.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_oci_repository.go @@ -10,19 +10,19 @@ import ( func DatasourceArtifactoryVirtualOciRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, virtual.OciPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, resource_repository.OCIPackageType)() if err != nil { return nil, err } return &virtual.RepositoryBaseParams{ - PackageType: virtual.OciPackageType, - Rclass: rclass, + PackageType: resource_repository.OCIPackageType, + Rclass: virtual.Rclass, RepoLayoutRef: repoLayout.(string), }, nil } - ociSchema := virtual.OciVirtualSchema + ociSchema := virtual.OCISchemas[virtual.CurrentSchemaVersion] return &schema.Resource{ Schema: ociSchema, diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_repository_test.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_repository_test.go index b18d58dde..31ea88700 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_repository_test.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_repository_test.go @@ -47,14 +47,14 @@ func TestAccDataSourceVirtualAllGradleLikePackageTypes(t *testing.T) { } func TestAccDataSourceVirtualAlpineRepository(t *testing.T) { - resource.Test(mkNewVirtualTestCase(virtual.AlpinePackageType, t, map[string]interface{}{ + resource.Test(mkNewVirtualTestCase(repository.AlpinePackageType, t, map[string]interface{}{ "description": "alpine virtual repository public description testing.", "retrieval_cache_period_seconds": 0, })) } func TestAccDataSourceVirtualBowerRepository(t *testing.T) { - resource.Test(mkNewVirtualTestCase(virtual.BowerPackageType, t, map[string]interface{}{ + resource.Test(mkNewVirtualTestCase(repository.BowerPackageType, t, map[string]interface{}{ "description": "bower virtual repository public description testing.", "external_dependencies_enabled": true, "external_dependencies_patterns": utilsdk.CastToInterfaceArr([]string{"**/github.com/**", "**/go.googlesource.com/**"}), @@ -70,7 +70,7 @@ func TestAccDataSourceVirtualConanRepository(t *testing.T) { } func TestAccDataSourceVirtualDebianRepository(t *testing.T) { - resource.Test(mkNewVirtualTestCase(virtual.DebianPackageType, t, map[string]interface{}{ + resource.Test(mkNewVirtualTestCase(repository.DebianPackageType, t, map[string]interface{}{ "description": "debian virtual repository public description testing.", "debian_default_architectures": "i386,amd64", "retrieval_cache_period_seconds": 650, @@ -79,14 +79,14 @@ func TestAccDataSourceVirtualDebianRepository(t *testing.T) { } func TestAccDataSourceVirtualDockerRepository(t *testing.T) { - resource.Test(mkNewVirtualTestCase(virtual.DockerPackageType, t, map[string]interface{}{ + resource.Test(mkNewVirtualTestCase(repository.DockerPackageType, t, map[string]interface{}{ "description": "docker virtual repository public description testing.", "resolve_docker_tags_by_timestamp": true, })) } func TestAccDataSourceVirtualGoRepository(t *testing.T) { - resource.Test(mkNewVirtualTestCase(virtual.GoPackageType, t, map[string]interface{}{ + resource.Test(mkNewVirtualTestCase(repository.GoPackageType, t, map[string]interface{}{ "description": "go virtual repository public description testing.", "external_dependencies_enabled": true, "external_dependencies_patterns": utilsdk.CastToInterfaceArr([]string{"**/github.com/**", "**/go.googlesource.com/**"}), @@ -94,7 +94,7 @@ func TestAccDataSourceVirtualGoRepository(t *testing.T) { } func TestAccDataSourceVirtualHelmRepository(t *testing.T) { - resource.Test(mkNewVirtualTestCase(virtual.HelmPackageType, t, map[string]interface{}{ + resource.Test(mkNewVirtualTestCase(repository.HelmPackageType, t, map[string]interface{}{ "description": "helm virtual repository public description testing.", "use_namespaces": true, "retrieval_cache_period_seconds": 650, @@ -102,7 +102,7 @@ func TestAccDataSourceVirtualHelmRepository(t *testing.T) { } func TestAccDataSourceVirtualHelmOciRepository(t *testing.T) { - resource.Test(mkNewVirtualTestCase(virtual.HelmOciPackageType, t, map[string]interface{}{ + resource.Test(mkNewVirtualTestCase(repository.HelmOCIPackageType, t, map[string]interface{}{ "description": "Helm OCI virtual repository public description testing.", "resolve_oci_tags_by_timestamp": true, })) @@ -116,7 +116,7 @@ func TestAccDataSourceVirtualMavenRepository(t *testing.T) { } func TestAccDataSourceVirtualNpmRepository(t *testing.T) { - resource.Test(mkNewVirtualTestCase(virtual.NpmPackageType, t, map[string]interface{}{ + resource.Test(mkNewVirtualTestCase(repository.NPMPackageType, t, map[string]interface{}{ "description": "npm virtual repository public description testing.", "external_dependencies_enabled": true, "retrieval_cache_period_seconds": 650, @@ -125,7 +125,7 @@ func TestAccDataSourceVirtualNpmRepository(t *testing.T) { } func TestAccDataSourceVirtualNugetRepository(t *testing.T) { - resource.Test(mkNewVirtualTestCase(virtual.NugetPackageType, t, map[string]interface{}{ + resource.Test(mkNewVirtualTestCase(repository.NugetPackageType, t, map[string]interface{}{ "description": "nuget virtual repository public description testing.", "force_nuget_authentication": true, "artifactory_requests_can_retrieve_remote_artifacts": true, @@ -133,7 +133,7 @@ func TestAccDataSourceVirtualNugetRepository(t *testing.T) { } func TestAccDataSourceVirtualOciRepository(t *testing.T) { - resource.Test(mkNewVirtualTestCase(virtual.OciPackageType, t, map[string]interface{}{ + resource.Test(mkNewVirtualTestCase(repository.OCIPackageType, t, map[string]interface{}{ "description": "OCI virtual repository public description testing.", "resolve_oci_tags_by_timestamp": true, })) diff --git a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_rpm_repository.go b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_rpm_repository.go index 6bddb9e9f..95d387cb0 100644 --- a/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_rpm_repository.go +++ b/pkg/artifactory/datasource/repository/virtual/datasource_artifactory_virtual_rpm_repository.go @@ -12,23 +12,23 @@ import ( func DatasourceArtifactoryVirtualRpmRepository() *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(rclass, virtual.RpmPackageType)() + repoLayout, err := resource_repository.GetDefaultRepoLayoutRef(virtual.Rclass, resource_repository.RPMPackageType)() if err != nil { return nil, err } return &virtual.RepositoryBaseParams{ - PackageType: virtual.RpmPackageType, - Rclass: rclass, + PackageType: resource_repository.RPMPackageType, + Rclass: virtual.Rclass, RepoLayoutRef: repoLayout.(string), }, nil } - rpmSchema := virtual.RpmVirtualSchema + rpmSchema := virtual.RPMSchemas[virtual.CurrentSchemaVersion] return &schema.Resource{ Schema: rpmSchema, ReadContext: repository.MkRepoReadDataSource(packer.Default(rpmSchema), constructor), - Description: fmt.Sprintf("Provides a data source for a virtual %s repository", virtual.RpmPackageType), + Description: fmt.Sprintf("Provides a data source for a virtual %s repository", resource_repository.RPMPackageType), } } diff --git a/pkg/artifactory/datasource/repository/virtual/virtual.go b/pkg/artifactory/datasource/repository/virtual/virtual.go deleted file mode 100644 index c181f356d..000000000 --- a/pkg/artifactory/datasource/repository/virtual/virtual.go +++ /dev/null @@ -1,3 +0,0 @@ -package virtual - -const rclass = "virtual" diff --git a/pkg/artifactory/resource/repository/conan.go b/pkg/artifactory/resource/repository/conan.go index b8895f8d0..6e0a36485 100644 --- a/pkg/artifactory/resource/repository/conan.go +++ b/pkg/artifactory/resource/repository/conan.go @@ -2,8 +2,6 @@ package repository import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" -const ConanPackageType = "conan" - type ConanBaseParams struct { EnableConanSupport bool `json:"enableConanSupport"` ForceConanAuthentication bool `json:"forceConanAuthentication"` diff --git a/pkg/artifactory/resource/repository/default_repo_layout_map.go b/pkg/artifactory/resource/repository/default_repo_layout_map.go index 61d66d743..bcd2e1997 100644 --- a/pkg/artifactory/resource/repository/default_repo_layout_map.go +++ b/pkg/artifactory/resource/repository/default_repo_layout_map.go @@ -2,7 +2,7 @@ package repository // Consolidated list of Default Repo Layout for all Package Types with active Repo Types var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ - "alpine": { + AlpinePackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -11,7 +11,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "ansible": { + AnsiblePackageType: { RepoLayoutRef: "ansible-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -20,7 +20,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "bower": { + BowerPackageType: { RepoLayoutRef: "bower-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -29,7 +29,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "cran": { + CranPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -38,7 +38,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "cargo": { + CargoPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -46,7 +46,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "chef": { + ChefPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -55,7 +55,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "cocoapods": { + CocoapodsPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -63,7 +63,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "composer": { + ComposerPackageType: { RepoLayoutRef: "composer-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -72,7 +72,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "conan": { + ConanPackageType: { RepoLayoutRef: "conan-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -81,7 +81,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "conda": { + CondaPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -90,7 +90,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "debian": { + DebianPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -99,7 +99,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "docker": { + DockerPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -108,7 +108,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "gems": { + GemsPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -117,7 +117,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "generic": { + GenericPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -126,7 +126,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "gitlfs": { + GitLFSPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -135,7 +135,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "go": { + GoPackageType: { RepoLayoutRef: "go-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -144,7 +144,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "gradle": { + GradlePackageType: { RepoLayoutRef: "maven-2-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -153,7 +153,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "helm": { + HelmPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -162,7 +162,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "helmoci": { + HelmOCIPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -171,7 +171,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "huggingfaceml": { + HuggingFacePackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -180,7 +180,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": false, }, }, - "ivy": { + IvyPackageType: { RepoLayoutRef: "ivy-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -189,7 +189,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "maven": { + MavenPackageType: { RepoLayoutRef: "maven-2-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -198,7 +198,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "npm": { + NPMPackageType: { RepoLayoutRef: "npm-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -207,7 +207,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "nuget": { + NugetPackageType: { RepoLayoutRef: "nuget-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -216,7 +216,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "oci": { + OCIPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -225,7 +225,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "opkg": { + OpkgPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -234,14 +234,14 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "p2": { + P2PackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "remote": true, "virtual": true, }, }, - "pub": { + PubPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -250,7 +250,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "puppet": { + PuppetPackageType: { RepoLayoutRef: "puppet-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -259,7 +259,7 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "pypi": { + PyPiPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -268,8 +268,8 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "sbt": { - RepoLayoutRef: "sbt-default", + RPMPackageType: { + RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, "remote": true, @@ -277,17 +277,17 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "terraform": { - RepoLayoutRef: "simple-default", + SwiftPackageType: { + RepoLayoutRef: "swift-default", SupportedRepoTypes: map[string]bool{ - "local": false, + "local": true, "remote": true, "virtual": true, "federated": true, }, }, - "terraform_module": { - RepoLayoutRef: "terraform-module-default", + SBTPackageType: { + RepoLayoutRef: "sbt-default", SupportedRepoTypes: map[string]bool{ "local": true, "remote": true, @@ -295,16 +295,16 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "terraform_provider": { - RepoLayoutRef: "terraform-provider-default", + TerraformPackageType: { + RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ - "local": true, + "local": false, "remote": true, "virtual": true, "federated": true, }, }, - "terraformbackend": { + TerraformBackendPackageType: { RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, @@ -313,21 +313,17 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": false, }, }, - "vagrant": { - RepoLayoutRef: "simple-default", + TerraformModulePackageType: { + RepoLayoutRef: "terraform-module-default", SupportedRepoTypes: map[string]bool{ "local": true, + "remote": true, + "virtual": true, "federated": true, }, }, - "vcs": { - RepoLayoutRef: "simple-default", - SupportedRepoTypes: map[string]bool{ - "remote": true, - }, - }, - "rpm": { - RepoLayoutRef: "simple-default", + TerraformProviderPackageType: { + RepoLayoutRef: "terraform-provider-default", SupportedRepoTypes: map[string]bool{ "local": true, "remote": true, @@ -335,13 +331,17 @@ var defaultRepoLayoutMap = map[string]SupportedRepoClasses{ "federated": true, }, }, - "swift": { - RepoLayoutRef: "swift-default", + VagrantPackageType: { + RepoLayoutRef: "simple-default", SupportedRepoTypes: map[string]bool{ "local": true, - "remote": true, - "virtual": true, "federated": true, }, }, + VCSPackageType: { + RepoLayoutRef: "simple-default", + SupportedRepoTypes: map[string]bool{ + "remote": true, + }, + }, } diff --git a/pkg/artifactory/resource/repository/federated/federated.go b/pkg/artifactory/resource/repository/federated/federated.go index e56029569..41cfe454b 100644 --- a/pkg/artifactory/resource/repository/federated/federated.go +++ b/pkg/artifactory/resource/repository/federated/federated.go @@ -20,27 +20,27 @@ import ( "github.com/samber/lo" ) -const rclass = "federated" +const Rclass = "federated" const RepositoriesEndpoint = "artifactory/api/repositories/{key}" var PackageTypesLikeGeneric = []string{ - "bower", - "chef", - "cocoapods", - "composer", - "conda", - "cran", - "gems", - "generic", - "gitlfs", - "go", - "helm", - "npm", - "opkg", - "puppet", - "pypi", - "swift", - "vagrant", + repository.BowerPackageType, + repository.ChefPackageType, + repository.CocoapodsPackageType, + repository.ComposerPackageType, + repository.CondaPackageType, + repository.CranPackageType, + repository.GemsPackageType, + repository.GenericPackageType, + repository.GitLFSPackageType, + repository.GoPackageType, + repository.HelmPackageType, + repository.NPMPackageType, + repository.OpkgPackageType, + repository.PuppetPackageType, + repository.PyPiPackageType, + repository.SwiftPackageType, + repository.VagrantPackageType, } type RepoParams struct { @@ -54,7 +54,7 @@ type Member struct { } var SchemaGeneratorV3 = func(isRequired bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( + return lo.Assign( repository.ProxySchema, map[string]*schema.Schema{ "cleanup_on_delete": { @@ -96,7 +96,7 @@ var SchemaGeneratorV3 = func(isRequired bool) map[string]*schema.Schema { var federatedSchemaV3 = SchemaGeneratorV3(true) var SchemaGeneratorV4 = func(isRequired bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( + return lo.Assign( federatedSchemaV3, map[string]*schema.Schema{ "cleanup_on_delete": { @@ -286,6 +286,14 @@ func deleteRepo(ctx context.Context, d *schema.ResourceData, m interface{}) diag restyClient := m.(util.ProviderMetadata).Client + allowDelete, ok := d.GetOkExists("allow_delete") + + if ok && !allowDelete.(bool) { // set to 'false' + return diag.Errorf("failed to destroy resource. 'allow_delete' is not set to 'true'") + } + + tflog.Warn(ctx, fmt.Sprintf("allow_delete is set to 'true'. Deleting repository %s", d.Id())) + // For federated repositories we delete all the federated members (except the initial repo member), if the flag `cleanup_on_delete` is set to `true` s := &utilsdk.ResourceData{ResourceData: d} initialRepoName := s.GetString("key", false) @@ -380,12 +388,14 @@ func mkResourceSchema(skeema map[string]*schema.Schema, packer packer.PackFunc, ReadContext: reader, UpdateContext: updateRepo(unpack, reader), DeleteContext: deleteRepo, + Importer: &schema.ResourceImporter{ StateContext: schema.ImportStatePassthroughContext, }, Schema: skeema, SchemaVersion: 4, + StateUpgraders: []schema.StateUpgrader{ { // this only works because the schema hasn't changed, except the removal of default value diff --git a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_alpine_repository.go b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_alpine_repository.go index 009a3a7fd..5121ed1dd 100644 --- a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_alpine_repository.go +++ b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_alpine_repository.go @@ -16,17 +16,15 @@ type AlpineRepositoryParams struct { } func ResourceArtifactoryFederatedAlpineRepository() *schema.Resource { - packageType := "alpine" - alpineFederatedSchema := utilsdk.MergeMaps( - local.AlpineLocalSchema, + local.AlpineLocalSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - repository.RepoLayoutRefSchema(rclass, packageType), + repository.RepoLayoutRefSchema(Rclass, repository.AlpinePackageType), ) var unpackFederatedAlpineRepository = func(data *schema.ResourceData) (interface{}, string, error) { repo := AlpineRepositoryParams{ - AlpineLocalRepoParams: local.UnpackLocalAlpineRepository(data, rclass), + AlpineLocalRepoParams: local.UnpackLocalAlpineRepository(data, Rclass), Members: unpackMembers(data), RepoParams: unpackRepoParams(data), } @@ -52,8 +50,8 @@ func ResourceArtifactoryFederatedAlpineRepository() *schema.Resource { return &AlpineRepositoryParams{ AlpineLocalRepoParams: local.AlpineLocalRepoParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: repository.AlpinePackageType, + Rclass: Rclass, }, }, }, nil diff --git a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_ansible_repository.go b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_ansible_repository.go index ae2f9952f..75a3725a0 100644 --- a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_ansible_repository.go +++ b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_ansible_repository.go @@ -7,6 +7,7 @@ import ( "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type AnsibleRepositoryParams struct { @@ -17,20 +18,18 @@ type AnsibleRepositoryParams struct { } func ResourceArtifactoryFederatedAnsibleRepository() *schema.Resource { - packageType := "ansible" - - var ansibleSchema = utilsdk.MergeMaps( - local.GetGenericRepoSchema(packageType), + var ansibleSchema = lo.Assign( + local.GetGenericSchemas(repository.AnsiblePackageType)[local.CurrentSchemaVersion], federatedSchemaV4, repository.AlpinePrimaryKeyPairRef, - repository.RepoLayoutRefSchema(rclass, packageType), + repository.RepoLayoutRefSchema(Rclass, repository.AnsiblePackageType), ) var unpackFederatedRepository = func(data *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: data} repo := AnsibleRepositoryParams{ - RepositoryBaseParams: local.UnpackBaseRepo(rclass, data, packageType), + RepositoryBaseParams: local.UnpackBaseRepo(Rclass, data, repository.AnsiblePackageType), RepoParams: unpackRepoParams(data), Members: unpackMembers(data), PrimaryKeyPairRefParam: repository.PrimaryKeyPairRefParam{ @@ -58,8 +57,8 @@ func ResourceArtifactoryFederatedAnsibleRepository() *schema.Resource { constructor := func() (interface{}, error) { return &AnsibleRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: local.GetPackageType(packageType), - Rclass: rclass, + PackageType: repository.AnsiblePackageType, + Rclass: Rclass, }, }, nil } diff --git a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_cargo_repository.go b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_cargo_repository.go index fd95215b7..39ede7c6c 100644 --- a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_cargo_repository.go +++ b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_cargo_repository.go @@ -6,7 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type CargoFederatedRepositoryParams struct { @@ -16,17 +16,15 @@ type CargoFederatedRepositoryParams struct { } func ResourceArtifactoryFederatedCargoRepository() *schema.Resource { - packageType := "cargo" - - cargoFederatedSchema := utilsdk.MergeMaps( - local.CargoLocalSchema, + cargoFederatedSchema := lo.Assign( + local.CargoSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - repository.RepoLayoutRefSchema(rclass, packageType), + repository.RepoLayoutRefSchema(Rclass, repository.CargoPackageType), ) var unpackFederatedCargoRepository = func(data *schema.ResourceData) (interface{}, string, error) { repo := CargoFederatedRepositoryParams{ - CargoLocalRepoParams: local.UnpackLocalCargoRepository(data, rclass), + CargoLocalRepoParams: local.UnpackLocalCargoRepository(data, Rclass), Members: unpackMembers(data), RepoParams: unpackRepoParams(data), } @@ -52,8 +50,8 @@ func ResourceArtifactoryFederatedCargoRepository() *schema.Resource { return &CargoFederatedRepositoryParams{ CargoLocalRepoParams: local.CargoLocalRepoParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: repository.CargoPackageType, + Rclass: Rclass, }, }, }, nil diff --git a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_conan_repository.go b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_conan_repository.go index 83d022799..9841e9ace 100644 --- a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_conan_repository.go +++ b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_conan_repository.go @@ -7,6 +7,7 @@ import ( "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type ConanRepositoryParams struct { @@ -16,17 +17,17 @@ type ConanRepositoryParams struct { } func ResourceArtifactoryFederatedConanRepository() *schema.Resource { - conanSchema := utilsdk.MergeMaps( - local.ConanSchema, + conanSchema := lo.Assign( + local.ConanSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - repository.RepoLayoutRefSchema(rclass, repository.ConanPackageType), + repository.RepoLayoutRefSchema(Rclass, repository.ConanPackageType), ) var unpackConanRepository = func(data *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: data} repo := ConanRepositoryParams{ ConanRepoParams: local.ConanRepoParams{ - RepositoryBaseParams: local.UnpackBaseRepo(rclass, data, repository.ConanPackageType), + RepositoryBaseParams: local.UnpackBaseRepo(Rclass, data, repository.ConanPackageType), ConanBaseParams: repository.ConanBaseParams{ EnableConanSupport: true, ForceConanAuthentication: d.GetBool("force_conan_authentication", false), @@ -59,7 +60,7 @@ func ResourceArtifactoryFederatedConanRepository() *schema.Resource { ConanRepoParams: local.ConanRepoParams{ RepositoryBaseParams: local.RepositoryBaseParams{ PackageType: repository.ConanPackageType, - Rclass: rclass, + Rclass: Rclass, }, ConanBaseParams: repository.ConanBaseParams{ EnableConanSupport: true, diff --git a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_debian_repository.go b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_debian_repository.go index 3abb489ed..328de3440 100644 --- a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_debian_repository.go +++ b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_debian_repository.go @@ -16,17 +16,15 @@ type DebianFederatedRepositoryParams struct { } func ResourceArtifactoryFederatedDebianRepository() *schema.Resource { - packageType := "debian" - debianFederatedSchema := utilsdk.MergeMaps( - local.DebianLocalSchema, + local.DebianSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - repository.RepoLayoutRefSchema(rclass, packageType), + repository.RepoLayoutRefSchema(Rclass, repository.DebianPackageType), ) var unpackFederatedDebianRepository = func(data *schema.ResourceData) (interface{}, string, error) { repo := DebianFederatedRepositoryParams{ - DebianLocalRepositoryParams: local.UnpackLocalDebianRepository(data, rclass), + DebianLocalRepositoryParams: local.UnpackLocalDebianRepository(data, Rclass), Members: unpackMembers(data), RepoParams: unpackRepoParams(data), } @@ -52,8 +50,8 @@ func ResourceArtifactoryFederatedDebianRepository() *schema.Resource { return &DebianFederatedRepositoryParams{ DebianLocalRepositoryParams: local.DebianLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: repository.DebianPackageType, + Rclass: Rclass, }, }, }, nil diff --git a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_docker_repository.go b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_docker_repository.go index 621cbbd4d..9351cef4b 100644 --- a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_docker_repository.go +++ b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_docker_repository.go @@ -6,7 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type DockerFederatedRepositoryParams struct { @@ -16,17 +16,15 @@ type DockerFederatedRepositoryParams struct { } func ResourceArtifactoryFederatedDockerV2Repository() *schema.Resource { - packageType := "docker" - - dockerV2FederatedSchema := utilsdk.MergeMaps( - local.DockerV2LocalSchema, + dockerV2FederatedSchema := lo.Assign( + local.DockerV2Schemas[local.CurrentSchemaVersion], federatedSchemaV4, - repository.RepoLayoutRefSchema(rclass, packageType), + repository.RepoLayoutRefSchema(Rclass, repository.DockerPackageType), ) var unpackFederatedDockerRepository = func(data *schema.ResourceData) (interface{}, string, error) { repo := DockerFederatedRepositoryParams{ - DockerLocalRepositoryParams: local.UnpackLocalDockerV2Repository(data, rclass), + DockerLocalRepositoryParams: local.UnpackLocalDockerV2Repository(data, Rclass), Members: unpackMembers(data), RepoParams: unpackRepoParams(data), } @@ -52,28 +50,26 @@ func ResourceArtifactoryFederatedDockerV2Repository() *schema.Resource { return &DockerFederatedRepositoryParams{ DockerLocalRepositoryParams: local.DockerLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: repository.DockerPackageType, + Rclass: Rclass, }, }, }, nil } - return repository.MkResourceSchema(dockerV2FederatedSchema, pkr, unpackFederatedDockerRepository, constructor) + return mkResourceSchema(dockerV2FederatedSchema, pkr, unpackFederatedDockerRepository, constructor) } func ResourceArtifactoryFederatedDockerV1Repository() *schema.Resource { - packageType := "docker" - - dockerFederatedSchema := utilsdk.MergeMaps( - local.DockerV1LocalSchema, + dockerFederatedSchema := lo.Assign( + local.DockerV1Schemas[local.CurrentSchemaVersion], federatedSchemaV4, - repository.RepoLayoutRefSchema(rclass, packageType), + repository.RepoLayoutRefSchema(Rclass, repository.DockerPackageType), ) var unpackFederatedDockerRepository = func(data *schema.ResourceData) (interface{}, string, error) { repo := DockerFederatedRepositoryParams{ - DockerLocalRepositoryParams: local.UnpackLocalDockerV1Repository(data, rclass), + DockerLocalRepositoryParams: local.UnpackLocalDockerV1Repository(data, Rclass), Members: unpackMembers(data), RepoParams: unpackRepoParams(data), } @@ -96,8 +92,8 @@ func ResourceArtifactoryFederatedDockerV1Repository() *schema.Resource { return &DockerFederatedRepositoryParams{ DockerLocalRepositoryParams: local.DockerLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: repository.DockerPackageType, + Rclass: Rclass, }, }, }, nil diff --git a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_generic_repository.go b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_generic_repository.go index 08130cd21..1873698a9 100644 --- a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_generic_repository.go +++ b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_generic_repository.go @@ -6,7 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type GenericRepositoryParams struct { @@ -16,15 +16,15 @@ type GenericRepositoryParams struct { } func ResourceArtifactoryFederatedGenericRepository(packageType string) *schema.Resource { - var genericSchema = utilsdk.MergeMaps( - local.GetGenericRepoSchema(packageType), + var genericSchema = lo.Assign( + local.GetGenericSchemas(packageType)[local.CurrentSchemaVersion], federatedSchemaV4, - repository.RepoLayoutRefSchema(rclass, packageType), + repository.RepoLayoutRefSchema(Rclass, packageType), ) var unpackFederatedRepository = func(data *schema.ResourceData) (interface{}, string, error) { repo := GenericRepositoryParams{ - RepositoryBaseParams: local.UnpackBaseRepo(rclass, data, packageType), + RepositoryBaseParams: local.UnpackBaseRepo(Rclass, data, packageType), Members: unpackMembers(data), RepoParams: unpackRepoParams(data), } @@ -50,7 +50,7 @@ func ResourceArtifactoryFederatedGenericRepository(packageType string) *schema.R return &GenericRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ PackageType: local.GetPackageType(packageType), - Rclass: rclass, + Rclass: Rclass, }, }, nil } diff --git a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_helmoci_repository.go b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_helmoci_repository.go index 9a0bcd08d..3a8008f72 100644 --- a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_helmoci_repository.go +++ b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_helmoci_repository.go @@ -6,7 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type HelmOciFederatedRepositoryParams struct { @@ -16,17 +16,15 @@ type HelmOciFederatedRepositoryParams struct { } func ResourceArtifactoryFederatedHelmOciRepository() *schema.Resource { - packageType := "helmoci" - - helmociSchema := utilsdk.MergeMaps( - local.HelmOciLocalSchema, + helmociSchema := lo.Assign( + local.HelmOCISchemas[local.CurrentSchemaVersion], federatedSchemaV4, - repository.RepoLayoutRefSchema(rclass, packageType), + repository.RepoLayoutRefSchema(Rclass, repository.HelmOCIPackageType), ) var unpackRepository = func(data *schema.ResourceData) (interface{}, string, error) { repo := HelmOciFederatedRepositoryParams{ - HelmOciLocalRepositoryParams: local.UnpackLocalHelmOciRepository(data, rclass), + HelmOciLocalRepositoryParams: local.UnpackLocalHelmOciRepository(data, Rclass), Members: unpackMembers(data), RepoParams: unpackRepoParams(data), } @@ -52,12 +50,12 @@ func ResourceArtifactoryFederatedHelmOciRepository() *schema.Resource { return &HelmOciFederatedRepositoryParams{ HelmOciLocalRepositoryParams: local.HelmOciLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: repository.HelmOCIPackageType, + Rclass: Rclass, }, }, }, nil } - return repository.MkResourceSchema(helmociSchema, pkr, unpackRepository, constructor) + return mkResourceSchema(helmociSchema, pkr, unpackRepository, constructor) } diff --git a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_java_repository.go b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_java_repository.go index f7c26ac91..3625ae418 100644 --- a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_java_repository.go +++ b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_java_repository.go @@ -6,7 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type JavaFederatedRepositoryParams struct { @@ -15,17 +15,17 @@ type JavaFederatedRepositoryParams struct { RepoParams } -func ResourceArtifactoryFederatedJavaRepository(repoType string, suppressPom bool) *schema.Resource { +func ResourceArtifactoryFederatedJavaRepository(packageType string, suppressPom bool) *schema.Resource { - javaFederatedSchema := utilsdk.MergeMaps( - local.GetJavaRepoSchema(repoType, suppressPom), + javaFederatedSchema := lo.Assign( + local.GetJavaSchemas(packageType, suppressPom)[local.CurrentSchemaVersion], federatedSchemaV4, - repository.RepoLayoutRefSchema("federated", repoType), + repository.RepoLayoutRefSchema("federated", packageType), ) var unpackFederatedJavaRepository = func(data *schema.ResourceData) (interface{}, string, error) { repo := JavaFederatedRepositoryParams{ - JavaLocalRepositoryParams: local.UnpackLocalJavaRepository(data, rclass, repoType), + JavaLocalRepositoryParams: local.UnpackLocalJavaRepository(data, Rclass, packageType), Members: unpackMembers(data), RepoParams: unpackRepoParams(data), } @@ -52,8 +52,8 @@ func ResourceArtifactoryFederatedJavaRepository(repoType string, suppressPom boo return &JavaFederatedRepositoryParams{ JavaLocalRepositoryParams: local.JavaLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: repoType, - Rclass: rclass, + PackageType: packageType, + Rclass: Rclass, }, SuppressPomConsistencyChecks: suppressPom, }, diff --git a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_nuget_repository.go b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_nuget_repository.go index c33265f7d..3703cdb08 100644 --- a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_nuget_repository.go +++ b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_nuget_repository.go @@ -6,7 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type NugetFederatedRepositoryParams struct { @@ -16,17 +16,15 @@ type NugetFederatedRepositoryParams struct { } func ResourceArtifactoryFederatedNugetRepository() *schema.Resource { - packageType := "nuget" - - nugetFederatedSchema := utilsdk.MergeMaps( - local.NugetLocalSchema, + nugetFederatedSchema := lo.Assign( + local.NugetSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - repository.RepoLayoutRefSchema(rclass, packageType), + repository.RepoLayoutRefSchema(Rclass, repository.NugetPackageType), ) var unpackFederatedNugetRepository = func(data *schema.ResourceData) (interface{}, string, error) { repo := NugetFederatedRepositoryParams{ - NugetLocalRepositoryParams: local.UnpackLocalNugetRepository(data, rclass), + NugetLocalRepositoryParams: local.UnpackLocalNugetRepository(data, Rclass), Members: unpackMembers(data), RepoParams: unpackRepoParams(data), } @@ -52,8 +50,8 @@ func ResourceArtifactoryFederatedNugetRepository() *schema.Resource { return &NugetFederatedRepositoryParams{ NugetLocalRepositoryParams: local.NugetLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: repository.NugetPackageType, + Rclass: Rclass, }, }, }, nil diff --git a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_oci_repository.go b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_oci_repository.go index 2f2593d4a..343af5291 100644 --- a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_oci_repository.go +++ b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_oci_repository.go @@ -6,7 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type OciFederatedRepositoryParams struct { @@ -16,17 +16,15 @@ type OciFederatedRepositoryParams struct { } func ResourceArtifactoryFederatedOciRepository() *schema.Resource { - packageType := "oci" - - ociFederatedSchema := utilsdk.MergeMaps( - local.OciLocalSchema, + ociFederatedSchema := lo.Assign( + local.OCILocalSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - repository.RepoLayoutRefSchema(rclass, packageType), + repository.RepoLayoutRefSchema(Rclass, repository.OCIPackageType), ) var unpackFederatedOciRepository = func(data *schema.ResourceData) (interface{}, string, error) { repo := OciFederatedRepositoryParams{ - OciLocalRepositoryParams: local.UnpackLocalOciRepository(data, rclass), + OciLocalRepositoryParams: local.UnpackLocalOciRepository(data, Rclass), Members: unpackMembers(data), RepoParams: unpackRepoParams(data), } @@ -52,12 +50,12 @@ func ResourceArtifactoryFederatedOciRepository() *schema.Resource { return &OciFederatedRepositoryParams{ OciLocalRepositoryParams: local.OciLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: repository.OCIPackageType, + Rclass: Rclass, }, }, }, nil } - return repository.MkResourceSchema(ociFederatedSchema, pkr, unpackFederatedOciRepository, constructor) + return mkResourceSchema(ociFederatedSchema, pkr, unpackFederatedOciRepository, constructor) } diff --git a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_rpm_repository.go b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_rpm_repository.go index 8ccda7008..3a13ff73f 100644 --- a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_rpm_repository.go +++ b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_rpm_repository.go @@ -6,7 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type RpmFederatedRepositoryParams struct { @@ -16,17 +16,15 @@ type RpmFederatedRepositoryParams struct { } func ResourceArtifactoryFederatedRpmRepository() *schema.Resource { - packageType := "rpm" - - rpmFederatedSchema := utilsdk.MergeMaps( - local.RpmLocalSchema, + rpmFederatedSchema := lo.Assign( + local.RPMSchemas[local.CurrentSchemaVersion], federatedSchemaV4, - repository.RepoLayoutRefSchema(rclass, packageType), + repository.RepoLayoutRefSchema(Rclass, repository.RPMPackageType), ) var unpackFederatedRpmRepository = func(data *schema.ResourceData) (interface{}, string, error) { repo := RpmFederatedRepositoryParams{ - RpmLocalRepositoryParams: local.UnpackLocalRpmRepository(data, rclass), + RpmLocalRepositoryParams: local.UnpackLocalRpmRepository(data, Rclass), Members: unpackMembers(data), RepoParams: unpackRepoParams(data), } @@ -52,8 +50,8 @@ func ResourceArtifactoryFederatedRpmRepository() *schema.Resource { return &RpmFederatedRepositoryParams{ RpmLocalRepositoryParams: local.RpmLocalRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ - PackageType: packageType, - Rclass: rclass, + PackageType: repository.RPMPackageType, + Rclass: Rclass, }, RootDepth: 0, CalculateYumMetadata: false, diff --git a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_terraform_repository.go b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_terraform_repository.go index 720ccf2a3..dd3505654 100644 --- a/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_terraform_repository.go +++ b/pkg/artifactory/resource/repository/federated/resource_artifactory_federated_terraform_repository.go @@ -6,7 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository/local" "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type TerraformFederatedRepositoryParams struct { @@ -18,15 +18,15 @@ type TerraformFederatedRepositoryParams struct { func ResourceArtifactoryFederatedTerraformRepository(registryType string) *schema.Resource { packageType := "terraform_" + registryType - terraformFederatedSchema := utilsdk.MergeMaps( - local.GetTerraformLocalSchema(registryType), + terraformFederatedSchema := lo.Assign( + local.GetTerraformSchemas(registryType)[local.CurrentSchemaVersion], federatedSchemaV4, - repository.RepoLayoutRefSchema(rclass, packageType), + repository.RepoLayoutRefSchema(Rclass, packageType), ) var unpackFederatedTerraformRepository = func(data *schema.ResourceData) (interface{}, string, error) { repo := TerraformFederatedRepositoryParams{ - RepositoryBaseParams: local.UnpackLocalTerraformRepository(data, rclass, registryType), + RepositoryBaseParams: local.UnpackLocalTerraformRepository(data, Rclass, registryType), Members: unpackMembers(data), RepoParams: unpackRepoParams(data), } @@ -52,7 +52,7 @@ func ResourceArtifactoryFederatedTerraformRepository(registryType string) *schem return &TerraformFederatedRepositoryParams{ RepositoryBaseParams: local.RepositoryBaseParams{ PackageType: packageType, - Rclass: rclass, + Rclass: Rclass, }, }, nil } diff --git a/pkg/artifactory/resource/repository/local/local.go b/pkg/artifactory/resource/repository/local/local.go index a85c09403..3b982c128 100644 --- a/pkg/artifactory/resource/repository/local/local.go +++ b/pkg/artifactory/resource/repository/local/local.go @@ -6,31 +6,35 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const rclass = "local" +const ( + Rclass = "local" + CurrentSchemaVersion = 1 +) var PackageTypesLikeGeneric = []string{ - "bower", - "chef", - "cocoapods", - "composer", - "conda", - "cran", - "gems", - "generic", - "gitlfs", - "go", - "helm", - "huggingfaceml", - "npm", - "opkg", - "pub", - "puppet", - "pypi", - "swift", - "terraformbackend", - "vagrant", + repository.BowerPackageType, + repository.ChefPackageType, + repository.CocoapodsPackageType, + repository.ComposerPackageType, + repository.CondaPackageType, + repository.CranPackageType, + repository.GemsPackageType, + repository.GenericPackageType, + repository.GitLFSPackageType, + repository.GoPackageType, + repository.HelmPackageType, + repository.HuggingFacePackageType, + repository.NPMPackageType, + repository.OpkgPackageType, + repository.PubPackageType, + repository.PuppetPackageType, + repository.PyPiPackageType, + repository.SwiftPackageType, + repository.TerraformBackendPackageType, + repository.VagrantPackageType, } type RepositoryBaseParams struct { @@ -58,53 +62,68 @@ func (bp RepositoryBaseParams) Id() string { return bp.Key } -var BaseLocalRepoSchema = utilsdk.MergeMaps( - repository.BaseRepoSchema, - map[string]*schema.Schema{ - "blacked_out": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "When set, the repository does not participate in artifact resolution and new artifacts cannot be deployed.", - }, - "xray_index": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "Enable Indexing In Xray. Repository will be indexed with the default retention period. You will be able to change it via Xray settings.", - }, - "priority_resolution": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "Setting repositories with priority will cause metadata to be merged only from repositories set with this field", - }, - "property_sets": { - Type: schema.TypeSet, - Elem: &schema.Schema{Type: schema.TypeString}, - Set: schema.HashString, - Optional: true, - Description: "List of property set name", - }, - "archive_browsing_enabled": { - Type: schema.TypeBool, - Optional: true, - Description: "When set, you may view content such as HTML or Javadoc files directly from Artifactory.\nThis may not be safe and therefore requires strict content moderation to prevent malicious users from uploading content that may compromise security (e.g., cross-site scripting attacks).", - }, - "download_direct": { - Type: schema.TypeBool, - Optional: true, - Description: "When set, download requests to this repository will redirect the client to download the artifact directly from the cloud storage provider. Available in Enterprise+ and Edge licenses only.", - }, - "cdn_redirect": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "When set, download requests to this repository will redirect the client to download the artifact directly from AWS CloudFront. Available in Enterprise+ and Edge licenses only. Default value is 'false'", - }, +var baseSchema = map[string]*schema.Schema{ + "blacked_out": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "When set, the repository does not participate in artifact resolution and new artifacts cannot be deployed.", + }, + "xray_index": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Enable Indexing In Xray. Repository will be indexed with the default retention period. You will be able to change it via Xray settings.", + }, + "priority_resolution": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Setting repositories with priority will cause metadata to be merged only from repositories set with this field", + }, + "property_sets": { + Type: schema.TypeSet, + Elem: &schema.Schema{Type: schema.TypeString}, + Set: schema.HashString, + Optional: true, + Description: "List of property set name", + }, + "archive_browsing_enabled": { + Type: schema.TypeBool, + Optional: true, + Description: "When set, you may view content such as HTML or Javadoc files directly from Artifactory.\nThis may not be safe and therefore requires strict content moderation to prevent malicious users from uploading content that may compromise security (e.g., cross-site scripting attacks).", + }, + "download_direct": { + Type: schema.TypeBool, + Optional: true, + Description: "When set, download requests to this repository will redirect the client to download the artifact directly from the cloud storage provider. Available in Enterprise+ and Edge licenses only.", }, + "cdn_redirect": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "When set, download requests to this repository will redirect the client to download the artifact directly from AWS CloudFront. Available in Enterprise+ and Edge licenses only. Default value is 'false'", + }, +} + +var BaseSchemaV1 = lo.Assign( + repository.BaseSchemaV1, + baseSchema, ) +var GetSchemas = func(s map[string]*schema.Schema) map[int16]map[string]*schema.Schema { + return map[int16]map[string]*schema.Schema{ + 0: lo.Assign( + BaseSchemaV1, + s, + ), + 1: lo.Assign( + BaseSchemaV1, + s, + ), + } +} + // GetPackageType `packageType` in the API call payload for Terraform repositories must be "terraform", but we use // `terraform_module` and `terraform_provider` as a package types in the Provider. GetPackageType function corrects this discrepancy. func GetPackageType(packageType string) string { diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_alpine_repository.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_alpine_repository.go index 0a18594f5..5013ffc8e 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_alpine_repository.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_alpine_repository.go @@ -5,26 +5,26 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const alpinePackageType = "alpine" - -var AlpineLocalSchema = utilsdk.MergeMaps( - BaseLocalRepoSchema, - repository.RepoLayoutRefSchema(rclass, alpinePackageType), +var alpineSchema = lo.Assign( + repository.RepoLayoutRefSchema(Rclass, repository.AlpinePackageType), repository.AlpinePrimaryKeyPairRef, repository.CompressionFormats, ) +var AlpineLocalSchemas = GetSchemas(alpineSchema) + type AlpineLocalRepoParams struct { RepositoryBaseParams repository.PrimaryKeyPairRefParam } -func UnpackLocalAlpineRepository(data *schema.ResourceData, rclass string) AlpineLocalRepoParams { +func UnpackLocalAlpineRepository(data *schema.ResourceData, Rclass string) AlpineLocalRepoParams { d := &utilsdk.ResourceData{ResourceData: data} return AlpineLocalRepoParams{ - RepositoryBaseParams: UnpackBaseRepo(rclass, data, alpinePackageType), + RepositoryBaseParams: UnpackBaseRepo(Rclass, data, repository.AlpinePackageType), PrimaryKeyPairRefParam: repository.PrimaryKeyPairRefParam{ PrimaryKeyPairRef: d.GetString("primary_keypair_ref", false), }, @@ -33,18 +33,23 @@ func UnpackLocalAlpineRepository(data *schema.ResourceData, rclass string) Alpin func ResourceArtifactoryLocalAlpineRepository() *schema.Resource { var unpackLocalAlpineRepo = func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackLocalAlpineRepository(data, rclass) + repo := UnpackLocalAlpineRepository(data, Rclass) return repo, repo.Id(), nil } constructor := func() (interface{}, error) { return &AlpineLocalRepoParams{ RepositoryBaseParams: RepositoryBaseParams{ - PackageType: alpinePackageType, - Rclass: rclass, + PackageType: repository.AlpinePackageType, + Rclass: Rclass, }, }, nil } - return repository.MkResourceSchema(AlpineLocalSchema, packer.Default(AlpineLocalSchema), unpackLocalAlpineRepo, constructor) + return repository.MkResourceSchema( + AlpineLocalSchemas, + packer.Default(AlpineLocalSchemas[CurrentSchemaVersion]), + unpackLocalAlpineRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_ansible_repository.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_ansible_repository.go index 49bb54044..166fe8320 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_ansible_repository.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_ansible_repository.go @@ -5,25 +5,25 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const ansiblePackageType = "ansible" - -var AnsibleLocalSchema = utilsdk.MergeMaps( - BaseLocalRepoSchema, - repository.RepoLayoutRefSchema(rclass, ansiblePackageType), +var ansibleSchema = lo.Assign( + repository.RepoLayoutRefSchema(Rclass, repository.AnsiblePackageType), repository.AlpinePrimaryKeyPairRef, ) +var AnsibleSchemas = GetSchemas(ansibleSchema) + type AnsibleLocalRepoParams struct { RepositoryBaseParams repository.PrimaryKeyPairRefParam } -func UnpackLocalAnsibleRepository(data *schema.ResourceData, rclass string) AnsibleLocalRepoParams { +func UnpackLocalAnsibleRepository(data *schema.ResourceData, Rclass string) AnsibleLocalRepoParams { d := &utilsdk.ResourceData{ResourceData: data} return AnsibleLocalRepoParams{ - RepositoryBaseParams: UnpackBaseRepo(rclass, data, ansiblePackageType), + RepositoryBaseParams: UnpackBaseRepo(Rclass, data, repository.AnsiblePackageType), PrimaryKeyPairRefParam: repository.PrimaryKeyPairRefParam{ PrimaryKeyPairRef: d.GetString("primary_keypair_ref", false), }, @@ -32,18 +32,23 @@ func UnpackLocalAnsibleRepository(data *schema.ResourceData, rclass string) Ansi func ResourceArtifactoryLocalAnsibleRepository() *schema.Resource { var unpackLocalAnsibleRepo = func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackLocalAnsibleRepository(data, rclass) + repo := UnpackLocalAnsibleRepository(data, Rclass) return repo, repo.Id(), nil } constructor := func() (interface{}, error) { return &AnsibleLocalRepoParams{ RepositoryBaseParams: RepositoryBaseParams{ - PackageType: alpinePackageType, - Rclass: rclass, + PackageType: repository.AnsiblePackageType, + Rclass: Rclass, }, }, nil } - return repository.MkResourceSchema(AnsibleLocalSchema, packer.Default(AnsibleLocalSchema), unpackLocalAnsibleRepo, constructor) + return repository.MkResourceSchema( + AnsibleSchemas, + packer.Default(AnsibleSchemas[CurrentSchemaVersion]), + unpackLocalAnsibleRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_cargo_repository.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_cargo_repository.go index 5521f188c..f2af8e8e7 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_cargo_repository.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_cargo_repository.go @@ -5,12 +5,11 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const cargoPackageType = "cargo" - -var CargoLocalSchema = utilsdk.MergeMaps( - BaseLocalRepoSchema, +var cargoSchema = lo.Assign( + repository.RepoLayoutRefSchema(Rclass, repository.CargoPackageType), map[string]*schema.Schema{ "anonymous_access": { Type: schema.TypeBool, @@ -25,20 +24,21 @@ var CargoLocalSchema = utilsdk.MergeMaps( Description: "Enable internal index support based on Cargo sparse index specifications, instead of the default git index. Default value is 'false'.", }, }, - repository.RepoLayoutRefSchema(rclass, cargoPackageType), repository.CompressionFormats, ) +var CargoSchemas = GetSchemas(cargoSchema) + type CargoLocalRepoParams struct { RepositoryBaseParams AnonymousAccess bool `json:"cargoAnonymousAccess"` EnableSparseIndex bool `json:"cargoInternalIndex"` } -func UnpackLocalCargoRepository(data *schema.ResourceData, rclass string) CargoLocalRepoParams { +func UnpackLocalCargoRepository(data *schema.ResourceData, Rclass string) CargoLocalRepoParams { d := &utilsdk.ResourceData{ResourceData: data} return CargoLocalRepoParams{ - RepositoryBaseParams: UnpackBaseRepo(rclass, data, cargoPackageType), + RepositoryBaseParams: UnpackBaseRepo(Rclass, data, repository.CargoPackageType), AnonymousAccess: d.GetBool("anonymous_access", false), EnableSparseIndex: d.GetBool("enable_sparse_index", false), } @@ -47,18 +47,23 @@ func UnpackLocalCargoRepository(data *schema.ResourceData, rclass string) CargoL func ResourceArtifactoryLocalCargoRepository() *schema.Resource { var unpackLocalCargoRepository = func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackLocalCargoRepository(data, rclass) + repo := UnpackLocalCargoRepository(data, Rclass) return repo, repo.Id(), nil } constructor := func() (interface{}, error) { return &CargoLocalRepoParams{ RepositoryBaseParams: RepositoryBaseParams{ - PackageType: cargoPackageType, - Rclass: rclass, + PackageType: repository.CargoPackageType, + Rclass: Rclass, }, }, nil } - return repository.MkResourceSchema(CargoLocalSchema, packer.Default(CargoLocalSchema), unpackLocalCargoRepository, constructor) + return repository.MkResourceSchema( + CargoSchemas, + packer.Default(CargoSchemas[CurrentSchemaVersion]), + unpackLocalCargoRepository, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_conan_repository.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_conan_repository.go index 85463dc29..08ab7eb0d 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_conan_repository.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_conan_repository.go @@ -5,14 +5,16 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -var ConanSchema = utilsdk.MergeMaps( - BaseLocalRepoSchema, +var conanSchema = lo.Assign( repository.ConanBaseSchema, - repository.RepoLayoutRefSchema(rclass, repository.ConanPackageType), + repository.RepoLayoutRefSchema(Rclass, repository.ConanPackageType), ) +var ConanSchemas = GetSchemas(conanSchema) + type ConanRepoParams struct { RepositoryBaseParams repository.ConanBaseParams @@ -21,7 +23,7 @@ type ConanRepoParams struct { func UnpackConnanRepository(data *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: data} repo := ConanRepoParams{ - RepositoryBaseParams: UnpackBaseRepo(rclass, data, repository.ConanPackageType), + RepositoryBaseParams: UnpackBaseRepo(Rclass, data, repository.ConanPackageType), ConanBaseParams: repository.ConanBaseParams{ EnableConanSupport: true, ForceConanAuthentication: d.GetBool("force_conan_authentication", false), @@ -36,7 +38,7 @@ func ResourceArtifactoryLocalConanRepository() *schema.Resource { return &ConanRepoParams{ RepositoryBaseParams: RepositoryBaseParams{ PackageType: repository.ConanPackageType, - Rclass: rclass, + Rclass: Rclass, }, ConanBaseParams: repository.ConanBaseParams{ EnableConanSupport: true, @@ -45,8 +47,8 @@ func ResourceArtifactoryLocalConanRepository() *schema.Resource { } return repository.MkResourceSchema( - ConanSchema, - packer.Default(ConanSchema), + ConanSchemas, + packer.Default(ConanSchemas[CurrentSchemaVersion]), UnpackConnanRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_debian_repository.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_debian_repository.go index d3c6736a7..9d83213b4 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_debian_repository.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_debian_repository.go @@ -5,12 +5,10 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const debianPackageType = "debian" - -var DebianLocalSchema = utilsdk.MergeMaps( - BaseLocalRepoSchema, +var debianSchema = lo.Assign( repository.PrimaryKeyPairRef, repository.SecondaryKeyPairRef, map[string]*schema.Schema{ @@ -22,10 +20,12 @@ var DebianLocalSchema = utilsdk.MergeMaps( Deprecated: "You shouldn't be using this", }, }, - repository.RepoLayoutRefSchema(rclass, debianPackageType), + repository.RepoLayoutRefSchema(Rclass, repository.DebianPackageType), repository.CompressionFormats, ) +var DebianSchemas = GetSchemas(debianSchema) + type DebianLocalRepositoryParams struct { RepositoryBaseParams repository.PrimaryKeyPairRefParam @@ -34,7 +34,7 @@ type DebianLocalRepositoryParams struct { IndexCompressionFormats []string `hcl:"index_compression_formats" json:"optionalIndexCompressionFormats,omitempty"` } -func UnpackLocalDebianRepository(data *schema.ResourceData, rclass string) DebianLocalRepositoryParams { +func UnpackLocalDebianRepository(data *schema.ResourceData, Rclass string) DebianLocalRepositoryParams { d := &utilsdk.ResourceData{ResourceData: data} return DebianLocalRepositoryParams{ PrimaryKeyPairRefParam: repository.PrimaryKeyPairRefParam{ @@ -43,7 +43,7 @@ func UnpackLocalDebianRepository(data *schema.ResourceData, rclass string) Debia SecondaryKeyPairRefParam: repository.SecondaryKeyPairRefParam{ SecondaryKeyPairRef: d.GetString("secondary_keypair_ref", false), }, - RepositoryBaseParams: UnpackBaseRepo(rclass, data, debianPackageType), + RepositoryBaseParams: UnpackBaseRepo(Rclass, data, repository.DebianPackageType), TrivialLayout: d.GetBool("trivial_layout", false), IndexCompressionFormats: d.GetSet("index_compression_formats"), } @@ -52,18 +52,23 @@ func UnpackLocalDebianRepository(data *schema.ResourceData, rclass string) Debia func ResourceArtifactoryLocalDebianRepository() *schema.Resource { var unpackLocalDebianRepository = func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackLocalDebianRepository(data, rclass) + repo := UnpackLocalDebianRepository(data, Rclass) return repo, repo.Id(), nil } constructor := func() (interface{}, error) { return &DebianLocalRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ - PackageType: debianPackageType, - Rclass: rclass, + PackageType: repository.DebianPackageType, + Rclass: Rclass, }, }, nil } - return repository.MkResourceSchema(DebianLocalSchema, packer.Default(DebianLocalSchema), unpackLocalDebianRepository, constructor) + return repository.MkResourceSchema( + DebianSchemas, + packer.Default(DebianSchemas[CurrentSchemaVersion]), + unpackLocalDebianRepository, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_docker_repository.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_docker_repository.go index 2d14661fc..928f490c8 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_docker_repository.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_docker_repository.go @@ -6,10 +6,9 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const DockerPackageType = "docker" - type DockerLocalRepositoryParams struct { RepositoryBaseParams MaxUniqueTags int `hcl:"max_unique_tags" json:"maxUniqueTags"` @@ -18,8 +17,7 @@ type DockerLocalRepositoryParams struct { BlockPushingSchema1 bool `hcl:"block_pushing_schema1" json:"blockPushingSchema1"` } -var DockerV2LocalSchema = utilsdk.MergeMaps( - BaseLocalRepoSchema, +var dockerV2Schema = lo.Assign( map[string]*schema.Schema{ "max_unique_tags": { Type: schema.TypeInt, @@ -49,13 +47,15 @@ var DockerV2LocalSchema = utilsdk.MergeMaps( Description: "The Docker API version to use. This cannot be set", }, }, - repository.RepoLayoutRefSchema(rclass, DockerPackageType), + repository.RepoLayoutRefSchema(Rclass, repository.DockerPackageType), ) -func UnpackLocalDockerV2Repository(data *schema.ResourceData, rclass string) DockerLocalRepositoryParams { +var DockerV2Schemas = GetSchemas(dockerV2Schema) + +func UnpackLocalDockerV2Repository(data *schema.ResourceData, Rclass string) DockerLocalRepositoryParams { d := &utilsdk.ResourceData{ResourceData: data} return DockerLocalRepositoryParams{ - RepositoryBaseParams: UnpackBaseRepo(rclass, data, DockerPackageType), + RepositoryBaseParams: UnpackBaseRepo(Rclass, data, repository.DockerPackageType), MaxUniqueTags: d.GetInt("max_unique_tags", false), DockerApiVersion: "V2", TagRetention: d.GetInt("tag_retention", false), @@ -64,18 +64,18 @@ func UnpackLocalDockerV2Repository(data *schema.ResourceData, rclass string) Doc } func ResourceArtifactoryLocalDockerV2Repository() *schema.Resource { - pkr := packer.Default(DockerV2LocalSchema) + pkr := packer.Default(DockerV2Schemas[2]) var unpackLocalDockerV2Repository = func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackLocalDockerV2Repository(data, rclass) + repo := UnpackLocalDockerV2Repository(data, Rclass) return repo, repo.Id(), nil } constructor := func() (interface{}, error) { return &DockerLocalRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ - PackageType: DockerPackageType, - Rclass: rclass, + PackageType: repository.DockerPackageType, + Rclass: Rclass, }, DockerApiVersion: "V2", TagRetention: 1, @@ -84,11 +84,15 @@ func ResourceArtifactoryLocalDockerV2Repository() *schema.Resource { }, nil } - return repository.MkResourceSchema(DockerV2LocalSchema, pkr, unpackLocalDockerV2Repository, constructor) + return repository.MkResourceSchema( + DockerV2Schemas, + pkr, + unpackLocalDockerV2Repository, + constructor, + ) } -var DockerV1LocalSchema = utilsdk.MergeMaps( - BaseLocalRepoSchema, +var dockerV1Schema = utilsdk.MergeMaps( map[string]*schema.Schema{ "max_unique_tags": { Type: schema.TypeInt, @@ -108,12 +112,14 @@ var DockerV1LocalSchema = utilsdk.MergeMaps( Computed: true, }, }, - repository.RepoLayoutRefSchema(rclass, DockerPackageType), + repository.RepoLayoutRefSchema(Rclass, repository.DockerPackageType), ) -func UnpackLocalDockerV1Repository(data *schema.ResourceData, rclass string) DockerLocalRepositoryParams { +var DockerV1Schemas = GetSchemas(dockerV1Schema) + +func UnpackLocalDockerV1Repository(data *schema.ResourceData, Rclass string) DockerLocalRepositoryParams { return DockerLocalRepositoryParams{ - RepositoryBaseParams: UnpackBaseRepo(rclass, data, DockerPackageType), + RepositoryBaseParams: UnpackBaseRepo(Rclass, data, repository.DockerPackageType), DockerApiVersion: "V1", MaxUniqueTags: 0, TagRetention: 1, @@ -122,19 +128,16 @@ func UnpackLocalDockerV1Repository(data *schema.ResourceData, rclass string) Doc } func ResourceArtifactoryLocalDockerV1Repository() *schema.Resource { - // this is necessary because of the pointers - skeema := utilsdk.MergeMaps(DockerV1LocalSchema) - var unPackLocalDockerV1Repository = func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackLocalDockerV1Repository(data, rclass) + repo := UnpackLocalDockerV1Repository(data, Rclass) return repo, repo.Id(), nil } constructor := func() (interface{}, error) { return &DockerLocalRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ - PackageType: DockerPackageType, - Rclass: rclass, + PackageType: repository.DockerPackageType, + Rclass: Rclass, }, DockerApiVersion: "V1", TagRetention: 1, @@ -143,5 +146,10 @@ func ResourceArtifactoryLocalDockerV1Repository() *schema.Resource { }, nil } - return repository.MkResourceSchema(skeema, packer.Default(DockerV1LocalSchema), unPackLocalDockerV1Repository, constructor) + return repository.MkResourceSchema( + DockerV1Schemas, + packer.Default(DockerV1Schemas[CurrentSchemaVersion]), + unPackLocalDockerV1Repository, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_generic_repository.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_generic_repository.go index 8a04af36a..30de2367b 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_generic_repository.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_generic_repository.go @@ -4,27 +4,41 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -func GetGenericRepoSchema(packageType string) map[string]*schema.Schema { - return utilsdk.MergeMaps(BaseLocalRepoSchema, repository.RepoLayoutRefSchema(rclass, packageType)) +func GetGenericSchemas(packageType string) map[int16]map[string]*schema.Schema { + return map[int16]map[string]*schema.Schema{ + 0: lo.Assign( + BaseSchemaV1, + repository.RepoLayoutRefSchema(Rclass, packageType), + ), + 1: lo.Assign( + BaseSchemaV1, + repository.RepoLayoutRefSchema(Rclass, packageType), + ), + } } func ResourceArtifactoryLocalGenericRepository(packageType string) *schema.Resource { constructor := func() (interface{}, error) { return &RepositoryBaseParams{ PackageType: packageType, - Rclass: rclass, + Rclass: Rclass, }, nil } unpack := func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackBaseRepo(rclass, data, packageType) + repo := UnpackBaseRepo(Rclass, data, packageType) return repo, repo.Id(), nil } - genericRepoSchema := GetGenericRepoSchema(packageType) + genericRepoSchemas := GetGenericSchemas(packageType) - return repository.MkResourceSchema(genericRepoSchema, packer.Default(genericRepoSchema), unpack, constructor) + return repository.MkResourceSchema( + genericRepoSchemas, + packer.Default(genericRepoSchemas[CurrentSchemaVersion]), + unpack, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_helmoci_repository.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_helmoci_repository.go index cf3300925..0ec9714b6 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_helmoci_repository.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_helmoci_repository.go @@ -8,16 +8,13 @@ import ( utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" ) -const HelmOciPackageType = "helmoci" - type HelmOciLocalRepositoryParams struct { RepositoryBaseParams MaxUniqueTags int `json:"maxUniqueTags"` TagRetention int `json:"dockerTagRetention"` } -var HelmOciLocalSchema = utilsdk.MergeMaps( - BaseLocalRepoSchema, +var helmOCISchema = utilsdk.MergeMaps( map[string]*schema.Schema{ "max_unique_tags": { Type: schema.TypeInt, @@ -36,36 +33,43 @@ var HelmOciLocalSchema = utilsdk.MergeMaps( ValidateDiagFunc: validation.ToDiagFunc(validation.IntAtLeast(1)), }, }, - repository.RepoLayoutRefSchema(rclass, HelmOciPackageType), + repository.RepoLayoutRefSchema(Rclass, repository.HelmOCIPackageType), ) -func UnpackLocalHelmOciRepository(data *schema.ResourceData, rclass string) HelmOciLocalRepositoryParams { +var HelmOCISchemas = GetSchemas(helmOCISchema) + +func UnpackLocalHelmOciRepository(data *schema.ResourceData, Rclass string) HelmOciLocalRepositoryParams { d := &utilsdk.ResourceData{ResourceData: data} return HelmOciLocalRepositoryParams{ - RepositoryBaseParams: UnpackBaseRepo(rclass, data, HelmOciPackageType), + RepositoryBaseParams: UnpackBaseRepo(Rclass, data, repository.HelmOCIPackageType), MaxUniqueTags: d.GetInt("max_unique_tags", false), TagRetention: d.GetInt("tag_retention", false), } } func ResourceArtifactoryLocalHelmOciRepository() *schema.Resource { - pkr := packer.Default(HelmOciLocalSchema) + pkr := packer.Default(HelmOCISchemas[CurrentSchemaVersion]) var unpackLocalHelmOciRepository = func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackLocalHelmOciRepository(data, rclass) + repo := UnpackLocalHelmOciRepository(data, Rclass) return repo, repo.Id(), nil } constructor := func() (interface{}, error) { return &HelmOciLocalRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ - PackageType: HelmOciPackageType, - Rclass: rclass, + PackageType: repository.HelmOCIPackageType, + Rclass: Rclass, }, TagRetention: 1, MaxUniqueTags: 0, // no limit }, nil } - return repository.MkResourceSchema(HelmOciLocalSchema, pkr, unpackLocalHelmOciRepository, constructor) + return repository.MkResourceSchema( + HelmOCISchemas, + pkr, + unpackLocalHelmOciRepository, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_java_repository.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_java_repository.go index c926e5a22..a23d16eb6 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_java_repository.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_java_repository.go @@ -7,11 +7,11 @@ import ( "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" "github.com/jfrog/terraform-provider-shared/validator" + "github.com/samber/lo" ) -func GetJavaRepoSchema(packageType string, suppressPom bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseLocalRepoSchema, +func GetJavaSchemas(packageType string, suppressPom bool) map[int16]map[string]*schema.Schema { + javaSchema := lo.Assign( map[string]*schema.Schema{ "checksum_policy_type": { Type: schema.TypeString, @@ -65,8 +65,19 @@ func GetJavaRepoSchema(packageType string, suppressPom bool) map[string]*schema. "behavior by setting the Suppress POM Consistency Checks checkbox.", }, }, - repository.RepoLayoutRefSchema(rclass, packageType), + repository.RepoLayoutRefSchema(Rclass, packageType), ) + + return map[int16]map[string]*schema.Schema{ + 0: lo.Assign( + BaseSchemaV1, + javaSchema, + ), + 1: lo.Assign( + BaseSchemaV1, + javaSchema, + ), + } } type JavaLocalRepositoryParams struct { @@ -79,10 +90,10 @@ type JavaLocalRepositoryParams struct { SuppressPomConsistencyChecks bool `hcl:"suppress_pom_consistency_checks" json:"suppressPomConsistencyChecks"` } -var UnpackLocalJavaRepository = func(data *schema.ResourceData, rclass string, packageType string) JavaLocalRepositoryParams { +var UnpackLocalJavaRepository = func(data *schema.ResourceData, Rclass string, packageType string) JavaLocalRepositoryParams { d := &utilsdk.ResourceData{ResourceData: data} return JavaLocalRepositoryParams{ - RepositoryBaseParams: UnpackBaseRepo(rclass, data, packageType), + RepositoryBaseParams: UnpackBaseRepo(Rclass, data, packageType), ChecksumPolicyType: d.GetString("checksum_policy_type", false), SnapshotVersionBehavior: d.GetString("snapshot_version_behavior", false), MaxUniqueSnapshots: d.GetInt("max_unique_snapshots", false), @@ -94,21 +105,26 @@ var UnpackLocalJavaRepository = func(data *schema.ResourceData, rclass string, p func ResourceArtifactoryLocalJavaRepository(packageType string, suppressPom bool) *schema.Resource { var unPackLocalJavaRepository = func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackLocalJavaRepository(data, rclass, packageType) + repo := UnpackLocalJavaRepository(data, Rclass, packageType) return repo, repo.Id(), nil } - javaLocalSchema := GetJavaRepoSchema(packageType, suppressPom) + javaSchemas := GetJavaSchemas(packageType, suppressPom) constructor := func() (interface{}, error) { return &JavaLocalRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ PackageType: packageType, - Rclass: rclass, + Rclass: Rclass, }, SuppressPomConsistencyChecks: suppressPom, }, nil } - return repository.MkResourceSchema(javaLocalSchema, packer.Default(javaLocalSchema), unPackLocalJavaRepository, constructor) + return repository.MkResourceSchema( + javaSchemas, + packer.Default(javaSchemas[CurrentSchemaVersion]), + unPackLocalJavaRepository, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_nuget_repository.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_nuget_repository.go index 4b843abe0..7eb9e2b20 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_nuget_repository.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_nuget_repository.go @@ -5,12 +5,10 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const nugetPackageType = "nuget" - -var NugetLocalSchema = utilsdk.MergeMaps( - BaseLocalRepoSchema, +var nugetSchema = lo.Assign( map[string]*schema.Schema{ "max_unique_snapshots": { Type: schema.TypeInt, @@ -26,19 +24,21 @@ var NugetLocalSchema = utilsdk.MergeMaps( Description: "Force basic authentication credentials in order to use this repository.", }, }, - repository.RepoLayoutRefSchema(rclass, nugetPackageType), + repository.RepoLayoutRefSchema(Rclass, repository.NugetPackageType), ) +var NugetSchemas = GetSchemas(nugetSchema) + type NugetLocalRepositoryParams struct { RepositoryBaseParams MaxUniqueSnapshots int `hcl:"max_unique_snapshots" json:"maxUniqueSnapshots"` ForceNugetAuthentication bool `hcl:"force_nuget_authentication" json:"forceNugetAuthentication"` } -func UnpackLocalNugetRepository(data *schema.ResourceData, rclass string) NugetLocalRepositoryParams { +func UnpackLocalNugetRepository(data *schema.ResourceData, Rclass string) NugetLocalRepositoryParams { d := &utilsdk.ResourceData{ResourceData: data} return NugetLocalRepositoryParams{ - RepositoryBaseParams: UnpackBaseRepo(rclass, data, nugetPackageType), + RepositoryBaseParams: UnpackBaseRepo(Rclass, data, repository.NugetPackageType), MaxUniqueSnapshots: d.GetInt("max_unique_snapshots", false), ForceNugetAuthentication: d.GetBool("force_nuget_authentication", false), } @@ -47,20 +47,25 @@ func UnpackLocalNugetRepository(data *schema.ResourceData, rclass string) NugetL func ResourceArtifactoryLocalNugetRepository() *schema.Resource { var unPackLocalNugetRepository = func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackLocalNugetRepository(data, rclass) + repo := UnpackLocalNugetRepository(data, Rclass) return repo, repo.Id(), nil } constructor := func() (interface{}, error) { return &NugetLocalRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ - PackageType: nugetPackageType, - Rclass: rclass, + PackageType: repository.NugetPackageType, + Rclass: Rclass, }, MaxUniqueSnapshots: 0, ForceNugetAuthentication: false, }, nil } - return repository.MkResourceSchema(NugetLocalSchema, packer.Default(NugetLocalSchema), unPackLocalNugetRepository, constructor) + return repository.MkResourceSchema( + NugetSchemas, + packer.Default(NugetSchemas[CurrentSchemaVersion]), + unPackLocalNugetRepository, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_oci_repository.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_oci_repository.go index 4151eb0e6..11843daed 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_oci_repository.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_oci_repository.go @@ -6,10 +6,9 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const OciPackageType = "oci" - type OciLocalRepositoryParams struct { RepositoryBaseParams MaxUniqueTags int `json:"maxUniqueTags"` @@ -17,8 +16,7 @@ type OciLocalRepositoryParams struct { TagRetention int `json:"dockerTagRetention"` } -var OciLocalSchema = utilsdk.MergeMaps( - BaseLocalRepoSchema, +var ociSchema = lo.Assign( map[string]*schema.Schema{ "max_unique_tags": { Type: schema.TypeInt, @@ -36,13 +34,15 @@ var OciLocalSchema = utilsdk.MergeMaps( ValidateDiagFunc: validation.ToDiagFunc(validation.IntAtLeast(1)), }, }, - repository.RepoLayoutRefSchema(rclass, OciPackageType), + repository.RepoLayoutRefSchema(Rclass, repository.OCIPackageType), ) -func UnpackLocalOciRepository(data *schema.ResourceData, rclass string) OciLocalRepositoryParams { +var OCILocalSchemas = GetSchemas(ociSchema) + +func UnpackLocalOciRepository(data *schema.ResourceData, Rclass string) OciLocalRepositoryParams { d := &utilsdk.ResourceData{ResourceData: data} return OciLocalRepositoryParams{ - RepositoryBaseParams: UnpackBaseRepo(rclass, data, OciPackageType), + RepositoryBaseParams: UnpackBaseRepo(Rclass, data, repository.OCIPackageType), MaxUniqueTags: d.GetInt("max_unique_tags", false), DockerApiVersion: "V2", TagRetention: d.GetInt("tag_retention", false), @@ -50,18 +50,16 @@ func UnpackLocalOciRepository(data *schema.ResourceData, rclass string) OciLocal } func ResourceArtifactoryLocalOciRepository() *schema.Resource { - pkr := packer.Default(OciLocalSchema) - var unpackLocalOciRepository = func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackLocalOciRepository(data, rclass) + repo := UnpackLocalOciRepository(data, Rclass) return repo, repo.Id(), nil } constructor := func() (interface{}, error) { return &OciLocalRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ - PackageType: OciPackageType, - Rclass: rclass, + PackageType: repository.OCIPackageType, + Rclass: Rclass, }, DockerApiVersion: "V2", TagRetention: 1, @@ -69,5 +67,10 @@ func ResourceArtifactoryLocalOciRepository() *schema.Resource { }, nil } - return repository.MkResourceSchema(OciLocalSchema, pkr, unpackLocalOciRepository, constructor) + return repository.MkResourceSchema( + OCILocalSchemas, + packer.Default(OCILocalSchemas[CurrentSchemaVersion]), + unpackLocalOciRepository, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_repository_test.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_repository_test.go index 33892b25b..36208d903 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_repository_test.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_repository_test.go @@ -93,7 +93,7 @@ EOF ProtoV6ProviderFactories: acctest.ProtoV6MuxProviderFactories, CheckDestroy: acctest.CompositeCheckDestroy( acctest.VerifyDeleted(fqrn, "", acctest.CheckRepo), - acctest.VerifyDeleted(kpFqrn, "", security.VerifyKeyPair), + acctest.VerifyDeleted(kpFqrn, "pair_name", security.VerifyKeyPair), ), Steps: []resource.TestStep{ { @@ -186,7 +186,7 @@ EOF ProtoV6ProviderFactories: acctest.ProtoV6MuxProviderFactories, CheckDestroy: acctest.CompositeCheckDestroy( acctest.VerifyDeleted(fqrn, "", acctest.CheckRepo), - acctest.VerifyDeleted(kpFqrn, "", security.VerifyKeyPair), + acctest.VerifyDeleted(kpFqrn, "pair_name", security.VerifyKeyPair), ), Steps: []resource.TestStep{ { @@ -327,8 +327,8 @@ EOF ProtoV6ProviderFactories: acctest.ProtoV6MuxProviderFactories, CheckDestroy: acctest.CompositeCheckDestroy( acctest.VerifyDeleted(fqrn, "", acctest.CheckRepo), - acctest.VerifyDeleted(kpFqrn, "", security.VerifyKeyPair), - acctest.VerifyDeleted(kpFqrn2, "", security.VerifyKeyPair), + acctest.VerifyDeleted(kpFqrn, "pair_name", security.VerifyKeyPair), + acctest.VerifyDeleted(kpFqrn2, "pair_name", security.VerifyKeyPair), ), Steps: []resource.TestStep{ { @@ -475,8 +475,8 @@ EOF ProtoV6ProviderFactories: acctest.ProtoV6MuxProviderFactories, CheckDestroy: acctest.CompositeCheckDestroy( acctest.VerifyDeleted(fqrn, "", acctest.CheckRepo), - acctest.VerifyDeleted(kpFqrn, "", security.VerifyKeyPair), - acctest.VerifyDeleted(kpFqrn2, "", security.VerifyKeyPair), + acctest.VerifyDeleted(kpFqrn, "pair_name", security.VerifyKeyPair), + acctest.VerifyDeleted(kpFqrn2, "pair_name", security.VerifyKeyPair), ), Steps: []resource.TestStep{ { diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_rpm_repository.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_rpm_repository.go index e4a3aea24..222a2d043 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_rpm_repository.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_rpm_repository.go @@ -9,10 +9,7 @@ import ( "github.com/jfrog/terraform-provider-shared/validator" ) -const rpmPackageType = "rpm" - -var RpmLocalSchema = utilsdk.MergeMaps( - BaseLocalRepoSchema, +var rpmSchema = utilsdk.MergeMaps( repository.PrimaryKeyPairRef, repository.SecondaryKeyPairRef, map[string]*schema.Schema{ @@ -45,9 +42,11 @@ var RpmLocalSchema = utilsdk.MergeMaps( "gzipped version of the group files, if required.", }, }, - repository.RepoLayoutRefSchema(rclass, rpmPackageType), + repository.RepoLayoutRefSchema(Rclass, repository.RPMPackageType), ) +var RPMSchemas = GetSchemas(rpmSchema) + type RpmLocalRepositoryParams struct { RepositoryBaseParams repository.PrimaryKeyPairRefParam @@ -58,10 +57,10 @@ type RpmLocalRepositoryParams struct { GroupFileNames string `hcl:"yum_group_file_names" json:"yumGroupFileNames"` } -func UnpackLocalRpmRepository(data *schema.ResourceData, rclass string) RpmLocalRepositoryParams { +func UnpackLocalRpmRepository(data *schema.ResourceData, Rclass string) RpmLocalRepositoryParams { d := &utilsdk.ResourceData{ResourceData: data} return RpmLocalRepositoryParams{ - RepositoryBaseParams: UnpackBaseRepo(rclass, data, rpmPackageType), + RepositoryBaseParams: UnpackBaseRepo(Rclass, data, repository.RPMPackageType), PrimaryKeyPairRefParam: repository.PrimaryKeyPairRefParam{ PrimaryKeyPairRef: d.GetString("primary_keypair_ref", false), }, @@ -76,17 +75,16 @@ func UnpackLocalRpmRepository(data *schema.ResourceData, rclass string) RpmLocal } func ResourceArtifactoryLocalRpmRepository() *schema.Resource { - unpackLocalRpmRepository := func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackLocalRpmRepository(data, rclass) + repo := UnpackLocalRpmRepository(data, Rclass) return repo, repo.Id(), nil } constructor := func() (interface{}, error) { return &RpmLocalRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ - PackageType: rpmPackageType, - Rclass: rclass, + PackageType: repository.RPMPackageType, + Rclass: Rclass, }, RootDepth: 0, CalculateYumMetadata: false, @@ -95,5 +93,10 @@ func ResourceArtifactoryLocalRpmRepository() *schema.Resource { }, nil } - return repository.MkResourceSchema(RpmLocalSchema, packer.Default(RpmLocalSchema), unpackLocalRpmRepository, constructor) + return repository.MkResourceSchema( + RPMSchemas, + packer.Default(RPMSchemas[CurrentSchemaVersion]), + unpackLocalRpmRepository, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_terraform_repository.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_terraform_repository.go index f8e18e6ff..73dd34071 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_terraform_repository.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_terraform_repository.go @@ -4,18 +4,24 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -func GetTerraformLocalSchema(registryType string) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseLocalRepoSchema, - repository.RepoLayoutRefSchema(rclass, "terraform_"+registryType), - ) +func GetTerraformSchemas(registryType string) map[int16]map[string]*schema.Schema { + return map[int16]map[string]*schema.Schema{ + 0: lo.Assign( + BaseSchemaV1, + repository.RepoLayoutRefSchema(Rclass, "terraform_"+registryType), + ), + 1: lo.Assign( + BaseSchemaV1, + repository.RepoLayoutRefSchema(Rclass, "terraform_"+registryType), + ), + } } -func UnpackLocalTerraformRepository(data *schema.ResourceData, rclass string, registryType string) RepositoryBaseParams { - repo := UnpackBaseRepo(rclass, data, "terraform_"+registryType) +func UnpackLocalTerraformRepository(data *schema.ResourceData, Rclass string, registryType string) RepositoryBaseParams { + repo := UnpackBaseRepo(Rclass, data, "terraform_"+registryType) repo.TerraformType = registryType return repo @@ -24,22 +30,22 @@ func UnpackLocalTerraformRepository(data *schema.ResourceData, rclass string, re func ResourceArtifactoryLocalTerraformRepository(registryType string) *schema.Resource { var unpackLocalTerraformRepository = func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackLocalTerraformRepository(data, rclass, registryType) + repo := UnpackLocalTerraformRepository(data, Rclass, registryType) return repo, repo.Id(), nil } - terraformLocalSchema := GetTerraformLocalSchema(registryType) + terraformSchemas := GetTerraformSchemas(registryType) constructor := func() (interface{}, error) { return &RepositoryBaseParams{ PackageType: "terraform_" + registryType, - Rclass: rclass, + Rclass: Rclass, }, nil } return repository.MkResourceSchema( - terraformLocalSchema, - packer.Default(terraformLocalSchema), + terraformSchemas, + packer.Default(terraformSchemas[CurrentSchemaVersion]), unpackLocalTerraformRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/remote/remote.go b/pkg/artifactory/resource/repository/remote/remote.go index a877e1578..f8334eb87 100644 --- a/pkg/artifactory/resource/repository/remote/remote.go +++ b/pkg/artifactory/resource/repository/remote/remote.go @@ -12,9 +12,13 @@ import ( "github.com/jfrog/terraform-provider-shared/unpacker" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" "github.com/jfrog/terraform-provider-shared/validator" + "github.com/samber/lo" ) -const rclass = "remote" +const ( + Rclass = "remote" + CurrentSchemaVersion = 3 +) type RepositoryRemoteBaseParams struct { Key string `json:"key,omitempty"` @@ -90,295 +94,292 @@ func (bp RepositoryRemoteBaseParams) Id() string { } var PackageTypesLikeBasic = []string{ - "alpine", - "chef", - "conda", - "cran", - "debian", - "gems", - "gitlfs", - "opkg", - "p2", - "pub", - "puppet", - "rpm", - "swift", + repository.AlpinePackageType, + repository.ChefPackageType, + repository.CondaPackageType, + repository.CranPackageType, + repository.DebianPackageType, + repository.GemsPackageType, + repository.GitLFSPackageType, + repository.OpkgPackageType, + repository.P2PackageType, + repository.PubPackageType, + repository.PuppetPackageType, + repository.RPMPackageType, + repository.SwiftPackageType, } -var BaseRemoteRepoSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - repository.BaseRepoSchema, - repository.ProxySchema, - map[string]*schema.Schema{ - "url": { - Type: schema.TypeString, - Required: isResource, - Optional: !isResource, - ValidateFunc: validation.IsURLWithHTTPorHTTPS, - Description: "This is a URL to the remote registry. Consider using HTTPS to ensure a secure connection.", - }, - "username": { - Type: schema.TypeString, - Optional: true, - }, - "password": { - Type: schema.TypeString, - Optional: true, - Sensitive: true, - }, - "description": { - Type: schema.TypeString, - Optional: true, - DiffSuppressFunc: func(_, old, new string, _ *schema.ResourceData) bool { - // this is literally what comes back from the server - return old == fmt.Sprintf("%s (local file cache)", new) - }, - Description: "Public description.", - }, - "remote_repo_layout_ref": { - Type: schema.TypeString, - Optional: true, - Description: "Repository layout key for the remote layout mapping. Repository can be created without this attribute (or set to an empty string). Once it's set, it can't be removed by passing an empty string or removing the attribute, that will be ignored by the Artifactory API. UI shows an error message, if the user tries to remove the value.", - }, - "hard_fail": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "When set, Artifactory will return an error to the client that causes the build to fail if there " + - "is a failure to communicate with this repository.", - }, - "offline": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "If set, Artifactory does not try to fetch remote artifacts. Only locally-cached artifacts are retrieved.", - }, - "blacked_out": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "(A.K.A 'Ignore Repository' on the UI) When set, the repository or its local cache do not participate in artifact resolution.", - }, - "xray_index": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "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": { - Type: schema.TypeBool, - Optional: true, - Default: true, - Description: "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": { - Type: schema.TypeInt, - Optional: true, - Default: 15000, - ValidateFunc: validation.IntAtLeast(0), - Description: "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.", - }, - "local_address": { - Type: schema.TypeString, - Optional: true, - Description: "The local address to be used when creating connections. " + - "Useful for specifying the interface to use on systems with multiple network interfaces.", - }, - "retrieval_cache_period_seconds": { - Type: schema.TypeInt, - Optional: true, - Default: 7200, - ValidateFunc: validation.IntAtLeast(0), - Description: "Metadata Retrieval Cache Period (Sec) in the UI. This value refers to the number of seconds to cache " + - "metadata files before checking for newer versions on remote server. A value of 0 indicates no caching.", - }, - "metadata_retrieval_timeout_secs": { - Type: schema.TypeInt, - Optional: true, - Default: 60, - ValidateFunc: validation.IntAtLeast(0), - Description: "Metadata Retrieval Cache Timeout (Sec) in the UI.This value refers to the number of seconds to wait " + - "for retrieval from the remote before serving locally cached artifact or fail the request.", - }, - "missed_cache_period_seconds": { - Type: schema.TypeInt, - Optional: true, - Default: 1800, - ValidateFunc: validation.IntAtLeast(0), - Description: "Missed Retrieval Cache Period (Sec) in the UI. The number of seconds to cache artifact retrieval " + - "misses (artifact not found). A value of 0 indicates no caching.", - }, - "unused_artifacts_cleanup_period_hours": { - Type: schema.TypeInt, - Optional: true, - Default: 0, - ValidateFunc: validation.IntAtLeast(0), - Description: "Unused Artifacts Cleanup Period (Hr) in the UI. The number of hours to wait before an artifact is " + - "deemed 'unused' and eligible for cleanup from the repository. A value of 0 means automatic cleanup of cached artifacts is disabled.", - }, - "assumed_offline_period_secs": { - Type: schema.TypeInt, - Optional: true, - Default: 300, - ValidateFunc: validation.IntAtLeast(0), - Description: "The number of seconds the repository stays in assumed offline state after a connection error. " + - "At the end of this time, an online check is attempted in order to reset the offline status. " + - "A value of 0 means the repository is never assumed offline.", - }, - // There is no corresponding field in the UI, but the attribute is returned by Get, default is 'false'. - "share_configuration": { - Type: schema.TypeBool, - Optional: true, - Computed: true, - }, - "synchronize_properties": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "When set, remote artifacts are fetched along with their properties.", - }, - // Default value in UI is 'true', at the same time if the repo was created with API, the default is 'false'. - // We are repeating the UI behavior. - "block_mismatching_mime_types": { - Type: schema.TypeBool, - Optional: true, - Default: true, - Description: "If set, artifacts will fail to download if a mismatch is detected between requested and received " + - "mimetype, according to the list specified in the system properties file under blockedMismatchingMimeTypes. " + - "You can override by adding mimetypes to the override list 'mismatching_mime_types_override_list'.", - }, - "property_sets": { - Type: schema.TypeSet, - Elem: &schema.Schema{Type: schema.TypeString}, - Set: schema.HashString, - Optional: true, - Description: "List of property set names", - }, - "allow_any_host_auth": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "'Lenient Host Authentication' in the UI. Allow credentials of this repository to be used on requests redirected to any other host.", - }, - "enable_cookie_management": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "Enables cookie management if the remote repository uses cookies to manage client state.", - }, - "bypass_head_requests": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "Before caching an artifact, Artifactory first sends a HEAD request to the remote resource. " + - "In some remote resources, HEAD requests are disallowed and therefore rejected, even though downloading the " + - "artifact is allowed. When checked, Artifactory will bypass the HEAD request and cache the artifact directly using a GET request.", - }, - "priority_resolution": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "Setting Priority Resolution takes precedence over the resolution order when resolving virtual " + - "repositories. Setting repositories with priority will cause metadata to be merged only from repositories " + - "set with a priority. If a package is not found in those repositories, Artifactory will merge from repositories marked as non-priority.", - }, - "client_tls_certificate": { - Type: schema.TypeString, - Optional: true, - Computed: true, - Description: "Client TLS certificate name.", - }, - "content_synchronisation": { - Type: schema.TypeList, - Optional: true, - Computed: true, - MaxItems: 1, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "enabled": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "If set, Remote repository proxies a local or remote repository from another instance of Artifactory. Default value is 'false'.", - }, - "statistics_enabled": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "If set, Artifactory will notify the remote instance whenever an artifact in the Smart Remote Repository is downloaded locally so that it can update its download counter. Note that if this option is not set, there may be a discrepancy between the number of artifacts reported to have been downloaded in the different Artifactory instances of the proxy chain. Default value is 'false'.", - }, - "properties_enabled": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "If set, properties for artifacts that have been cached in this repository will be updated if they are modified in the artifact hosted at the remote Artifactory instance. The trigger to synchronize the properties is download of the artifact from the remote repository cache of the local Artifactory instance. Default value is 'false'.", - }, - "source_origin_absence_detection": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "If set, Artifactory displays an indication on cached items if they have been deleted from the corresponding repository in the remote Artifactory instance. Default value is 'false'", - }, +var baseSchema = lo.Assign( + repository.ProxySchema, + map[string]*schema.Schema{ + "url": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.IsURLWithHTTPorHTTPS, + Description: "This is a URL to the remote registry. Consider using HTTPS to ensure a secure connection.", + }, + "username": { + Type: schema.TypeString, + Optional: true, + }, + "password": { + Type: schema.TypeString, + Optional: true, + Sensitive: true, + }, + "description": { + Type: schema.TypeString, + Optional: true, + DiffSuppressFunc: func(_, old, new string, _ *schema.ResourceData) bool { + // this is literally what comes back from the server + return old == fmt.Sprintf("%s (local file cache)", new) + }, + Description: "Public description.", + }, + "remote_repo_layout_ref": { + Type: schema.TypeString, + Optional: true, + Description: "Repository layout key for the remote layout mapping. Repository can be created without this attribute (or set to an empty string). Once it's set, it can't be removed by passing an empty string or removing the attribute, that will be ignored by the Artifactory API. UI shows an error message, if the user tries to remove the value.", + }, + "hard_fail": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "When set, Artifactory will return an error to the client that causes the build to fail if there " + + "is a failure to communicate with this repository.", + }, + "offline": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "If set, Artifactory does not try to fetch remote artifacts. Only locally-cached artifacts are retrieved.", + }, + "blacked_out": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "(A.K.A 'Ignore Repository' on the UI) When set, the repository or its local cache do not participate in artifact resolution.", + }, + "xray_index": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "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": { + Type: schema.TypeBool, + Optional: true, + Default: true, + Description: "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": { + Type: schema.TypeInt, + Optional: true, + Default: 15000, + ValidateFunc: validation.IntAtLeast(0), + Description: "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.", + }, + "local_address": { + Type: schema.TypeString, + Optional: true, + Description: "The local address to be used when creating connections. " + + "Useful for specifying the interface to use on systems with multiple network interfaces.", + }, + "retrieval_cache_period_seconds": { + Type: schema.TypeInt, + Optional: true, + Default: 7200, + ValidateFunc: validation.IntAtLeast(0), + Description: "Metadata Retrieval Cache Period (Sec) in the UI. This value refers to the number of seconds to cache " + + "metadata files before checking for newer versions on remote server. A value of 0 indicates no caching.", + }, + "metadata_retrieval_timeout_secs": { + Type: schema.TypeInt, + Optional: true, + Default: 60, + ValidateFunc: validation.IntAtLeast(0), + Description: "Metadata Retrieval Cache Timeout (Sec) in the UI.This value refers to the number of seconds to wait " + + "for retrieval from the remote before serving locally cached artifact or fail the request.", + }, + "missed_cache_period_seconds": { + Type: schema.TypeInt, + Optional: true, + Default: 1800, + ValidateFunc: validation.IntAtLeast(0), + Description: "Missed Retrieval Cache Period (Sec) in the UI. The number of seconds to cache artifact retrieval " + + "misses (artifact not found). A value of 0 indicates no caching.", + }, + "unused_artifacts_cleanup_period_hours": { + Type: schema.TypeInt, + Optional: true, + Default: 0, + ValidateFunc: validation.IntAtLeast(0), + Description: "Unused Artifacts Cleanup Period (Hr) in the UI. The number of hours to wait before an artifact is " + + "deemed 'unused' and eligible for cleanup from the repository. A value of 0 means automatic cleanup of cached artifacts is disabled.", + }, + "assumed_offline_period_secs": { + Type: schema.TypeInt, + Optional: true, + Default: 300, + ValidateFunc: validation.IntAtLeast(0), + Description: "The number of seconds the repository stays in assumed offline state after a connection error. " + + "At the end of this time, an online check is attempted in order to reset the offline status. " + + "A value of 0 means the repository is never assumed offline.", + }, + // There is no corresponding field in the UI, but the attribute is returned by Get, default is 'false'. + "share_configuration": { + Type: schema.TypeBool, + Optional: true, + Computed: true, + }, + "synchronize_properties": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "When set, remote artifacts are fetched along with their properties.", + }, + // Default value in UI is 'true', at the same time if the repo was created with API, the default is 'false'. + // We are repeating the UI behavior. + "block_mismatching_mime_types": { + Type: schema.TypeBool, + Optional: true, + Default: true, + Description: "If set, artifacts will fail to download if a mismatch is detected between requested and received " + + "mimetype, according to the list specified in the system properties file under blockedMismatchingMimeTypes. " + + "You can override by adding mimetypes to the override list 'mismatching_mime_types_override_list'.", + }, + "property_sets": { + Type: schema.TypeSet, + Elem: &schema.Schema{Type: schema.TypeString}, + Set: schema.HashString, + Optional: true, + Description: "List of property set names", + }, + "allow_any_host_auth": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "'Lenient Host Authentication' in the UI. Allow credentials of this repository to be used on requests redirected to any other host.", + }, + "enable_cookie_management": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Enables cookie management if the remote repository uses cookies to manage client state.", + }, + "bypass_head_requests": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Before caching an artifact, Artifactory first sends a HEAD request to the remote resource. " + + "In some remote resources, HEAD requests are disallowed and therefore rejected, even though downloading the " + + "artifact is allowed. When checked, Artifactory will bypass the HEAD request and cache the artifact directly using a GET request.", + }, + "priority_resolution": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Setting Priority Resolution takes precedence over the resolution order when resolving virtual " + + "repositories. Setting repositories with priority will cause metadata to be merged only from repositories " + + "set with a priority. If a package is not found in those repositories, Artifactory will merge from repositories marked as non-priority.", + }, + "client_tls_certificate": { + Type: schema.TypeString, + Optional: true, + Computed: true, + Description: "Client TLS certificate name.", + }, + "content_synchronisation": { + Type: schema.TypeList, + Optional: true, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "enabled": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "If set, Remote repository proxies a local or remote repository from another instance of Artifactory. Default value is 'false'.", + }, + "statistics_enabled": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "If set, Artifactory will notify the remote instance whenever an artifact in the Smart Remote Repository is downloaded locally so that it can update its download counter. Note that if this option is not set, there may be a discrepancy between the number of artifacts reported to have been downloaded in the different Artifactory instances of the proxy chain. Default value is 'false'.", + }, + "properties_enabled": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "If set, properties for artifacts that have been cached in this repository will be updated if they are modified in the artifact hosted at the remote Artifactory instance. The trigger to synchronize the properties is download of the artifact from the remote repository cache of the local Artifactory instance. Default value is 'false'.", + }, + "source_origin_absence_detection": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "If set, Artifactory displays an indication on cached items if they have been deleted from the corresponding repository in the remote Artifactory instance. Default value is 'false'", }, }, }, - "query_params": { - Type: schema.TypeString, - Optional: true, - Description: "Custom HTTP query parameters that will be automatically included in all remote resource requests. " + - "For example: `param1=val1¶m2=val2¶m3=val3`", - }, - "list_remote_folder_items": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "Lists the items of remote folders in simple and list browsing. The remote content is cached " + - "according to the value of the 'Retrieval Cache Period'. Default value is 'false'. This field exists in the API but not in the UI.", - }, - "mismatching_mime_types_override_list": { - Type: schema.TypeString, - Optional: true, - ValidateDiagFunc: validator.CommaSeperatedList, - StateFunc: utilsdk.FormatCommaSeparatedString, - Description: "The set of mime types that should override the block_mismatching_mime_types setting. " + - "Eg: 'application/json,application/xml'. Default value is empty.", - }, - "download_direct": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "When set, download requests to this repository will redirect the client to download the artifact " + - "directly from the cloud storage provider. Available in Enterprise+ and Edge licenses only. Default value is 'false'.", - }, - "cdn_redirect": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "When set, download requests to this repository will redirect the client to download the artifact directly from AWS CloudFront. Available in Enterprise+ and Edge licenses only. Default value is 'false'", - }, - "disable_url_normalization": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "Whether to disable URL normalization, default is `false`.", - }, - "archive_browsing_enabled": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "When set, you may view content such as HTML or Javadoc files directly from Artifactory.\nThis may not be safe and therefore requires strict content moderation to prevent malicious users from uploading content that may compromise security (e.g., cross-site scripting attacks).", - }, }, - ) -} + "query_params": { + Type: schema.TypeString, + Optional: true, + Description: "Custom HTTP query parameters that will be automatically included in all remote resource requests. " + + "For example: `param1=val1¶m2=val2¶m3=val3`", + }, + "list_remote_folder_items": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Lists the items of remote folders in simple and list browsing. The remote content is cached " + + "according to the value of the 'Retrieval Cache Period'. Default value is 'false'. This field exists in the API but not in the UI.", + }, + "mismatching_mime_types_override_list": { + Type: schema.TypeString, + Optional: true, + ValidateDiagFunc: validator.CommaSeperatedList, + StateFunc: utilsdk.FormatCommaSeparatedString, + Description: "The set of mime types that should override the block_mismatching_mime_types setting. " + + "Eg: 'application/json,application/xml'. Default value is empty.", + }, + "download_direct": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "When set, download requests to this repository will redirect the client to download the artifact " + + "directly from the cloud storage provider. Available in Enterprise+ and Edge licenses only. Default value is 'false'.", + }, + "cdn_redirect": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "When set, download requests to this repository will redirect the client to download the artifact directly from AWS CloudFront. Available in Enterprise+ and Edge licenses only. Default value is 'false'", + }, + "disable_url_normalization": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Whether to disable URL normalization, default is `false`.", + }, + "archive_browsing_enabled": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "When set, you may view content such as HTML or Javadoc files directly from Artifactory.\nThis may not be safe and therefore requires strict content moderation to prevent malicious users from uploading content that may compromise security (e.g., cross-site scripting attacks).", + }, + }, +) -var baseRemoteRepoSchemaV1 = utilsdk.MergeMaps( - BaseRemoteRepoSchema(true), +var baseSchemaV1 = lo.Assign( + repository.BaseSchemaV1, + baseSchema, map[string]*schema.Schema{ "propagate_query_params": { Type: schema.TypeBool, @@ -389,7 +390,36 @@ var baseRemoteRepoSchemaV1 = utilsdk.MergeMaps( }, ) -var baseRemoteRepoSchemaV2 = BaseRemoteRepoSchema(true) +var baseSchemaV2 = lo.Assign( + repository.BaseSchemaV1, + baseSchema, +) + +var baseSchemaV3 = lo.Assign( + repository.BaseSchemaV1, + baseSchema, +) + +var GetSchemas = func(s map[string]*schema.Schema) map[int16]map[string]*schema.Schema { + return map[int16]map[string]*schema.Schema{ + 0: lo.Assign( + baseSchemaV1, + s, + ), + 1: lo.Assign( + baseSchemaV1, + s, + ), + 2: lo.Assign( + baseSchemaV2, + s, + ), + 3: lo.Assign( + baseSchemaV3, + s, + ), + } +} var VcsRemoteRepoSchema = map[string]*schema.Schema{ "vcs_git_provider": { @@ -407,9 +437,9 @@ var VcsRemoteRepoSchema = map[string]*schema.Schema{ }, } -func JavaRemoteSchema(isResource bool, packageType string, suppressPom bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), +func JavaSchema(packageType string, suppressPom bool) map[string]*schema.Schema { + return lo.Assign( + baseSchema, map[string]*schema.Schema{ "fetch_jars_eagerly": { Type: schema.TypeBool, @@ -469,7 +499,7 @@ func JavaRemoteSchema(isResource bool, packageType string, suppressPom bool) map "no limit, and unique snapshots are not cleaned up.", }, }, - repository.RepoLayoutRefSchema(rclass, packageType), + repository.RepoLayoutRefSchema(Rclass, packageType), ) } @@ -568,40 +598,34 @@ func UnpackJavaRemoteRepo(s *schema.ResourceData, repoType string) JavaRemoteRep } } -var resourceV1 = &schema.Resource{ - Schema: baseRemoteRepoSchemaV1, -} - -var resourceV2 = &schema.Resource{ - Schema: baseRemoteRepoSchemaV2, -} - -func mkResourceSchema(skeema map[string]*schema.Schema, packer packer.PackFunc, unpack unpacker.UnpackFunc, constructor repository.Constructor) *schema.Resource { +func mkResourceSchema(skeemas map[int16]map[string]*schema.Schema, packer packer.PackFunc, unpack unpacker.UnpackFunc, constructor repository.Constructor) *schema.Resource { var reader = repository.MkRepoRead(packer, constructor) return &schema.Resource{ CreateContext: repository.MkRepoCreate(unpack, reader), ReadContext: reader, UpdateContext: repository.MkRepoUpdate(unpack, reader), DeleteContext: repository.DeleteRepo, + Importer: &schema.ResourceImporter{ StateContext: schema.ImportStatePassthroughContext, }, StateUpgraders: []schema.StateUpgrader{ { - Type: resourceV1.CoreConfigSchema().ImpliedType(), + Type: repository.Resource(skeemas[1]).CoreConfigSchema().ImpliedType(), Upgrade: ResourceStateUpgradeV1, Version: 1, }, { - Type: resourceV2.CoreConfigSchema().ImpliedType(), + Type: repository.Resource(skeemas[2]).CoreConfigSchema().ImpliedType(), Upgrade: ResourceStateUpgradeV2, Version: 2, }, }, - Schema: skeema, - SchemaVersion: 3, + Schema: skeemas[CurrentSchemaVersion], + SchemaVersion: CurrentSchemaVersion, + CustomizeDiff: customdiff.All( repository.ProjectEnvironmentsDiff, verifyExternalDependenciesDockerAndHelm, diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_ansible_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_ansible_repository.go index deb2dda96..b4581e137 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_ansible_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_ansible_repository.go @@ -4,54 +4,55 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const AnsiblePackageType = "ansible" - type AnsibleRepo struct { RepositoryRemoteBaseParams } -var AnsibleSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - map[string]*schema.Schema{ - "url": { - Type: schema.TypeString, - Optional: true, - Default: "https://galaxy.ansible.com", - Description: "The remote repo URL. Default to 'https://galaxy.ansible.com'", - }, +var ansibleSchema = lo.Assign( + baseSchema, + map[string]*schema.Schema{ + "url": { + Type: schema.TypeString, + Optional: true, + Default: "https://galaxy.ansible.com", + Description: "The remote repo URL. Default to 'https://galaxy.ansible.com'", }, - repository.RepoLayoutRefSchema(rclass, AnsiblePackageType), - ) -} + }, + repository.RepoLayoutRefSchema(Rclass, repository.AnsiblePackageType), +) + +var AnsibleSchemas = GetSchemas(ansibleSchema) func ResourceArtifactoryRemoteAnsibleRepository() *schema.Resource { var unpackRepo = func(s *schema.ResourceData) (interface{}, string, error) { repo := AnsibleRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, AnsiblePackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.AnsiblePackageType), } return repo, repo.Id(), nil } constructor := func() (interface{}, error) { - repoLayout, err := repository.GetDefaultRepoLayoutRef(rclass, AnsiblePackageType)() + repoLayout, err := repository.GetDefaultRepoLayoutRef(Rclass, repository.AnsiblePackageType)() if err != nil { return nil, err } return &AnsibleRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: AnsiblePackageType, + Rclass: Rclass, + PackageType: repository.AnsiblePackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - ansibleSchema := AnsibleSchema(true) - - return mkResourceSchema(ansibleSchema, packer.Default(ansibleSchema), unpackRepo, constructor) + return mkResourceSchema( + AnsibleSchemas, + packer.Default(AnsibleSchemas[CurrentSchemaVersion]), + unpackRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_bower_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_bower_repository.go index 389294538..cae8bd9ba 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_bower_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_bower_repository.go @@ -6,6 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type BowerRemoteRepo struct { @@ -14,31 +15,29 @@ type BowerRemoteRepo struct { BowerRegistryUrl string `json:"bowerRegistryUrl"` } -const BowerPackageType = "bower" - -var BowerRemoteSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - VcsRemoteRepoSchema, - map[string]*schema.Schema{ - "bower_registry_url": { - Type: schema.TypeString, - Optional: true, - Default: "https://registry.bower.io", - ValidateFunc: validation.IsURLWithHTTPorHTTPS, - Description: `Proxy remote Bower repository. Default value is "https://registry.bower.io".`, - }, +var bowerSchema = lo.Assign( + baseSchema, + VcsRemoteRepoSchema, + map[string]*schema.Schema{ + "bower_registry_url": { + Type: schema.TypeString, + Optional: true, + Default: "https://registry.bower.io", + ValidateFunc: validation.IsURLWithHTTPorHTTPS, + Description: `Proxy remote Bower repository. Default value is "https://registry.bower.io".`, }, - repository.RepoLayoutRefSchema(rclass, BowerPackageType), - ) -} + }, + repository.RepoLayoutRefSchema(Rclass, repository.BowerPackageType), +) + +var BowerSchemas = GetSchemas(bowerSchema) func ResourceArtifactoryRemoteBowerRepository() *schema.Resource { var unpackBowerRemoteRepo = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := BowerRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, BowerPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.BowerPackageType), RepositoryVcsParams: UnpackVcsRemoteRepo(s), BowerRegistryUrl: d.GetString("bower_registry_url", false), } @@ -46,21 +45,24 @@ func ResourceArtifactoryRemoteBowerRepository() *schema.Resource { } constructor := func() (interface{}, error) { - repoLayout, err := repository.GetDefaultRepoLayoutRef(rclass, BowerPackageType)() + repoLayout, err := repository.GetDefaultRepoLayoutRef(Rclass, repository.BowerPackageType)() if err != nil { return nil, err } return &BowerRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: BowerPackageType, + Rclass: Rclass, + PackageType: repository.BowerPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - bowerSchema := BowerRemoteSchema(true) - - return mkResourceSchema(bowerSchema, packer.Default(bowerSchema), unpackBowerRemoteRepo, constructor) + return mkResourceSchema( + BowerSchemas, + packer.Default(BowerSchemas[CurrentSchemaVersion]), + unpackBowerRemoteRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_cargo_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_cargo_repository.go index ddcf6e483..eeeb1bfe3 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_cargo_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_cargo_repository.go @@ -6,6 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type CargoRemoteRepo struct { @@ -15,48 +16,39 @@ type CargoRemoteRepo struct { EnableSparseIndex bool `json:"cargoInternalIndex"` } -const CargoPackageType = "cargo" - -var CargoRemoteSchema = func(isResource bool) map[string]*schema.Schema { - cargoSchema := utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - map[string]*schema.Schema{ - "git_registry_url": { - Type: schema.TypeString, - ValidateFunc: validation.IsURLWithHTTPorHTTPS, - Description: `This is the index url, expected to be a git repository. Default value in UI is "https://github.com/rust-lang/crates.io-index"`, - }, - "anonymous_access": { - Type: schema.TypeBool, - Optional: true, - Description: "(On the UI: Anonymous download and search) Cargo client does not send credentials when performing download and search for crates. " + - "Enable this to allow anonymous access to these resources (only), note that this will override the security anonymous access option.", - }, - "enable_sparse_index": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "Enable internal index support based on Cargo sparse index specifications, instead of the default git index. Default value is 'false'.", - }, +var cargoSchema = lo.Assign( + baseSchema, + map[string]*schema.Schema{ + "git_registry_url": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.IsURLWithHTTPorHTTPS, + Description: `This is the index url, expected to be a git repository. Default value in UI is "https://github.com/rust-lang/crates.io-index"`, }, - repository.RepoLayoutRefSchema(rclass, CargoPackageType), - ) - - if isResource { - cargoSchema["git_registry_url"].Required = true - } else { - cargoSchema["git_registry_url"].Optional = true - } + "anonymous_access": { + Type: schema.TypeBool, + Optional: true, + Description: "(On the UI: Anonymous download and search) Cargo client does not send credentials when performing download and search for crates. " + + "Enable this to allow anonymous access to these resources (only), note that this will override the security anonymous access option.", + }, + "enable_sparse_index": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Enable internal index support based on Cargo sparse index specifications, instead of the default git index. Default value is 'false'.", + }, + }, + repository.RepoLayoutRefSchema(Rclass, repository.CargoPackageType), +) - return cargoSchema -} +var CargoSchemas = GetSchemas(cargoSchema) func ResourceArtifactoryRemoteCargoRepository() *schema.Resource { var unpackCargoRemoteRepo = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := CargoRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, CargoPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.CargoPackageType), RegistryUrl: d.GetString("git_registry_url", false), AnonymousAccess: d.GetBool("anonymous_access", false), EnableSparseIndex: d.GetBool("enable_sparse_index", false), @@ -67,13 +59,16 @@ func ResourceArtifactoryRemoteCargoRepository() *schema.Resource { constructor := func() (interface{}, error) { return &CargoRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: CargoPackageType, + Rclass: Rclass, + PackageType: repository.CargoPackageType, }, }, nil } - cargoSchema := CargoRemoteSchema(true) - - return mkResourceSchema(cargoSchema, packer.Default(cargoSchema), unpackCargoRemoteRepo, constructor) + return mkResourceSchema( + CargoSchemas, + packer.Default(CargoSchemas[CurrentSchemaVersion]), + unpackCargoRemoteRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_cocoapods_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_cocoapods_repository.go index a8b716bfe..bbc6cde44 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_cocoapods_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_cocoapods_repository.go @@ -6,6 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type CocoapodsRemoteRepo struct { @@ -14,10 +15,10 @@ type CocoapodsRemoteRepo struct { PodsSpecsRepoUrl string `json:"podsSpecsRepoUrl"` } -const CocoapodsPackageType = "cocoapods" - -var CocoapodsRemoteSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps(BaseRemoteRepoSchema(isResource), VcsRemoteRepoSchema, map[string]*schema.Schema{ +var cocoapodsSchema = lo.Assign( + baseSchema, + VcsRemoteRepoSchema, + map[string]*schema.Schema{ "pods_specs_repo_url": { Type: schema.TypeString, Optional: true, @@ -25,14 +26,17 @@ var CocoapodsRemoteSchema = func(isResource bool) map[string]*schema.Schema { ValidateFunc: validation.IsURLWithHTTPorHTTPS, Description: `Proxy remote CocoaPods Specs repositories. Default value is "https://github.com/CocoaPods/Specs".`, }, - }, repository.RepoLayoutRefSchema(rclass, CocoapodsPackageType)) -} + }, + repository.RepoLayoutRefSchema(Rclass, repository.CocoapodsPackageType), +) + +var CocoapodsSchemas = GetSchemas(cocoapodsSchema) func ResourceArtifactoryRemoteCocoapodsRepository() *schema.Resource { var unpackCocoapodsRemoteRepo = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := CocoapodsRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, CocoapodsPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.CocoapodsPackageType), RepositoryVcsParams: UnpackVcsRemoteRepo(s), PodsSpecsRepoUrl: d.GetString("pods_specs_repo_url", false), } @@ -40,21 +44,24 @@ func ResourceArtifactoryRemoteCocoapodsRepository() *schema.Resource { } constructor := func() (interface{}, error) { - repoLayout, err := repository.GetDefaultRepoLayoutRef(rclass, CocoapodsPackageType)() + repoLayout, err := repository.GetDefaultRepoLayoutRef(Rclass, repository.CocoapodsPackageType)() if err != nil { return nil, err } return &CocoapodsRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: CocoapodsPackageType, + Rclass: Rclass, + PackageType: repository.CocoapodsPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - cocoapodsSchema := CocoapodsRemoteSchema(true) - - return mkResourceSchema(cocoapodsSchema, packer.Default(cocoapodsSchema), unpackCocoapodsRemoteRepo, constructor) + return mkResourceSchema( + CocoapodsSchemas, + packer.Default(CocoapodsSchemas[CurrentSchemaVersion]), + unpackCocoapodsRemoteRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_composer_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_composer_repository.go index a562523de..a11d888d3 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_composer_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_composer_repository.go @@ -6,6 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type ComposerRemoteRepo struct { @@ -14,30 +15,28 @@ type ComposerRemoteRepo struct { ComposerRegistryUrl string `json:"composerRegistryUrl"` } -const ComposerPackageType = "composer" - -var ComposerRemoteSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - VcsRemoteRepoSchema, - map[string]*schema.Schema{ - "composer_registry_url": { - Type: schema.TypeString, - Optional: true, - Default: "https://packagist.org", - ValidateFunc: validation.IsURLWithHTTPorHTTPS, - Description: `Proxy remote Composer repository. Default value is "https://packagist.org".`, - }, +var composerSchema = lo.Assign( + baseSchema, + VcsRemoteRepoSchema, + map[string]*schema.Schema{ + "composer_registry_url": { + Type: schema.TypeString, + Optional: true, + Default: "https://packagist.org", + ValidateFunc: validation.IsURLWithHTTPorHTTPS, + Description: `Proxy remote Composer repository. Default value is "https://packagist.org".`, }, - repository.RepoLayoutRefSchema(rclass, ComposerPackageType), - ) -} + }, + repository.RepoLayoutRefSchema(Rclass, repository.ComposerPackageType), +) + +var ComposerSchemas = GetSchemas(composerSchema) func ResourceArtifactoryRemoteComposerRepository() *schema.Resource { var unpackComposerRemoteRepo = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := ComposerRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, ComposerPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.ComposerPackageType), RepositoryVcsParams: UnpackVcsRemoteRepo(s), ComposerRegistryUrl: d.GetString("composer_registry_url", false), } @@ -45,21 +44,24 @@ func ResourceArtifactoryRemoteComposerRepository() *schema.Resource { } constructor := func() (interface{}, error) { - repoLayout, err := repository.GetDefaultRepoLayoutRef(rclass, ComposerPackageType)() + repoLayout, err := repository.GetDefaultRepoLayoutRef(Rclass, repository.ComposerPackageType)() if err != nil { return nil, err } return &ComposerRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: ComposerPackageType, + Rclass: Rclass, + PackageType: repository.ComposerPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - composerSchema := ComposerRemoteSchema(true) - - return mkResourceSchema(composerSchema, packer.Default(composerSchema), unpackComposerRemoteRepo, constructor) + return mkResourceSchema( + ComposerSchemas, + packer.Default(ComposerSchemas[CurrentSchemaVersion]), + unpackComposerRemoteRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_conan_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_conan_repository.go index a5869476a..c6f07eb7d 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_conan_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_conan_repository.go @@ -5,6 +5,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type ConanRepo struct { @@ -12,13 +13,13 @@ type ConanRepo struct { repository.ConanBaseParams } -var ConanSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - repository.ConanBaseSchema, - repository.RepoLayoutRefSchema(rclass, repository.ConanPackageType), - ) -} +var conanSchema = lo.Assign( + baseSchema, + repository.ConanBaseSchema, + repository.RepoLayoutRefSchema(Rclass, repository.ConanPackageType), +) + +var ConanSchemas = GetSchemas(conanSchema) func ResourceArtifactoryRemoteConanRepository() *schema.Resource { var unpackConanRepo = func(s *schema.ResourceData) (interface{}, string, error) { @@ -34,14 +35,14 @@ func ResourceArtifactoryRemoteConanRepository() *schema.Resource { } constructor := func() (interface{}, error) { - repoLayout, err := repository.GetDefaultRepoLayoutRef(rclass, repository.ConanPackageType)() + repoLayout, err := repository.GetDefaultRepoLayoutRef(Rclass, repository.ConanPackageType)() if err != nil { return nil, err } return &ConanRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, + Rclass: Rclass, PackageType: repository.ConanPackageType, RepoLayoutRef: repoLayout.(string), }, @@ -51,11 +52,9 @@ func ResourceArtifactoryRemoteConanRepository() *schema.Resource { }, nil } - conanSchema := ConanSchema(true) - return mkResourceSchema( - conanSchema, - packer.Default(conanSchema), + ConanSchemas, + packer.Default(ConanSchemas[CurrentSchemaVersion]), unpackConanRepo, constructor, ) diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_docker_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_docker_repository.go index c2b687eb7..cd04eafeb 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_docker_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_docker_repository.go @@ -6,57 +6,56 @@ import ( "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const DockerPackageType = "docker" - -var DockerRemoteSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - CurationRemoteRepoSchema, - map[string]*schema.Schema{ - "external_dependencies_enabled": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "Also known as 'Foreign Layers Caching' on the UI, default is `false`.", - }, - "enable_token_authentication": { - Type: schema.TypeBool, - Optional: true, - Computed: true, - Description: "Enable token (Bearer) based authentication.", - }, - "block_pushing_schema1": { - Type: schema.TypeBool, - Optional: true, - Computed: true, - Description: "When set, Artifactory will block the pulling of Docker images with manifest v2 schema 1 from the remote repository (i.e. the upstream). It will be possible to pull images with manifest v2 schema 1 that exist in the cache.", - }, - // We need to set default to ["**"] once we migrate to plugin-framework. SDKv2 doesn't support that. - "external_dependencies_patterns": { - Type: schema.TypeList, - Optional: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - RequiredWith: []string{"external_dependencies_enabled"}, - Description: "An allow list of Ant-style path patterns that determine which remote VCS roots Artifactory will " + - "follow to download remote modules from, when presented with 'go-import' meta tags in the remote repository response. " + - "By default, this is set to '**' in the UI, which means that remote modules may be downloaded from any external VCS source." + - "Due to SDKv2 limitations, we can't set the default value for the list." + - "This value must be assigned to the attribute manually, if user don't specify any other non-default values." + - "This attribute must be set together with `external_dependencies_enabled = true`", - }, - "project_id": { - Type: schema.TypeString, - Optional: true, - Description: "Use this attribute to enter your GCR, GAR Project Id to limit the scope of this remote repo to a specific project in your third-party registry. When leaving this field blank or unset, remote repositories that support project id will default to their default project as you have set up in your account.", +var dockerSchema = lo.Assign( + baseSchema, + CurationRemoteRepoSchema, + map[string]*schema.Schema{ + "external_dependencies_enabled": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Also known as 'Foreign Layers Caching' on the UI, default is `false`.", + }, + "enable_token_authentication": { + Type: schema.TypeBool, + Optional: true, + Computed: true, + Description: "Enable token (Bearer) based authentication.", + }, + "block_pushing_schema1": { + Type: schema.TypeBool, + Optional: true, + Computed: true, + Description: "When set, Artifactory will block the pulling of Docker images with manifest v2 schema 1 from the remote repository (i.e. the upstream). It will be possible to pull images with manifest v2 schema 1 that exist in the cache.", + }, + // We need to set default to ["**"] once we migrate to plugin-framework. SDKv2 doesn't support that. + "external_dependencies_patterns": { + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeString, }, + RequiredWith: []string{"external_dependencies_enabled"}, + Description: "An allow list of Ant-style path patterns that determine which remote VCS roots Artifactory will " + + "follow to download remote modules from, when presented with 'go-import' meta tags in the remote repository response. " + + "By default, this is set to '**' in the UI, which means that remote modules may be downloaded from any external VCS source." + + "Due to SDKv2 limitations, we can't set the default value for the list." + + "This value must be assigned to the attribute manually, if user don't specify any other non-default values." + + "This attribute must be set together with `external_dependencies_enabled = true`", }, - repository.RepoLayoutRefSchema(rclass, DockerPackageType), - ) -} + "project_id": { + Type: schema.TypeString, + Optional: true, + Description: "Use this attribute to enter your GCR, GAR Project Id to limit the scope of this remote repo to a specific project in your third-party registry. When leaving this field blank or unset, remote repositories that support project id will default to their default project as you have set up in your account.", + }, + }, + repository.RepoLayoutRefSchema(Rclass, repository.DockerPackageType), +) + +var DockerSchemas = GetSchemas(dockerSchema) type DockerRemoteRepo struct { RepositoryRemoteBaseParams @@ -72,7 +71,7 @@ func ResourceArtifactoryRemoteDockerRepository() *schema.Resource { var unpackDockerRemoteRepo = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := DockerRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, DockerPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.DockerPackageType), RepositoryCurationParams: RepositoryCurationParams{ Curated: d.GetBool("curated", false), }, @@ -85,11 +84,9 @@ func ResourceArtifactoryRemoteDockerRepository() *schema.Resource { return repo, repo.Id(), nil } - dockerSchema := DockerRemoteSchema(true) - dockerRemoteRepoPacker := packer.Universal( predicate.All( - predicate.SchemaHasKey(dockerSchema), + predicate.SchemaHasKey(DockerSchemas[CurrentSchemaVersion]), predicate.NoPassword, ), ) @@ -97,11 +94,16 @@ func ResourceArtifactoryRemoteDockerRepository() *schema.Resource { constructor := func() (interface{}, error) { return &DockerRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: DockerPackageType, + Rclass: Rclass, + PackageType: repository.DockerPackageType, }, }, nil } - return mkResourceSchema(dockerSchema, dockerRemoteRepoPacker, unpackDockerRemoteRepo, constructor) + return mkResourceSchema( + DockerSchemas, + dockerRemoteRepoPacker, + unpackDockerRemoteRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_generic_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_generic_repository.go index 6106272ab..bec9c0078 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_generic_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_generic_repository.go @@ -5,6 +5,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type GenericRemoteRepo struct { @@ -12,70 +13,72 @@ type GenericRemoteRepo struct { PropagateQueryParams bool `json:"propagateQueryParams"` } -const GenericPackageType = "generic" - -var GenericRemoteSchema = func(isResource bool) map[string]*schema.Schema { - genericSchema := utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - map[string]*schema.Schema{ - "propagate_query_params": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "When set, if query params are included in the request to Artifactory, they will be passed on to the remote repository.", - }, +var genericSchema = lo.Assign( + baseSchema, + map[string]*schema.Schema{ + "propagate_query_params": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "When set, if query params are included in the request to Artifactory, they will be passed on to the remote repository.", }, - repository.RepoLayoutRefSchema(rclass, GenericPackageType), - ) + }, + repository.RepoLayoutRefSchema(Rclass, repository.GenericPackageType), +) - return genericSchema -} +var GenericSchemas = GetSchemas(genericSchema) func ResourceArtifactoryRemoteGenericRepository() *schema.Resource { var unpackGenericRemoteRepo = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := GenericRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, GenericPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.GenericPackageType), PropagateQueryParams: d.GetBool("propagate_query_params", false), } return repo, repo.Id(), nil } constructor := func() (interface{}, error) { - repoLayout, err := repository.GetDefaultRepoLayoutRef(rclass, GenericPackageType)() + repoLayout, err := repository.GetDefaultRepoLayoutRef(Rclass, repository.GenericPackageType)() if err != nil { return nil, err } return &GenericRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: GenericPackageType, + Rclass: Rclass, + PackageType: repository.GenericPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - genericSchema := GenericRemoteSchema(true) - - return mkResourceSchema(genericSchema, packer.Default(genericSchema), unpackGenericRemoteRepo, constructor) + return mkResourceSchema( + GenericSchemas, + packer.Default(GenericSchemas[CurrentSchemaVersion]), + unpackGenericRemoteRepo, + constructor, + ) } -var BasicRepoSchema = func(packageType string, isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps(BaseRemoteRepoSchema(isResource), repository.RepoLayoutRefSchema(rclass, packageType)) +var BasicSchema = func(packageType string) map[string]*schema.Schema { + return lo.Assign( + baseSchema, + repository.RepoLayoutRefSchema(Rclass, packageType), + ) } func ResourceArtifactoryRemoteBasicRepository(packageType string) *schema.Resource { constructor := func() (interface{}, error) { - repoLayout, err := repository.GetDefaultRepoLayoutRef(rclass, packageType)() + repoLayout, err := repository.GetDefaultRepoLayoutRef(Rclass, packageType)() if err != nil { return nil, err } return &RepositoryRemoteBaseParams{ PackageType: packageType, - Rclass: rclass, + Rclass: Rclass, RepoLayoutRef: repoLayout.(string), }, nil } @@ -85,7 +88,13 @@ func ResourceArtifactoryRemoteBasicRepository(packageType string) *schema.Resour return repo, repo.Id(), nil } - mergedRemoteRepoSchema := BasicRepoSchema(packageType, true) + basicSchema := BasicSchema(packageType) + basicSchemas := GetSchemas(basicSchema) - return mkResourceSchema(mergedRemoteRepoSchema, packer.Default(mergedRemoteRepoSchema), unpack, constructor) + return mkResourceSchema( + basicSchemas, + packer.Default(basicSchemas[CurrentSchemaVersion]), + unpack, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_go_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_go_repository.go index b3a618b49..5cefd3696 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_go_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_go_repository.go @@ -6,58 +6,60 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const GoPackageType = "go" - type GoRemoteRepo struct { RepositoryRemoteBaseParams VcsGitProvider string `json:"vcsGitProvider"` } -var GoRemoteSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - map[string]*schema.Schema{ - "vcs_git_provider": { - Type: schema.TypeString, - Optional: true, - Default: "ARTIFACTORY", - ValidateDiagFunc: validation.ToDiagFunc(validation.StringInSlice([]string{"GITHUB", "ARTIFACTORY"}, false)), - Description: `Artifactory supports proxying the following Git providers out-of-the-box: GitHub or a remote Artifactory instance. Default value is "ARTIFACTORY".`, - }, +var GoSchema = lo.Assign( + baseSchema, + map[string]*schema.Schema{ + "vcs_git_provider": { + Type: schema.TypeString, + Optional: true, + Default: "ARTIFACTORY", + ValidateDiagFunc: validation.ToDiagFunc(validation.StringInSlice([]string{"GITHUB", "ARTIFACTORY"}, false)), + Description: `Artifactory supports proxying the following Git providers out-of-the-box: GitHub or a remote Artifactory instance. Default value is "ARTIFACTORY".`, }, - repository.RepoLayoutRefSchema(rclass, GoPackageType), - ) -} + }, + repository.RepoLayoutRefSchema(Rclass, repository.GoPackageType), +) + +var GoSchemas = GetSchemas(GoSchema) func ResourceArtifactoryRemoteGoRepository() *schema.Resource { var unpackGoRemoteRepo = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := GoRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, GoPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.GoPackageType), VcsGitProvider: d.GetString("vcs_git_provider", false), } return repo, repo.Id(), nil } constructor := func() (interface{}, error) { - repoLayout, err := repository.GetDefaultRepoLayoutRef(rclass, GoPackageType)() + repoLayout, err := repository.GetDefaultRepoLayoutRef(Rclass, repository.GoPackageType)() if err != nil { return nil, err } return &GoRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: GoPackageType, + Rclass: Rclass, + PackageType: repository.GoPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - goSchema := GoRemoteSchema(true) - - return mkResourceSchema(goSchema, packer.Default(goSchema), unpackGoRemoteRepo, constructor) + return mkResourceSchema( + GoSchemas, + packer.Default(GoSchemas[CurrentSchemaVersion]), + unpackGoRemoteRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_helm_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_helm_repository.go index d83acbcfd..8bdf0cc79 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_helm_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_helm_repository.go @@ -7,51 +7,50 @@ import ( "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const HelmPackageType = "helm" - -var HelmRemoteSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - map[string]*schema.Schema{ - "helm_charts_base_url": { - Type: schema.TypeString, - Optional: true, - Default: "", - ValidateDiagFunc: validation.ToDiagFunc( - validation.Any( - validation.IsURLWithScheme([]string{"http", "https", "oci"}), - validation.StringIsEmpty, - ), +var HelmSchema = lo.Assign( + baseSchema, + map[string]*schema.Schema{ + "helm_charts_base_url": { + Type: schema.TypeString, + Optional: true, + Default: "", + ValidateDiagFunc: validation.ToDiagFunc( + validation.Any( + validation.IsURLWithScheme([]string{"http", "https", "oci"}), + validation.StringIsEmpty, ), - Description: "Base URL for the translation of chart source URLs in the index.yaml of virtual repos. " + - "Artifactory will only translate URLs matching the index.yamls hostname or URLs starting with this base url. " + - "Support http/https/oci protocol scheme.", - }, - "external_dependencies_enabled": { - Type: schema.TypeBool, - Default: false, - Optional: true, - Description: "When set, external dependencies are rewritten. External Dependency Rewrite in the UI.", - }, - // We need to set default to ["**"] once we migrate to plugin-framework. SDKv2 doesn't support that. - "external_dependencies_patterns": { - Type: schema.TypeList, - Optional: true, - ForceNew: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - RequiredWith: []string{"external_dependencies_enabled"}, - Description: "An allow list of Ant-style path patterns that determine which remote VCS roots Artifactory will " + - "follow to download remote modules from, when presented with 'go-import' meta tags in the remote repository response." + - "Default value in UI is empty. This attribute must be set together with `external_dependencies_enabled = true`", + ), + Description: "Base URL for the translation of chart source URLs in the index.yaml of virtual repos. " + + "Artifactory will only translate URLs matching the index.yamls hostname or URLs starting with this base url. " + + "Support http/https/oci protocol scheme.", + }, + "external_dependencies_enabled": { + Type: schema.TypeBool, + Default: false, + Optional: true, + Description: "When set, external dependencies are rewritten. External Dependency Rewrite in the UI.", + }, + // We need to set default to ["**"] once we migrate to plugin-framework. SDKv2 doesn't support that. + "external_dependencies_patterns": { + Type: schema.TypeList, + Optional: true, + ForceNew: true, + Elem: &schema.Schema{ + Type: schema.TypeString, }, + RequiredWith: []string{"external_dependencies_enabled"}, + Description: "An allow list of Ant-style path patterns that determine which remote VCS roots Artifactory will " + + "follow to download remote modules from, when presented with 'go-import' meta tags in the remote repository response." + + "Default value in UI is empty. This attribute must be set together with `external_dependencies_enabled = true`", }, - repository.RepoLayoutRefSchema(rclass, HelmPackageType), - ) -} + }, + repository.RepoLayoutRefSchema(Rclass, repository.HelmPackageType), +) + +var HelmSchemas = GetSchemas(HelmSchema) type HelmRemoteRepo struct { RepositoryRemoteBaseParams @@ -64,7 +63,7 @@ func ResourceArtifactoryRemoteHelmRepository() *schema.Resource { var unpackHelmRemoteRepo = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := HelmRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, HelmPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.HelmPackageType), HelmChartsBaseURL: d.GetString("helm_charts_base_url", false), ExternalDependenciesEnabled: d.GetBool("external_dependencies_enabled", false), ExternalDependenciesPatterns: d.GetList("external_dependencies_patterns"), @@ -72,11 +71,9 @@ func ResourceArtifactoryRemoteHelmRepository() *schema.Resource { return repo, repo.Id(), nil } - helmSchema := HelmRemoteSchema(true) - helmRemoteRepoPacker := packer.Universal( predicate.All( - predicate.SchemaHasKey(helmSchema), + predicate.SchemaHasKey(HelmSchemas[CurrentSchemaVersion]), predicate.NoPassword, ), ) @@ -84,11 +81,16 @@ func ResourceArtifactoryRemoteHelmRepository() *schema.Resource { constructor := func() (interface{}, error) { return &HelmRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: HelmPackageType, + Rclass: Rclass, + PackageType: repository.HelmPackageType, }, }, nil } - return mkResourceSchema(helmSchema, helmRemoteRepoPacker, unpackHelmRemoteRepo, constructor) + return mkResourceSchema( + HelmSchemas, + helmRemoteRepoPacker, + unpackHelmRemoteRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_helmoci_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_helmoci_repository.go index c94b69548..09a7c9559 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_helmoci_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_helmoci_repository.go @@ -6,52 +6,51 @@ import ( "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const HelmOciPackageType = "helmoci" - -var HelmOciRemoteSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - map[string]*schema.Schema{ - "external_dependencies_enabled": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "Also known as 'Foreign Layers Caching' on the UI, default is `false`.", - }, - "enable_token_authentication": { - Type: schema.TypeBool, - Optional: true, - Computed: true, - Description: "Enable token (Bearer) based authentication.", - }, - // We need to set default to ["**"] once we migrate to plugin-framework. SDKv2 doesn't support that. - "external_dependencies_patterns": { - Type: schema.TypeList, - Optional: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - RequiredWith: []string{"external_dependencies_enabled"}, - Description: "Optional include patterns to match external URLs. Ant-style path expressions are supported (*, **, ?). " + - "For example, specifying `**/github.com/**` will only allow downloading foreign layers from github.com host." + - "By default, this is set to '**' in the UI, which means that foreign layers may be downloaded from any external host." + - "Due to Terraform SDKv2 limitations, we can't set the default value for the list." + - "This value must be assigned to the attribute manually, if user don't specify any other non-default values." + - "This attribute must be set together with `external_dependencies_enabled = true`", - }, - "project_id": { - Type: schema.TypeString, - Optional: true, - Description: "Use this attribute to enter your GCR, GAR Project Id to limit the scope of this remote repo to a specific " + - "project in your third-party registry. When leaving this field blank or unset, remote repositories that support project id " + - "will default to their default project as you have set up in your account.", +var HelmOCISchema = lo.Assign( + baseSchema, + map[string]*schema.Schema{ + "external_dependencies_enabled": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Also known as 'Foreign Layers Caching' on the UI, default is `false`.", + }, + "enable_token_authentication": { + Type: schema.TypeBool, + Optional: true, + Computed: true, + Description: "Enable token (Bearer) based authentication.", + }, + // We need to set default to ["**"] once we migrate to plugin-framework. SDKv2 doesn't support that. + "external_dependencies_patterns": { + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeString, }, + RequiredWith: []string{"external_dependencies_enabled"}, + Description: "Optional include patterns to match external URLs. Ant-style path expressions are supported (*, **, ?). " + + "For example, specifying `**/github.com/**` will only allow downloading foreign layers from github.com host." + + "By default, this is set to '**' in the UI, which means that foreign layers may be downloaded from any external host." + + "Due to Terraform SDKv2 limitations, we can't set the default value for the list." + + "This value must be assigned to the attribute manually, if user don't specify any other non-default values." + + "This attribute must be set together with `external_dependencies_enabled = true`", }, - repository.RepoLayoutRefSchema(rclass, HelmOciPackageType), - ) -} + "project_id": { + Type: schema.TypeString, + Optional: true, + Description: "Use this attribute to enter your GCR, GAR Project Id to limit the scope of this remote repo to a specific " + + "project in your third-party registry. When leaving this field blank or unset, remote repositories that support project id " + + "will default to their default project as you have set up in your account.", + }, + }, + repository.RepoLayoutRefSchema(Rclass, repository.HelmOCIPackageType), +) + +var HelmOCISchemas = GetSchemas(HelmOCISchema) type HelmOciRemoteRepo struct { RepositoryRemoteBaseParams @@ -65,7 +64,7 @@ func ResourceArtifactoryRemoteHelmOciRepository() *schema.Resource { var unpackRemoteRepo = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := HelmOciRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, HelmOciPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.HelmOCIPackageType), EnableTokenAuthentication: d.GetBool("enable_token_authentication", false), ExternalDependenciesEnabled: d.GetBool("external_dependencies_enabled", false), ExternalDependenciesPatterns: d.GetList("external_dependencies_patterns"), @@ -74,11 +73,9 @@ func ResourceArtifactoryRemoteHelmOciRepository() *schema.Resource { return repo, repo.Id(), nil } - schema := HelmOciRemoteSchema(true) - remoteRepoPacker := packer.Universal( predicate.All( - predicate.SchemaHasKey(schema), + predicate.SchemaHasKey(HelmOCISchemas[CurrentSchemaVersion]), predicate.NoPassword, ), ) @@ -86,11 +83,16 @@ func ResourceArtifactoryRemoteHelmOciRepository() *schema.Resource { constructor := func() (interface{}, error) { return &HelmOciRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: HelmOciPackageType, + Rclass: Rclass, + PackageType: repository.HelmOCIPackageType, }, }, nil } - return mkResourceSchema(schema, remoteRepoPacker, unpackRemoteRepo, constructor) + return mkResourceSchema( + HelmOCISchemas, + remoteRepoPacker, + unpackRemoteRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_huggingfaceml_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_huggingfaceml_repository.go index c2e3fa7d1..454d61925 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_huggingfaceml_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_huggingfaceml_repository.go @@ -4,54 +4,55 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const HuggingFacePackageType = "huggingfaceml" - type HuggingFaceRepo struct { RepositoryRemoteBaseParams } -var HuggingFaceSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - map[string]*schema.Schema{ - "url": { - Type: schema.TypeString, - Optional: true, - Default: "https://huggingface.co", - Description: "The remote repo URL. Default to 'https://huggingface.co'", - }, +var HuggingFaceSchema = lo.Assign( + baseSchema, + map[string]*schema.Schema{ + "url": { + Type: schema.TypeString, + Optional: true, + Default: "https://huggingface.co", + Description: "The remote repo URL. Default to 'https://huggingface.co'", }, - repository.RepoLayoutRefSchema(rclass, HuggingFacePackageType), - ) -} + }, + repository.RepoLayoutRefSchema(Rclass, repository.HuggingFacePackageType), +) + +var HuggingFaceSchemas = GetSchemas(HuggingFaceSchema) func ResourceArtifactoryRemoteHuggingFaceRepository() *schema.Resource { var unpackRepo = func(s *schema.ResourceData) (interface{}, string, error) { repo := HuggingFaceRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, HuggingFacePackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.HuggingFacePackageType), } return repo, repo.Id(), nil } constructor := func() (interface{}, error) { - repoLayout, err := repository.GetDefaultRepoLayoutRef(rclass, HuggingFacePackageType)() + repoLayout, err := repository.GetDefaultRepoLayoutRef(Rclass, repository.HuggingFacePackageType)() if err != nil { return nil, err } return &HuggingFaceRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: HuggingFacePackageType, + Rclass: Rclass, + PackageType: repository.HuggingFacePackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - huggingFaceSchema := HuggingFaceSchema(true) - - return mkResourceSchema(huggingFaceSchema, packer.Default(huggingFaceSchema), unpackRepo, constructor) + return mkResourceSchema( + HuggingFaceSchemas, + packer.Default(HuggingFaceSchemas[CurrentSchemaVersion]), + unpackRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_java_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_java_repository.go index 05517d3f3..9c5b6cfc3 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_java_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_java_repository.go @@ -6,7 +6,8 @@ import ( ) func ResourceArtifactoryRemoteJavaRepository(packageType string, suppressPom bool) *schema.Resource { - javaRemoteSchema := JavaRemoteSchema(true, packageType, suppressPom) + javaSchema := JavaSchema(packageType, suppressPom) + javaSchemas := GetSchemas(javaSchema) var unpackJavaRemoteRepo = func(data *schema.ResourceData) (interface{}, string, error) { repo := UnpackJavaRemoteRepo(data, packageType) @@ -16,12 +17,17 @@ func ResourceArtifactoryRemoteJavaRepository(packageType string, suppressPom boo constructor := func() (interface{}, error) { return &JavaRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, + Rclass: Rclass, PackageType: packageType, }, SuppressPomConsistencyChecks: suppressPom, }, nil } - return mkResourceSchema(javaRemoteSchema, packer.Default(javaRemoteSchema), unpackJavaRemoteRepo, constructor) + return mkResourceSchema( + javaSchemas, + packer.Default(javaSchemas[CurrentSchemaVersion]), + unpackJavaRemoteRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_maven_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_maven_repository.go index d4bc3cc3e..10d25a9cc 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_maven_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_maven_repository.go @@ -9,29 +9,55 @@ import ( "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/unpacker" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const MavenPackageType = "maven" +const MavenCurrentSchemaVersion = 2 type MavenRemoteRepo struct { JavaRemoteRepo RepositoryCurationParams } -var MavenRemoteSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - JavaRemoteSchema(isResource, MavenPackageType, false), - CurationRemoteRepoSchema, - ) +// Old schema, the one needs to be migrated (seconds -> secs) +var mavenSchemaV1 = lo.Assign( + JavaSchema(repository.MavenPackageType, false), + map[string]*schema.Schema{ + "metadata_retrieval_timeout_seconds": { + Type: schema.TypeInt, + Optional: true, + Default: 60, + ValidateFunc: validation.IntAtLeast(0), + Description: "This value refers to the number of seconds to cache metadata files before checking for newer versions on remote server. A value of 0 indicates no caching. Cannot be larger than retrieval_cache_period_seconds attribute. Default value is 60.", + }, + }, +) + +var mavenSchemaV2 = lo.Assign( + JavaSchema(repository.MavenPackageType, false), + CurationRemoteRepoSchema, +) + +var MavenSchemas = map[int16]map[string]*schema.Schema{ + 0: lo.Assign( + baseSchemaV1, + mavenSchemaV1, + ), + 1: lo.Assign( + baseSchemaV1, + mavenSchemaV1, + ), + 2: lo.Assign( + baseSchemaV2, + mavenSchemaV2, + ), } func ResourceArtifactoryRemoteMavenRepository() *schema.Resource { - mavenRemoteSchema := MavenRemoteSchema(true) - var unpackMavenRemoteRepo = func(data *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: data} repo := MavenRemoteRepo{ - JavaRemoteRepo: UnpackJavaRemoteRepo(data, MavenPackageType), + JavaRemoteRepo: UnpackJavaRemoteRepo(data, repository.MavenPackageType), RepositoryCurationParams: RepositoryCurationParams{ Curated: d.GetBool("curated", false), }, @@ -43,8 +69,8 @@ func ResourceArtifactoryRemoteMavenRepository() *schema.Resource { return &MavenRemoteRepo{ JavaRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: MavenPackageType, + Rclass: Rclass, + PackageType: repository.MavenPackageType, }, SuppressPomConsistencyChecks: false, }, @@ -54,48 +80,40 @@ func ResourceArtifactoryRemoteMavenRepository() *schema.Resource { }, nil } - return mkResourceSchemaMaven(mavenRemoteSchema, packer.Default(mavenRemoteSchema), unpackMavenRemoteRepo, constructor) + return mkResourceSchemaMaven( + MavenSchemas, + packer.Default(MavenSchemas[MavenCurrentSchemaVersion]), + unpackMavenRemoteRepo, + constructor, + ) } var resourceMavenV1 = &schema.Resource{ - Schema: mavenRemoteSchemaV1, + Schema: mavenSchemaV1, } -// Old schema, the one needs to be migrated (seconds -> secs) -var mavenRemoteSchemaV1 = utilsdk.MergeMaps( - JavaRemoteSchema(true, MavenPackageType, false), - map[string]*schema.Schema{ - "metadata_retrieval_timeout_seconds": { - Type: schema.TypeInt, - Optional: true, - Default: 60, - ValidateFunc: validation.IntAtLeast(0), - Description: "This value refers to the number of seconds to cache metadata files before checking for newer versions on remote server. A value of 0 indicates no caching. Cannot be larger than retrieval_cache_period_seconds attribute. Default value is 60.", - }, - }, -) - -func mkResourceSchemaMaven(skeema map[string]*schema.Schema, packer packer.PackFunc, unpack unpacker.UnpackFunc, constructor repository.Constructor) *schema.Resource { +func mkResourceSchemaMaven(skeemas map[int16]map[string]*schema.Schema, packer packer.PackFunc, unpack unpacker.UnpackFunc, constructor repository.Constructor) *schema.Resource { var reader = repository.MkRepoRead(packer, constructor) return &schema.Resource{ CreateContext: repository.MkRepoCreate(unpack, reader), ReadContext: reader, UpdateContext: repository.MkRepoUpdate(unpack, reader), DeleteContext: repository.DeleteRepo, + Importer: &schema.ResourceImporter{ StateContext: schema.ImportStatePassthroughContext, }, StateUpgraders: []schema.StateUpgrader{ { - Type: resourceMavenV1.CoreConfigSchema().ImpliedType(), + Type: repository.Resource(skeemas[1]).CoreConfigSchema().ImpliedType(), Upgrade: ResourceMavenStateUpgradeV1, Version: 1, }, }, - Schema: skeema, - SchemaVersion: 2, + Schema: skeemas[MavenCurrentSchemaVersion], + SchemaVersion: MavenCurrentSchemaVersion, CustomizeDiff: repository.ProjectEnvironmentsDiff, } } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_npm_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_npm_repository.go index 2cd3d876d..fa08752bd 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_npm_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_npm_repository.go @@ -5,6 +5,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type NpmRemoteRepo struct { @@ -12,21 +13,19 @@ type NpmRemoteRepo struct { RepositoryCurationParams } -const NpmPackageType = "npm" +var NPMSchema = lo.Assign( + baseSchema, + CurationRemoteRepoSchema, + repository.RepoLayoutRefSchema(Rclass, repository.NPMPackageType), +) -var NpmRemoteSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - CurationRemoteRepoSchema, - repository.RepoLayoutRefSchema(rclass, NpmPackageType), - ) -} +var NPMSchemas = GetSchemas(NPMSchema) func ResourceArtifactoryRemoteNpmRepository() *schema.Resource { var unpack = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := NpmRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, NpmPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.NPMPackageType), RepositoryCurationParams: RepositoryCurationParams{ Curated: d.GetBool("curated", false), }, @@ -35,21 +34,24 @@ func ResourceArtifactoryRemoteNpmRepository() *schema.Resource { } constructor := func() (interface{}, error) { - repoLayout, err := repository.GetDefaultRepoLayoutRef(rclass, NpmPackageType)() + repoLayout, err := repository.GetDefaultRepoLayoutRef(Rclass, repository.NPMPackageType)() if err != nil { return nil, err } return &NpmRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: NpmPackageType, + Rclass: Rclass, + PackageType: repository.NPMPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - npmSchema := NpmRemoteSchema(true) - - return mkResourceSchema(npmSchema, packer.Default(npmSchema), unpack, constructor) + return mkResourceSchema( + NPMSchemas, + packer.Default(NPMSchemas[CurrentSchemaVersion]), + unpack, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_nuget_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_nuget_repository.go index a668b5b7b..27819a600 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_nuget_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_nuget_repository.go @@ -6,6 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type NugetRemoteRepo struct { @@ -17,55 +18,53 @@ type NugetRemoteRepo struct { SymbolServerUrl string `json:"symbolServerUrl"` } -const NugetPackageType = "nuget" +var NugetSchema = lo.Assign( + baseSchema, + map[string]*schema.Schema{ + "feed_context_path": { + Type: schema.TypeString, + Optional: true, + Default: "api/v2", + Description: `When proxying a remote NuGet repository, customize feed resource location using this attribute. Default value is 'api/v2'.`, + }, + "download_context_path": { + Type: schema.TypeString, + Optional: true, + Default: "api/v2/package", + ValidateDiagFunc: validation.ToDiagFunc(validation.StringIsNotEmpty), + Description: `The context path prefix through which NuGet downloads are served. Default value is 'api/v2/package'.`, + }, + "v3_feed_url": { + Type: schema.TypeString, + Optional: true, + Default: "https://api.nuget.org/v3/index.json", + ValidateDiagFunc: validation.ToDiagFunc(validation.Any(validation.IsURLWithHTTPorHTTPS, validation.StringIsEmpty)), + Description: `The URL to the NuGet v3 feed. Default value is 'https://api.nuget.org/v3/index.json'.`, + }, + "force_nuget_authentication": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: `Force basic authentication credentials in order to use this repository. Default value is 'false'.`, + }, + "symbol_server_url": { + Type: schema.TypeString, + Optional: true, + Default: "https://symbols.nuget.org/download/symbols", + ValidateDiagFunc: validation.ToDiagFunc(validation.Any(validation.IsURLWithHTTPorHTTPS, validation.StringIsEmpty)), + Description: `NuGet symbol server URL.`, + }, + }, repository.RepoLayoutRefSchema(Rclass, repository.NugetPackageType), +) -var NugetRemoteSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - map[string]*schema.Schema{ - "feed_context_path": { - Type: schema.TypeString, - Optional: true, - Default: "api/v2", - Description: `When proxying a remote NuGet repository, customize feed resource location using this attribute. Default value is 'api/v2'.`, - }, - "download_context_path": { - Type: schema.TypeString, - Optional: true, - Default: "api/v2/package", - ValidateDiagFunc: validation.ToDiagFunc(validation.StringIsNotEmpty), - Description: `The context path prefix through which NuGet downloads are served. Default value is 'api/v2/package'.`, - }, - "v3_feed_url": { - Type: schema.TypeString, - Optional: true, - Default: "https://api.nuget.org/v3/index.json", - ValidateDiagFunc: validation.ToDiagFunc(validation.Any(validation.IsURLWithHTTPorHTTPS, validation.StringIsEmpty)), - Description: `The URL to the NuGet v3 feed. Default value is 'https://api.nuget.org/v3/index.json'.`, - }, - "force_nuget_authentication": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: `Force basic authentication credentials in order to use this repository. Default value is 'false'.`, - }, - "symbol_server_url": { - Type: schema.TypeString, - Optional: true, - Default: "https://symbols.nuget.org/download/symbols", - ValidateDiagFunc: validation.ToDiagFunc(validation.Any(validation.IsURLWithHTTPorHTTPS, validation.StringIsEmpty)), - Description: `NuGet symbol server URL.`, - }, - }, repository.RepoLayoutRefSchema(rclass, NugetPackageType), - ) -} +var NugetSchemas = GetSchemas(NugetSchema) func ResourceArtifactoryRemoteNugetRepository() *schema.Resource { var unpackNugetRemoteRepo = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := NugetRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, NugetPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.NugetPackageType), FeedContextPath: d.GetString("feed_context_path", false), DownloadContextPath: d.GetString("download_context_path", false), V3FeedUrl: d.GetString("v3_feed_url", false), @@ -76,21 +75,24 @@ func ResourceArtifactoryRemoteNugetRepository() *schema.Resource { } constructor := func() (interface{}, error) { - repoLayout, err := repository.GetDefaultRepoLayoutRef(rclass, NugetPackageType)() + repoLayout, err := repository.GetDefaultRepoLayoutRef(Rclass, repository.NugetPackageType)() if err != nil { return nil, err } return &NugetRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: NugetPackageType, + Rclass: Rclass, + PackageType: repository.NugetPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - nugetSchema := NugetRemoteSchema(true) - - return mkResourceSchema(nugetSchema, packer.Default(nugetSchema), unpackNugetRemoteRepo, constructor) + return mkResourceSchema( + NugetSchemas, + packer.Default(NugetSchemas[CurrentSchemaVersion]), + unpackNugetRemoteRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_oci_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_oci_repository.go index 440dc8a50..ad1bbed7a 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_oci_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_oci_repository.go @@ -6,52 +6,51 @@ import ( "github.com/jfrog/terraform-provider-shared/packer" "github.com/jfrog/terraform-provider-shared/predicate" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const OciPackageType = "oci" - -var OciRemoteSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - map[string]*schema.Schema{ - "external_dependencies_enabled": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "Also known as 'Foreign Layers Caching' on the UI, default is `false`.", - }, - "enable_token_authentication": { - Type: schema.TypeBool, - Optional: true, - Computed: true, - Description: "Enable token (Bearer) based authentication.", - }, - // We need to set default to ["**"] once we migrate to plugin-framework. SDKv2 doesn't support that. - "external_dependencies_patterns": { - Type: schema.TypeList, - Optional: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - RequiredWith: []string{"external_dependencies_enabled"}, - Description: "Optional include patterns to match external URLs. Ant-style path expressions are supported (*, **, ?). " + - "For example, specifying `**/github.com/**` will only allow downloading foreign layers from github.com host." + - "By default, this is set to '**' in the UI, which means that foreign layers may be downloaded from any external host." + - "Due to Terraform SDKv2 limitations, we can't set the default value for the list." + - "This value must be assigned to the attribute manually, if user don't specify any other non-default values." + - "This attribute must be set together with `external_dependencies_enabled = true`", - }, - "project_id": { - Type: schema.TypeString, - Optional: true, - Description: "Use this attribute to enter your GCR, GAR Project Id to limit the scope of this remote repo to a specific " + - "project in your third-party registry. When leaving this field blank or unset, remote repositories that support project id " + - "will default to their default project as you have set up in your account.", +var OCISchema = lo.Assign( + baseSchema, + map[string]*schema.Schema{ + "external_dependencies_enabled": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Also known as 'Foreign Layers Caching' on the UI, default is `false`.", + }, + "enable_token_authentication": { + Type: schema.TypeBool, + Optional: true, + Computed: true, + Description: "Enable token (Bearer) based authentication.", + }, + // We need to set default to ["**"] once we migrate to plugin-framework. SDKv2 doesn't support that. + "external_dependencies_patterns": { + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeString, }, + RequiredWith: []string{"external_dependencies_enabled"}, + Description: "Optional include patterns to match external URLs. Ant-style path expressions are supported (*, **, ?). " + + "For example, specifying `**/github.com/**` will only allow downloading foreign layers from github.com host." + + "By default, this is set to '**' in the UI, which means that foreign layers may be downloaded from any external host." + + "Due to Terraform SDKv2 limitations, we can't set the default value for the list." + + "This value must be assigned to the attribute manually, if user don't specify any other non-default values." + + "This attribute must be set together with `external_dependencies_enabled = true`", }, - repository.RepoLayoutRefSchema(rclass, OciPackageType), - ) -} + "project_id": { + Type: schema.TypeString, + Optional: true, + Description: "Use this attribute to enter your GCR, GAR Project Id to limit the scope of this remote repo to a specific " + + "project in your third-party registry. When leaving this field blank or unset, remote repositories that support project id " + + "will default to their default project as you have set up in your account.", + }, + }, + repository.RepoLayoutRefSchema(Rclass, repository.OCIPackageType), +) + +var OCISchemas = GetSchemas(OCISchema) type OciRemoteRepo struct { RepositoryRemoteBaseParams @@ -65,7 +64,7 @@ func ResourceArtifactoryRemoteOciRepository() *schema.Resource { var unpackOciRemoteRepo = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := OciRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, OciPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.OCIPackageType), EnableTokenAuthentication: d.GetBool("enable_token_authentication", false), ExternalDependenciesEnabled: d.GetBool("external_dependencies_enabled", false), ExternalDependenciesPatterns: d.GetList("external_dependencies_patterns"), @@ -74,11 +73,9 @@ func ResourceArtifactoryRemoteOciRepository() *schema.Resource { return repo, repo.Id(), nil } - schema := OciRemoteSchema(true) - ociRemoteRepoPacker := packer.Universal( predicate.All( - predicate.SchemaHasKey(schema), + predicate.SchemaHasKey(OCISchemas[CurrentSchemaVersion]), predicate.NoPassword, ), ) @@ -86,11 +83,16 @@ func ResourceArtifactoryRemoteOciRepository() *schema.Resource { constructor := func() (interface{}, error) { return &OciRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: OciPackageType, + Rclass: Rclass, + PackageType: repository.OCIPackageType, }, }, nil } - return mkResourceSchema(schema, ociRemoteRepoPacker, unpackOciRemoteRepo, constructor) + return mkResourceSchema( + OCISchemas, + ociRemoteRepoPacker, + unpackOciRemoteRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_pypi_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_pypi_repository.go index 1ef25d732..11d14c2b4 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_pypi_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_pypi_repository.go @@ -6,10 +6,9 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const PypiPackageType = "pypi" - type PypiRemoteRepo struct { RepositoryRemoteBaseParams RepositoryCurationParams @@ -17,36 +16,36 @@ type PypiRemoteRepo struct { PypiRepositorySuffix string `json:"pyPIRepositorySuffix"` } -var PypiRemoteSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - CurationRemoteRepoSchema, - map[string]*schema.Schema{ - "pypi_registry_url": { - Type: schema.TypeString, - Optional: true, - Default: "https://pypi.org", - ValidateDiagFunc: validation.ToDiagFunc(validation.IsURLWithHTTPorHTTPS), - Description: "To configure the remote repo to proxy public external PyPI repository, or a PyPI repository hosted on another Artifactory server. See JFrog Pypi documentation for the usage details. Default value is 'https://pypi.org'.", - }, - "pypi_repository_suffix": { - Type: schema.TypeString, - Optional: true, - Default: "simple", - ValidateDiagFunc: validation.ToDiagFunc(validation.StringIsNotEmpty), - Description: "Usually should be left as a default for 'simple', unless the remote is a PyPI server that has custom registry suffix, like +simple in DevPI. Default value is 'simple'.", - }, +var PyPiSchema = lo.Assign( + baseSchema, + CurationRemoteRepoSchema, + map[string]*schema.Schema{ + "pypi_registry_url": { + Type: schema.TypeString, + Optional: true, + Default: "https://pypi.org", + ValidateDiagFunc: validation.ToDiagFunc(validation.IsURLWithHTTPorHTTPS), + Description: "To configure the remote repo to proxy public external PyPI repository, or a PyPI repository hosted on another Artifactory server. See JFrog Pypi documentation for the usage details. Default value is 'https://pypi.org'.", }, - repository.RepoLayoutRefSchema(rclass, PypiPackageType), - ) -} + "pypi_repository_suffix": { + Type: schema.TypeString, + Optional: true, + Default: "simple", + ValidateDiagFunc: validation.ToDiagFunc(validation.StringIsNotEmpty), + Description: "Usually should be left as a default for 'simple', unless the remote is a PyPI server that has custom registry suffix, like +simple in DevPI. Default value is 'simple'.", + }, + }, + repository.RepoLayoutRefSchema(Rclass, repository.PyPiPackageType), +) + +var PyPiSchemas = GetSchemas(PyPiSchema) func ResourceArtifactoryRemotePypiRepository() *schema.Resource { var unpackPypiRemoteRepo = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := PypiRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, PypiPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.PyPiPackageType), RepositoryCurationParams: RepositoryCurationParams{ Curated: d.GetBool("curated", false), }, @@ -59,13 +58,16 @@ func ResourceArtifactoryRemotePypiRepository() *schema.Resource { constructor := func() (interface{}, error) { return &PypiRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: PypiPackageType, + Rclass: Rclass, + PackageType: repository.PyPiPackageType, }, }, nil } - pypiSchema := PypiRemoteSchema(true) - - return mkResourceSchema(pypiSchema, packer.Default(pypiSchema), unpackPypiRemoteRepo, constructor) + return mkResourceSchema( + PyPiSchemas, + packer.Default(PyPiSchemas[CurrentSchemaVersion]), + unpackPypiRemoteRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_terraform_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_terraform_repository.go index 7cbe77cf5..039d5ba0e 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_terraform_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_terraform_repository.go @@ -6,6 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type TerraformRemoteRepo struct { @@ -14,38 +15,36 @@ type TerraformRemoteRepo struct { TerraformProvidersUrl string `json:"terraformProvidersUrl"` } -const TerraformPackageType = "terraform" - -var TerraformRemoteSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - map[string]*schema.Schema{ - "terraform_registry_url": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: validation.IsURLWithHTTPorHTTPS, - Default: "https://registry.terraform.io", - Description: "The base URL of the registry API. When using Smart Remote Repositories, set the URL to" + - " /api/terraform/repokey. Default value in UI is https://registry.terraform.io", - }, - "terraform_providers_url": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: validation.IsURLWithHTTPorHTTPS, - Default: "https://releases.hashicorp.com", - Description: "The base URL of the Provider's storage API. When using Smart remote repositories, set " + - "the URL to /api/terraform/repokey/providers. Default value in UI is https://releases.hashicorp.com", - }, +var TerraformSchema = lo.Assign( + baseSchema, + map[string]*schema.Schema{ + "terraform_registry_url": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.IsURLWithHTTPorHTTPS, + Default: "https://registry.terraform.io", + Description: "The base URL of the registry API. When using Smart Remote Repositories, set the URL to" + + " /api/terraform/repokey. Default value in UI is https://registry.terraform.io", }, - repository.RepoLayoutRefSchema(rclass, TerraformPackageType), - ) -} + "terraform_providers_url": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.IsURLWithHTTPorHTTPS, + Default: "https://releases.hashicorp.com", + Description: "The base URL of the Provider's storage API. When using Smart remote repositories, set " + + "the URL to /api/terraform/repokey/providers. Default value in UI is https://releases.hashicorp.com", + }, + }, + repository.RepoLayoutRefSchema(Rclass, repository.TerraformPackageType), +) + +var TerraformSchemas = GetSchemas(TerraformSchema) func ResourceArtifactoryRemoteTerraformRepository() *schema.Resource { var unpackTerraformRemoteRepo = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := TerraformRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, TerraformPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.TerraformPackageType), TerraformRegistryUrl: d.GetString("terraform_registry_url", false), TerraformProvidersUrl: d.GetString("terraform_providers_url", false), } @@ -55,13 +54,16 @@ func ResourceArtifactoryRemoteTerraformRepository() *schema.Resource { constructor := func() (interface{}, error) { return &TerraformRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: TerraformPackageType, + Rclass: Rclass, + PackageType: repository.TerraformPackageType, }, }, nil } - terraformSchema := TerraformRemoteSchema(true) - - return mkResourceSchema(terraformSchema, packer.Default(terraformSchema), unpackTerraformRemoteRepo, constructor) + return mkResourceSchema( + TerraformSchemas, + packer.Default(TerraformSchemas[CurrentSchemaVersion]), + unpackTerraformRemoteRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_vcs_repository.go b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_vcs_repository.go index 143f87490..bb0b61061 100644 --- a/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_vcs_repository.go +++ b/pkg/artifactory/resource/repository/remote/resource_artifactory_remote_vcs_repository.go @@ -5,6 +5,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type VcsRemoteRepo struct { @@ -13,31 +14,29 @@ type VcsRemoteRepo struct { MaxUniqueSnapshots int `json:"maxUniqueSnapshots"` } -const VcsPackageType = "vcs" - -var VcsRemoteSchema = func(isResource bool) map[string]*schema.Schema { - return utilsdk.MergeMaps( - BaseRemoteRepoSchema(isResource), - VcsRemoteRepoSchema, - map[string]*schema.Schema{ - "max_unique_snapshots": { - Type: schema.TypeInt, - Optional: true, - Default: 0, - Description: "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.", - }, +var VCSSchema = lo.Assign( + baseSchema, + VcsRemoteRepoSchema, + map[string]*schema.Schema{ + "max_unique_snapshots": { + Type: schema.TypeInt, + Optional: true, + Default: 0, + Description: "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.", }, - repository.RepoLayoutRefSchema(rclass, VcsPackageType), - ) -} + }, + repository.RepoLayoutRefSchema(Rclass, repository.VCSPackageType), +) + +var VCSSchemas = GetSchemas(VCSSchema) func ResourceArtifactoryRemoteVcsRepository() *schema.Resource { var UnpackVcsRemoteRepo = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := VcsRemoteRepo{ - RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, VcsPackageType), + RepositoryRemoteBaseParams: UnpackBaseRemoteRepo(s, repository.VCSPackageType), RepositoryVcsParams: UnpackVcsRemoteRepo(s), MaxUniqueSnapshots: d.GetInt("max_unique_snapshots", false), } @@ -45,21 +44,24 @@ func ResourceArtifactoryRemoteVcsRepository() *schema.Resource { } constructor := func() (interface{}, error) { - repoLayout, err := repository.GetDefaultRepoLayoutRef(rclass, VcsPackageType)() + repoLayout, err := repository.GetDefaultRepoLayoutRef(Rclass, repository.VCSPackageType)() if err != nil { return nil, err } return &VcsRemoteRepo{ RepositoryRemoteBaseParams: RepositoryRemoteBaseParams{ - Rclass: rclass, - PackageType: VcsPackageType, + Rclass: Rclass, + PackageType: repository.VCSPackageType, RepoLayoutRef: repoLayout.(string), }, }, nil } - vcsSchema := VcsRemoteSchema(true) - - return mkResourceSchema(vcsSchema, packer.Default(vcsSchema), UnpackVcsRemoteRepo, constructor) + return mkResourceSchema( + VCSSchemas, + packer.Default(VCSSchemas[CurrentSchemaVersion]), + UnpackVcsRemoteRepo, + constructor, + ) } diff --git a/pkg/artifactory/resource/repository/repository.go b/pkg/artifactory/resource/repository/repository.go index 7335f67f8..628f753d7 100644 --- a/pkg/artifactory/resource/repository/repository.go +++ b/pkg/artifactory/resource/repository/repository.go @@ -2,6 +2,7 @@ package repository import ( "context" + "encoding/json" "fmt" "net/http" @@ -21,7 +22,49 @@ import ( "github.com/jfrog/terraform-provider-shared/validator" ) -var BaseRepoSchema = map[string]*schema.Schema{ +const ( + AlpinePackageType = "alpine" + AnsiblePackageType = "ansible" + BowerPackageType = "bower" + CargoPackageType = "cargo" + ChefPackageType = "chef" + CocoapodsPackageType = "cocoapods" + ComposerPackageType = "composer" + CondaPackageType = "conda" + ConanPackageType = "conan" + CranPackageType = "cran" + DebianPackageType = "debian" + DockerPackageType = "docker" + GemsPackageType = "gems" + GenericPackageType = "generic" + GitLFSPackageType = "gitlfs" + GoPackageType = "go" + GradlePackageType = "gradle" + HelmPackageType = "helm" + HelmOCIPackageType = "helmoci" + HuggingFacePackageType = "huggingfaceml" + IvyPackageType = "ivy" + MavenPackageType = "maven" + NPMPackageType = "npm" + NugetPackageType = "nuget" + OCIPackageType = "oci" + OpkgPackageType = "opkg" + P2PackageType = "p2" + PubPackageType = "pub" + PuppetPackageType = "puppet" + PyPiPackageType = "pypi" + RPMPackageType = "rpm" + SBTPackageType = "sbt" + SwiftPackageType = "swift" + TerraformBackendPackageType = "terraformbackend" + TerraformModulePackageType = "terraform_module" + TerraformProviderPackageType = "terraform_provider" + TerraformPackageType = "terraform" + VagrantPackageType = "vagrant" + VCSPackageType = "vcs" +) + +var BaseSchemaV1 = map[string]*schema.Schema{ "key": { Type: schema.TypeString, Required: true, @@ -69,13 +112,13 @@ var BaseRepoSchema = map[string]*schema.Schema{ Type: schema.TypeString, Optional: true, Default: "**/*", - Description: "List of comma-separated artifact patterns to include when evaluating artifact requests in the form of x/y/**/z/*. " + - "When used, only artifacts matching one of the include patterns are served. By default, all artifacts are included (**/*).", + Description: "List of comma-separated artifact patterns to include when evaluating artifact requests in the form of `x/y/**/z/*`. " + + "When used, only artifacts matching one of the include patterns are served. By default, all artifacts are included (`**/*`).", }, "excludes_pattern": { Type: schema.TypeString, Optional: true, - Description: "List of artifact patterns to exclude when evaluating artifact requests, in the form of x/y/**/z/*." + + Description: "List of artifact patterns to exclude when evaluating artifact requests, in the form of `x/y/**/z/*`." + "By default no artifacts are excluded.", }, "repo_layout_ref": { @@ -307,7 +350,36 @@ func unassignRepoFromProject(repoKey string, client *resty.Client) error { return err } -func DeleteRepo(_ context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { +type RepositoryFileList struct { + URI string `json:"uri"` + Files []json.RawMessage `json:"files"` +} + +func GetArtifactCount(repoKey string, client *resty.Client) (int, error) { + var fileList RepositoryFileList + + resp, err := client.R(). + SetPathParam("repo_key", repoKey). + SetQueryParams(map[string]string{ + "list": "", + "deep": "1", + "listFolders": "0", + }). + SetResult(&fileList). + Get("artifactory/api/storage/{repo_key}") + + if err != nil { + return -1, err + } + + if resp.IsError() { + return -1, fmt.Errorf("%s", resp.String()) + } + + return len(fileList.Files), nil +} + +func DeleteRepo(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { resp, err := m.(util.ProviderMetadata).Client.R(). AddRetryCondition(client.RetryOnMergeError). SetPathParam("key", d.Id()). @@ -334,13 +406,11 @@ func Retry400(response *resty.Response, _ error) bool { } var GradleLikePackageTypes = []string{ - "gradle", - "sbt", - "ivy", + GradlePackageType, + SBTPackageType, + IvyPackageType, } -const MavenPackageType = "maven" - var ProjectEnvironmentsSupported = []string{"DEV", "PROD"} func RepoLayoutRefSchema(repositoryType string, packageType string) map[string]*schema.Schema { @@ -411,34 +481,36 @@ func VerifyDisableProxy(_ context.Context, diff *schema.ResourceDiff, _ interfac return nil } -func MkResourceSchema(skeema map[string]*schema.Schema, packer packer.PackFunc, unpack unpacker.UnpackFunc, constructor Constructor) *schema.Resource { +func MkResourceSchema(skeemas map[int16]map[string]*schema.Schema, packer packer.PackFunc, unpack unpacker.UnpackFunc, constructor Constructor) *schema.Resource { var reader = MkRepoRead(packer, constructor) return &schema.Resource{ CreateContext: MkRepoCreate(unpack, reader), ReadContext: reader, UpdateContext: MkRepoUpdate(unpack, reader), DeleteContext: DeleteRepo, + Importer: &schema.ResourceImporter{ StateContext: schema.ImportStatePassthroughContext, }, - Schema: skeema, + Schema: skeemas[1], SchemaVersion: 1, StateUpgraders: []schema.StateUpgrader{ { // this only works because the schema hasn't changed, except the removal of default value // from `project_key` attribute. Future common schema changes that involve attributes should // figure out a way to create a previous and new version. - Type: resourceV0(skeema).CoreConfigSchema().ImpliedType(), + Type: Resource(skeemas[0]).CoreConfigSchema().ImpliedType(), Upgrade: ResourceUpgradeProjectKey, Version: 0, }, }, + CustomizeDiff: ProjectEnvironmentsDiff, } } -func resourceV0(skeema map[string]*schema.Schema) *schema.Resource { +func Resource(skeema map[string]*schema.Schema) *schema.Resource { return &schema.Resource{ Schema: skeema, } diff --git a/pkg/artifactory/resource/repository/repository_test.go b/pkg/artifactory/resource/repository/repository_test.go index aafacfdb9..8e2e8ff4e 100644 --- a/pkg/artifactory/resource/repository/repository_test.go +++ b/pkg/artifactory/resource/repository/repository_test.go @@ -28,9 +28,23 @@ func TestAccRepository_assign_project_key_gh_329(t *testing.T) { }) localRepositoryWithProjectKey := util.ExecuteTemplate("TestAccLocalGenericRepository", ` + resource "project" "{{ .projectKey }}" { + key = "{{ .projectKey }}" + display_name = "{{ .projectKey }}" + description = "My Project" + admin_privileges { + manage_members = true + manage_resources = true + index_resources = true + } + max_storage_in_gibibytes = 10 + block_deployments_on_limit = false + email_notification = true + } + resource "artifactory_local_generic_repository" "{{ .name }}" { key = "{{ .name }}" - project_key = "{{ .projectKey }}" + project_key = project.{{ .projectKey }}.key } `, map[string]interface{}{ "name": name, @@ -38,15 +52,14 @@ func TestAccRepository_assign_project_key_gh_329(t *testing.T) { }) resource.Test(t, resource.TestCase{ - PreCheck: func() { - acctest.PreCheck(t) - acctest.CreateProject(t, projectKey) + PreCheck: func() { acctest.PreCheck(t) }, + ExternalProviders: map[string]resource.ExternalProvider{ + "project": { + Source: "jfrog/project", + }, }, ProviderFactories: acctest.ProviderFactories, - CheckDestroy: acctest.VerifyDeleted(fqrn, "", func(id string, request *resty.Request) (*resty.Response, error) { - acctest.DeleteProject(t, projectKey) - return acctest.CheckRepo(id, request) - }), + CheckDestroy: acctest.VerifyDeleted(fqrn, "", acctest.CheckRepo), Steps: []resource.TestStep{ { Config: localRepositoryBasic, @@ -130,23 +143,36 @@ func TestAccRepository_can_set_two_project_environments_before_7_53_1(t *testing "projectKey": projectKey, } localRepositoryBasic := util.ExecuteTemplate("TestAccLocalGenericRepository", ` + resource "project" "{{ .projectKey }}" { + key = "{{ .projectKey }}" + display_name = "{{ .projectKey }}" + description = "My Project" + admin_privileges { + manage_members = true + manage_resources = true + index_resources = true + } + max_storage_in_gibibytes = 10 + block_deployments_on_limit = false + email_notification = true + } + resource "artifactory_local_generic_repository" "{{ .name }}" { key = "{{ .name }}" - project_key = "{{ .projectKey }}" + project_key = project.{{ .projectKey }}.key project_environments = ["DEV", "PROD"] } `, params) resource.Test(t, resource.TestCase{ - PreCheck: func() { - acctest.PreCheck(t) - acctest.CreateProject(t, projectKey) + PreCheck: func() { acctest.PreCheck(t) }, + ExternalProviders: map[string]resource.ExternalProvider{ + "project": { + Source: "jfrog/project", + }, }, ProviderFactories: acctest.ProviderFactories, - CheckDestroy: acctest.VerifyDeleted(fqrn, "", func(id string, request *resty.Request) (*resty.Response, error) { - acctest.DeleteProject(t, projectKey) - return acctest.CheckRepo(id, request) - }), + CheckDestroy: acctest.VerifyDeleted(fqrn, "", acctest.CheckRepo), Steps: []resource.TestStep{ { SkipFunc: func() (bool, error) { @@ -175,23 +201,36 @@ func TestAccRepository_invalid_project_environments_before_7_53_1(t *testing.T) "projectKey": projectKey, } localRepositoryBasic := util.ExecuteTemplate("TestAccLocalGenericRepository", ` + resource "project" "{{ .projectKey }}" { + key = "{{ .projectKey }}" + display_name = "{{ .projectKey }}" + description = "My Project" + admin_privileges { + manage_members = true + manage_resources = true + index_resources = true + } + max_storage_in_gibibytes = 10 + block_deployments_on_limit = false + email_notification = true + } + resource "artifactory_local_generic_repository" "{{ .name }}" { key = "{{ .name }}" - project_key = "{{ .projectKey }}" + project_key = project.{{ .projectKey }}.key project_environments = ["Foo"] } `, params) resource.Test(t, resource.TestCase{ - PreCheck: func() { - acctest.PreCheck(t) - acctest.CreateProject(t, projectKey) + PreCheck: func() { acctest.PreCheck(t) }, + ExternalProviders: map[string]resource.ExternalProvider{ + "project": { + Source: "jfrog/project", + }, }, ProviderFactories: acctest.ProviderFactories, - CheckDestroy: acctest.VerifyDeleted(fqrn, "", func(id string, request *resty.Request) (*resty.Response, error) { - acctest.DeleteProject(t, projectKey) - return acctest.CheckRepo(id, request) - }), + CheckDestroy: acctest.VerifyDeleted(fqrn, "", acctest.CheckRepo), Steps: []resource.TestStep{ { SkipFunc: func() (bool, error) { @@ -216,23 +255,36 @@ func TestAccRepository_invalid_project_environments_after_7_53_1(t *testing.T) { "projectKey": projectKey, } localRepositoryBasic := util.ExecuteTemplate("TestAccLocalGenericRepository", ` + resource "project" "{{ .projectKey }}" { + key = "{{ .projectKey }}" + display_name = "{{ .projectKey }}" + description = "My Project" + admin_privileges { + manage_members = true + manage_resources = true + index_resources = true + } + max_storage_in_gibibytes = 10 + block_deployments_on_limit = false + email_notification = true + } + resource "artifactory_local_generic_repository" "{{ .name }}" { key = "{{ .name }}" - project_key = "{{ .projectKey }}" + project_key = project.{{ .projectKey }}.key project_environments = ["DEV", "PROD"] } `, params) resource.Test(t, resource.TestCase{ - PreCheck: func() { - acctest.PreCheck(t) - acctest.CreateProject(t, projectKey) + PreCheck: func() { acctest.PreCheck(t) }, + ExternalProviders: map[string]resource.ExternalProvider{ + "project": { + Source: "jfrog/project", + }, }, ProviderFactories: acctest.ProviderFactories, - CheckDestroy: acctest.VerifyDeleted(fqrn, "", func(id string, request *resty.Request) (*resty.Response, error) { - acctest.DeleteProject(t, projectKey) - return acctest.CheckRepo(id, request) - }), + CheckDestroy: acctest.VerifyDeleted(fqrn, "", acctest.CheckRepo), Steps: []resource.TestStep{ { SkipFunc: func() (bool, error) { diff --git a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_alpine_repository.go b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_alpine_repository.go index 2d22d6bdc..f75b86ac1 100644 --- a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_alpine_repository.go +++ b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_alpine_repository.go @@ -5,15 +5,16 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const AlpinePackageType = "alpine" - -var AlpineVirtualSchema = utilsdk.MergeMaps( - BaseVirtualRepoSchema, +var alpineSchema = lo.Assign( RetrievalCachePeriodSecondsSchema, repository.PrimaryKeyPairRef, - repository.RepoLayoutRefSchema(Rclass, AlpinePackageType)) + repository.RepoLayoutRefSchema(Rclass, repository.AlpinePackageType), +) + +var AlpineSchemas = GetSchemas(alpineSchema) func ResourceArtifactoryVirtualAlpineRepository() *schema.Resource { type AlpineVirtualRepositoryParams struct { @@ -25,12 +26,12 @@ func ResourceArtifactoryVirtualAlpineRepository() *schema.Resource { d := &utilsdk.ResourceData{ResourceData: s} repo := AlpineVirtualRepositoryParams{ - RepositoryBaseParamsWithRetrievalCachePeriodSecs: UnpackBaseVirtRepoWithRetrievalCachePeriodSecs(s, AlpinePackageType), + RepositoryBaseParamsWithRetrievalCachePeriodSecs: UnpackBaseVirtRepoWithRetrievalCachePeriodSecs(s, repository.AlpinePackageType), PrimaryKeyPairRefParam: repository.PrimaryKeyPairRefParam{ PrimaryKeyPairRef: d.GetString("primary_keypair_ref", false), }, } - repo.PackageType = AlpinePackageType + repo.PackageType = repository.AlpinePackageType return &repo, repo.Key, nil } @@ -39,15 +40,15 @@ func ResourceArtifactoryVirtualAlpineRepository() *schema.Resource { RepositoryBaseParamsWithRetrievalCachePeriodSecs: RepositoryBaseParamsWithRetrievalCachePeriodSecs{ RepositoryBaseParams: RepositoryBaseParams{ Rclass: Rclass, - PackageType: AlpinePackageType, + PackageType: repository.AlpinePackageType, }, }, }, nil } return repository.MkResourceSchema( - AlpineVirtualSchema, - packer.Default(AlpineVirtualSchema), + AlpineSchemas, + packer.Default(AlpineSchemas[CurrentSchemaVersion]), unpackAlpineVirtualRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_bower_repository.go b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_bower_repository.go index ded5c91fc..23db3ad12 100644 --- a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_bower_repository.go +++ b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_bower_repository.go @@ -4,20 +4,19 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const BowerPackageType = "bower" - -var BowerVirtualSchema = utilsdk.MergeMaps( - BaseVirtualRepoSchema, +var bowerSchema = lo.Assign( externalDependenciesSchema, - repository.RepoLayoutRefSchema(Rclass, BowerPackageType), + repository.RepoLayoutRefSchema(Rclass, repository.BowerPackageType), ) +var BowerSchemas = GetSchemas(bowerSchema) + func ResourceArtifactoryVirtualBowerRepository() *schema.Resource { var unpackBowerVirtualRepository = func(s *schema.ResourceData) (interface{}, string, error) { - repo := unpackExternalDependenciesVirtualRepository(s, BowerPackageType) + repo := unpackExternalDependenciesVirtualRepository(s, repository.BowerPackageType) return repo, repo.Id(), nil } @@ -25,14 +24,14 @@ func ResourceArtifactoryVirtualBowerRepository() *schema.Resource { return &ExternalDependenciesVirtualRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ Rclass: Rclass, - PackageType: BowerPackageType, + PackageType: repository.BowerPackageType, }, }, nil } return repository.MkResourceSchema( - BowerVirtualSchema, - packer.Default(BowerVirtualSchema), + BowerSchemas, + packer.Default(BowerSchemas[CurrentSchemaVersion]), unpackBowerVirtualRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_conan_repository.go b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_conan_repository.go index d70d64d16..3c6e32bc8 100644 --- a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_conan_repository.go +++ b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_conan_repository.go @@ -5,15 +5,17 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -var ConanSchema = utilsdk.MergeMaps( - BaseVirtualRepoSchema, +var conanSchema = lo.Assign( RetrievalCachePeriodSecondsSchema, repository.ConanBaseSchema, repository.RepoLayoutRefSchema(Rclass, repository.ConanPackageType), ) +var ConanSchemas = GetSchemas(conanSchema) + type ConanRepoParams struct { RepositoryBaseParamsWithRetrievalCachePeriodSecs repository.ConanBaseParams @@ -47,8 +49,8 @@ func ResourceArtifactoryVirtualConanRepository() *schema.Resource { } return repository.MkResourceSchema( - ConanSchema, - packer.Default(ConanSchema), + ConanSchemas, + packer.Default(ConanSchemas[CurrentSchemaVersion]), unpackConanRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_debian_repository.go b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_debian_repository.go index 0ab928c21..a61147459 100644 --- a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_debian_repository.go +++ b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_debian_repository.go @@ -8,12 +8,10 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const DebianPackageType = "debian" - -var DebianVirtualSchema = utilsdk.MergeMaps( - BaseVirtualRepoSchema, +var debianSchema = lo.Assign( RetrievalCachePeriodSecondsSchema, repository.PrimaryKeyPairRef, repository.SecondaryKeyPairRef, @@ -37,7 +35,10 @@ var DebianVirtualSchema = utilsdk.MergeMaps( StateFunc: utilsdk.FormatCommaSeparatedString, Description: `Specifying architectures will speed up Artifactory's initial metadata indexing process. The default architecture values are amd64 and i386.`, }, - }, repository.RepoLayoutRefSchema(Rclass, DebianPackageType)) + }, repository.RepoLayoutRefSchema(Rclass, repository.DebianPackageType), +) + +var DebianSchemas = GetSchemas(debianSchema) func ResourceArtifactoryVirtualDebianRepository() *schema.Resource { @@ -53,7 +54,7 @@ func ResourceArtifactoryVirtualDebianRepository() *schema.Resource { d := &utilsdk.ResourceData{ResourceData: s} repo := DebianVirtualRepositoryParams{ - RepositoryBaseParamsWithRetrievalCachePeriodSecs: UnpackBaseVirtRepoWithRetrievalCachePeriodSecs(s, DebianPackageType), + RepositoryBaseParamsWithRetrievalCachePeriodSecs: UnpackBaseVirtRepoWithRetrievalCachePeriodSecs(s, repository.DebianPackageType), PrimaryKeyPairRefParam: repository.PrimaryKeyPairRefParam{ PrimaryKeyPairRef: d.GetString("primary_keypair_ref", false), }, @@ -63,7 +64,7 @@ func ResourceArtifactoryVirtualDebianRepository() *schema.Resource { OptionalIndexCompressionFormats: d.GetSet("optional_index_compression_formats"), DebianDefaultArchitectures: d.GetString("debian_default_architectures", false), } - repo.PackageType = DebianPackageType + repo.PackageType = repository.DebianPackageType return &repo, repo.Key, nil } @@ -72,15 +73,15 @@ func ResourceArtifactoryVirtualDebianRepository() *schema.Resource { RepositoryBaseParamsWithRetrievalCachePeriodSecs: RepositoryBaseParamsWithRetrievalCachePeriodSecs{ RepositoryBaseParams: RepositoryBaseParams{ Rclass: Rclass, - PackageType: DebianPackageType, + PackageType: repository.DebianPackageType, }, }, }, nil } return repository.MkResourceSchema( - DebianVirtualSchema, - packer.Default(DebianVirtualSchema), + DebianSchemas, + packer.Default(DebianSchemas[CurrentSchemaVersion]), unpackDebianVirtualRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_docker_repository.go b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_docker_repository.go index 36b2abca5..39ce417d9 100644 --- a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_docker_repository.go +++ b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_docker_repository.go @@ -5,18 +5,22 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const DockerPackageType = "docker" - -var DockerVirtualSchema = utilsdk.MergeMaps(BaseVirtualRepoSchema, map[string]*schema.Schema{ - "resolve_docker_tags_by_timestamp": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "When enabled, in cases where the same Docker tag exists in two or more of the aggregated repositories, Artifactory will return the tag that has the latest timestamp.", +var dockerSchema = lo.Assign( + map[string]*schema.Schema{ + "resolve_docker_tags_by_timestamp": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "When enabled, in cases where the same Docker tag exists in two or more of the aggregated repositories, Artifactory will return the tag that has the latest timestamp.", + }, }, -}, repository.RepoLayoutRefSchema(Rclass, DockerPackageType)) + repository.RepoLayoutRefSchema(Rclass, repository.DockerPackageType), +) + +var DockerSchemas = GetSchemas(dockerSchema) func ResourceArtifactoryVirtualDockerRepository() *schema.Resource { @@ -28,7 +32,7 @@ func ResourceArtifactoryVirtualDockerRepository() *schema.Resource { unpackDockerVirtualRepository := func(data *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: data} repo := DockerVirtualRepositoryParams{ - RepositoryBaseParams: UnpackBaseVirtRepo(data, DockerPackageType), + RepositoryBaseParams: UnpackBaseVirtRepo(data, repository.DockerPackageType), ResolveDockerTagsByTimestamp: d.GetBool("resolve_docker_tags_by_timestamp", false), } @@ -39,14 +43,14 @@ func ResourceArtifactoryVirtualDockerRepository() *schema.Resource { return &DockerVirtualRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ Rclass: Rclass, - PackageType: DockerPackageType, + PackageType: repository.DockerPackageType, }, }, nil } return repository.MkResourceSchema( - DockerVirtualSchema, - packer.Default(DockerVirtualSchema), + DockerSchemas, + packer.Default(DockerSchemas[CurrentSchemaVersion]), unpackDockerVirtualRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_generic_repository.go b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_generic_repository.go index 12da7cd90..1d5ed34ce 100644 --- a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_generic_repository.go +++ b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_generic_repository.go @@ -4,51 +4,60 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" - utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -func ResourceArtifactoryVirtualGenericRepository(pkt string) *schema.Resource { +func ResourceArtifactoryVirtualGenericRepository(packageType string) *schema.Resource { constructor := func() (interface{}, error) { return &RepositoryBaseParams{ - PackageType: pkt, + PackageType: packageType, Rclass: Rclass, }, nil } unpack := func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackBaseVirtRepo(data, pkt) + repo := UnpackBaseVirtRepo(data, packageType) return repo, repo.Id(), nil } - genericSchema := utilsdk.MergeMaps(BaseVirtualRepoSchema, - repository.RepoLayoutRefSchema(Rclass, pkt)) + genericSchemas := GetSchemas(repository.RepoLayoutRefSchema(Rclass, packageType)) - return repository.MkResourceSchema(genericSchema, packer.Default(genericSchema), unpack, constructor) + return repository.MkResourceSchema( + genericSchemas, + packer.Default(genericSchemas[CurrentSchemaVersion]), + unpack, + constructor, + ) } -func ResourceArtifactoryVirtualRepositoryWithRetrievalCachePeriodSecs(pkt string) *schema.Resource { - var repoWithRetrivalCachePeriodSecsVirtualSchema = utilsdk.MergeMaps( - BaseVirtualRepoSchema, +var RepoWithRetrivalCachePeriodSecsVirtualSchemas = func(packageType string) map[int16]map[string]*schema.Schema { + var repoWithRetrivalCachePeriodSecsVirtualSchema = lo.Assign( RetrievalCachePeriodSecondsSchema, - repository.RepoLayoutRefSchema(Rclass, pkt), + repository.RepoLayoutRefSchema(Rclass, packageType), ) + return GetSchemas(repoWithRetrivalCachePeriodSecsVirtualSchema) +} + +func ResourceArtifactoryVirtualRepositoryWithRetrievalCachePeriodSecs(packageType string) *schema.Resource { + repoWithRetrivalCachePeriodSecsVirtualSchemas := RepoWithRetrivalCachePeriodSecsVirtualSchemas(packageType) + constructor := func() (interface{}, error) { return &RepositoryBaseParamsWithRetrievalCachePeriodSecs{ RepositoryBaseParams: RepositoryBaseParams{ Rclass: Rclass, - PackageType: pkt, + PackageType: packageType, }, }, nil } unpack := func(data *schema.ResourceData) (interface{}, string, error) { - repo := UnpackBaseVirtRepoWithRetrievalCachePeriodSecs(data, pkt) + repo := UnpackBaseVirtRepoWithRetrievalCachePeriodSecs(data, packageType) return repo, repo.Id(), nil } return repository.MkResourceSchema( - repoWithRetrivalCachePeriodSecsVirtualSchema, - packer.Default(repoWithRetrivalCachePeriodSecsVirtualSchema), + repoWithRetrivalCachePeriodSecsVirtualSchemas, + packer.Default(repoWithRetrivalCachePeriodSecsVirtualSchemas[CurrentSchemaVersion]), unpack, constructor, ) diff --git a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_go_repository.go b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_go_repository.go index 58c2b2ea8..ebb9d0e69 100644 --- a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_go_repository.go +++ b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_go_repository.go @@ -5,12 +5,10 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const GoPackageType = "go" - -var GoVirtualSchema = utilsdk.MergeMaps( - BaseVirtualRepoSchema, +var goSchema = lo.Assign( map[string]*schema.Schema{ "external_dependencies_enabled": { Type: schema.TypeBool, @@ -29,9 +27,11 @@ var GoVirtualSchema = utilsdk.MergeMaps( "follow to download remote modules from, when presented with 'go-import' meta tags in the remote repository response.", }, }, - repository.RepoLayoutRefSchema(Rclass, GoPackageType), + repository.RepoLayoutRefSchema(Rclass, repository.GoPackageType), ) +var GoSchemas = GetSchemas(goSchema) + func ResourceArtifactoryVirtualGoRepository() *schema.Resource { type GoVirtualRepositoryParams struct { RepositoryBaseParams @@ -43,7 +43,7 @@ func ResourceArtifactoryVirtualGoRepository() *schema.Resource { d := &utilsdk.ResourceData{ResourceData: s} repo := GoVirtualRepositoryParams{ - RepositoryBaseParams: UnpackBaseVirtRepo(s, GoPackageType), + RepositoryBaseParams: UnpackBaseVirtRepo(s, repository.GoPackageType), ExternalDependenciesPatterns: d.GetList("external_dependencies_patterns"), ExternalDependenciesEnabled: d.GetBool("external_dependencies_enabled", false), } @@ -54,14 +54,14 @@ func ResourceArtifactoryVirtualGoRepository() *schema.Resource { return &GoVirtualRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ Rclass: Rclass, - PackageType: GoPackageType, + PackageType: repository.GoPackageType, }, }, nil } return repository.MkResourceSchema( - GoVirtualSchema, - packer.Default(GoVirtualSchema), + GoSchemas, + packer.Default(GoSchemas[CurrentSchemaVersion]), unpackGoVirtualRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_helm_repository.go b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_helm_repository.go index 72f6441eb..fedb4c6a9 100644 --- a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_helm_repository.go +++ b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_helm_repository.go @@ -5,12 +5,10 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const HelmPackageType = "helm" - -var HelmVirtualSchema = utilsdk.MergeMaps( - BaseVirtualRepoSchema, +var helmSchema = lo.Assign( RetrievalCachePeriodSecondsSchema, map[string]*schema.Schema{ "use_namespaces": { @@ -20,7 +18,10 @@ var HelmVirtualSchema = utilsdk.MergeMaps( Description: "From Artifactory 7.24.1 (SaaS Version), you can explicitly state a specific aggregated local or remote repository to fetch from a virtual by assigning namespaces to local and remote repositories\nSee https://www.jfrog.com/confluence/display/JFROG/Kubernetes+Helm+Chart+Repositories#KubernetesHelmChartRepositories-NamespaceSupportforHelmVirtualRepositories. Default to 'false'", }, }, - repository.RepoLayoutRefSchema(Rclass, HelmPackageType)) + repository.RepoLayoutRefSchema(Rclass, repository.HelmPackageType), +) + +var HelmSchemas = GetSchemas(helmSchema) func ResourceArtifactoryVirtualHelmRepository() *schema.Resource { type HelmVirtualRepositoryParams struct { @@ -31,7 +32,7 @@ func ResourceArtifactoryVirtualHelmRepository() *schema.Resource { unpackHelmVirtualRepository := func(data *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: data} repo := HelmVirtualRepositoryParams{ - RepositoryBaseParamsWithRetrievalCachePeriodSecs: UnpackBaseVirtRepoWithRetrievalCachePeriodSecs(data, HelmPackageType), + RepositoryBaseParamsWithRetrievalCachePeriodSecs: UnpackBaseVirtRepoWithRetrievalCachePeriodSecs(data, repository.HelmPackageType), UseNamespaces: d.GetBool("use_namespaces", false), } @@ -43,7 +44,7 @@ func ResourceArtifactoryVirtualHelmRepository() *schema.Resource { RepositoryBaseParamsWithRetrievalCachePeriodSecs: RepositoryBaseParamsWithRetrievalCachePeriodSecs{ RepositoryBaseParams: RepositoryBaseParams{ Rclass: Rclass, - PackageType: HelmPackageType, + PackageType: repository.HelmPackageType, }, }, UseNamespaces: false, @@ -51,8 +52,8 @@ func ResourceArtifactoryVirtualHelmRepository() *schema.Resource { } return repository.MkResourceSchema( - HelmVirtualSchema, - packer.Default(HelmVirtualSchema), + HelmSchemas, + packer.Default(HelmSchemas[CurrentSchemaVersion]), unpackHelmVirtualRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_helmoci_repository.go b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_helmoci_repository.go index a4890c268..76c40508b 100644 --- a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_helmoci_repository.go +++ b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_helmoci_repository.go @@ -5,30 +5,33 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const HelmOciPackageType = "helmoci" - -var HelmOciVirtualSchema = utilsdk.MergeMaps(BaseVirtualRepoSchema, map[string]*schema.Schema{ - "resolve_oci_tags_by_timestamp": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "When enabled, in cases where the same OCI tag exists in two or more of the aggregated repositories, Artifactory will return the tag that has the latest timestamp.", +var helmOCISchema = lo.Assign( + map[string]*schema.Schema{ + "resolve_oci_tags_by_timestamp": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "When enabled, in cases where the same OCI tag exists in two or more of the aggregated repositories, Artifactory will return the tag that has the latest timestamp.", + }, }, -}, repository.RepoLayoutRefSchema(Rclass, DockerPackageType)) + repository.RepoLayoutRefSchema(Rclass, repository.HelmOCIPackageType), +) -func ResourceArtifactoryVirtualHelmOciRepository() *schema.Resource { +var HelmOCISchemas = GetSchemas(helmOCISchema) - type HelmOciVirtualRepositoryParams struct { - RepositoryBaseParams - ResolveOCITagsByTimestamp bool `hcl:"resolve_oci_tags_by_timestamp" json:"resolveDockerTagsByTimestamp"` - } +type HelmOciVirtualRepositoryParams struct { + RepositoryBaseParams + ResolveOCITagsByTimestamp bool `hcl:"resolve_oci_tags_by_timestamp" json:"resolveDockerTagsByTimestamp"` +} +func ResourceArtifactoryVirtualHelmOciRepository() *schema.Resource { unpackVirtualRepository := func(data *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: data} repo := HelmOciVirtualRepositoryParams{ - RepositoryBaseParams: UnpackBaseVirtRepo(data, HelmOciPackageType), + RepositoryBaseParams: UnpackBaseVirtRepo(data, repository.HelmOCIPackageType), ResolveOCITagsByTimestamp: d.GetBool("resolve_oci_tags_by_timestamp", false), } @@ -39,14 +42,14 @@ func ResourceArtifactoryVirtualHelmOciRepository() *schema.Resource { return &HelmOciVirtualRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ Rclass: Rclass, - PackageType: HelmOciPackageType, + PackageType: repository.HelmOCIPackageType, }, }, nil } return repository.MkResourceSchema( - HelmOciVirtualSchema, - packer.Default(HelmOciVirtualSchema), + HelmOCISchemas, + packer.Default(HelmOCISchemas[CurrentSchemaVersion]), unpackVirtualRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_java_repository.go b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_java_repository.go index 40ed662a7..d8363afd7 100644 --- a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_java_repository.go +++ b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_java_repository.go @@ -6,6 +6,7 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) type CommonJavaVirtualRepositoryParams struct { @@ -19,7 +20,7 @@ type JavaVirtualRepositoryParams struct { CommonJavaVirtualRepositoryParams } -var JavaVirtualSchema = map[string]*schema.Schema{ +var JavaSchema = map[string]*schema.Schema{ "force_maven_authentication": { Type: schema.TypeBool, Computed: true, @@ -44,25 +45,26 @@ var JavaVirtualSchema = map[string]*schema.Schema{ }, } -func ResourceArtifactoryVirtualJavaRepository(repoType string) *schema.Resource { - var mavenVirtualSchema = utilsdk.MergeMaps( - BaseVirtualRepoSchema, - JavaVirtualSchema, - repository.RepoLayoutRefSchema(Rclass, repoType), +func ResourceArtifactoryVirtualJavaRepository(packageType string) *schema.Resource { + var mavenSchema = lo.Assign( + JavaSchema, + repository.RepoLayoutRefSchema(Rclass, packageType), ) + var mavenSchemas = GetSchemas(mavenSchema) + var unpackMavenVirtualRepository = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := JavaVirtualRepositoryParams{ - RepositoryBaseParams: UnpackBaseVirtRepo(s, repoType), + RepositoryBaseParams: UnpackBaseVirtRepo(s, packageType), CommonJavaVirtualRepositoryParams: CommonJavaVirtualRepositoryParams{ KeyPair: d.GetString("key_pair", false), ForceMavenAuthentication: d.GetBool("force_maven_authentication", false), PomRepositoryReferencesCleanupPolicy: d.GetString("pom_repository_references_cleanup_policy", false), }, } - repo.PackageType = repoType + repo.PackageType = packageType return &repo, repo.Key, nil } @@ -71,14 +73,14 @@ func ResourceArtifactoryVirtualJavaRepository(repoType string) *schema.Resource return &JavaVirtualRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ Rclass: Rclass, - PackageType: repoType, + PackageType: packageType, }, }, nil } return repository.MkResourceSchema( - mavenVirtualSchema, - packer.Default(mavenVirtualSchema), + mavenSchemas, + packer.Default(mavenSchemas[CurrentSchemaVersion]), unpackMavenVirtualRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_npm_repository.go b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_npm_repository.go index 717daa735..f92fb842b 100644 --- a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_npm_repository.go +++ b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_npm_repository.go @@ -5,30 +5,29 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const NpmPackageType = "npm" - -var NpmVirtualSchema = utilsdk.MergeMaps( - BaseVirtualRepoSchema, +var npmSchema = lo.Assign( RetrievalCachePeriodSecondsSchema, externalDependenciesSchema, - repository.RepoLayoutRefSchema(Rclass, NpmPackageType), + repository.RepoLayoutRefSchema(Rclass, repository.NPMPackageType), ) -func ResourceArtifactoryVirtualNpmRepository() *schema.Resource { +var NPMSchemas = GetSchemas(npmSchema) - type NpmVirtualRepositoryParams struct { - ExternalDependenciesVirtualRepositoryParams - VirtualRetrievalCachePeriodSecs int `hcl:"retrieval_cache_period_seconds" json:"virtualRetrievalCachePeriodSecs"` - } +type NpmVirtualRepositoryParams struct { + ExternalDependenciesVirtualRepositoryParams + VirtualRetrievalCachePeriodSecs int `hcl:"retrieval_cache_period_seconds" json:"virtualRetrievalCachePeriodSecs"` +} +func ResourceArtifactoryVirtualNpmRepository() *schema.Resource { var unpackNpmVirtualRepository = func(s *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: s} repo := NpmVirtualRepositoryParams{ VirtualRetrievalCachePeriodSecs: d.GetInt("retrieval_cache_period_seconds", false), - ExternalDependenciesVirtualRepositoryParams: unpackExternalDependenciesVirtualRepository(s, NpmPackageType), + ExternalDependenciesVirtualRepositoryParams: unpackExternalDependenciesVirtualRepository(s, repository.NPMPackageType), } return &repo, repo.Key, nil } @@ -38,15 +37,15 @@ func ResourceArtifactoryVirtualNpmRepository() *schema.Resource { ExternalDependenciesVirtualRepositoryParams: ExternalDependenciesVirtualRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ Rclass: Rclass, - PackageType: NpmPackageType, + PackageType: repository.NPMPackageType, }, }, }, nil } return repository.MkResourceSchema( - NpmVirtualSchema, - packer.Default(NpmVirtualSchema), + NPMSchemas, + packer.Default(NPMSchemas[CurrentSchemaVersion]), unpackNpmVirtualRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_nuget_repository.go b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_nuget_repository.go index f5436e4f5..c53b5b584 100644 --- a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_nuget_repository.go +++ b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_nuget_repository.go @@ -5,18 +5,22 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const NugetPackageType = "nuget" - -var NugetVirtualSchema = utilsdk.MergeMaps(BaseVirtualRepoSchema, map[string]*schema.Schema{ - "force_nuget_authentication": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "If set, user authentication is required when accessing the repository. An anonymous request will display an HTTP 401 error. This is also enforced when aggregated repositories support anonymous requests.", +var nugetSchema = lo.Assign( + map[string]*schema.Schema{ + "force_nuget_authentication": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "If set, user authentication is required when accessing the repository. An anonymous request will display an HTTP 401 error. This is also enforced when aggregated repositories support anonymous requests.", + }, }, -}, repository.RepoLayoutRefSchema(Rclass, NugetPackageType)) + repository.RepoLayoutRefSchema(Rclass, repository.NugetPackageType), +) + +var NugetSchemas = GetSchemas(nugetSchema) func ResourceArtifactoryVirtualNugetRepository() *schema.Resource { @@ -29,10 +33,10 @@ func ResourceArtifactoryVirtualNugetRepository() *schema.Resource { d := &utilsdk.ResourceData{ResourceData: s} repo := NugetVirtualRepositoryParams{ - RepositoryBaseParams: UnpackBaseVirtRepo(s, NugetPackageType), + RepositoryBaseParams: UnpackBaseVirtRepo(s, repository.NugetPackageType), ForceNugetAuthentication: d.GetBool("force_nuget_authentication", false), } - repo.PackageType = NugetPackageType + repo.PackageType = repository.NugetPackageType return &repo, repo.Key, nil } @@ -40,14 +44,14 @@ func ResourceArtifactoryVirtualNugetRepository() *schema.Resource { return &NugetVirtualRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ Rclass: Rclass, - PackageType: NugetPackageType, + PackageType: repository.NugetPackageType, }, }, nil } return repository.MkResourceSchema( - NugetVirtualSchema, - packer.Default(NugetVirtualSchema), + NugetSchemas, + packer.Default(NugetSchemas[CurrentSchemaVersion]), unpackNugetVirtualRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_oci_repository.go b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_oci_repository.go index 08ba2f691..970aabe27 100644 --- a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_oci_repository.go +++ b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_oci_repository.go @@ -5,12 +5,10 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const OciPackageType = "oci" - -var OciVirtualSchema = utilsdk.MergeMaps( - BaseVirtualRepoSchema, +var ociSchema = lo.Assign( map[string]*schema.Schema{ "resolve_oci_tags_by_timestamp": { Type: schema.TypeBool, @@ -19,9 +17,11 @@ var OciVirtualSchema = utilsdk.MergeMaps( Description: "When enabled, in cases where the same OCI tag exists in two or more of the aggregated repositories, Artifactory will return the tag that has the latest timestamp.", }, }, - repository.RepoLayoutRefSchema(Rclass, OciPackageType), + repository.RepoLayoutRefSchema(Rclass, repository.OCIPackageType), ) +var OCISchemas = GetSchemas(ociSchema) + func ResourceArtifactoryVirtualOciRepository() *schema.Resource { type OciVirtualRepositoryParams struct { RepositoryBaseParams @@ -31,7 +31,7 @@ func ResourceArtifactoryVirtualOciRepository() *schema.Resource { unpackOciVirtualRepository := func(data *schema.ResourceData) (interface{}, string, error) { d := &utilsdk.ResourceData{ResourceData: data} repo := OciVirtualRepositoryParams{ - RepositoryBaseParams: UnpackBaseVirtRepo(data, OciPackageType), + RepositoryBaseParams: UnpackBaseVirtRepo(data, repository.OCIPackageType), ResolveOciTagsByTimestamp: d.GetBool("resolve_oci_tags_by_timestamp", false), } return repo, repo.Id(), nil @@ -41,14 +41,14 @@ func ResourceArtifactoryVirtualOciRepository() *schema.Resource { return &OciVirtualRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ Rclass: Rclass, - PackageType: OciPackageType, + PackageType: repository.OCIPackageType, }, }, nil } return repository.MkResourceSchema( - OciVirtualSchema, - packer.Default(OciVirtualSchema), + OCISchemas, + packer.Default(OCISchemas[CurrentSchemaVersion]), unpackOciVirtualRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_rpm_repository.go b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_rpm_repository.go index 4f7a87ebc..7cfb77ba4 100644 --- a/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_rpm_repository.go +++ b/pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_rpm_repository.go @@ -5,17 +5,17 @@ import ( "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" "github.com/jfrog/terraform-provider-shared/packer" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const RpmPackageType = "rpm" - -var RpmVirtualSchema = utilsdk.MergeMaps( - BaseVirtualRepoSchema, +var rpmSchema = lo.Assign( repository.PrimaryKeyPairRef, repository.SecondaryKeyPairRef, - repository.RepoLayoutRefSchema(Rclass, RpmPackageType), + repository.RepoLayoutRefSchema(Rclass, repository.RPMPackageType), ) +var RPMSchemas = GetSchemas(rpmSchema) + func ResourceArtifactoryVirtualRpmRepository() *schema.Resource { type CommonRpmDebianVirtualRepositoryParams struct { repository.PrimaryKeyPairRefParam @@ -41,7 +41,7 @@ func ResourceArtifactoryVirtualRpmRepository() *schema.Resource { }, }, } - repo.PackageType = "rpm" + repo.PackageType = repository.RPMPackageType return &repo, repo.Key, nil } @@ -50,14 +50,14 @@ func ResourceArtifactoryVirtualRpmRepository() *schema.Resource { return &RpmVirtualRepositoryParams{ RepositoryBaseParams: RepositoryBaseParams{ Rclass: Rclass, - PackageType: RpmPackageType, + PackageType: repository.RPMPackageType, }, }, nil } return repository.MkResourceSchema( - RpmVirtualSchema, - packer.Default(RpmVirtualSchema), + RPMSchemas, + packer.Default(RPMSchemas[CurrentSchemaVersion]), unpackRpmVirtualRepository, constructor, ) diff --git a/pkg/artifactory/resource/repository/virtual/virtual.go b/pkg/artifactory/resource/repository/virtual/virtual.go index b9a41966a..c7e5c3520 100644 --- a/pkg/artifactory/resource/repository/virtual/virtual.go +++ b/pkg/artifactory/resource/repository/virtual/virtual.go @@ -5,9 +5,13 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/jfrog/terraform-provider-artifactory/v12/pkg/artifactory/resource/repository" utilsdk "github.com/jfrog/terraform-provider-shared/util/sdk" + "github.com/samber/lo" ) -const Rclass = "virtual" +const ( + Rclass = "virtual" + CurrentSchemaVersion = 1 +) type RepositoryBaseParams struct { Key string `hcl:"key" json:"key,omitempty"` @@ -35,48 +39,63 @@ func (bp RepositoryBaseParams) Id() string { } var PackageTypesLikeGeneric = []string{ - "gems", - "generic", - "gitlfs", - "composer", - "p2", - "pub", - "puppet", - "pypi", - "swift", - "terraform", + repository.ComposerPackageType, + repository.GemsPackageType, + repository.GenericPackageType, + repository.GitLFSPackageType, + repository.P2PackageType, + repository.PubPackageType, + repository.PuppetPackageType, + repository.PyPiPackageType, + repository.SwiftPackageType, + repository.TerraformPackageType, } var PackageTypesLikeGenericWithRetrievalCachePeriodSecs = []string{ - "ansible", - "chef", - "conda", - "cran", + repository.AnsiblePackageType, + repository.ChefPackageType, + repository.CondaPackageType, + repository.CranPackageType, } -var BaseVirtualRepoSchema = utilsdk.MergeMaps( - repository.BaseRepoSchema, - map[string]*schema.Schema{ - "repositories": { - Type: schema.TypeList, - Elem: &schema.Schema{Type: schema.TypeString}, - Optional: true, - Description: "The effective list of actual repositories included in this virtual repository.", - }, - "artifactory_requests_can_retrieve_remote_artifacts": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "Whether the virtual repository should search through remote repositories when trying to resolve an artifact requested by another Artifactory instance.", - }, - "default_deployment_repo": { - Type: schema.TypeString, - Optional: true, - Description: "Default repository to deploy artifacts.", - }, +var baseSchema = map[string]*schema.Schema{ + "repositories": { + Type: schema.TypeList, + Elem: &schema.Schema{Type: schema.TypeString}, + Optional: true, + Description: "The effective list of actual repositories included in this virtual repository.", + }, + "artifactory_requests_can_retrieve_remote_artifacts": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Whether the virtual repository should search through remote repositories when trying to resolve an artifact requested by another Artifactory instance.", + }, + "default_deployment_repo": { + Type: schema.TypeString, + Optional: true, + Description: "Default repository to deploy artifacts.", }, +} + +var BaseSchemaV1 = lo.Assign( + repository.BaseSchemaV1, + baseSchema, ) +var GetSchemas = func(s map[string]*schema.Schema) map[int16]map[string]*schema.Schema { + return map[int16]map[string]*schema.Schema{ + 0: lo.Assign( + BaseSchemaV1, + s, + ), + 1: lo.Assign( + BaseSchemaV1, + s, + ), + } +} + func UnpackBaseVirtRepo(s *schema.ResourceData, packageType string) RepositoryBaseParams { d := &utilsdk.ResourceData{ResourceData: s} From 9492df22ed0210fd62679db6fe5ec3ae2326f488 Mon Sep 17 00:00:00 2001 From: Alex Hung Date: Mon, 23 Sep 2024 15:40:11 -0700 Subject: [PATCH 2/3] Fix docker tests --- .../local/resource_artifactory_local_docker_repository.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/artifactory/resource/repository/local/resource_artifactory_local_docker_repository.go b/pkg/artifactory/resource/repository/local/resource_artifactory_local_docker_repository.go index 928f490c8..f58d2e384 100644 --- a/pkg/artifactory/resource/repository/local/resource_artifactory_local_docker_repository.go +++ b/pkg/artifactory/resource/repository/local/resource_artifactory_local_docker_repository.go @@ -64,7 +64,7 @@ func UnpackLocalDockerV2Repository(data *schema.ResourceData, Rclass string) Doc } func ResourceArtifactoryLocalDockerV2Repository() *schema.Resource { - pkr := packer.Default(DockerV2Schemas[2]) + pkr := packer.Default(DockerV2Schemas[CurrentSchemaVersion]) var unpackLocalDockerV2Repository = func(data *schema.ResourceData) (interface{}, string, error) { repo := UnpackLocalDockerV2Repository(data, Rclass) From 8ac7e45210caf6b887c18fba6de923ae460fd701 Mon Sep 17 00:00:00 2001 From: JFrog CI Date: Mon, 23 Sep 2024 23:13:38 +0000 Subject: [PATCH 3/3] JFrog Pipelines - Add Artifactory version to CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 264fd04f9..490782d99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 12.0.0 (September 16, 2024). Tested on Artifactory 7.90.10 with Terraform 1.9.5 and OpenTofu 1.8.2 +## 12.0.0 (September 16, 2024). Tested on Artifactory 7.90.10 with Terraform 1.9.6 and OpenTofu 1.8.2 BREAKING CHANGES: