Just as an FYI: I recently added support to pass in a Min and Max IOPS for the root disk of a VM to create. I first investigated how this was being done with the custom root disk and then copied that approach. That being the case, I leveraged the map instead of making new parameters. I do agree we should define more clearly when one approach should be taken over the other.
Thanks! On Mon, Mar 10, 2014 at 12:13 PM, Marcus <shadow...@gmail.com> wrote: > I suppose its also worth pointing out that the api params and how we > pass them around internally are two separate things. It's easy to just > add a new custom api parameter and then put it into the details map > (or an object) to be passed around, and it provides a much better user > experience from the API consumer's perspective as the parameters are > documented as normal and the user doesn't have to deal with parameters > inside parameters. Most of the other parameter maps seem to have > related info, such as serviceproviderlist, networksids, or the > resource tags map. The new details map for deployVirtualMachine just > seems like a place to put random parameters so that we don't have to > keep adding them explicitly, especially given that they're not all > persisted in the user_vm_details table. It might be nice to consider > more targeted maps such as 'serviceofferingdetails' which would > contain related parameters that could override service offerings such > as cpu, memory, and a separate map for 'diskofferingdetails' that > could override iops and other disk attributes, to be reused on > createVolume API. rootdisksize doesn't fit, as there's currently no > root size on service offering, but we could in the future add a 'min > root size' attribute into the service offering that would override the > template size if it were larger than the selected template. > > On Mon, Mar 10, 2014 at 11:38 AM, Marcus <shadow...@gmail.com> wrote: > > Yes, we'd have to leave the current one intact, but allow the other as > well. > > > > On Mon, Mar 10, 2014 at 11:36 AM, Bharat Kumar <bharat.ku...@citrix.com> > wrote: > >> Hi, > >> i don't know if this is still valid, but there was one more parameter > disksize which which specifies the disk size for data disks. > >> I would prefer adding both the root disk size and disk size to the > details map. ideally we should also change the name disksize to > >> dataDisksize to remove confusion but this might break backward > compatibility. > >> > >> Adding them to a map will be intuitive as we already use a map to > specify any custom parameters related to VM. > >> > >> Thanks > >> Bharat. > >> > >> On 10-Mar-2014, at 10:57 pm, Marcus <shadow...@gmail.com> wrote: > >> > >>> It is valid, as I've implemented it. So we need to decide if we're > >>> using 'details' or rootdisksize as an api param. That's why I'm > >>> asking. > >>> > >>> On Mon, Mar 10, 2014 at 1:43 AM, Bharat Kumar <bharat.ku...@citrix.com> > wrote: > >>>> Hi All, > >>>> the roodiskresize is no longer valid. as there is no code which is > using rootdiskresize currently. > >>>> > >>>> As a part of the custom service offering we had to enable specifying > custom values to parameters cpu, memory and cpuCores. > >>>> instead of adding a parameter for each of these values we changed it > use a details map. This will also not require any further > >>>> changes in the API if we need to add some more custom values in > future. > >>>> > >>>> On 08-Mar-2014, at 1:42 am, Marcus <shadow...@gmail.com> wrote: > >>>> > >>>>> Any suggestion? Do we go forward assuming that the correct parameter > >>>>> for resize on deploy is: > >>>>> > >>>>> deployVirtualMachine&details[0].rootdisksize=3 > >>>>> > >>>>> or do we change it to > >>>>> > >>>>> deployVirtualMachine&rootdisksize=3 > >>>>> > >>>>> On Tue, Mar 4, 2014 at 4:14 PM, Marcus <shadow...@gmail.com> wrote: > >>>>>> Ok, sounds like there needs to be some work done to make these more > >>>>>> consistent, perhaps. Can you comment on why rootdisksize was made > from > >>>>>> a parameter into a part of the details map? > >>>>>> > >>>>>> On Tue, Mar 4, 2014 at 3:12 AM, Bharat Kumar < > bharat.ku...@citrix.com> wrote: > >>>>>>> Hi ALL, > >>>>>>> There are many other APIs that use Map like createNetworkOffering, > >>>>>>> updateZone, createTemplate, in most of the cases we do not > >>>>>>> say how to use maps, one way would be to write this in the > description or to > >>>>>>> use the same way to access maps of all APIs. > >>>>>>> > >>>>>>> BTW the way to use details in deploy vm API is > >>>>>>> details[0].foo=bar&details[1].baz=12 where foo and baz are keys. > >>>>>>> > >>>>>>> Also if we want to use the regix protected static final String > >>>>>>> MAP_KEY_PATTERN_EXPRESSION = "^([^\\[^\\]]+)\\[(\\d+)\\]\\.key$"; > >>>>>>> protected static > final > >>>>>>> String MAP_VALUE_PATTERN_EXPRESSION = > "^[^\\[^\\]]+\\[\\d+\\]\\.value$"; > >>>>>>> > >>>>>>> wil this work in the following case. I believe service is the key > here which > >>>>>>> repeats. > >>>>>>> > http://10.147.59.119:8080/client/api?command=createNetworkOffering&response=json&sessionkey=/kGFJDXFmMQU8JZnnC7QFfj3tV8=&name=bharat&displayText=bharat&guestIpType=Isolated&lbType=publicLb& > >>>>>>> > servicecapabilitylist[0].service=SourceNat&servicecapabilitylist[0].capabilitytype=SupportedSourceNatTypes& > >>>>>>> servicecapabilitylist[0].capabilityvalue=peraccount& > >>>>>>> > servicecapabilitylist[1].service=lb&servicecapabilitylist[1].capabilitytype=SupportedLbIsolation& > >>>>>>> > servicecapabilitylist[1].capabilityvalue=dedicated&availability=Optional&egresspolicy=ALLOW&state=Creating&status=Creating&allocationstate=Creating&supportedServices=Vpn,Dhcp,Dns,Firewall,Lb,UserData,SourceNat,StaticNat,PortForwarding&specifyIpRanges=false&specifyVlan=false&isPersistent=false&conservemode=false&serviceProviderList[0].service=Vpn&serviceProviderList[0].provider=VirtualRouter&serviceProviderList[1].service=Dhcp&serviceProviderList[1].provider=VirtualRouter&serviceProviderList[2].service=Dns&serviceProviderList[2].provider=VirtualRouter&serviceProviderList[3].service=Firewall&serviceProviderList[3].provider=VirtualRouter&serviceProviderList[4].service=Lb&serviceProviderList[4].provider=VirtualRouter&serviceProviderList[5].service=UserData&serviceProviderList[5].provider=VirtualRouter&serviceProviderList[6].service=SourceNat&serviceProviderList[6].provider=JuniperSRX&serviceProviderList[7].service=StaticNat&serviceProviderList[7].provider=JuniperSRX&serviceProviderList[8].service=PortForwarding&serviceProviderList[8].provider=JuniperSRX&egressdefaultpolicy=true&traffictype=GUEST&_=1393925230248 > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> On 04-Mar-2014, at 2:30 am, Marcus <shadow...@gmail.com> wrote: > >>>>>>> > >>>>>>> Along these lines, the details parameter in deployVirtualMachine > seems > >>>>>>> broken. If I call "details[0].key=foo,details[0].value=bar", it > stores > >>>>>>> entries in the database like this: > >>>>>>> > >>>>>>> id | vmid | name | value | display > >>>>>>> > >>>>>>> 12 | 25 | value | bar | 1 > >>>>>>> 13 | 25 | key | foo | 1 > >>>>>>> > >>>>>>> It seems as though this might be correct per Alena's email, but I > >>>>>>> don't understand how this can be reconstructed into foo=bar when > >>>>>>> there's no binding between the two rows. Perhaps details are > supposed > >>>>>>> to be passed differently than the resource tags, because if I do > >>>>>>> "details[0].foo=bar&details[1].baz=12", I get: > >>>>>>> > >>>>>>> id | vmid | name | value | display > >>>>>>> > >>>>>>> 12 | 25 | foo | bar | 1 > >>>>>>> 13 | 25 | baz | 12 | 1 > >>>>>>> > >>>>>>> And indeed there is code utilizing these details already committed > >>>>>>> that expects this format, as deployVirtualMachines getDetails() > only > >>>>>>> seems to pass a correct Map<String, String> with Key, Value if I > use > >>>>>>> this format. > >>>>>>> > >>>>>>> On Mon, Mar 3, 2014 at 11:48 AM, Antonio Fornié Casarrubios > >>>>>>> <antonio.for...@gmail.com> wrote: > >>>>>>> > >>>>>>> Hi Alena, > >>>>>>> > >>>>>>> Of course, the API will not have any changes. This is not a > functional > >>>>>>> change, just some refactoring. The problem is there are many > things in CS > >>>>>>> that really need some refactoring otherwise the problem will > continue > >>>>>>> growing more and more, but doing the change and above all making > sure it > >>>>>>> all works afterwards is not simple. > >>>>>>> > >>>>>>> I will make sure that everything works exactly the same way and > that the > >>>>>>> data returned is also the same. > >>>>>>> > >>>>>>> Thanks. Cheers > >>>>>>> Antonio > >>>>>>> > >>>>>>> > >>>>>>> 2014-03-03 18:48 GMT+01:00 Alena Prokharchyk < > alena.prokharc...@citrix.com>: > >>>>>>> > >>>>>>> Antonio, sure I will review the patch. But please make sure that > API > >>>>>>> backwards compatibly is intact, otherwise the fix won¹t be > accepted. > >>>>>>> > >>>>>>> -Alena. > >>>>>>> > >>>>>>> > >>>>>>> On 3/2/14, 4:31 PM, "Antonio Fornié Casarrubios" > >>>>>>> <antonio.for...@gmail.com> wrote: > >>>>>>> > >>>>>>> Hi Alena, > >>>>>>> > >>>>>>> The reasons for this strange format? I don't know. There doesn't > seem to > >>>>>>> be > >>>>>>> one. After asking on my team and in the dev list I thought perhaps > you > >>>>>>> could know. It seems we all see it strange and nobody knows why. > But of > >>>>>>> course, if it is for reasons I will stop the change. > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> And about the DB, you are right, in the DB is not like I said. But > you can > >>>>>>> have this in a table row field: > >>>>>>> {0={value=Toronto,key=City}} > >>>>>>> for some tables. I think there are two cases: > >>>>>>> > >>>>>>> 1- params in wich the get method fixes the params on the fly. In > these of > >>>>>>> course the strange format is not propagated anymore. But this is > still > >>>>>>> wrong: the format itself before the get is invoked, the time spent > on > >>>>>>> fixing something that should be a normal Map from the begining > (each time > >>>>>>> the get method is invoked) and mainly the fact that these get > methods that > >>>>>>> fix the map on the fly are copies of each other: instead of fixing > the > >>>>>>> structure in one method, the are plenty of methods almost identical > >>>>>>> copying > >>>>>>> and pasting the same lines. Some times the same method twice in > the same > >>>>>>> cmd class for two Map params (look CreateNetworkOfferingCmd > >>>>>>> #getServiceCapabilities and #getServiceProviders). > >>>>>>> > >>>>>>> 2- params in which the get method returns the map as it is. With > the > >>>>>>> strange format. For example, > >>>>>>> Cloudmonkey command > >>>>>>> create networkoffering ... tags[0].key="City" > tags[0].value="Toronto" > >>>>>>> > >>>>>>> You store in the table network_offeringstags, field tags, the > String: > >>>>>>> {0={value=Toronto,key=City}} > >>>>>>> (including brackets and all) > >>>>>>> > >>>>>>> So knowing all this I guess you agree this should be refactored... > unless > >>>>>>> at some point the strange format is needed. But after looking for > it > >>>>>>> everywhere I didn't find any place where it was. I already did the > change > >>>>>>> and tested most of the cases and it all seems to work. > >>>>>>> > >>>>>>> > >>>>>>> It would be great if once I upload the patch somebody could help > me double > >>>>>>> check that it doesn't brake anything, not only reviewing to code. > I did > >>>>>>> plenty of tests of many kinds, but I cannot be sure that I am > covering > >>>>>>> enough. Further, there seem to be several places where the code > expects > >>>>>>> the > >>>>>>> strange format. > >>>>>>> ->ConfigurationManagerImpl line 1545 > >>>>>>> > >>>>>>> > >>>>>>> Thanks. Cheers > >>>>>>> Antonio > >>>>>>> > >>>>>>> > >>>>>>> 2014-02-28 18:44 GMT+01:00 Alena Prokharchyk > >>>>>>> <alena.prokharc...@citrix.com>: > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> From: Antonio Fornié Casarrubios <antonio.for...@gmail.com> > >>>>>>> Date: Friday, February 28, 2014 at 2:09 AM > >>>>>>> To: Rohit Yadav <rohityada...@gmail.com>, cloudstack < > >>>>>>> dev@cloudstack.apache.org>, Alena Prokharchyk < > >>>>>>> alena.prokharc...@citrix.com> > >>>>>>> Subject: Re: [PROPOSAL][QUESTION] Map parameters in API Commands > >>>>>>> > >>>>>>> Hi Alena, > >>>>>>> > >>>>>>> I would like to know your opinion on this change. Mainly consists > on: > >>>>>>> 1- Change the way we store the Map params after unpackParams in > order to > >>>>>>> have, for each Map param, a Map<String, String> instead of > Map<String, > >>>>>>> Map<String, Object>>. > >>>>>>> > >>>>>>> > >>>>>>> -Antonio, what was the reason for storing the parameter in the old > >>>>>>> format to begin with? Where there any case where we actually > needed a > >>>>>>> map > >>>>>>> of map parameters? > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> 2- There are many commands that fix this strange format on demand > on > >>>>>>> their getters, so they do the conversion there. Since I already > have the > >>>>>>> final format I replace these getters with just > >>>>>>> getTags(){ return this.tags;} > >>>>>>> > >>>>>>> 3- Persistence of these Map params. This last change is more > tricky and > >>>>>>> error-prone but the previous two would brake the functionality > without > >>>>>>> it. > >>>>>>> Actually it doesn't seem that I should change this for all the > cases, > >>>>>>> given > >>>>>>> that for some commands the current behavior is storing in the DB > the > >>>>>>> Map as > >>>>>>> it comes, so after the change it will just do the same and thus > >>>>>>> retrieve it > >>>>>>> with the right format. So, although in the tables we move from > >>>>>>> ------ > >>>>>>> key | City > >>>>>>> ------ > >>>>>>> value | The Hague > >>>>>>> ------ > >>>>>>> > >>>>>>> to > >>>>>>> ------ > >>>>>>> City | The Hague > >>>>>>> ------ > >>>>>>> > >>>>>>> then in memory, after DB read, we will just have the proper format > >>>>>>> again > >>>>>>> (Map<String, String>). Is that right? > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> - in what table do you see key name being a field name? I've looked > >>>>>>> at > >>>>>>> various *_details tables, as well as resource_tag table, everywhere > >>>>>>> we have > >>>>>>> key/value fields where we store key and the value respectfully: > >>>>>>> > >>>>>>> mysql> desc user_Vm_details; > >>>>>>> > >>>>>>> > +---------+---------------------+------+-----+---------+----------------+ > >>>>>>> | Field | Type | Null | Key | Default | Extra > >>>>>>> | > >>>>>>> > >>>>>>> > +---------+---------------------+------+-----+---------+----------------+ > >>>>>>> | id | bigint(20) unsigned | NO | PRI | NULL | > auto_increment > >>>>>>> | > >>>>>>> | vm_id | bigint(20) unsigned | NO | MUL | NULL | > >>>>>>> | > >>>>>>> | name | varchar(255) | NO | | NULL | > >>>>>>> | > >>>>>>> | value | varchar(1024) | NO | | NULL | > >>>>>>> | > >>>>>>> | display | tinyint(1) | NO | | 1 | > >>>>>>> | > >>>>>>> > >>>>>>> > +---------+---------------------+------+-----+---------+----------------+ > >>>>>>> 5 rows in set (0.01 sec) > >>>>>>> > >>>>>>> mysql> desc resource_tags; > >>>>>>> > >>>>>>> > >>>>>>> > +---------------+---------------------+------+-----+---------+----------- > >>>>>>> -----+ > >>>>>>> | Field | Type | Null | Key | Default | > Extra > >>>>>>> | > >>>>>>> > >>>>>>> > >>>>>>> > +---------------+---------------------+------+-----+---------+----------- > >>>>>>> -----+ > >>>>>>> | id | bigint(20) unsigned | NO | PRI | NULL | > >>>>>>> auto_increment | > >>>>>>> | uuid | varchar(40) | YES | UNI | NULL | > >>>>>>> | > >>>>>>> | key | varchar(255) | YES | | NULL | > >>>>>>> | > >>>>>>> | value | varchar(255) | YES | | NULL | > >>>>>>> | > >>>>>>> | resource_id | bigint(20) unsigned | NO | MUL | NULL | > >>>>>>> | > >>>>>>> | resource_uuid | varchar(40) | YES | | NULL | > >>>>>>> | > >>>>>>> | resource_type | varchar(255) | YES | | NULL | > >>>>>>> | > >>>>>>> | customer | varchar(255) | YES | | NULL | > >>>>>>> | > >>>>>>> | domain_id | bigint(20) unsigned | NO | MUL | NULL | > >>>>>>> | > >>>>>>> | account_id | bigint(20) unsigned | NO | MUL | NULL | > >>>>>>> | > >>>>>>> > >>>>>>> > >>>>>>> > +---------------+---------------------+------+-----+---------+----------- > >>>>>>> -----+ > >>>>>>> > >>>>>>> > >>>>>>> 4- The last change should be related to any code expecting the old > >>>>>>> format, that will fail with the new one. I guess UI will be an > example > >>>>>>> of > >>>>>>> that, but I didn't check yet. If the JS code receives the new Map > >>>>>>> serialized, then chances are this will break it, right? Can you > tell > >>>>>>> your > >>>>>>> thoughts on this? Can you tell me places I should check first to > confirm > >>>>>>> this guess? > >>>>>>> > >>>>>>> > >>>>>>> - Its not just about the uI> You should never break the API > backwards > >>>>>>> compatibility. Remember that lots of third party vendors use our > APIs, > >>>>>>> not > >>>>>>> the UI. As long as we support the old format, introducing the new > one > >>>>>>> shouldn't be a problem. > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> Considering it all, do you think this change is worth it? For me > this > >>>>>>> seems to be something that was wrong from the beginning and it > should > >>>>>>> have > >>>>>>> been changed before the mess got spread. But know, although I want > to > >>>>>>> fix > >>>>>>> it, I'm afraid this involves touching too many things in order to > fix > >>>>>>> something that looks horrible but seems to be actually working and > I > >>>>>>> don't > >>>>>>> want to break. > >>>>>>> > >>>>>>> Thanks. Cheers > >>>>>>> Antonio > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> 2014-02-12 23:32 GMT+01:00 Rohit Yadav <rohityada...@gmail.com>: > >>>>>>> > >>>>>>> On Wed, Feb 12, 2014 at 9:52 PM, Antonio Fornié Casarrubios > >>>>>>> <antonio.for...@gmail.com> wrote: > >>>>>>> > >>>>>>> Hi Rohit, > >>>>>>> > >>>>>>> I didn't mean changing the format of the HTTP request, but only > >>>>>>> > >>>>>>> changing the > >>>>>>> > >>>>>>> intermediate format in which we keep it in the property of the > >>>>>>> > >>>>>>> Command > >>>>>>> > >>>>>>> class. I mentioned the format in the request just to explain what I > >>>>>>> > >>>>>>> meant. > >>>>>>> > >>>>>>> > >>>>>>> My proposal is to leave the request format as it is, but then when > >>>>>>> > >>>>>>> the > >>>>>>> > >>>>>>> method "apiDispatcher#setFieldValue" parses the map and assign it > to > >>>>>>> > >>>>>>> the > >>>>>>> > >>>>>>> property, do it in a normal way: which is a Map<String, String> > >>>>>>> > >>>>>>> instead > >>>>>>> of a > >>>>>>> > >>>>>>> Map<String, Map<String, Object>> as it is now. And then, our getter > >>>>>>> > >>>>>>> methods > >>>>>>> > >>>>>>> (like CreateTagsCommand#GetTag) will be just a normal getter that > >>>>>>> > >>>>>>> doesn't > >>>>>>> > >>>>>>> need to transform the structure on the fly. > >>>>>>> > >>>>>>> > >>>>>>> Cool, let's request the present API layer maintainer(s) and other > >>>>>>> folks in the community to comment. > >>>>>>> > >>>>>>> Regards. > >>>>>>> > >>>>>>> > >>>>>>> Thanks, cheers > >>>>>>> antonio > >>>>>>> > >>>>>>> > >>>>>>> 2014-02-11 17:38 GMT+01:00 Rohit Yadav <rohityada...@gmail.com>: > >>>>>>> > >>>>>>> Hi Antonio, > >>>>>>> > >>>>>>> On Tue, Feb 11, 2014 at 9:57 PM, Antonio Fornié Casarrubios > >>>>>>> <antonio.for...@gmail.com> wrote: > >>>>>>> > >>>>>>> Hi all, > >>>>>>> > >>>>>>> When invoking a CS API command that has parameters of type Map, > >>>>>>> > >>>>>>> the > >>>>>>> > >>>>>>> request > >>>>>>> will be something like this: > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > URL/api?command=createTags&tags[0].key=region&tags[0].value=canada&tags[ > >>>>>>> 1].key=name&tags[1].value=bob > >>>>>>> > >>>>>>> > >>>>>>> in order to send a Map with the pairs: > >>>>>>> > >>>>>>> tags{ > >>>>>>> region : "canada", > >>>>>>> name : "bob" > >>>>>>> } > >>>>>>> > >>>>>>> Then in the server side the parameters go through several stages > >>>>>>> > >>>>>>> (IMHO > >>>>>>> > >>>>>>> too > >>>>>>> many), and have different formats. At some point > >>>>>>> > >>>>>>> apiDispatcher#setFieldValue > >>>>>>> > >>>>>>> will assign the value to the command property (CreateTagsCmd#tag > >>>>>>> > >>>>>>> in > >>>>>>> the > >>>>>>> > >>>>>>> example) in a VERY strange way: > >>>>>>> > >>>>>>> CreateTagsCmd#tag = { > >>>>>>> 0 : { > >>>>>>> "key" : "region", > >>>>>>> "value" : "canada" > >>>>>>> }, > >>>>>>> 1 : { > >>>>>>> "key" : "name", > >>>>>>> "value" : "bob" > >>>>>>> } > >>>>>>> } > >>>>>>> > >>>>>>> This is true for several Cmd classes. And the funny thing is they > >>>>>>> usually > >>>>>>> provide a public getter method to get the Map in an already > >>>>>>> > >>>>>>> "normalized" > >>>>>>> > >>>>>>> structure. The problem is we have this method again a again in > >>>>>>> > >>>>>>> each > >>>>>>> of > >>>>>>> > >>>>>>> these commands, only with different name depending on what > >>>>>>> > >>>>>>> property > >>>>>>> the > >>>>>>> > >>>>>>> get, and the body is almost copy and pasted. so my next > >>>>>>> > >>>>>>> refactoring > >>>>>>> > >>>>>>> would > >>>>>>> be to have a generic method only once in BaseCmd so that all > >>>>>>> > >>>>>>> subclasses > >>>>>>> > >>>>>>> can > >>>>>>> reuse it for their Map getters. Pretty obvious, but... > >>>>>>> > >>>>>>> > >>>>>>> This is a well know issue and is such a pain, both for the users of > >>>>>>> the API to create this API and the programmer who have to put hack > >>>>>>> > >>>>>>> at > >>>>>>> > >>>>>>> the backend to extract the map. > >>>>>>> > >>>>>>> Is it really necessary to have this strange format? Wouldn't it be > >>>>>>> > >>>>>>> much > >>>>>>> > >>>>>>> better to just store it in a more normal way from the beginning, > >>>>>>> > >>>>>>> and > >>>>>>> > >>>>>>> have > >>>>>>> the getters just standard getters? Does it have any use to have > >>>>>>> > >>>>>>> those > >>>>>>> > >>>>>>> Maps > >>>>>>> of Maps? > >>>>>>> > >>>>>>> > >>>>>>> Changing the API will break many client so no one attempted it for > >>>>>>> keeping backward-compatibility I think. > >>>>>>> > >>>>>>> The HTTP RFC states that if same keys are sent in param they must > be > >>>>>>> received as an array. For example, /api?q=1&q=2&q=3 should received > >>>>>>> > >>>>>>> q > >>>>>>> > >>>>>>> = [1,2,3] which is what we're not doing. > >>>>>>> > >>>>>>> We should do that and this way we can capture maps using keys and > >>>>>>> values in order, so for example, > >>>>>>> /api?q.key1=value1&q.key2=value2&q.key1=value3&q.key2=value4 should > >>>>>>> > >>>>>>> be > >>>>>>> > >>>>>>> received as as array of maps: [{key1: value1, key2: value2}, > >>>>>>> {key3:value3, key4: value4}] etc. > >>>>>>> > >>>>>>> I think it does not have to be maps of maps, but since our API is > >>>>>>> query based these ugly hacks were invented. We should definitely > get > >>>>>>> rid of them, and perhaps work on the RESTful API layer, > cloud-engine > >>>>>>> and other good stuff we were talking about more than a year ago and > >>>>>>> deprecate the present query API over next few years. Thoughts, > >>>>>>> > >>>>>>> flames? > >>>>>>> > >>>>>>> > >>>>>>> Regards. > >>>>>>> > >>>>>>> > >>>>>>> Thanks. Cheers > >>>>>>> Antonio Fornie > >>>>>>> Schuberg Philis - MCE > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>> > >> > -- *Mike Tutkowski* *Senior CloudStack Developer, SolidFire Inc.* e: mike.tutkow...@solidfire.com o: 303.746.7302 Advancing the way the world uses the cloud<http://solidfire.com/solution/overview/?video=play> *(tm)*