Skip to content

Commit 30c0586

Browse files
authored
Merge branch 'jfrog:master' into jfrogGH-621-bulk-import
2 parents b42796e + 2877920 commit 30c0586

File tree

11 files changed

+95
-18
lines changed

11 files changed

+95
-18
lines changed

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
## 10.1.4 (Feb 14, 2024)
2+
3+
BUG FIXES:
4+
5+
* data/artifactory_virtual_maven_repository: Restore data source after being removed from the provider by mistake. PR: [#887](https://github.com/jfrog/terraform-provider-artifactory/pull/887) Issue: [#873](https://github.com/jfrog/terraform-provider-artifactory/issues/873)
6+
* resource/artifactory_permission_target: Add check for '409 Conflict' error during resource creation and ignores it. PR: [#888](https://github.com/jfrog/terraform-provider-artifactory/pull/888) Issue: [#853](https://github.com/jfrog/terraform-provider-artifactory/issues/853)
7+
8+
## 10.1.3 (Feb 7, 2024)
9+
10+
BUG FIXES:
11+
12+
* resource/artifactory_group: Add length validation to `name` attribute to match Artifactory web UI. PR: [#884](https://github.com/jfrog/terraform-provider-artifactory/pull/884) Issue: [#883](https://github.com/jfrog/terraform-provider-artifactory/issues/883)
13+
114
## 10.1.2 (Jan 19, 2024)
215

316
BUG FIXES:

docs/resources/general_security.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ resource "artifactory_general_security" "security" {
2222

2323
The following arguments are supported:
2424

25-
* `enable_anonoymous_access` - (Optional) Enable anonymous access. Default value is `false`.
25+
* `enable_anonymous_access` - (Optional) Enable anonymous access. Default value is `false`.
2626

2727
## Import
2828

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ func TestAccDataSourceVirtualAllGradleLikePackageTypes(t *testing.T) {
3939
for _, packageType := range repository.GradleLikePackageTypes {
4040
t.Run(packageType, func(t *testing.T) {
4141
resource.Test(mkNewVirtualTestCase(packageType, t, map[string]interface{}{
42-
"description": fmt.Sprintf("%s virtual repository public description testing.", packageType),
43-
"force_maven_authentication": true,
42+
"description": fmt.Sprintf("%s virtual repository public description testing.", packageType),
4443
"pom_repository_references_cleanup_policy": "discard_active_reference",
4544
}))
4645
})
@@ -102,6 +101,13 @@ func TestAccDataSourceVirtualHelmRepository(t *testing.T) {
102101
}))
103102
}
104103

104+
func TestAccDataSourceVirtualMavenRepository(t *testing.T) {
105+
resource.Test(mkNewVirtualTestCase(repository.MavenPackageType, t, map[string]interface{}{
106+
"description": "maven virtual repository public description testing.",
107+
"force_maven_authentication": true,
108+
}))
109+
}
110+
105111
func TestAccDataSourceVirtualNpmRepository(t *testing.T) {
106112
resource.Test(mkNewVirtualTestCase(virtual.NpmPackageType, t, map[string]interface{}{
107113
"description": "npm virtual repository public description testing.",

pkg/artifactory/provider/datasources.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func datasourcesMap() map[string]*schema.Resource {
3232
"artifactory_local_debian_repository": datasource_local.DataSourceArtifactoryLocalDebianRepository(),
3333
"artifactory_local_docker_v2_repository": datasource_local.DataSourceArtifactoryLocalDockerV2Repository(),
3434
"artifactory_local_docker_v1_repository": datasource_local.DataSourceArtifactoryLocalDockerV1Repository(),
35-
"artifactory_local_maven_repository": datasource_local.DataSourceArtifactoryLocalJavaRepository("maven", false),
35+
"artifactory_local_maven_repository": datasource_local.DataSourceArtifactoryLocalJavaRepository(repository.MavenPackageType, false),
3636
"artifactory_local_nuget_repository": datasource_local.DataSourceArtifactoryLocalNugetRepository(),
3737
"artifactory_local_rpm_repository": datasource_local.DataSourceArtifactoryLocalRpmRepository(),
3838
"artifactory_local_terraform_module_repository": datasource_local.DataSourceArtifactoryLocalTerraformRepository("module"),
@@ -59,6 +59,7 @@ func datasourcesMap() map[string]*schema.Resource {
5959
"artifactory_virtual_go_repository": datasource_virtual.DatasourceArtifactoryVirtualGoRepository(),
6060
"artifactory_virtual_docker_repository": datasource_virtual.DatasourceArtifactoryVirtualDockerRepository(),
6161
"artifactory_virtual_helm_repository": datasource_virtual.DatasourceArtifactoryVirtualHelmRepository(),
62+
"artifactory_virtual_maven_repository": datasource_virtual.DataSourceArtifactoryVirtualJavaRepository(repository.MavenPackageType),
6263
"artifactory_virtual_npm_repository": datasource_virtual.DatasourceArtifactoryVirtualNpmRepository(),
6364
"artifactory_virtual_nuget_repository": datasource_virtual.DatasourceArtifactoryVirtualNugetRepository(),
6465
"artifactory_virtual_rpm_repository": datasource_virtual.DatasourceArtifactoryVirtualRpmRepository(),
@@ -69,7 +70,7 @@ func datasourcesMap() map[string]*schema.Resource {
6970
"artifactory_federated_docker_v1_repository": datasource_federated.DataSourceArtifactoryFederatedDockerV1Repository(),
7071
"artifactory_federated_docker_v2_repository": datasource_federated.DataSourceArtifactoryFederatedDockerV2Repository(),
7172
"artifactory_federated_docker_repository": datasource_federated.DataSourceArtifactoryFederatedDockerV2Repository(),
72-
"artifactory_federated_maven_repository": datasource_federated.DataSourceArtifactoryFederatedJavaRepository("maven", false),
73+
"artifactory_federated_maven_repository": datasource_federated.DataSourceArtifactoryFederatedJavaRepository(repository.MavenPackageType, false),
7374
"artifactory_federated_nuget_repository": datasource_federated.DataSourceArtifactoryFederatedNugetRepository(),
7475
"artifactory_federated_rpm_repository": datasource_federated.DataSourceArtifactoryFederatedRpmRepository(),
7576
"artifactory_federated_terraform_module_repository": datasource_federated.DataSourceArtifactoryFederatedTerraformRepository("module"),

pkg/artifactory/provider/resources.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ func resourcesMap() map[string]*schema.Resource {
2626
"artifactory_federated_docker_repository": federated.ResourceArtifactoryFederatedDockerV2Repository(), // Alias for backward compatibility
2727
"artifactory_federated_docker_v1_repository": federated.ResourceArtifactoryFederatedDockerV1Repository(),
2828
"artifactory_federated_docker_v2_repository": federated.ResourceArtifactoryFederatedDockerV2Repository(),
29-
"artifactory_federated_maven_repository": federated.ResourceArtifactoryFederatedJavaRepository("maven", false),
29+
"artifactory_federated_maven_repository": federated.ResourceArtifactoryFederatedJavaRepository(repository.MavenPackageType, false),
3030
"artifactory_federated_nuget_repository": federated.ResourceArtifactoryFederatedNugetRepository(),
3131
"artifactory_federated_rpm_repository": federated.ResourceArtifactoryFederatedRpmRepository(),
3232
"artifactory_federated_terraform_module_repository": federated.ResourceArtifactoryFederatedTerraformRepository("module"),
3333
"artifactory_federated_terraform_provider_repository": federated.ResourceArtifactoryFederatedTerraformRepository("provider"),
3434
"artifactory_local_nuget_repository": local.ResourceArtifactoryLocalNugetRepository(),
35-
"artifactory_local_maven_repository": local.ResourceArtifactoryLocalJavaRepository("maven", false),
35+
"artifactory_local_maven_repository": local.ResourceArtifactoryLocalJavaRepository(repository.MavenPackageType, false),
3636
"artifactory_local_alpine_repository": local.ResourceArtifactoryLocalAlpineRepository(),
3737
"artifactory_local_cargo_repository": local.ResourceArtifactoryLocalCargoRepository(),
3838
"artifactory_local_conan_repository": local.ResourceArtifactoryLocalConanRepository(),
@@ -63,7 +63,7 @@ func resourcesMap() map[string]*schema.Resource {
6363
"artifactory_virtual_conan_repository": virtual.ResourceArtifactoryVirtualConanRepository(),
6464
"artifactory_virtual_debian_repository": virtual.ResourceArtifactoryVirtualDebianRepository(),
6565
"artifactory_virtual_docker_repository": virtual.ResourceArtifactoryVirtualDockerRepository(),
66-
"artifactory_virtual_maven_repository": virtual.ResourceArtifactoryVirtualJavaRepository("maven"),
66+
"artifactory_virtual_maven_repository": virtual.ResourceArtifactoryVirtualJavaRepository(repository.MavenPackageType),
6767
"artifactory_virtual_npm_repository": virtual.ResourceArtifactoryVirtualNpmRepository(),
6868
"artifactory_virtual_nuget_repository": virtual.ResourceArtifactoryVirtualNugetRepository(),
6969
"artifactory_virtual_go_repository": virtual.ResourceArtifactoryVirtualGoRepository(),

pkg/artifactory/resource/repository/repository.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,8 @@ var GradleLikePackageTypes = []string{
289289
"ivy",
290290
}
291291

292+
const MavenPackageType = "maven"
293+
292294
var ProjectEnvironmentsSupported = []string{"DEV", "PROD"}
293295

294296
func RepoLayoutRefSchema(repositoryType string, packageType string) map[string]*schema.Schema {

pkg/artifactory/resource/repository/virtual/resource_artifactory_virtual_java_repository.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,5 +82,4 @@ func ResourceArtifactoryVirtualJavaRepository(repoType string) *schema.Resource
8282
unpackMavenVirtualRepository,
8383
constructor,
8484
)
85-
8685
}

pkg/artifactory/resource/security/resource_artifactory_group.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"net/http"
66
"strconv"
77

8+
"github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator"
89
"github.com/hashicorp/terraform-plugin-framework/diag"
910
"github.com/hashicorp/terraform-plugin-framework/path"
1011
"github.com/hashicorp/terraform-plugin-framework/resource"
@@ -86,6 +87,9 @@ func (r *ArtifactoryGroupResource) Schema(ctx context.Context, req resource.Sche
8687
"name": schema.StringAttribute{
8788
MarkdownDescription: "Name of the group.",
8889
Required: true,
90+
Validators: []validator.String{
91+
stringvalidator.LengthBetween(1, 64),
92+
},
8993
},
9094
"description": schema.StringAttribute{
9195
MarkdownDescription: "A description for the group.",

pkg/artifactory/resource/security/resource_artifactory_group_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"net/http"
66
"regexp"
7+
"strings"
78
"testing"
89

910
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
@@ -189,6 +190,42 @@ func TestAccGroup_bool_conflict(t *testing.T) {
189190
})
190191
}
191192

193+
func TestAccGroup_name_too_long(t *testing.T) {
194+
_, fqrn, groupName := testutil.MkNames("test-group-full", "artifactory_group")
195+
196+
groupName = fmt.Sprintf("%s%s", groupName, strings.Repeat("X", 60))
197+
temp := `
198+
resource "artifactory_group" "{{ .groupName }}" {
199+
name = "{{ .groupName }}"
200+
description = "Test group"
201+
external_id = "externalID"
202+
auto_join = true
203+
admin_privileges = false
204+
realm = "test"
205+
realm_attributes = "Some attribute"
206+
detach_all_users = true
207+
watch_manager = true
208+
policy_manager = true
209+
reports_manager = true
210+
users_names = ["anonymous", "admin"]
211+
}
212+
`
213+
214+
config := util.ExecuteTemplate(groupName, temp, map[string]string{"groupName": groupName})
215+
216+
resource.Test(t, resource.TestCase{
217+
PreCheck: func() { acctest.PreCheck(t) },
218+
ProtoV6ProviderFactories: acctest.ProtoV6ProviderFactories,
219+
CheckDestroy: testAccCheckGroupDestroy(fqrn),
220+
Steps: []resource.TestStep{
221+
{
222+
Config: config,
223+
ExpectError: regexp.MustCompile(".*Attribute name string length must be between 1 and 64.*"),
224+
},
225+
},
226+
})
227+
}
228+
192229
func TestAccGroup_unmanaged_members_update(t *testing.T) {
193230
_, fqrn, groupName := testutil.MkNames("test-group-unmanaged-members", "artifactory_group")
194231

pkg/artifactory/resource/security/resource_artifactory_permission_target.go

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package security
33
import (
44
"context"
55
"net/http"
6+
"regexp"
67
"strings"
78

89
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
@@ -323,26 +324,37 @@ func PackPermissionTarget(permissionTarget *PermissionTargetParams, d *schema.Re
323324
errors = setValue("release_bundle", packPermission(permissionTarget.ReleaseBundle))
324325
}
325326

326-
if errors != nil && len(errors) > 0 {
327+
if len(errors) > 0 {
327328
return diag.Errorf("failed to marshal permission target %q", errors)
328329
}
329330
return nil
330331
}
331332

333+
var conflictRegex = regexp.MustCompile(`.*Can't create permission target '.+' for type .+\. It already exists.*`)
334+
332335
func resourcePermissionTargetCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
333336
permissionTarget := unpackPermissionTarget(ctx, d)
334337

335-
if _, err := m.(util.ProvderMetadata).Client.R().AddRetryCondition(repository.Retry400).SetBody(permissionTarget).Post(PermissionsEndPoint + permissionTarget.Name); err != nil {
336-
return diag.FromErr(err)
338+
resp, err := m.(util.ProvderMetadata).Client.R().
339+
AddRetryCondition(repository.Retry400).
340+
SetBody(permissionTarget).
341+
Post(PermissionsEndPoint + permissionTarget.Name)
342+
if err != nil {
343+
if !(resp.StatusCode() == http.StatusConflict && conflictRegex.Match(resp.Body())) {
344+
return diag.FromErr(err)
345+
}
337346
}
338347

339348
d.SetId(permissionTarget.Name)
340-
return nil
349+
return resourcePermissionTargetRead(ctx, d, m)
341350
}
342351

343352
func resourcePermissionTargetRead(_ context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
344-
permissionTarget := new(PermissionTargetParams)
345-
resp, err := m.(util.ProvderMetadata).Client.R().SetResult(permissionTarget).Get(PermissionsEndPoint + d.Id())
353+
var permissionTarget PermissionTargetParams
354+
355+
resp, err := m.(util.ProvderMetadata).Client.R().
356+
SetResult(&permissionTarget).
357+
Get(PermissionsEndPoint + d.Id())
346358
if err != nil {
347359
if resp != nil && resp.StatusCode() == http.StatusNotFound {
348360
d.SetId("")
@@ -351,13 +363,16 @@ func resourcePermissionTargetRead(_ context.Context, d *schema.ResourceData, m i
351363
return diag.FromErr(err)
352364
}
353365

354-
return PackPermissionTarget(permissionTarget, d)
366+
return PackPermissionTarget(&permissionTarget, d)
355367
}
356368

357369
func resourcePermissionTargetUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
358370
permissionTarget := unpackPermissionTarget(ctx, d)
359371

360-
if _, err := m.(util.ProvderMetadata).Client.R().SetBody(permissionTarget).Put(PermissionsEndPoint + d.Id()); err != nil {
372+
_, err := m.(util.ProvderMetadata).Client.R().
373+
SetBody(permissionTarget).
374+
Put(PermissionsEndPoint + d.Id())
375+
if err != nil {
361376
return diag.FromErr(err)
362377
}
363378

0 commit comments

Comments
 (0)