Skip to content

Commit e9b6e83

Browse files
mawasilegithub-actions[bot]
andauthored
Operation lifecycle operation continue on HTTP 409 responses (#719)
* feat: enhance lifecycle operation handling by adding support for HTTP 409 Conflict status * feat: add lifecycle operation support for HTTP 409 responses --------- Co-authored-by: github-actions[bot] <tfmod442916@users.noreply.github.com>
1 parent e8e9d86 commit e9b6e83

5 files changed

Lines changed: 26 additions & 6 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
kind: added
2+
body: Operation lifecycle operation continue on HTTP 409 responses
3+
time: 2025-04-24T13:25:57.572972549Z
4+
custom:
5+
Issue: "719"

internal/api/lifecycle.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func (client *Client) DoWaitForLifecycleOperationStatus(ctx context.Context, res
6666

6767
for {
6868
lifecycleResponse := LifecycleDto{}
69-
response, err = client.Execute(ctx, nil, "GET", locationHeader, nil, nil, []int{http.StatusOK}, &lifecycleResponse)
69+
response, err = client.Execute(ctx, nil, "GET", locationHeader, nil, nil, []int{http.StatusOK, http.StatusConflict}, &lifecycleResponse)
7070
if err != nil {
7171
return nil, err
7272
}
@@ -76,8 +76,11 @@ func (client *Client) DoWaitForLifecycleOperationStatus(ctx context.Context, res
7676
return nil, err
7777
}
7878

79-
tflog.Debug(ctx, "Lifecycle Operation State: '"+lifecycleResponse.State.Id+"'")
8079
tflog.Debug(ctx, "Lifecycle Operation HTTP Status: '"+response.HttpResponse.Status+"'")
80+
if response.HttpResponse.StatusCode == http.StatusConflict {
81+
continue
82+
}
83+
tflog.Debug(ctx, "Lifecycle Operation State: '"+lifecycleResponse.State.Id+"'")
8184

8285
if lifecycleResponse.State.Id == "Succeeded" || lifecycleResponse.State.Id == "Failed" {
8386
return &lifecycleResponse, nil

internal/services/application/api_application.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,16 @@ func (client *client) InstallApplicationInEnvironment(ctx context.Context, envir
123123

124124
for {
125125
lifecycleResponse := environmentApplicationLifecycleDto{}
126-
_, err = client.Api.Execute(ctx, nil, "GET", operationLocationHeader, nil, nil, []int{http.StatusOK}, &lifecycleResponse)
126+
response, err := client.Api.Execute(ctx, nil, "GET", operationLocationHeader, nil, nil, []int{http.StatusOK, http.StatusConflict}, &lifecycleResponse)
127127
if err != nil {
128128
return "", err
129129
}
130130

131+
if response.HttpResponse.StatusCode == http.StatusConflict {
132+
tflog.Debug(ctx, "Lifecycle Operation HTTP Status: '"+response.HttpResponse.Status+"'")
133+
continue
134+
}
135+
131136
if lifecycleResponse.Status == "Succeeded" {
132137
parts := strings.Split(lifecycleResponse.CreatedDateTime, "/")
133138
if len(parts) == 0 {

internal/services/environment/api_environment.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,11 +360,16 @@ func (client *Client) AddDataverseToEnvironment(ctx context.Context, environment
360360
}
361361
for {
362362
lifecycleEnv := &EnvironmentDto{}
363-
lifecycleResponse, err := client.Api.Execute(ctx, nil, "GET", locationHeader, nil, nil, []int{http.StatusOK, http.StatusAccepted}, &lifecycleEnv)
363+
lifecycleResponse, err := client.Api.Execute(ctx, nil, "GET", locationHeader, nil, nil, []int{http.StatusOK, http.StatusAccepted, http.StatusConflict}, &lifecycleEnv)
364364
if err != nil {
365365
return nil, err
366366
}
367367

368+
tflog.Debug(ctx, fmt.Sprintf("Dataverse Creation Operation HTTP Status: '%s'", lifecycleResponse.HttpResponse.Status))
369+
if lifecycleResponse.HttpResponse.StatusCode == http.StatusConflict {
370+
continue
371+
}
372+
368373
if lifecycleEnv == nil || lifecycleEnv.Properties == nil {
369374
tflog.Debug(ctx, fmt.Sprintf("The environment lifecycle response body did not match expected format. Response status code: %s", lifecycleResponse.HttpResponse.Status))
370375
continue
@@ -376,7 +381,6 @@ func (client *Client) AddDataverseToEnvironment(ctx context.Context, environment
376381
}
377382

378383
tflog.Debug(ctx, fmt.Sprintf("Dataverse Creation Operation State: '%s'", lifecycleEnv.Properties.ProvisioningState))
379-
tflog.Debug(ctx, fmt.Sprintf("Dataverse Creation Operation HTTP Status: '%s'", lifecycleResponse.HttpResponse.Status))
380384

381385
if lifecycleEnv.Properties.ProvisioningState == "Succeeded" {
382386
return lifecycleEnv, nil

internal/services/tenant_isolation_policy/api_tenant_isolation_policy.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,12 +165,15 @@ func (client *Client) doWaitForLifecycleOperationStatus(ctx context.Context, res
165165
}
166166

167167
for {
168-
apiResp, err := client.Api.Execute(ctx, nil, "GET", locationHeader, nil, nil, []int{http.StatusOK, http.StatusAccepted}, nil)
168+
apiResp, err := client.Api.Execute(ctx, nil, "GET", locationHeader, nil, nil, []int{http.StatusOK, http.StatusAccepted, http.StatusConflict}, nil)
169169
if err != nil {
170170
return nil, fmt.Errorf("error polling operation status: %v", err)
171171
}
172172

173173
tflog.Debug(ctx, fmt.Sprintf("Operation poll status: %s", apiResp.HttpResponse.Status))
174+
if apiResp.HttpResponse.StatusCode == http.StatusConflict {
175+
continue
176+
}
174177

175178
// If we get a 200 OK, the operation is complete
176179
if apiResp.HttpResponse.StatusCode == http.StatusOK {

0 commit comments

Comments
 (0)