@@ -2,10 +2,13 @@ package dresources
22
33import (
44 "context"
5+ "fmt"
6+ "time"
57
68 "github.com/databricks/cli/bundle/config/resources"
79 "github.com/databricks/databricks-sdk-go"
810 "github.com/databricks/databricks-sdk-go/common/types/fieldmask"
11+ "github.com/databricks/databricks-sdk-go/retries"
912 "github.com/databricks/databricks-sdk-go/service/apps"
1013)
1114
@@ -26,29 +29,53 @@ func (r *ResourceAppSpace) DoRead(ctx context.Context, id string) (*apps.Space,
2629}
2730
2831func (r * ResourceAppSpace ) DoCreate (ctx context.Context , config * apps.Space ) (string , * apps.Space , error ) {
29- waiter , err := r .client .Apps .CreateSpace (ctx , apps.CreateSpaceRequest {
32+ // Kick off the create request. Wait for the space to become active in
33+ // WaitAfterCreate so that parallel creates are not blocked here.
34+ _ , err := r .client .Apps .CreateSpace (ctx , apps.CreateSpaceRequest {
3035 Space : * config ,
3136 })
3237 if err != nil {
3338 return "" , nil , err
3439 }
35- space , err := waiter .Wait (ctx )
36- if err != nil {
37- return "" , nil , err
38- }
39- return space .Name , space , nil
40+ return config .Name , nil , nil
4041}
4142
4243func (r * ResourceAppSpace ) DoUpdate (ctx context.Context , id string , config * apps.Space , _ * PlanEntry ) (* apps.Space , error ) {
43- waiter , err := r .client .Apps .UpdateSpace (ctx , apps.UpdateSpaceRequest {
44+ _ , err := r .client .Apps .UpdateSpace (ctx , apps.UpdateSpaceRequest {
4445 Name : id ,
4546 Space : * config ,
4647 UpdateMask : fieldmask.FieldMask {Paths : []string {"description" , "resources" , "user_api_scopes" , "usage_policy_id" }},
4748 })
48- if err != nil {
49- return nil , err
50- }
51- return waiter .Wait (ctx )
49+ return nil , err
50+ }
51+
52+ func (r * ResourceAppSpace ) WaitAfterCreate (ctx context.Context , config * apps.Space ) (* apps.Space , error ) {
53+ return r .waitForSpaceActive (ctx , config .Name )
54+ }
55+
56+ func (r * ResourceAppSpace ) WaitAfterUpdate (ctx context.Context , config * apps.Space ) (* apps.Space , error ) {
57+ return r .waitForSpaceActive (ctx , config .Name )
58+ }
59+
60+ func (r * ResourceAppSpace ) waitForSpaceActive (ctx context.Context , name string ) (* apps.Space , error ) {
61+ retrier := retries.New [apps.Space ](retries .WithTimeout (20 * time .Minute ))
62+ return retrier .Run (ctx , func (ctx context.Context ) (* apps.Space , error ) {
63+ space , err := r .client .Apps .GetSpace (ctx , apps.GetSpaceRequest {Name : name })
64+ if err != nil {
65+ return nil , retries .Halt (err )
66+ }
67+ if space .Status == nil {
68+ return nil , retries .Continues ("waiting for status" )
69+ }
70+ switch space .Status .State {
71+ case apps .SpaceStatusSpaceStateSpaceActive :
72+ return space , nil
73+ case apps .SpaceStatusSpaceStateSpaceError :
74+ return nil , retries .Halt (fmt .Errorf ("space %s is in ERROR state: %s" , name , space .Status .Message ))
75+ default :
76+ return nil , retries .Continues (fmt .Sprintf ("space state: %s" , space .Status .State ))
77+ }
78+ })
5279}
5380
5481func (r * ResourceAppSpace ) DoDelete (ctx context.Context , id string ) error {
0 commit comments