You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ke...@apache.org on 2013/02/01 20:38:11 UTC

[13/50] [abbrv] Apply API refactoring changes. Make changes to Regions API to work with new code

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/ApiResponseHelper.java
index 6b84ac0,1965f33..cae27bd
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@@ -29,87 -29,111 +29,186 @@@ import java.util.Map
  import java.util.Set;
  import java.util.StringTokenizer;
  
+ import org.apache.cloudstack.api.BaseCmd;
+ import org.apache.cloudstack.api.ResponseGenerator;
  import org.apache.log4j.Logger;
  
- import com.cloud.acl.ControlledEntity;
- import com.cloud.acl.ControlledEntity.ACLType;
- import com.cloud.api.ApiConstants.HostDetails;
- import com.cloud.api.ApiConstants.VMDetails;
- import com.cloud.api.commands.QueryAsyncJobResultCmd;
- import com.cloud.api.response.AccountResponse;
+ import org.apache.cloudstack.acl.ControlledEntity;
+ import org.apache.cloudstack.acl.ControlledEntity.ACLType;
+ 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.AccountJoinVO;
+ import com.cloud.api.query.vo.AsyncJobJoinVO;
+ import com.cloud.api.query.vo.ControlledViewEntity;
+ import com.cloud.api.query.vo.DiskOfferingJoinVO;
+ import com.cloud.api.query.vo.DomainRouterJoinVO;
+ import com.cloud.api.query.vo.EventJoinVO;
+ import com.cloud.api.query.vo.HostJoinVO;
+ 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.ServiceOfferingJoinVO;
+ import com.cloud.api.query.vo.StoragePoolJoinVO;
+ import com.cloud.api.query.vo.UserAccountJoinVO;
+ import com.cloud.api.query.vo.UserVmJoinVO;
+ import com.cloud.api.query.vo.VolumeJoinVO;
  import com.cloud.api.response.ApiResponseSerializer;
++<<<<<<< HEAD
 +import com.cloud.api.response.AsyncJobResponse;
 +import com.cloud.api.response.CapabilityResponse;
 +import com.cloud.api.response.CapacityResponse;
 +import com.cloud.api.response.ClusterResponse;
 +import com.cloud.api.response.ConfigurationResponse;
 +import com.cloud.api.response.ControlledEntityResponse;
 +import com.cloud.api.response.CreateCmdResponse;
 +import com.cloud.api.response.DiskOfferingResponse;
 +import com.cloud.api.response.DomainResponse;
 +import com.cloud.api.response.DomainRouterResponse;
 +import com.cloud.api.response.EventResponse;
 +import com.cloud.api.response.ExtractResponse;
 +import com.cloud.api.response.FindAccountResponse;
 +import com.cloud.api.response.FindDomainResponse;
 +import com.cloud.api.response.FindUserResponse;
 +import com.cloud.api.response.FirewallResponse;
 +import com.cloud.api.response.FirewallRuleResponse;
 +import com.cloud.api.response.HostResponse;
 +import com.cloud.api.response.HypervisorCapabilitiesResponse;
 +import com.cloud.api.response.IPAddressResponse;
 +import com.cloud.api.response.InstanceGroupResponse;
 +import com.cloud.api.response.IpForwardingRuleResponse;
 +import com.cloud.api.response.LBStickinessPolicyResponse;
 +import com.cloud.api.response.LBStickinessResponse;
 +import com.cloud.api.response.LDAPConfigResponse;
 +import com.cloud.api.response.ListResponse;
 +import com.cloud.api.response.LoadBalancerResponse;
 +import com.cloud.api.response.NetworkACLResponse;
 +import com.cloud.api.response.NetworkOfferingResponse;
 +import com.cloud.api.response.NetworkResponse;
 +import com.cloud.api.response.NicResponse;
 +import com.cloud.api.response.PhysicalNetworkResponse;
 +import com.cloud.api.response.PodResponse;
 +import com.cloud.api.response.PrivateGatewayResponse;
 +import com.cloud.api.response.ProjectAccountResponse;
 +import com.cloud.api.response.ProjectInvitationResponse;
 +import com.cloud.api.response.ProjectResponse;
 +import com.cloud.api.response.ProviderResponse;
 +import com.cloud.api.response.RegionResponse;
 +import com.cloud.api.response.RemoteAccessVpnResponse;
 +import com.cloud.api.response.ResourceCountResponse;
 +import com.cloud.api.response.ResourceLimitResponse;
 +import com.cloud.api.response.ResourceTagResponse;
 +import com.cloud.api.response.SecurityGroupResponse;
 +import com.cloud.api.response.SecurityGroupResultObject;
 +import com.cloud.api.response.SecurityGroupRuleResponse;
 +import com.cloud.api.response.SecurityGroupRuleResultObject;
 +import com.cloud.api.response.ServiceOfferingResponse;
 +import com.cloud.api.response.ServiceResponse;
 +import com.cloud.api.response.Site2SiteCustomerGatewayResponse;
 +import com.cloud.api.response.Site2SiteVpnConnectionResponse;
 +import com.cloud.api.response.Site2SiteVpnGatewayResponse;
 +import com.cloud.api.response.SnapshotPolicyResponse;
 +import com.cloud.api.response.SnapshotResponse;
 +import com.cloud.api.response.StaticRouteResponse;
 +import com.cloud.api.response.StorageNetworkIpRangeResponse;
 +import com.cloud.api.response.StoragePoolResponse;
 +import com.cloud.api.response.SwiftResponse;
 +import com.cloud.api.response.SystemVmInstanceResponse;
 +import com.cloud.api.response.SystemVmResponse;
 +import com.cloud.api.response.TemplatePermissionsResponse;
 +import com.cloud.api.response.TemplateResponse;
 +import com.cloud.api.response.TrafficTypeResponse;
 +import com.cloud.api.response.UserResponse;
 +import com.cloud.api.response.UserVmResponse;
 +import com.cloud.api.response.VirtualRouterProviderResponse;
 +import com.cloud.api.response.VlanIpRangeResponse;
 +import com.cloud.api.response.VolumeResponse;
 +import com.cloud.api.response.VpcOfferingResponse;
 +import com.cloud.api.response.VpcResponse;
 +import com.cloud.api.response.VpnUsersResponse;
 +import com.cloud.api.response.ZoneResponse;
