@@ -2,6 +2,7 @@ package app
22
33import (
44 "context"
5+ "errors"
56 "fmt"
67 "reflect"
78 "slices"
@@ -28,7 +29,7 @@ import (
2829const (
2930 resourceName = "app"
3031 resourceNamePlural = "apps"
31- appDeletionTimeout = 10 * time .Minute
32+ appCreateTimeout = 1 * time .Minute
3233)
3334
3435type AppResource struct {
@@ -129,15 +130,26 @@ func (a *resourceApp) Create(ctx context.Context, req resource.CreateRequest, re
129130 return
130131 }
131132
132- // Create the app
133133 var forceSendFields []string
134134 if ! app .NoCompute .IsNull () {
135135 forceSendFields = append (forceSendFields , "NoCompute" )
136136 }
137- waiter , err := w . Apps . Create ( ctx , apps.CreateAppRequest {
137+ createReq := apps.CreateAppRequest {
138138 App : appGoSdk ,
139139 NoCompute : app .NoCompute .ValueBool (),
140140 ForceSendFields : forceSendFields ,
141+ }
142+
143+ retrier := retries .New [apps.App ](retries .WithTimeout (appCreateTimeout ), retries .WithRetryFunc (shouldRetry ))
144+ createdApp , err := retrier .Run (ctx , func (ctx context.Context ) (* apps.App , error ) {
145+ waiter , err := w .Apps .Create (ctx , createReq )
146+ if err != nil {
147+ if errors .Is (err , apierr .ErrResourceAlreadyExists ) {
148+ return nil , retries .Continues ("app already exists, retrying" )
149+ }
150+ return nil , retries .Halt (err )
151+ }
152+ return waiter .Response , nil
141153 })
142154 if err != nil {
143155 resp .Diagnostics .AddError ("failed to create app" , err .Error ())
@@ -146,7 +158,7 @@ func (a *resourceApp) Create(ctx context.Context, req resource.CreateRequest, re
146158
147159 // Store the initial version of the app in state
148160 var newApp AppResource
149- resp .Diagnostics .Append (converters .GoSdkToTfSdkStruct (ctx , waiter . Response , & newApp )... )
161+ resp .Diagnostics .Append (converters .GoSdkToTfSdkStruct (ctx , createdApp , & newApp )... )
150162 if resp .Diagnostics .HasError () {
151163 return
152164 }
@@ -213,31 +225,6 @@ func (a *resourceApp) waitForApp(ctx context.Context, w *databricks.WorkspaceCli
213225 })
214226}
215227
216- func waitForAppDeleted (ctx context.Context , w * databricks.WorkspaceClient , name string ) error {
217- retrier := retries .New [struct {}](retries .WithTimeout (appDeletionTimeout ), retries .WithRetryFunc (shouldRetry ))
218- _ , err := retrier .Run (ctx , func (ctx context.Context ) (* struct {}, error ) {
219- app , err := w .Apps .GetByName (ctx , name )
220- if apierr .IsMissing (err ) {
221- return & struct {}{}, nil
222- }
223- if err != nil {
224- return nil , retries .Halt (err )
225- }
226- if app .ComputeStatus == nil {
227- return nil , retries .Continues ("waiting for compute status" )
228- }
229- switch app .ComputeStatus .State {
230- case apps .ComputeStateDeleting :
231- return nil , retries .Continues ("app is deleting" )
232- case apps .ComputeStateActive , apps .ComputeStateStopped , apps .ComputeStateError :
233- return nil , retries .Halt (fmt .Errorf ("app %s was not deleted, current state: %s" , name , app .ComputeStatus .State ))
234- default :
235- return nil , retries .Continues (fmt .Sprintf ("app is in %s state" , app .ComputeStatus .State ))
236- }
237- })
238- return err
239- }
240-
241228func (a * resourceApp ) Read (ctx context.Context , req resource.ReadRequest , resp * resource.ReadResponse ) {
242229 ctx = pluginfwcontext .SetUserAgentInResourceContext (ctx , resourceName )
243230
@@ -353,11 +340,6 @@ func (a *resourceApp) Delete(ctx context.Context, req resource.DeleteRequest, re
353340 resp .Diagnostics .AddError ("failed to delete app" , err .Error ())
354341 return
355342 }
356-
357- if err := waitForAppDeleted (ctx , w , app .Name .ValueString ()); err != nil {
358- resp .Diagnostics .AddError ("failed to wait for app deletion" , err .Error ())
359- return
360- }
361343}
362344
363345func (a * resourceApp ) ImportState (ctx context.Context , req resource.ImportStateRequest , resp * resource.ImportStateResponse ) {
0 commit comments