@@ -6,8 +6,10 @@ import (
6
6
"regexp"
7
7
8
8
"github.com/hashicorp/terraform/helper/schema"
9
+ "github.com/hashicorp/terraform/helper/validation"
9
10
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure"
10
11
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf"
12
+ "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/validate"
11
13
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
12
14
"github.com/tombuildsstuff/giovanni/storage/2018-11-09/table/tables"
13
15
)
@@ -17,6 +19,7 @@ func resourceArmStorageTable() *schema.Resource {
17
19
Create : resourceArmStorageTableCreate ,
18
20
Read : resourceArmStorageTableRead ,
19
21
Delete : resourceArmStorageTableDelete ,
22
+ Update : resourceArmStorageTableUpdate ,
20
23
Importer : & schema.ResourceImporter {
21
24
State : schema .ImportStatePassthrough ,
22
25
},
@@ -41,7 +44,42 @@ func resourceArmStorageTable() *schema.Resource {
41
44
// TODO: deprecate this in the docs
42
45
"resource_group_name" : azure .SchemaResourceGroupNameDeprecated (),
43
46
44
- // TODO: support for ACL's
47
+ "acl" : {
48
+ Type : schema .TypeSet ,
49
+ Optional : true ,
50
+ Elem : & schema.Resource {
51
+ Schema : map [string ]* schema.Schema {
52
+ "id" : {
53
+ Type : schema .TypeString ,
54
+ Required : true ,
55
+ ValidateFunc : validation .StringLenBetween (1 , 64 ),
56
+ },
57
+ "access_policy" : {
58
+ Type : schema .TypeList ,
59
+ Optional : true ,
60
+ Elem : & schema.Resource {
61
+ Schema : map [string ]* schema.Schema {
62
+ "start" : {
63
+ Type : schema .TypeString ,
64
+ Required : true ,
65
+ ValidateFunc : validate .NoEmptyStrings ,
66
+ },
67
+ "expiry" : {
68
+ Type : schema .TypeString ,
69
+ Required : true ,
70
+ ValidateFunc : validate .NoEmptyStrings ,
71
+ },
72
+ "permissions" : {
73
+ Type : schema .TypeString ,
74
+ Required : true ,
75
+ ValidateFunc : validate .NoEmptyStrings ,
76
+ },
77
+ },
78
+ },
79
+ },
80
+ },
81
+ },
82
+ },
45
83
},
46
84
}
47
85
}
@@ -52,6 +90,8 @@ func resourceArmStorageTableCreate(d *schema.ResourceData, meta interface{}) err
52
90
53
91
tableName := d .Get ("name" ).(string )
54
92
accountName := d .Get ("storage_account_name" ).(string )
93
+ aclsRaw := d .Get ("acl" ).(* schema.Set ).List ()
94
+ acls := expandStorageTableACLs (aclsRaw )
55
95
56
96
resourceGroup , err := storageClient .FindResourceGroup (ctx , accountName )
57
97
if err != nil {
@@ -82,6 +122,10 @@ func resourceArmStorageTableCreate(d *schema.ResourceData, meta interface{}) err
82
122
return fmt .Errorf ("Error creating Table %q within Storage Account %q: %s" , tableName , accountName , err )
83
123
}
84
124
125
+ if _ , err := client .SetACL (ctx , accountName , tableName , acls ); err != nil {
126
+ return fmt .Errorf ("Error setting ACL's for Storage Table %q (Account %q / Resource Group %q): %+v" , tableName , accountName , * resourceGroup , err )
127
+ }
128
+
85
129
d .SetId (id )
86
130
return resourceArmStorageTableRead (d , meta )
87
131
}
@@ -122,15 +166,19 @@ func resourceArmStorageTableRead(d *schema.ResourceData, meta interface{}) error
122
166
return fmt .Errorf ("Error retrieving Table %q in Storage Account %q: %s" , id .TableName , id .AccountName , err )
123
167
}
124
168
125
- _ , err = client .GetACL (ctx , id .AccountName , id .TableName )
169
+ acls , err : = client .GetACL (ctx , id .AccountName , id .TableName )
126
170
if err != nil {
127
- return fmt .Errorf ("Error retrieving Table %q in Storage Account %q: %s" , id .TableName , id .AccountName , err )
171
+ return fmt .Errorf ("Error retrieving ACL's %q in Storage Account %q: %s" , id .TableName , id .AccountName , err )
128
172
}
129
173
130
174
d .Set ("name" , id .TableName )
131
175
d .Set ("storage_account_name" , id .AccountName )
132
176
d .Set ("resource_group_name" , resourceGroup )
133
177
178
+ if err := d .Set ("acl" , flattenStorageTableACLs (acls )); err != nil {
179
+ return fmt .Errorf ("Error flattening `acl`: %+v" , err )
180
+ }
181
+
134
182
return nil
135
183
}
136
184
@@ -166,6 +214,47 @@ func resourceArmStorageTableDelete(d *schema.ResourceData, meta interface{}) err
166
214
return nil
167
215
}
168
216
217
+ func resourceArmStorageTableUpdate (d * schema.ResourceData , meta interface {}) error {
218
+ storageClient := meta .(* ArmClient ).storage
219
+ ctx := meta .(* ArmClient ).StopContext
220
+
221
+ id , err := tables .ParseResourceID (d .Id ())
222
+ if err != nil {
223
+ return err
224
+ }
225
+
226
+ resourceGroup , err := storageClient .FindResourceGroup (ctx , id .AccountName )
227
+ if err != nil {
228
+ return fmt .Errorf ("Error locating Resource Group: %s" , err )
229
+ }
230
+
231
+ if resourceGroup == nil {
232
+ log .Printf ("Unable to determine Resource Group for Storage Account %q (assuming removed)" , id .AccountName )
233
+ d .SetId ("" )
234
+ return nil
235
+ }
236
+
237
+ client , err := storageClient .TablesClient (ctx , * resourceGroup , id .AccountName )
238
+ if err != nil {
239
+ return fmt .Errorf ("Error building Table Client: %s" , err )
240
+ }
241
+
242
+ if d .HasChange ("acl" ) {
243
+ log .Printf ("[DEBUG] Updating the ACL's for Storage Table %q (Storage Account %q)" , id .TableName , id .AccountName )
244
+
245
+ aclsRaw := d .Get ("acl" ).(* schema.Set ).List ()
246
+ acls := expandStorageTableACLs (aclsRaw )
247
+
248
+ if _ , err := client .SetACL (ctx , id .AccountName , id .TableName , acls ); err != nil {
249
+ return fmt .Errorf ("Error updating ACL's for Storage Table %q (Storage Account %q): %s" , id .TableName , id .AccountName , err )
250
+ }
251
+
252
+ log .Printf ("[DEBUG] Updated the ACL's for Storage Table %q (Storage Account %q)" , id .TableName , id .AccountName )
253
+ }
254
+
255
+ return resourceArmStorageTableRead (d , meta )
256
+ }
257
+
169
258
func validateArmStorageTableName (v interface {}, k string ) (warnings []string , errors []error ) {
170
259
value := v .(string )
171
260
if value == "table" {
@@ -181,3 +270,47 @@ func validateArmStorageTableName(v interface{}, k string) (warnings []string, er
181
270
182
271
return warnings , errors
183
272
}
273
+
274
+ func expandStorageTableACLs (input []interface {}) []tables.SignedIdentifier {
275
+ results := make ([]tables.SignedIdentifier , 0 )
276
+
277
+ for _ , v := range input {
278
+ vals := v .(map [string ]interface {})
279
+
280
+ policies := vals ["access_policy" ].([]interface {})
281
+ policy := policies [0 ].(map [string ]interface {})
282
+
283
+ identifier := tables.SignedIdentifier {
284
+ Id : vals ["id" ].(string ),
285
+ AccessPolicy : tables.AccessPolicy {
286
+ Start : policy ["start" ].(string ),
287
+ Expiry : policy ["expiry" ].(string ),
288
+ Permission : policy ["permissions" ].(string ),
289
+ },
290
+ }
291
+ results = append (results , identifier )
292
+ }
293
+
294
+ return results
295
+ }
296
+
297
+ func flattenStorageTableACLs (input tables.GetACLResult ) []interface {} {
298
+ result := make ([]interface {}, 0 )
299
+
300
+ for _ , v := range input .SignedIdentifiers {
301
+ output := map [string ]interface {}{
302
+ "id" : v .Id ,
303
+ "access_policy" : []interface {}{
304
+ map [string ]interface {}{
305
+ "start" : v .AccessPolicy .Start ,
306
+ "expiry" : v .AccessPolicy .Expiry ,
307
+ "permissions" : v .AccessPolicy .Permission ,
308
+ },
309
+ },
310
+ }
311
+
312
+ result = append (result , output )
313
+ }
314
+
315
+ return result
316
+ }
0 commit comments