diff --git a/CHANGELOG.md b/CHANGELOG.md index b8f0aff7f..d1ca9a522 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ BUG FIXES: * 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) +* 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) ## 10.1.3 (Feb 7, 2024) diff --git a/pkg/artifactory/resource/security/resource_artifactory_permission_target.go b/pkg/artifactory/resource/security/resource_artifactory_permission_target.go index 5fa5e30bf..9bed430df 100644 --- a/pkg/artifactory/resource/security/resource_artifactory_permission_target.go +++ b/pkg/artifactory/resource/security/resource_artifactory_permission_target.go @@ -3,6 +3,7 @@ package security import ( "context" "net/http" + "regexp" "strings" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" @@ -323,26 +324,37 @@ func PackPermissionTarget(permissionTarget *PermissionTargetParams, d *schema.Re errors = setValue("release_bundle", packPermission(permissionTarget.ReleaseBundle)) } - if errors != nil && len(errors) > 0 { + if len(errors) > 0 { return diag.Errorf("failed to marshal permission target %q", errors) } return nil } +var conflictRegex = regexp.MustCompile(`.*Can't create permission target '.+' for type .+\. It already exists.*`) + func resourcePermissionTargetCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { permissionTarget := unpackPermissionTarget(ctx, d) - if _, err := m.(util.ProvderMetadata).Client.R().AddRetryCondition(repository.Retry400).SetBody(permissionTarget).Post(PermissionsEndPoint + permissionTarget.Name); err != nil { - return diag.FromErr(err) + resp, err := m.(util.ProvderMetadata).Client.R(). + AddRetryCondition(repository.Retry400). + SetBody(permissionTarget). + Post(PermissionsEndPoint + permissionTarget.Name) + if err != nil { + if !(resp.StatusCode() == http.StatusConflict && conflictRegex.Match(resp.Body())) { + return diag.FromErr(err) + } } d.SetId(permissionTarget.Name) - return nil + return resourcePermissionTargetRead(ctx, d, m) } func resourcePermissionTargetRead(_ context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - permissionTarget := new(PermissionTargetParams) - resp, err := m.(util.ProvderMetadata).Client.R().SetResult(permissionTarget).Get(PermissionsEndPoint + d.Id()) + var permissionTarget PermissionTargetParams + + resp, err := m.(util.ProvderMetadata).Client.R(). + SetResult(&permissionTarget). + Get(PermissionsEndPoint + d.Id()) if err != nil { if resp != nil && resp.StatusCode() == http.StatusNotFound { d.SetId("") @@ -351,13 +363,16 @@ func resourcePermissionTargetRead(_ context.Context, d *schema.ResourceData, m i return diag.FromErr(err) } - return PackPermissionTarget(permissionTarget, d) + return PackPermissionTarget(&permissionTarget, d) } func resourcePermissionTargetUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { permissionTarget := unpackPermissionTarget(ctx, d) - if _, err := m.(util.ProvderMetadata).Client.R().SetBody(permissionTarget).Put(PermissionsEndPoint + d.Id()); err != nil { + _, err := m.(util.ProvderMetadata).Client.R(). + SetBody(permissionTarget). + Put(PermissionsEndPoint + d.Id()) + if err != nil { return diag.FromErr(err) }