Re: [vdsm] RESTful VM creation

2012-05-16 Thread Adam Litke
No comments at all on this??

On Wed, May 09, 2012 at 09:35:29AM -0500, Adam Litke wrote:
 I would like to discuss a problem that is going to affect VM creation in the 
 new
 REST API.  This topic has come up previously and I want to revive that
 discussion because it is blocking a proper implementation of VM.create().
 
 Consider a RESTful VM creation sequence:
   POST /api/vms/define - Define a new VM in the system
   POST /api/vms/id/disks/add - Add a new disk to the VM
   POST /api/vms/id/cdroms/add - Add a cdrom
   POST /api/vms/id/nics/add - Add a NIC
   PUT /api/vms/id - Change boot sequence
   POST /api/vms/id/start - Boot the VM
 
 Unfortunately this is not possible today with vdsm because a VM must be
 fully-specified at the time of creation and it will be started immediately.
 
 As I see it there are two ways forward:
 
 1.) Deviate from a REST model and require a VM resource definition to include
 all sub-collections inline.
 -- or --
 2.) Support storage of vm definitions so that powered off VMs can be 
 manipulated
 by the API.
 
 My preference would be #2 because: it makes the API more closely follow 
 RESTful
 principles, it maintains parity with the cluster-level VM manipulation API, 
 and
 it makes the API easier to use in standalone mode.
 
 Here is my idea on how this could be accomplished without committing to 
 stateful
 host storage.  In the past we have discussed adding an API for storing 
 arbitrary
 metadata blobs on the master storage domain.  If this API were available we
 could use it to create a transient VM construction site.  Let's walk through
 the above RESTful sequence again and see how my idea would work in practice:
 
 * POST /api/vms/define - Define a new VM in the system
 A new VM definition would be written to the master storage domain metadata 
 area.
 
 * GET /api/vms/new-uuid
 The normal 'list' API is consulted as usual.  The VM will not be found there
 because it is not yet created.  Next, the metadata area is consulted.  The VM 
 is
 found there and will be returned.  The VM state will be 'New'.
 
 * POST /api/vms/id/disks/add - Add a new disk to the VM
 For 'New' VMs, this will update the VM metadata blob with the new disk
 information.  Otherwise, this will call the hotplugDisk API.
 
 * POST /api/vms/id/cdroms/add - Add a cdrom
 For 'New' VMs, this will update the VM metadata blob with the new cdrom
 information.  If we want to support hotplugged CDROMs we can call that API
 later.
 
 * POST /api/vms/id/nics/add - Add a NIC
 For 'New' VMs, this will update the VM metadata blob with the new nic
 information.  Otherwise it triggers the hotplugNic API.
 
 * PUT /api/vms/id - Change boot sequence
 Only valid for 'New' VMs.  Updates the metadata blob according to the 
 parameters
 specified.
 
 * POST /api/vms/id/start - Boot the VM
 Load the metadata from the master storage domain metadata area.  Call the
 VM.create() API.  Remove the metadata from the master storage domain.
 
 VDSM will automatically purge old metadata from the master storage domain.  
 This
 could be done any time a domain is: attached as master, deactivated, and
 periodically.
 
 How does this idea sound?  I am certain that it can be improved by those of 
 you
 with more experience and different viewpoints.  Thoughts and comments?
 
 -- 
 Adam Litke a...@us.ibm.com
 IBM Linux Technology Center
 
 ___
 vdsm-devel mailing list
 vdsm-devel@lists.fedorahosted.org
 https://fedorahosted.org/mailman/listinfo/vdsm-devel

-- 
Adam Litke a...@us.ibm.com
IBM Linux Technology Center

___
vdsm-devel mailing list
vdsm-devel@lists.fedorahosted.org
https://fedorahosted.org/mailman/listinfo/vdsm-devel


[vdsm] RESTful VM creation

2012-05-09 Thread Adam Litke
I would like to discuss a problem that is going to affect VM creation in the new
REST API.  This topic has come up previously and I want to revive that
discussion because it is blocking a proper implementation of VM.create().

Consider a RESTful VM creation sequence:
  POST /api/vms/define - Define a new VM in the system
  POST /api/vms/id/disks/add - Add a new disk to the VM
  POST /api/vms/id/cdroms/add - Add a cdrom
  POST /api/vms/id/nics/add - Add a NIC
  PUT /api/vms/id - Change boot sequence
  POST /api/vms/id/start - Boot the VM

Unfortunately this is not possible today with vdsm because a VM must be
fully-specified at the time of creation and it will be started immediately.

As I see it there are two ways forward:

1.) Deviate from a REST model and require a VM resource definition to include
all sub-collections inline.
-- or --
2.) Support storage of vm definitions so that powered off VMs can be manipulated
by the API.

My preference would be #2 because: it makes the API more closely follow RESTful
principles, it maintains parity with the cluster-level VM manipulation API, and
it makes the API easier to use in standalone mode.

Here is my idea on how this could be accomplished without committing to stateful
host storage.  In the past we have discussed adding an API for storing arbitrary
metadata blobs on the master storage domain.  If this API were available we
could use it to create a transient VM construction site.  Let's walk through
the above RESTful sequence again and see how my idea would work in practice:

* POST /api/vms/define - Define a new VM in the system
A new VM definition would be written to the master storage domain metadata area.

* GET /api/vms/new-uuid
The normal 'list' API is consulted as usual.  The VM will not be found there
because it is not yet created.  Next, the metadata area is consulted.  The VM is
found there and will be returned.  The VM state will be 'New'.

* POST /api/vms/id/disks/add - Add a new disk to the VM
For 'New' VMs, this will update the VM metadata blob with the new disk
information.  Otherwise, this will call the hotplugDisk API.

* POST /api/vms/id/cdroms/add - Add a cdrom
For 'New' VMs, this will update the VM metadata blob with the new cdrom
information.  If we want to support hotplugged CDROMs we can call that API
later.

* POST /api/vms/id/nics/add - Add a NIC
For 'New' VMs, this will update the VM metadata blob with the new nic
information.  Otherwise it triggers the hotplugNic API.

* PUT /api/vms/id - Change boot sequence
Only valid for 'New' VMs.  Updates the metadata blob according to the parameters
specified.

* POST /api/vms/id/start - Boot the VM
Load the metadata from the master storage domain metadata area.  Call the
VM.create() API.  Remove the metadata from the master storage domain.

VDSM will automatically purge old metadata from the master storage domain.  This
could be done any time a domain is: attached as master, deactivated, and
periodically.

How does this idea sound?  I am certain that it can be improved by those of you
with more experience and different viewpoints.  Thoughts and comments?

-- 
Adam Litke a...@us.ibm.com
IBM Linux Technology Center

___
vdsm-devel mailing list
vdsm-devel@lists.fedorahosted.org
https://fedorahosted.org/mailman/listinfo/vdsm-devel