diff --git a/api/src/com/cloud/network/security/SecurityGroupService.java b/api/src/com/cloud/network/security/SecurityGroupService.java index dac42505c7d..741f179db50 100644 --- a/api/src/com/cloud/network/security/SecurityGroupService.java +++ b/api/src/com/cloud/network/security/SecurityGroupService.java @@ -19,12 +19,10 @@ package com.cloud.network.security; import java.util.List; import org.apache.cloudstack.api.command.user.securitygroup.*; -import org.apache.cloudstack.api.command.user.securitygroup.AuthorizeSecurityGroupIngressCmd; + import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceInUseException; -import org.apache.cloudstack.api.view.vo.SecurityGroupJoinVO; -import com.cloud.utils.Pair; public interface SecurityGroupService { /** @@ -38,12 +36,6 @@ public interface SecurityGroupService { boolean deleteSecurityGroup(DeleteSecurityGroupCmd cmd) throws ResourceInUseException; - /** - * Search for security groups and associated ingress rules for the given account, domain, group name, and/or keyword. - * The search terms are specified in the search criteria. - * @return the list of security groups and associated ingress rules - */ - public Pair, Integer> searchForSecurityGroupRules(ListSecurityGroupsCmd cmd) throws PermissionDeniedException, InvalidParameterValueException; public List authorizeSecurityGroupIngress(AuthorizeSecurityGroupIngressCmd cmd); diff --git a/api/src/com/cloud/projects/ProjectService.java b/api/src/com/cloud/projects/ProjectService.java index 0f58ef915d4..01975188dd9 100644 --- a/api/src/com/cloud/projects/ProjectService.java +++ b/api/src/com/cloud/projects/ProjectService.java @@ -16,19 +16,11 @@ // under the License. package com.cloud.projects; -import java.util.List; -import java.util.Map; - -import org.apache.cloudstack.api.view.vo.ProjectAccountJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectInvitationJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectJoinVO; - import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.projects.ProjectAccount.Role; import com.cloud.user.Account; -import com.cloud.utils.Pair; public interface ProjectService { /** @@ -65,9 +57,6 @@ public interface ProjectService { */ Project getProject(long id); - Pair, Integer> listProjects(Long id, String name, String displayText, String state, String accountName, - Long domainId, String keyword, Long startIndex, Long pageSize, boolean listAll, boolean isRecursive, Map tags); - ProjectAccount assignAccountToProject(Project project, long accountId, Role accountRole); Account getProjectOwner(long projectId); @@ -84,10 +73,7 @@ public interface ProjectService { boolean deleteAccountFromProject(long projectId, String accountName); - Pair, Integer> listProjectAccounts(long projectId, String accountName, String role, Long startIndex, Long pageSizeVal); - Pair, Integer> listProjectInvitations(Long id, Long projectId, String accountName, Long domainId, String state, boolean activeOnly, Long startIndex, Long pageSizeVal, boolean isRecursive, - boolean listAll); boolean updateInvitation(long projectId, String accountName, String token, boolean accept); diff --git a/api/src/com/cloud/server/ManagementService.java b/api/src/com/cloud/server/ManagementService.java index a79dd13469f..70ef79973ac 100755 --- a/api/src/com/cloud/server/ManagementService.java +++ b/api/src/com/cloud/server/ManagementService.java @@ -62,9 +62,6 @@ import org.apache.cloudstack.api.command.user.iso.UpdateIsoCmd; import org.apache.cloudstack.api.command.user.vmgroup.UpdateVMGroupCmd; import org.apache.cloudstack.api.command.admin.systemvm.UpgradeSystemVMCmd; import org.apache.cloudstack.api.command.admin.resource.UploadCustomCertificateCmd; -import org.apache.cloudstack.api.view.vo.DomainRouterJoinVO; -import org.apache.cloudstack.api.view.vo.EventJoinVO; -import org.apache.cloudstack.api.view.vo.InstanceGroupJoinVO; import com.cloud.async.AsyncJob; import com.cloud.capacity.Capacity; @@ -168,25 +165,7 @@ public interface ManagementService { VirtualMachineTemplate updateTemplate(UpdateTemplateCmd cmd); - /** - * Obtains a list of events by the specified search criteria. Can search by: "username", "type", "level", - * "startDate", - * "endDate" - * - * @param c - * @return List of Events. - */ - Pair, Integer> searchForEvents(ListEventsCmd c); - /** - * Obtains a list of routers by the specified search criteria. Can search by: "userId", "name", "state", - * "dataCenterId", - * "podId", "hostId" - * - * @param cmd - * @return List of DomainRouters. - */ - Pair, Integer> searchForRouters(ListRoutersCmd cmd); /** * Obtains a list of IP Addresses by the specified search criteria. Can search by: "userId", "dataCenterId", @@ -309,7 +288,6 @@ public interface ManagementService { InstanceGroup updateVmGroup(UpdateVMGroupCmd cmd); - Pair, Integer> searchForVmGroups(ListVMGroupsCmd cmd); Map listCapabilities(ListCapabilitiesCmd cmd); diff --git a/api/src/com/cloud/server/TaggedResourceService.java b/api/src/com/cloud/server/TaggedResourceService.java index f28d9e9828e..92a4300db0a 100644 --- a/api/src/com/cloud/server/TaggedResourceService.java +++ b/api/src/com/cloud/server/TaggedResourceService.java @@ -19,11 +19,7 @@ package com.cloud.server; import java.util.List; import java.util.Map; -import org.apache.cloudstack.api.command.user.tag.ListTagsCmd; - -import org.apache.cloudstack.api.view.vo.ResourceTagJoinVO; import com.cloud.server.ResourceTag.TaggedResourceType; -import com.cloud.utils.Pair; public interface TaggedResourceService { @@ -45,11 +41,6 @@ public interface TaggedResourceService { */ String getUuid(String resourceId, TaggedResourceType resourceType); - /** - * @param listTagsCmd - * @return - */ - Pair, Integer> listTags(ListTagsCmd listTagsCmd); /** * @param resourceIds diff --git a/api/src/com/cloud/user/AccountService.java b/api/src/com/cloud/user/AccountService.java index 10d666c38f1..0a6cc6bd59c 100755 --- a/api/src/com/cloud/user/AccountService.java +++ b/api/src/com/cloud/user/AccountService.java @@ -21,13 +21,12 @@ import java.util.Map; import com.cloud.acl.ControlledEntity; import com.cloud.acl.SecurityChecker.AccessType; + import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd; -import org.apache.cloudstack.api.command.admin.user.ListUsersCmd; import org.apache.cloudstack.api.command.admin.user.RegisterCmd; import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd; import org.apache.cloudstack.api.command.admin.account.UpdateAccountCmd; import org.apache.cloudstack.api.command.user.account.ListAccountsCmd; -import org.apache.cloudstack.api.view.vo.UserAccountJoinVO; import com.cloud.domain.Domain; import com.cloud.exception.ConcurrentOperationException; @@ -195,8 +194,7 @@ public interface AccountService { Pair, Integer> searchForAccounts(ListAccountsCmd cmd); - Pair, Integer> searchForUsers(ListUsersCmd cmd) - throws PermissionDeniedException; + UserAccount getUserByApiKey(String apiKey); diff --git a/api/src/com/cloud/vm/UserVmService.java b/api/src/com/cloud/vm/UserVmService.java index bf02c5c3bcc..b1ebe10596d 100755 --- a/api/src/com/cloud/vm/UserVmService.java +++ b/api/src/com/cloud/vm/UserVmService.java @@ -30,13 +30,12 @@ import org.apache.cloudstack.api.command.user.vmgroup.DeleteVMGroupCmd; import org.apache.cloudstack.api.command.user.vm.DeployVMCmd; import org.apache.cloudstack.api.command.user.vm.DestroyVMCmd; import org.apache.cloudstack.api.command.user.volume.DetachVolumeCmd; -import org.apache.cloudstack.api.command.user.vm.ListVMsCmd; import org.apache.cloudstack.api.command.user.vm.RebootVMCmd; import org.apache.cloudstack.api.command.admin.vm.RecoverVMCmd; import org.apache.cloudstack.api.command.user.vm.ResetVMPasswordCmd; import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd; import org.apache.cloudstack.api.command.user.vm.UpgradeVMCmd; -import org.apache.cloudstack.api.view.vo.UserVmJoinVO; + import com.cloud.dc.DataCenter; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; @@ -53,7 +52,6 @@ import com.cloud.storage.Volume; import com.cloud.template.VirtualMachineTemplate; import com.cloud.user.Account; import com.cloud.uservm.UserVm; -import com.cloud.utils.Pair; import com.cloud.utils.exception.ExecutionException; public interface UserVmService { @@ -371,15 +369,6 @@ public interface UserVmService { void deletePrivateTemplateRecord(Long templateId); - /** - * Obtains a list of virtual machines by the specified search criteria. Can search by: "userId", "name", "state", - * "dataCenterId", "podId", "hostId" - * - * @param cmd - * the API command that wraps the search criteria - * @return List of UserVMs. - */ - Pair, Integer> searchForUserVMs(ListVMsCmd cmd); HypervisorType getHypervisorTypeOfUserVM(long vmid); diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java b/api/src/org/apache/cloudstack/api/BaseCmd.java index 24e36dd7019..21e5a332a7a 100644 --- a/api/src/org/apache/cloudstack/api/BaseCmd.java +++ b/api/src/org/apache/cloudstack/api/BaseCmd.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import java.util.regex.Pattern; +import org.apache.cloudstack.query.QueryService; import org.apache.log4j.Logger; import com.cloud.configuration.ConfigurationService; @@ -141,6 +142,8 @@ public abstract class BaseCmd { public static NetworkACLService _networkACLService; public static Site2SiteVpnService _s2sVpnService; + public static QueryService _queryService; + public static void setComponents(ResponseGenerator generator) { ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name); _mgr = (ManagementService) ComponentLocator.getComponent(ManagementService.Name); @@ -172,6 +175,7 @@ public abstract class BaseCmd { _vpcService = locator.getManager(VpcService.class); _networkACLService = locator.getManager(NetworkACLService.class); _s2sVpnService = locator.getManager(Site2SiteVpnService.class); + _queryService = locator.getManager(QueryService.class); } public abstract void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException; diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java b/api/src/org/apache/cloudstack/api/ResponseGenerator.java index ccdf93ced1a..7f1ef48144d 100644 --- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java +++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java @@ -89,6 +89,8 @@ import org.apache.cloudstack.api.response.VpcOfferingResponse; import org.apache.cloudstack.api.response.VpcResponse; import org.apache.cloudstack.api.response.VpnUsersResponse; import org.apache.cloudstack.api.response.ZoneResponse; + + import com.cloud.async.AsyncJob; import com.cloud.capacity.Capacity; import com.cloud.configuration.Configuration; @@ -150,16 +152,6 @@ import com.cloud.user.User; import com.cloud.user.UserAccount; import com.cloud.uservm.UserVm; import com.cloud.vm.InstanceGroup; -import org.apache.cloudstack.api.view.vo.DomainRouterJoinVO; -import org.apache.cloudstack.api.view.vo.EventJoinVO; -import org.apache.cloudstack.api.view.vo.InstanceGroupJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectAccountJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectInvitationJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectJoinVO; -import org.apache.cloudstack.api.view.vo.ResourceTagJoinVO; -import org.apache.cloudstack.api.view.vo.SecurityGroupJoinVO; -import org.apache.cloudstack.api.view.vo.UserAccountJoinVO; -import org.apache.cloudstack.api.view.vo.UserVmJoinVO; import com.cloud.vm.VirtualMachine; public interface ResponseGenerator { @@ -183,10 +175,6 @@ public interface ResponseGenerator { SnapshotPolicyResponse createSnapshotPolicyResponse(SnapshotPolicy policy); - List createUserVmResponse(String objectName, UserVmJoinVO... userVms); - - List createUserVmResponse(String objectName, EnumSet details, UserVmJoinVO... userVms); - List createUserVmResponse(String objectName, UserVm... userVms); List createUserVmResponse(String objectName, EnumSet details, UserVm... userVms); @@ -195,8 +183,6 @@ public interface ResponseGenerator { DomainRouterResponse createDomainRouterResponse(VirtualRouter router); - List createDomainRouterResponse(DomainRouterJoinVO... router); - HostResponse createHostResponse(Host host, EnumSet details); HostResponse createHostResponse(Host host); @@ -219,8 +205,6 @@ public interface ResponseGenerator { InstanceGroupResponse createInstanceGroupResponse(InstanceGroup group); - List createInstanceGroupResponse(InstanceGroupJoinVO... groups); - StoragePoolResponse createStoragePoolResponse(StoragePool pool); ClusterResponse createClusterResponse(Cluster cluster, Boolean showCapacities); @@ -253,9 +237,6 @@ public interface ResponseGenerator { //ListResponse createSecurityGroupResponses(List networkGroups); - List createSecurityGroupResponses(List securityGroups); - - SecurityGroupResponse createSecurityGroupResponseFromSecurityGroupRule(List SecurityRules); SecurityGroupResponse createSecurityGroupResponse(SecurityGroup group); @@ -268,7 +249,7 @@ public interface ResponseGenerator { EventResponse createEventResponse(Event event); - List createEventResponse(EventJoinVO... events); + //List createEventResponse(EventJoinVO... events); TemplateResponse createIsoResponse(VirtualMachineTemplate result); @@ -284,7 +265,7 @@ public interface ResponseGenerator { UserResponse createUserResponse(User user); - List createUserResponse(UserAccountJoinVO... users); + //List createUserResponse(UserAccountJoinVO... users); AccountResponse createUserAccountResponse(UserAccount user); @@ -294,7 +275,6 @@ public interface ResponseGenerator { ProjectResponse createProjectResponse(Project project); - List createProjectResponse(ProjectJoinVO... projects); List createIsoResponses(VirtualMachineTemplate iso, long zoneId, boolean readyOnly); @@ -306,12 +286,8 @@ public interface ResponseGenerator { ProjectAccountResponse createProjectAccountResponse(ProjectAccount projectAccount); - List createProjectAccountResponse(ProjectAccountJoinVO... projectAccounts); - ProjectInvitationResponse createProjectInvitationResponse(ProjectInvitation invite); - List createProjectInvitationResponse(ProjectInvitationJoinVO... invites); - SystemVmInstanceResponse createSystemVmInstanceResponse(VirtualMachine systemVM); SwiftResponse createSwiftResponse(Swift swift); @@ -344,8 +320,6 @@ public interface ResponseGenerator { */ ResourceTagResponse createResourceTagResponse(ResourceTag resourceTag, boolean keyValueOnly); - List createResourceTagResponse(boolean keyValueOnly, ResourceTagJoinVO... resourceTag); - Site2SiteVpnGatewayResponse createSite2SiteVpnGatewayResponse(Site2SiteVpnGateway result); diff --git a/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java b/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java index ca4ad727da0..1995384593d 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java @@ -16,8 +16,6 @@ // under the License. package org.apache.cloudstack.api.command.admin.router; -import java.util.List; - import org.apache.log4j.Logger; import org.apache.cloudstack.api.ApiConstants; @@ -26,12 +24,11 @@ import org.apache.cloudstack.api.IdentityMapper; import org.apache.cloudstack.api.Implementation; import org.apache.cloudstack.api.Parameter; -import org.apache.cloudstack.api.view.vo.DomainRouterJoinVO; import org.apache.cloudstack.api.response.DomainRouterResponse; import org.apache.cloudstack.api.response.ListResponse; + import com.cloud.async.AsyncJob; -import com.cloud.utils.Pair; @Implementation(description="List routers.", responseObject=DomainRouterResponse.class) public class ListRoutersCmd extends BaseListProjectAndAccountResourcesCmd { @@ -125,17 +122,14 @@ public class ListRoutersCmd extends BaseListProjectAndAccountResourcesCmd { return s_name; } + @Override public AsyncJob.Type getInstanceType() { return AsyncJob.Type.DomainRouter; } @Override public void execute(){ - Pair, Integer> result = _mgr.searchForRouters(this); - ListResponse response = new ListResponse(); - - List routerResponses = _responseGenerator.createDomainRouterResponse(result.first().toArray(new DomainRouterJoinVO[result.first().size()])); - response.setResponses(routerResponses, result.second()); + ListResponse response = _queryService.searchForRouters(this); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/org/apache/cloudstack/api/command/admin/user/ListUsersCmd.java b/api/src/org/apache/cloudstack/api/command/admin/user/ListUsersCmd.java index cb480d266ad..7d918b2090d 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/user/ListUsersCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/user/ListUsersCmd.java @@ -16,9 +16,6 @@ // under the License. package org.apache.cloudstack.api.command.admin.user; -import java.util.ArrayList; -import java.util.List; - import org.apache.log4j.Logger; import org.apache.cloudstack.api.ApiConstants; @@ -28,10 +25,6 @@ import org.apache.cloudstack.api.Implementation; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.UserResponse; -import org.apache.cloudstack.api.view.vo.UserAccountJoinVO; - -import com.cloud.user.UserAccount; -import com.cloud.utils.Pair; @Implementation(description="Lists user accounts", responseObject=UserResponse.class) public class ListUsersCmd extends BaseListAccountResourcesCmd { @@ -88,10 +81,8 @@ public class ListUsersCmd extends BaseListAccountResourcesCmd { @Override public void execute(){ - Pair, Integer> result = _accountService.searchForUsers(this); - ListResponse response = new ListResponse(); - List userResponses = _responseGenerator.createUserResponse(result.first().toArray(new UserAccountJoinVO[result.first().size()])); - response.setResponses(userResponses, result.second()); + + ListResponse response = _queryService.searchForUsers(this); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/org/apache/cloudstack/api/command/user/account/ListProjectAccountsCmd.java b/api/src/org/apache/cloudstack/api/command/user/account/ListProjectAccountsCmd.java index 6db70e7db6a..1d56a60d175 100644 --- a/api/src/org/apache/cloudstack/api/command/user/account/ListProjectAccountsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/account/ListProjectAccountsCmd.java @@ -16,9 +16,6 @@ // under the License. package org.apache.cloudstack.api.command.user.account; -import java.util.ArrayList; -import java.util.List; - import org.apache.log4j.Logger; import org.apache.cloudstack.api.ApiConstants; @@ -29,11 +26,8 @@ import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.ProjectAccountResponse; import org.apache.cloudstack.api.response.ProjectResponse; -import org.apache.cloudstack.api.view.vo.ProjectAccountJoinVO; -import com.cloud.projects.ProjectAccount; import com.cloud.user.Account; -import com.cloud.utils.Pair; @Implementation(description="Lists project's accounts", responseObject=ProjectResponse.class, since="3.0.0") public class ListProjectAccountsCmd extends BaseListCmd { @@ -62,6 +56,17 @@ public class ListProjectAccountsCmd extends BaseListCmd { return accountName; } + + public Long getProjectId() { + return projectId; + } + + + public String getRole() { + return role; + } + + @Override public String getCommandName() { return s_name; @@ -81,11 +86,7 @@ public class ListProjectAccountsCmd extends BaseListCmd { @Override public void execute(){ - Pair, Integer> projectAccounts = _projectService.listProjectAccounts(projectId, - accountName, role, this.getStartIndex(), this.getPageSizeVal()); - ListResponse response = new ListResponse(); - List projectResponses = _responseGenerator.createProjectAccountResponse(projectAccounts.first().toArray(new ProjectAccountJoinVO[projectAccounts.first().size()])); - response.setResponses(projectResponses, projectAccounts.second()); + ListResponse response = _queryService.listProjectAccounts(this); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --git a/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java b/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java index 42b08d4be08..f44ccf19fc5 100644 --- a/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java @@ -17,8 +17,6 @@ package org.apache.cloudstack.api.command.user.event; import java.util.Date; -import java.util.List; - import org.apache.log4j.Logger; import org.apache.cloudstack.api.ApiConstants; @@ -28,8 +26,6 @@ import org.apache.cloudstack.api.Implementation; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.response.EventResponse; import org.apache.cloudstack.api.response.ListResponse; -import org.apache.cloudstack.api.view.vo.EventJoinVO; -import com.cloud.utils.Pair; @Implementation(description="A command to list events.", responseObject=EventResponse.class) public class ListEventsCmd extends BaseListProjectAndAccountResourcesCmd { @@ -106,10 +102,8 @@ public class ListEventsCmd extends BaseListProjectAndAccountResourcesCmd { @Override public void execute(){ - Pair, Integer> result = _mgr.searchForEvents(this); - ListResponse response = new ListResponse(); - List eventResponses = _responseGenerator.createEventResponse(result.first().toArray(new EventJoinVO[result.first().size()])); - response.setResponses(eventResponses, result.second()); + + ListResponse response = _queryService.searchForEvents(this); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/org/apache/cloudstack/api/command/user/project/ListProjectInvitationsCmd.java b/api/src/org/apache/cloudstack/api/command/user/project/ListProjectInvitationsCmd.java index 6b6a7a7c39d..b315ab06047 100644 --- a/api/src/org/apache/cloudstack/api/command/user/project/ListProjectInvitationsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/project/ListProjectInvitationsCmd.java @@ -16,9 +16,6 @@ // under the License. package org.apache.cloudstack.api.command.user.project; -import java.util.ArrayList; -import java.util.List; - import org.apache.log4j.Logger; import org.apache.cloudstack.api.ApiConstants; @@ -28,10 +25,6 @@ import org.apache.cloudstack.api.Implementation; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.ProjectInvitationResponse; -import org.apache.cloudstack.api.view.vo.ProjectInvitationJoinVO; - -import com.cloud.projects.ProjectInvitation; -import com.cloud.utils.Pair; @Implementation(description = "Lists projects and provides detailed information for listed projects", responseObject = ProjectInvitationResponse.class, since = "3.0.0") public class ListProjectInvitationsCmd extends BaseListAccountResourcesCmd { @@ -85,16 +78,8 @@ public class ListProjectInvitationsCmd extends BaseListAccountResourcesCmd { @Override public void execute() { - Pair, Integer> invites = _projectService.listProjectInvitations(id, projectId, - this.getAccountName(), this.getDomainId(), state, activeOnly, this.getStartIndex(), this.getPageSizeVal(), - this.isRecursive(), this.listAll()); - ListResponse response = new ListResponse(); - List projectInvitationResponses = - _responseGenerator.createProjectInvitationResponse(invites.first().toArray(new ProjectInvitationJoinVO[invites.first().size()])); - - response.setResponses(projectInvitationResponses, invites.second()); + ListResponse response = _queryService.listProjectInvitations(this); response.setResponseName(getCommandName()); - this.setResponseObject(response); } diff --git a/api/src/org/apache/cloudstack/api/command/user/project/ListProjectsCmd.java b/api/src/org/apache/cloudstack/api/command/user/project/ListProjectsCmd.java index cc1ccdda8e6..285844f56d3 100644 --- a/api/src/org/apache/cloudstack/api/command/user/project/ListProjectsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/project/ListProjectsCmd.java @@ -16,11 +16,9 @@ // under the License. package org.apache.cloudstack.api.command.user.project; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; -import java.util.List; import java.util.Map; import org.apache.log4j.Logger; @@ -32,11 +30,8 @@ import org.apache.cloudstack.api.Implementation; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.ProjectResponse; -import org.apache.cloudstack.api.view.vo.ProjectJoinVO; import com.cloud.exception.InvalidParameterValueException; -import com.cloud.projects.Project; -import com.cloud.utils.Pair; @Implementation(description="Lists projects and provides detailed information for listed projects", responseObject=ProjectResponse.class, since="3.0.0") public class ListProjectsCmd extends BaseListAccountResourcesCmd { @@ -79,6 +74,11 @@ public class ListProjectsCmd extends BaseListAccountResourcesCmd { return displayText; } + + public String getState() { + return state; + } + @Override public String getCommandName() { return s_name; @@ -109,14 +109,8 @@ public class ListProjectsCmd extends BaseListAccountResourcesCmd { @Override public void execute(){ - Pair, Integer> projects = _projectService.listProjects(id, name, displayText, state, - this.getAccountName(), this.getDomainId(), this.getKeyword(), this.getStartIndex(), this.getPageSizeVal(), - this.listAll(), this.isRecursive(), getTags()); - ListResponse response = new ListResponse(); - List projectResponses = _responseGenerator.createProjectResponse(projects.first().toArray(new ProjectJoinVO[projects.first().size()])); - response.setResponses(projectResponses, projects.second()); + ListResponse response = _queryService.listProjects(this); response.setResponseName(getCommandName()); - this.setResponseObject(response); } } diff --git a/api/src/org/apache/cloudstack/api/command/user/securitygroup/ListSecurityGroupsCmd.java b/api/src/org/apache/cloudstack/api/command/user/securitygroup/ListSecurityGroupsCmd.java index 0149a0a6f16..3a49b26d2a2 100644 --- a/api/src/org/apache/cloudstack/api/command/user/securitygroup/ListSecurityGroupsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/securitygroup/ListSecurityGroupsCmd.java @@ -16,8 +16,6 @@ // under the License. package org.apache.cloudstack.api.command.user.securitygroup; -import java.util.List; - import org.apache.log4j.Logger; import org.apache.cloudstack.api.ApiConstants; @@ -27,9 +25,8 @@ import org.apache.cloudstack.api.Implementation; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.SecurityGroupResponse; -import org.apache.cloudstack.api.view.vo.SecurityGroupJoinVO; + import com.cloud.async.AsyncJob; -import com.cloud.utils.Pair; @Implementation(description="Lists security groups", responseObject=SecurityGroupResponse.class) public class ListSecurityGroupsCmd extends BaseListTaggedResourcesCmd { @@ -78,11 +75,7 @@ public class ListSecurityGroupsCmd extends BaseListTaggedResourcesCmd { @Override public void execute(){ - Pair, Integer> result = _securityGroupService.searchForSecurityGroupRules(this); - ListResponse response = new ListResponse(); - List routerResponses = _responseGenerator.createSecurityGroupResponses(result.first()); - response.setResponses(routerResponses, result.second()); - + ListResponse response = _queryService.searchForSecurityGroups(this); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/org/apache/cloudstack/api/command/user/tag/ListTagsCmd.java b/api/src/org/apache/cloudstack/api/command/user/tag/ListTagsCmd.java index 94194dbf230..d5f732e1f4b 100644 --- a/api/src/org/apache/cloudstack/api/command/user/tag/ListTagsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/tag/ListTagsCmd.java @@ -17,16 +17,12 @@ package org.apache.cloudstack.api.command.user.tag; -import java.util.List; - import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd; import org.apache.cloudstack.api.Implementation; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.ResourceTagResponse; -import org.apache.cloudstack.api.view.vo.ResourceTagJoinVO; -import com.cloud.utils.Pair; @Implementation(description = "List resource tag(s)", responseObject = ResourceTagResponse.class, since = "Burbank") public class ListTagsCmd extends BaseListProjectAndAccountResourcesCmd{ @@ -55,10 +51,7 @@ public class ListTagsCmd extends BaseListProjectAndAccountResourcesCmd{ @Override public void execute() { - Pair, Integer> tags = _taggedResourceService.listTags(this); - ListResponse response = new ListResponse(); - List tagResponses = _responseGenerator.createResourceTagResponse(false, tags.first().toArray(new ResourceTagJoinVO[tags.first().size()])); - response.setResponses(tagResponses, tags.second()); + ListResponse response = _queryService.listTags(this); response.setResponseName(getCommandName()); this.setResponseObject(response); } 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 220b9eee951..bdf75991f18 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 @@ -39,10 +39,10 @@ import org.apache.cloudstack.api.response.TemplateResponse; import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.api.response.VpcResponse; import org.apache.cloudstack.api.response.ZoneResponse; + import com.cloud.async.AsyncJob; import com.cloud.exception.InvalidParameterValueException; import com.cloud.utils.Pair; -import org.apache.cloudstack.api.view.vo.UserVmJoinVO; @Implementation(description="List the virtual machines owned by the account.", responseObject=UserVmResponse.class) @@ -202,17 +202,14 @@ public class ListVMsCmd extends BaseListTaggedResourcesCmd { return s_name; } + @Override public AsyncJob.Type getInstanceType() { return AsyncJob.Type.VirtualMachine; } @Override public void execute(){ - Pair, Integer> result = _userVmService.searchForUserVMs(this); - ListResponse response = new ListResponse(); - EnumSet details = getDetails(); - List vmResponses = _responseGenerator.createUserVmResponse("virtualmachine", getDetails(), result.first().toArray(new UserVmJoinVO[result.first().size()])); - response.setResponses(vmResponses, result.second()); + ListResponse response = _queryService.searchForUserVMs(this); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/org/apache/cloudstack/api/command/user/vmgroup/ListVMGroupsCmd.java b/api/src/org/apache/cloudstack/api/command/user/vmgroup/ListVMGroupsCmd.java index 139e0962c46..1aa51f8170f 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vmgroup/ListVMGroupsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vmgroup/ListVMGroupsCmd.java @@ -16,9 +16,6 @@ // under the License. package org.apache.cloudstack.api.command.user.vmgroup; -import java.util.ArrayList; -import java.util.List; - import org.apache.log4j.Logger; import org.apache.cloudstack.api.ApiConstants; @@ -26,14 +23,8 @@ import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd; import org.apache.cloudstack.api.IdentityMapper; import org.apache.cloudstack.api.Implementation; import org.apache.cloudstack.api.Parameter; -import org.apache.cloudstack.api.response.EventResponse; import org.apache.cloudstack.api.response.InstanceGroupResponse; import org.apache.cloudstack.api.response.ListResponse; -import org.apache.cloudstack.api.view.vo.EventJoinVO; -import org.apache.cloudstack.api.view.vo.InstanceGroupJoinVO; - -import com.cloud.utils.Pair; -import com.cloud.vm.InstanceGroup; @Implementation(description="Lists vm groups", responseObject=InstanceGroupResponse.class) public class ListVMGroupsCmd extends BaseListProjectAndAccountResourcesCmd { @@ -75,10 +66,7 @@ public class ListVMGroupsCmd extends BaseListProjectAndAccountResourcesCmd { @Override public void execute(){ - Pair, Integer> groups = _mgr.searchForVmGroups(this); - ListResponse response = new ListResponse(); - List grpResponses = _responseGenerator.createInstanceGroupResponse(groups.first().toArray(new InstanceGroupJoinVO[groups.first().size()])); - response.setResponses(grpResponses, groups.second()); + ListResponse response = _queryService.searchForVmGroups(this); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/org/apache/cloudstack/query/QueryService.java b/api/src/org/apache/cloudstack/query/QueryService.java new file mode 100644 index 00000000000..f3d346f6253 --- /dev/null +++ b/api/src/org/apache/cloudstack/query/QueryService.java @@ -0,0 +1,71 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.query; + +import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd; +import org.apache.cloudstack.api.command.admin.user.ListUsersCmd; +import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd; +import org.apache.cloudstack.api.command.user.event.ListEventsCmd; +import org.apache.cloudstack.api.command.user.project.ListProjectInvitationsCmd; +import org.apache.cloudstack.api.command.user.project.ListProjectsCmd; +import org.apache.cloudstack.api.command.user.securitygroup.ListSecurityGroupsCmd; +import org.apache.cloudstack.api.command.user.tag.ListTagsCmd; +import org.apache.cloudstack.api.command.user.vm.ListVMsCmd; +import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd; +import org.apache.cloudstack.api.response.DomainRouterResponse; +import org.apache.cloudstack.api.response.EventResponse; +import org.apache.cloudstack.api.response.InstanceGroupResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ProjectAccountResponse; +import org.apache.cloudstack.api.response.ProjectInvitationResponse; +import org.apache.cloudstack.api.response.ProjectResponse; +import org.apache.cloudstack.api.response.ResourceTagResponse; +import org.apache.cloudstack.api.response.SecurityGroupResponse; +import org.apache.cloudstack.api.response.UserResponse; +import org.apache.cloudstack.api.response.UserVmResponse; + + +import com.cloud.exception.PermissionDeniedException; + +/** + * Service used for list api query. + * @author minc + * + */ +public interface QueryService { + + public ListResponse searchForUsers(ListUsersCmd cmd) throws PermissionDeniedException; + + public ListResponse searchForEvents(ListEventsCmd cmd); + + public ListResponse listTags(ListTagsCmd cmd); + + public ListResponse searchForVmGroups(ListVMGroupsCmd cmd); + + public ListResponse searchForUserVMs(ListVMsCmd cmd); + + public ListResponse searchForSecurityGroups(ListSecurityGroupsCmd cmd); + + public ListResponse searchForRouters(ListRoutersCmd cmd); + + public ListResponse listProjectInvitations(ListProjectInvitationsCmd cmd); + + public ListResponse listProjects(ListProjectsCmd cmd); + + public ListResponse listProjectAccounts(ListProjectAccountsCmd cmd); + +} diff --git a/api/test/src/com/cloud/api/commands/test/ListRoutersCmdTest.java b/api/test/src/com/cloud/api/commands/test/ListRoutersCmdTest.java deleted file mode 100644 index 21e75a0731b..00000000000 --- a/api/test/src/com/cloud/api/commands/test/ListRoutersCmdTest.java +++ /dev/null @@ -1,168 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -package src.com.cloud.api.commands.test; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import junit.framework.TestCase; - -import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.mockito.Mockito; - -import org.apache.cloudstack.api.ResponseGenerator; -import org.apache.cloudstack.api.ServerApiException; -import org.apache.cloudstack.api.response.DomainRouterResponse; -import org.apache.cloudstack.api.response.ListResponse; -import org.apache.cloudstack.api.view.vo.DomainRouterJoinVO; -import com.cloud.server.ManagementService; -import com.cloud.utils.Pair; - - -public class ListRoutersCmdTest extends TestCase { - - private ListRoutersCmd listVrCmd; - private ManagementService mgrService; - private ResponseGenerator responseGenerator; - - @Rule - public ExpectedException expectedException = ExpectedException.none(); - - @Before - public void setUp() { - listVrCmd = new ListRoutersCmd(); - mgrService = Mockito.mock(ManagementService.class); - responseGenerator = Mockito.mock(ResponseGenerator.class); - - listVrCmd._mgr = mgrService; - listVrCmd._responseGenerator = responseGenerator; - } - - @Test - public void testExecuteForSingleResult() throws Exception { - - List vrList = new ArrayList(); - DomainRouterJoinVO vr = new DomainRouterJoinVO(); - String uuid = UUID.randomUUID().toString(); - vr.setUuid(uuid); - vrList.add(vr); - - List respList = new ArrayList(); - DomainRouterResponse resp = new DomainRouterResponse(); - resp.setId(uuid); - respList.add(resp); - - Mockito.when(mgrService.searchForRouters(listVrCmd)) - .thenReturn(new Pair, Integer>(vrList, 1)); - Mockito.when(responseGenerator.createDomainRouterResponse(vr)).thenReturn(respList); - - - try { - listVrCmd.execute(); - ListResponse listResp = (ListResponse)listVrCmd.getResponseObject(); - assertNotNull(listResp); - assertEquals(1, listResp.getCount().intValue()); - List vrResp = listResp.getResponses(); - assertTrue(vrResp != null && vrResp.size() == 1); - DomainRouterResponse v = vrResp.get(0); - assertEquals(uuid, v.getId()); - } catch (ServerApiException exception) { - assertEquals("Failed to list domain routers", - exception.getDescription()); - } - } - - - @Test - public void testExecuteForPagedResult() throws Exception { - - - List vrList = new ArrayList(); - DomainRouterJoinVO vr1 = new DomainRouterJoinVO(); - String uuid1 = UUID.randomUUID().toString(); - vr1.setUuid(uuid1); - vrList.add(vr1); - DomainRouterJoinVO vr2 = new DomainRouterJoinVO(); - String uuid2 = UUID.randomUUID().toString(); - vrList.add(vr2); - - List respList = new ArrayList(); - DomainRouterResponse resp1 = new DomainRouterResponse(); - resp1.setId(uuid1); - respList.add(resp1); - DomainRouterResponse resp2 = new DomainRouterResponse(); - resp2.setId(uuid2); - respList.add(resp2); - - // without paging - Mockito.when(mgrService.searchForRouters(listVrCmd)) - .thenReturn(new Pair, Integer>(vrList, 2)); - Mockito.when(responseGenerator.createDomainRouterResponse(vr1, vr2)).thenReturn(respList); - try { - listVrCmd.execute(); - ListResponse listResp = (ListResponse)listVrCmd.getResponseObject(); - assertNotNull(listResp); - assertEquals(2, listResp.getCount().intValue()); - List vrResp = listResp.getResponses(); - assertTrue(vrResp != null && vrResp.size() == 2); - } catch (ServerApiException exception) { - assertEquals("Failed to list domain routers without pagination", - exception.getDescription()); - } - - // with pagination - List pVrList = new ArrayList(); - pVrList.add(vr1); - - List pRespList = new ArrayList(); - pRespList.add(resp1); - - listVrCmd = new ListRoutersCmd() { - public Integer getPage() { - return 1; - } - - public Integer getPageSize() { - return 1; - } - - }; - Mockito.when(mgrService.searchForRouters(listVrCmd)) - .thenReturn(new Pair, Integer>(pVrList, 2)); - Mockito.when(responseGenerator.createDomainRouterResponse(vr1)).thenReturn(pRespList); - - try { - listVrCmd.execute(); - ListResponse listResp = (ListResponse)listVrCmd.getResponseObject(); - assertNotNull(listResp); - assertEquals(2, listResp.getCount().intValue()); - List vmResp = listResp.getResponses(); - assertTrue(vmResp != null && vmResp.size() == 1); - DomainRouterResponse v = vmResp.get(0); - assertEquals(uuid1, v.getId()); - } catch (ServerApiException exception) { - assertEquals("Failed to list domain routers with pagination", - exception.getDescription()); - } - } -} - diff --git a/api/test/src/com/cloud/api/commands/test/ListVmsCmdTest.java b/api/test/src/com/cloud/api/commands/test/ListVmsCmdTest.java deleted file mode 100644 index 1adfb1540fa..00000000000 --- a/api/test/src/com/cloud/api/commands/test/ListVmsCmdTest.java +++ /dev/null @@ -1,168 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -package src.com.cloud.api.commands.test; - -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.List; -import java.util.UUID; - -import junit.framework.TestCase; - -import org.apache.cloudstack.api.command.user.vm.ListVMsCmd; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.mockito.Mockito; - -import org.apache.cloudstack.api.ApiConstants.VMDetails; -import org.apache.cloudstack.api.ResponseGenerator; -import org.apache.cloudstack.api.ServerApiException; -import org.apache.cloudstack.api.response.ListResponse; -import org.apache.cloudstack.api.response.UserVmResponse; -import org.apache.cloudstack.api.view.vo.UserVmJoinVO; -import com.cloud.utils.Pair; -import com.cloud.vm.UserVmService; - -public class ListVmsCmdTest extends TestCase { - - private ListVMsCmd listVmCmd; - private UserVmService userVmService; - private ResponseGenerator responseGenerator; - - @Rule - public ExpectedException expectedException = ExpectedException.none(); - - @Before - public void setUp() { - listVmCmd = new ListVMsCmd(); - userVmService = Mockito.mock(UserVmService.class); - responseGenerator = Mockito.mock(ResponseGenerator.class); - - listVmCmd._userVmService = userVmService; - listVmCmd._responseGenerator = responseGenerator; - } - - @Test - public void testExecuteForSingleResult() throws Exception { - - List vmList = new ArrayList(); - UserVmJoinVO vm = new UserVmJoinVO(); - String uuid = UUID.randomUUID().toString(); - vm.setUuid(uuid); - vmList.add(vm); - - List respList = new ArrayList(); - UserVmResponse resp = new UserVmResponse(); - resp.setId(uuid); - respList.add(resp); - - Mockito.when(userVmService.searchForUserVMs(listVmCmd)) - .thenReturn(new Pair, Integer>(vmList, 1)); - Mockito.when(responseGenerator.createUserVmResponse("virtualmachine", EnumSet.of(VMDetails.all), vm)).thenReturn(respList); - - - try { - listVmCmd.execute(); - ListResponse listResp = (ListResponse)listVmCmd.getResponseObject(); - assertNotNull(listResp); - assertEquals(1, listResp.getCount().intValue()); - List vmResp = listResp.getResponses(); - assertTrue(vmResp != null && vmResp.size() == 1); - UserVmResponse v = vmResp.get(0); - assertEquals(uuid, v.getId()); - } catch (ServerApiException exception) { - assertEquals("Failed to list user vms", - exception.getDescription()); - } - } - - - @Test - public void testExecuteForPagedResult() throws Exception { - - - List vmList = new ArrayList(); - UserVmJoinVO vm1 = new UserVmJoinVO(); - String uuid1 = UUID.randomUUID().toString(); - vm1.setUuid(uuid1); - vmList.add(vm1); - UserVmJoinVO vm2 = new UserVmJoinVO(); - String uuid2 = UUID.randomUUID().toString(); - vmList.add(vm2); - - List respList = new ArrayList(); - UserVmResponse resp1 = new UserVmResponse(); - resp1.setId(uuid1); - respList.add(resp1); - UserVmResponse resp2 = new UserVmResponse(); - resp2.setId(uuid2); - respList.add(resp2); - - // without paging - Mockito.when(userVmService.searchForUserVMs(listVmCmd)) - .thenReturn(new Pair, Integer>(vmList, 2)); - Mockito.when(responseGenerator.createUserVmResponse("virtualmachine", EnumSet.of(VMDetails.all), vm1, vm2)).thenReturn(respList); - try { - listVmCmd.execute(); - ListResponse listResp = (ListResponse)listVmCmd.getResponseObject(); - assertNotNull(listResp); - assertEquals(2, listResp.getCount().intValue()); - List vmResp = listResp.getResponses(); - assertTrue(vmResp != null && vmResp.size() == 2); - } catch (ServerApiException exception) { - assertEquals("Failed to list user vms without pagination", - exception.getDescription()); - } - - // with pagination - List pVmList = new ArrayList(); - pVmList.add(vm1); - - List pRespList = new ArrayList(); - pRespList.add(resp1); - - listVmCmd = new ListVMsCmd() { - public Integer getPage() { - return 1; - } - - public Integer getPageSize() { - return 1; - } - - }; - Mockito.when(userVmService.searchForUserVMs(listVmCmd)) - .thenReturn(new Pair, Integer>(pVmList, 2)); - Mockito.when(responseGenerator.createUserVmResponse("virtualmachine", EnumSet.of(VMDetails.all), vm1)).thenReturn(pRespList); - - try { - listVmCmd.execute(); - ListResponse listResp = (ListResponse)listVmCmd.getResponseObject(); - assertNotNull(listResp); - assertEquals(2, listResp.getCount().intValue()); - List vmResp = listResp.getResponses(); - assertTrue(vmResp != null && vmResp.size() == 1); - UserVmResponse v = vmResp.get(0); - assertEquals(uuid1, v.getId()); - } catch (ServerApiException exception) { - assertEquals("Failed to list user vms with pagination", - exception.getDescription()); - } - } -} diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index d5cce52e5f9..4e41d682773 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -33,16 +33,25 @@ import org.apache.cloudstack.api.response.ResourceTagResponse; import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.UserResponse; import org.apache.cloudstack.api.response.UserVmResponse; -import org.apache.cloudstack.api.view.vo.DomainRouterJoinVO; -import org.apache.cloudstack.api.view.vo.EventJoinVO; -import org.apache.cloudstack.api.view.vo.InstanceGroupJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectAccountJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectInvitationJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectJoinVO; -import org.apache.cloudstack.api.view.vo.ResourceTagJoinVO; -import org.apache.cloudstack.api.view.vo.SecurityGroupJoinVO; -import org.apache.cloudstack.api.view.vo.UserAccountJoinVO; -import org.apache.cloudstack.api.view.vo.UserVmJoinVO; + +import com.cloud.api.query.dao.DomainRouterJoinDao; +import com.cloud.api.query.dao.InstanceGroupJoinDao; +import com.cloud.api.query.dao.ProjectAccountJoinDao; +import com.cloud.api.query.dao.ProjectInvitationJoinDao; +import com.cloud.api.query.dao.ProjectJoinDao; +import com.cloud.api.query.dao.ResourceTagJoinDao; +import com.cloud.api.query.dao.SecurityGroupJoinDao; +import com.cloud.api.query.dao.UserVmJoinDao; +import com.cloud.api.query.vo.DomainRouterJoinVO; +import com.cloud.api.query.vo.EventJoinVO; +import com.cloud.api.query.vo.InstanceGroupJoinVO; +import com.cloud.api.query.vo.ProjectAccountJoinVO; +import com.cloud.api.query.vo.ProjectInvitationJoinVO; +import com.cloud.api.query.vo.ProjectJoinVO; +import com.cloud.api.query.vo.ResourceTagJoinVO; +import com.cloud.api.query.vo.SecurityGroupJoinVO; +import com.cloud.api.query.vo.UserAccountJoinVO; +import com.cloud.api.query.vo.UserVmJoinVO; import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobVO; import com.cloud.capacity.CapacityVO; @@ -112,7 +121,6 @@ import com.cloud.network.security.SecurityGroup; import com.cloud.network.security.SecurityGroupManager; import com.cloud.network.security.SecurityGroupVO; import com.cloud.network.security.dao.SecurityGroupDao; -import com.cloud.network.security.dao.SecurityGroupJoinDao; import com.cloud.network.vpc.VpcManager; import com.cloud.offering.NetworkOffering; import com.cloud.offering.ServiceOffering; @@ -122,9 +130,6 @@ import com.cloud.projects.Project; import com.cloud.projects.ProjectAccount; import com.cloud.projects.ProjectInvitation; import com.cloud.projects.ProjectService; -import com.cloud.projects.dao.ProjectAccountJoinDao; -import com.cloud.projects.dao.ProjectInvitationJoinDao; -import com.cloud.projects.dao.ProjectJoinDao; import com.cloud.resource.ResourceManager; import com.cloud.server.Criteria; import com.cloud.server.ManagementServer; @@ -162,7 +167,6 @@ import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.storage.dao.VMTemplateSwiftDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.dao.VolumeHostDao; -import com.cloud.tags.dao.ResourceTagJoinDao; import com.cloud.user.Account; import com.cloud.user.AccountDetailsDao; import com.cloud.user.AccountVO; @@ -194,11 +198,8 @@ import com.cloud.vm.VirtualMachine; import com.cloud.vm.VmStats; import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.DomainRouterDao; -import com.cloud.vm.dao.DomainRouterJoinDao; -import com.cloud.vm.dao.InstanceGroupJoinDao; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.UserVmDetailsDao; -import com.cloud.vm.dao.UserVmJoinDao; import com.cloud.vm.dao.VMInstanceDao; public class ApiDBUtils { diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 1e2b87d0941..903799d3f0f 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -22,7 +22,6 @@ import java.util.Date; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; -import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -41,6 +40,19 @@ import org.apache.cloudstack.api.ApiConstants.HostDetails; import org.apache.cloudstack.api.ApiConstants.VMDetails; import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd; import org.apache.cloudstack.api.response.AccountResponse; + +import com.cloud.api.query.ViewResponseHelper; +import com.cloud.api.query.vo.ControlledViewEntity; +import com.cloud.api.query.vo.DomainRouterJoinVO; +import com.cloud.api.query.vo.EventJoinVO; +import com.cloud.api.query.vo.InstanceGroupJoinVO; +import com.cloud.api.query.vo.ProjectAccountJoinVO; +import com.cloud.api.query.vo.ProjectInvitationJoinVO; +import com.cloud.api.query.vo.ProjectJoinVO; +import com.cloud.api.query.vo.ResourceTagJoinVO; +import com.cloud.api.query.vo.SecurityGroupJoinVO; +import com.cloud.api.query.vo.UserAccountJoinVO; +import com.cloud.api.query.vo.UserVmJoinVO; import com.cloud.api.response.ApiResponseSerializer; import org.apache.cloudstack.api.response.AsyncJobResponse; import org.apache.cloudstack.api.response.AutoScalePolicyResponse; @@ -112,17 +124,6 @@ import org.apache.cloudstack.api.response.VpcOfferingResponse; import org.apache.cloudstack.api.response.VpcResponse; import org.apache.cloudstack.api.response.VpnUsersResponse; import org.apache.cloudstack.api.response.ZoneResponse; -import org.apache.cloudstack.api.view.vo.DomainRouterJoinVO; -import org.apache.cloudstack.api.view.vo.ControlledViewEntity; -import org.apache.cloudstack.api.view.vo.EventJoinVO; -import org.apache.cloudstack.api.view.vo.InstanceGroupJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectAccountJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectInvitationJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectJoinVO; -import org.apache.cloudstack.api.view.vo.ResourceTagJoinVO; -import org.apache.cloudstack.api.view.vo.SecurityGroupJoinVO; -import org.apache.cloudstack.api.view.vo.UserAccountJoinVO; -import org.apache.cloudstack.api.view.vo.UserVmJoinVO; import com.cloud.async.AsyncJob; import com.cloud.capacity.Capacity; import com.cloud.capacity.CapacityVO; @@ -247,15 +248,6 @@ public class ApiResponseHelper implements ResponseGenerator { } - @Override - public List createUserResponse(UserAccountJoinVO... users) { - List respList = new ArrayList(); - for (UserAccountJoinVO vt : users){ - respList.add(ApiDBUtils.newUserResponse(vt)); - } - return respList; - } - // this method is used for response generation via createAccount (which creates an account + user) @Override @@ -1177,15 +1169,6 @@ public class ApiResponseHelper implements ResponseGenerator { - @Override - public List createInstanceGroupResponse(InstanceGroupJoinVO... groups) { - List respList = new ArrayList(); - for (InstanceGroupJoinVO vt : groups){ - respList.add(ApiDBUtils.newInstanceGroupResponse(vt)); - } - return respList; - } - @Override public StoragePoolResponse createStoragePoolResponse(StoragePool pool) { StoragePoolResponse poolResponse = new StoragePoolResponse(); @@ -1369,72 +1352,26 @@ public class ApiResponseHelper implements ResponseGenerator { @Override public List createUserVmResponse(String objectName, EnumSet details, UserVm... userVms) { List viewVms = ApiDBUtils.newUserVmView(userVms); - return createUserVmResponse(objectName, details, viewVms.toArray(new UserVmJoinVO[viewVms.size()])); + return ViewResponseHelper.createUserVmResponse(objectName, details, viewVms.toArray(new UserVmJoinVO[viewVms.size()])); } @Override public List createUserVmResponse(String objectName, UserVm... userVms) { List viewVms = ApiDBUtils.newUserVmView(userVms); - return createUserVmResponse(objectName, viewVms.toArray(new UserVmJoinVO[viewVms.size()])); + return ViewResponseHelper.createUserVmResponse(objectName, viewVms.toArray(new UserVmJoinVO[viewVms.size()])); } - @Override - public List createUserVmResponse(String objectName, UserVmJoinVO... userVms) { - return createUserVmResponse(objectName, EnumSet.of(VMDetails.all), userVms); - } - @Override - public List createUserVmResponse(String objectName, EnumSet details, UserVmJoinVO... userVms) { - Account caller = UserContext.current().getCaller(); - - s_logger.debug(">>>Converting UserVm VO to UserVmResponse"); - Hashtable vmDataList = new Hashtable(); - // Initialise the vmdatalist with the input data - - - for (UserVmJoinVO userVm : userVms) { - UserVmResponse userVmData = vmDataList.get(userVm.getId()); - if ( userVmData == null ){ - // first time encountering this vm - userVmData = ApiDBUtils.newUserVmResponse(objectName, userVm, details, caller); - } else{ - // update nics, securitygroups, tags for 1 to many mapping fields - userVmData = ApiDBUtils.fillVmDetails(userVmData, userVm); - } - vmDataList.put(userVm.getId(), userVmData); - } - s_logger.debug(">>>Done with creating vm response"); - return new ArrayList(vmDataList.values()); - } @Override public DomainRouterResponse createDomainRouterResponse(VirtualRouter router) { List viewVrs = ApiDBUtils.newDomainRouterView(router); - List listVrs = createDomainRouterResponse(viewVrs.toArray(new DomainRouterJoinVO[viewVrs.size()])); + List listVrs = ViewResponseHelper.createDomainRouterResponse(viewVrs.toArray(new DomainRouterJoinVO[viewVrs.size()])); assert listVrs != null && listVrs.size() == 1 : "There should be one virtual router returned"; return listVrs.get(0); } - @Override - public List createDomainRouterResponse(DomainRouterJoinVO... routers) { - Account caller = UserContext.current().getCaller(); - Hashtable vrDataList = new Hashtable(); - // Initialise the vrdatalist with the input data - for (DomainRouterJoinVO vr : routers) { - DomainRouterResponse vrData = vrDataList.get(vr.getId()); - if ( vrData == null ){ - // first time encountering this vm - vrData = ApiDBUtils.newDomainRouterResponse(vr, caller); - } - else{ - // update nics for 1 to many mapping fields - vrData = ApiDBUtils.fillRouterDetails(vrData, vr); - } - vrDataList.put(vr.getId(), vrData); - } - return new ArrayList(vrDataList.values()); - } @Override public SystemVmResponse createSystemVmResponse(VirtualMachine vm) { @@ -2006,30 +1943,12 @@ public class ApiResponseHelper implements ResponseGenerator { return isoResponses; } - @Override - public List createSecurityGroupResponses(List securityGroups) { - Account caller = UserContext.current().getCaller(); - Hashtable vrDataList = new Hashtable(); - // Initialise the vrdatalist with the input data - for (SecurityGroupJoinVO vr : securityGroups) { - SecurityGroupResponse vrData = vrDataList.get(vr.getId()); - if ( vrData == null ) { - // first time encountering this sg - vrData = ApiDBUtils.newSecurityGroupResponse(vr, caller); - } else { - // update rules for 1 to many mapping fields - vrData = ApiDBUtils.fillSecurityGroupDetails(vrData, vr); - } - vrDataList.put(vr.getId(), vrData); - } - return new ArrayList(vrDataList.values()); - } @Override public SecurityGroupResponse createSecurityGroupResponse(SecurityGroup group) { List viewSgs = ApiDBUtils.newSecurityGroupView(group); - List listSgs = createSecurityGroupResponses(viewSgs); + List listSgs = ViewResponseHelper.createSecurityGroupResponses(viewSgs); assert listSgs != null && listSgs.size() == 1 : "There should be one security group returned"; return listSgs.get(0); } @@ -2117,14 +2036,6 @@ public class ApiResponseHelper implements ResponseGenerator { } - @Override - public List createEventResponse(EventJoinVO... events) { - List respList = new ArrayList(); - for (EventJoinVO vt : events){ - respList.add(ApiDBUtils.newEventResponse(vt)); - } - return respList; - } @Override public EventResponse createEventResponse(Event event) { @@ -2675,30 +2586,12 @@ public class ApiResponseHelper implements ResponseGenerator { @Override public ProjectResponse createProjectResponse(Project project) { List viewPrjs = ApiDBUtils.newProjectView(project); - List listPrjs = createProjectResponse(viewPrjs.toArray(new ProjectJoinVO[viewPrjs.size()])); + List listPrjs = ViewResponseHelper.createProjectResponse(viewPrjs.toArray(new ProjectJoinVO[viewPrjs.size()])); assert listPrjs != null && listPrjs.size() == 1 : "There should be one project returned"; return listPrjs.get(0); } - @Override - public List createProjectResponse(ProjectJoinVO... projects) { - Hashtable prjDataList = new Hashtable(); - // Initialise the prjdatalist with the input data - for (ProjectJoinVO p : projects) { - ProjectResponse pData = prjDataList.get(p.getId()); - if ( pData == null ){ - // first time encountering this vm - pData = ApiDBUtils.newProjectResponse(p); - } - else{ - // update those 1 to many mapping fields - pData = ApiDBUtils.fillProjectDetails(pData, p); - } - prjDataList.put(p.getId(), pData); - } - return new ArrayList(prjDataList.values()); - } @Override @@ -2853,24 +2746,13 @@ public class ApiResponseHelper implements ResponseGenerator { @Override public ProjectAccountResponse createProjectAccountResponse(ProjectAccount projectAccount) { ProjectAccountJoinVO vProj = ApiDBUtils.newProjectAccountView(projectAccount); - List listProjs = createProjectAccountResponse(vProj); + List listProjs = ViewResponseHelper.createProjectAccountResponse(vProj); assert listProjs != null && listProjs.size() == 1 : "There should be one project account returned"; return listProjs.get(0); } - @Override - public List createProjectAccountResponse(ProjectAccountJoinVO... projectAccounts) { - List responseList = new ArrayList(); - for (ProjectAccountJoinVO proj : projectAccounts){ - ProjectAccountResponse resp = ApiDBUtils.newProjectAccountResponse(proj); - // update user list - List users = ApiDBUtils.findUserViewByAccountId(proj.getAccountId()); - resp.setUsers(createUserResponse(users.toArray(new UserAccountJoinVO[users.size()]))); - responseList.add(resp); - } - return responseList; - } + @Override public ProjectInvitationResponse createProjectInvitationResponse(ProjectInvitation invite) { @@ -2879,17 +2761,6 @@ public class ApiResponseHelper implements ResponseGenerator { } - - @Override - public List createProjectInvitationResponse(ProjectInvitationJoinVO... invites) { - List respList = new ArrayList(); - for (ProjectInvitationJoinVO v : invites){ - respList.add(ApiDBUtils.newProjectInvitationResponse(v)); - } - return respList; - } - - @Override public SystemVmInstanceResponse createSystemVmInstanceResponse(VirtualMachine vm) { SystemVmInstanceResponse vmResponse = new SystemVmInstanceResponse(); @@ -3126,14 +2997,6 @@ public class ApiResponseHelper implements ResponseGenerator { } - @Override - public List createResourceTagResponse(boolean keyValueOnly, ResourceTagJoinVO... tags) { - List respList = new ArrayList(); - for (ResourceTagJoinVO vt : tags){ - respList.add(ApiDBUtils.newResourceTagResponse(vt, keyValueOnly)); - } - return respList; - } @Override public VpcOfferingResponse createVpcOfferingResponse(VpcOffering offering) { diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java new file mode 100644 index 00000000000..78687b18d16 --- /dev/null +++ b/server/src/com/cloud/api/query/QueryManagerImpl.java @@ -0,0 +1,1309 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.api.query; + +import java.util.ArrayList; +import java.util.Date; +import java.util.EnumSet; +import java.util.List; +import java.util.Map; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +import org.apache.cloudstack.api.ResponseGenerator; +import org.apache.cloudstack.api.ApiConstants.VMDetails; +import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd; +import org.apache.cloudstack.api.command.admin.user.ListUsersCmd; +import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd; +import org.apache.cloudstack.api.command.user.event.ListEventsCmd; +import org.apache.cloudstack.api.command.user.project.ListProjectInvitationsCmd; +import org.apache.cloudstack.api.command.user.project.ListProjectsCmd; +import org.apache.cloudstack.api.command.user.securitygroup.ListSecurityGroupsCmd; +import org.apache.cloudstack.api.command.user.tag.ListTagsCmd; +import org.apache.cloudstack.api.command.user.vm.ListVMsCmd; +import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd; +import org.apache.cloudstack.api.response.DomainRouterResponse; +import org.apache.cloudstack.api.response.EventResponse; +import org.apache.cloudstack.api.response.InstanceGroupResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ProjectAccountResponse; +import org.apache.cloudstack.api.response.ProjectInvitationResponse; +import org.apache.cloudstack.api.response.ProjectResponse; +import org.apache.cloudstack.api.response.ResourceTagResponse; +import org.apache.cloudstack.api.response.SecurityGroupResponse; +import org.apache.cloudstack.api.response.UserResponse; +import org.apache.cloudstack.api.response.UserVmResponse; +import org.apache.cloudstack.query.QueryService; +import org.apache.log4j.Logger; + +import com.cloud.api.ApiResponseHelper; +import com.cloud.api.query.dao.DomainRouterJoinDao; +import com.cloud.api.query.dao.InstanceGroupJoinDao; +import com.cloud.api.query.dao.ProjectAccountJoinDao; +import com.cloud.api.query.dao.ProjectInvitationJoinDao; +import com.cloud.api.query.dao.ProjectJoinDao; +import com.cloud.api.query.dao.ResourceTagJoinDao; +import com.cloud.api.query.dao.SecurityGroupJoinDao; +import com.cloud.api.query.dao.UserVmJoinDao; +import com.cloud.api.query.vo.DomainRouterJoinVO; +import com.cloud.api.query.vo.EventJoinVO; +import com.cloud.api.query.vo.InstanceGroupJoinVO; +import com.cloud.api.query.vo.ProjectAccountJoinVO; +import com.cloud.api.query.vo.ProjectInvitationJoinVO; +import com.cloud.api.query.vo.ProjectJoinVO; +import com.cloud.api.query.vo.ResourceTagJoinVO; +import com.cloud.api.query.vo.SecurityGroupJoinVO; +import com.cloud.api.query.vo.UserAccountJoinVO; +import com.cloud.api.query.vo.UserVmJoinVO; +import com.cloud.domain.Domain; +import com.cloud.domain.DomainVO; +import com.cloud.domain.dao.DomainDao; +import com.cloud.event.dao.EventJoinDao; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.PermissionDeniedException; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.network.security.SecurityGroupVMMapVO; +import com.cloud.network.security.dao.SecurityGroupVMMapDao; +import com.cloud.projects.ProjectInvitation; +import com.cloud.projects.Project.ListProjectResourcesCriteria; +import com.cloud.projects.Project; +import com.cloud.projects.ProjectManager; +import com.cloud.projects.ProjectService; +import com.cloud.projects.dao.ProjectAccountDao; +import com.cloud.projects.dao.ProjectDao; +import com.cloud.server.Criteria; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.user.AccountManagerImpl; +import com.cloud.user.AccountService; +import com.cloud.user.AccountVO; +import com.cloud.user.DomainManager; +import com.cloud.user.UserContext; +import com.cloud.user.dao.UserAccountJoinDao; +import com.cloud.utils.DateUtil; +import com.cloud.utils.Pair; +import com.cloud.utils.Ternary; +import com.cloud.utils.component.Inject; +import com.cloud.utils.component.Manager; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Func; +import com.cloud.utils.db.SearchCriteria.Op; +import com.cloud.vm.UserVmVO; +import com.cloud.vm.dao.UserVmDao; + +/** + * @author minc + * + */ +@Local(value = {QueryService.class }) +public class QueryManagerImpl implements QueryService, Manager { + + public static final Logger s_logger = Logger.getLogger(QueryManagerImpl.class); + + private String _name; + + // public static ViewResponseHelper _responseGenerator; + + @Inject + private AccountManager _accountMgr; + + @Inject + private ProjectManager _projectMgr; + + @Inject + private DomainDao _domainDao; + + @Inject + private UserAccountJoinDao _userAccountJoinDao; + + @Inject + private EventJoinDao _eventJoinDao; + + @Inject + private ResourceTagJoinDao _resourceTagJoinDao; + + @Inject + private InstanceGroupJoinDao _vmGroupJoinDao; + + @Inject + private UserVmJoinDao _userVmJoinDao; + + @Inject + private UserVmDao _userVmDao; + + @Inject + private SecurityGroupJoinDao _securityGroupJoinDao; + + @Inject + private SecurityGroupVMMapDao _securityGroupVMMapDao; + + @Inject + private DomainRouterJoinDao _routerJoinDao; + + @Inject + private ProjectInvitationJoinDao _projectInvitationJoinDao; + + @Inject + private ProjectJoinDao _projectJoinDao; + + @Inject + private ProjectDao _projectDao; + + @Inject + private ProjectAccountDao _projectAccountDao; + + @Inject + private ProjectAccountJoinDao _projectAccountJoinDao; + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + _name = name; + // _responseGenerator = new ViewResponseHelper(); + return false; + } + + @Override + public boolean start() { + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public String getName() { + return _name; + } + + /* (non-Javadoc) + * @see com.cloud.api.query.QueryService#searchForUsers(org.apache.cloudstack.api.command.admin.user.ListUsersCmd) + */ + @Override + public ListResponse searchForUsers(ListUsersCmd cmd) throws PermissionDeniedException { + Pair, Integer> result = searchForUsersInternal(cmd); + ListResponse response = new ListResponse(); + List userResponses = ViewResponseHelper.createUserResponse(result.first().toArray(new UserAccountJoinVO[result.first().size()])); + response.setResponses(userResponses, result.second()); + return response; + } + + private Pair, Integer> searchForUsersInternal(ListUsersCmd cmd) throws PermissionDeniedException { + Account caller = UserContext.current().getCaller(); + + //TODO: Integrate with ACL checkAccess refactoring + Long domainId = cmd.getDomainId(); + if (domainId != null) { + Domain domain = _domainDao.findById(domainId); + if (domain == null) { + throw new InvalidParameterValueException("Unable to find domain by id=" + domainId); + } + + _accountMgr.checkAccess(caller, domain); + } else { + // default domainId to the caller's domain + domainId = caller.getDomainId(); + } + + Filter searchFilter = new Filter(UserAccountJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); + + Long id = cmd.getId(); + Object username = cmd.getUsername(); + Object type = cmd.getAccountType(); + Object accountName = cmd.getAccountName(); + Object state = cmd.getState(); + Object keyword = cmd.getKeyword(); + + SearchBuilder sb = _userAccountJoinDao.createSearchBuilder(); + sb.and("username", sb.entity().getUsername(), SearchCriteria.Op.LIKE); + if (id != null && id == 1) { + // system user should NOT be searchable + List emptyList = new ArrayList(); + return new Pair, Integer>(emptyList, 0); + } else if (id != null) { + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + } else { + // this condition is used to exclude system user from the search results + sb.and("id", sb.entity().getId(), SearchCriteria.Op.NEQ); + } + + sb.and("type", sb.entity().getAccountType(), SearchCriteria.Op.EQ); + sb.and("domainId", sb.entity().getDomainId(), SearchCriteria.Op.EQ); + sb.and("accountName", sb.entity().getAccountName(), SearchCriteria.Op.EQ); + sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); + + if ((accountName == null) && (domainId != null)) { + sb.and("domainPath", sb.entity().getDomainPath(), SearchCriteria.Op.LIKE); + } + + SearchCriteria sc = sb.create(); + if (keyword != null) { + SearchCriteria ssc = _userAccountJoinDao.createSearchCriteria(); + ssc.addOr("username", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("firstname", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("lastname", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("email", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("state", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("accountName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("type", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("accountState", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + + sc.addAnd("username", SearchCriteria.Op.SC, ssc); + } + + if (username != null) { + sc.setParameters("username", username); + } + + if (id != null) { + sc.setParameters("id", id); + } else { + // Don't return system user, search builder with NEQ + sc.setParameters("id", 1); + } + + if (type != null) { + sc.setParameters("type", type); + } + + if (accountName != null) { + sc.setParameters("accountName", accountName); + if (domainId != null) { + sc.setParameters("domainId", domainId); + } + } else if (domainId != null) { + DomainVO domainVO = _domainDao.findById(domainId); + sc.setParameters("domainPath", domainVO.getPath() + "%"); + } + + if (state != null) { + sc.setParameters("state", state); + } + + return _userAccountJoinDao.searchAndCount(sc, searchFilter); + } + + @Override + public ListResponse searchForEvents(ListEventsCmd cmd) { + Pair, Integer> result = searchForEventsInternal(cmd); + ListResponse response = new ListResponse(); + List eventResponses = ViewResponseHelper.createEventResponse(result.first().toArray(new EventJoinVO[result.first().size()])); + response.setResponses(eventResponses, result.second()); + return response; + } + + private Pair, Integer> searchForEventsInternal(ListEventsCmd cmd) { + Account caller = UserContext.current().getCaller(); + List permittedAccounts = new ArrayList(); + + Long id = cmd.getId(); + String type = cmd.getType(); + String level = cmd.getLevel(); + Date startDate = cmd.getStartDate(); + Date endDate = cmd.getEndDate(); + String keyword = cmd.getKeyword(); + Integer entryTime = cmd.getEntryTime(); + Integer duration = cmd.getDuration(); + + Ternary domainIdRecursiveListProject = new Ternary( + cmd.getDomainId(), cmd.isRecursive(), null); + _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, + cmd.listAll(), false); + Long domainId = domainIdRecursiveListProject.first(); + Boolean isRecursive = domainIdRecursiveListProject.second(); + ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); + + Filter searchFilter = new Filter(EventJoinVO.class, "createDate", false, cmd.getStartIndex(), cmd.getPageSizeVal()); + SearchBuilder sb = _eventJoinDao.createSearchBuilder(); + _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("levelL", sb.entity().getLevel(), SearchCriteria.Op.LIKE); + sb.and("levelEQ", sb.entity().getLevel(), SearchCriteria.Op.EQ); + sb.and("type", sb.entity().getType(), SearchCriteria.Op.EQ); + sb.and("createDateB", sb.entity().getCreateDate(), SearchCriteria.Op.BETWEEN); + sb.and("createDateG", sb.entity().getCreateDate(), SearchCriteria.Op.GTEQ); + sb.and("createDateL", sb.entity().getCreateDate(), SearchCriteria.Op.LTEQ); + sb.and("state", sb.entity().getState(), SearchCriteria.Op.NEQ); + sb.and("startId", sb.entity().getStartId(), SearchCriteria.Op.EQ); + sb.and("createDate", sb.entity().getCreateDate(), SearchCriteria.Op.BETWEEN); + + SearchCriteria sc = sb.create(); + // building ACL condition + _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + if (id != null) { + sc.setParameters("id", id); + } + + if (keyword != null) { + SearchCriteria ssc = _eventJoinDao.createSearchCriteria(); + ssc.addOr("type", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("level", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + sc.addAnd("level", SearchCriteria.Op.SC, ssc); + } + + if (level != null) { + sc.setParameters("levelEQ", level); + } + + if (type != null) { + sc.setParameters("type", type); + } + + if (startDate != null && endDate != null) { + sc.setParameters("createDateB", startDate, endDate); + } else if (startDate != null) { + sc.setParameters("createDateG", startDate); + } else if (endDate != null) { + sc.setParameters("createDateL", endDate); + } + + Pair, Integer> eventPair = null; + // event_view will not have duplicate rows for each event, so searchAndCount should be good enough. + if ((entryTime != null) && (duration != null)) { + // TODO: waiting for response from dev list, logic is mystery to + // me!! + /* + * if (entryTime <= duration) { throw new + * InvalidParameterValueException + * ("Entry time must be greater than duration"); } Calendar calMin = + * Calendar.getInstance(); Calendar calMax = Calendar.getInstance(); + * calMin.add(Calendar.SECOND, -entryTime); + * calMax.add(Calendar.SECOND, -duration); Date minTime = + * calMin.getTime(); Date maxTime = calMax.getTime(); + * + * sc.setParameters("state", com.cloud.event.Event.State.Completed); + * sc.setParameters("startId", 0); sc.setParameters("createDate", + * minTime, maxTime); List startedEvents = + * _eventJoinDao.searchAllEvents(sc, searchFilter); + * List pendingEvents = new ArrayList(); + * for (EventVO event : startedEvents) { EventVO completedEvent = + * _eventDao.findCompletedEvent(event.getId()); if (completedEvent + * == null) { pendingEvents.add(event); } } return pendingEvents; + */ + } else { + eventPair = _eventJoinDao.searchAndCount(sc, searchFilter); + } + return eventPair; + + } + + @Override + public ListResponse listTags(ListTagsCmd cmd) { + Pair, Integer> tags = listTagsInternal(cmd); + ListResponse response = new ListResponse(); + List tagResponses = ViewResponseHelper.createResourceTagResponse(false, tags.first().toArray(new ResourceTagJoinVO[tags.first().size()])); + response.setResponses(tagResponses, tags.second()); + return response; + } + + private Pair, Integer> listTagsInternal(ListTagsCmd cmd) { + Account caller = UserContext.current().getCaller(); + List permittedAccounts = new ArrayList(); + String key = cmd.getKey(); + String value = cmd.getValue(); + String resourceId = cmd.getResourceId(); + String resourceType = cmd.getResourceType(); + String customerName = cmd.getCustomer(); + boolean listAll = cmd.listAll(); + + Ternary domainIdRecursiveListProject = + new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); + + _accountMgr.buildACLSearchParameters(caller, null, cmd.getAccountName(), + cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, false); + Long domainId = domainIdRecursiveListProject.first(); + Boolean isRecursive = domainIdRecursiveListProject.second(); + ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); + Filter searchFilter = new Filter(ResourceTagJoinVO.class, "resourceType", false, cmd.getStartIndex(), cmd.getPageSizeVal()); + + SearchBuilder sb = _resourceTagJoinDao.createSearchBuilder(); + _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + sb.and("key", sb.entity().getKey(), SearchCriteria.Op.EQ); + sb.and("value", sb.entity().getValue(), SearchCriteria.Op.EQ); + + if (resourceId != null) { + sb.and().op("resourceId", sb.entity().getResourceId(), SearchCriteria.Op.EQ); + sb.or("resourceUuid", sb.entity().getResourceUuid(), SearchCriteria.Op.EQ); + sb.cp(); + } + + sb.and("resourceType", sb.entity().getResourceType(), SearchCriteria.Op.EQ); + sb.and("customer", sb.entity().getCustomer(), SearchCriteria.Op.EQ); + + // now set the SC criteria... + SearchCriteria sc = sb.create(); + _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + if (key != null) { + sc.setParameters("key", key); + } + + if (value != null) { + sc.setParameters("value", value); + } + + if (resourceId != null) { + sc.setParameters("resourceId", resourceId); + sc.setParameters("resourceUuid", resourceId); + } + + if (resourceType != null) { + sc.setParameters("resourceType", resourceType); + } + + if (customerName != null) { + sc.setParameters("customer", customerName); + } + + Pair, Integer> result = _resourceTagJoinDao.searchAndCount(sc, searchFilter); + return result; + } + + + + @Override + public ListResponse searchForVmGroups(ListVMGroupsCmd cmd) { + Pair, Integer> groups = searchForVmGroupsInternal(cmd); + ListResponse response = new ListResponse(); + List grpResponses = ViewResponseHelper.createInstanceGroupResponse(groups.first().toArray(new InstanceGroupJoinVO[groups.first().size()])); + response.setResponses(grpResponses, groups.second()); + return response; + } + + private Pair, Integer> searchForVmGroupsInternal(ListVMGroupsCmd cmd) { + Long id = cmd.getId(); + String name = cmd.getGroupName(); + String keyword = cmd.getKeyword(); + + Account caller = UserContext.current().getCaller(); + List permittedAccounts = new ArrayList(); + + Ternary domainIdRecursiveListProject = new Ternary( + cmd.getDomainId(), cmd.isRecursive(), null); + _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, + cmd.listAll(), false); + Long domainId = domainIdRecursiveListProject.first(); + Boolean isRecursive = domainIdRecursiveListProject.second(); + ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); + + Filter searchFilter = new Filter(InstanceGroupJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); + + SearchBuilder sb = _vmGroupJoinDao.createSearchBuilder(); + _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); + + + SearchCriteria sc = sb.create(); + _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + if (keyword != null) { + SearchCriteria ssc = _vmGroupJoinDao.createSearchCriteria(); + ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + sc.addAnd("name", SearchCriteria.Op.SC, ssc); + } + + + if (id != null) { + sc.setParameters("id", id); + } + + if (name != null) { + sc.setParameters("name", "%" + name + "%"); + } + + return _vmGroupJoinDao.searchAndCount(sc, searchFilter); + } + + @Override + public ListResponse searchForUserVMs(ListVMsCmd cmd) { + Pair, Integer> result = searchForUserVMsInternal(cmd); + ListResponse response = new ListResponse(); + List vmResponses = ViewResponseHelper.createUserVmResponse("virtualmachine", cmd.getDetails(), result.first().toArray(new UserVmJoinVO[result.first().size()])); + response.setResponses(vmResponses, result.second()); + return response; + } + + private Pair, Integer> searchForUserVMsInternal(ListVMsCmd cmd) { + Account caller = UserContext.current().getCaller(); + List permittedAccounts = new ArrayList(); + String hypervisor = cmd.getHypervisor(); + boolean listAll = cmd.listAll(); + Long id = cmd.getId(); + Map tags = cmd.getTags(); + + Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); + _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, false); + Long domainId = domainIdRecursiveListProject.first(); + Boolean isRecursive = domainIdRecursiveListProject.second(); + ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); + + // removing order by, orderBy shouold be specified in ListVMsCmd parameters + //Criteria c = new Criteria("id", Boolean.TRUE, cmd.getStartIndex(), cmd.getPageSizeVal()); + Criteria c = new Criteria(null, Boolean.FALSE, cmd.getStartIndex(), cmd.getPageSizeVal()); + c.addCriteria(Criteria.KEYWORD, cmd.getKeyword()); + c.addCriteria(Criteria.ID, cmd.getId()); + c.addCriteria(Criteria.NAME, cmd.getInstanceName()); + c.addCriteria(Criteria.STATE, cmd.getState()); + c.addCriteria(Criteria.DATACENTERID, cmd.getZoneId()); + c.addCriteria(Criteria.GROUPID, cmd.getGroupId()); + c.addCriteria(Criteria.FOR_VIRTUAL_NETWORK, cmd.getForVirtualNetwork()); + c.addCriteria(Criteria.NETWORKID, cmd.getNetworkId()); + c.addCriteria(Criteria.TEMPLATE_ID, cmd.getTemplateId()); + c.addCriteria(Criteria.ISO_ID, cmd.getIsoId()); + c.addCriteria(Criteria.VPC_ID, cmd.getVpcId()); + + if (domainId != null) { + c.addCriteria(Criteria.DOMAINID, domainId); + } + + if (HypervisorType.getType(hypervisor) != HypervisorType.None) { + c.addCriteria(Criteria.HYPERVISOR, hypervisor); + } else if (hypervisor != null) { + throw new InvalidParameterValueException("Invalid HypervisorType " + hypervisor); + } + + // ignore these search requests if it's not an admin + if (_accountMgr.isAdmin(caller.getType())) { + c.addCriteria(Criteria.PODID, cmd.getPodId()); + c.addCriteria(Criteria.HOSTID, cmd.getHostId()); + c.addCriteria(Criteria.STORAGE_ID, cmd.getStorageId()); + } + + if (!permittedAccounts.isEmpty()) { + c.addCriteria(Criteria.ACCOUNTID, permittedAccounts.toArray()); + } + c.addCriteria(Criteria.ISADMIN, _accountMgr.isAdmin(caller.getType())); + + return searchForUserVMsByCriteria(c, caller, domainId, isRecursive, + permittedAccounts, listAll, listProjectResourcesCriteria, tags); + } + + + private Pair, Integer> searchForUserVMsByCriteria(Criteria c, Account caller, Long domainId, boolean isRecursive, + List permittedAccounts, boolean listAll, ListProjectResourcesCriteria listProjectResourcesCriteria, Map tags) { + Filter searchFilter = new Filter(UserVmJoinVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); + + //first search distinct vm id by using query criteria and pagination + SearchBuilder sb = _userVmJoinDao.createSearchBuilder(); + sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct ids + _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + Object id = c.getCriteria(Criteria.ID); + Object name = c.getCriteria(Criteria.NAME); + Object state = c.getCriteria(Criteria.STATE); + Object notState = c.getCriteria(Criteria.NOTSTATE); + Object zone = c.getCriteria(Criteria.DATACENTERID); + Object pod = c.getCriteria(Criteria.PODID); + Object hostId = c.getCriteria(Criteria.HOSTID); + Object hostName = c.getCriteria(Criteria.HOSTNAME); + Object keyword = c.getCriteria(Criteria.KEYWORD); + Object isAdmin = c.getCriteria(Criteria.ISADMIN); + assert c.getCriteria(Criteria.IPADDRESS) == null : "We don't support search by ip address on VM any more. If you see this assert, it means we have to find a different way to search by the nic table."; + Object groupId = c.getCriteria(Criteria.GROUPID); + Object networkId = c.getCriteria(Criteria.NETWORKID); + Object hypervisor = c.getCriteria(Criteria.HYPERVISOR); + Object storageId = c.getCriteria(Criteria.STORAGE_ID); + Object templateId = c.getCriteria(Criteria.TEMPLATE_ID); + Object isoId = c.getCriteria(Criteria.ISO_ID); + Object vpcId = c.getCriteria(Criteria.VPC_ID); + + sb.and("displayName", sb.entity().getDisplayName(), SearchCriteria.Op.LIKE); + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("name", sb.entity().getHostName(), SearchCriteria.Op.LIKE); + sb.and("stateEQ", sb.entity().getState(), SearchCriteria.Op.EQ); + sb.and("stateNEQ", sb.entity().getState(), SearchCriteria.Op.NEQ); + sb.and("stateNIN", sb.entity().getState(), SearchCriteria.Op.NIN); + sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); + sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); + sb.and("hypervisorType", sb.entity().getHypervisorType(), SearchCriteria.Op.EQ); + sb.and("hostIdEQ", sb.entity().getHostId(), SearchCriteria.Op.EQ); + sb.and("hostName", sb.entity().getHostName(), SearchCriteria.Op.LIKE); + sb.and("templateId", sb.entity().getTemplateId(), SearchCriteria.Op.EQ); + sb.and("isoId", sb.entity().getIsoId(), SearchCriteria.Op.EQ); + sb.and("instanceGroupId", sb.entity().getInstanceGroupId(), SearchCriteria.Op.EQ); + + if (groupId != null && (Long) groupId != -1) { + sb.and("instanceGroupId", sb.entity().getInstanceGroupId(), SearchCriteria.Op.EQ); + } + + if (tags != null && !tags.isEmpty()) { + for (int count=0; count < tags.size(); count++) { + sb.or().op("key" + String.valueOf(count), sb.entity().getTagKey(), SearchCriteria.Op.EQ); + sb.and("value" + String.valueOf(count), sb.entity().getTagValue(), SearchCriteria.Op.EQ); + sb.cp(); + } + } + + if (networkId != null) { + sb.and("networkId", sb.entity().getNetworkId(), SearchCriteria.Op.EQ); + } + + if(vpcId != null && networkId == null){ + sb.and("vpcId", sb.entity().getVpcId(), SearchCriteria.Op.EQ); + } + + if (storageId != null) { + sb.and("poolId", sb.entity().getPoolId(), SearchCriteria.Op.EQ); + } + + // populate the search criteria with the values passed in + SearchCriteria sc = sb.create(); + + // building ACL condition + _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + if (tags != null && !tags.isEmpty()) { + int count = 0; + for (String key : tags.keySet()) { + sc.setParameters("key" + String.valueOf(count), key); + sc.setParameters("value" + String.valueOf(count), tags.get(key)); + count++; + } + } + + if (groupId != null && (Long)groupId != -1) { + sc.setParameters("instanceGroupId", groupId); + } + + if (keyword != null) { + SearchCriteria ssc = _userVmJoinDao.createSearchCriteria(); + ssc.addOr("displayName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("hostName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("instanceName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("state", SearchCriteria.Op.EQ, keyword); + + sc.addAnd("displayName", SearchCriteria.Op.SC, ssc); + } + + if (id != null) { + sc.setParameters("id", id); + } + + if (templateId != null) { + sc.setParameters("templateId", templateId); + } + + if (isoId != null) { + sc.setParameters("isoId", isoId); + } + + if (networkId != null) { + sc.setParameters("networkId", networkId); + } + + if(vpcId != null && networkId == null){ + sc.setParameters("vpcId", vpcId); + } + + if (name != null) { + sc.setParameters("name", "%" + name + "%"); + } + + if (state != null) { + if (notState != null && (Boolean) notState == true) { + sc.setParameters("stateNEQ", state); + } else { + sc.setParameters("stateEQ", state); + } + } + + if (hypervisor != null) { + sc.setParameters("hypervisorType", hypervisor); + } + + // Don't show Destroyed and Expunging vms to the end user + if ((isAdmin != null) && ((Boolean) isAdmin != true)) { + sc.setParameters("stateNIN", "Destroyed", "Expunging"); + } + + if (zone != null) { + sc.setParameters("dataCenterId", zone); + + if (state == null) { + sc.setParameters("stateNEQ", "Destroyed"); + } + } + if (pod != null) { + sc.setParameters("podId", pod); + + if (state == null) { + sc.setParameters("stateNEQ", "Destroyed"); + } + } + + if (hostId != null) { + sc.setParameters("hostIdEQ", hostId); + } else { + if (hostName != null) { + sc.setParameters("hostName", hostName); + } + } + + if (storageId != null) { + sc.setParameters("poolId", storageId); + } + + // search vm details by ids + Pair, Integer> uniqueVmPair = _userVmJoinDao.searchAndCount(sc, searchFilter); + Integer count = uniqueVmPair.second(); + if ( count.intValue() == 0 ){ + // handle empty result cases + return uniqueVmPair; + } + List uniqueVms = uniqueVmPair.first(); + Long[] vmIds = new Long[uniqueVms.size()]; + int i = 0; + for (UserVmJoinVO v : uniqueVms ){ + vmIds[i++] = v.getId(); + } + List vms = _userVmJoinDao.searchByIds(vmIds); + return new Pair, Integer>(vms, count); + } + + + @Override + public ListResponse searchForSecurityGroups(ListSecurityGroupsCmd cmd) { + Pair, Integer> result = searchForSecurityGroupsInternal(cmd); + ListResponse response = new ListResponse(); + List routerResponses = ViewResponseHelper.createSecurityGroupResponses(result.first()); + response.setResponses(routerResponses, result.second()); + return response; + } + + private Pair, Integer> searchForSecurityGroupsInternal(ListSecurityGroupsCmd cmd) throws PermissionDeniedException, InvalidParameterValueException { + Account caller = UserContext.current().getCaller(); + Long instanceId = cmd.getVirtualMachineId(); + String securityGroup = cmd.getSecurityGroupName(); + Long id = cmd.getId(); + Object keyword = cmd.getKeyword(); + List permittedAccounts = new ArrayList(); + Map tags = cmd.getTags(); + + if (instanceId != null) { + UserVmVO userVM = _userVmDao.findById(instanceId); + if (userVM == null) { + throw new InvalidParameterValueException("Unable to list network groups for virtual machine instance " + instanceId + "; instance not found."); + } + _accountMgr.checkAccess(caller, null, true, userVM); + return listSecurityGroupRulesByVM(instanceId.longValue(), cmd.getStartIndex(), cmd.getPageSizeVal()); + } + + Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); + _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); + Long domainId = domainIdRecursiveListProject.first(); + Boolean isRecursive = domainIdRecursiveListProject.second(); + ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); + + Filter searchFilter = new Filter(SecurityGroupJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); + SearchBuilder sb = _securityGroupJoinDao.createSearchBuilder(); + sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct ids + _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); + + if (tags != null && !tags.isEmpty()) { + for (int count=0; count < tags.size(); count++) { + sb.or().op("key" + String.valueOf(count), sb.entity().getTagKey(), SearchCriteria.Op.EQ); + sb.and("value" + String.valueOf(count), sb.entity().getTagValue(), SearchCriteria.Op.EQ); + sb.cp(); + } + } + + SearchCriteria sc = sb.create(); + _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + if (id != null) { + sc.setParameters("id", id); + } + + if (tags != null && !tags.isEmpty()) { + int count = 0; + for (String key : tags.keySet()) { + sc.setParameters("key" + String.valueOf(count), key); + sc.setParameters("value" + String.valueOf(count), tags.get(key)); + count++; + } + } + + if (securityGroup != null) { + sc.setParameters("name", securityGroup); + } + + if (keyword != null) { + SearchCriteria ssc = _securityGroupJoinDao.createSearchCriteria(); + ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + sc.addAnd("name", SearchCriteria.Op.SC, ssc); + } + + // search security group together with rules + Pair, Integer> uniqueSgPair = _securityGroupJoinDao.searchAndCount(sc, searchFilter); + Integer count = uniqueSgPair.second(); + if ( count.intValue() == 0 ){ + // handle empty result cases + return uniqueSgPair; + } + + List uniqueSgs = uniqueSgPair.first(); + Long[] sgIds = new Long[uniqueSgs.size()]; + int i = 0; + for (SecurityGroupJoinVO v : uniqueSgs ){ + sgIds[i++] = v.getId(); + } + List sgs = _securityGroupJoinDao.searchByIds(sgIds); + return new Pair, Integer>(sgs, count); + } + + private Pair, Integer> listSecurityGroupRulesByVM(long vmId, long pageInd, long pageSize) { + Filter sf = new Filter(SecurityGroupVMMapVO.class, null, true, pageInd, pageSize); + Pair, Integer> sgVmMappingPair = _securityGroupVMMapDao.listByInstanceId(vmId, sf); + Integer count = sgVmMappingPair.second(); + if (count.intValue() == 0) { + // handle empty result cases + return new Pair, Integer>(new ArrayList(), count); + } + List sgVmMappings = sgVmMappingPair.first(); + Long[] sgIds = new Long[sgVmMappings.size()]; + int i = 0; + for (SecurityGroupVMMapVO sgVm : sgVmMappings) { + sgIds[i++] = sgVm.getSecurityGroupId(); + } + List sgs = _securityGroupJoinDao.searchByIds(sgIds); + return new Pair, Integer>(sgs, count); + } + + + @Override + public ListResponse searchForRouters(ListRoutersCmd cmd) { + Pair, Integer> result = searchForRoutersInternal(cmd); + ListResponse response = new ListResponse(); + + List routerResponses = ViewResponseHelper.createDomainRouterResponse(result.first().toArray(new DomainRouterJoinVO[result.first().size()])); + response.setResponses(routerResponses, result.second()); + return response; + } + + + private Pair, Integer> searchForRoutersInternal(ListRoutersCmd cmd) { + Long id = cmd.getId(); + String name = cmd.getRouterName(); + String state = cmd.getState(); + Long zone = cmd.getZoneId(); + Long pod = cmd.getPodId(); + Long hostId = cmd.getHostId(); + String keyword = cmd.getKeyword(); + Long networkId = cmd.getNetworkId(); + Long vpcId = cmd.getVpcId(); + Boolean forVpc = cmd.getForVpc(); + + Account caller = UserContext.current().getCaller(); + List permittedAccounts = new ArrayList(); + + Ternary domainIdRecursiveListProject = new Ternary( + cmd.getDomainId(), cmd.isRecursive(), null); + _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, + cmd.listAll(), false); + Long domainId = domainIdRecursiveListProject.first(); + Boolean isRecursive = domainIdRecursiveListProject.second(); + ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); + // no default orderBy + // Filter searchFilter = new Filter(DomainRouterJoinVO.class, "id", + // true, cmd.getStartIndex(), cmd.getPageSizeVal()); + Filter searchFilter = new Filter(DomainRouterJoinVO.class, null, true, cmd.getStartIndex(), cmd.getPageSizeVal()); + SearchBuilder sb = _routerJoinDao.createSearchBuilder(); + sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct + // ids to get + // number of + // records with + // pagination + _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + sb.and("name", sb.entity().getHostName(), SearchCriteria.Op.LIKE); + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.IN); + sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); + sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); + sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); + sb.and("hostId", sb.entity().getHostId(), SearchCriteria.Op.EQ); + sb.and("vpcId", sb.entity().getVpcId(), SearchCriteria.Op.EQ); + + if (forVpc != null) { + if (forVpc) { + sb.and("forVpc", sb.entity().getVpcId(), SearchCriteria.Op.NNULL); + } else { + sb.and("forVpc", sb.entity().getVpcId(), SearchCriteria.Op.NULL); + } + } + + if (networkId != null) { + sb.and("networkId", sb.entity().getNetworkId(), SearchCriteria.Op.EQ); + } + + SearchCriteria sc = sb.create(); + _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + if (keyword != null) { + SearchCriteria ssc = _routerJoinDao.createSearchCriteria(); + ssc.addOr("hostName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("instanceName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("state", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + + sc.addAnd("hostName", SearchCriteria.Op.SC, ssc); + } + + if (name != null) { + sc.setParameters("name", "%" + name + "%"); + } + + if (id != null) { + sc.setParameters("id", id); + } + + if (state != null) { + sc.setParameters("state", state); + } + + if (zone != null) { + sc.setParameters("dataCenterId", zone); + } + + if (pod != null) { + sc.setParameters("podId", pod); + } + + if (hostId != null) { + sc.setParameters("hostId", hostId); + } + + if (networkId != null) { + sc.setJoinParameters("nicSearch", "networkId", networkId); + } + + if (vpcId != null) { + sc.setParameters("vpcId", vpcId); + } + + // search VR details by ids + Pair, Integer> uniqueVrPair = _routerJoinDao.searchAndCount(sc, searchFilter); + Integer count = uniqueVrPair.second(); + if (count.intValue() == 0) { + // empty result + return uniqueVrPair; + } + List uniqueVrs = uniqueVrPair.first(); + Long[] vrIds = new Long[uniqueVrs.size()]; + int i = 0; + for (DomainRouterJoinVO v : uniqueVrs) { + vrIds[i++] = v.getId(); + } + List vrs = _routerJoinDao.searchByIds(vrIds); + return new Pair, Integer>(vrs, count); + } + + + + @Override + public ListResponse listProjects(ListProjectsCmd cmd) { + Pair, Integer> projects = listProjectsInternal(cmd); + ListResponse response = new ListResponse(); + List projectResponses = ViewResponseHelper.createProjectResponse(projects.first().toArray(new ProjectJoinVO[projects.first().size()])); + response.setResponses(projectResponses, projects.second()); + return response; + } + + private Pair, Integer> listProjectsInternal(ListProjectsCmd cmd) { + + Long id = cmd.getId(); + String name = cmd.getName(); + String displayText = cmd.getDisplayText(); + String state = cmd.getState(); + String accountName = cmd.getAccountName(); + Long domainId = cmd.getDomainId(); + String keyword = cmd.getKeyword(); + Long startIndex = cmd.getStartIndex(); + Long pageSize = cmd.getPageSizeVal(); + boolean listAll = cmd.listAll(); + boolean isRecursive = cmd.isRecursive(); + Map tags = cmd.getTags(); + + Account caller = UserContext.current().getCaller(); + Long accountId = null; + String path = null; + + Filter searchFilter = new Filter(ProjectJoinVO.class, "id", false, startIndex, pageSize); + SearchBuilder sb = _projectJoinDao.createSearchBuilder(); + sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct + // ids + + if (_accountMgr.isAdmin(caller.getType())) { + if (domainId != null) { + DomainVO domain = _domainDao.findById(domainId); + if (domain == null) { + throw new InvalidParameterValueException("Domain id=" + domainId + " doesn't exist in the system"); + } + + _accountMgr.checkAccess(caller, domain); + + if (accountName != null) { + Account owner = _accountMgr.getActiveAccountByName(accountName, domainId); + if (owner == null) { + throw new InvalidParameterValueException("Unable to find account " + accountName + " in domain " + domainId); + } + accountId = owner.getId(); + } + } else { // domainId == null + if (accountName != null) { + throw new InvalidParameterValueException("could not find account " + accountName + " because domain is not specified"); + } + + } + } else { + if (accountName != null && !accountName.equals(caller.getAccountName())) { + throw new PermissionDeniedException("Can't list account " + accountName + " projects; unauthorized"); + } + + if (domainId != null && domainId.equals(caller.getDomainId())) { + throw new PermissionDeniedException("Can't list domain id= " + domainId + " projects; unauthorized"); + } + + accountId = caller.getId(); + } + + if (domainId == null && accountId == null && (caller.getType() == Account.ACCOUNT_TYPE_NORMAL || !listAll)) { + accountId = caller.getId(); + } else if (caller.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN || (isRecursive && !listAll)) { + DomainVO domain = _domainDao.findById(caller.getDomainId()); + path = domain.getPath(); + } + + if (path != null) { + sb.and("domainPath", sb.entity().getDomainPath(), SearchCriteria.Op.LIKE); + } + + if (accountId != null) { + sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.EQ); + } + + if (tags != null && !tags.isEmpty()) { + for (int count = 0; count < tags.size(); count++) { + sb.or().op("key" + String.valueOf(count), sb.entity().getTagKey(), SearchCriteria.Op.EQ); + sb.and("value" + String.valueOf(count), sb.entity().getTagValue(), SearchCriteria.Op.EQ); + sb.cp(); + } + } + + SearchCriteria sc = sb.create(); + + if (id != null) { + sc.addAnd("id", Op.EQ, id); + } + + if (domainId != null && !isRecursive) { + sc.addAnd("domainId", Op.EQ, domainId); + } + + if (name != null) { + sc.addAnd("name", Op.EQ, name); + } + + if (displayText != null) { + sc.addAnd("displayText", Op.EQ, displayText); + } + + if (accountId != null) { + sc.setParameters("accountId", accountId); + } + + if (state != null) { + sc.addAnd("state", Op.EQ, state); + } + + if (keyword != null) { + SearchCriteria ssc = _projectJoinDao.createSearchCriteria(); + ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("displayText", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + sc.addAnd("name", SearchCriteria.Op.SC, ssc); + } + + if (path != null) { + sc.setParameters("domainPath", path); + } + + if (tags != null && !tags.isEmpty()) { + int count = 0; + for (String key : tags.keySet()) { + sc.setParameters("key" + String.valueOf(count), key); + sc.setParameters("value" + String.valueOf(count), tags.get(key)); + count++; + } + } + + // search distinct projects to get count + Pair, Integer> uniquePrjPair = _projectJoinDao.searchAndCount(sc, searchFilter); + Integer count = uniquePrjPair.second(); + if (count.intValue() == 0) { + // handle empty result cases + return uniquePrjPair; + } + List uniquePrjs = uniquePrjPair.first(); + Long[] prjIds = new Long[uniquePrjs.size()]; + int i = 0; + for (ProjectJoinVO v : uniquePrjs) { + prjIds[i++] = v.getId(); + } + List prjs = _projectJoinDao.searchByIds(prjIds); + return new Pair, Integer>(prjs, count); + } + + + @Override + public ListResponse listProjectInvitations(ListProjectInvitationsCmd cmd) { + Pair, Integer> invites = listProjectInvitationsInternal(cmd); + ListResponse response = new ListResponse(); + List projectInvitationResponses = + ViewResponseHelper.createProjectInvitationResponse(invites.first().toArray(new ProjectInvitationJoinVO[invites.first().size()])); + + response.setResponses(projectInvitationResponses, invites.second()); + return response; + } + + public Pair, Integer> listProjectInvitationsInternal(ListProjectInvitationsCmd cmd){ + Long id = cmd.getId(); + Long projectId = cmd.getProjectId(); + String accountName = cmd.getAccountName(); + Long domainId = cmd.getDomainId(); + String state = cmd.getState(); + boolean activeOnly = cmd.isActiveOnly(); + Long startIndex = cmd.getStartIndex(); + Long pageSizeVal = cmd.getPageSizeVal(); + boolean isRecursive = cmd.isRecursive(); + boolean listAll = cmd.listAll(); + + Account caller = UserContext.current().getCaller(); + List permittedAccounts = new ArrayList(); + + Ternary domainIdRecursiveListProject = new Ternary(domainId, isRecursive, null); + _accountMgr.buildACLSearchParameters(caller, id, accountName, projectId, permittedAccounts, domainIdRecursiveListProject, listAll, true); + domainId = domainIdRecursiveListProject.first(); + isRecursive = domainIdRecursiveListProject.second(); + ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); + + Filter searchFilter = new Filter(ProjectInvitationJoinVO.class, "id", true, startIndex, pageSizeVal); + SearchBuilder sb = _projectInvitationJoinDao.createSearchBuilder(); + _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + sb.and("projectId", sb.entity().getProjectId(), SearchCriteria.Op.EQ); + sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); + sb.and("created", sb.entity().getCreated(), SearchCriteria.Op.GT); + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + + SearchCriteria sc = sb.create(); + _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + + if (projectId != null){ + sc.setParameters("projectId", projectId); + } + + if (state != null) { + sc.setParameters("state", state); + } + + if (id != null) { + sc.setParameters("id", id); + } + + if (activeOnly) { + sc.setParameters("state", ProjectInvitation.State.Pending); + sc.setParameters("created", new Date((DateUtil.currentGMTTime().getTime()) - _projectMgr.getInvitationTimeout())); + } + + return _projectInvitationJoinDao.searchAndCount(sc, searchFilter); + + } + + + @Override + public ListResponse listProjectAccounts(ListProjectAccountsCmd cmd) { + Pair, Integer> projectAccounts = listProjectAccountsInternal(cmd); + ListResponse response = new ListResponse(); + List projectResponses = ViewResponseHelper.createProjectAccountResponse(projectAccounts.first().toArray(new ProjectAccountJoinVO[projectAccounts.first().size()])); + response.setResponses(projectResponses, projectAccounts.second()); + return response; + } + + + public Pair, Integer> listProjectAccountsInternal(ListProjectAccountsCmd cmd) { + long projectId = cmd.getProjectId(); + String accountName = cmd.getAccountName(); + String role = cmd.getRole(); + Long startIndex = cmd.getStartIndex(); + Long pageSizeVal = cmd.getPageSizeVal(); + + //long projectId, String accountName, String role, Long startIndex, Long pageSizeVal) { + Account caller = UserContext.current().getCaller(); + + //check that the project exists + Project project = _projectDao.findById(projectId); + + if (project == null) { + throw new InvalidParameterValueException("Unable to find the project id=" + projectId); + } + + //verify permissions - only accounts belonging to the project can list project's account + if (!_accountMgr.isAdmin(caller.getType()) && _projectAccountDao.findByProjectIdAccountId(projectId, caller.getAccountId()) == null) { + throw new PermissionDeniedException("Account " + caller + " is not authorized to list users of the project id=" + projectId); + } + + Filter searchFilter = new Filter(ProjectAccountJoinVO.class, "id", false, startIndex, pageSizeVal); + SearchBuilder sb = _projectAccountJoinDao.createSearchBuilder(); + sb.and("accountRole", sb.entity().getAccountRole(), Op.EQ); + sb.and("projectId", sb.entity().getProjectId(), Op.EQ); + + SearchBuilder accountSearch; + if (accountName != null) { + sb.and("accountName", sb.entity().getAccountName(), Op.EQ); + } + + SearchCriteria sc = sb.create(); + + sc.setParameters("projectId", projectId); + + if (role != null) { + sc.setParameters("accountRole", role); + } + + if (accountName != null) { + sc.setParameters("accountName", accountName); + } + + return _projectAccountJoinDao.searchAndCount(sc, searchFilter); + } + +} diff --git a/server/src/com/cloud/api/query/ViewResponseHelper.java b/server/src/com/cloud/api/query/ViewResponseHelper.java new file mode 100644 index 00000000000..d2072753a15 --- /dev/null +++ b/server/src/com/cloud/api/query/ViewResponseHelper.java @@ -0,0 +1,196 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.api.query; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.Hashtable; +import java.util.List; + +import org.apache.cloudstack.api.ApiConstants.VMDetails; +import org.apache.cloudstack.api.response.DomainRouterResponse; +import org.apache.cloudstack.api.response.EventResponse; +import org.apache.cloudstack.api.response.InstanceGroupResponse; +import org.apache.cloudstack.api.response.ProjectAccountResponse; +import org.apache.cloudstack.api.response.ProjectInvitationResponse; +import org.apache.cloudstack.api.response.ProjectResponse; +import org.apache.cloudstack.api.response.ResourceTagResponse; +import org.apache.cloudstack.api.response.SecurityGroupResponse; +import org.apache.cloudstack.api.response.UserResponse; +import org.apache.cloudstack.api.response.UserVmResponse; +import org.apache.log4j.Logger; + +import com.cloud.api.ApiDBUtils; +import com.cloud.api.query.vo.DomainRouterJoinVO; +import com.cloud.api.query.vo.EventJoinVO; +import com.cloud.api.query.vo.InstanceGroupJoinVO; +import com.cloud.api.query.vo.ProjectAccountJoinVO; +import com.cloud.api.query.vo.ProjectInvitationJoinVO; +import com.cloud.api.query.vo.ProjectJoinVO; +import com.cloud.api.query.vo.ResourceTagJoinVO; +import com.cloud.api.query.vo.SecurityGroupJoinVO; +import com.cloud.api.query.vo.UserAccountJoinVO; +import com.cloud.api.query.vo.UserVmJoinVO; +import com.cloud.user.Account; +import com.cloud.user.UserContext; + +/** + * Helper class to generate response from DB view VO objects. + * @author minc + * + */ +public class ViewResponseHelper { + + public static final Logger s_logger = Logger.getLogger(ViewResponseHelper.class); + + public static List createUserResponse(UserAccountJoinVO... users) { + List respList = new ArrayList(); + for (UserAccountJoinVO vt : users){ + respList.add(ApiDBUtils.newUserResponse(vt)); + } + return respList; + } + + public static List createEventResponse(EventJoinVO... events) { + List respList = new ArrayList(); + for (EventJoinVO vt : events){ + respList.add(ApiDBUtils.newEventResponse(vt)); + } + return respList; + } + + public static List createResourceTagResponse(boolean keyValueOnly, ResourceTagJoinVO... tags) { + List respList = new ArrayList(); + for (ResourceTagJoinVO vt : tags){ + respList.add(ApiDBUtils.newResourceTagResponse(vt, keyValueOnly)); + } + return respList; + } + + public static List createInstanceGroupResponse(InstanceGroupJoinVO... groups) { + List respList = new ArrayList(); + for (InstanceGroupJoinVO vt : groups){ + respList.add(ApiDBUtils.newInstanceGroupResponse(vt)); + } + return respList; + } + + + public static List createUserVmResponse(String objectName, UserVmJoinVO... userVms) { + return createUserVmResponse(objectName, EnumSet.of(VMDetails.all), userVms); + } + + public static List createUserVmResponse(String objectName, EnumSet details, UserVmJoinVO... userVms) { + Account caller = UserContext.current().getCaller(); + + Hashtable vmDataList = new Hashtable(); + // Initialise the vmdatalist with the input data + + + for (UserVmJoinVO userVm : userVms) { + UserVmResponse userVmData = vmDataList.get(userVm.getId()); + if ( userVmData == null ){ + // first time encountering this vm + userVmData = ApiDBUtils.newUserVmResponse(objectName, userVm, details, caller); + } else{ + // update nics, securitygroups, tags for 1 to many mapping fields + userVmData = ApiDBUtils.fillVmDetails(userVmData, userVm); + } + vmDataList.put(userVm.getId(), userVmData); + } + return new ArrayList(vmDataList.values()); + } + + public static List createDomainRouterResponse(DomainRouterJoinVO... routers) { + Account caller = UserContext.current().getCaller(); + Hashtable vrDataList = new Hashtable(); + // Initialise the vrdatalist with the input data + for (DomainRouterJoinVO vr : routers) { + DomainRouterResponse vrData = vrDataList.get(vr.getId()); + if ( vrData == null ){ + // first time encountering this vm + vrData = ApiDBUtils.newDomainRouterResponse(vr, caller); + } + else{ + // update nics for 1 to many mapping fields + vrData = ApiDBUtils.fillRouterDetails(vrData, vr); + } + vrDataList.put(vr.getId(), vrData); + } + return new ArrayList(vrDataList.values()); + } + + + public static List createSecurityGroupResponses(List securityGroups) { + Account caller = UserContext.current().getCaller(); + Hashtable vrDataList = new Hashtable(); + // Initialise the vrdatalist with the input data + for (SecurityGroupJoinVO vr : securityGroups) { + SecurityGroupResponse vrData = vrDataList.get(vr.getId()); + if ( vrData == null ) { + // first time encountering this sg + vrData = ApiDBUtils.newSecurityGroupResponse(vr, caller); + + } else { + // update rules for 1 to many mapping fields + vrData = ApiDBUtils.fillSecurityGroupDetails(vrData, vr); + } + vrDataList.put(vr.getId(), vrData); + } + return new ArrayList(vrDataList.values()); + } + + + public static List createProjectResponse(ProjectJoinVO... projects) { + Hashtable prjDataList = new Hashtable(); + // Initialise the prjdatalist with the input data + for (ProjectJoinVO p : projects) { + ProjectResponse pData = prjDataList.get(p.getId()); + if ( pData == null ){ + // first time encountering this vm + pData = ApiDBUtils.newProjectResponse(p); + } + else{ + // update those 1 to many mapping fields + pData = ApiDBUtils.fillProjectDetails(pData, p); + } + prjDataList.put(p.getId(), pData); + } + return new ArrayList(prjDataList.values()); + } + + + public static List createProjectAccountResponse(ProjectAccountJoinVO... projectAccounts) { + List responseList = new ArrayList(); + for (ProjectAccountJoinVO proj : projectAccounts){ + ProjectAccountResponse resp = ApiDBUtils.newProjectAccountResponse(proj); + // update user list + List users = ApiDBUtils.findUserViewByAccountId(proj.getAccountId()); + resp.setUsers(ViewResponseHelper.createUserResponse(users.toArray(new UserAccountJoinVO[users.size()]))); + responseList.add(resp); + } + return responseList; + } + + public static List createProjectInvitationResponse(ProjectInvitationJoinVO... invites) { + List respList = new ArrayList(); + for (ProjectInvitationJoinVO v : invites){ + respList.add(ApiDBUtils.newProjectInvitationResponse(v)); + } + return respList; + } +} diff --git a/server/src/com/cloud/vm/dao/DomainRouterJoinDao.java b/server/src/com/cloud/api/query/dao/DomainRouterJoinDao.java similarity index 94% rename from server/src/com/cloud/vm/dao/DomainRouterJoinDao.java rename to server/src/com/cloud/api/query/dao/DomainRouterJoinDao.java index 9bb03be7539..961ab40a88d 100644 --- a/server/src/com/cloud/vm/dao/DomainRouterJoinDao.java +++ b/server/src/com/cloud/api/query/dao/DomainRouterJoinDao.java @@ -14,12 +14,13 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.vm.dao; +package com.cloud.api.query.dao; import java.util.List; import org.apache.cloudstack.api.response.DomainRouterResponse; -import org.apache.cloudstack.api.view.vo.DomainRouterJoinVO; + +import com.cloud.api.query.vo.DomainRouterJoinVO; import com.cloud.network.router.VirtualRouter; import com.cloud.user.Account; import com.cloud.utils.db.GenericDao; diff --git a/server/src/com/cloud/vm/dao/DomainRouterJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java similarity index 99% rename from server/src/com/cloud/vm/dao/DomainRouterJoinDaoImpl.java rename to server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java index 38839e3255c..9d5c36da07b 100644 --- a/server/src/com/cloud/vm/dao/DomainRouterJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.vm.dao; +package com.cloud.api.query.dao; import java.util.ArrayList; import java.util.List; @@ -24,9 +24,10 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import com.cloud.api.ApiResponseHelper; +import com.cloud.api.query.vo.DomainRouterJoinVO; + import org.apache.cloudstack.api.response.DomainRouterResponse; import org.apache.cloudstack.api.response.NicResponse; -import org.apache.cloudstack.api.view.vo.DomainRouterJoinVO; import com.cloud.network.Networks.TrafficType; import com.cloud.network.router.VirtualRouter; import com.cloud.user.Account; diff --git a/server/src/com/cloud/vm/dao/InstanceGroupJoinDao.java b/server/src/com/cloud/api/query/dao/InstanceGroupJoinDao.java similarity index 93% rename from server/src/com/cloud/vm/dao/InstanceGroupJoinDao.java rename to server/src/com/cloud/api/query/dao/InstanceGroupJoinDao.java index 64599be010e..79e5728de75 100644 --- a/server/src/com/cloud/vm/dao/InstanceGroupJoinDao.java +++ b/server/src/com/cloud/api/query/dao/InstanceGroupJoinDao.java @@ -14,13 +14,13 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.vm.dao; +package com.cloud.api.query.dao; import java.util.List; import org.apache.cloudstack.api.response.InstanceGroupResponse; -import org.apache.cloudstack.api.view.vo.InstanceGroupJoinVO; +import com.cloud.api.query.vo.InstanceGroupJoinVO; import com.cloud.utils.db.GenericDao; import com.cloud.vm.InstanceGroup; diff --git a/server/src/com/cloud/vm/dao/InstanceGroupJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/InstanceGroupJoinDaoImpl.java similarity index 97% rename from server/src/com/cloud/vm/dao/InstanceGroupJoinDaoImpl.java rename to server/src/com/cloud/api/query/dao/InstanceGroupJoinDaoImpl.java index aa20b770dc3..83746059c87 100644 --- a/server/src/com/cloud/vm/dao/InstanceGroupJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/InstanceGroupJoinDaoImpl.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.vm.dao; +package com.cloud.api.query.dao; import java.util.List; @@ -23,8 +23,9 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import com.cloud.api.ApiResponseHelper; +import com.cloud.api.query.vo.InstanceGroupJoinVO; + import org.apache.cloudstack.api.response.InstanceGroupResponse; -import org.apache.cloudstack.api.view.vo.InstanceGroupJoinVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; diff --git a/server/src/com/cloud/projects/dao/ProjectAccountJoinDao.java b/server/src/com/cloud/api/query/dao/ProjectAccountJoinDao.java similarity index 92% rename from server/src/com/cloud/projects/dao/ProjectAccountJoinDao.java rename to server/src/com/cloud/api/query/dao/ProjectAccountJoinDao.java index bdee7aa0970..a653ddde238 100644 --- a/server/src/com/cloud/projects/dao/ProjectAccountJoinDao.java +++ b/server/src/com/cloud/api/query/dao/ProjectAccountJoinDao.java @@ -14,12 +14,13 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.projects.dao; +package com.cloud.api.query.dao; import java.util.List; import org.apache.cloudstack.api.response.ProjectAccountResponse; -import org.apache.cloudstack.api.view.vo.ProjectAccountJoinVO; + +import com.cloud.api.query.vo.ProjectAccountJoinVO; import com.cloud.projects.ProjectAccount; import com.cloud.utils.db.GenericDao; diff --git a/server/src/com/cloud/projects/dao/ProjectAccountJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/ProjectAccountJoinDaoImpl.java similarity index 97% rename from server/src/com/cloud/projects/dao/ProjectAccountJoinDaoImpl.java rename to server/src/com/cloud/api/query/dao/ProjectAccountJoinDaoImpl.java index afea1cb2acc..59eeb46bdeb 100644 --- a/server/src/com/cloud/projects/dao/ProjectAccountJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/ProjectAccountJoinDaoImpl.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.projects.dao; +package com.cloud.api.query.dao; import java.util.List; @@ -23,7 +23,8 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import org.apache.cloudstack.api.response.ProjectAccountResponse; -import org.apache.cloudstack.api.view.vo.ProjectAccountJoinVO; + +import com.cloud.api.query.vo.ProjectAccountJoinVO; import com.cloud.projects.ProjectAccount; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; diff --git a/server/src/com/cloud/projects/dao/ProjectInvitationJoinDao.java b/server/src/com/cloud/api/query/dao/ProjectInvitationJoinDao.java similarity index 92% rename from server/src/com/cloud/projects/dao/ProjectInvitationJoinDao.java rename to server/src/com/cloud/api/query/dao/ProjectInvitationJoinDao.java index 2ee7de095f0..ae81f0eae3b 100644 --- a/server/src/com/cloud/projects/dao/ProjectInvitationJoinDao.java +++ b/server/src/com/cloud/api/query/dao/ProjectInvitationJoinDao.java @@ -14,10 +14,11 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.projects.dao; +package com.cloud.api.query.dao; import org.apache.cloudstack.api.response.ProjectInvitationResponse; -import org.apache.cloudstack.api.view.vo.ProjectInvitationJoinVO; + +import com.cloud.api.query.vo.ProjectInvitationJoinVO; import com.cloud.projects.ProjectInvitation; import com.cloud.utils.db.GenericDao; diff --git a/server/src/com/cloud/projects/dao/ProjectInvitationJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/ProjectInvitationJoinDaoImpl.java similarity index 96% rename from server/src/com/cloud/projects/dao/ProjectInvitationJoinDaoImpl.java rename to server/src/com/cloud/api/query/dao/ProjectInvitationJoinDaoImpl.java index 0ee0ef8fce9..41738615141 100644 --- a/server/src/com/cloud/projects/dao/ProjectInvitationJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/ProjectInvitationJoinDaoImpl.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.projects.dao; +package com.cloud.api.query.dao; import java.util.List; @@ -23,9 +23,9 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import org.apache.cloudstack.api.response.ProjectInvitationResponse; -import org.apache.cloudstack.api.view.vo.ProjectInvitationJoinVO; import com.cloud.api.ApiDBUtils; +import com.cloud.api.query.vo.ProjectInvitationJoinVO; import com.cloud.projects.ProjectInvitation; import com.cloud.user.Account; import com.cloud.utils.db.GenericDaoBase; diff --git a/server/src/com/cloud/projects/dao/ProjectJoinDao.java b/server/src/com/cloud/api/query/dao/ProjectJoinDao.java similarity index 93% rename from server/src/com/cloud/projects/dao/ProjectJoinDao.java rename to server/src/com/cloud/api/query/dao/ProjectJoinDao.java index c5cc4227eee..9eeb8aa65f2 100644 --- a/server/src/com/cloud/projects/dao/ProjectJoinDao.java +++ b/server/src/com/cloud/api/query/dao/ProjectJoinDao.java @@ -14,12 +14,13 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.projects.dao; +package com.cloud.api.query.dao; import java.util.List; import org.apache.cloudstack.api.response.ProjectResponse; -import org.apache.cloudstack.api.view.vo.ProjectJoinVO; + +import com.cloud.api.query.vo.ProjectJoinVO; import com.cloud.projects.Project; import com.cloud.utils.db.GenericDao; diff --git a/server/src/com/cloud/projects/dao/ProjectJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/ProjectJoinDaoImpl.java similarity index 96% rename from server/src/com/cloud/projects/dao/ProjectJoinDaoImpl.java rename to server/src/com/cloud/api/query/dao/ProjectJoinDaoImpl.java index 81ccb7f5256..a2aaa215b2b 100644 --- a/server/src/com/cloud/projects/dao/ProjectJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/ProjectJoinDaoImpl.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.projects.dao; +package com.cloud.api.query.dao; import java.util.List; @@ -23,9 +23,10 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import com.cloud.api.ApiDBUtils; +import com.cloud.api.query.vo.ProjectJoinVO; +import com.cloud.api.query.vo.ResourceTagJoinVO; + import org.apache.cloudstack.api.response.ProjectResponse; -import org.apache.cloudstack.api.view.vo.ProjectJoinVO; -import org.apache.cloudstack.api.view.vo.ResourceTagJoinVO; import com.cloud.projects.Project; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; diff --git a/server/src/com/cloud/tags/dao/ResourceTagJoinDao.java b/server/src/com/cloud/api/query/dao/ResourceTagJoinDao.java similarity index 93% rename from server/src/com/cloud/tags/dao/ResourceTagJoinDao.java rename to server/src/com/cloud/api/query/dao/ResourceTagJoinDao.java index 8dd3d82d02e..57fc130de55 100644 --- a/server/src/com/cloud/tags/dao/ResourceTagJoinDao.java +++ b/server/src/com/cloud/api/query/dao/ResourceTagJoinDao.java @@ -14,12 +14,13 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.tags.dao; +package com.cloud.api.query.dao; import java.util.List; import org.apache.cloudstack.api.response.ResourceTagResponse; -import org.apache.cloudstack.api.view.vo.ResourceTagJoinVO; + +import com.cloud.api.query.vo.ResourceTagJoinVO; import com.cloud.server.ResourceTag; import com.cloud.utils.db.GenericDao; diff --git a/server/src/com/cloud/tags/dao/ResourceTagJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/ResourceTagJoinDaoImpl.java similarity index 97% rename from server/src/com/cloud/tags/dao/ResourceTagJoinDaoImpl.java rename to server/src/com/cloud/api/query/dao/ResourceTagJoinDaoImpl.java index 3c2dafa03e4..badf45758c2 100644 --- a/server/src/com/cloud/tags/dao/ResourceTagJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/ResourceTagJoinDaoImpl.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.tags.dao; +package com.cloud.api.query.dao; import java.util.ArrayList; import java.util.List; @@ -24,8 +24,9 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import com.cloud.api.ApiResponseHelper; +import com.cloud.api.query.vo.ResourceTagJoinVO; + import org.apache.cloudstack.api.response.ResourceTagResponse; -import org.apache.cloudstack.api.view.vo.ResourceTagJoinVO; import com.cloud.server.ResourceTag; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupJoinDao.java b/server/src/com/cloud/api/query/dao/SecurityGroupJoinDao.java similarity index 93% rename from server/src/com/cloud/network/security/dao/SecurityGroupJoinDao.java rename to server/src/com/cloud/api/query/dao/SecurityGroupJoinDao.java index 30c089762d5..de1b72ae487 100644 --- a/server/src/com/cloud/network/security/dao/SecurityGroupJoinDao.java +++ b/server/src/com/cloud/api/query/dao/SecurityGroupJoinDao.java @@ -14,12 +14,13 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.network.security.dao; +package com.cloud.api.query.dao; import java.util.List; import org.apache.cloudstack.api.response.SecurityGroupResponse; -import org.apache.cloudstack.api.view.vo.SecurityGroupJoinVO; + +import com.cloud.api.query.vo.SecurityGroupJoinVO; import com.cloud.network.security.SecurityGroup; import com.cloud.user.Account; import com.cloud.utils.db.GenericDao; diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/SecurityGroupJoinDaoImpl.java similarity index 97% rename from server/src/com/cloud/network/security/dao/SecurityGroupJoinDaoImpl.java rename to server/src/com/cloud/api/query/dao/SecurityGroupJoinDaoImpl.java index 6ecb258b39a..b7994cbb322 100644 --- a/server/src/com/cloud/network/security/dao/SecurityGroupJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/SecurityGroupJoinDaoImpl.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.network.security.dao; +package com.cloud.api.query.dao; import java.util.ArrayList; import java.util.List; @@ -25,10 +25,11 @@ import org.apache.log4j.Logger; import com.cloud.api.ApiDBUtils; import com.cloud.api.ApiResponseHelper; +import com.cloud.api.query.vo.ResourceTagJoinVO; +import com.cloud.api.query.vo.SecurityGroupJoinVO; + import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.SecurityGroupRuleResponse; -import org.apache.cloudstack.api.view.vo.ResourceTagJoinVO; -import org.apache.cloudstack.api.view.vo.SecurityGroupJoinVO; import com.cloud.network.security.SecurityGroup; import com.cloud.network.security.SecurityRule.SecurityRuleType; import com.cloud.user.Account; diff --git a/server/src/com/cloud/vm/dao/UserVmJoinDao.java b/server/src/com/cloud/api/query/dao/UserVmJoinDao.java similarity index 94% rename from server/src/com/cloud/vm/dao/UserVmJoinDao.java rename to server/src/com/cloud/api/query/dao/UserVmJoinDao.java index 7788a62dca7..2617a7475ef 100644 --- a/server/src/com/cloud/vm/dao/UserVmJoinDao.java +++ b/server/src/com/cloud/api/query/dao/UserVmJoinDao.java @@ -14,14 +14,15 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.vm.dao; +package com.cloud.api.query.dao; import java.util.EnumSet; import java.util.List; import org.apache.cloudstack.api.ApiConstants.VMDetails; import org.apache.cloudstack.api.response.UserVmResponse; -import org.apache.cloudstack.api.view.vo.UserVmJoinVO; + +import com.cloud.api.query.vo.UserVmJoinVO; import com.cloud.user.Account; import com.cloud.uservm.UserVm; import com.cloud.utils.db.GenericDao; diff --git a/server/src/com/cloud/vm/dao/UserVmJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java similarity index 99% rename from server/src/com/cloud/vm/dao/UserVmJoinDaoImpl.java rename to server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java index b20e53f10ea..e8317a850e1 100644 --- a/server/src/com/cloud/vm/dao/UserVmJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.vm.dao; +package com.cloud.api.query.dao; import java.text.DecimalFormat; import java.util.ArrayList; @@ -27,12 +27,13 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import com.cloud.api.ApiDBUtils; +import com.cloud.api.query.vo.ResourceTagJoinVO; +import com.cloud.api.query.vo.UserVmJoinVO; + import org.apache.cloudstack.api.ApiConstants.VMDetails; import org.apache.cloudstack.api.response.NicResponse; import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.UserVmResponse; -import org.apache.cloudstack.api.view.vo.ResourceTagJoinVO; -import org.apache.cloudstack.api.view.vo.UserVmJoinVO; import com.cloud.user.Account; import com.cloud.uservm.UserVm; import com.cloud.utils.db.GenericDaoBase; diff --git a/api/src/org/apache/cloudstack/api/view/vo/BaseViewVO.java b/server/src/com/cloud/api/query/vo/BaseViewVO.java similarity index 97% rename from api/src/org/apache/cloudstack/api/view/vo/BaseViewVO.java rename to server/src/com/cloud/api/query/vo/BaseViewVO.java index 469944f5926..604f4597a0e 100644 --- a/api/src/org/apache/cloudstack/api/view/vo/BaseViewVO.java +++ b/server/src/com/cloud/api/query/vo/BaseViewVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.api.view.vo; +package com.cloud.api.query.vo; import javax.persistence.Column; diff --git a/api/src/org/apache/cloudstack/api/view/vo/ControlledViewEntity.java b/server/src/com/cloud/api/query/vo/ControlledViewEntity.java similarity index 96% rename from api/src/org/apache/cloudstack/api/view/vo/ControlledViewEntity.java rename to server/src/com/cloud/api/query/vo/ControlledViewEntity.java index f98e1bbc3f5..8b3687420a0 100644 --- a/api/src/org/apache/cloudstack/api/view/vo/ControlledViewEntity.java +++ b/server/src/com/cloud/api/query/vo/ControlledViewEntity.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.api.view.vo; +package com.cloud.api.query.vo; import com.cloud.acl.ControlledEntity; diff --git a/api/src/org/apache/cloudstack/api/view/vo/DomainRouterJoinVO.java b/server/src/com/cloud/api/query/vo/DomainRouterJoinVO.java similarity index 99% rename from api/src/org/apache/cloudstack/api/view/vo/DomainRouterJoinVO.java rename to server/src/com/cloud/api/query/vo/DomainRouterJoinVO.java index e6615f44df5..cf598276236 100644 --- a/api/src/org/apache/cloudstack/api/view/vo/DomainRouterJoinVO.java +++ b/server/src/com/cloud/api/query/vo/DomainRouterJoinVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.api.view.vo; +package com.cloud.api.query.vo; import java.net.URI; import java.util.Date; diff --git a/api/src/org/apache/cloudstack/api/view/vo/EventJoinVO.java b/server/src/com/cloud/api/query/vo/EventJoinVO.java similarity index 99% rename from api/src/org/apache/cloudstack/api/view/vo/EventJoinVO.java rename to server/src/com/cloud/api/query/vo/EventJoinVO.java index 7a3de601d7c..def1b1d2f2a 100644 --- a/api/src/org/apache/cloudstack/api/view/vo/EventJoinVO.java +++ b/server/src/com/cloud/api/query/vo/EventJoinVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.api.view.vo; +package com.cloud.api.query.vo; import java.util.Date; diff --git a/api/src/org/apache/cloudstack/api/view/vo/InstanceGroupJoinVO.java b/server/src/com/cloud/api/query/vo/InstanceGroupJoinVO.java similarity index 99% rename from api/src/org/apache/cloudstack/api/view/vo/InstanceGroupJoinVO.java rename to server/src/com/cloud/api/query/vo/InstanceGroupJoinVO.java index a473216432b..2ab375598bd 100644 --- a/api/src/org/apache/cloudstack/api/view/vo/InstanceGroupJoinVO.java +++ b/server/src/com/cloud/api/query/vo/InstanceGroupJoinVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.api.view.vo; +package com.cloud.api.query.vo; import java.util.Date; diff --git a/api/src/org/apache/cloudstack/api/view/vo/ProjectAccountJoinVO.java b/server/src/com/cloud/api/query/vo/ProjectAccountJoinVO.java similarity index 98% rename from api/src/org/apache/cloudstack/api/view/vo/ProjectAccountJoinVO.java rename to server/src/com/cloud/api/query/vo/ProjectAccountJoinVO.java index d6845bdd137..c8158cc5621 100644 --- a/api/src/org/apache/cloudstack/api/view/vo/ProjectAccountJoinVO.java +++ b/server/src/com/cloud/api/query/vo/ProjectAccountJoinVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.api.view.vo; +package com.cloud.api.query.vo; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/api/src/org/apache/cloudstack/api/view/vo/ProjectInvitationJoinVO.java b/server/src/com/cloud/api/query/vo/ProjectInvitationJoinVO.java similarity index 99% rename from api/src/org/apache/cloudstack/api/view/vo/ProjectInvitationJoinVO.java rename to server/src/com/cloud/api/query/vo/ProjectInvitationJoinVO.java index b33df0428bb..7fe36d1095e 100644 --- a/api/src/org/apache/cloudstack/api/view/vo/ProjectInvitationJoinVO.java +++ b/server/src/com/cloud/api/query/vo/ProjectInvitationJoinVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.api.view.vo; +package com.cloud.api.query.vo; import java.util.Date; diff --git a/api/src/org/apache/cloudstack/api/view/vo/ProjectJoinVO.java b/server/src/com/cloud/api/query/vo/ProjectJoinVO.java similarity index 99% rename from api/src/org/apache/cloudstack/api/view/vo/ProjectJoinVO.java rename to server/src/com/cloud/api/query/vo/ProjectJoinVO.java index 0bc9cd8b013..bf278e160e0 100644 --- a/api/src/org/apache/cloudstack/api/view/vo/ProjectJoinVO.java +++ b/server/src/com/cloud/api/query/vo/ProjectJoinVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.api.view.vo; +package com.cloud.api.query.vo; import java.util.Date; diff --git a/api/src/org/apache/cloudstack/api/view/vo/ResourceTagJoinVO.java b/server/src/com/cloud/api/query/vo/ResourceTagJoinVO.java similarity index 99% rename from api/src/org/apache/cloudstack/api/view/vo/ResourceTagJoinVO.java rename to server/src/com/cloud/api/query/vo/ResourceTagJoinVO.java index 00d161115d4..63dc0b3ea9e 100644 --- a/api/src/org/apache/cloudstack/api/view/vo/ResourceTagJoinVO.java +++ b/server/src/com/cloud/api/query/vo/ResourceTagJoinVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.api.view.vo; +package com.cloud.api.query.vo; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/api/src/org/apache/cloudstack/api/view/vo/SecurityGroupJoinVO.java b/server/src/com/cloud/api/query/vo/SecurityGroupJoinVO.java similarity index 99% rename from api/src/org/apache/cloudstack/api/view/vo/SecurityGroupJoinVO.java rename to server/src/com/cloud/api/query/vo/SecurityGroupJoinVO.java index ac4c114466e..6b4106e26f8 100644 --- a/api/src/org/apache/cloudstack/api/view/vo/SecurityGroupJoinVO.java +++ b/server/src/com/cloud/api/query/vo/SecurityGroupJoinVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.api.view.vo; +package com.cloud.api.query.vo; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/api/src/org/apache/cloudstack/api/view/vo/UserAccountJoinVO.java b/server/src/com/cloud/api/query/vo/UserAccountJoinVO.java similarity index 99% rename from api/src/org/apache/cloudstack/api/view/vo/UserAccountJoinVO.java rename to server/src/com/cloud/api/query/vo/UserAccountJoinVO.java index b3a1b2017ef..df20ede9e75 100644 --- a/api/src/org/apache/cloudstack/api/view/vo/UserAccountJoinVO.java +++ b/server/src/com/cloud/api/query/vo/UserAccountJoinVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.api.view.vo; +package com.cloud.api.query.vo; import java.util.Date; diff --git a/api/src/org/apache/cloudstack/api/view/vo/UserVmJoinVO.java b/server/src/com/cloud/api/query/vo/UserVmJoinVO.java similarity index 99% rename from api/src/org/apache/cloudstack/api/view/vo/UserVmJoinVO.java rename to server/src/com/cloud/api/query/vo/UserVmJoinVO.java index d337bdde3a2..c01d2d94378 100644 --- a/api/src/org/apache/cloudstack/api/view/vo/UserVmJoinVO.java +++ b/server/src/com/cloud/api/query/vo/UserVmJoinVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.api.view.vo; +package com.cloud.api.query.vo; import java.net.URI; import java.util.Date; diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java index 2dd46fd9ad9..d41bda67324 100755 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -24,6 +24,15 @@ import java.util.Map; import com.cloud.agent.manager.ClusteredAgentManagerImpl; import com.cloud.alert.AlertManagerImpl; import com.cloud.alert.dao.AlertDaoImpl; +import com.cloud.api.query.QueryManagerImpl; +import com.cloud.api.query.dao.DomainRouterJoinDaoImpl; +import com.cloud.api.query.dao.InstanceGroupJoinDaoImpl; +import com.cloud.api.query.dao.ProjectAccountJoinDaoImpl; +import com.cloud.api.query.dao.ProjectInvitationJoinDaoImpl; +import com.cloud.api.query.dao.ProjectJoinDaoImpl; +import com.cloud.api.query.dao.ResourceTagJoinDaoImpl; +import com.cloud.api.query.dao.SecurityGroupJoinDaoImpl; +import com.cloud.api.query.dao.UserVmJoinDaoImpl; import com.cloud.async.AsyncJobExecutorContextImpl; import com.cloud.async.AsyncJobManagerImpl; import com.cloud.async.SyncQueueManagerImpl; @@ -117,7 +126,6 @@ import com.cloud.network.rules.RulesManagerImpl; import com.cloud.network.rules.dao.PortForwardingRulesDaoImpl; import com.cloud.network.security.SecurityGroupManagerImpl2; import com.cloud.network.security.dao.SecurityGroupDaoImpl; -import com.cloud.network.security.dao.SecurityGroupJoinDaoImpl; import com.cloud.network.security.dao.SecurityGroupRuleDaoImpl; import com.cloud.network.security.dao.SecurityGroupRulesDaoImpl; import com.cloud.network.security.dao.SecurityGroupVMMapDaoImpl; @@ -139,8 +147,6 @@ import com.cloud.projects.ProjectManagerImpl; import com.cloud.projects.dao.ProjectAccountDaoImpl; import com.cloud.projects.dao.ProjectDaoImpl; import com.cloud.projects.dao.ProjectInvitationDaoImpl; -import com.cloud.projects.dao.ProjectInvitationJoinDaoImpl; -import com.cloud.projects.dao.ProjectJoinDaoImpl; import com.cloud.resource.ResourceManagerImpl; import com.cloud.resourcelimit.ResourceLimitManagerImpl; import com.cloud.service.dao.ServiceOfferingDaoImpl; @@ -173,7 +179,6 @@ import com.cloud.storage.snapshot.SnapshotSchedulerImpl; import com.cloud.storage.swift.SwiftManagerImpl; import com.cloud.storage.upload.UploadMonitorImpl; import com.cloud.tags.TaggedResourceManagerImpl; -import com.cloud.tags.dao.ResourceTagJoinDaoImpl; import com.cloud.tags.dao.ResourceTagsDaoImpl; import com.cloud.template.HyervisorTemplateAdapter; import com.cloud.template.TemplateAdapter; @@ -203,18 +208,14 @@ import com.cloud.vm.ItWorkDaoImpl; import com.cloud.vm.UserVmManagerImpl; import com.cloud.vm.dao.ConsoleProxyDaoImpl; import com.cloud.vm.dao.DomainRouterDaoImpl; -import com.cloud.vm.dao.DomainRouterJoinDaoImpl; import com.cloud.vm.dao.InstanceGroupDaoImpl; -import com.cloud.vm.dao.InstanceGroupJoinDaoImpl; import com.cloud.vm.dao.InstanceGroupVMMapDaoImpl; import com.cloud.vm.dao.NicDaoImpl; import com.cloud.vm.dao.SecondaryStorageVmDaoImpl; import com.cloud.vm.dao.UserVmDaoImpl; -import com.cloud.vm.dao.UserVmJoinDaoImpl; import com.cloud.vm.dao.UserVmDetailsDaoImpl; import com.cloud.vm.dao.VMInstanceDaoImpl; import com.cloud.event.dao.EventJoinDaoImpl; -import com.cloud.projects.dao.ProjectAccountJoinDaoImpl; public class DefaultComponentLibrary extends ComponentLibraryBase implements ComponentLibrary { @@ -432,6 +433,7 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com addManager("NetworkACLManager", NetworkACLManagerImpl.class); addManager("TaggedResourcesManager", TaggedResourceManagerImpl.class); addManager("Site2SiteVpnManager", Site2SiteVpnManagerImpl.class); + addManager("QueryManager", QueryManagerImpl.class); } @Override diff --git a/server/src/com/cloud/event/dao/EventJoinDao.java b/server/src/com/cloud/event/dao/EventJoinDao.java index d67653d2cd9..cd37d7893df 100644 --- a/server/src/com/cloud/event/dao/EventJoinDao.java +++ b/server/src/com/cloud/event/dao/EventJoinDao.java @@ -19,7 +19,8 @@ package com.cloud.event.dao; import java.util.List; import org.apache.cloudstack.api.response.EventResponse; -import org.apache.cloudstack.api.view.vo.EventJoinVO; + +import com.cloud.api.query.vo.EventJoinVO; import com.cloud.event.Event; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDao; diff --git a/server/src/com/cloud/event/dao/EventJoinDaoImpl.java b/server/src/com/cloud/event/dao/EventJoinDaoImpl.java index be2a6dc917a..764df99557f 100644 --- a/server/src/com/cloud/event/dao/EventJoinDaoImpl.java +++ b/server/src/com/cloud/event/dao/EventJoinDaoImpl.java @@ -24,8 +24,9 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import com.cloud.api.ApiResponseHelper; +import com.cloud.api.query.vo.EventJoinVO; + import org.apache.cloudstack.api.response.EventResponse; -import org.apache.cloudstack.api.view.vo.EventJoinVO; import com.cloud.event.Event; import com.cloud.event.Event.State; import com.cloud.utils.db.Filter; diff --git a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java index a9d1f0bd7a3..8e458999fb5 100755 --- a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java +++ b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java @@ -45,8 +45,10 @@ import com.cloud.agent.api.NetworkRulesSystemVmCommand; import com.cloud.agent.api.SecurityGroupRulesCmd; import com.cloud.agent.api.SecurityGroupRulesCmd.IpPortAndProto; import com.cloud.agent.manager.Commands; +import com.cloud.api.query.dao.SecurityGroupJoinDao; +import com.cloud.api.query.vo.SecurityGroupJoinVO; + import org.apache.cloudstack.api.command.user.securitygroup.RevokeSecurityGroupEgressCmd; -import org.apache.cloudstack.api.view.vo.SecurityGroupJoinVO; import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.domain.dao.DomainDao; @@ -65,7 +67,6 @@ import com.cloud.network.NetworkManager; import com.cloud.network.security.SecurityGroupWork.Step; import com.cloud.network.security.SecurityRule.SecurityRuleType; import com.cloud.network.security.dao.SecurityGroupDao; -import com.cloud.network.security.dao.SecurityGroupJoinDao; import com.cloud.network.security.dao.SecurityGroupRuleDao; import com.cloud.network.security.dao.SecurityGroupRulesDao; import com.cloud.network.security.dao.SecurityGroupVMMapDao; @@ -158,7 +159,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG UsageEventDao _usageEventDao; @Inject ResourceTagDao _resourceTagDao; - + ScheduledExecutorService _executorPool; ScheduledExecutorService _cleanupExecutor; @@ -396,7 +397,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG if (s_logger.isTraceEnabled()) { s_logger.trace("Security Group Mgr: scheduling ruleset updates for " + affectedVms.size() + " vms"); } - boolean locked = _workLock.lock(_globalWorkLockTimeout); + boolean locked = _workLock.lock(_globalWorkLockTimeout); if (!locked) { s_logger.warn("Security Group Mgr: failed to acquire global work lock"); return; @@ -575,11 +576,11 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG Map groupList = cmd.getUserSecurityGroupList(); return authorizeSecurityGroupRule(securityGroupId,protocol,startPort,endPort,icmpType,icmpCode,cidrList,groupList,SecurityRuleType.IngressRule); } - + private List authorizeSecurityGroupRule(Long securityGroupId,String protocol,Integer startPort,Integer endPort,Integer icmpType,Integer icmpCode,List cidrList,Map groupList,SecurityRuleType ruleType) { Integer startPortOrType = null; Integer endPortOrCode = null; - + // Validate parameters SecurityGroup securityGroup = _securityGroupDao.findById(securityGroupId); if (securityGroup == null) { @@ -747,7 +748,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG } } } - + @Override @DB @ActionEvent(eventType = EventTypes.EVENT_SECURITY_GROUP_REVOKE_EGRESS, eventDescription = "Revoking Egress Rule ", async = true) @@ -755,7 +756,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG Long id = cmd.getId(); return revokeSecurityGroupRule(id, SecurityRuleType.EgressRule); } - + @Override @DB @ActionEvent(eventType = EventTypes.EVENT_SECURITY_GROUP_REVOKE_INGRESS, eventDescription = "Revoking Ingress Rule ", async = true) @@ -764,11 +765,11 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG Long id = cmd.getId(); return revokeSecurityGroupRule(id, SecurityRuleType.IngressRule); } - + private boolean revokeSecurityGroupRule(Long id, SecurityRuleType type) { // input validation Account caller = UserContext.current().getCaller(); - + SecurityGroupRuleVO rule = _securityGroupRuleDao.findById(id); if (rule == null) { s_logger.debug("Unable to find security rule with id " + id); @@ -780,7 +781,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG s_logger.debug("Mismatch in rule type for security rule with id " + id ); throw new InvalidParameterValueException("Mismatch in rule type for security rule with id " + id); } - + // Check permissions SecurityGroup securityGroup = _securityGroupDao.findById(rule.getSecurityGroupId()); _accountMgr.checkAccess(caller, null, true, securityGroup); @@ -861,13 +862,13 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG _serverId = ((ManagementServer) ComponentLocator.getComponent(ManagementServer.Name)).getId(); - s_logger.info("SecurityGroupManager: num worker threads=" + _numWorkerThreads + + s_logger.info("SecurityGroupManager: num worker threads=" + _numWorkerThreads + ", time between cleanups=" + _timeBetweenCleanups + " global lock timeout=" + _globalWorkLockTimeout); createThreadPools(); return true; } - + protected void createThreadPools() { _executorPool = Executors.newScheduledThreadPool(_numWorkerThreads, new NamedThreadFactory("NWGRP")); _cleanupExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("NWGRP-Cleanup")); @@ -964,7 +965,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG s_logger.debug("Unable to send ingress rules updates for vm: " + userVmId + "(agentid=" + agentId + ")"); _workDao.updateStep(work.getInstanceId(), seqnum, Step.Done); } - + } } } finally { @@ -1088,91 +1089,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG return true; } - @Override - public Pair, Integer> searchForSecurityGroupRules(ListSecurityGroupsCmd cmd) throws PermissionDeniedException, InvalidParameterValueException { - Account caller = UserContext.current().getCaller(); - Long instanceId = cmd.getVirtualMachineId(); - String securityGroup = cmd.getSecurityGroupName(); - Long id = cmd.getId(); - Object keyword = cmd.getKeyword(); - List permittedAccounts = new ArrayList(); - Map tags = cmd.getTags(); - if (instanceId != null) { - UserVmVO userVM = _userVMDao.findById(instanceId); - if (userVM == null) { - throw new InvalidParameterValueException("Unable to list network groups for virtual machine instance " + instanceId + "; instance not found."); - } - _accountMgr.checkAccess(caller, null, true, userVM); - return listSecurityGroupRulesByVM(instanceId.longValue(), cmd.getStartIndex(), cmd.getPageSizeVal()); - } - - Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); - Long domainId = domainIdRecursiveListProject.first(); - Boolean isRecursive = domainIdRecursiveListProject.second(); - ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); - - Filter searchFilter = new Filter(SecurityGroupJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); - SearchBuilder sb = _securityGroupJoinDao.createSearchBuilder(); - sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct ids - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); - sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); - - if (tags != null && !tags.isEmpty()) { - for (int count=0; count < tags.size(); count++) { - sb.or().op("key" + String.valueOf(count), sb.entity().getTagKey(), SearchCriteria.Op.EQ); - sb.and("value" + String.valueOf(count), sb.entity().getTagValue(), SearchCriteria.Op.EQ); - sb.cp(); - } - } - - SearchCriteria sc = sb.create(); - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - if (id != null) { - sc.setParameters("id", id); - } - - if (tags != null && !tags.isEmpty()) { - int count = 0; - for (String key : tags.keySet()) { - sc.setParameters("key" + String.valueOf(count), key); - sc.setParameters("value" + String.valueOf(count), tags.get(key)); - count++; - } - } - - if (securityGroup != null) { - sc.setParameters("name", securityGroup); - } - - if (keyword != null) { - SearchCriteria ssc = _securityGroupJoinDao.createSearchCriteria(); - ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - sc.addAnd("name", SearchCriteria.Op.SC, ssc); - } - - // search security group together with rules - Pair, Integer> uniqueSgPair = _securityGroupJoinDao.searchAndCount(sc, searchFilter); - Integer count = uniqueSgPair.second(); - if ( count.intValue() == 0 ){ - // handle empty result cases - return uniqueSgPair; - } - - List uniqueSgs = uniqueSgPair.first(); - Long[] sgIds = new Long[uniqueSgs.size()]; - int i = 0; - for (SecurityGroupJoinVO v : uniqueSgs ){ - sgIds[i++] = v.getId(); - } - List sgs = _securityGroupJoinDao.searchByIds(sgIds); - return new Pair, Integer>(sgs, count); - } private Pair, Integer> listSecurityGroupRulesByVM(long vmId, long pageInd, long pageSize) { Filter sf = new Filter(SecurityGroupVMMapVO.class, null, true, pageInd, pageSize); diff --git a/server/src/com/cloud/projects/ProjectManager.java b/server/src/com/cloud/projects/ProjectManager.java index a243d2d3891..f5681464615 100644 --- a/server/src/com/cloud/projects/ProjectManager.java +++ b/server/src/com/cloud/projects/ProjectManager.java @@ -35,4 +35,6 @@ public interface ProjectManager extends ProjectService { boolean deleteProject(Account caller, long callerUserId, ProjectVO project); + long getInvitationTimeout(); + } diff --git a/server/src/com/cloud/projects/ProjectManagerImpl.java b/server/src/com/cloud/projects/ProjectManagerImpl.java index 7c97af2699d..4fbbc7d2254 100755 --- a/server/src/com/cloud/projects/ProjectManagerImpl.java +++ b/server/src/com/cloud/projects/ProjectManagerImpl.java @@ -38,13 +38,16 @@ import javax.mail.URLName; import javax.mail.internet.InternetAddress; import javax.naming.ConfigurationException; -import org.apache.cloudstack.api.view.vo.ProjectAccountJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectInvitationJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectJoinVO; -import org.apache.cloudstack.api.view.vo.UserVmJoinVO; import org.apache.log4j.Logger; import com.cloud.acl.SecurityChecker.AccessType; +import com.cloud.api.query.dao.ProjectAccountJoinDao; +import com.cloud.api.query.dao.ProjectInvitationJoinDao; +import com.cloud.api.query.dao.ProjectJoinDao; +import com.cloud.api.query.vo.ProjectAccountJoinVO; +import com.cloud.api.query.vo.ProjectInvitationJoinVO; +import com.cloud.api.query.vo.ProjectJoinVO; +import com.cloud.api.query.vo.UserVmJoinVO; import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.Resource.ResourceType; @@ -62,11 +65,8 @@ import com.cloud.projects.Project.ListProjectResourcesCriteria; import com.cloud.projects.Project.State; import com.cloud.projects.ProjectAccount.Role; import com.cloud.projects.dao.ProjectAccountDao; -import com.cloud.projects.dao.ProjectAccountJoinDao; import com.cloud.projects.dao.ProjectDao; import com.cloud.projects.dao.ProjectInvitationDao; -import com.cloud.projects.dao.ProjectInvitationJoinDao; -import com.cloud.projects.dao.ProjectJoinDao; import com.cloud.server.ResourceTag.TaggedResourceType; import com.cloud.tags.ResourceTagVO; import com.cloud.tags.dao.ResourceTagDao; @@ -368,140 +368,13 @@ public class ProjectManagerImpl implements ProjectManager, Manager{ return _projectDao.findById(projectId); } + @Override - public Pair, Integer> listProjects(Long id, String name, String displayText, String state, - String accountName, Long domainId, String keyword, Long startIndex, Long pageSize, boolean listAll, - boolean isRecursive, Map tags) { - Account caller = UserContext.current().getCaller(); - Long accountId = null; - String path = null; - - Filter searchFilter = new Filter(ProjectJoinVO.class, "id", false, startIndex, pageSize); - SearchBuilder sb = _projectJoinDao.createSearchBuilder(); - sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct ids - - if (_accountMgr.isAdmin(caller.getType())) { - if (domainId != null) { - DomainVO domain = _domainDao.findById(domainId); - if (domain == null) { - throw new InvalidParameterValueException("Domain id=" + domainId + " doesn't exist in the system"); - } - - _accountMgr.checkAccess(caller, domain); - - if (accountName != null) { - Account owner = _accountMgr.getActiveAccountByName(accountName, domainId); - if (owner == null) { - throw new InvalidParameterValueException("Unable to find account " + accountName + " in domain " + domainId); - } - accountId = owner.getId(); - } - } - else { //domainId == null - if (accountName != null) { - throw new InvalidParameterValueException("could not find account " + accountName + " because domain is not specified"); - } - - } - } else { - if (accountName != null && !accountName.equals(caller.getAccountName())) { - throw new PermissionDeniedException("Can't list account " + accountName + " projects; unauthorized"); - } - - if (domainId != null && domainId.equals(caller.getDomainId())) { - throw new PermissionDeniedException("Can't list domain id= " + domainId + " projects; unauthorized"); - } - - accountId = caller.getId(); - } - - if (domainId == null && accountId == null && (caller.getType() == Account.ACCOUNT_TYPE_NORMAL || !listAll)) { - accountId = caller.getId(); - } else if (caller.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN || (isRecursive && !listAll)) { - DomainVO domain = _domainDao.findById(caller.getDomainId()); - path = domain.getPath(); - } - - if (path != null) { - sb.and("domainPath", sb.entity().getDomainPath(), SearchCriteria.Op.LIKE); - } - - if (accountId != null) { - sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.EQ); - } - - if (tags != null && !tags.isEmpty()) { - for (int count=0; count < tags.size(); count++) { - sb.or().op("key" + String.valueOf(count), sb.entity().getTagKey(), SearchCriteria.Op.EQ); - sb.and("value" + String.valueOf(count), sb.entity().getTagValue(), SearchCriteria.Op.EQ); - sb.cp(); - } - } - - - SearchCriteria sc = sb.create(); - - if (id != null) { - sc.addAnd("id", Op.EQ, id); - } - - if (domainId != null && !isRecursive) { - sc.addAnd("domainId", Op.EQ, domainId); - } - - if (name != null) { - sc.addAnd("name", Op.EQ, name); - } - - if (displayText != null) { - sc.addAnd("displayText", Op.EQ, displayText); - } - - if (accountId != null) { - sc.setParameters("accountId", accountId); - } - - if (state != null) { - sc.addAnd("state", Op.EQ, state); - } - - if (keyword != null) { - SearchCriteria ssc = _projectJoinDao.createSearchCriteria(); - ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("displayText", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - sc.addAnd("name", SearchCriteria.Op.SC, ssc); - } - - if (path != null) { - sc.setParameters("domainPath", path); - } - - if (tags != null && !tags.isEmpty()) { - int count = 0; - for (String key : tags.keySet()) { - sc.setParameters("key" + String.valueOf(count), key); - sc.setParameters("value" + String.valueOf(count), tags.get(key)); - count++; - } - } - - // search distinct projects to get count - Pair, Integer> uniquePrjPair = _projectJoinDao.searchAndCount(sc, searchFilter); - Integer count = uniquePrjPair.second(); - if ( count.intValue() == 0 ){ - // handle empty result cases - return uniquePrjPair; - } - List uniquePrjs = uniquePrjPair.first(); - Long[] prjIds = new Long[uniquePrjs.size()]; - int i = 0; - for (ProjectJoinVO v : uniquePrjs ){ - prjIds[i++] = v.getId(); - } - List prjs = _projectJoinDao.searchByIds(prjIds); - return new Pair, Integer>(prjs, count); + public long getInvitationTimeout() { + return _invitationTimeOut; } + @Override public ProjectAccount assignAccountToProject(Project project, long accountId, ProjectAccount.Role accountRole) { return _projectAccountDao.persist(new ProjectAccountVO(project, accountId, accountRole)); @@ -769,46 +642,7 @@ public class ProjectManagerImpl implements ProjectManager, Manager{ } - @Override - public Pair, Integer> listProjectAccounts(long projectId, String accountName, String role, Long startIndex, Long pageSizeVal) { - Account caller = UserContext.current().getCaller(); - //check that the project exists - Project project = getProject(projectId); - - if (project == null) { - throw new InvalidParameterValueException("Unable to find the project id=" + projectId); - } - - //verify permissions - only accounts belonging to the project can list project's account - if (!_accountMgr.isAdmin(caller.getType()) && _projectAccountDao.findByProjectIdAccountId(projectId, caller.getAccountId()) == null) { - throw new PermissionDeniedException("Account " + caller + " is not authorized to list users of the project id=" + projectId); - } - - Filter searchFilter = new Filter(ProjectAccountJoinVO.class, "id", false, startIndex, pageSizeVal); - SearchBuilder sb = _projectAccountJoinDao.createSearchBuilder(); - sb.and("accountRole", sb.entity().getAccountRole(), Op.EQ); - sb.and("projectId", sb.entity().getProjectId(), Op.EQ); - - SearchBuilder accountSearch; - if (accountName != null) { - sb.and("accountName", sb.entity().getAccountName(), Op.EQ); - } - - SearchCriteria sc = sb.create(); - - sc.setParameters("projectId", projectId); - - if (role != null) { - sc.setParameters("accountRole", role); - } - - if (accountName != null) { - sc.setParameters("accountName", accountName); - } - - return _projectAccountJoinDao.searchAndCount(sc, searchFilter); - } public ProjectInvitation createAccountInvitation(Project project, Long accountId) { if (activeInviteExists(project, accountId, null)) { @@ -878,51 +712,7 @@ public class ProjectManagerImpl implements ProjectManager, Manager{ return _projectInvitationDao.update(invite.getId(), invite); } - @Override - public Pair, Integer> listProjectInvitations(Long id, Long projectId, - String accountName, Long domainId, String state, boolean activeOnly, Long startIndex, Long pageSizeVal, boolean isRecursive, boolean listAll) { - Account caller = UserContext.current().getCaller(); - List permittedAccounts = new ArrayList(); - Ternary domainIdRecursiveListProject = new Ternary(domainId, isRecursive, null); - _accountMgr.buildACLSearchParameters(caller, id, accountName, projectId, permittedAccounts, domainIdRecursiveListProject, listAll, true); - domainId = domainIdRecursiveListProject.first(); - isRecursive = domainIdRecursiveListProject.second(); - ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); - - Filter searchFilter = new Filter(ProjectInvitationJoinVO.class, "id", true, startIndex, pageSizeVal); - SearchBuilder sb = _projectInvitationJoinDao.createSearchBuilder(); - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - sb.and("projectId", sb.entity().getProjectId(), SearchCriteria.Op.EQ); - sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); - sb.and("created", sb.entity().getCreated(), SearchCriteria.Op.GT); - sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); - - SearchCriteria sc = sb.create(); - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - - if (projectId != null){ - sc.setParameters("projectId", projectId); - } - - if (state != null) { - sc.setParameters("state", state); - } - - if (id != null) { - sc.setParameters("id", id); - } - - if (activeOnly) { - sc.setParameters("state", ProjectInvitation.State.Pending); - sc.setParameters("created", new Date((DateUtil.currentGMTTime().getTime()) - _invitationTimeOut)); - } - - return _projectInvitationJoinDao.searchAndCount(sc, searchFilter); - - } @Override @DB @ActionEvent(eventType = EventTypes.EVENT_PROJECT_INVITATION_UPDATE, eventDescription = "updating project invitation", async=true) diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index a196cd35769..ddf91dc3500 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -95,12 +95,15 @@ import org.apache.cloudstack.api.command.admin.systemvm.StopSystemVmCmd; import org.apache.cloudstack.api.command.admin.domain.UpdateDomainCmd; import org.apache.cloudstack.api.command.admin.host.UpdateHostPasswordCmd; import com.cloud.api.commands.UpdateTemplateOrIsoCmd; +import com.cloud.api.query.dao.DomainRouterJoinDao; +import com.cloud.api.query.dao.InstanceGroupJoinDao; +import com.cloud.api.query.vo.DomainRouterJoinVO; +import com.cloud.api.query.vo.EventJoinVO; +import com.cloud.api.query.vo.InstanceGroupJoinVO; + import org.apache.cloudstack.api.command.user.vmgroup.UpdateVMGroupCmd; import org.apache.cloudstack.api.command.admin.resource.UploadCustomCertificateCmd; import org.apache.cloudstack.api.response.ExtractResponse; -import org.apache.cloudstack.api.view.vo.DomainRouterJoinVO; -import org.apache.cloudstack.api.view.vo.EventJoinVO; -import org.apache.cloudstack.api.view.vo.InstanceGroupJoinVO; import com.cloud.async.AsyncJob; import com.cloud.async.AsyncJobExecutor; @@ -262,9 +265,7 @@ import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.VirtualMachineProfileImpl; import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.DomainRouterDao; -import com.cloud.vm.dao.DomainRouterJoinDao; import com.cloud.vm.dao.InstanceGroupDao; -import com.cloud.vm.dao.InstanceGroupJoinDao; import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.SecondaryStorageVmDao; import com.cloud.vm.dao.UserVmDao; @@ -1548,221 +1549,8 @@ public class ManagementServerImpl implements ManagementServer { return _templateDao.findById(id); } - @Override - public Pair, Integer> searchForEvents(ListEventsCmd cmd) { - Account caller = UserContext.current().getCaller(); - List permittedAccounts = new ArrayList(); - Long id = cmd.getId(); - String type = cmd.getType(); - String level = cmd.getLevel(); - Date startDate = cmd.getStartDate(); - Date endDate = cmd.getEndDate(); - String keyword = cmd.getKeyword(); - Integer entryTime = cmd.getEntryTime(); - Integer duration = cmd.getDuration(); - Ternary domainIdRecursiveListProject = new Ternary( - cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, - cmd.listAll(), false); - Long domainId = domainIdRecursiveListProject.first(); - Boolean isRecursive = domainIdRecursiveListProject.second(); - ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); - - Filter searchFilter = new Filter(EventJoinVO.class, "createDate", false, cmd.getStartIndex(), cmd.getPageSizeVal()); - SearchBuilder sb = _eventJoinDao.createSearchBuilder(); - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); - sb.and("levelL", sb.entity().getLevel(), SearchCriteria.Op.LIKE); - sb.and("levelEQ", sb.entity().getLevel(), SearchCriteria.Op.EQ); - sb.and("type", sb.entity().getType(), SearchCriteria.Op.EQ); - sb.and("createDateB", sb.entity().getCreateDate(), SearchCriteria.Op.BETWEEN); - sb.and("createDateG", sb.entity().getCreateDate(), SearchCriteria.Op.GTEQ); - sb.and("createDateL", sb.entity().getCreateDate(), SearchCriteria.Op.LTEQ); - sb.and("state", sb.entity().getState(), SearchCriteria.Op.NEQ); - sb.and("startId", sb.entity().getStartId(), SearchCriteria.Op.EQ); - sb.and("createDate", sb.entity().getCreateDate(), SearchCriteria.Op.BETWEEN); - - SearchCriteria sc = sb.create(); - // building ACL condition - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - if (id != null) { - sc.setParameters("id", id); - } - - if (keyword != null) { - SearchCriteria ssc = _eventJoinDao.createSearchCriteria(); - ssc.addOr("type", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("level", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - sc.addAnd("level", SearchCriteria.Op.SC, ssc); - } - - if (level != null) { - sc.setParameters("levelEQ", level); - } - - if (type != null) { - sc.setParameters("type", type); - } - - if (startDate != null && endDate != null) { - sc.setParameters("createDateB", startDate, endDate); - } else if (startDate != null) { - sc.setParameters("createDateG", startDate); - } else if (endDate != null) { - sc.setParameters("createDateL", endDate); - } - - Pair, Integer> eventPair = null; - // event_view will not have duplicate rows for each event, so searchAndCount should be good enough. - if ((entryTime != null) && (duration != null)) { - // TODO: waiting for response from dev list, logic is mystery to - // me!! - /* - * if (entryTime <= duration) { throw new - * InvalidParameterValueException - * ("Entry time must be greater than duration"); } Calendar calMin = - * Calendar.getInstance(); Calendar calMax = Calendar.getInstance(); - * calMin.add(Calendar.SECOND, -entryTime); - * calMax.add(Calendar.SECOND, -duration); Date minTime = - * calMin.getTime(); Date maxTime = calMax.getTime(); - * - * sc.setParameters("state", com.cloud.event.Event.State.Completed); - * sc.setParameters("startId", 0); sc.setParameters("createDate", - * minTime, maxTime); List startedEvents = - * _eventJoinDao.searchAllEvents(sc, searchFilter); - * List pendingEvents = new ArrayList(); - * for (EventVO event : startedEvents) { EventVO completedEvent = - * _eventDao.findCompletedEvent(event.getId()); if (completedEvent - * == null) { pendingEvents.add(event); } } return pendingEvents; - */ - } else { - eventPair = _eventJoinDao.searchAndCount(sc, searchFilter); - } - return eventPair; - - } - - @Override - public Pair, Integer> searchForRouters(ListRoutersCmd cmd) { - Long id = cmd.getId(); - String name = cmd.getRouterName(); - String state = cmd.getState(); - Long zone = cmd.getZoneId(); - Long pod = cmd.getPodId(); - Long hostId = cmd.getHostId(); - String keyword = cmd.getKeyword(); - Long networkId = cmd.getNetworkId(); - Long vpcId = cmd.getVpcId(); - Boolean forVpc = cmd.getForVpc(); - - Account caller = UserContext.current().getCaller(); - List permittedAccounts = new ArrayList(); - - Ternary domainIdRecursiveListProject = new Ternary( - cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, - cmd.listAll(), false); - Long domainId = domainIdRecursiveListProject.first(); - Boolean isRecursive = domainIdRecursiveListProject.second(); - ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); - // no default orderBy - // Filter searchFilter = new Filter(DomainRouterJoinVO.class, "id", - // true, cmd.getStartIndex(), cmd.getPageSizeVal()); - Filter searchFilter = new Filter(DomainRouterJoinVO.class, null, true, cmd.getStartIndex(), cmd.getPageSizeVal()); - SearchBuilder sb = _routerJoinDao.createSearchBuilder(); - sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct - // ids to get - // number of - // records with - // pagination - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - sb.and("name", sb.entity().getHostName(), SearchCriteria.Op.LIKE); - sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); - sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.IN); - sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); - sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); - sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); - sb.and("hostId", sb.entity().getHostId(), SearchCriteria.Op.EQ); - sb.and("vpcId", sb.entity().getVpcId(), SearchCriteria.Op.EQ); - - if (forVpc != null) { - if (forVpc) { - sb.and("forVpc", sb.entity().getVpcId(), SearchCriteria.Op.NNULL); - } else { - sb.and("forVpc", sb.entity().getVpcId(), SearchCriteria.Op.NULL); - } - } - - if (networkId != null) { - sb.and("networkId", sb.entity().getNetworkId(), SearchCriteria.Op.EQ); - } - - SearchCriteria sc = sb.create(); - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - if (keyword != null) { - SearchCriteria ssc = _routerJoinDao.createSearchCriteria(); - ssc.addOr("hostName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("instanceName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("state", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - - sc.addAnd("hostName", SearchCriteria.Op.SC, ssc); - } - - if (name != null) { - sc.setParameters("name", "%" + name + "%"); - } - - if (id != null) { - sc.setParameters("id", id); - } - - if (state != null) { - sc.setParameters("state", state); - } - - if (zone != null) { - sc.setParameters("dataCenterId", zone); - } - - if (pod != null) { - sc.setParameters("podId", pod); - } - - if (hostId != null) { - sc.setParameters("hostId", hostId); - } - - if (networkId != null) { - sc.setJoinParameters("nicSearch", "networkId", networkId); - } - - if (vpcId != null) { - sc.setParameters("vpcId", vpcId); - } - - // search VR details by ids - Pair, Integer> uniqueVrPair = _routerJoinDao.searchAndCount(sc, searchFilter); - Integer count = uniqueVrPair.second(); - if (count.intValue() == 0) { - // empty result - return uniqueVrPair; - } - List uniqueVrs = uniqueVrPair.first(); - Long[] vrIds = new Long[uniqueVrs.size()]; - int i = 0; - for (DomainRouterJoinVO v : uniqueVrs) { - vrIds[i++] = v.getId(); - } - List vrs = _routerJoinDao.searchByIds(vrIds); - return new Pair, Integer>(vrs, count); - } @Override public Pair, Integer> searchForIPAddresses(ListPublicIpAddressesCmd cmd) { @@ -3209,53 +2997,7 @@ public class ManagementServerImpl implements ManagementServer { return _vmGroupDao.findById(groupId); } - @Override - public Pair, Integer> searchForVmGroups(ListVMGroupsCmd cmd) { - Long id = cmd.getId(); - String name = cmd.getGroupName(); - String keyword = cmd.getKeyword(); - Account caller = UserContext.current().getCaller(); - List permittedAccounts = new ArrayList(); - - Ternary domainIdRecursiveListProject = new Ternary( - cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, - cmd.listAll(), false); - Long domainId = domainIdRecursiveListProject.first(); - Boolean isRecursive = domainIdRecursiveListProject.second(); - ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); - - Filter searchFilter = new Filter(InstanceGroupJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); - - SearchBuilder sb = _vmGroupJoinDao.createSearchBuilder(); - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - - sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); - sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); - - - SearchCriteria sc = sb.create(); - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - if (keyword != null) { - SearchCriteria ssc = _vmGroupJoinDao.createSearchCriteria(); - ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - sc.addAnd("name", SearchCriteria.Op.SC, ssc); - } - - - if (id != null) { - sc.setParameters("id", id); - } - - if (name != null) { - sc.setParameters("name", "%" + name + "%"); - } - - return _vmGroupJoinDao.searchAndCount(sc, searchFilter); - } @Override public String getVersion() { diff --git a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java index 0f82142d6b5..42d3c8332da 100644 --- a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java +++ b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java @@ -27,7 +27,9 @@ import javax.naming.ConfigurationException; import org.apache.cloudstack.api.command.user.tag.ListTagsCmd; import org.apache.log4j.Logger; -import org.apache.cloudstack.api.view.vo.ResourceTagJoinVO; + +import com.cloud.api.query.dao.ResourceTagJoinDao; +import com.cloud.api.query.vo.ResourceTagJoinVO; import com.cloud.domain.Domain; import com.cloud.event.ActionEvent; import com.cloud.event.EventTypes; @@ -51,7 +53,6 @@ import com.cloud.storage.dao.SnapshotDao; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.tags.dao.ResourceTagDao; -import com.cloud.tags.dao.ResourceTagJoinDao; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.DomainManager; @@ -325,71 +326,6 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager return identiyUUId; } - @Override - public Pair, Integer> listTags(ListTagsCmd cmd) { - Account caller = UserContext.current().getCaller(); - List permittedAccounts = new ArrayList(); - String key = cmd.getKey(); - String value = cmd.getValue(); - String resourceId = cmd.getResourceId(); - String resourceType = cmd.getResourceType(); - String customerName = cmd.getCustomer(); - boolean listAll = cmd.listAll(); - - Ternary domainIdRecursiveListProject = - new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); - - _accountMgr.buildACLSearchParameters(caller, null, cmd.getAccountName(), - cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, false); - Long domainId = domainIdRecursiveListProject.first(); - Boolean isRecursive = domainIdRecursiveListProject.second(); - ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); - Filter searchFilter = new Filter(ResourceTagJoinVO.class, "resourceType", false, cmd.getStartIndex(), cmd.getPageSizeVal()); - - SearchBuilder sb = _resourceTagJoinDao.createSearchBuilder(); - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - sb.and("key", sb.entity().getKey(), SearchCriteria.Op.EQ); - sb.and("value", sb.entity().getValue(), SearchCriteria.Op.EQ); - - if (resourceId != null) { - sb.and().op("resourceId", sb.entity().getResourceId(), SearchCriteria.Op.EQ); - sb.or("resourceUuid", sb.entity().getResourceUuid(), SearchCriteria.Op.EQ); - sb.cp(); - } - - sb.and("resourceType", sb.entity().getResourceType(), SearchCriteria.Op.EQ); - sb.and("customer", sb.entity().getCustomer(), SearchCriteria.Op.EQ); - - // now set the SC criteria... - SearchCriteria sc = sb.create(); - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - if (key != null) { - sc.setParameters("key", key); - } - - if (value != null) { - sc.setParameters("value", value); - } - - if (resourceId != null) { - sc.setParameters("resourceId", resourceId); - sc.setParameters("resourceUuid", resourceId); - } - - if (resourceType != null) { - sc.setParameters("resourceType", resourceType); - } - - if (customerName != null) { - sc.setParameters("customer", customerName); - } - - Pair, Integer> result = _resourceTagJoinDao.searchAndCount(sc, searchFilter); - return result; - } - @Override @DB @ActionEvent(eventType = EventTypes.EVENT_TAGS_DELETE, eventDescription = "deleting resource tags") diff --git a/server/src/com/cloud/user/AccountManager.java b/server/src/com/cloud/user/AccountManager.java index 56a2394d3c6..3e5e1764281 100755 --- a/server/src/com/cloud/user/AccountManager.java +++ b/server/src/com/cloud/user/AccountManager.java @@ -20,7 +20,7 @@ import java.util.List; import java.util.Map; import com.cloud.acl.ControlledEntity; -import org.apache.cloudstack.api.view.vo.ControlledViewEntity; +import com.cloud.api.query.vo.ControlledViewEntity; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.projects.Project.ListProjectResourcesCriteria; diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java index e1b806dc603..593d2950e97 100755 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -36,19 +36,19 @@ import javax.crypto.spec.SecretKeySpec; import javax.ejb.Local; import javax.naming.ConfigurationException; -import org.apache.cloudstack.api.command.admin.user.*; import org.apache.cloudstack.api.command.admin.account.UpdateAccountCmd; import org.apache.cloudstack.api.command.admin.user.RegisterCmd; import org.apache.commons.codec.binary.Base64; import org.apache.log4j.Logger; import com.cloud.acl.ControlledEntity; -import org.apache.cloudstack.api.view.vo.ControlledViewEntity; -import org.apache.cloudstack.api.view.vo.UserAccountJoinVO; import com.cloud.acl.SecurityChecker; import com.cloud.acl.SecurityChecker.AccessType; import com.cloud.api.ApiDBUtils; +import com.cloud.api.query.vo.ControlledViewEntity; + + import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd; import org.apache.cloudstack.api.command.user.account.ListAccountsCmd; import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd; @@ -763,6 +763,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag // ////////////// API commands ///////////////////// // /////////////////////////////////////////////////// + @Override @DB @ActionEvent(eventType = EventTypes.EVENT_ACCOUNT_CREATE, eventDescription = "creating Account") @@ -2140,101 +2141,6 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag return new Pair, Integer>(result.first(), result.second()); } - @Override - public Pair, Integer> searchForUsers(ListUsersCmd cmd) throws PermissionDeniedException { - Account caller = UserContext.current().getCaller(); - - //TODO: Integrate with ACL checkAccess refactoring - Long domainId = cmd.getDomainId(); - if (domainId != null) { - Domain domain = _domainDao.findById(domainId); - if (domain == null) { - throw new InvalidParameterValueException("Unable to find domain by id=" + domainId); - } - - checkAccess(caller, domain); - } else { - // default domainId to the caller's domain - domainId = caller.getDomainId(); - } - - Filter searchFilter = new Filter(UserAccountJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); - - Long id = cmd.getId(); - Object username = cmd.getUsername(); - Object type = cmd.getAccountType(); - Object accountName = cmd.getAccountName(); - Object state = cmd.getState(); - Object keyword = cmd.getKeyword(); - - SearchBuilder sb = _userAccountJoinDao.createSearchBuilder(); - sb.and("username", sb.entity().getUsername(), SearchCriteria.Op.LIKE); - if (id != null && id == 1) { - // system user should NOT be searchable - List emptyList = new ArrayList(); - return new Pair, Integer>(emptyList, 0); - } else if (id != null) { - sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); - } else { - // this condition is used to exclude system user from the search results - sb.and("id", sb.entity().getId(), SearchCriteria.Op.NEQ); - } - - sb.and("type", sb.entity().getAccountType(), SearchCriteria.Op.EQ); - sb.and("domainId", sb.entity().getDomainId(), SearchCriteria.Op.EQ); - sb.and("accountName", sb.entity().getAccountName(), SearchCriteria.Op.EQ); - sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); - - if ((accountName == null) && (domainId != null)) { - sb.and("domainPath", sb.entity().getDomainPath(), SearchCriteria.Op.LIKE); - } - - SearchCriteria sc = sb.create(); - if (keyword != null) { - SearchCriteria ssc = _userAccountJoinDao.createSearchCriteria(); - ssc.addOr("username", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("firstname", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("lastname", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("email", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("state", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("accountName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("type", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("accountState", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - - sc.addAnd("username", SearchCriteria.Op.SC, ssc); - } - - if (username != null) { - sc.setParameters("username", username); - } - - if (id != null) { - sc.setParameters("id", id); - } else { - // Don't return system user, search builder with NEQ - sc.setParameters("id", 1); - } - - if (type != null) { - sc.setParameters("type", type); - } - - if (accountName != null) { - sc.setParameters("accountName", accountName); - if (domainId != null) { - sc.setParameters("domainId", domainId); - } - } else if (domainId != null) { - DomainVO domainVO = _domainDao.findById(domainId); - sc.setParameters("domainPath", domainVO.getPath() + "%"); - } - - if (state != null) { - sc.setParameters("state", state); - } - - return _userAccountJoinDao.searchAndCount(sc, searchFilter); - } @Override public void buildACLSearchBuilder(SearchBuilder sb, diff --git a/server/src/com/cloud/user/dao/UserAccountJoinDao.java b/server/src/com/cloud/user/dao/UserAccountJoinDao.java index 39a82d05c74..0072d33c3ae 100644 --- a/server/src/com/cloud/user/dao/UserAccountJoinDao.java +++ b/server/src/com/cloud/user/dao/UserAccountJoinDao.java @@ -19,8 +19,8 @@ package com.cloud.user.dao; import java.util.List; import org.apache.cloudstack.api.response.UserResponse; -import org.apache.cloudstack.api.view.vo.UserAccountJoinVO; +import com.cloud.api.query.vo.UserAccountJoinVO; import com.cloud.user.User; import com.cloud.user.UserAccount; import com.cloud.utils.db.GenericDao; diff --git a/server/src/com/cloud/user/dao/UserAccountJoinDaoImpl.java b/server/src/com/cloud/user/dao/UserAccountJoinDaoImpl.java index e854ae5c493..4cad00b4cd7 100644 --- a/server/src/com/cloud/user/dao/UserAccountJoinDaoImpl.java +++ b/server/src/com/cloud/user/dao/UserAccountJoinDaoImpl.java @@ -24,10 +24,11 @@ import org.apache.log4j.Logger; import com.cloud.api.ApiDBUtils; import com.cloud.api.ApiResponseHelper; +import com.cloud.api.query.vo.InstanceGroupJoinVO; +import com.cloud.api.query.vo.UserAccountJoinVO; + import org.apache.cloudstack.api.response.InstanceGroupResponse; import org.apache.cloudstack.api.response.UserResponse; -import org.apache.cloudstack.api.view.vo.InstanceGroupJoinVO; -import org.apache.cloudstack.api.view.vo.UserAccountJoinVO; import com.cloud.user.Account; import com.cloud.user.User; diff --git a/server/src/com/cloud/vm/UserVmManager.java b/server/src/com/cloud/vm/UserVmManager.java index f58b10e3034..3e4a2dbf27f 100755 --- a/server/src/com/cloud/vm/UserVmManager.java +++ b/server/src/com/cloud/vm/UserVmManager.java @@ -21,7 +21,7 @@ import java.util.List; import java.util.Map; import com.cloud.agent.api.VmStatsEntry; -import org.apache.cloudstack.api.view.vo.UserVmJoinVO; +import com.cloud.api.query.vo.UserVmJoinVO; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index a8241d02ea7..6608987ee5a 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -5,7 +5,7 @@ // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at -// +// // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, @@ -63,6 +63,9 @@ import com.cloud.agent.api.to.VolumeTO; import com.cloud.agent.manager.Commands; import com.cloud.alert.AlertManager; import com.cloud.api.ApiDBUtils; +import com.cloud.api.query.dao.UserVmJoinDao; +import com.cloud.api.query.vo.UserVmJoinVO; + import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.command.admin.vm.AssignVMCmd; import org.apache.cloudstack.api.command.user.vm.DeployVMCmd; @@ -74,7 +77,6 @@ import org.apache.cloudstack.api.command.user.vm.ResetVMPasswordCmd; import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd; import org.apache.cloudstack.api.command.user.vm.UpdateVMCmd; import org.apache.cloudstack.api.command.user.vm.UpgradeVMCmd; -import org.apache.cloudstack.api.view.vo.UserVmJoinVO; import com.cloud.async.AsyncJobExecutor; import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobVO; @@ -230,7 +232,6 @@ import com.cloud.vm.dao.InstanceGroupVMMapDao; import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.UserVmDetailsDao; -import com.cloud.vm.dao.UserVmJoinDao; import com.cloud.vm.dao.VMInstanceDao; @Local(value = { UserVmManager.class, UserVmService.class }) @@ -337,9 +338,9 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager protected HypervisorCapabilitiesDao _hypervisorCapabilitiesDao; @Inject protected SecurityGroupDao _securityGroupDao; - @Inject + @Inject protected CapacityManager _capacityMgr;; - @Inject + @Inject protected VMInstanceDao _vmInstanceDao; @Inject protected ResourceLimitService _resourceLimitMgr; @@ -349,7 +350,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager protected ProjectManager _projectMgr; @Inject protected ResourceManager _resourceMgr; - @Inject + @Inject protected NetworkServiceMapDao _ntwkSrvcDao; @Inject SecurityGroupVMMapDao _securityGroupVMMapDao; @@ -414,7 +415,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (result) { userVm.setPassword(password); - //update the password in vm_details table too + //update the password in vm_details table too // Check if an SSH key pair was selected for the instance and if so use it to encrypt & save the vm password String sshPublicKey = userVm.getDetail("SSH.PublicKey"); if (sshPublicKey != null && !sshPublicKey.equals("") && password != null && !password.equals("saved_password")) { @@ -457,7 +458,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager UserDataServiceProvider element = _networkMgr.getPasswordResetProvider(defaultNetwork); if (element == null) { - throw new CloudRuntimeException("Can't find network element for " + Service.UserData.getName() + + throw new CloudRuntimeException("Can't find network element for " + Service.UserData.getName() + " provider needed for password reset"); } @@ -473,7 +474,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager return true; } - if (rebootVirtualMachine(userId, vmId) == null) { + if (rebootVirtualMachine(userId, vmId) == null) { s_logger.warn("Failed to reboot the vm " + vmInstance); return false; } else { @@ -688,7 +689,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } // Check that there is some shared storage. - StoragePoolVO vmRootVolumePool = _storagePoolDao.findById(rootVolumeOfVm.getPoolId()); + StoragePoolVO vmRootVolumePool = _storagePoolDao.findById(rootVolumeOfVm.getPoolId()); List sharedVMPools = _storagePoolDao.findPoolsByTags(vmRootVolumePool.getDataCenterId(), vmRootVolumePool.getPodId(), vmRootVolumePool.getClusterId(), null, true); if (sharedVMPools.size() == 0) { throw new CloudRuntimeException("Cannot attach volume since there are no shared storage pools in the VM's cluster to copy the uploaded volume to."); @@ -1381,7 +1382,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } volume = _volsDao.findById(snapshot.getVolumeId()); - VolumeVO snapshotVolume = _volsDao.findByIdIncludingRemoved(snapshot.getVolumeId()); + VolumeVO snapshotVolume = _volsDao.findByIdIncludingRemoved(snapshot.getVolumeId()); //check permissions _accountMgr.checkAccess(caller, null, true, snapshot); @@ -1390,14 +1391,14 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager throw new InvalidParameterValueException("Snapshot id=" + snapshotId + " is not in " + Snapshot.Status.BackedUp + " state yet and can't be used for template creation"); } - /* + /* // bug #11428. Operation not supported if vmware and snapshots parent volume = ROOT - if(snapshot.getHypervisorType() == HypervisorType.VMware && snapshotVolume.getVolumeType() == Type.DATADISK){ + if(snapshot.getHypervisorType() == HypervisorType.VMware && snapshotVolume.getVolumeType() == Type.DATADISK){ throw new UnsupportedServiceException("operation not supported, snapshot with id " + snapshotId + " is created from Data Disk"); } */ - hyperType = snapshot.getHypervisorType(); + hyperType = snapshot.getHypervisorType(); } _resourceLimitMgr.checkResourceLimit(templateOwner, ResourceType.template); @@ -2190,7 +2191,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager throw new InvalidParameterValueException("Can't create a vm with multiple networks one of" + " which is Security Group enabled"); } - + isSecurityGroupEnabledNetworkUsed = true; } @@ -2213,7 +2214,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager // if network is security group enabled, and no security group is specified, then add the default security group automatically if (isSecurityGroupEnabledNetworkUsed && !isVmWare && _networkMgr.canAddDefaultSecurityGroup()) { - + //add the default securityGroup only if no security group is specified if(securityGroupIdList == null || securityGroupIdList.isEmpty()){ if (securityGroupIdList == null) { @@ -2276,7 +2277,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager throw new InvalidParameterValueException("Unable to find physical network with id: "+physicalNetworkId + " and tag: " +requiredOfferings.get(0).getTags()); } s_logger.debug("Creating network for account " + owner + " from the network offering id=" +requiredOfferings.get(0).getId() + " as a part of deployVM process"); - Network newNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), + Network newNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), owner.getAccountName() + "-network", owner.getAccountName() + "-network", null, null, null, null, owner, null, physicalNetwork, zone.getId(), ACLType.Account, null, null); defaultNetwork = _networkDao.findById(newNetwork.getId()); @@ -2286,7 +2287,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager defaultNetwork = virtualNetworks.get(0); } } else { - throw new InvalidParameterValueException("Required network offering id=" + requiredOfferings.get(0).getId() + " is not in " + NetworkOffering.State.Enabled); + throw new InvalidParameterValueException("Required network offering id=" + requiredOfferings.get(0).getId() + " is not in " + NetworkOffering.State.Enabled); } networkList.add(defaultNetwork); @@ -2310,10 +2311,10 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } } - + _networkMgr.checkNetworkPermissions(owner, network); - //don't allow to use system networks + //don't allow to use system networks NetworkOffering networkOffering = _configMgr.getNetworkOffering(network.getNetworkOfferingId()); if (networkOffering.isSystemOnly()) { throw new InvalidParameterValueException("Network id=" + networkId + " is system only and can't be used for vm deployment"); @@ -2534,7 +2535,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager ntwkIds.add(network.getId()); ntwkDomains.put(ntwkDomain, ntwkIds); } - } + } for (String ntwkDomain : ntwkDomains.keySet()) { for (Long ntwkId : ntwkDomains.get(ntwkDomain)) { @@ -2543,7 +2544,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager //* verify that there are no duplicates if (hostNames.contains(hostName)) { throw new InvalidParameterValueException("The vm with hostName " + hostName - + " already exists in the network domain: " + ntwkDomain + "; network=" + + " already exists in the network domain: " + ntwkDomain + "; network=" + _networkMgr.getNetwork(ntwkId)); } } @@ -2884,7 +2885,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (callerAccount != null && callerAccount.getRemoved() != null) { throw new InvalidParameterValueException("The account " + callerAccount.getId() + " is removed"); } - + UserVmVO vm = _vmDao.findById(vmId); if (vm == null) { throw new InvalidParameterValueException("unable to find a virtual machine with id " + vmId); @@ -2972,12 +2973,12 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } vm = _itMgr.start(vm, params, callerUser, callerAccount, plan); - + Pair> vmParamPair = new Pair(vm, params); if (vm != null && vm.isUpdateParameters()) { // this value is not being sent to the backend; need only for api display purposes if (template.getEnablePassword()) { - vm.setPassword((String)vmParamPair.second().get(VirtualMachineProfile.Param.VmPassword)); + vm.setPassword((String)vmParamPair.second().get(VirtualMachineProfile.Param.VmPassword)); vm.setUpdateParameters(false); _vmDao.update(vm.getId(), vm); } @@ -2997,7 +2998,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find a virtual machine with specified vmId"); ex.addProxyObject(vm, vmId, "vmId"); throw ex; - } + } if (vm.getState() == State.Destroyed || vm.getState() == State.Expunging) { s_logger.trace("Vm id=" + vmId + " is already destroyed"); @@ -3040,61 +3041,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } } - @Override - public Pair, Integer> searchForUserVMs(ListVMsCmd cmd) { - Account caller = UserContext.current().getCaller(); - List permittedAccounts = new ArrayList(); - String hypervisor = cmd.getHypervisor(); - boolean listAll = cmd.listAll(); - Long id = cmd.getId(); - Map tags = cmd.getTags(); - Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, false); - Long domainId = domainIdRecursiveListProject.first(); - Boolean isRecursive = domainIdRecursiveListProject.second(); - ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); - - // removing order by, orderBy shouold be specified in ListVMsCmd parameters - //Criteria c = new Criteria("id", Boolean.TRUE, cmd.getStartIndex(), cmd.getPageSizeVal()); - Criteria c = new Criteria(null, Boolean.FALSE, cmd.getStartIndex(), cmd.getPageSizeVal()); - c.addCriteria(Criteria.KEYWORD, cmd.getKeyword()); - c.addCriteria(Criteria.ID, cmd.getId()); - c.addCriteria(Criteria.NAME, cmd.getInstanceName()); - c.addCriteria(Criteria.STATE, cmd.getState()); - c.addCriteria(Criteria.DATACENTERID, cmd.getZoneId()); - c.addCriteria(Criteria.GROUPID, cmd.getGroupId()); - c.addCriteria(Criteria.FOR_VIRTUAL_NETWORK, cmd.getForVirtualNetwork()); - c.addCriteria(Criteria.NETWORKID, cmd.getNetworkId()); - c.addCriteria(Criteria.TEMPLATE_ID, cmd.getTemplateId()); - c.addCriteria(Criteria.ISO_ID, cmd.getIsoId()); - c.addCriteria(Criteria.VPC_ID, cmd.getVpcId()); - - if (domainId != null) { - c.addCriteria(Criteria.DOMAINID, domainId); - } - - if (HypervisorType.getType(hypervisor) != HypervisorType.None) { - c.addCriteria(Criteria.HYPERVISOR, hypervisor); - } else if (hypervisor != null) { - throw new InvalidParameterValueException("Invalid HypervisorType " + hypervisor); - } - - // ignore these search requests if it's not an admin - if (_accountMgr.isAdmin(caller.getType())) { - c.addCriteria(Criteria.PODID, cmd.getPodId()); - c.addCriteria(Criteria.HOSTID, cmd.getHostId()); - c.addCriteria(Criteria.STORAGE_ID, cmd.getStorageId()); - } - - if (!permittedAccounts.isEmpty()) { - c.addCriteria(Criteria.ACCOUNTID, permittedAccounts.toArray()); - } - c.addCriteria(Criteria.ISADMIN, _accountMgr.isAdmin(caller.getType())); - - return searchForUserVMs(c, caller, domainId, isRecursive, - permittedAccounts, listAll, listProjectResourcesCriteria, tags); - } @Override public Pair, Integer> searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, @@ -3105,7 +3052,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager SearchBuilder sb = _vmJoinDao.createSearchBuilder(); sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct ids _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - + Object id = c.getCriteria(Criteria.ID); Object name = c.getCriteria(Criteria.NAME); Object state = c.getCriteria(Criteria.STATE); @@ -3155,7 +3102,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (networkId != null) { sb.and("networkId", sb.entity().getNetworkId(), SearchCriteria.Op.EQ); } - + if(vpcId != null && networkId == null){ sb.and("vpcId", sb.entity().getVpcId(), SearchCriteria.Op.EQ); } @@ -3208,7 +3155,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (networkId != null) { sc.setParameters("networkId", networkId); } - + if(vpcId != null && networkId == null){ sc.setParameters("vpcId", vpcId); } @@ -3283,7 +3230,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager UserVmVO userVm = _vmDao.findById(vmId); if (userVm == null) { InvalidParameterValueException ex = new InvalidParameterValueException("unable to find a virtual machine with specified id"); - ex.addProxyObject(userVm, vmId, "vmId"); + ex.addProxyObject(userVm, vmId, "vmId"); throw ex; } @@ -3399,7 +3346,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } throw new InvalidParameterValueException("Unsupported operation, VM uses Local storage, cannot migrate"); } - + //check if migrating to same host long srcHostId = vm.getHostId(); if(destinationHost.getId() == srcHostId){ @@ -3469,11 +3416,11 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (newAccount == null || newAccount.getType() == Account.ACCOUNT_TYPE_PROJECT) { throw new InvalidParameterValueException("Invalid accountid=" + cmd.getAccountName() + " in domain " + cmd.getDomainId()); } - + if (newAccount.getState() == Account.State.disabled) { throw new InvalidParameterValueException("The new account owner " + cmd.getAccountName() + " is disabled."); } - + // make sure the accounts are under same domain if (oldAccount.getDomainId() != newAccount.getDomainId()){ throw new InvalidParameterValueException("The account should be under same domain for moving VM between two accounts. Old owner domain =" + oldAccount.getDomainId() + @@ -3517,7 +3464,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager //VV 3: check if volumes are with in resource limits _resourceLimitMgr.checkResourceLimit(newAccount, ResourceType.volume, _volsDao.findByInstance(cmd.getVmId()).size()); - + // VV 4: Check if new owner can use the vm template VirtualMachineTemplate template = _templateDao.findById(vm.getTemplateId()); if (!template.isPublicTemplate()) { @@ -3532,7 +3479,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager Transaction txn = Transaction.currentTxn(); txn.start(); //generate destroy vm event for usage - _usageEventDao.persist(new UsageEventVO(EventTypes.EVENT_VM_DESTROY, vm.getAccountId(), vm.getDataCenterIdToDeployIn(), vm.getId(), + _usageEventDao.persist(new UsageEventVO(EventTypes.EVENT_VM_DESTROY, vm.getAccountId(), vm.getDataCenterIdToDeployIn(), vm.getId(), vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(), vm.getHypervisorType().toString())); // update resource counts _resourceLimitMgr.decrementResourceCount(oldAccount.getAccountId(), ResourceType.user_vm); @@ -3561,7 +3508,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager _resourceLimitMgr.incrementResourceCount(newAccount.getAccountId(), ResourceType.user_vm); //generate usage events to account for this change - _usageEventDao.persist(new UsageEventVO(EventTypes.EVENT_VM_CREATE, vm.getAccountId(), vm.getDataCenterIdToDeployIn(), vm.getId(), + _usageEventDao.persist(new UsageEventVO(EventTypes.EVENT_VM_CREATE, vm.getAccountId(), vm.getDataCenterIdToDeployIn(), vm.getId(), vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(), vm.getHypervisorType().toString())); txn.commit(); @@ -3572,7 +3519,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager // OS 3: update the network List networkIdList = cmd.getNetworkIds(); List securityGroupIdList = cmd.getSecurityGroupIdList(); - + if (zone.getNetworkType() == NetworkType.Basic) { if (networkIdList != null && !networkIdList.isEmpty()) { throw new InvalidParameterValueException("Can't move vm with network Ids; this is a basic zone VM"); @@ -3632,7 +3579,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager NicProfile profile = new NicProfile(); profile.setDefaultNic(true); networks.add(new Pair(networkList.get(0), profile)); - + VMInstanceVO vmi = _itMgr.findByIdAndType(vm.getType(), vm.getId()); VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vmi); _networkMgr.allocate(vmProfile, networks); @@ -3650,9 +3597,9 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager //cleanup the network for the oldOwner _networkMgr.cleanupNics(vmOldProfile); _networkMgr.expungeNics(vmOldProfile); - + Set applicableNetworks = new HashSet(); - + if (networkIdList != null && !networkIdList.isEmpty()){ // add any additional networks for (Long networkId : networkIdList) { @@ -3665,7 +3612,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager _networkMgr.checkNetworkPermissions(newAccount, network); - //don't allow to use system networks + //don't allow to use system networks NetworkOffering networkOffering = _configMgr.getNetworkOffering(network.getNetworkOfferingId()); if (networkOffering.isSystemOnly()) { InvalidParameterValueException ex = new InvalidParameterValueException("Specified Network id is system only and can't be used for vm deployment"); @@ -3693,10 +3640,10 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (physicalNetwork == null) { throw new InvalidParameterValueException("Unable to find physical network with id: "+physicalNetworkId + " and tag: " +requiredOfferings.get(0).getTags()); } - - s_logger.debug("Creating network for account " + newAccount + " from the network offering id=" + + + s_logger.debug("Creating network for account " + newAccount + " from the network offering id=" + requiredOfferings.get(0).getId() + " as a part of deployVM process"); - Network newNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), + Network newNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), newAccount.getAccountName() + "-network", newAccount.getAccountName() + "-network", null, null, null, null, newAccount, null, physicalNetwork, zone.getId(), ACLType.Account, null, null); defaultNetwork = _networkDao.findById(newNetwork.getId()); @@ -3707,7 +3654,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager defaultNetwork = virtualNetworks.get(0); } } else { - throw new InvalidParameterValueException("Required network offering id=" + requiredOfferings.get(0).getId() + " is not in " + NetworkOffering.State.Enabled); + throw new InvalidParameterValueException("Required network offering id=" + requiredOfferings.get(0).getId() + " is not in " + NetworkOffering.State.Enabled); } applicableNetworks.add(defaultNetwork); @@ -3716,7 +3663,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager // add the new nics List> networks = new ArrayList>(); int toggle=0; - for (NetworkVO appNet: applicableNetworks){ + for (NetworkVO appNet: applicableNetworks){ NicProfile defaultNic = new NicProfile(); if (toggle==0){ defaultNic.setDefaultNic(true); @@ -3821,7 +3768,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager s_logger.debug("Restore VM " + vmId + " with template " + root.getTemplateId() + " successfully"); return vm; } - + @Override public boolean plugNic(Network network, NicTO nic, VirtualMachineTO vm, ReservationContext context, DeployDestination dest) throws ConcurrentOperationException, ResourceUnavailableException, @@ -3841,5 +3788,5 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager @Override public void prepareStop(VirtualMachineProfile profile) { } - + } diff --git a/server/test/com/cloud/network/security/SecurityGroupManagerImpl2Test.java b/server/test/com/cloud/network/security/SecurityGroupManagerImpl2Test.java index 46b7018f4d2..461bde0b95d 100644 --- a/server/test/com/cloud/network/security/SecurityGroupManagerImpl2Test.java +++ b/server/test/com/cloud/network/security/SecurityGroupManagerImpl2Test.java @@ -28,13 +28,13 @@ import org.junit.Before; import org.junit.Ignore; import com.cloud.agent.MockAgentManagerImpl; +import com.cloud.api.query.dao.SecurityGroupJoinDaoImpl; import com.cloud.configuration.DefaultInterceptorLibrary; import com.cloud.configuration.dao.ConfigurationDaoImpl; import com.cloud.domain.dao.DomainDaoImpl; import com.cloud.event.dao.UsageEventDaoImpl; import com.cloud.network.MockNetworkManagerImpl; import com.cloud.network.security.dao.SecurityGroupDaoImpl; -import com.cloud.network.security.dao.SecurityGroupJoinDaoImpl; import com.cloud.network.security.dao.SecurityGroupRuleDaoImpl; import com.cloud.network.security.dao.SecurityGroupRulesDaoImpl; import com.cloud.network.security.dao.SecurityGroupVMMapDaoImpl; diff --git a/server/test/com/cloud/projects/MockProjectManagerImpl.java b/server/test/com/cloud/projects/MockProjectManagerImpl.java index 3911ceb8eb3..309fa45d660 100644 --- a/server/test/com/cloud/projects/MockProjectManagerImpl.java +++ b/server/test/com/cloud/projects/MockProjectManagerImpl.java @@ -22,10 +22,10 @@ import java.util.Map; import javax.ejb.Local; import javax.naming.ConfigurationException; -import org.apache.cloudstack.api.view.vo.ProjectAccountJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectInvitationJoinVO; -import org.apache.cloudstack.api.view.vo.ProjectJoinVO; +import com.cloud.api.query.vo.ProjectAccountJoinVO; +import com.cloud.api.query.vo.ProjectInvitationJoinVO; +import com.cloud.api.query.vo.ProjectJoinVO; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; @@ -109,21 +109,6 @@ public class MockProjectManagerImpl implements ProjectManager, Manager { return false; } - @Override - public Pair, Integer> listProjectAccounts(long projectId, - String accountName, String role, Long startIndex, Long pageSizeVal) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Pair, Integer> listProjectInvitations(Long id, - Long projectId, String accountName, Long domainId, String state, - boolean activeOnly, Long startIndex, Long pageSizeVal, - boolean isRecursive, boolean listAll) { - // TODO Auto-generated method stub - return null; - } @Override public boolean updateInvitation(long projectId, String accountName, @@ -225,16 +210,16 @@ public class MockProjectManagerImpl implements ProjectManager, Manager { return false; } - /* (non-Javadoc) - * @see com.cloud.projects.ProjectService#listProjects(java.lang.Long, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Long, java.lang.String, java.lang.Long, java.lang.Long, boolean, boolean, java.util.Map) - */ + + @Override - public Pair, Integer> listProjects(Long id, String name, String displayText, String state, String accountName, Long domainId, String keyword, Long startIndex, Long pageSize, boolean listAll, - boolean isRecursive, Map tags) { + public long getInvitationTimeout() { // TODO Auto-generated method stub - return null; + return 0; } + + @Override public Project findByProjectAccountIdIncludingRemoved(long projectAccountId) { return null; diff --git a/server/test/com/cloud/user/MockAccountManagerImpl.java b/server/test/com/cloud/user/MockAccountManagerImpl.java index dbe616991c1..29c9f6f3bb6 100644 --- a/server/test/com/cloud/user/MockAccountManagerImpl.java +++ b/server/test/com/cloud/user/MockAccountManagerImpl.java @@ -24,14 +24,15 @@ import javax.naming.ConfigurationException; import com.cloud.acl.ControlledEntity; import com.cloud.acl.SecurityChecker.AccessType; +import com.cloud.api.query.vo.ControlledViewEntity; +import com.cloud.api.query.vo.UserAccountJoinVO; + import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd; import org.apache.cloudstack.api.command.admin.user.ListUsersCmd; import org.apache.cloudstack.api.command.admin.user.RegisterCmd; import org.apache.cloudstack.api.command.user.account.ListAccountsCmd; import org.apache.cloudstack.api.command.admin.account.UpdateAccountCmd; import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd; -import org.apache.cloudstack.api.view.vo.ControlledViewEntity; -import org.apache.cloudstack.api.view.vo.UserAccountJoinVO; import com.cloud.domain.Domain; import com.cloud.exception.ConcurrentOperationException; @@ -306,11 +307,6 @@ public class MockAccountManagerImpl implements Manager, AccountManager, AccountS return null; } - @Override - public Pair, Integer> searchForUsers(ListUsersCmd cmd) throws PermissionDeniedException { - // TODO Auto-generated method stub - return null; - } @Override public boolean enableAccount(long accountId) { diff --git a/server/test/com/cloud/vm/MockUserVmManagerImpl.java b/server/test/com/cloud/vm/MockUserVmManagerImpl.java index 08e7ee27555..27508b14c5b 100644 --- a/server/test/com/cloud/vm/MockUserVmManagerImpl.java +++ b/server/test/com/cloud/vm/MockUserVmManagerImpl.java @@ -28,6 +28,8 @@ import com.cloud.agent.api.VmStatsEntry; import com.cloud.agent.api.to.NicTO; import com.cloud.agent.api.to.VirtualMachineTO; import com.cloud.agent.manager.Commands; +import com.cloud.api.query.vo.UserVmJoinVO; + import org.apache.cloudstack.api.command.admin.vm.AssignVMCmd; import org.apache.cloudstack.api.command.admin.vm.RecoverVMCmd; import org.apache.cloudstack.api.command.user.vm.*; @@ -44,7 +46,6 @@ import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd; import org.apache.cloudstack.api.command.user.vm.StartVMCmd; import org.apache.cloudstack.api.command.user.vm.UpdateVMCmd; import org.apache.cloudstack.api.command.user.vm.UpgradeVMCmd; -import org.apache.cloudstack.api.view.vo.UserVmJoinVO; import com.cloud.dc.DataCenter; import com.cloud.deploy.DeployDestination; import com.cloud.exception.ConcurrentOperationException; @@ -401,11 +402,7 @@ public class MockUserVmManagerImpl implements UserVmManager, UserVmService, Mana return null; } - @Override - public Pair, Integer> searchForUserVMs(ListVMsCmd cmd) { - // TODO Auto-generated method stub - return null; - } + @Override public Pair> startVirtualMachine(long vmId, Long hostId, Map additionalParams) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { @@ -416,7 +413,7 @@ public class MockUserVmManagerImpl implements UserVmManager, UserVmService, Mana @Override public void prepareStop(VirtualMachineProfile profile) { // TODO Auto-generated method stub - + } /* (non-Javadoc)