On Wed, Nov 30, 2011 at 03:21:07PM +0200, Itamar Heim wrote:
> On 11/30/2011 11:29 AM, Daniel P. Berrange wrote:
>> On Wed, Nov 30, 2011 at 09:14:16AM +0200, Itamar Heim wrote:
>>> On 11/29/2011 11:36 PM, Adam Litke wrote:
>>>> On Tue, Nov 29, 2011 at 12:54:44PM -0800, Chris Wright wrote:
>>>>> * Adam Litke (agl(a)us.ibm.com) wrote:
>>>>>> On Tue, Nov 29, 2011 at 11:39:08AM -0800, Chris Wright wrote:
>>>>>>> * Adam Litke (agl(a)us.ibm.com) wrote:
>>>>>>>>
>>>>>>>>
https://github.com/aglitke/vdsm-rest/
>>>>>>>>
>>>>>>>> Today I am releasing a proof of concept implementation of
a REST API for vdsm.
>>>>>>>> You can find the code on github. My goal is to
eventually replace the current
>>>>>>>> xmlrpc interface with a REST API. Once completed,
ovirt-engine could switch to
>>>>>>>> this new API. The major advantages to making this change
are: 1) VDSM will gain
>>>>>>>> a structured API that conceptually, structurally, and
functionally aligns with
>>>>>>>> the ovirt-engine REST API, 2) this new API can be made
public, thus providing an
>>>>>>>> entry point for direct virtualization management@the node
level.
>>>>>>>
>>>>>>> Adam, this looks like a nice PoC. I didn't see how API
versioning is
>>>>>>> handled. Any VDSM developers willing to review this work?
>>>>>>
>>>>>> Thanks for taking a look. I am not handling versioning yet. I
think we can add
>>>>>> a version field to the root API object. As for compatibility,
we'll just have
>>>>>> to decide on an API backwards-compat support policy. Would this
be enough to
>>>>>> handle versioning issues? We shouldn't need anything like
capabilities because
>>>>>> the API is discoverable.
>>>>>
>>>>> Right, that seems sensible.
>>>>>
>>>>> Did you find cases where RPC to REST resource mapping was difficult?
>>>>
>>>> I haven't yet fully implemented the current vdsm API but I suspect
that certain
>>>> calls (like the ones you mention below) will require some extensions to
what I
>>>> have available currently. The main missing piece is probably events and
a nice
>>>> polling API. Another big piece of work will be to rebase onto the newly
>>>> redesigned storage model.
>>>>
>>>>> I could see something like migrate() plus migrateStatus() and
>>>>> migrateCancel() needing to add some kind of operational state that to
the
>>>>> resource. And something like monitorCommand() which has both a
possible
>>>>> side-effect and some freefrom response...
>>>>
>>>> Hopefully monitorCommand will not be too bad, since vdsm should be
asking
>>>> libvirt for the VM details when they are needed. Of course we'll
need to be
>>>> testing to make sure we aren't keeping state around. Also, I would
expect
>>>> monitorCommand to 'taint' the VM in the eyes of the vdsm API (as
it does for
>>>> libvirt).
>>>>
>>>>>>> <snip>
>>>>>>>> ovirt-engine wants to subscribe to asynchronous events.
REST APIs do not
>>>>>>>> typically support async events and instead rely on
polling of resources. I am
>>>>>>>> investigating what options are available for supporting
async events via REST.
>>>>>>>
>>>>>>> I think typical is either polling or long polling. If
it's a single
>>>>>>> resource, then perhaps long polling would be fine (won't
be a large
>>>>>>> number of connections tied up if it's only a single
resource).
>>>>>>
>>>>>> Not sure if this is what you are referring to, but I was thinking
we could do a
>>>>>> batch-polling mechanism where an API user passes in a list of
task UUIDs and/or
>>>>>> event URIs. The server would respond with the status of these
resources in one
>>>>>> response. I have some ideas on how we could wire up asynchronous
events on the
>>>>>> server side to reduce the amount of actual work that such a
batch-polling
>>>>>> operation would require.
>>>>>
>>>>> Oh, I just meant this:
>>>>>
>>>>> Polling (GET /event + 404 loop)
>>>>> Long polling (GET + block ... can chew up a thread connection)
>>>>
>>>> Yep. And we can talk later about building an API for efficient,
repeated
>>>> polling. I wonder if the ovirt-engine guys could weigh in as to whether
a REST
>>>
>>> cc-ing engine-devel...
>>>
>>>> interface with event polling would be acceptable to them. It is critical
that
>>>> we settle on an API that can become _the_ first-class vehicle for
interacting
>>>> with vdsm.
>>>
>>> i have two points for consideration around this:
>>> 1. as the api between ovirt-engine and vdsm, I had a preference for the
>>> bus like nature of QMF, as it would allow multiple ovirt-engine to load
>>> balance handling of messages from the queue, and multiple consumers for
>>> some messages (say, history service picking up the stats in parallel to
>>> engine picking them, rather than copying them from engine).
>>
>> I tend to agree, using a bus like QMF between ovirt-engine and vdsm is
>> an inherantly more scalable network architecture, since it avoids the
>> need to have a direct point-to-point connection between the engine and
>> every single node, instead you can build a resilient grid by stategically
>> deploying QPid brokers.
>>
>> As compared to REST, it is also much better at coping with async events,
>> since you can have a push, rather than pull, model which VDSM just puts
>> events onto the bus as they're generated, to be lazily consumed by any
>> remote nodes when desired.
>>
>> NB, I don't mean to imply that there should not *also* be a REST API for
>> the node level. A REST API has the very compelling property that it is
>> trivially accessible from anything with HTTP client support, which is
>> basically everything in existance today.
>>
>>> 2. as node level api, i think a lightweight ovirt-engine managing a
>>> single node and exposing the exact same REST API and behavior of the
>>> multi-node ovirt engine would be easier to cosnume for someone that
>>> wants to interact with a single node same way they would interact with
>>> ovirt-engine.
>>
>> If the REST API is well specified, you wouldn't need to necessarily have
>> a lightweight ovirt-engine deployed at the node level, you could just
>> have VDSM implement the same REST specification natively, as is impl
>> in the engine. Or perhaps provide a some shered code that can be plugged
>> into both VDSM& the enegine to facilitate provision of the same REST
>> interface.
>
> Indeed, but an API is not just the transport, it is also behavior
> and error code numbering, etc.
> trying to develop two different projects trying to do the same thing
> sounds like quite the overhead to me.
Agreed.
> I prefer investing the time in making a lighter version of the
> engine for a single node.
> then you would also get the web admin and power user portal if you
> want them.
Could you flesh out some details on the effort required to implement a
light-weight engine? I am concerned that this is more complex than it seems.
Also, how would we avoid dual maintenance between the full engine and the light
one when a new feature/api is added?
I would use the same engine, moduling out parts not relevant for single
node.
first we need to move to JBoss AS 7 though to get it to be lighter, then
we can look at other angles (make parts of the engine optional, allow it
to run with/without jboss, etc.)