++=======
+ import org.apache.cloudstack.api.response.AsyncJobResponse;
+ import org.apache.cloudstack.api.response.AutoScalePolicyResponse;
+ import org.apache.cloudstack.api.response.AutoScaleVmGroupResponse;
+ import org.apache.cloudstack.api.response.AutoScaleVmProfileResponse;
+ import org.apache.cloudstack.api.response.CapabilityResponse;
+ import org.apache.cloudstack.api.response.CapacityResponse;
+ import org.apache.cloudstack.api.response.ClusterResponse;
+ import org.apache.cloudstack.api.response.ConditionResponse;
+ import org.apache.cloudstack.api.response.ConfigurationResponse;
+ import org.apache.cloudstack.api.response.ControlledEntityResponse;
+ import org.apache.cloudstack.api.response.CounterResponse;
+ import org.apache.cloudstack.api.response.CreateCmdResponse;
+ import org.apache.cloudstack.api.response.DiskOfferingResponse;
+ import org.apache.cloudstack.api.response.DomainResponse;
+ import org.apache.cloudstack.api.response.DomainRouterResponse;
+ import org.apache.cloudstack.api.response.EventResponse;
+ import org.apache.cloudstack.api.response.ExtractResponse;
+ import org.apache.cloudstack.api.response.FirewallResponse;
+ import org.apache.cloudstack.api.response.FirewallRuleResponse;
+ import org.apache.cloudstack.api.response.GuestOSResponse;
+ import org.apache.cloudstack.api.response.HostResponse;
+ import org.apache.cloudstack.api.response.HypervisorCapabilitiesResponse;
+ import org.apache.cloudstack.api.response.ControlledViewEntityResponse;
+ import org.apache.cloudstack.api.response.IPAddressResponse;
+ import org.apache.cloudstack.api.response.InstanceGroupResponse;
+ import org.apache.cloudstack.api.response.IpForwardingRuleResponse;
+ import org.apache.cloudstack.api.response.LBStickinessPolicyResponse;
+ import org.apache.cloudstack.api.response.LBStickinessResponse;
+ import org.apache.cloudstack.api.response.LDAPConfigResponse;
+ import org.apache.cloudstack.api.response.LoadBalancerResponse;
+ import org.apache.cloudstack.api.response.NetworkACLResponse;
+ import org.apache.cloudstack.api.response.NetworkOfferingResponse;
+ import org.apache.cloudstack.api.response.NetworkResponse;
+ import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
+ import org.apache.cloudstack.api.response.PodResponse;
+ import org.apache.cloudstack.api.response.PrivateGatewayResponse;
+ 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.ProviderResponse;
+ import org.apache.cloudstack.api.response.RemoteAccessVpnResponse;
+ import org.apache.cloudstack.api.response.ResourceCountResponse;
+ import org.apache.cloudstack.api.response.ResourceLimitResponse;
+ import org.apache.cloudstack.api.response.ResourceTagResponse;
+ import org.apache.cloudstack.api.response.SecurityGroupResponse;
+ import org.apache.cloudstack.api.response.SecurityGroupRuleResponse;
+ import org.apache.cloudstack.api.response.ServiceOfferingResponse;
+ import org.apache.cloudstack.api.response.ServiceResponse;
+ import org.apache.cloudstack.api.response.Site2SiteCustomerGatewayResponse;
+ import org.apache.cloudstack.api.response.Site2SiteVpnConnectionResponse;
+ import org.apache.cloudstack.api.response.Site2SiteVpnGatewayResponse;
+ import org.apache.cloudstack.api.response.SnapshotPolicyResponse;
+ import org.apache.cloudstack.api.response.SnapshotResponse;
+ import org.apache.cloudstack.api.response.SnapshotScheduleResponse;
+ import org.apache.cloudstack.api.response.StaticRouteResponse;
+ import org.apache.cloudstack.api.response.StorageNetworkIpRangeResponse;
+ import org.apache.cloudstack.api.response.StoragePoolResponse;
+ import org.apache.cloudstack.api.response.SwiftResponse;
+ import org.apache.cloudstack.api.response.SystemVmInstanceResponse;
+ import org.apache.cloudstack.api.response.SystemVmResponse;
+ import org.apache.cloudstack.api.response.TemplatePermissionsResponse;
+ import org.apache.cloudstack.api.response.TemplateResponse;
+ import org.apache.cloudstack.api.response.TrafficTypeResponse;
+ import org.apache.cloudstack.api.response.UserResponse;
+ import org.apache.cloudstack.api.response.UserVmResponse;
+ import org.apache.cloudstack.api.response.VirtualRouterProviderResponse;
+ import org.apache.cloudstack.api.response.VlanIpRangeResponse;
+ import org.apache.cloudstack.api.response.VolumeResponse;
+ 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.response.S3Response;
++>>>>>>> master
  import com.cloud.async.AsyncJob;
  import com.cloud.capacity.Capacity;
  import com.cloud.capacity.CapacityVO;
@@@ -200,10 -226,9 +302,10 @@@ import com.cloud.storage.VMTemplateVO
  import com.cloud.storage.Volume;
  import com.cloud.storage.VolumeVO;
  import com.cloud.storage.snapshot.SnapshotPolicy;
+ import com.cloud.storage.snapshot.SnapshotSchedule;
  import com.cloud.template.VirtualMachineTemplate;
- import com.cloud.test.PodZoneConfig;
  import com.cloud.user.Account;
 +import com.cloud.user.AccountVO;
  import com.cloud.user.User;
  import com.cloud.user.UserAccount;
  import com.cloud.user.UserContext;
@@@ -3654,21 -2751,6 +2828,24 @@@ public class ApiResponseHelper implemen
          response.setObjectName("storagenetworkiprange");
          return response;
      }
++<<<<<<< HEAD
 +    
 +    @Override
 +    public Long getIdentiyId(String tableName, String token) {
 +        return ApiDispatcher.getIdentiyId(tableName, token);
 +    }
 +
 +	@Override
 +	public RegionResponse createRegionResponse(Region region) {
 +		RegionResponse response = new RegionResponse();
 +		response.setId(region.getId());
 +		response.setName(region.getName());
 +		response.setEndPoint(region.getEndPoint());
 +		response.setObjectName("region");
 +		return response;
 +	}
++=======
++>>>>>>> master
  
      @Override
      public ResourceTagResponse createResourceTagResponse(ResourceTag resourceTag, boolean keyValueOnly) {
@@@ -3931,55 -3130,46 +3225,100 @@@
          response.setObjectName("vpnconnection");
          return response;
      }
++<<<<<<< HEAD
 +    
 +    @Override
 +    public FindUserResponse createFindUserResponse(User user) {
 +    	FindUserResponse userResponse = new FindUserResponse();
 +    	userResponse.setId(user.getId());
 +    	userResponse.setUsername(user.getUsername());
 +    	userResponse.setPassword(user.getPassword());
 +        userResponse.setFirstname(user.getFirstname());        
 +        userResponse.setLastname(user.getLastname());
 +        userResponse.setAccountId(user.getAccountId());
 +        userResponse.setEmail(user.getEmail());
 +        userResponse.setState(user.getState().toString());
 +        userResponse.setApiKey(user.getApiKey());
 +        userResponse.setSecretKey(user.getSecretKey());        
 +        userResponse.setCreated(user.getCreated());        
 +        userResponse.setTimezone(user.getTimezone());
 +        userResponse.setRegistrationToken(user.getRegistrationToken());
 +        userResponse.setRegistered(user.isRegistered());
 +        userResponse.setRegionId(user.getRegionId());
 +        userResponse.setObjectName("user");
 +
 +        return userResponse;
 +    }
 +
 +	@Override
 +	public FindAccountResponse createFindAccountResponse(Account account) {
 +		FindAccountResponse accountResponse = new FindAccountResponse();
 +		accountResponse.setId(account.getId());
 +		accountResponse.setName(account.getAccountName());
 +		accountResponse.setAccountType(account.getType());
 +		accountResponse.setDefaultZone(account.getDefaultZoneId());
 +		accountResponse.setDomainId(account.getDomainId());
 +		accountResponse.setRegionId(account.getRegionId());
 +		accountResponse.setState(account.getState().toString());
 +		accountResponse.setObjectName("account");
 +		return accountResponse;
 +	}
 +
 +	@Override
 +	public FindDomainResponse createFindDomainResponse(Domain domain) {
 +		FindDomainResponse domainResponse = new FindDomainResponse();
 +        domainResponse.setDomainName(domain.getName());
 +        domainResponse.setId(domain.getId());
 +        domainResponse.setLevel(domain.getLevel());
 +        domainResponse.setNetworkDomain(domain.getNetworkDomain());
 +        domainResponse.setParent(domain.getParent());
 +        domainResponse.setPath(domain.getPath());
 +        domainResponse.setObjectName("domain");
 +        domainResponse.setRegionId(domain.getRegionId());
 +		return domainResponse;
 +	}
++=======
+ 
+ 
+ 
+     @Override
+     public GuestOSResponse createGuestOSResponse(GuestOS guestOS) {
+         GuestOSResponse response = new GuestOSResponse();
+         response.setDescription(guestOS.getDisplayName());
+         response.setId(guestOS.getUuid());
+         GuestOSCategoryVO category = ApiDBUtils.findGuestOsCategoryById(guestOS.getCategoryId());
+         if ( category != null ){
+             response.setOsCategoryId(category.getUuid());
+         }
+ 
+         response.setObjectName("ostype");
+         return response;
+     }
+ 
+ 
+ 
+     @Override
+     public SnapshotScheduleResponse createSnapshotScheduleResponse(SnapshotSchedule snapshotSchedule) {
+         SnapshotScheduleResponse response = new SnapshotScheduleResponse();
+         response.setId(snapshotSchedule.getUuid());
+         if (snapshotSchedule.getVolumeId() != null) {
+             Volume vol = ApiDBUtils.findVolumeById(snapshotSchedule.getVolumeId());
+             if (vol != null) {
+                 response.setVolumeId(vol.getUuid());
+             }
+         }
+         if (snapshotSchedule.getPolicyId() != null) {
+             SnapshotPolicy policy = ApiDBUtils.findSnapshotPolicyById(snapshotSchedule.getPolicyId());
+             if (policy != null) {
+                 response.setSnapshotPolicyId(policy.getUuid());
+             }
+         }
+         response.setScheduled(snapshotSchedule.getScheduledTimestamp());
+ 
+         response.setObjectName("snapshot");
+         return response;
+     }
+ 
+ 
++>>>>>>> master
  }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/api/ApiServer.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/ApiServer.java
index 50c0125,ad2a12f..93089a1
--- a/server/src/com/cloud/api/ApiServer.java
+++ b/server/src/com/cloud/api/ApiServer.java
@@@ -94,10 -116,14 +116,15 @@@ import com.cloud.configuration.dao.Conf
  import com.cloud.domain.Domain;
  import com.cloud.domain.DomainVO;
  import com.cloud.event.EventUtils;
+ import com.cloud.exception.AccountLimitException;
  import com.cloud.exception.CloudAuthenticationException;
+ import com.cloud.exception.InsufficientCapacityException;
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.exception.PermissionDeniedException;
 +import com.cloud.region.RegionManager;
+ import com.cloud.exception.RequestLimitException;
+ import com.cloud.exception.ResourceAllocationException;
+ import com.cloud.exception.ResourceUnavailableException;
  import com.cloud.server.ManagementServer;
  import com.cloud.user.Account;
  import com.cloud.user.AccountManager;
@@@ -121,31 -146,25 +147,27 @@@ public class ApiServer implements HttpR
      private static final Logger s_logger = Logger.getLogger(ApiServer.class.getName());
      private static final Logger s_accessLogger = Logger.getLogger("apiserver." + ApiServer.class.getName());
  
-     public static final short ADMIN_COMMAND = 1;
-     public static final short DOMAIN_ADMIN_COMMAND = 4;
-     public static final short RESOURCE_DOMAIN_ADMIN_COMMAND = 2;
-     public static final short USER_COMMAND = 8;
      public static boolean encodeApiResponse = false;
      public static String jsonContentType = "text/javascript";
-     private Properties _apiCommands = null;
      private ApiDispatcher _dispatcher;
-     private AccountManager _accountMgr = null;
-     private DomainManager _domainMgr = null;
-     private AsyncJobManager _asyncMgr = null;
+ 
+     @Inject private AccountManager _accountMgr = null;
+     @Inject private DomainManager _domainMgr = null;
+     @Inject private AsyncJobManager _asyncMgr = null;
+ 
+     @Inject(adapter = APILimitChecker.class)
+     protected Adapters<APILimitChecker> _apiLimitCheckers;
+     @Inject(adapter = APIChecker.class)
+     protected Adapters<APIChecker> _apiAccessCheckers;
+ 
      private Account _systemAccount = null;
      private User _systemUser = null;
 +    private RegionManager _regionMgr = null;
 +    
      private static int _workerCount = 0;
- 
      private static ApiServer s_instance = null;
-     private static List<String> s_userCommands = null;
-     private static List<String> s_resellerCommands = null; // AKA domain-admin
-     private static List<String> s_adminCommands = null;
-     private static List<String> s_resourceDomainAdminCommands = null;
-     private static List<String> s_allCommands = null;
-     private static List<String> s_pluggableServiceCommands = null;
      private static final DateFormat _dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
+     private static Map<String, Class<?>> _apiNameCmdClassMap = new HashMap<String, Class<?>>();
  
      private static ExecutorService _executor = new ThreadPoolExecutor(10, 150, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new NamedThreadFactory("ApiServer"));
  
@@@ -270,17 -194,9 +197,11 @@@
          _systemAccount = _accountMgr.getSystemAccount();
          _systemUser = _accountMgr.getSystemUser();
          _dispatcher = ApiDispatcher.getInstance();
-         _domainMgr = locator.getManager(DomainManager.class);
-         _regionMgr = locator.getManager(RegionManager.class);
++        _domainMgr = ComponentLocator.inject(DomainManager.class);
++        _regionMgr = ComponentLocator.inject(RegionManager.class);
  
          Integer apiPort = null; // api port, null by default
+         ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name);
          ConfigurationDao configDao = locator.getDao(ConfigurationDao.class);
          SearchCriteria<ConfigurationVO> sc = configDao.createSearchCriteria();
          sc.addAnd("name", SearchCriteria.Op.EQ, "integration.api.port");

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/configuration/DefaultComponentLibrary.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/domain/DomainVO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/projects/ProjectManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/projects/ProjectManagerImpl.java
index daf185f,15d3675..f65627e
--- a/server/src/com/cloud/projects/ProjectManagerImpl.java
+++ b/server/src/com/cloud/projects/ProjectManagerImpl.java
@@@ -206,14 -205,14 +205,14 @@@ public class ProjectManagerImpl impleme
          //Create an account associated with the project
          StringBuilder acctNm = new StringBuilder("PrjAcct-");
          acctNm.append(name).append("-").append(owner.getDomainId());
 -
 -        Account projectAccount = _accountMgr.createAccount(acctNm.toString(), Account.ACCOUNT_TYPE_PROJECT, domainId, null, null);
 -
 +        
 +        Account projectAccount = _accountMgr.createAccount(acctNm.toString(), Account.ACCOUNT_TYPE_PROJECT, domainId, null, null, "", 0);
 +        
          Project project = _projectDao.persist(new ProjectVO(name, displayText, owner.getDomainId(), projectAccount.getId()));
-         
+ 
          //assign owner to the project
          assignAccountToProject(project, owner.getId(), ProjectAccount.Role.Admin);
-         
+ 
          if (project != null) {
              UserContext.current().setEventDetails("Project id=" + project.getId());
          }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/server/ConfigurationServerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/server/ConfigurationServerImpl.java
index 43fe57a,b0abd04..a63ad19
--- a/server/src/com/cloud/server/ConfigurationServerImpl.java
+++ b/server/src/com/cloud/server/ConfigurationServerImpl.java
@@@ -105,8 -70,21 +72,23 @@@ import com.cloud.utils.db.Transaction
  import com.cloud.utils.exception.CloudRuntimeException;
  import com.cloud.utils.net.NetUtils;
  import com.cloud.utils.script.Script;
 +import com.cloud.uuididentity.dao.IdentityDao;
 +
