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 286e2f21..6cef6243 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 da942298..569e61f5 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 82b07085..1e67dd3d 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 97f3bdd7..3f464480 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 2cac4aca..e333effd 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 85a3b454..1071c234 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 01339656..53e4345b 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 9341df87..e20699d3 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 09e7a4ef..c0ad1e4f 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 9fbb4462..55277509 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 ef126461..95fffecd 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 68de8e95..f15e995c 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 aed4d69e..d0a34802 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 d1d070fd..c8bcc503 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 006e026a..bd208057 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 bad9e596..52e6b9e6 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 5b8f3bb6..915aedc9 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 d14217ab..2398a160 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 2783ec47..690a9ec6 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 9b766f81..9143f30b 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 bdcd2b96..7cf27cbc 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 e2d643e1..ff4094cf 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 8256203a..272ab693 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 720d0c8e..d5f179e8 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 38f5a009..dec18fc8 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 ef17b4c2..bac6c0a6 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 ba132d37..af78606a 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 9c053994..8060d8b0 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 e8381d61..84e03c9d 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 b968e254..92c6a0f8 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 432729c5..df62a666 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 720286e3..2b1419d8 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 cf0d2da2..8bd52568 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 bd3b1f8f..3ab16323 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 238d6a76..855d268a 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 c0c64cae..109fb60e 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 3d7f7f6d..c0940d82 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 0e0aa343..8a78649b 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 65c3dd12..ac956b6b 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 68325cc3..448afc93 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 1b1ebb6a..02d9ea1d 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 7735125f..b9161778 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 4d006d0c..9ac8bea8 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 1ad215e3..9bfcbaa6 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 dd99a2fe..17c95dee 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 627d6ff8..12cd73a2 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 6a35dced..9fd45fb4 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 b355b35d..a26489ad 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 905212e2..4bfb5b09 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 aa30d162..4d06eceb 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 9c67d49d..b3506fc7 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 135a6369..a21daca0 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 750886ba..c93257e5 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 f1d032b2..1a492859 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 97b13ab2..30241482 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 9acc24fc..7168da59 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 73422fbe..96f9f19c 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 1093c042..ee8df99e 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 148547be..83d4f4c3 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 cf34ee99..9c2e6eae 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 ade77329..928c46c3 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 f041c698..4412af14 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 37c0de27..fcaa7c52 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 dc4d50c9..bf4654ea 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 1f3b1bb4..67f41531 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 b18d58dd..31ea8870 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 6bddb9e9..95d387cb 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 c181f356..00000000 --- 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 b8895f8d..6e0a3648 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 61d66d74..bcd2e199 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 e5602956..41cfe454 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 009a3a7f..5121ed1d 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 ae2f9952..75a3725a 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 fd95215b..39ede7c6 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 83d02279..9841e9ac 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 3abb489e..328de344 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 621cbbd4..9351cef4 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 08130cd2..1873698a 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 9a0bcd08..3a8008f7 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 f7c26ac9..3625ae41 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 c33265f7..3703cdb0 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 2f2593d4..343af529 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 8ccda700..3a13ff73 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 720ccf2a..dd350565 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 a85c0940..3b982c12 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 0a18594f..5013ffc8 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 49bb5404..166fe832 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 5521f188..f2af8e8e 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 85463dc2..08ab7eb0 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 d3c6736a..9d83213b 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 2d14661f..928f490c 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 8a04af36..30de2367 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 cf330092..0ec9714b 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 c926e5a2..a23d16eb 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 4b843abe..7eb9e2b2 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 4151eb0e..11843dae 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 33892b25..36208d90 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 e4a3aea2..222a2d04 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 f8e18e6f..73dd3407 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 a877e157..f8334eb8 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 deb2dda9..b4581e13 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 38929453..cae8bd9b 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 ddcf6e48..eeeb1bfe 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 a8b716bf..bbc6cde4 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 a562523d..a11d888d 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 a5869476..c6f07eb7 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 c2b687eb..cd04eafe 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 6106272a..bec9c007 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 b3a618b4..5cefd369 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 d83acbcf..8bdf0cc7 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 c94b6954..09a7c955 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 c2e3fa7d..454d6192 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 05517d3f..9c5b6cfc 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 d4bc3cc3..10d25a9c 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 2cd3d876..fa08752b 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 a668b5b7..27819a60 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 440dc8a5..ad1bbed7 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 1ef25d73..11d14c2b 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 7cbe77cf..039d5ba0 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 143f8749..bb0b6106 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 7335f67f..628f753d 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 aafacfdb..8e2e8ff4 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 2d22d6bd..f75b86ac 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 ded5c91f..23db3ad1 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 d70d64d1..3c6e32bc 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 0ab928c2..a6114745 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 36b2abca..39ce417d 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 12da7cd9..1d5ed34c 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 58c2b2ea..ebb9d0e6 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 72f6441e..fedb4c6a 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 a4890c26..76c40508 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 40ed662a..d8363afd 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 717daa73..f92fb842 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 f5436e4f..c53b5b58 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 08ba2f69..970aabe2 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 4f7a87eb..7cfb77ba 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 b9a41966..c7e5c352 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 928f490c..f58d2e38 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 264fd04f..490782d9 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: