Skip to content

Commit b94e2f7

Browse files
authored
Merge pull request #2714 from gophercloud/bp-v1-a365a68-8d2245e-2267522
[v1] Add CRUD support for encryption in volume v3 types
2 parents d2f09a0 + 7192499 commit b94e2f7

File tree

7 files changed

+532
-0
lines changed

7 files changed

+532
-0
lines changed

acceptance/openstack/blockstorage/v3/volumetypes_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,44 @@ func TestVolumeTypesAccess(t *testing.T) {
163163

164164
th.AssertEquals(t, len(accessList), 0)
165165
}
166+
167+
func TestEncryptionVolumeTypes(t *testing.T) {
168+
clients.RequireAdmin(t)
169+
170+
client, err := clients.NewBlockStorageV3Client()
171+
th.AssertNoErr(t, err)
172+
173+
vt, err := CreateVolumeType(t, client)
174+
th.AssertNoErr(t, err)
175+
defer DeleteVolumeType(t, client, vt)
176+
177+
createEncryptionOpts := volumetypes.CreateEncryptionOpts{
178+
KeySize: 256,
179+
Provider: "luks",
180+
ControlLocation: "front-end",
181+
Cipher: "aes-xts-plain64",
182+
}
183+
184+
eVT, err := volumetypes.CreateEncryption(client, vt.ID, createEncryptionOpts).Extract()
185+
th.AssertNoErr(t, err)
186+
defer volumetypes.DeleteEncryption(client, eVT.VolumeTypeID, eVT.EncryptionID)
187+
188+
geVT, err := volumetypes.GetEncryption(client, vt.ID).Extract()
189+
th.AssertNoErr(t, err)
190+
tools.PrintResource(t, geVT)
191+
192+
key := "cipher"
193+
gesVT, err := volumetypes.GetEncryptionSpec(client, vt.ID, key).Extract()
194+
th.AssertNoErr(t, err)
195+
tools.PrintResource(t, gesVT)
196+
197+
updateEncryptionOpts := volumetypes.UpdateEncryptionOpts{
198+
ControlLocation: "back-end",
199+
}
200+
201+
newEVT, err := volumetypes.UpdateEncryption(client, vt.ID, eVT.EncryptionID, updateEncryptionOpts).Extract()
202+
tools.PrintResource(t, newEVT)
203+
th.AssertNoErr(t, err)
204+
205+
th.AssertEquals(t, "back-end", newEVT.ControlLocation)
206+
}

openstack/blockstorage/v3/volumetypes/doc.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,5 +160,61 @@ Example to Remove/Revoke Access to a Volume Type
160160
if err != nil {
161161
panic(err)
162162
}
163+
164+
Example to Create the Encryption of a Volume Type
165+
166+
typeID := "7ffaca22-f646-41d4-b79d-d7e4452ef8cc"
167+
volumeType, err := volumetypes.CreateEncryption(client, typeID, .CreateEncryptionOpts{
168+
KeySize: 256,
169+
Provider: "luks",
170+
ControlLocation: "front-end",
171+
Cipher: "aes-xts-plain64",
172+
}).Extract()
173+
if err != nil{
174+
panic(err)
175+
}
176+
fmt.Println(volumeType)
177+
178+
Example to Delete the Encryption of a Volume Type
179+
180+
typeID := "7ffaca22-f646-41d4-b79d-d7e4452ef8cc"
181+
encryptionID := ""81e069c6-7394-4856-8df7-3b237ca61f74
182+
err := volumetypes.DeleteEncryption(client, typeID, encryptionID).ExtractErr()
183+
if err != nil{
184+
panic(err)
185+
}
186+
187+
Example to Update the Encryption of a Volume Type
188+
189+
typeID := "7ffaca22-f646-41d4-b79d-d7e4452ef8cc"
190+
volumetype, err = volumetypes.UpdateEncryption(client, typeID, volumetypes.UpdateEncryptionOpts{
191+
KeySize: 256,
192+
Provider: "luks",
193+
ControlLocation: "front-end",
194+
Cipher: "aes-xts-plain64",
195+
}).Extract()
196+
if err != nil{
197+
panic(err)
198+
}
199+
fmt.Println(volumetype)
200+
201+
Example to Show an Encryption of a Volume Type
202+
203+
typeID := "7ffaca22-f646-41d4-b79d-d7e4452ef8cc"
204+
volumeType, err := volumetypes.GetEncrytpion(client, typeID).Extract()
205+
if err != nil{
206+
panic(err)
207+
}
208+
fmt.Println(volumeType)
209+
210+
Example to Show an Encryption Spec of a Volume Type
211+
212+
typeID := "7ffaca22-f646-41d4-b79d-d7e4452ef8cc"
213+
key := "cipher"
214+
volumeType, err := volumetypes.GetEncrytpionSpec(client, typeID).Extract()
215+
if err != nil{
216+
panic(err)
217+
}
218+
fmt.Println(volumeType)
163219
*/
164220
package volumetypes

