@@ -93,6 +93,14 @@ func resourceSnapshot() *schema.Resource {
93
93
Required : true ,
94
94
ForceNew : true ,
95
95
},
96
+ "metadata" : & schema.Schema {
97
+ Type : schema .TypeMap ,
98
+ Optional : true ,
99
+ Computed : true ,
100
+ Elem : & schema.Schema {
101
+ Type : schema .TypeString ,
102
+ },
103
+ },
96
104
"last_updated" : & schema.Schema {
97
105
Type : schema .TypeString ,
98
106
Optional : true ,
@@ -174,6 +182,9 @@ func resourceSnapshotRead(ctx context.Context, d *schema.ResourceData, m interfa
174
182
d .Set ("volume_id" , snapshot .VolumeID )
175
183
d .Set ("region_id" , snapshot .RegionID )
176
184
d .Set ("project_id" , snapshot .ProjectID )
185
+ if err := d .Set ("metadata" , snapshot .Metadata ); err != nil {
186
+ return diag .FromErr (err )
187
+ }
177
188
178
189
log .Println ("[DEBUG] Finish snapshot reading" )
179
190
return diags
@@ -182,7 +193,24 @@ func resourceSnapshotRead(ctx context.Context, d *schema.ResourceData, m interfa
182
193
func resourceSnapshotUpdate (ctx context.Context , d * schema.ResourceData , m interface {}) diag.Diagnostics {
183
194
log .Println ("[DEBUG] Start snapshot updating" )
184
195
snapshotID := d .Id ()
185
- log .Printf ("[DEBUG] Snapshot id = %s" , snapshotID )
196
+ if d .HasChange ("metadata" ) {
197
+ config := m .(* Config )
198
+ provider := config .Provider
199
+ client , err := CreateClient (provider , d , snapshotsPoint , versionPointV1 )
200
+ if err != nil {
201
+ return diag .FromErr (err )
202
+ }
203
+
204
+ newMeta := prepareRawMetadata (d .Get ("metadata" ).(map [string ]interface {}))
205
+ metadata := make ([]snapshots.MetadataOpts , 0 , len (newMeta ))
206
+ for k , v := range newMeta {
207
+ metadata = append (metadata , snapshots.MetadataOpts {Key : k , Value : v })
208
+ }
209
+ opts := snapshots.MetadataSetOpts {Metadata : metadata }
210
+ if _ , err := snapshots .MetadataReplace (client , snapshotID , opts ).Extract (); err != nil {
211
+ return diag .FromErr (err )
212
+ }
213
+ }
186
214
d .Set ("last_updated" , time .Now ().Format (time .RFC850 ))
187
215
log .Println ("[DEBUG] Finish snapshot updating" )
188
216
return resourceSnapshotRead (ctx , d , m )
@@ -233,6 +261,18 @@ func getSnapshotData(d *schema.ResourceData) (*snapshots.CreateOpts, error) {
233
261
snapshotData .Name = d .Get ("name" ).(string )
234
262
snapshotData .VolumeID = d .Get ("volume_id" ).(string )
235
263
snapshotData .Description = d .Get ("description" ).(string )
264
+ metadataRaw := d .Get ("metadata" ).(map [string ]interface {})
265
+ if len (metadataRaw ) > 0 {
266
+ snapshotData .Metadata = prepareRawMetadata (metadataRaw )
267
+ }
236
268
237
269
return & snapshotData , nil
238
270
}
271
+
272
+ func prepareRawMetadata (raw map [string ]interface {}) map [string ]string {
273
+ meta := make (map [string ]string , len (raw ))
274
+ for k , v := range raw {
275
+ meta [k ] = v .(string )
276
+ }
277
+ return meta
278
+ }
0 commit comments