+ import org.apache.commons.codec.binary.Base64;
+ import org.apache.log4j.Logger;
+ 
+ import javax.crypto.KeyGenerator;
+ import javax.crypto.SecretKey;
+ import java.io.*;
+ import java.net.InetAddress;
+ import java.net.UnknownHostException;
+ import java.security.NoSuchAlgorithmException;
+ import java.sql.PreparedStatement;
+ import java.sql.ResultSet;
+ import java.sql.SQLException;
+ import java.util.*;
+ import java.util.regex.Pattern;
+ 
  public class ConfigurationServerImpl implements ConfigurationServer {
      public static final Logger s_logger = Logger.getLogger(ConfigurationServerImpl.class.getName());
  
@@@ -279,8 -251,9 +261,8 @@@
          // Update the cloud identifier
          updateCloudIdentifier();
  
-         updateUuids();
-         
+         // We should not update seed data UUID column here since this will be invoked in upgrade case as well.
+         //updateUuids();
 -
          // Set init to true
          _configDao.update("init", "Hidden", "true");
      }
@@@ -330,9 -306,8 +315,9 @@@
  
      @DB
      protected void saveUser() {
 +    	//ToDo: Add regionId to default users and accounts
          // insert system account
-         String insertSql = "INSERT INTO `cloud`.`account` (id, account_name, type, domain_id) VALUES (1, 'system', '1', '1')";
+         String insertSql = "INSERT INTO `cloud`.`account` (id, uuid, account_name, type, domain_id) VALUES (1, UUID(), 'system', '1', '1')";
          Transaction txn = Transaction.currentTxn();
          try {
              PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/user/AccountManager.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/user/AccountManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/user/AccountManagerImpl.java
index b72a8ac,b910a03..dcd6da3
--- a/server/src/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/com/cloud/user/AccountManagerImpl.java
@@@ -1702,18 -1722,20 +1756,31 @@@ public class AccountManagerImpl impleme
          if (s_logger.isDebugEnabled()) {
              s_logger.debug("Creating user: " + userName + ", accountId: " + accountId + " timezone:" + timezone);
          }
 +        
 +        UserVO user = _userDao.persist(new UserVO(accountId, userName, password, firstName, lastName, email, timezone, UUID.randomUUID().toString(), _regionMgr.getId()));
 +
 +        return user;
 +    }
 +
 +    //ToDo Add events??
 +    public UserVO createUser(long accountId, String userName, String password, String firstName, String lastName, String email, String timezone, String uuid, int regionId) {
 +        if (s_logger.isDebugEnabled()) {
 +            s_logger.debug("Creating user: " + userName + ", accountId: " + accountId + " timezone:" + timezone);
 +        }
-         UserVO user = _userDao.persist(new UserVO(accountId, userName, password, firstName, lastName, email, timezone, uuid, regionId));
+ 
+         String encodedPassword = null;
+         for (Enumeration<UserAuthenticator> en = _userAuthenticators.enumeration(); en.hasMoreElements();) {
+             UserAuthenticator authenticator = en.nextElement();
+             encodedPassword = authenticator.encode(password);
+             if (encodedPassword != null) {
+                 break;
+             }
+         }
+         if (encodedPassword == null) {
+         	throw new CloudRuntimeException("Failed to encode password");
+         }
 -
 -        UserVO user = _userDao.persist(new UserVO(accountId, userName, encodedPassword, firstName, lastName, email, timezone));
++        
++        UserVO user = _userDao.persist(new UserVO(accountId, userName, encodedPassword, firstName, lastName, email, timezone, uuid, regionId));
  
          return user;
      }
@@@ -1937,11 -1966,16 +2011,17 @@@
  
      @Override @DB
      public String[] createApiKeyAndSecretKey(RegisterCmd cmd) {
 +    	//Send keys to other Regions
          Long userId = cmd.getId();
  
-         if (getUserIncludingRemoved(userId) == null) {
-             throw new InvalidParameterValueException("unable to find user for id : " + userId);
+         User user = getUserIncludingRemoved(userId);
+         if (user == null) {
+             throw new InvalidParameterValueException("unable to find user by id");
+         }
+ 
+         //don't allow updating system user
+         if (user.getId() == User.UID_SYSTEM) {
+             throw new PermissionDeniedException("user id : " + user.getId() + " is system account, update is not allowed");
          }
  
          // generate both an api key and a secret key, update the user table with the keys, return the keys to the user
@@@ -2374,26 -2194,51 +2240,69 @@@
          }
      }
  
 -    @Override
 +	@Override
- 	public UserAccount getUserByApiKey(String apiKey) {
- 		return _userAccountDao.getUserByApiKey(apiKey);
- 	}
- 
- 	@Override
 +	public User findUser(String username, Long domainId) {
 +		UserAccount userAccount = _userAccountDao.getUserAccount(username, domainId);
 +		if(userAccount == null){
 +			throw new InvalidParameterValueException("Unable to find user account by name: "+username);
 +		}
 +		User user = _userDao.findById(userAccount.getId());
 +		if(user == null){
 +			throw new InvalidParameterValueException("Unable to find user by name: "+username);
 +		}
 +		return user;
 +	}
 +
 +	@Override
 +	public Account findAccount(Long id) {
 +		return _accountDao.findById(id);		
 +	}
++
++	@Override
+     public void buildACLViewSearchBuilder(SearchBuilder<? extends ControlledViewEntity> sb, Long domainId,
+             boolean isRecursive, List<Long> permittedAccounts, ListProjectResourcesCriteria listProjectResourcesCriteria) {
+ 
+         sb.and("accountIdIN", sb.entity().getAccountId(), SearchCriteria.Op.IN);
+         sb.and("domainId", sb.entity().getDomainId(), SearchCriteria.Op.EQ);
+ 
+         if (((permittedAccounts.isEmpty()) && (domainId != null) && isRecursive)) {
+             // if accountId isn't specified, we can do a domain match for the
+             // admin case if isRecursive is true
+             sb.and("domainPath", sb.entity().getDomainPath(), SearchCriteria.Op.LIKE);
+         }
+ 
+         if (listProjectResourcesCriteria != null) {
+             if (listProjectResourcesCriteria == Project.ListProjectResourcesCriteria.ListProjectResourcesOnly) {
+                 sb.and("accountType", sb.entity().getAccountType(), SearchCriteria.Op.EQ);
+             } else if (listProjectResourcesCriteria == Project.ListProjectResourcesCriteria.SkipProjectResources) {
+                 sb.and("accountType", sb.entity().getAccountType(), SearchCriteria.Op.NEQ);
+             }
+         }
+ 
+     }
+ 
+     @Override
+     public void buildACLViewSearchCriteria(SearchCriteria<? extends ControlledViewEntity> sc,
+             Long domainId, boolean isRecursive, List<Long> permittedAccounts, ListProjectResourcesCriteria listProjectResourcesCriteria) {
+ 
+         if (listProjectResourcesCriteria != null) {
+             sc.setParameters("accountType", Account.ACCOUNT_TYPE_PROJECT);
+         }
+ 
+         if (!permittedAccounts.isEmpty()) {
+             sc.setParameters("accountIdIN", permittedAccounts.toArray());
+         } else if (domainId != null) {
+             DomainVO domain = _domainDao.findById(domainId);
+             if (isRecursive) {
+                 sc.setParameters("domainPath", domain.getPath() + "%");
+             } else {
+                 sc.setParameters("domainId", domainId);
+             }
+         }
+     }
+ 
+     @Override
+     public UserAccount getUserByApiKey(String apiKey) {
+         return _userAccountDao.getUserByApiKey(apiKey);
+     }
  }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/user/DomainManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/user/DomainManagerImpl.java
