Some recent updates: - Make over the wire apis params validation/translation as before thereby making changes status quo with master, only enforce uuid param validation for apis introduce since 3.x - Annotate name field in @APICommand for all cmd classes, now we can get rid of apiname, cmd class pkg name mappings from *command.properties.in file - Fixed apidocs, build
Regards. ________________________________________ From: Rohit Yadav Sent: Friday, December 28, 2012 1:18 AM To: cloudstack-dev@incubator.apache.org Subject: Re: API Updates: Tracking progress, changes On 27-Dec-2012, at 7:32 AM, David Nalley <da...@gnsa.us> wrote: > On Mon, Dec 24, 2012 at 10:09 PM, Rohit Yadav <rohit.ya...@citrix.com> wrote: >> Hi Alex, >> >> We got rid of IdentityMapper and enforced the translation of over the wire >> UUID string to internal long int ID, so we know if internal IDs are used in >> any case starting 4.1 it will break any client, script that are based off >> internal ID and not UUID strings. Few folks on the ML have expressed >> concerns, but we need this change and to enforce that we won't have any >> backward compatibility for over the wire api params to accept internal IDs. >> > > > I read this, and am left more confused than before. > There have been assurances regarding the refactor that no API changes > have occurred, but the above seems to contradict that. > I'll apologize for being daft (and for not going in and looking at the > changes) but can you tell me: > 1. what the changes to the API are? Changes to the API: None, for any over the wire request no params have been added or removed, nor any api cmd/response was added or removed. Enforcement on the APIs: All id params should be UUID strings. This should have been done since 3.x, but the changes listed below enforce that. Changes in API Server, OTW param processing etc: 0. Moving classes to org.apache.cloudstack.* package name, this does not change anything just imports in depending classes. 1. In all cmd classes: Annotate @Parameter to have correct type, entityType, collectionType, remove @IdentityMapper annotation. This changes interfaces, processing of those annotations and fix any caller. Therefore this change is refactoring [1]. Any @Parameter annotation with CommandType UUID is considered a case where OTW param string needs to be translated to an InternalId. In CloudStack we use internal db ids and not uuids, implemented a getUuid() in EntityManagerImpl. 2. List apis and response view optimizations by Min, optimizations in this case are considered refactoring as well [1] [2]. 3. Deduplication of code by moving them into methods, this does not change any functionality either, just refactoring. 4. ACL adapter and adapter interface definitions, work by Prachi. Separate out ACL and DB/Range validation code, define interfaces for the adapter, move implementations as plugin. Again, refactoring. 5. Rename @Implementation annotation to @APICommand, introduce a new name field. This name field can tightly couple API name to the cmd class, right now this info is insecurely coupled in commands.properties file where the mapping of apiname=<pkg name>.cmdclass:mask is defined. In future we would only have apiname and role masks which will constitute all whitelisted apis i.e. if api is not declared in commands.properties file, it's blacklisted. This would also enforce uniqueness of api command name. > 2. Why 'we need this change'? Why: 0. Refactoring was needed, as explained above. 1. There was a ticket on JIRA (cannot recall the id) to move classes under org.apache.cloudstack pkg name. 2. Move out policy from CloudStack as plugin so orgs can impl. their own role based and ACL etc. 3. Remove bloat, optimize OTW commands, esp. the responses. 4. Make it easier for contributor to write plugin, apis. 5. Remove code by refactoring acl, db validation code in one place using annotations which is spread across api layer (cloud-api, parts of cloud-server) and service layer (all the managers and managerimpls). > > Breaking backward compatibility is a huge deal IMO. Even changes that > technically didn't break compatibility but were different than folks > expectations (when we introduced UUID) earned us much wailing and > gnashing of teeth. Breaking other people's external tools that > interact with CloudStack is something that shouldn't be done without > much deliberation. :( I've to be the bad guy here, but we need to enforce that params are queried by uuids. Okay I'll ask community for a vote on it, if we want to keep things ambiguous and expose internal db ids to outside world the fix would be a simple if-else block to allow both kinds of ids. Regards. [1] http://martinfowler.com/bliki/refactoring.html [2] http://refactoring.com