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

Reply via email to