index 8ec68bb,54ca2ac..92277e8
--- a/server/src/com/cloud/user/DomainManagerImpl.java
+++ b/server/src/com/cloud/user/DomainManagerImpl.java
@@@ -24,11 -24,10 +24,11 @@@ import java.util.Set
  import javax.ejb.Local;
  import javax.naming.ConfigurationException;
  
+ import org.apache.cloudstack.api.command.admin.domain.ListDomainChildrenCmd;
+ import org.apache.cloudstack.api.command.admin.domain.ListDomainsCmd;
++import org.apache.cloudstack.api.command.admin.domain.UpdateDomainCmd;
  import org.apache.log4j.Logger;
  
- import com.cloud.api.commands.ListDomainChildrenCmd;
- import com.cloud.api.commands.ListDomainsCmd;
- import com.cloud.api.commands.UpdateDomainCmd;
  import com.cloud.configuration.ResourceLimit;
  import com.cloud.configuration.dao.ResourceCountDao;
  import com.cloud.domain.Domain;
@@@ -481,100 -472,7 +488,100 @@@ public class DomainManagerImpl implemen
              sc.addAnd("state", SearchCriteria.Op.EQ, Domain.State.Active);
          }
  
-         return _domainDao.search(sc, searchFilter);
+         return _domainDao.searchAndCount(sc, searchFilter);
      }
  
 +    @Override
 +    @ActionEvent(eventType = EventTypes.EVENT_DOMAIN_UPDATE, eventDescription = "updating Domain")
 +    @DB
 +    public DomainVO updateDomain(UpdateDomainCmd cmd) {
 +        Long domainId = cmd.getId();
 +        String domainName = cmd.getDomainName();
 +        String networkDomain = cmd.getNetworkDomain();
 +
 +        // check if domain exists in the system
 +        DomainVO domain = _domainDao.findById(domainId);
 +        if (domain == null) {
 +        	InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find domain with specified domain id");
 +        	ex.addProxyObject(domain, domainId, "domainId");            
 +            throw ex;
 +        } else if (domain.getParent() == null && domainName != null) {
 +            // check if domain is ROOT domain - and deny to edit it with the new name
 +            throw new InvalidParameterValueException("ROOT domain can not be edited with a new name");
 +        }
 +
 +        // check permissions
 +        Account caller = UserContext.current().getCaller();
 +        _accountMgr.checkAccess(caller, domain);
 +
 +        // domain name is unique in the cloud
 +        if (domainName != null) {
 +            SearchCriteria<DomainVO> sc = _domainDao.createSearchCriteria();
 +            sc.addAnd("name", SearchCriteria.Op.EQ, domainName);
 +            List<DomainVO> domains = _domainDao.search(sc, null);
 +
 +            boolean sameDomain = (domains.size() == 1 && domains.get(0).getId() == domainId);
 +
 +            if (!domains.isEmpty() && !sameDomain) {
 +                InvalidParameterValueException ex = new InvalidParameterValueException("Failed to update specified domain id with name '" + domainName + "' since it already exists in the system");
 +                ex.addProxyObject(domain, domainId, "domainId");                
 +            	throw ex;
 +            }
 +        }
 +
 +        // validate network domain
 +        if (networkDomain != null && !networkDomain.isEmpty()) {
 +            if (!NetUtils.verifyDomainName(networkDomain)) {
 +                throw new InvalidParameterValueException(
 +                        "Invalid network domain. Total length shouldn't exceed 190 chars. Each domain label must be between 1 and 63 characters long, can contain ASCII letters 'a' through 'z', the digits '0' through '9', "
 +                                + "and the hyphen ('-'); can't start or end with \"-\"");
 +            }
 +        }
 +
 +        Transaction txn = Transaction.currentTxn();
 +
 +        txn.start();
 +
 +        if (domainName != null) {
 +            String updatedDomainPath = getUpdatedDomainPath(domain.getPath(), domainName);
 +            updateDomainChildren(domain, updatedDomainPath);
 +            domain.setName(domainName);
 +            domain.setPath(updatedDomainPath);
 +        }
 +
 +        if (networkDomain != null) {
 +            if (networkDomain.isEmpty()) {
 +                domain.setNetworkDomain(null);
 +            } else {
 +                domain.setNetworkDomain(networkDomain);
 +            }
 +        }
 +        _domainDao.update(domainId, domain);
 +
 +        txn.commit();
 +
 +        return _domainDao.findById(domainId);
 +
 +    }
 +
 +    private String getUpdatedDomainPath(String oldPath, String newName) {
 +        String[] tokenizedPath = oldPath.split("/");
 +        tokenizedPath[tokenizedPath.length - 1] = newName;
 +        StringBuilder finalPath = new StringBuilder();
 +        for (String token : tokenizedPath) {
 +            finalPath.append(token);
 +            finalPath.append("/");
 +        }
 +        return finalPath.toString();
 +    }
 +
 +    private void updateDomainChildren(DomainVO domain, String updatedDomainPrefix) {
 +        List<DomainVO> domainChildren = _domainDao.findAllChildren(domain.getPath(), domain.getId());
 +        // for each child, update the path
 +        for (DomainVO dom : domainChildren) {
 +            dom.setPath(dom.getPath().replaceFirst(domain.getPath(), updatedDomainPrefix));
 +            _domainDao.update(dom.getId(), dom);
 +        }
 +    }
 +    
  }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/test/com/cloud/user/MockAccountManagerImpl.java
