[lxc-devel] [lxd/master] storage: allow deleting images via storage API

brauner on Github lxc-bot at linuxcontainers.org
Fri Jul 14 11:17:57 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 485 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20170714/15e74eb9/attachment.bin>
-------------- next part --------------
From 30113930148e76281d555191fe1ad51a558ea232 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
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 <christian.brauner at ubuntu.com>
---
 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 <christian.brauner at ubuntu.com>
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 <christian.brauner at ubuntu.com>
---
 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 <christian.brauner at ubuntu.com>
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 <christian.brauner at ubuntu.com>
---
 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,


More information about the lxc-devel mailing list