[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