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
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>
>

Reply via email to