----------------------------------------------------------------------
diff --cc server/test/com/cloud/user/MockAccountManagerImpl.java
index c4c2e6b,550304a..7e20491
--- a/server/test/com/cloud/user/MockAccountManagerImpl.java
+++ b/server/test/com/cloud/user/MockAccountManagerImpl.java
@@@ -22,14 -22,16 +22,18 @@@ import java.util.Map
  import javax.ejb.Local;
  import javax.naming.ConfigurationException;
  
- import com.cloud.acl.ControlledEntity;
- import com.cloud.acl.SecurityChecker.AccessType;
- import com.cloud.api.commands.DeleteUserCmd;
- import com.cloud.api.commands.ListAccountsCmd;
- import com.cloud.api.commands.ListUsersCmd;
- import com.cloud.api.commands.RegisterCmd;
- import com.cloud.api.commands.UpdateAccountCmd;
- import com.cloud.api.commands.UpdateUserCmd;
+ import org.apache.cloudstack.acl.ControlledEntity;
+ import org.apache.cloudstack.acl.RoleType;
+ import org.apache.cloudstack.acl.SecurityChecker.AccessType;
+ import com.cloud.api.query.vo.ControlledViewEntity;
+ 
+ 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.account.UpdateAccountCmd;
+ import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd;
++import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
+ 
  import com.cloud.domain.Domain;
  import com.cloud.exception.ConcurrentOperationException;
  import com.cloud.exception.PermissionDeniedException;
@@@ -274,18 -282,23 +278,6 @@@ public class MockAccountManagerImpl imp
          return true;
      }
  
