@@ -4,11 +4,12 @@ import (
44 "cmp"
55 "context"
66 "fmt"
7+ "reflect"
78 "slices"
89
910 "github.com/databricks/cli/bundle"
1011 "github.com/databricks/cli/libs/diag"
11- "github.com/databricks/cli/libs/dyn "
12+ "github.com/databricks/cli/libs/structs/structpath "
1213)
1314
1415type lifecycleDependsOn struct {}
@@ -26,37 +27,33 @@ func (*lifecycleDependsOn) Name() string {
2627func (* lifecycleDependsOn ) Apply (_ context.Context , b * bundle.Bundle ) diag.Diagnostics {
2728 var diags diag.Diagnostics
2829
29- pattern := dyn .NewPattern (dyn .Key ("resources" ), dyn .AnyKey (), dyn .AnyKey (), dyn .Key ("lifecycle" ), dyn .Key ("depends_on" ))
30- _ , err := dyn .MapByPattern (b .Config .Value (), pattern , func (p dyn.Path , v dyn.Value ) (dyn.Value , error ) {
31- seq , ok := v .AsSequence ()
32- if ! ok {
33- return v , nil
34- }
35- self := p [:3 ].String ()
36- for i , item := range seq {
37- ref , ok := item .Get ("resource" ).AsString ()
38- if ! ok {
30+ for _ , group := range b .Config .Resources .AllResources () {
31+ for key , resource := range group .Resources {
32+ // Python-generated configs can contain null resource entries.
33+ if reflect .ValueOf (resource ).IsNil () {
3934 continue
4035 }
41- res , key , err := b .Config .Resources .ResolveKey (ref )
42- if err == nil && "resources." + res .ResourceDescription ().PluralName + "." + key == self {
43- err = fmt .Errorf ("resource %q cannot depend on itself" , ref )
44- }
45- if err != nil {
46- diags = diags .Append (diag.Diagnostic {
47- Severity : diag .Error ,
48- Summary : "invalid lifecycle.depends_on: " + err .Error (),
49- Locations : item .Locations (),
50- Paths : dyn .ToStructPaths (p .Append (dyn .Index (i ), dyn .Key ("resource" ))),
51- })
36+
37+ self := group .Description .PluralName + "." + key
38+ for i , dep := range resource .GetLifecycle ().GetDependsOn () {
39+ target , targetKey , err := b .Config .Resources .ResolveKey (dep .Resource )
40+ if err == nil && target .ResourceDescription ().PluralName + "." + targetKey == self {
41+ err = fmt .Errorf ("resource %q cannot depend on itself" , dep .Resource )
42+ }
43+ if err != nil {
44+ path := structpath .NewPath (nil , "resources" , group .Description .PluralName , key , "lifecycle" , "depends_on" , i , "resource" )
45+ diags = diags .Append (diag.Diagnostic {
46+ Severity : diag .Error ,
47+ Summary : "invalid lifecycle.depends_on: " + err .Error (),
48+ Locations : b .Config .GetLocationsOf (path ),
49+ Paths : []* structpath.PathNode {path },
50+ })
51+ }
5252 }
5353 }
54- return v , nil
55- })
56- if err != nil {
57- diags = diags .Extend (diag .FromErr (err ))
5854 }
59- // MapByPattern visits resources in random order.
55+
56+ // Resources are visited in random order.
6057 slices .SortStableFunc (diags , func (a , b diag.Diagnostic ) int {
6158 return cmp .Compare (a .Paths [0 ].String (), b .Paths [0 ].String ())
6259 })
0 commit comments