Fixed with commit 16ddc3414ae0269ecb8903f670496e45f68d6ef6 On 13-Mar-2014, at 11:34 PM, David Nalley <da...@gnsa.us> wrote:
> Better yet, feel free to submit a patch that fixes it in addition to > the Jira :) > > --David > > On Thu, Mar 13, 2014 at 2:00 PM, Alena Prokharchyk > <alena.prokharc...@citrix.com> wrote: >> Konstantina, feel free to raise the Jira ticket for it. >> >> Thanks, >> Alena. >> >> On 3/13/14, 8:46 AM, "Konstantina Chremmou" >> <konstantina.chrem...@citrix.com> wrote: >> >>> Hi, >>> >>> This commit adds a new parameter to ListVMsCmd, but no 'since' has been >>> specified in the parameter annotation. Please rectify. >>> >>> Thanks, >>> Tina >>> >>> -------------------------------------------------------------------------- >>> ------------- >>> Guidelines for writing/modifying CS APIs: >>> >>> https://cwiki.apache.org/confluence/display/CLOUDSTACK/CloudStack+API+Codi >>> ng+Guidelines >>> -------------------------------------------------------------------------- >>> ------------- >>> >>>> -----Original Message----- >>>> From: muralire...@apache.org [mailto:muralire...@apache.org] >>>> Sent: 13 March 2014 1:53 PM >>>> To: comm...@cloudstack.apache.org >>>> Subject: [20/31] git commit: updated refs/heads/distributedrouter to >>>> a8d43ba >>>> >>>> CLOUDSTACK-6052: List VM enhancement to support querying with multiple >>>> VM IDs New parameter 'ids' added to listVirtualMachine API. The syntax >>>> looks like >>>> http://localhost:8096/api?command=listVirtualMachines&listAll=true&ids=e >>>> ddac053-9b12-4d2e-acb7-233de2e98112,009966fc-4d7b-4f84-8609- >>>> 254979ba0134 >>>> The new parameter will be mutually exclusive with the existing 'id' >>>> parameter. >>>> >>>> >>>> Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo >>>> Commit: http://git-wip- >>>> us.apache.org/repos/asf/cloudstack/commit/5779292e >>>> Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5779292e >>>> Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5779292e >>>> >>>> Branch: refs/heads/distributedrouter >>>> Commit: 5779292e93fe52a7fb5ec0abffe1e3f6b9c10121 >>>> Parents: bc4c805 >>>> Author: Koushik Das <kous...@apache.org> >>>> Authored: Tue Mar 11 11:49:13 2014 +0530 >>>> Committer: Koushik Das <kous...@apache.org> >>>> Committed: Thu Mar 13 17:05:35 2014 +0530 >>>> >>>> ---------------------------------------------------------------------- >>>> .../api/command/user/vm/ListVMsCmd.java | 8 +++ >>>> .../com/cloud/api/query/QueryManagerImpl.java | 20 ++++++-- >>>> test/integration/smoke/test_deploy_vm.py | 52 >>>> +++++++++++++++++++- >>>> 3 files changed, 76 insertions(+), 4 deletions(-) >>>> ---------------------------------------------------------------------- >>>> >>>> >>>> http://git-wip- >>>> us.apache.org/repos/asf/cloudstack/blob/5779292e/api/src/org/apache/clo >>>> udstack/api/command/user/vm/ListVMsCmd.java >>>> ---------------------------------------------------------------------- >>>> diff --git >>>> a/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java >>>> b/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java >>>> index 1a564f6..1ba2b23 100644 >>>> --- >>>> a/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java >>>> +++ >>>> b/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java >>>> @@ -64,6 +64,10 @@ public class ListVMsCmd extends >>>> BaseListTaggedResourcesCmd { >>>> @Parameter(name = ApiConstants.ID, type = CommandType.UUID, >>>> entityType = UserVmResponse.class, description = "the ID of the virtual >>>> machine") >>>> private Long id; >>>> >>>> + @Parameter(name=ApiConstants.IDS, type=CommandType.LIST, >>>> collectionType=CommandType.UUID, entityType=UserVmResponse.class, >>>> + description="the IDs of the virtual machines, mutually >>>> exclusive with >>>> id") >>>> + private List<Long> ids; >>>> + >>>> @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, >>>> description = "name of the virtual machine") >>>> private String name; >>>> >>>> @@ -135,6 +139,10 @@ public class ListVMsCmd extends >>>> BaseListTaggedResourcesCmd { >>>> return id; >>>> } >>>> >>>> + public List<Long> getIds() { >>>> + return ids; >>>> + } >>>> + >>>> public String getName() { >>>> return name; >>>> } >>>> >>>> http://git-wip- >>>> us.apache.org/repos/asf/cloudstack/blob/5779292e/server/src/com/cloud/a >>>> pi/query/QueryManagerImpl.java >>>> ---------------------------------------------------------------------- >>>> diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java >>>> b/server/src/com/cloud/api/query/QueryManagerImpl.java >>>> index 4200799..47d2aec 100644 >>>> --- a/server/src/com/cloud/api/query/QueryManagerImpl.java >>>> +++ b/server/src/com/cloud/api/query/QueryManagerImpl.java >>>> @@ -728,11 +728,22 @@ public class QueryManagerImpl extends >>>> ManagerBase implements QueryService { >>>> Boolean isRecursive = domainIdRecursiveListProject.second(); >>>> ListProjectResourcesCriteria listProjectResourcesCriteria = >>>> domainIdRecursiveListProject.third(); >>>> >>>> + List<Long> ids = null; >>>> + if (cmd.getId() != null) { >>>> + if (cmd.getIds() != null && !cmd.getIds().isEmpty()) { >>>> + throw new InvalidParameterValueException("Specify >>>> either id or >>>> ids but not both parameters"); >>>> + } >>>> + ids = new ArrayList<Long>(); >>>> + ids.add(cmd.getId()); >>>> + } else { >>>> + ids = cmd.getIds(); >>>> + } >>>> + >>>> Criteria c = new Criteria("id", Boolean.TRUE, >>>> cmd.getStartIndex(), >>>> cmd.getPageSizeVal()); >>>> // Criteria c = new Criteria(null, Boolean.FALSE, >>>> cmd.getStartIndex(), >>>> // cmd.getPageSizeVal()); //version without default sorting >>>> c.addCriteria(Criteria.KEYWORD, cmd.getKeyword()); >>>> - c.addCriteria(Criteria.ID, cmd.getId()); >>>> + c.addCriteria(Criteria.ID, ids); >>>> c.addCriteria(Criteria.NAME, cmd.getName()); >>>> c.addCriteria(Criteria.STATE, cmd.getState()); >>>> c.addCriteria(Criteria.DATACENTERID, cmd.getZoneId()); @@ >>>> -805,7 >>>> +816,7 @@ public class QueryManagerImpl extends ManagerBase >>>> implements QueryService { >>>> Object display = c.getCriteria(Criteria.DISPLAY); >>>> >>>> sb.and("displayName", sb.entity().getDisplayName(), >>>> SearchCriteria.Op.LIKE); >>>> - sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); >>>> + sb.and("idIN", sb.entity().getId(), SearchCriteria.Op.IN); >>>> sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); >>>> sb.and("stateEQ", sb.entity().getState(), >>>> SearchCriteria.Op.EQ); >>>> sb.and("stateNEQ", sb.entity().getState(), >>>> SearchCriteria.Op.NEQ); @@ >>>> -889,7 +900,10 @@ public class QueryManagerImpl extends ManagerBase >>>> implements QueryService { >>>> } >>>> >>>> if (id != null) { >>>> - sc.setParameters("id", id); >>>> + List<?> idList = (id instanceof List<?> ? (List<?>)id : >>>> null); >>>> + if (idList != null && !idList.isEmpty()) { >>>> + sc.setParameters("idIN", idList.toArray()); >>>> + } >>>> } >>>> >>>> if (templateId != null) { >>>> >>>> http://git-wip- >>>> us.apache.org/repos/asf/cloudstack/blob/5779292e/test/integration/smoke >>>> /test_deploy_vm.py >>>> ---------------------------------------------------------------------- >>>> diff --git a/test/integration/smoke/test_deploy_vm.py >>>> b/test/integration/smoke/test_deploy_vm.py >>>> index 425aeb7..fcde229 100644 >>>> --- a/test/integration/smoke/test_deploy_vm.py >>>> +++ b/test/integration/smoke/test_deploy_vm.py >>>> @@ -51,6 +51,11 @@ class TestData(object): >>>> "name" : "testvm", >>>> "displayname" : "Test VM", >>>> }, >>>> + #data reqd for virtual machine creation >>>> + "virtual_machine2" : { >>>> + "name" : "testvm2", >>>> + "displayname" : "Test VM2", >>>> + }, >>>> #small service offering >>>> "service_offering": { >>>> "small": { >>>> @@ -149,8 +154,53 @@ class TestDeployVM(cloudstackTestCase): >>>> msg="VM is not in Running state" >>>> ) >>>> >>>> + @attr(tags = ['advanced', 'simulator', 'basic', 'sg']) >>>> + def test_deploy_vm_multiple(self): >>>> + """Test Multiple Deploy Virtual Machine >>>> + >>>> + # Validate the following: >>>> + # 1. deploy 2 virtual machines >>>> + # 2. listVirtualMachines using 'ids' parameter returns accurate >>>> information >>>> + """ >>>> + self.virtual_machine = VirtualMachine.create( >>>> + self.apiclient, >>>> + self.testdata["virtual_machine"], >>>> + accountid=self.account.name, >>>> + zoneid=self.zone.id, >>>> + domainid=self.account.domainid, >>>> + serviceofferingid=self.service_offering.id, >>>> + templateid=self.template.id >>>> + ) >>>> + >>>> + self.virtual_machine2 = VirtualMachine.create( >>>> + self.apiclient, >>>> + self.testdata["virtual_machine2"], >>>> + accountid=self.account.name, >>>> + zoneid=self.zone.id, >>>> + domainid=self.account.domainid, >>>> + serviceofferingid=self.service_offering.id, >>>> + templateid=self.template.id >>>> + ) >>>> + >>>> + list_vms = VirtualMachine.list(self.apiclient, >>>> ids=[self.virtual_machine.id, self.virtual_machine2.id], listAll=True) >>>> + self.debug( >>>> + "Verify listVirtualMachines response for virtual machines: >>>> %s, %s" % >>>> (self.virtual_machine.id, self.virtual_machine2.id) >>>> + ) >>>> + >>>> + self.assertEqual( >>>> + isinstance(list_vms, list), >>>> + True, >>>> + "List VM response was not a valid list" >>>> + ) >>>> + self.assertEqual( >>>> + len(list_vms), >>>> + 2, >>>> + "List VM response was empty, expected 2 VMs" >>>> + ) >>>> + >>>> def tearDown(self): >>>> try: >>>> cleanup_resources(self.apiclient, self.cleanup) >>>> except Exception as e: >>>> - self.debug("Warning! Exception in tearDown: %s" % e) >>>> \ No newline at end of file >>>> + self.debug("Warning! Exception in tearDown: %s" % e) >>>> + >>> >>