openstack/blockstorage/v3/volumetypes/requests.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,3 +304,108 @@ func RemoveAccess(client *gophercloud.ServiceClient, id string, opts RemoveAcces
304304
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
305305
return
306306
}
307+
308+
// CreateEncryptionOptsBuilder allows extensions to add additional parameters to the
309+
// Create Encryption request.
310+
type CreateEncryptionOptsBuilder interface {
311+
ToEncryptionCreateMap() (map[string]interface{}, error)
312+
}
313+
314+
// CreateEncryptionOpts contains options for creating an Encryption Type object.
315+
// This object is passed to the volumetypes.CreateEncryption function.
316+
// For more information about these parameters,see the Encryption Type object.
317+
type CreateEncryptionOpts struct {
318+
// The size of the encryption key.
319+
KeySize int `json:"key_size"`
320+
// The class of that provides the encryption support.
321+
Provider string `json:"provider" required:"true"`
322+
// Notional service where encryption is performed.
323+
ControlLocation string `json:"control_location"`
324+
// The encryption algorithm or mode.
325+
Cipher string `json:"cipher"`
326+
}
327+
328+
// ToEncryptionCreateMap assembles a request body based on the contents of a
329+
// CreateEncryptionOpts.
330+
func (opts CreateEncryptionOpts) ToEncryptionCreateMap() (map[string]interface{}, error) {
331+
return gophercloud.BuildRequestBody(opts, "encryption")
332+
}
333+
334+
// CreateEncryption will creates an Encryption Type object based on the CreateEncryptionOpts.
335+
// To extract the Encryption Type object from the response, call the Extract method on the
336+
// EncryptionCreateResult.
337+
func CreateEncryption(client *gophercloud.ServiceClient, id string, opts CreateEncryptionOptsBuilder) (r CreateEncryptionResult) {
338+
b, err := opts.ToEncryptionCreateMap()
339+
if err != nil {
340+
r.Err = err
341+
return
342+
}
343+
resp, err := client.Post(createEncryptionURL(client, id), b, &r.Body, &gophercloud.RequestOpts{
344+
OkCodes: []int{200},
345+
})
346+
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
347+
return
348+
}
349+
350+
// Delete will delete an encryption type for an existing Volume Type with the provided ID.
351+
func DeleteEncryption(client *gophercloud.ServiceClient, id, encryptionID string) (r DeleteEncryptionResult) {
352+
resp, err := client.Delete(deleteEncryptionURL(client, id, encryptionID), nil)
353+
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
354+
return
355+
}
356+
357+
// GetEncryption retrieves the encryption type for an existing VolumeType with the provided ID.
358+
func GetEncryption(client *gophercloud.ServiceClient, id string) (r GetEncryptionResult) {
359+
resp, err := client.Get(getEncryptionURL(client, id), &r.Body, nil)
360+
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
361+
return
362+
}
363+
364+
// GetEncryptionSpecs retrieves the encryption type specs for an existing VolumeType with the provided ID.
365+
func GetEncryptionSpec(client *gophercloud.ServiceClient, id, key string) (r GetEncryptionSpecResult) {
366+
resp, err := client.Get(getEncryptionSpecURL(client, id, key), &r.Body, nil)
367+
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
368+
return
369+
}
370+
371+
// UpdateEncryptionOptsBuilder allows extensions to add additional parameters to the
372+
// Update encryption request.
373+
type UpdateEncryptionOptsBuilder interface {
374+
ToUpdateEncryptionMap() (map[string]interface{}, error)
375+
}
376+
377+
// Update Encryption Opts contains options for creating an Update Encryption Type. This object is passed to
378+
// the volumetypes.UpdateEncryption function. For more information about these parameters,
379+
// see the Update Encryption Type object.
380+
type UpdateEncryptionOpts struct {
381+
// The size of the encryption key.
382+
KeySize int `json:"key_size"`
383+
// The class of that provides the encryption support.
384+
Provider string `json:"provider"`
385+
// Notional service where encryption is performed.
386+
ControlLocation string `json:"control_location"`
387+
// The encryption algorithm or mode.
388+
Cipher string `json:"cipher"`
389+
}
390+
391+
// ToEncryptionCreateMap assembles a request body based on the contents of a
392+
// UpdateEncryptionOpts.
393+
func (opts UpdateEncryptionOpts) ToUpdateEncryptionMap() (map[string]interface{}, error) {
394+
return gophercloud.BuildRequestBody(opts, "encryption")
395+
}
396+
397+
// Update will update an existing encryption for a Volume Type based on the values in UpdateEncryptionOpts.
398+
// To extract the UpdateEncryption Type object from the response, call the Extract method on the
399+
// UpdateEncryptionResult.
400+
func UpdateEncryption(client *gophercloud.ServiceClient, id, encryptionID string, opts UpdateEncryptionOptsBuilder) (r UpdateEncryptionResult) {
401+
b, err := opts.ToUpdateEncryptionMap()
402+
if err != nil {
403+
r.Err = err
404+
return
405+
}
406+
resp, err := client.Put(updateEncryptionURL(client, id, encryptionID), b, &r.Body, &gophercloud.RequestOpts{
407+
OkCodes: []int{200},
408+
})
409+
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
410+
return
411+
}

