On Wed 21 Sep 2011 07:10:28 AM IDT, Yaniv Kaul wrote:
On 09/21/2011 04:58 AM, Adam Litke wrote:
As it currently stands, images are created implicitly when a volume is created using a new imageUUID. Although this is practical for the current use cases, it doesn't present a semetrical API. Other vdsm objects have create/delete methods.i
Furthermore, it preents challenges when trying to model VDSM in a REST API. Let's say I want to create a new disk for a VM. I would want to issue the following sequence of commands:
POST -> /vdsm-api/storagedomains/<sdUUID>/images/create <- HTTP/202 Accepted: /vdsm-api/tasks/<task-uuid> GET -> /vdsm-api/tasks/<task-uuid> <- HTTP/200 OK: /vdsm-api/storagedomains/<sdUUID>/images/<imgUUID> POST -> /vdsm-api/storagedomains/<sdUUID>/images/<imgUUID>/volumes/create <- HTTP/202 Accepted: /vdsm-api/tasks/<task-uuid> GET -> /vdsm-api/tasks/<task-uuid> <- HTTP/200 OK: /vdsm-api/storagedomains/<sdUUID>/images/<imgUUID>/volumes/<volUUID>
The only way to support this pattern is to allow for the explicit creation of an image with an empty volume chain.
Signed-off-by: Adam Litkeagl@us.ibm.com
diff --git a/vdsm/storage/spm.py b/vdsm/storage/spm.py index 849b9d2..1222752 100644 --- a/vdsm/storage/spm.py +++ b/vdsm/storage/spm.py @@ -820,6 +820,23 @@ class SPM: repoPath = os.path.join(self.storage_repository, spUUID) image.Image(repoPath).multiMove(srcDomUUID, dstDomUUID, imgDict, vmUUID, force)
- def createImage(self, sdUUID, spUUID, imgUUID):
"""
Create a new, empty image
:param sdUUID: The UUID of the storage domain that contains the images.
:type sdUUID: UUID
:param spUUID: The UUID of the storage pool that contains the images.
:type spUUID: UUID
:param imgUUID: The UUID of the image you want to delete.
why delete? Y.
:type imgUUID: UUID
"""
hsm.HSM.getPool(spUUID) #Validates that the pool is connected. WHY?
hsm.HSM.validateSdUUID(sdUUID)
repoPath = os.path.join(self.storage_repository, spUUID)
image.Image(repoPath).create(sdUUID, imgUUID)
return dict(uuid=imgUUID) def deleteImage(self, sdUUID, spUUID, imgUUID, postZero, force): """
@@ -1470,6 +1487,18 @@ class SPM: imgUUID, volumes, misc.parseBool(postZero), misc.parseBool(force) )
def public_createImage(self, sdUUID, spUUID, imgUUID):
"""
Create a new, empty image
"""
argsStr = "sdUUID=%s, spUUID=%s, imgUUID=%s" % \
(str(sdUUID), str(spUUID), str(imgUUID))
vars.task.setDefaultException(se.ImagePathError(argsStr))
hsm.HSM.getPool(spUUID) #Validates that the pool is connected. WHY?
hsm.HSM.validateSdUUID(sdUUID)
misc.validateUUID(imgUUID, 'imgUUID')
vars.task.getSharedLock(STORAGE, sdUUID)
self._schedule("createImage", self.createImage, sdUUID, spUUID, imgUUID) def public_deleteImage(self, sdUUID, spUUID, imgUUID, postZero=False, force=False): """
vdsm-devel mailing list vdsm-devel@lists.fedorahosted.org https://fedorahosted.org/mailman/listinfo/vdsm-devel
Tanks for the suggestion. The problem your pointing out is not the only problem with the current images API. We are hard at work at designing a new API.
Introducing a new API call at this point will just give us one more thing to support when we make the change. We will send an RFC doc once we have a concrete view that we are happy with.