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

[12/40] Added Mock ApiServer, Regions API calls with api keys

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/src/com/cloud/region/RegionManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/region/RegionManagerImpl.java b/server/src/com/cloud/region/RegionManagerImpl.java
index 96ff28e..0311780 100755
--- a/server/src/com/cloud/region/RegionManagerImpl.java
+++ b/server/src/com/cloud/region/RegionManagerImpl.java
@@ -16,7 +16,6 @@
 // under the License.
 package com.cloud.region;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -24,10 +23,7 @@ import java.util.Map;
 import javax.ejb.Local;
 import javax.naming.ConfigurationException;
 
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.NameValuePair;
 import org.apache.log4j.Logger;
 
 import com.cloud.api.ApiConstants;
@@ -43,7 +39,6 @@ import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.region.dao.RegionDao;
-import com.cloud.server.ManagementServer;
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
 import com.cloud.user.AccountVO;
@@ -51,9 +46,12 @@ import com.cloud.user.DomainManager;
 import com.cloud.user.UserAccount;
 import com.cloud.user.UserVO;
 import com.cloud.user.dao.AccountDao;
+import com.cloud.user.dao.UserAccountDao;
 import com.cloud.user.dao.UserDao;
 import com.cloud.utils.component.Inject;
 import com.cloud.utils.component.Manager;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.uuididentity.dao.IdentityDao;
 
 @Local(value = { RegionManager.class, RegionService.class })
 public class RegionManagerImpl implements RegionManager, RegionService, Manager{
@@ -70,20 +68,19 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
     @Inject
     private DomainDao _domainDao;
     @Inject
-    private ManagementServer _mgmtSrvr;
-    @Inject
     private DomainManager _domainMgr;
-    
+    @Inject
+    private UserAccountDao _userAccountDao;    
+    @Inject
+    private IdentityDao _identityDao;
     
     private String _name;
-    private long _id = 1; //ToDo, get this from config or db.properties
-    
-    //ToDo use API constants
-    //prepare API params in advance
+    private int _id; 
     
     @Override
     public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
         _name = name;
+        _id = _regionDao.getRegionId();
         return true;
     }
     
