The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/3549
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === This commit introduces the ability to wipe storage volumes for images from a specific storage pool. Closes #3539. Signed-off-by: Christian Brauner <[email protected]>
From 30113930148e76281d555191fe1ad51a558ea232 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Fri, 14 Jul 2017 13:10:02 +0200 Subject: [PATCH 1/3] storage: move db deletion to driver implementation Signed-off-by: Christian Brauner <[email protected]> --- lxd/storage_btrfs.go | 11 +++++++++++ lxd/storage_dir.go | 11 +++++++++++ lxd/storage_lvm.go | 11 +++++++++++ lxd/storage_volumes.go | 7 ------- lxd/storage_zfs.go | 11 +++++++++++ 5 files changed, 44 insertions(+), 7 deletions(-) diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go index 9fb93001e..570513367 100644 --- a/lxd/storage_btrfs.go +++ b/lxd/storage_btrfs.go @@ -561,6 +561,17 @@ func (s *storageBtrfs) StoragePoolVolumeDelete() error { } } + err = dbStoragePoolVolumeDelete( + s.d.db, + s.volume.Name, + storagePoolVolumeTypeCustom, + s.poolID) + if err != nil { + logger.Errorf(`Failed to delete database entry for ZFS `+ + `storage volume "%s" on storage pool "%s"`, + s.volume.Name, s.pool.Name) + } + logger.Infof("Deleted BTRFS storage volume \"%s\" on storage pool \"%s\".", s.volume.Name, s.pool.Name) return nil } diff --git a/lxd/storage_dir.go b/lxd/storage_dir.go index 3971d8766..6618e1334 100644 --- a/lxd/storage_dir.go +++ b/lxd/storage_dir.go @@ -203,6 +203,17 @@ func (s *storageDir) StoragePoolVolumeDelete() error { return err } + err = dbStoragePoolVolumeDelete( + s.d.db, + s.volume.Name, + storagePoolVolumeTypeCustom, + s.poolID) + if err != nil { + logger.Errorf(`Failed to delete database entry for ZFS `+ + `storage volume "%s" on storage pool "%s"`, + s.volume.Name, s.pool.Name) + } + logger.Infof("Deleted DIR storage volume \"%s\" on storage pool \"%s\".", s.volume.Name, s.pool.Name) return nil } diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go index bf29e6b5b..d5e3ee875 100644 --- a/lxd/storage_lvm.go +++ b/lxd/storage_lvm.go @@ -541,6 +541,17 @@ func (s *storageLvm) StoragePoolVolumeDelete() error { } } + err = dbStoragePoolVolumeDelete( + s.d.db, + s.volume.Name, + storagePoolVolumeTypeCustom, + s.poolID) + if err != nil { + logger.Errorf(`Failed to delete database entry for ZFS `+ + `storage volume "%s" on storage pool "%s"`, + s.volume.Name, s.pool.Name) + } + logger.Infof("Deleted LVM storage volume \"%s\" on storage pool \"%s\".", s.volume.Name, s.pool.Name) return nil } diff --git a/lxd/storage_volumes.go b/lxd/storage_volumes.go index 8ab6eb7e4..2df4a7c06 100644 --- a/lxd/storage_volumes.go +++ b/lxd/storage_volumes.go @@ -401,13 +401,6 @@ func storagePoolVolumeTypeDelete(d *Daemon, r *http.Request) Response { if err != nil { return SmartError(err) } - - poolID, err := dbStoragePoolGetID(d.db, poolName) - if err != nil { - return SmartError(err) - } - - err = dbStoragePoolVolumeDelete(d.db, volumeName, volumeType, poolID) if err != nil { return SmartError(err) } diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go index 1f62ab53d..e74958356 100644 --- a/lxd/storage_zfs.go +++ b/lxd/storage_zfs.go @@ -250,6 +250,17 @@ func (s *storageZfs) StoragePoolVolumeDelete() error { } } + err = dbStoragePoolVolumeDelete( + s.d.db, + s.volume.Name, + storagePoolVolumeTypeCustom, + s.poolID) + if err != nil { + logger.Errorf(`Failed to delete database entry for ZFS `+ + `storage volume "%s" on storage pool "%s"`, + s.volume.Name, s.pool.Name) + } + logger.Infof("Deleted ZFS storage volume \"%s\" on storage pool \"%s\".", s.volume.Name, s.pool.Name) return nil } From 84bfc114a2e6d66e0d1be6ee69446e7c8a32b3e2 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Fri, 14 Jul 2017 13:11:00 +0200 Subject: [PATCH 2/3] storage: allow deleting images via storage API This commit introduces the ability to wipe storage volumes for images from a specific storage pool. Closes #3539. Signed-off-by: Christian Brauner <[email protected]> --- lxd/storage_volumes.go | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/lxd/storage_volumes.go b/lxd/storage_volumes.go index 2df4a7c06..fc7596088 100644 --- a/lxd/storage_volumes.go +++ b/lxd/storage_volumes.go @@ -379,7 +379,12 @@ func storagePoolVolumeTypeDelete(d *Daemon, r *http.Request) Response { return BadRequest(fmt.Errorf("invalid storage volume type %s", volumeTypeName)) } - if volumeType != storagePoolVolumeTypeCustom { + switch volumeType { + case storagePoolVolumeTypeCustom: + // allowed + case storagePoolVolumeTypeImage: + // allowed + default: return BadRequest(fmt.Errorf("storage volumes of type \"%s\" cannot be deleted with the storage api", volumeTypeName)) } @@ -389,7 +394,15 @@ func storagePoolVolumeTypeDelete(d *Daemon, r *http.Request) Response { } if len(volumeUsedBy) > 0 { - return BadRequest(fmt.Errorf("the storage volume is still in use by containers or profiles")) + if len(volumeUsedBy) != 1 || + volumeType != storagePoolVolumeTypeImage || + volumeUsedBy[0] != fmt.Sprintf( + "/%s/images/%s", + version.APIVersion, + volumeName) { + return BadRequest(fmt.Errorf(`The storage volume is ` + + `still in use by containers or profiles`)) + } } s, err := storagePoolVolumeInit(d, poolName, volumeName, volumeType) @@ -397,9 +410,15 @@ func storagePoolVolumeTypeDelete(d *Daemon, r *http.Request) Response { return NotFound } - err = s.StoragePoolVolumeDelete() - if err != nil { - return SmartError(err) + switch volumeType { + case storagePoolVolumeTypeCustom: + err = s.StoragePoolVolumeDelete() + case storagePoolVolumeTypeImage: + err = s.ImageDelete(volumeName) + default: + return BadRequest(fmt.Errorf(`Storage volumes of type "%s" `+ + `cannot be deleted with the storage api`, + volumeTypeName)) } if err != nil { return SmartError(err) From f294c39f7d391dc26422a134c95758be2d611c0a Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Fri, 14 Jul 2017 13:15:38 +0200 Subject: [PATCH 3/3] doc: document api extension storage_images_delete Closes #3539. Signed-off-by: Christian Brauner <[email protected]> --- doc/api-extensions.md | 4 ++++ lxd/api_1.0.go | 1 + 2 files changed, 5 insertions(+) diff --git a/doc/api-extensions.md b/doc/api-extensions.md index bc3dd2d61..2dbc50541 100644 --- a/doc/api-extensions.md +++ b/doc/api-extensions.md @@ -292,3 +292,7 @@ X-LXD-type can now be "symlink" with the request content being the target path. ## container\_push\_target This adds the "target" field to POST /1.0/containers/NAME which can be used to have the source LXD host connect to the target during migration. + +## storage\_images\_delete +This enabled the storage API to delete storage volumes for images from +a specific storage pool. diff --git a/lxd/api_1.0.go b/lxd/api_1.0.go index 46f7b5459..e651fd184 100644 --- a/lxd/api_1.0.go +++ b/lxd/api_1.0.go @@ -112,6 +112,7 @@ func api10Get(d *Daemon, r *http.Request) Response { "id_map_base", "file_symlinks", "container_push_target", + "storage_images_delete", }, APIStatus: "stable", APIVersion: version.APIVersion,
_______________________________________________ lxc-devel mailing list [email protected] http://lists.linuxcontainers.org/listinfo/lxc-devel
