Here Fang is talking about UUID translation to DB_ID in constructing our
Command class (ApiDispatcher.setupParameters), not in generating response
object, so it will not impact list api performance.

Thanks
-min

On 12/19/12 10:07 PM, "Anthony Xu" <xuefei...@citrix.com> wrote:

>>2.    The API layer provides a translation from the UUID to the internal
>>DB_ID to the DB entity, but this translation is done internally. Outside
>>users will never see DB_ID. Before the response is sending back by CS,
>>API layer replaces the internal DB_ID with the UUID.
>
>I thought ID->UUID translation in API layer is a workaround, since it
>might cause list API performance issue.
>Any plan to fix it completely in backend?
>
>
>Anthony
>
>> -----Original Message-----
>> From: Fang Wang [mailto:fang.w...@citrix.com]
>> Sent: Wednesday, December 19, 2012 10:02 PM
>> To: cloudstack-dev@incubator.apache.org
>> Subject: RE: [REVIEW/PROPOSAL/DISCUSS] API refactoring story: goal and
>> notes
>> 
>> Prachi did an excellent FS document for this, and I added the high
>> level goals section
>> To her FS link at wiki:
>> 
>> https://cwiki.apache.org/confluence/display/CLOUDSTACK/CloudStack+API+r
>> efactoring
>> 
>> Lots of implementation details are covered in the FS. We'll update it
>> along the way.
>> Thanks,
>> -Fang
>> 
>> -----Original Message-----
>> From: Fang Wang [mailto:fang.w...@citrix.com]
>> Sent: Wednesday, December 19, 2012 9:46 PM
>> To: cloudstack-dev@incubator.apache.org
>> Subject: [REVIEW/PROPOSAL] API refactoring story: goal and notes
>> 
>> Hi all,
>> After answering questions about why/what we are doing to API
>> refactoring, I'll add this to the FS document.
>> Probably lots of people are not clear what is our motivation and what
>> we want to achieve here.
>> (Will add this to the wiki page. )
>> 
>> The goal of the API refactoring
>> To make the system more modular and dynamic, API refactoring is part of
>> the 4.1 new architecture efforts.
>> Another goal is to allow developers and partners to quickly add plugins
>> and new service modules and access control, making cloudstack more
>> adaptive.
>> I am new on this as well In the beginning, I do not know too much about
>> it. Now after working on API refactoring, I got a better understanding
>> of the existing problems and our solutions. The solution is not the
>> final perfect solution, for sure, feedback and suggestion is always
>> welcome to make it a much better and adaptive product.
>> 
>> Current problem:
>> 1.   Security and access check is lying around in different layers.
>> For example, in apiSevlet we check the web access username/password
>> credentials, apiServer checks the command existence, and several other
>> checks, then the DB access check mainly is done at the service layer.
>> So it is hard for developers and system admin to follow all the access
>> and validations, to make sure all the checks are done correctly. To do
>> it, developers need to be familiar with the various parts of the CS
>> code.
>> 
>> 2.   Static: Majority of the DB access check and security validation
>> is tightly coupled with the lower layer service class. This not only
>> made the code hard to follow, also inherently made the policy static.
>> This makes it impossible for system admin to apply a different security
>> policy adaptively. If one wants to adopt a different policy, not only
>> he needs to understand code scattered around, he also needs to rebuild
>> the CS after any changes.  Any security role modification is not
>> dynamic.
>> 
>> 3.   Performance implication: Access check done at the lower service
>> layer makes the error code path long.
>> 
>> 4.   Docs generated, CLI and APIs are loosely coupled.
>> 
>> 5.   Over the wire(OTW) entity is not well defined. For example, to
>> listVMsCmd, it involves multiple DB access, with the large amount of
>> data showing NICs, Vols, Secondary storage etc, the command can take
>> quite a while.
>> 
>> 6.   Admin and user have basically the same end-point access.
>> 
>>        The goal of the API refactoring is aiming to tackle these
>> problems:
>> 
>> 1.   We would pull security checks, DB access checks, any related
>> checks up from service layer/orchestration engine to the API layer as
>> much as possible. This makes the necessary checking done more
>> centralized and easy to follow. Conceptually the cloud orchestration
>> engine layer handles the orchestration, the security check and the
>> access check should have done before reaching this layer. This has
>> performance benefits, since checks are done earlier instead of reaching
>> deep in the code path; this also has the benefits of a clear
>> architecture. The API layer does the necessary access check and role
>> based authentication, makes it easier and dynamic for future policy
>> change. New policy can be added easily and dynamically as a plugin to
>> the system.
>> 
>> 2.   The ACL and security checks also are written as adapter plugins,
>> hence make them dynamic. Users and developers and easily adapt new
>> policy if needed. This made the code more modular and more adaptive.
>> 
>> 3.   Help improves performance: Instead of finding access error layer
>> into the service layer, by doing 1, we would do possible checks early
>> in the code path, which helps stop the wrong access earlier in the code
>> path.
>> 
>> 4.   API layer is more tightly coupled with Doc generation, and CLI.
>> Related commands are grouped together, and the new @Doc annotation will
>> help show the related commands in document.
>> 
>> 5.   We define new view objects as response objects, avoiding big DB
>> joins at run time.
>> 
>> 6.   Separate the admin and user APIs. This is for developers to
>> understand the code, which should be accessible by users, which should
>> only be handled by Admin.  Hence developers will have better grasp of
>> the role and pay attention to the new code added. It also helps the
>> document generated.
>> 
>>        Notes:
>> 1.   For end users, the new APIs after refactoring looks pretty much
>> the same. One big change is the ID, we will always use UUID in the over
>> the wire APIs. The UUID can be created by Cloudstack, or can be
>> provided by users (we call it Xid - external ID). Every UUID should be
>> unique in the cloudstack system.
>> 
>> 2.   The API layer provides a translation from the UUID to the
>> internal DB_ID to the DB entity, but this translation is done
>> internally. Outside users will never see DB_ID. Before the response is
>> sending back by CS,  API layer replaces the internal DB_ID with the
>> UUID.
>> 
>> 3.   In original FS document, the annotation of entityType in
>> @Parameter points to a resource class, this is replaced by a response
>> class. So entityType points to a response object, and the response
>> class has a one-to-one mapping from the response to the physical entity
>> itself. This translation work is done by the API layer and the
>> entityManagerImpl.
>> 
>> 4.   The packages for the new API commands are all moved from the
>> current com.cloud.api.commands to new location:
>> org.apache.cloudstack.api.commands.user.[group name]
>> org.apache.cloudstack.api.commands.admin.[group_name]
>> 
>> The responses are also moved to new location at
>> org.apache.cloudstack.api.response
>> 
>> More implementation details can refer to the FS document. We will also
>> update the document along the way. The code is branch from master at
>> api_refactoring.  Since the change is not minimum, we would like the
>> community to know and give feedback.
>> 
>> Thanks,
>> -Fang
>> 
>> 

Reply via email to