@@ -52,16 +52,23 @@ func ResourceAccessControlRuleSet() common.Resource {
5252 }
5353 return workspaceClient .AccountAccessControlProxy .UpdateRuleSet (ctx , updateRuleSetReq )
5454 }
55- fetchLatestEtagAndUpdateRuleSet := func (ctx context.Context , c * common.DatabricksClient ,
56- ruleSetUpdateReq iam.UpdateRuleSetRequest ) (* iam.RuleSetResponse , error ) {
55+ fetchLatestEtag := func (ctx context.Context , c * common.DatabricksClient , name string ) (string , error ) {
5756 ruleSetGetRes , err := readFromWsOrAcc (ctx , c , iam.GetRuleSetRequest {
58- Name : ruleSetUpdateReq . Name ,
57+ Name : name ,
5958 Etag : "" ,
6059 })
60+ if err != nil {
61+ return "" , err
62+ }
63+ return ruleSetGetRes .Etag , nil
64+ }
65+ updateRuleSet := func (ctx context.Context , c * common.DatabricksClient ,
66+ ruleSetUpdateReq iam.UpdateRuleSetRequest ) (* iam.RuleSetResponse , error ) {
67+ latestEtag , err := fetchLatestEtag (ctx , c , ruleSetUpdateReq .Name )
6168 if err != nil {
6269 return nil , err
6370 }
64- ruleSetUpdateReq .RuleSet .Etag = ruleSetGetRes . Etag
71+ ruleSetUpdateReq .RuleSet .Etag = latestEtag
6572 ruleSetUpdateRes , err := updateThroughWsOrAcc (ctx , c , ruleSetUpdateReq )
6673 if err != nil {
6774 return nil , err
@@ -79,7 +86,7 @@ func ResourceAccessControlRuleSet() common.Resource {
7986 if aerr .StatusCode == http .StatusConflict {
8087 if aerr .ErrorCode == "RESOURCE_CONFLICT" {
8188 // we need to get and update
82- etag , err := fetchLatestEtagAndUpdateRuleSet (ctx , c , ruleSetUpdateReq )
89+ etag , err := updateRuleSet (ctx , c , ruleSetUpdateReq )
8390 return etag , err
8491 }
8592 }
@@ -96,10 +103,12 @@ func ResourceAccessControlRuleSet() common.Resource {
96103 var ruleSetUpdateReq iam.UpdateRuleSetRequest
97104 common .DataToStructPointer (d , s , & ruleSetUpdateReq .RuleSet )
98105 ruleSetUpdateReq .Name = ruleSetUpdateReq .RuleSet .Name
99- response , err := fetchLatestEtagAndUpdateRuleSet (ctx , c , ruleSetUpdateReq )
106+ response , err := updateRuleSet (ctx , c , ruleSetUpdateReq )
100107 if err != nil {
101108 return err
102109 }
110+ // Store empty etag in state as we will always use the latest etag
111+ response .Etag = ""
103112 err = common .StructToData (response , s , d )
104113 if err != nil {
105114 return err
@@ -110,22 +119,32 @@ func ResourceAccessControlRuleSet() common.Resource {
110119 Read : func (ctx context.Context , d * schema.ResourceData , c * common.DatabricksClient ) error {
111120 data , err := readFromWsOrAcc (ctx , c , iam.GetRuleSetRequest {
112121 Name : d .Id (),
113- Etag : d . Get ( "etag" ).( string ) ,
122+ Etag : "" ,
114123 })
115124 if err != nil {
116125 return err
117126 }
127+ // Store empty etag in state as we will always use the latest etag
128+ data .Etag = ""
118129 return common .StructToData (data , s , d )
119130 },
120131 Update : func (ctx context.Context , d * schema.ResourceData , c * common.DatabricksClient ) error {
132+ // Fetch the latest Etag
133+ latestEtag , err := fetchLatestEtag (ctx , c , d .Id ())
134+ if err != nil {
135+ return err
136+ }
137+
121138 var ruleSetUpdateReq iam.UpdateRuleSetRequest
122139 common .DataToStructPointer (d , s , & ruleSetUpdateReq .RuleSet )
123140 ruleSetUpdateReq .Name = ruleSetUpdateReq .RuleSet .Name
124- // etag should already be present
141+ ruleSetUpdateReq . RuleSet . Etag = latestEtag
125142 response , err := handleConflictAndUpdate (ctx , c , ruleSetUpdateReq )
126143 if err != nil {
127144 return err
128145 }
146+ // Storing empty etag in state as we will always use the latest etag
147+ response .Etag = ""
129148 err = common .StructToData (response , s , d )
130149 if err != nil {
131150 return err
@@ -134,12 +153,18 @@ func ResourceAccessControlRuleSet() common.Resource {
134153 return nil
135154 },
136155 Delete : func (ctx context.Context , d * schema.ResourceData , c * common.DatabricksClient ) error {
156+ // Fetch the latest Etag
157+ latestEtag , err := fetchLatestEtag (ctx , c , d .Id ())
158+ if err != nil {
159+ return err
160+ }
161+
137162 // we remove all grant rules. Account admins will still be able to update rule set
138- _ , err : = handleConflictAndUpdate (ctx , c , iam.UpdateRuleSetRequest {
163+ _ , err = handleConflictAndUpdate (ctx , c , iam.UpdateRuleSetRequest {
139164 Name : d .Id (),
140165 RuleSet : iam.RuleSetUpdateRequest {
141166 Name : d .Id (),
142- Etag : d . Get ( "etag" ).( string ) ,
167+ Etag : latestEtag ,
143168 },
144169 })
145170 if err != nil {
0 commit comments