44 "context"
55 "errors"
66 "fmt"
7- "log"
87 "path"
98 "strconv"
109 "strings"
@@ -381,21 +380,7 @@ func ResourcePermissions() *schema.Resource {
381380 })
382381 return common.Resource {
383382 Schema : s ,
384- CustomizeDiff : func (ctx context.Context , diff * schema.ResourceDiff , c any ) error {
385- client := c .(* common.DatabricksClient )
386- log .Printf ("[DEBUG] permissions id=%s, config_present=%v" , diff .Id (), client .Config != nil )
387- if client .Config .Host == "" || client .DatabricksClient .Config .Host == "" {
388- log .Printf ("[WARN] cannot validate permission levels, because host is not known yet" )
389- return nil
390- }
391- w , err := client .WorkspaceClient ()
392- if err != nil {
393- return err
394- }
395- me , err := w .CurrentUser .Me (ctx )
396- if err != nil {
397- return fmt .Errorf ("customize diff: me: %w" , err )
398- }
383+ CustomizeDiff : func (ctx context.Context , diff * schema.ResourceDiff ) error {
399384 // Plan time validation for object permission levels
400385 for _ , mapping := range permissionsResourceIDFields () {
401386 if _ , ok := diff .GetOk (mapping .field ); ! ok {
@@ -406,10 +391,8 @@ func ResourcePermissions() *schema.Resource {
406391 m := access_control .(map [string ]any )
407392 permission_level := m ["permission_level" ].(string )
408393 if ! stringInSlice (permission_level , mapping .allowedPermissionLevels ) {
409- return fmt .Errorf (`permission_level %s is not supported with %s objects` , permission_level , mapping .field )
410- }
411- if m ["user_name" ].(string ) == me .UserName {
412- return fmt .Errorf ("it is not possible to decrease administrative permissions for the current user: %s" , me .UserName )
394+ return fmt .Errorf (`permission_level %s is not supported with %s objects` ,
395+ permission_level , mapping .field )
413396 }
414397 }
415398 }
@@ -443,12 +426,25 @@ func ResourcePermissions() *schema.Resource {
443426 Create : func (ctx context.Context , d * schema.ResourceData , c * common.DatabricksClient ) error {
444427 var entity PermissionsEntity
445428 common .DataToStructPointer (d , s , & entity )
429+ w , err := c .WorkspaceClient ()
430+ if err != nil {
431+ return err
432+ }
433+ me , err := w .CurrentUser .Me (ctx )
434+ if err != nil {
435+ return err
436+ }
437+ // this logic was moved from CustomizeDiff because of undeterministic auth behavior
438+ // in the corner-case scenarios.
439+ // see https://github.com/databricks/terraform-provider-databricks/issues/2052
440+ for _ , v := range entity .AccessControlList {
441+ if v .UserName == me .UserName {
442+ format := "it is not possible to decrease administrative permissions for the current user: %s"
443+ return fmt .Errorf (format , me .UserName )
444+ }
445+ }
446446 for _ , mapping := range permissionsResourceIDFields () {
447447 if v , ok := d .GetOk (mapping .field ); ok {
448- w , err := c .WorkspaceClient ()
449- if err != nil {
450- return err
451- }
452448 id , err := mapping .idRetriever (ctx , w , v .(string ))
453449 if err != nil {
454450 return err
0 commit comments