-     @Override
-     public List<? extends Account> searchForAccounts(ListAccountsCmd cmd) {
-         // TODO Auto-generated method stub
-         return null;
-     }
--
-     @Override
-     public List<? extends UserAccount> searchForUsers(ListUsersCmd cmd) throws PermissionDeniedException {
-         // TODO Auto-generated method stub
-         return null;
-     }
- 
 -	@Override
 -	public UserAccount createUserAccount(String userName, String password,
 -			String firstName, String lastName, String email, String timezone,
 -			String accountName, short accountType, Long domainId,
 -			String networkDomain, Map<String, String> details) {
 -		// TODO Auto-generated method stub
 -		return null;
 -	}
 -
 -	@Override
 -	public Account createAccount(String accountName, short accountType,
 -			Long domainId, String networkDomain, Map details) {
 -		// TODO Auto-generated method stub
 -		return null;
 -	}
 -
  	@Override
  	public boolean enableAccount(long accountId) {
  		// TODO Auto-generated method stub
@@@ -320,42 -345,9 +324,46 @@@
          return null;
      }
  
 +	@Override
 +	public UserAccount createUserAccount(String userName, String password,
 +			String firstName, String lastName, String email, String timezone,
 +			String accountName, short accountType, Long domainId,
 +			String networkDomain, Map<String, String> details,
 +			String accountUUID, String userUUID, Integer regionId) {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public User createUser(String userName, String password, String firstName,
 +			String lastName, String email, String timeZone, String accountName,
 +			Long domainId, String userUUID, Integer regionId) {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public User findUser(String username, Long domainId) {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public Account findAccount(Long id) {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public Account createAccount(String accountName, short accountType,
 +			Long domainId, String networkDomain, Map details, String uuid,
 +			int regionId) {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
+     @Override
+     public RoleType getRoleType(Account account) {
+         return null;
+     }
  
  }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/test/com/cloud/user/MockDomainManagerImpl.java
----------------------------------------------------------------------
diff --cc server/test/com/cloud/user/MockDomainManagerImpl.java
index 2927526,0fe259d..4f134a0
--- a/server/test/com/cloud/user/MockDomainManagerImpl.java
+++ b/server/test/com/cloud/user/MockDomainManagerImpl.java
@@@ -23,18 -23,24 +23,20 @@@ import java.util.Set
  import javax.ejb.Local;
  import javax.naming.ConfigurationException;
  
- import com.cloud.api.commands.ListDomainChildrenCmd;
- import com.cloud.api.commands.ListDomainsCmd;
- import com.cloud.api.commands.UpdateDomainCmd;
+ import org.apache.cloudstack.api.command.admin.domain.ListDomainChildrenCmd;
+ import org.apache.cloudstack.api.command.admin.domain.ListDomainsCmd;
++import org.apache.cloudstack.api.command.admin.domain.UpdateDomainCmd;
++
  import com.cloud.domain.Domain;
  import com.cloud.domain.DomainVO;
  import com.cloud.exception.PermissionDeniedException;
  import com.cloud.utils.component.Manager;
+ import com.cloud.utils.Pair;
  
- @Local(value = { DomainManager.class })
- public class MockDomainManagerImpl implements  Manager, DomainManager {
+ @Local(value = { DomainManager.class, DomainService.class })
+ public class MockDomainManagerImpl implements  Manager, DomainManager, DomainService {
  
      @Override
 -    public Domain createDomain(String name, Long parentId, String networkDomain) {
 -        // TODO Auto-generated method stub
 -        return null;
 -    }
 -
 -    @Override
      public Domain getDomain(long id) {
          // TODO Auto-generated method stub
          return null;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/test/com/cloud/vm/MockUserVmManagerImpl.java
----------------------------------------------------------------------
diff --cc server/test/com/cloud/vm/MockUserVmManagerImpl.java
index 1baf34a,27508b1..e397b82
--- a/server/test/com/cloud/vm/MockUserVmManagerImpl.java
+++ b/server/test/com/cloud/vm/MockUserVmManagerImpl.java
@@@ -193,9 -194,9 +195,9 @@@ public class MockUserVmManagerImpl impl
      }
  
      @Override
-     public List<UserVmVO> searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, List<Long> permittedAccounts, boolean listAll, ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags) {
+     public Pair<List<UserVmJoinVO>, Integer> searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, List<Long> permittedAccounts, boolean listAll, ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags) {
          // TODO Auto-generated method stub
 -        return null;
 +        return new ArrayList<UserVmVO>();
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/setup/db/create-schema.sql
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/utils/conf/db.properties
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/utils/src/com/cloud/utils/db/GenericDao.java
----------------------------------------------------------------------
diff --cc utils/src/com/cloud/utils/db/GenericDao.java
index ca4c21a,15d04b7..9864b18
--- a/utils/src/com/cloud/utils/db/GenericDao.java
+++ b/utils/src/com/cloud/utils/db/GenericDao.java
@@@ -260,6 -265,11 +265,13 @@@ public interface GenericDao<T, ID exten
       * @return
       */
      Class<T> getEntityBeanType();
 +    
 +    public int getRegionId();
+ 
+     /**
+      * @param sc
+      * @param filter
+      * @return
+      */
+     Pair<List<T>, Integer> searchAndCount(SearchCriteria<T> sc, Filter filter);
  }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/utils/src/com/cloud/utils/db/GenericDaoBase.java
----------------------------------------------------------------------
diff --cc utils/src/com/cloud/utils/db/GenericDaoBase.java
index 271cec5,880e9de..ec2e7e0
--- a/utils/src/com/cloud/utils/db/GenericDaoBase.java
+++ b/utils/src/com/cloud/utils/db/GenericDaoBase.java
@@@ -1769,9 -1794,74 +1794,79 @@@ public abstract class GenericDaoBase<T
          factory.setCallback(0, sc);
          return sc;
      }
 +    
 +    @Override
 +    public int getRegionId(){
 +    	return Transaction.s_region_id;
 +    }
+ 
+     public Integer getCount(SearchCriteria<T> sc) {
+         String clause = sc != null ? sc.getWhereClause() : null;
+         if (clause != null && clause.length() == 0) {
+             clause = null;
+         }
+ 
+         final StringBuilder str = createCountSelect(sc, clause != null);
+         if (clause != null) {
+             str.append(clause);
+         }
+ 
+         Collection<JoinBuilder<SearchCriteria<?>>> joins = null;
+         if (sc != null) {
+             joins = sc.getJoins();
+             if (joins != null) {
+                 addJoins(str, joins);
+             }
+         }
+ 
+         // we have to disable group by in getting count, since count for groupBy clause will be different.
+         //List<Object> groupByValues = addGroupBy(str, sc);
+         final Transaction txn = Transaction.currentTxn();
+         final String sql = str.toString();
+ 
+         PreparedStatement pstmt = null;
+         try {
+             pstmt = txn.prepareAutoCloseStatement(sql);
+             int i = 0;
+             if (clause != null) {
+                 for (final Pair<Attribute, Object> value : sc.getValues()) {
+                     prepareAttribute(++i, pstmt, value.first(), value.second());
+                 }
+             }
+ 
+             if (joins != null) {
+                 i = addJoinAttributes(i, pstmt, joins);
+             }
+             
+             /*
+             if (groupByValues != null) {
+                 for (Object value : groupByValues) {
+                     pstmt.setObject(i++, value);
+                 }
+             }
+             */
+ 
+             final ResultSet rs = pstmt.executeQuery();
+             while (rs.next()) {
+                 return rs.getInt(1);
+             }
+             return 0;
+         } catch (final SQLException e) {
+             throw new CloudRuntimeException("DB Exception on: " + pstmt, e);
+         } catch (final Throwable e) {
+             throw new CloudRuntimeException("Caught: " + pstmt, e);
+         }
+     }
+ 
+     @DB(txn=false)
+     protected StringBuilder createCountSelect(SearchCriteria<?> sc, final boolean whereClause) {
+         StringBuilder sql = new StringBuilder(_count);
+ 
+         if (!whereClause) {
+             sql.delete(sql.length() - (_discriminatorClause == null ? 6 : 4), sql.length());
+         }
+ 
+         return sql;
+     }
+     
  }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/utils/src/com/cloud/utils/db/Transaction.java
----------------------------------------------------------------------