openstack/blockstorage/v3/volumetypes/results.go

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,3 +200,100 @@ type AddAccessResult struct {
200200
type RemoveAccessResult struct {
201201
gophercloud.ErrResult
202202
}
203+
204+
type EncryptionType struct {
205+
// Unique identifier for the volume type.
206+
VolumeTypeID string `json:"volume_type_id"`
207+
// Notional service where encryption is performed.
208+
ControlLocation string `json:"control_location"`
209+
// Unique identifier for encryption type.
210+
EncryptionID string `json:"encryption_id"`
211+
// Size of encryption key.
212+
KeySize int `json:"key_size"`
213+
// Class that provides encryption support.
214+
Provider string `json:"provider"`
215+
// The encryption algorithm or mode.
216+
Cipher string `json:"cipher"`
217+
}
218+
219+
type encryptionResult struct {
220+
gophercloud.Result
221+
}
222+
223+
func (r encryptionResult) Extract() (*EncryptionType, error) {
224+
var s EncryptionType
225+
err := r.ExtractInto(&s)
226+
return &s, err
227+
}
228+
229+
// ExtractInto converts our response data into a volume type struct
230+
func (r encryptionResult) ExtractInto(v interface{}) error {
231+
return r.Result.ExtractIntoStructPtr(v, "encryption")
232+
}
233+
234+
type CreateEncryptionResult struct {
235+
encryptionResult
236+
}
237+
238+
// UpdateResult contains the response body and error from an UpdateEncryption request.
239+
type UpdateEncryptionResult struct {
240+
encryptionResult
241+
}
242+
243+
// DeleteEncryptionResult contains the response body and error from a DeleteEncryprion request.
244+
type DeleteEncryptionResult struct {
245+
gophercloud.ErrResult
246+
}
247+
248+
type GetEncryptionType struct {
249+
// Unique identifier for the volume type.
250+
VolumeTypeID string `json:"volume_type_id"`
251+
// Notional service where encryption is performed.
252+
ControlLocation string `json:"control_location"`
253+
// Shows if the resource is deleted or Notional
254+
Deleted bool `json:"deleted"`
255+
// Shows the date and time the resource was created.
256+
CreatedAt string `json:"created_at"`
257+
// Shows the date and time when resource was updated.
258+
UpdatedAt string `json:"updated_at"`
259+
// Unique identifier for encryption type.
260+
EncryptionID string `json:"encryption_id"`
261+
// Size of encryption key.
262+
KeySize int `json:"key_size"`
263+
// Class that provides encryption support.
264+
Provider string `json:"provider"`
265+
// Shows the date and time the reousrce was deleted.
266+
DeletedAt string `json:"deleted_at"`
267+
// The encryption algorithm or mode.
268+
Cipher string `json:"cipher"`
269+
}
270+
271+
type encryptionShowResult struct {
272+
gophercloud.Result
273+
}
274+
275+
// Extract interprets any extraSpecResult as an ExtraSpec, if possible.
276+
func (r encryptionShowResult) Extract() (*GetEncryptionType, error) {
277+
var s GetEncryptionType
278+
err := r.ExtractInto(&s)
279+
return &s, err
280+
}
281+
282+
type GetEncryptionResult struct {
283+
encryptionShowResult
284+
}
285+
286+
type encryptionShowSpecResult struct {
287+
gophercloud.Result
288+
}
289+
290+
// Extract interprets any empty interface Result as an empty interface.
291+
func (r encryptionShowSpecResult) Extract() (map[string]interface{}, error) {
292+
var s map[string]interface{}
293+
err := r.ExtractInto(&s)
294+
return s, err
295+
}
296+
297+
type GetEncryptionSpecResult struct {
298+
encryptionShowSpecResult
299+
}

0 commit comments

Comments
 (0)