@@ -105,45 +102,34 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 	@Override
 	public boolean propogateAddAccount(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) {
+		String command = "createAccount";
+		List<NameValuePair> params = new ArrayList<NameValuePair>();
+		params.add(new NameValuePair(ApiConstants.USERNAME, userName));
+		params.add(new NameValuePair(ApiConstants.PASSWORD, password));
+		params.add(new NameValuePair(ApiConstants.FIRSTNAME, firstName));
+		params.add(new NameValuePair(ApiConstants.LASTNAME, lastName));
+		params.add(new NameValuePair(ApiConstants.EMAIL, email));
+		params.add(new NameValuePair(ApiConstants.TIMEZONE, timezone));
+		params.add(new NameValuePair(ApiConstants.ACCOUNT, accountName));
+		params.add(new NameValuePair(ApiConstants.ACCOUNT_TYPE, ""+accountType));
+		//use domain UUID
+		params.add(new NameValuePair(ApiConstants.DOMAIN_ID, ((domainId != null) ? domainId.toString() : "")));
+		params.add(new NameValuePair(ApiConstants.NETWORK_DOMAIN, networkDomain));
+		params.add(new NameValuePair(ApiConstants.ACCOUNT_DETAILS, (details != null) ? details.toString() : ""));
+		params.add(new NameValuePair(ApiConstants.ACCOUNT_ID, accountUUID));
+		params.add(new NameValuePair(ApiConstants.USER_ID, userUUID));
+		params.add(new NameValuePair(ApiConstants.REGION_ID, ""+getId()));
+
 		List<RegionVO> regions =  _regionDao.listAll();
-		StringBuffer params = new StringBuffer("/api?command=createAccount");
-		params.append("&"+ApiConstants.USERNAME+"="+userName);
-		params.append("&"+ApiConstants.PASSWORD+"="+password);
-		params.append("&"+ApiConstants.FIRSTNAME+"="+firstName);
-		params.append("&"+ApiConstants.LASTNAME+"="+lastName);
-		params.append("&"+ApiConstants.EMAIL+"="+email);
-		if(timezone != null){
-			params.append("&"+ApiConstants.TIMEZONE+"="+timezone);		
-		}
-		if(accountName != null){
-			params.append("&"+ApiConstants.ACCOUNT+"="+accountName);			
-		}
-		params.append("&"+ApiConstants.ACCOUNT_TYPE+"="+accountType);
-		if(domainId != null){
-			params.append("&"+ApiConstants.DOMAIN_ID+"="+domainId); //use UUID			
-		}
-		if(networkDomain != null){
-			params.append("&"+ApiConstants.NETWORK_DOMAIN+"="+networkDomain);			
-		}
-		if(details != null){
-			params.append("&"+ApiConstants.ACCOUNT_DETAILS+"="+details); //ToDo change to Map
-		}
-		params.append("&"+ApiConstants.ACCOUNT_ID+"="+accountUUID);
-		params.append("&"+ApiConstants.USER_ID+"="+userUUID);
-		params.append("&"+ApiConstants.REGION_ID+"="+getId());
-		
 		for (Region region : regions){
 			if(region.getId() == getId()){
 				continue;
 			}
 			s_logger.debug("Adding account :"+accountName+" to Region: "+region.getId());
-			String url = region.getEndPoint() + params;
-			if (makeAPICall(url)) {
+			if (RegionsApiUtil.makeAPICall(region, command, params)) {
 				s_logger.debug("Successfully added account :"+accountName+" to Region: "+region.getId());
 			} else {
 				s_logger.error("Error while Adding account :"+accountName+" to Region: "+region.getId());
-				//Send Account delete to all Regions where account is added successfully
-				break;
 			}
 		}
 		return true;
@@ -156,8 +142,12 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 			return false;
 		}
 		String accountUUID = account.getUuid();
-		long regionId = account.getRegionId();
-		String params = "/api?command=deleteAccount&"+ApiConstants.ID+"="+accountUUID;
+		int regionId = account.getRegionId();
+		
+		String command = "deleteAccount";
+		List<NameValuePair> params = new ArrayList<NameValuePair>();
+		params.add(new NameValuePair(ApiConstants.ID, accountUUID));
+
 		if(getId() == regionId){
 			if(_accountMgr.deleteUserAccount(accountId)){
 				List<RegionVO> regions =  _regionDao.listAll();
@@ -165,8 +155,8 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 					if(region.getId() == getId()){
 						continue;
 					}
-					String url = region.getEndPoint() + params+"&"+ApiConstants.IS_PROPAGATE+"=true";
-					if (makeAPICall(url)) {
+					params.add(new NameValuePair(ApiConstants.IS_PROPAGATE, "true"));
+					if (RegionsApiUtil.makeAPICall(region, command, params)) {
 						s_logger.debug("Successfully deleted account :"+accountUUID+" in Region: "+region.getId());
 					} else {
 						s_logger.error("Error while deleting account :"+accountUUID+" in Region: "+region.getId());
@@ -179,8 +169,7 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 		} else {
 			//First delete in the Region where account is created
 			Region region = _regionDao.findById(regionId);
-			String url = region.getEndPoint() + params;
-			if (makeAPICall(url)) {
+			if (RegionsApiUtil.makeAPICall(region, command, params)) {
 				s_logger.debug("Successfully deleted account :"+accountUUID+" in Region: "+region.getId());
 				return true;
 			} else {
@@ -198,6 +187,7 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
         String accountName = cmd.getAccountName();
         String newAccountName = cmd.getNewName();
         String networkDomain = cmd.getNetworkDomain();
+        //ToDo send details
         Map<String, String> details = cmd.getDetails();
         
         Account account = null;
@@ -213,87 +203,70 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
             throw new InvalidParameterValueException("Unable to find account by accountId: " + accountId + " OR by name: " + accountName + " in domain " + domainId);
         }
         
-        StringBuffer params = new StringBuffer("/api?command=updateAccount");
-        params.append("&"+ApiConstants.NEW_NAME+"="+newAccountName);
-        if(account != null){
-        	params.append("&"+ApiConstants.ID+"="+account.getUuid());
-        }
-        if(accountName != null){
-        	params.append("&"+ApiConstants.ACCOUNT+"="+accountName);
-        }
-        if(domain != null){
-        	params.append("&"+ApiConstants.DOMAIN_ID+"="+domain.getUuid());
-        }
-        if(networkDomain != null){
-        	params.append("&"+ApiConstants.NETWORK_DOMAIN+"="+networkDomain);
-        }
-        if(details != null){
-        	params.append("&"+ApiConstants.ACCOUNT_DETAILS+"="+details);
-        }
-        
-		long regionId = account.getRegionId();
+        String command = "updateAccount";
+		List<NameValuePair> params = new ArrayList<NameValuePair>();
+		params.add(new NameValuePair(ApiConstants.NEW_NAME, newAccountName));
+		params.add(new NameValuePair(ApiConstants.ID, account.getUuid()));
+		params.add(new NameValuePair(ApiConstants.ACCOUNT, accountName));
+		params.add(new NameValuePair(ApiConstants.DOMAIN_ID, domain.getUuid()));
+		params.add(new NameValuePair(ApiConstants.NETWORK_DOMAIN, networkDomain));
+		params.add(new NameValuePair(ApiConstants.NEW_NAME, newAccountName));
+		if(details != null){
+			params.add(new NameValuePair(ApiConstants.ACCOUNT_DETAILS, details.toString()));
+		}
+		int regionId = account.getRegionId();
 		if(getId() == regionId){
-			Account updateAccount = _accountMgr.updateAccount(cmd);
-			if(updateAccount != null){
+			Account updatedAccount = _accountMgr.updateAccount(cmd);
+			if(updatedAccount != null){
 				List<RegionVO> regions =  _regionDao.listAll();
 				for (Region region : regions){
 					if(region.getId() == getId()){
 						continue;
 					}
-					String url = region.getEndPoint() + params+"&"+ApiConstants.IS_PROPAGATE+"=true";
-					if (makeAPICall(url)) {
+					params.add(new NameValuePair(ApiConstants.IS_PROPAGATE, "true"));
+					if (RegionsApiUtil.makeAPICall(region, command, params)) {
 						s_logger.debug("Successfully updated account :"+account.getUuid()+" in Region: "+region.getId());
 					} else {
 						s_logger.error("Error while updating account :"+account.getUuid()+" in Region: "+region.getId());
 					}
 				}
 			}
-			return updateAccount;
+			return updatedAccount;
 		} else {
 			//First update in the Region where account is created
 			Region region = _regionDao.findById(regionId);
-			String url = region.getEndPoint() + params;
-			if (makeAPICall(url)) {
+			RegionAccount updatedAccount = RegionsApiUtil.makeAccountAPICall(region, command, params);
+			if (updatedAccount != null) {
+				Long id = _identityDao.getIdentityId("account", updatedAccount.getUuid());
+				updatedAccount.setId(id);
+				Long domainID = _identityDao.getIdentityId("domain", updatedAccount.getDomainUuid());
+				updatedAccount.setDomainId(domainID);
 				s_logger.debug("Successfully updated account :"+account.getUuid()+" in source Region: "+region.getId());
-				//return Account object
-				return null;
+				return updatedAccount;
 			} else {
-				s_logger.error("Error while updating account :"+account.getUuid()+" in source Region: "+region.getId());
-				//throw exception;
-				return null;
+				throw new CloudRuntimeException("Error while updating account :"+account.getUuid()+" in source Region: "+region.getId());
 			}
 		}
 	}
 
-	private boolean makeAPICall(String url){
-		try {
-
-			HttpClient client = new HttpClient();
-			HttpMethod method = new GetMethod(url);
-			if( client.executeMethod(method) == 200){
-				return true;
-			} else {
-				return false;
-			}
-		} catch (HttpException e) {
-			s_logger.error(e.getMessage());
-			return false;
-		} catch (IOException e) {
-			s_logger.error(e.getMessage());
-			return false;
-		}
-		
-	}
-	
 	@Override
-	public Region addRegion(long id, String name, String endPoint) {
-		RegionVO region = new RegionVO(id, name, endPoint);
-		return _regionDao.persist(region);
+	public Region addRegion(int id, String name, String endPoint, String apiKey, String secretKey) {
+		if( _regionDao.findById(id) == null ){
+			RegionVO region = new RegionVO(id, name, endPoint, apiKey, secretKey);
+			return _regionDao.persist(region);
+		} else {
+			throw new InvalidParameterValueException("Region with id: "+id+" already exists");
+		}
 	}
 
 	@Override
-	public Region updateRegion(long id, String name, String endPoint) {
+	public Region updateRegion(int id, String name, String endPoint, String apiKey, String secretKey) {
 		RegionVO region = _regionDao.findById(id);
+		
+		if(region == null){
+			throw new InvalidParameterValueException("Region with id: "+id+" does not exist");
+		}
+		
 		if(name != null){
 			region.setName(name);
 		}
@@ -302,12 +275,20 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 			region.setEndPoint(endPoint);
 		}
 		
+		if(apiKey != null){
+			region.setApiKey(apiKey);
+		}
+		
+		if(secretKey != null){
+			region.setSecretKey(secretKey);
+		}
+		
 		_regionDao.update(id, region);
 		return _regionDao.findById(id);
 	}
 
 	@Override
-	public boolean removeRegion(long id) {
+	public boolean removeRegion(int id) {
 		RegionVO region = _regionDao.findById(id);
 		if(region != null){
 			return _regionDao.remove(id);
@@ -316,11 +297,11 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 		}
 	}
 
-	public long getId() {
+	public int getId() {
 		return _id;
 	}
 
-	public void setId(long _id) {
+	public void setId(int _id) {
 		this._id = _id;
 	}
 
@@ -347,16 +328,17 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
             throw new InvalidParameterValueException("Unable to find active account by accountId: " + accountId + " OR by name: " + accountName + " in domain " + domainId);
         }
 		String accountUUID = account.getUuid();
-		StringBuffer params = new StringBuffer("/api?command=disableAccount"+"&"+ApiConstants.LOCK+"="+lockRequested);
-		params.append("&"+ApiConstants.ID+"="+accountUUID);
-		if(accountName != null){
-			params.append("&"+ApiConstants.ACCOUNT+"="+accountName);
-		}
-        DomainVO domain = _domainDao.findById(domainId);
-		if(domain != null){
-			params.append("&"+ApiConstants.DOMAIN_ID+"="+domain.getUuid());
+		
+		String command = "disableAccount";
+		List<NameValuePair> params = new ArrayList<NameValuePair>();
+		params.add(new NameValuePair(ApiConstants.LOCK, lockRequested.toString()));
+		params.add(new NameValuePair(ApiConstants.ID, accountUUID));
+		DomainVO domain = _domainDao.findById(domainId);
+		if(domain != null){		
+			params.add(new NameValuePair(ApiConstants.DOMAIN_ID, domain.getUuid()));
 		}
-		long regionId = account.getRegionId();
+		
+		int regionId = account.getRegionId();
 		if(getId() == regionId){
 			Account retAccount = null;
 			if(lockRequested){
@@ -370,8 +352,8 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 					if(region.getId() == getId()){
 						continue;
 					}
-					String url = region.getEndPoint() + params +"&"+ApiConstants.IS_PROPAGATE+"=true";
-					if (makeAPICall(url)) {
+					params.add(new NameValuePair(ApiConstants.IS_PROPAGATE, "true"));
+					if (RegionsApiUtil.makeAPICall(region, command, params)) {
 						s_logger.debug("Successfully disabled account :"+accountUUID+" in Region: "+region.getId());
 					} else {
 						s_logger.error("Error while disabling account :"+accountUUID+" in Region: "+region.getId());
@@ -382,15 +364,12 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 		} else {
 			//First disable account in the Region where account is created
 			Region region = _regionDao.findById(regionId);
-			String url = region.getEndPoint() + params;
-			if (makeAPICall(url)) {
+			Account retAccount = RegionsApiUtil.makeAccountAPICall(region, command, params);
+			if (retAccount != null) {
 				s_logger.debug("Successfully disabled account :"+accountUUID+" in source Region: "+region.getId());
-				//return Account object
-				return null;
+				return retAccount;
 			} else {
-				s_logger.error("Error while disabling account :"+accountUUID+" in source Region: "+region.getId());
-				//throw exception;
-				return null;
+				throw new CloudRuntimeException("Error while disabling account :"+accountUUID+" in source Region: "+region.getId());
 			}
 		}
 	}
@@ -409,17 +388,17 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
             throw new InvalidParameterValueException("Unable to find account by accountId: " + accountId + " OR by name: " + accountName + " in domain " + domainId);
         }
         String accountUUID = account.getUuid();
-		StringBuffer params = new StringBuffer("/api?command=enableAccount");
-		params.append("&"+ApiConstants.ID+"="+accountUUID);
-		if(accountName != null){
-			params.append("&"+ApiConstants.ACCOUNT+"="+accountName);
-		}
+        
+        String command = "enableAccount";
+		List<NameValuePair> params = new ArrayList<NameValuePair>();
+		params.add(new NameValuePair(ApiConstants.ID, accountUUID));
+		params.add(new NameValuePair(ApiConstants.ACCOUNT, accountName));
         DomainVO domain = _domainDao.findById(domainId);
 		if(domain != null){
-			params.append("&"+ApiConstants.DOMAIN_ID+"="+domain.getUuid());
+			params.add(new NameValuePair(ApiConstants.DOMAIN_ID, domain.getUuid()));
 		}
-
-		long regionId = account.getRegionId();
+		
+		int regionId = account.getRegionId();
 		if(getId() == regionId){
 			Account retAccount = _accountMgr.enableAccount(accountName, domainId, accountId);
 			if(retAccount != null){
@@ -429,8 +408,8 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 					if(region.getId() == getId()){
 						continue;
 					}
-					String url = region.getEndPoint() + params +"&"+ApiConstants.IS_PROPAGATE+"=true";
-					if (makeAPICall(url)) {
+					params.add(new NameValuePair(ApiConstants.IS_PROPAGATE, "true"));
+					if (RegionsApiUtil.makeAPICall(region, command, params)) {
 						s_logger.debug("Successfully enabled account :"+accountUUID+" in Region: "+region.getId());
 					} else {
 						s_logger.error("Error while enabling account :"+accountUUID+" in Region: "+region.getId());
@@ -441,15 +420,12 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 		} else {
 			//First disable account in the Region where account is created
 			Region region = _regionDao.findById(regionId);
-			String url = region.getEndPoint() + params;
-			if (makeAPICall(url)) {
+			Account retAccount = RegionsApiUtil.makeAccountAPICall(region, command, params);
+			if (retAccount != null) {
 				s_logger.debug("Successfully enabled account :"+accountUUID+" in source Region: "+region.getId());
-				//return Account object
-				return null;
+				return retAccount;
 			} else {
-				s_logger.error("Error while enabling account :"+accountUUID+" in source Region: "+region.getId());
-				//throw exception;
-				return null;
+				throw new CloudRuntimeException("Error while enabling account :"+accountUUID+" in source Region: "+region.getId());
 			}
 		}
 	}
@@ -465,8 +441,12 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
         }
 		
 		String userUUID = user.getUuid();
-		long regionId = user.getRegionId();
-		String params = "/api?command=deleteUser&id="+userUUID;
+		int regionId = user.getRegionId();
+		
+		String command = "deleteUser";
+		List<NameValuePair> params = new ArrayList<NameValuePair>();
+		params.add(new NameValuePair(ApiConstants.ID, userUUID));
+		
 		if(getId() == regionId){
 			if(_accountMgr.deleteUser(cmd)){
 				List<RegionVO> regions =  _regionDao.listAll();
@@ -474,8 +454,8 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 					if(region.getId() == getId()){
 						continue;
 					}
-					String url = region.getEndPoint() + params +"&"+ApiConstants.IS_PROPAGATE+"=true";
-					if (makeAPICall(url)) {
+					params.add(new NameValuePair(ApiConstants.IS_PROPAGATE, "true"));
+					if (RegionsApiUtil.makeAPICall(region, command, params)) {
 						s_logger.debug("Successfully deleted user :"+userUUID+" in Region: "+region.getId());
 					} else {
 						s_logger.error("Error while deleting account :"+userUUID+" in Region: "+region.getId());
@@ -488,8 +468,7 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 		} else {
 			//First delete in the Region where account is created
 			Region region = _regionDao.findById(regionId);
-			String url = region.getEndPoint() + params;
-			if (makeAPICall(url)) {
+			if (RegionsApiUtil.makeAPICall(region, command, params)) {
 				s_logger.debug("Successfully deleted user :"+userUUID+" in Region: "+region.getId());
 				return true;
 			} else {
@@ -507,10 +486,13 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 			throw new InvalidParameterValueException("The specified domain doesn't exist in the system");
 		}
 		String domainUUID = domain.getUuid();
-        StringBuffer params = new StringBuffer("/api?command=deleteDomain");
-        params.append("&"+ApiConstants.ID+"="+domainUUID);
-        params.append("&"+ApiConstants.CLEANUP+"="+cleanup);
-        long regionId = domain.getRegionId();
+		
+		String command = "deleteDomain";
+		List<NameValuePair> params = new ArrayList<NameValuePair>();
+		params.add(new NameValuePair(ApiConstants.ID, domainUUID));
+		params.add(new NameValuePair(ApiConstants.CLEANUP, cleanup.toString()));
+		
+        int regionId = domain.getRegionId();
 		if(getId() == regionId){
 			if(_domainMgr.deleteDomain(id, cleanup)){
 				List<RegionVO> regions =  _regionDao.listAll();
@@ -518,8 +500,8 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 					if(region.getId() == getId()){
 						continue;
 					}
-					String url = region.getEndPoint() + params +"&"+ApiConstants.IS_PROPAGATE+"=true";
-					if (makeAPICall(url)) {
+					params.add(new NameValuePair(ApiConstants.IS_PROPAGATE, "true"));
+					if (RegionsApiUtil.makeAPICall(region, command, params)) {
 						s_logger.debug("Successfully deleted domain :"+domainUUID+" in Region: "+region.getId());
 					} else {
 						s_logger.error("Error while deleting domain :"+domainUUID+" in Region: "+region.getId());
@@ -532,8 +514,7 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 		} else {
 			//First delete in the Region where domain is created
 			Region region = _regionDao.findById(regionId);
-			String url = region.getEndPoint() + params;
-			if (makeAPICall(url)) {
+			if (RegionsApiUtil.makeAPICall(region, command, params)) {
 				s_logger.debug("Successfully deleted domain :"+domainUUID+" in Region: "+region.getId());
 				return true;
 			} else {
@@ -553,34 +534,20 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
             throw new InvalidParameterValueException("The specified user doesn't exist in the system");
         }
 		String userUUID = user.getUuid();
-        StringBuffer params = new StringBuffer("/api?command=updateUser");
-        params.append("&"+ApiConstants.ID+"="+userUUID);
-        if(cmd.getApiKey() != null){
-        	params.append("&"+ApiConstants.API_KEY+"="+cmd.getApiKey());    
-        }
-        if(cmd.getEmail() != null){
-        	params.append("&"+ApiConstants.EMAIL+"="+cmd.getEmail());    
-        }
-        if(cmd.getFirstname() != null){
-        	params.append("&"+ApiConstants.FIRSTNAME+"="+cmd.getFirstname());    
-        }        
-        if(cmd.getLastname() != null){
-        	params.append("&"+ApiConstants.LASTNAME+"="+cmd.getLastname());    
-        }        
-        if(cmd.getPassword() != null){
-        	params.append("&"+ApiConstants.PASSWORD+"="+cmd.getPassword());    
-        }
-        if(cmd.getSecretKey() != null){
-        	params.append("&"+ApiConstants.SECRET_KEY+"="+cmd.getSecretKey());    
-        }          
-        if(cmd.getTimezone() != null){
-        	params.append("&"+ApiConstants.TIMEZONE+"="+cmd.getTimezone());    
-        } 
-        if(cmd.getUsername() != null){
-        	params.append("&"+ApiConstants.USERNAME+"="+cmd.getUsername());    
-        }         
-
-		long regionId = user.getRegionId();
+		
+		String command = "updateUser";
+		List<NameValuePair> params = new ArrayList<NameValuePair>();
+		params.add(new NameValuePair(ApiConstants.ID, userUUID));
+		params.add(new NameValuePair(ApiConstants.API_KEY, cmd.getApiKey()));
+		params.add(new NameValuePair(ApiConstants.EMAIL, cmd.getEmail()));
+		params.add(new NameValuePair(ApiConstants.FIRSTNAME, cmd.getFirstname()));
+		params.add(new NameValuePair(ApiConstants.LASTNAME, cmd.getLastname()));
+		params.add(new NameValuePair(ApiConstants.PASSWORD, cmd.getPassword()));
+		params.add(new NameValuePair(ApiConstants.SECRET_KEY, cmd.getSecretKey()));
+		params.add(new NameValuePair(ApiConstants.TIMEZONE, cmd.getTimezone()));
+		params.add(new NameValuePair(ApiConstants.USERNAME, cmd.getUsername()));
+		
+		int regionId = user.getRegionId();
 		if(getId() == regionId){
 			UserAccount updateUser = _accountMgr.updateUser(cmd);
 			if(updateUser != null){
@@ -589,8 +556,8 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 					if(region.getId() == getId()){
 						continue;
 					}
-					String url = region.getEndPoint() + params +"&"+ApiConstants.IS_PROPAGATE+"=true";
-					if (makeAPICall(url)) {
+					params.add(new NameValuePair(ApiConstants.IS_PROPAGATE, "true"));
+					if (RegionsApiUtil.makeAPICall(region, command, params)) {
 						s_logger.debug("Successfully updated user :"+userUUID+" in Region: "+region.getId());
 					} else {
 						s_logger.error("Error while updating user :"+userUUID+" in Region: "+region.getId());
@@ -601,15 +568,12 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 		} else {
 			//First update in the Region where user was created
 			Region region = _regionDao.findById(regionId);
-			String url = region.getEndPoint() + params;
-			if (makeAPICall(url)) {
+			UserAccount updateUser = RegionsApiUtil.makeUserAccountAPICall(region, command, params);
+			if (updateUser != null) {
 				s_logger.debug("Successfully updated user :"+userUUID+" in source Region: "+region.getId());
-				//return object
-				return null;
+				return updateUser;
 			} else {
-				s_logger.error("Error while updating user :"+userUUID+" in source Region: "+region.getId());
-				//throw exception;
-				return null;
+				throw new CloudRuntimeException("Error while updating user :"+userUUID+" in source Region: "+region.getId());
 			}
 		}
 	}
@@ -622,26 +586,24 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 			throw new InvalidParameterValueException("The specified domain doesn't exist in the system");
 		}
 		String domainUUID = domain.getUuid();
-        StringBuffer params = new StringBuffer("/api?command=updateDomain");
-        params.append("&"+ApiConstants.ID+"="+domainUUID);
-        if(cmd.getDomainName() != null){
-        	params.append("&"+ApiConstants.NAME+"="+cmd.getDomainName());    
-        }
-        if(cmd.getNetworkDomain() != null){
-        	params.append("&"+ApiConstants.NETWORK_DOMAIN+"="+cmd.getNetworkDomain());    
-        }
-
-		long regionId = domain.getRegionId();
+		
+		String command = "updateDomain";
+		List<NameValuePair> params = new ArrayList<NameValuePair>();
+		params.add(new NameValuePair(ApiConstants.ID, domainUUID));
+		params.add(new NameValuePair(ApiConstants.NAME, cmd.getDomainName()));
+		params.add(new NameValuePair(ApiConstants.NETWORK_DOMAIN, cmd.getNetworkDomain()));
+		
+		int regionId = domain.getRegionId();
 		if(getId() == regionId){
-			Domain updatedDomain = _mgmtSrvr.updateDomain(cmd);
+			Domain updatedDomain = _domainMgr.updateDomain(cmd);
 			if(updatedDomain != null){
 				List<RegionVO> regions =  _regionDao.listAll();
 				for (Region region : regions){
 					if(region.getId() == getId()){
 						continue;
 					}
-					String url = region.getEndPoint() + params +"&"+ApiConstants.IS_PROPAGATE+"=true";
-					if (makeAPICall(url)) {
+					params.add(new NameValuePair(ApiConstants.IS_PROPAGATE, "true"));
+					if (RegionsApiUtil.makeAPICall(region, command, params)) {
 						s_logger.debug("Successfully updated updatedDomain :"+domainUUID+" in Region: "+region.getId());
 					} else {
 						s_logger.error("Error while updating updatedDomain :"+domainUUID+" in Region: "+region.getId());
@@ -652,15 +614,14 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 		} else {
 			//First update in the Region where domain was created
 			Region region = _regionDao.findById(regionId);
-			String url = region.getEndPoint() + params;
-			if (makeAPICall(url)) {
+			RegionDomain updatedDomain = RegionsApiUtil.makeDomainAPICall(region, command, params);
+			if (updatedDomain != null) {
+				Long parentId = _identityDao.getIdentityId("domain", updatedDomain.getParentUuid());
+				updatedDomain.setParent(parentId);
 				s_logger.debug("Successfully updated user :"+domainUUID+" in source Region: "+region.getId());
-				//return object
-				return null;
+				return (DomainVO)updatedDomain;
 			} else {
-				s_logger.error("Error while updating user :"+domainUUID+" in source Region: "+region.getId());
-				//throw exception;
-				return null;
+				throw new CloudRuntimeException("Error while updating user :"+domainUUID+" in source Region: "+region.getId());
 			}
 		}
 	}
@@ -671,8 +632,12 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
         if (user == null || user.getRemoved() != null) {
             throw new InvalidParameterValueException("Unable to find active user by id " + userId);
         }
-        long regionId = user.getRegionId();
-        StringBuffer params = new StringBuffer("/api?command=disableUser&id="+user.getUuid());
+        int regionId = user.getRegionId();
+        
+        String command = "disableUser";
+		List<NameValuePair> params = new ArrayList<NameValuePair>();
+		params.add(new NameValuePair(ApiConstants.ID, user.getUuid()));
+        
 		if(getId() == regionId){
 			UserAccount disabledUser = _accountMgr.disableUser(userId);
 			if(disabledUser != null){
@@ -681,8 +646,8 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 					if(region.getId() == getId()){
 						continue;
 					}
-					String url = region.getEndPoint() + params +"&"+ApiConstants.IS_PROPAGATE+"=true";
-					if (makeAPICall(url)) {
+					params.add(new NameValuePair(ApiConstants.IS_PROPAGATE, "true"));
+					if (RegionsApiUtil.makeAPICall(region, command, params)) {
 						s_logger.debug("Successfully disabled user :"+user.getUuid()+" in Region: "+region.getId());
 					} else {
 						s_logger.error("Error while disabling user :"+user.getUuid()+" in Region: "+region.getId());
@@ -693,15 +658,12 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 		} else {
 			//First disable in the Region where user was created
 			Region region = _regionDao.findById(regionId);
-			String url = region.getEndPoint() + params;
-			if (makeAPICall(url)) {
+			UserAccount disabledUser = RegionsApiUtil.makeUserAccountAPICall(region, command, params);
+			if (disabledUser != null) {
 				s_logger.debug("Successfully disabled user :"+user.getUuid()+" in source Region: "+region.getId());
-				//return object
-				return null;
+				return disabledUser;
 			} else {
-				s_logger.error("Error while disabling user :"+user.getUuid()+" in source Region: "+region.getId());
-				//throw exception;
-				return null;
+				throw new CloudRuntimeException("Error while disabling user :"+user.getUuid()+" in source Region: "+region.getId());
 			}
 		}
 	}
@@ -712,8 +674,12 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
         if (user == null || user.getRemoved() != null) {
             throw new InvalidParameterValueException("Unable to find active user by id " + userId);
         }
-        long regionId = user.getRegionId();
-        StringBuffer params = new StringBuffer("/api?command=enableUser&id="+user.getUuid());
+        int regionId = user.getRegionId();
+        
+        String command = "enableUser";
+		List<NameValuePair> params = new ArrayList<NameValuePair>();
+		params.add(new NameValuePair(ApiConstants.ID, user.getUuid()));
+        
 		if(getId() == regionId){
 			UserAccount enabledUser = _accountMgr.enableUser(userId);
 			if(enabledUser != null){
@@ -722,8 +688,8 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 					if(region.getId() == getId()){
 						continue;
 					}
-					String url = region.getEndPoint() + params +"&"+ApiConstants.IS_PROPAGATE+"=true";
-					if (makeAPICall(url)) {
+					params.add(new NameValuePair(ApiConstants.IS_PROPAGATE, "true"));
+					if (RegionsApiUtil.makeAPICall(region, command, params)) {
 						s_logger.debug("Successfully enabled user :"+user.getUuid()+" in Region: "+region.getId());
 					} else {
 						s_logger.error("Error while disabling user :"+user.getUuid()+" in Region: "+region.getId());
@@ -734,15 +700,12 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 		} else {
 			//First enable in the Region where user was created
 			Region region = _regionDao.findById(regionId);
-			String url = region.getEndPoint() + params;
-			if (makeAPICall(url)) {
+			UserAccount enabledUser = RegionsApiUtil.makeUserAccountAPICall(region, command, params);
+			if (enabledUser != null) {
 				s_logger.debug("Successfully enabled user :"+user.getUuid()+" in source Region: "+region.getId());
-				//return object
-				return null;
+				return enabledUser;
 			} else {
-				s_logger.error("Error while enabling user :"+user.getUuid()+" in source Region: "+region.getId());
-				//throw exception;
-				return null;
+				throw new CloudRuntimeException("Error while enabling user :"+user.getUuid()+" in source Region: "+region.getId());
 			}
 		}
 	}
@@ -752,23 +715,18 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 			String firstName, String lastName, String email, String timezone,
 			String accountName, String domainUUId, String userUUID) {
 		
-		StringBuffer params = new StringBuffer("/api?command=createUser");
-		params.append("&"+ApiConstants.USERNAME+"="+userName);
-		params.append("&"+ApiConstants.PASSWORD+"="+password);
-		params.append("&"+ApiConstants.FIRSTNAME+"="+firstName);
-		params.append("&"+ApiConstants.LASTNAME+"="+lastName);
-		params.append("&"+ApiConstants.EMAIL+"="+email);
-		if(timezone != null){
-			params.append("&"+ApiConstants.TIMEZONE+"="+timezone);		
-		}
-		if(accountName != null){
-			params.append("&"+ApiConstants.ACCOUNT+"="+accountName);	
-		}
-		if(domainUUId != null){
-			params.append("&"+ApiConstants.DOMAIN_ID+"="+domainUUId); //use UUID			
-		}
-		params.append("&"+ApiConstants.USER_ID+"="+userUUID);
-		params.append("&"+ApiConstants.REGION_ID+"="+getId());
+        String command = "createUser";
+		List<NameValuePair> params = new ArrayList<NameValuePair>();
+		params.add(new NameValuePair(ApiConstants.USERNAME, userName));
+		params.add(new NameValuePair(ApiConstants.PASSWORD, password));
+		params.add(new NameValuePair(ApiConstants.FIRSTNAME, firstName));
+		params.add(new NameValuePair(ApiConstants.LASTNAME, lastName));
+		params.add(new NameValuePair(ApiConstants.EMAIL, email));
+		params.add(new NameValuePair(ApiConstants.TIMEZONE, timezone));
+		params.add(new NameValuePair(ApiConstants.ACCOUNT, accountName));		
+		params.add(new NameValuePair(ApiConstants.DOMAIN_ID, domainUUId));
+		params.add(new NameValuePair(ApiConstants.USER_ID, userUUID));
+		params.add(new NameValuePair(ApiConstants.REGION_ID, ""+getId()));
 		
 		List<RegionVO> regions =  _regionDao.listAll();
 		for (Region region : regions){
@@ -776,13 +734,10 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 				continue;
 			}
 			s_logger.debug("Adding account :"+accountName+" to Region: "+region.getId());
-			String url = region.getEndPoint() + params;
-			if (makeAPICall(url)) {
+			if (RegionsApiUtil.makeAPICall(region, command, params)) {
 				s_logger.debug("Successfully added user :"+userName+" to Region: "+region.getId());
 			} else {
 				s_logger.error("Error while Adding user :"+userName+" to Region: "+region.getId());
-				//Send User delete to all Regions where account is added successfully
-				break;
 			}
 		}
 		return;		
@@ -790,21 +745,19 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 	
 	@Override
 	public void propogateAddDomain(String name, Long parentId, String networkDomain, String uuid) {
-		StringBuffer params = new StringBuffer("/api?command=createDomain");
-		params.append("&ApiConstants.NAME="+name);
-		String parentUUID = null;
+		
+        String command = "createDomain";
+		List<NameValuePair> params = new ArrayList<NameValuePair>();
+		params.add(new NameValuePair(ApiConstants.NAME, name));
 		if(parentId != null){
 			DomainVO domain = _domainDao.findById(parentId);
 			if(domain != null){
-				parentUUID = domain.getUuid();
-				params.append("&ApiConstants.PARENT_DOMAIN_ID="+parentUUID);
+				params.add(new NameValuePair(ApiConstants.PARENT_DOMAIN_ID, domain.getUuid()));
 			}
 		}
-		if(networkDomain != null){
-			params.append("&ApiConstants.NETWORK_DOMAIN="+networkDomain);
-		}
-		params.append("&ApiConstants.DOMAIN_ID="+uuid);
-		params.append("&ApiConstants.REGION_ID="+getId());
+		params.add(new NameValuePair(ApiConstants.NETWORK_DOMAIN, networkDomain));
+		params.add(new NameValuePair(ApiConstants.DOMAIN_ID, uuid));
+		params.add(new NameValuePair(ApiConstants.REGION_ID, ""+getId()));
 		
 		List<RegionVO> regions =  _regionDao.listAll();
 		for (Region region : regions){
@@ -812,17 +765,157 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 				continue;
 			}
 			s_logger.debug("Adding domain :"+name+" to Region: "+region.getId());
-			String url = region.getEndPoint() + params;
-			if (makeAPICall(url)) {
+			if (RegionsApiUtil.makeAPICall(region, command, params)) {
 				s_logger.debug("Successfully added domain :"+name+" to Region: "+region.getId());
 			} else {
 				s_logger.error("Error while Adding domain :"+name+" to Region: "+region.getId());
-				//Send User delete to all Regions where account is added successfully
-				break;
 			}
 		}
 		return;		
-		
 	}
 	
+	@Override
+    public UserAccount getUserAccount(String username, Long domainId) {
+		UserAccount user = _userAccountDao.getUserAccount(username, domainId);
+		if(user != null){
+			return user;
+		} else {
+			DomainVO domain = _domainDao.findById(domainId);
+			if(domain == null){
+				//Lookup Domain
+				s_logger.debug("Domain with Id :"+domainId+" doesn't exist");
+			}
+			String command = "findUser";
+			List<NameValuePair> params = new ArrayList<NameValuePair>();
+			params.add(new NameValuePair(ApiConstants.USERNAME, username));
+			params.add(new NameValuePair(ApiConstants.DOMAIN_ID, domain.getUuid()));
+			RegionUser regionuser = null;
+			List<RegionVO> regions =  _regionDao.listAll();
+			boolean sourceCheck = false;
+			for (Region region : regions){
+				if(region.getId() == getId()){
+					continue;
+				}
+				s_logger.debug("Looking up user :"+username+" in Region: "+region.getId());
+				regionuser = RegionsApiUtil.makeUserAPICall(region, command, params);
+				if(regionuser != null){
+					s_logger.debug("Found user :"+username+" in Region: "+region.getId());
+					if(regionuser.getRegionId() != region.getId()){
+						sourceCheck = true;
+					}
+					break;
+				}
+			}
+
+			if(regionuser == null){
+				s_logger.debug("User :"+username+" not found in any Region");
+				return null;
+			}
+			
+			if(sourceCheck){
+				if(regionuser.getRegionId() == getId()){
+					s_logger.debug("Current Region is the source Region for found user: " +username+ ". Ignoring..");
+					return null;
+				}
+				
+				s_logger.debug("Verifying user: " +username+ " in source Region: "+regionuser.getRegionId());
+				
+				//Verify user in source Region
+				Region sourceRegion = _regionDao.findById(regionuser.getRegionId());
+				if(sourceRegion != null){
+					regionuser = RegionsApiUtil.makeUserAPICall(sourceRegion, command, params);				 
+					if(regionuser != null && sourceRegion.getId() == regionuser.getRegionId()){
+						s_logger.debug("Found User :"+username+" in Source Region: "+sourceRegion.getId()+" Add to local Region");
+					} else {
+						s_logger.debug("User :"+username+" not found in Source Region: "+sourceRegion.getId());
+						return  null;
+					}
+				} else {
+					s_logger.debug("Source Region :"+regionuser.getRegionId()+" not found");
+					return  null;
+				}
+			}
+			
+			if(regionuser != null){
+				Long accountId = _identityDao.getIdentityId("account", regionuser.getAccountuuid());
+				if(accountId == null){
+					//Lookup Account
+				}
+				regionuser.setAccountId(accountId);
+				UserVO newuser = (UserVO)regionuser;
+				_userDao.persist(newuser);
+				return _userAccountDao.getUserAccount(username, domainId);
+			}
+			return null;
+		}
+    }
+	
+    @Override
+    public DomainVO findDomainByPath(String domainPath) {
+    	DomainVO domain = (DomainVO)_domainMgr.findDomainByPath(domainPath);
+    	if(domain != null){
+    		return domain;
+    	} else {
+    		String command = "findDomain";
+    		List<NameValuePair> params = new ArrayList<NameValuePair>();
+			params.add(new NameValuePair(ApiConstants.DOMAIN, domainPath));
+			boolean sourceCheck = false;
+			RegionDomain regiondomain = null;
+			List<RegionVO> regions =  _regionDao.listAll();
+			for (Region region : regions){
+				if(region.getId() == getId()){
+					continue;
+				}
+				s_logger.debug("Looking up domain :"+domainPath+" in Region: "+region.getId());
+				regiondomain = RegionsApiUtil.makeDomainAPICall(region, command, params);
+				if(regiondomain != null){
+					s_logger.debug("Found domain :"+domainPath+" in Region: "+region.getId());
+					if(regiondomain.getRegionId() != region.getId()){
+						sourceCheck = true;
+					}
+					break;
+				}
+			}
+
+			if(regiondomain == null){
+				s_logger.debug("Domain :"+domainPath+" not found in any Region");
+				return null;
+			}
+			
+			if(sourceCheck){
+				if(regiondomain.getRegionId() == getId()){
+					s_logger.debug("Current Region is the source Region for found domain: " +domainPath+ ". Ignoring..");
+					return null;
+				}
+				
+				s_logger.debug("Verifying domain: " +domainPath+ " in source Region: "+regiondomain.getRegionId());
+				
+				//Verify user in source Region
+				Region sourceRegion = _regionDao.findById(regiondomain.getRegionId());
+				if(sourceRegion != null){
+					DomainVO sourceDomain = RegionsApiUtil.makeDomainAPICall(sourceRegion, command, params);				 
+					if(sourceDomain != null && sourceRegion.getId() == sourceDomain.getRegionId()){
+						s_logger.debug("Found Domain :"+domainPath+" in Source Region: "+sourceRegion.getId()+" Add to local Region");
+					} else {
+						s_logger.debug("Domain :"+domainPath+" not found in Source Region: "+sourceRegion.getId());
+						return  null;
+					}
+				} else {
+					s_logger.debug("Source Region :"+regiondomain.getRegionId()+" not found");
+					return  null;
+				}
+			}
+			
+			if(regiondomain != null){
+				Long parentId = _identityDao.getIdentityId("domain", regiondomain.getParentUuid());
+				if(parentId == null){
+					//lookup ParentDomain
+				}
+				regiondomain.setParent(parentId);
+				regiondomain.setState(Domain.State.Active);
+				_domainDao.persist((DomainVO)regiondomain);
+			}
+			return (DomainVO)_domainMgr.findDomainByPath(domainPath);
+    	}
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/src/com/cloud/region/RegionUser.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/region/RegionUser.java b/server/src/com/cloud/region/RegionUser.java
new file mode 100644
index 0000000..8786558
--- /dev/null
+++ b/server/src/com/cloud/region/RegionUser.java
@@ -0,0 +1,76 @@
+// 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.region;
+
+import com.cloud.user.UserVO;
+
+public class RegionUser extends UserVO {
+    String accountUuid;
+    String created;
+    String account;
+    String accounttype;
+    String domainid;
+    String domain;
+
+	public RegionUser() {
+    }
+    
+    public String getAccountuuid() {
+		return accountUuid;
+	}
+
+	public void setAccountuuid(String accountUuid) {
+		this.accountUuid = accountUuid;
+	}
+
+	public void setCreated(String created) {
+		this.created = created;
+	}
+
+	public String getAccount() {
+		return account;
+	}
+
+	public void setAccount(String account) {
+		this.account = account;
+	}
+
+	public String getAccounttype() {
+		return accounttype;
+	}
+
+	public void setAccounttype(String accounttype) {
+		this.accounttype = accounttype;
+	}
+
+	public String getDomainid() {
+		return domainid;
+	}
+
+	public void setDomainid(String domainid) {
+		this.domainid = domainid;
+	}
+
+	public String getDomain() {
+		return domain;
+	}
+
+	public void setDomain(String domain) {
+		this.domain = domain;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/src/com/cloud/region/RegionVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/region/RegionVO.java b/server/src/com/cloud/region/RegionVO.java
index 4836594..c54dea2 100644
--- a/server/src/com/cloud/region/RegionVO.java
+++ b/server/src/com/cloud/region/RegionVO.java
@@ -20,12 +20,9 @@ import java.util.Date;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
 import javax.persistence.Id;
 import javax.persistence.Table;
 
-import com.cloud.region.Region;
 import com.cloud.utils.db.GenericDao;
 
 @Entity
@@ -34,7 +31,7 @@ public class RegionVO implements Region{
 
     @Id
     @Column(name="id")
-    private long id;
+    private int id;
     
     @Column(name="name")
     private String name;
@@ -42,9 +39,11 @@ public class RegionVO implements Region{
     @Column(name="end_point")
     private String endPoint;
     
-    @Column(name="status")
-    @Enumerated(value=EnumType.STRING)
-    private Region.State status;
+    @Column(name="api_key")
+    private String apiKey;
+    
+    @Column(name="secret_key")
+    private String secretKey;
     
     @Column(name=GenericDao.REMOVED_COLUMN)
     private Date removed;
@@ -52,14 +51,15 @@ public class RegionVO implements Region{
     public RegionVO() {
     }
     
-    public RegionVO(long id, String name, String endPoint) {
+    public RegionVO(int id, String name, String endPoint, String apiKey, String secretKey) {
     	this.id = id;
     	this.name = name;
     	this.endPoint = endPoint;
-    	this.status = Region.State.Down;
+    	this.apiKey = apiKey;
+    	this.secretKey = secretKey;
     }
 
-	public long getId() {
+	public int getId() {
 		return id;
 	}
 
@@ -71,14 +71,6 @@ public class RegionVO implements Region{
 		this.name = name;
 	}
 
-	public Region.State getStatus() {
-		return status;
-	}
-
-	public void setStatus(Region.State status) {
-		this.status = status;
-	}
-
 	public Date getRemoved() {
 		return removed;
 	}
@@ -91,5 +83,21 @@ public class RegionVO implements Region{
 		this.endPoint = endPoint;
 	}
 
+	public String getApiKey() {
+		return apiKey;
+	}
+
+	public void setApiKey(String apiKey) {
+		this.apiKey = apiKey;
+	}
+
+	public String getSecretKey() {
+		return secretKey;
+	}
+
+	public void setSecretKey(String secretKey) {
+		this.secretKey = secretKey;
+	}
+
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/src/com/cloud/region/RegionsApiUtil.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/region/RegionsApiUtil.java b/server/src/com/cloud/region/RegionsApiUtil.java
new file mode 100644
index 0000000..3e20fd3
--- /dev/null
+++ b/server/src/com/cloud/region/RegionsApiUtil.java
@@ -0,0 +1,285 @@
+// 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.region;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.NameValuePair;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.log4j.Logger;
+
+import com.cloud.domain.Domain;
+import com.cloud.domain.DomainVO;
+import com.cloud.user.Account;
+import com.cloud.user.AccountVO;
+import com.cloud.user.UserAccount;
+import com.cloud.user.UserAccountVO;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.converters.extended.ISO8601DateConverter;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+
+public class RegionsApiUtil {
+	public static final Logger s_logger = Logger.getLogger(RegionsApiUtil.class);
+
+	protected static boolean makeAPICall(Region region, String command, List<NameValuePair> params){
+		try {
+			String url = buildUrl(buildParams(command, params), region);
+			HttpClient client = new HttpClient();
+			HttpMethod method = new GetMethod(url);
+			if( client.executeMethod(method) == 200){
+				return true;
+			} else {
+				return false;
+			}
+		} catch (HttpException e) {
+			s_logger.error(e.getMessage());
+			return false;
+		} catch (IOException e) {
+			s_logger.error(e.getMessage());
+			return false;
+		} 		
+	}
+
+	protected static RegionAccount makeAccountAPICall(Region region, String command, List<NameValuePair> params){
+		try {
+			String url = buildUrl(buildParams(command, params), region);
+			HttpClient client = new HttpClient();
+			HttpMethod method = new GetMethod(url);
+			if( client.executeMethod(method) == 200){
+				InputStream is = method.getResponseBodyAsStream();
+				XStream xstream = new XStream(new DomDriver());
+				xstream.alias("account", RegionAccount.class);
+				xstream.alias("user", RegionUser.class);
+				xstream.aliasField("id", RegionAccount.class, "uuid");
+				xstream.aliasField("name", RegionAccount.class, "accountName");
+				xstream.aliasField("accounttype", RegionAccount.class, "type");
+				xstream.aliasField("domainid", RegionAccount.class, "domainUuid");
+				xstream.aliasField("networkdomain", RegionAccount.class, "networkDomain");
+				xstream.aliasField("id", RegionUser.class, "uuid");
+				xstream.aliasField("accountId", RegionUser.class, "accountUuid");
+				ObjectInputStream in = xstream.createObjectInputStream(is);
+				return (RegionAccount)in.readObject();
+			} else {
+				return null;
+			}
+		} catch (HttpException e) {
+			s_logger.error(e.getMessage());
+			return null;
+		} catch (IOException e) {
+			s_logger.error(e.getMessage());
+			return null;
+		} catch (ClassNotFoundException e) {
+			s_logger.error(e.getMessage());
+			return null;
+		} 	
+	}
+
+	protected static RegionDomain makeDomainAPICall(Region region, String command, List<NameValuePair> params){
+		try {
+			String url = buildUrl(buildParams(command, params), region);
+			HttpClient client = new HttpClient();
+			HttpMethod method = new GetMethod(url);
+			if( client.executeMethod(method) == 200){
+				InputStream is = method.getResponseBodyAsStream();
+				XStream xstream = new XStream(new DomDriver());
+				xstream.alias("domain", RegionDomain.class);
+				xstream.aliasField("id", RegionDomain.class, "uuid");
+				xstream.aliasField("parentdomainid", RegionDomain.class, "parentUuid");
+				xstream.aliasField("networkdomain", DomainVO.class, "networkDomain");
+				ObjectInputStream in = xstream.createObjectInputStream(is);
+				return (RegionDomain)in.readObject();
+			} else {
+				return null;
+			}
+		} catch (HttpException e) {
+			s_logger.error(e.getMessage());
+			return null;
+		} catch (IOException e) {
+			s_logger.error(e.getMessage());
+			return null;
+		} catch (ClassNotFoundException e) {
+			s_logger.error(e.getMessage());
+			return null;
+		} 	
+	}
+
+	protected static UserAccount makeUserAccountAPICall(Region region, String command, List<NameValuePair> params){
+		try {
+			String url = buildUrl(buildParams(command, params), region);
+			HttpClient client = new HttpClient();
+			HttpMethod method = new GetMethod(url);
+			if( client.executeMethod(method) == 200){
+				InputStream is = method.getResponseBodyAsStream();
+				XStream xstream = new XStream(new DomDriver());
+				xstream.alias("useraccount", UserAccountVO.class);
+				xstream.aliasField("id", UserAccountVO.class, "uuid");
+				ObjectInputStream in = xstream.createObjectInputStream(is);
+				return (UserAccountVO)in.readObject();
+			} else {
+				return null;
+			}
+		} catch (HttpException e) {
+			s_logger.error(e.getMessage());
+			return null;
+		} catch (IOException e) {
+			s_logger.error(e.getMessage());
+			return null;
+		} catch (ClassNotFoundException e) {
+			s_logger.error(e.getMessage());
+			return null;
+		} 	
+	}
+
+	protected static RegionUser makeUserAPICall(Region region, String command, List<NameValuePair> params){
+		try {
+			String url = buildUrl(buildParams(command, params), region);
+			HttpClient client = new HttpClient();
+			HttpMethod method = new GetMethod(url);
+			if( client.executeMethod(method) == 200){
+				InputStream is = method.getResponseBodyAsStream();
+				XStream xstream = new XStream(new DomDriver());
+				xstream.alias("finduserresponse", FindUserResponse.class);
+				xstream.alias("user", RegionUser.class);
+				xstream.aliasField("id", RegionUser.class, "uuid");
+				xstream.aliasField("accountId", RegionUser.class, "accountUuid");
+				xstream.registerConverter(new ISO8601DateConverter());				
+				FindUserResponse response = (FindUserResponse)xstream.fromXML(is);
+				return response.getUser();
+			} else {
+				return null;
+			}
+		} catch (HttpException e) {
+			s_logger.error(e.getMessage());
+			return null;
+		} catch (IOException e) {
+			s_logger.error(e.getMessage());
+			return null;
+		}
+	}
+	
+	private static String buildParams(String command, List<NameValuePair> params) {
+		StringBuffer paramString = new StringBuffer("command="+command);
+		Iterator<NameValuePair> iter = params.iterator();
+		try {
+			while(iter.hasNext()){
+				NameValuePair param = iter.next();
+				if(param.getValue() != null && !(param.getValue().isEmpty())){
+					paramString.append("&"+param.getName()+"="+URLEncoder.encode(param.getValue(), "UTF-8"));
+				}
+			}
+		}
+		catch (UnsupportedEncodingException e) {
+			s_logger.error(e.getMessage());
+			return null;
+		}
+		return paramString.toString();
+	}
+	
+	private static String buildUrl(String apiParams, Region region) {
+
+		String apiKey = region.getApiKey();
+		String secretKey = region.getSecretKey();
+
+
+		if (apiKey == null || secretKey == null) {
+			return region.getEndPoint() +"?"+ apiParams;
+		}
+
+		String encodedApiKey;
+		try {
+			encodedApiKey = URLEncoder.encode(apiKey, "UTF-8");
+
+			List<String> sortedParams = new ArrayList<String>();
+			sortedParams.add("apikey=" + encodedApiKey.toLowerCase());
+			StringTokenizer st = new StringTokenizer(apiParams, "&");
+			String url = null;
+			boolean first = true;
+			while (st.hasMoreTokens()) {
+				String paramValue = st.nextToken();
+				String param = paramValue.substring(0, paramValue.indexOf("="));
+				String value = paramValue.substring(paramValue.indexOf("=") + 1, paramValue.length());
+				if (first) {
+					url = param + "=" + value;
+					first = false;
+				} else {
+					url = url + "&" + param + "=" + value;
+				}
+				sortedParams.add(param.toLowerCase() + "=" + value.toLowerCase());
+			}
+			Collections.sort(sortedParams);
+
+
+			//Construct the sorted URL and sign and URL encode the sorted URL with your secret key
+			String sortedUrl = null;
+			first = true;
+			for (String param : sortedParams) {
+				if (first) {
+					sortedUrl = param;
+					first = false;
+				} else {
+					sortedUrl = sortedUrl + "&" + param;
+				}
+			}
+			String encodedSignature = signRequest(sortedUrl, secretKey);
+
+			String finalUrl = region.getEndPoint() +"?"+apiParams+ "&apiKey=" + apiKey + "&signature=" + encodedSignature;
+			
+			return finalUrl;
+
+		} catch (UnsupportedEncodingException e) {
+			s_logger.error(e.getMessage());
+			return null;
+		}
+	}
+
+	/**
+	 * 1. Signs a string with a secret key using SHA-1 2. Base64 encode the result 3. URL encode the final result
+	 * 
+	 * @param request
+	 * @param key
+	 * @return
+	 */
+	private static String signRequest(String request, String key) {
+		try {
+			Mac mac = Mac.getInstance("HmacSHA1");
+			SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "HmacSHA1");
+			mac.init(keySpec);
+			mac.update(request.getBytes());
+			byte[] encryptedBytes = mac.doFinal();
+			return URLEncoder.encode(Base64.encodeBase64String(encryptedBytes), "UTF-8");
+		} catch (Exception ex) {
+			s_logger.error(ex.getMessage());
+			return null;
+		}
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/src/com/cloud/region/dao/RegionDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/region/dao/RegionDao.java b/server/src/com/cloud/region/dao/RegionDao.java
index 829b8a6..e334ef8 100644
--- a/server/src/com/cloud/region/dao/RegionDao.java
+++ b/server/src/com/cloud/region/dao/RegionDao.java
@@ -19,5 +19,5 @@ package com.cloud.region.dao;
 import com.cloud.region.RegionVO;
 import com.cloud.utils.db.GenericDao;
 
-public interface RegionDao extends GenericDao<RegionVO, Long> {
+public interface RegionDao extends GenericDao<RegionVO, Integer> {
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/src/com/cloud/region/dao/RegionDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/region/dao/RegionDaoImpl.java b/server/src/com/cloud/region/dao/RegionDaoImpl.java
index 79d6d92..0d8a69d 100644
--- a/server/src/com/cloud/region/dao/RegionDaoImpl.java
+++ b/server/src/com/cloud/region/dao/RegionDaoImpl.java
@@ -24,7 +24,7 @@ import com.cloud.region.RegionVO;
 import com.cloud.utils.db.GenericDaoBase;
 
 @Local(value={RegionDao.class})
-public class RegionDaoImpl extends GenericDaoBase<RegionVO, Long> implements RegionDao {
+public class RegionDaoImpl extends GenericDaoBase<RegionVO, Integer> implements RegionDao {
     private static final Logger s_logger = Logger.getLogger(RegionDaoImpl.class);
     
     public RegionDaoImpl(){

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/src/com/cloud/server/ConfigurationServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java
index a0d10b6..43fe57a 100755
--- a/server/src/com/cloud/server/ConfigurationServerImpl.java
+++ b/server/src/com/cloud/server/ConfigurationServerImpl.java
@@ -85,6 +85,8 @@ import com.cloud.offerings.NetworkOfferingServiceMapVO;
 import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.offerings.dao.NetworkOfferingDao;
 import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
+import com.cloud.region.RegionVO;
+import com.cloud.region.dao.RegionDao;
 import com.cloud.service.ServiceOfferingVO;
 import com.cloud.service.dao.ServiceOfferingDao;
 import com.cloud.storage.DiskOfferingVO;
@@ -123,6 +125,7 @@ public class ConfigurationServerImpl implements ConfigurationServer {
     private final ResourceCountDao _resourceCountDao;
     private final NetworkOfferingServiceMapDao _ntwkOfferingServiceMapDao;
     private final IdentityDao _identityDao;
+    private final RegionDao _regionDao;
 
     public ConfigurationServerImpl() {
         ComponentLocator locator = ComponentLocator.getLocator(Name);
@@ -140,6 +143,7 @@ public class ConfigurationServerImpl implements ConfigurationServer {
         _resourceCountDao = locator.getDao(ResourceCountDao.class);
         _ntwkOfferingServiceMapDao = locator.getDao(NetworkOfferingServiceMapDao.class);
         _identityDao = locator.getDao(IdentityDao.class);
+        _regionDao = locator.getDao(RegionDao.class);
     }
 
     @Override
@@ -228,6 +232,8 @@ public class ConfigurationServerImpl implements ConfigurationServer {
             // Create default networks
             createDefaultNetworks();
 
+            createDefaultRegion();
+            
             // Create userIpAddress ranges
 
             // Update existing vlans with networkId
@@ -274,7 +280,7 @@ public class ConfigurationServerImpl implements ConfigurationServer {
         updateCloudIdentifier();
 
         updateUuids();
-
+        
         // Set init to true
         _configDao.update("init", "Hidden", "true");
     }
@@ -324,6 +330,7 @@ public class ConfigurationServerImpl implements ConfigurationServer {
 
     @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')";
         Transaction txn = Transaction.currentTxn();
@@ -1272,5 +1279,11 @@ public class ConfigurationServerImpl implements ConfigurationServer {
 
         return svcProviders;
     }
+    
+    private void createDefaultRegion(){
+    	//Get Region name and URL from db.properties    	
+    	_regionDao.persist(new RegionVO(_regionDao.getRegionId(), "Local", "http://localhost:8080/client/api", "", ""));
+    	//Default account, user and domain should share same uuid
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index 4f489bc..3aa04bf 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -1970,99 +1970,6 @@ public class ManagementServerImpl implements ManagementServer {
     }
 
     @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);
-        }
-    }
-
-    @Override
     public List<? extends Alert> searchForAlerts(ListAlertsCmd cmd) {
         Filter searchFilter = new Filter(AlertVO.class, "lastSent", false, cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchCriteria<AlertVO> sc = _alertDao.createSearchCriteria();

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/src/com/cloud/user/AccountManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/user/AccountManager.java b/server/src/com/cloud/user/AccountManager.java
index 3d55b9f..ad67618 100755
--- a/server/src/com/cloud/user/AccountManager.java
+++ b/server/src/com/cloud/user/AccountManager.java
@@ -49,7 +49,7 @@ public interface AccountManager extends AccountService {
 
 	Long checkAccessAndSpecifyAuthority(Account caller, Long zoneId);
 	
-	Account createAccount(String accountName, short accountType, Long domainId, String networkDomain, Map details, String uuid, long regionId);
+	Account createAccount(String accountName, short accountType, Long domainId, String networkDomain, Map details, String uuid, int regionId);
 	
 	UserVO createUser(long accountId, String userName, String password, String firstName, String lastName, String email, String timezone);
 	

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/src/com/cloud/user/AccountManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java
index b58c417..7d36d54 100755
--- a/server/src/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/com/cloud/user/AccountManagerImpl.java
@@ -759,7 +759,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_ACCOUNT_CREATE, eventDescription = "creating Account")
     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, Long regionId) {
+            Map<String, String> details, String accountUUID, String userUUID, Integer regionId) {
 
         if (accountName == null) {
             accountName = userName;
@@ -849,7 +849,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag
     }
 
     @Override
-    public UserVO createUser(String userName, String password, String firstName, String lastName, String email, String timeZone, String accountName, Long domainId, String userUUID, Long regionId) {
+    public UserVO createUser(String userName, String password, String firstName, String lastName, String email, String timeZone, String accountName, Long domainId, String userUUID, Integer regionId) {
 
         // default domain to ROOT if not specified
         if (domainId == null) {
@@ -1629,7 +1629,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag
 
     @Override
     @DB
-    public AccountVO createAccount(String accountName, short accountType, Long domainId, String networkDomain, Map details, String uuid, long regionId) {
+    public AccountVO createAccount(String accountName, short accountType, Long domainId, String networkDomain, Map details, String uuid, int regionId) {
         // Validate domain
         Domain domain = _domainMgr.getDomain(domainId);
         if (domain == null) {
@@ -1709,7 +1709,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag
     }
 
     //ToDo Add events??
-    public UserVO createUser(long accountId, String userName, String password, String firstName, String lastName, String email, String timezone, String uuid, long regionId) {
+    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);
         }
@@ -2377,4 +2377,19 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag
 	public UserAccount getUserByApiKey(String apiKey) {
 		return _userAccountDao.getUserByApiKey(apiKey);
 	}
+
+	@Override
+	public User findUser(String username, Long domainId) {
+		UserAccount userAccount = _userAccountDao.getUserAccount(username, domainId);
+		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);		
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/src/com/cloud/user/DomainManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/user/DomainManager.java b/server/src/com/cloud/user/DomainManager.java
index 36f7e6c..aea653e 100644
--- a/server/src/com/cloud/user/DomainManager.java
+++ b/server/src/com/cloud/user/DomainManager.java
@@ -25,16 +25,7 @@ import com.cloud.domain.DomainVO;
 public interface DomainManager extends DomainService {
     Set<Long> getDomainChildrenIds(String parentDomainPath);
 
-    Domain createDomain(String name, Long parentId, Long ownerId, String networkDomain, String domainUUID, Long regionId);
-
-    /**
-     * find the domain by its path
-     * 
-     * @param domainPath
-     *            the path to use to lookup a domain
-     * @return domainVO the domain with the matching path, or null if no domain with the given path exists
-     */
-    DomainVO findDomainByPath(String domainPath);
+    Domain createDomain(String name, Long parentId, Long ownerId, String networkDomain, String domainUUID, Integer regionId);
 
     Set<Long> getDomainParentIds(long domainId);
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/src/com/cloud/user/DomainManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/user/DomainManagerImpl.java b/server/src/com/cloud/user/DomainManagerImpl.java
index 53dca93..8ec68bb 100644
--- a/server/src/com/cloud/user/DomainManagerImpl.java
+++ b/server/src/com/cloud/user/DomainManagerImpl.java
@@ -28,6 +28,7 @@ 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;
@@ -131,7 +132,7 @@ public class DomainManagerImpl implements DomainManager, DomainService, Manager
 
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_DOMAIN_CREATE, eventDescription = "creating Domain")
-    public Domain createDomain(String name, Long parentId, String networkDomain, String domainUUID, Long regionId) {
+    public Domain createDomain(String name, Long parentId, String networkDomain, String domainUUID, Integer regionId) {
         Account caller = UserContext.current().getCaller();
 
         if (parentId == null) {
@@ -155,7 +156,7 @@ public class DomainManagerImpl implements DomainManager, DomainService, Manager
 
     @Override
     @DB
-    public Domain createDomain(String name, Long parentId, Long ownerId, String networkDomain, String domainUUID, Long regionId) {
+    public Domain createDomain(String name, Long parentId, Long ownerId, String networkDomain, String domainUUID, Integer regionId) {
         // Verify network domain
         if (networkDomain != null) {
             if (!NetUtils.verifyDomainName(networkDomain)) {
@@ -483,4 +484,97 @@ public class DomainManagerImpl implements DomainManager, DomainService, Manager
         return _domainDao.search(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/f0f33bf4/server/src/com/cloud/user/dao/AccountDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/user/dao/AccountDaoImpl.java b/server/src/com/cloud/user/dao/AccountDaoImpl.java
index ab3fd23..f7ad679 100755
--- a/server/src/com/cloud/user/dao/AccountDaoImpl.java
+++ b/server/src/com/cloud/user/dao/AccountDaoImpl.java
@@ -32,7 +32,6 @@ import com.cloud.user.User;
 import com.cloud.user.UserVO;
 import com.cloud.utils.Pair;
 import com.cloud.utils.crypt.DBEncryptionUtil;
-import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/src/com/cloud/user/dao/UserAccountDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/user/dao/UserAccountDaoImpl.java b/server/src/com/cloud/user/dao/UserAccountDaoImpl.java
index 663e58f..fc4166d 100644
--- a/server/src/com/cloud/user/dao/UserAccountDaoImpl.java
+++ b/server/src/com/cloud/user/dao/UserAccountDaoImpl.java
@@ -62,4 +62,5 @@ public class UserAccountDaoImpl extends GenericDaoBase<UserAccountVO, Long> impl
 		sc.setParameters("apiKey",apiKey);
 		return findOneBy(sc);
 	}
+	
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/src/com/cloud/user/dao/UserDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/user/dao/UserDaoImpl.java b/server/src/com/cloud/user/dao/UserDaoImpl.java
index 9bcee2f..19ef691 100644
--- a/server/src/com/cloud/user/dao/UserDaoImpl.java
+++ b/server/src/com/cloud/user/dao/UserDaoImpl.java
@@ -20,7 +20,9 @@ import java.util.List;
 
 import javax.ejb.Local;
 
+import com.cloud.region.RegionManager;
 import com.cloud.user.UserVO;
+import com.cloud.utils.component.Inject;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
@@ -35,7 +37,6 @@ public class UserDaoImpl extends GenericDaoBase<UserVO, Long> implements UserDao
     protected SearchBuilder<UserVO> AccountIdSearch;
     protected SearchBuilder<UserVO> SecretKeySearch;
     protected SearchBuilder<UserVO> RegistrationTokenSearch;
-    private final long _regionId = 1;
     
     protected UserDaoImpl () {
     	UsernameSearch = createSearchBuilder();
@@ -125,10 +126,4 @@ public class UserDaoImpl extends GenericDaoBase<UserVO, Long> implements UserDao
         return listBy(sc);
 	}
 	
-	@Override
-	@DB
-	public UserVO persist(UserVO user) {
-		user.setRegionId(_regionId);
-		return super.persist(user);
-	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/f0f33bf4/server/test/com/cloud/async/TestAsyncJobManager.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/async/TestAsyncJobManager.java b/server/test/com/cloud/async/TestAsyncJobManager.java
index 8ce51fa..9b154ff 100644
--- a/server/test/com/cloud/async/TestAsyncJobManager.java
+++ b/server/test/com/cloud/async/TestAsyncJobManager.java
@@ -228,25 +228,25 @@ public class TestAsyncJobManager extends ComponentTestCase {
 		getRandomMilliseconds(1, 100);		
 		DomainDao domainDao = new DomainDaoImpl();
 		
-		DomainVO domain1 = new DomainVO("d1", 2L, 1L, null);
+		DomainVO domain1 = new DomainVO("d1", 2L, 1L, null, 1);
 		domainDao.create(domain1);
 		
-		DomainVO domain2 = new DomainVO("d2", 2L, 1L, null);
+		DomainVO domain2 = new DomainVO("d2", 2L, 1L, null, 1);
 		domainDao.create(domain2);
 		
-		DomainVO domain3 = new DomainVO("d3", 2L, 1L, null);
+		DomainVO domain3 = new DomainVO("d3", 2L, 1L, null, 1);
 		domainDao.create(domain3);
 
-		DomainVO domain11 = new DomainVO("d11", 2L, domain1.getId(), null);
+		DomainVO domain11 = new DomainVO("d11", 2L, domain1.getId(), null, 1);
 		domainDao.create(domain11);
 		
 		domainDao.remove(domain11.getId());
 		
-		DomainVO domain12 = new DomainVO("d12", 2L, domain1.getId(), null);
+		DomainVO domain12 = new DomainVO("d12", 2L, domain1.getId(), null, 1);
 		domainDao.create(domain12);
 		
 		domainDao.remove(domain3.getId());
-		DomainVO domain4 = new DomainVO("d4", 2L, 1L, null);
+		DomainVO domain4 = new DomainVO("d4", 2L, 1L, null, 1);
 		domainDao.create(domain4);
 	}
 }