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:12 UTC

[1/50] [abbrv] git commit: refs/heads/javelin - propogate account changes to other Regions

propogate account changes to other Regions


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/4ea36b82
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/4ea36b82
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/4ea36b82

Branch: refs/heads/javelin
Commit: 4ea36b82e9bb88e75f98982f8c302719f7520f2d
Parents: 470cd12
Author: kishan <ki...@cloud.com>
Authored: Fri Aug 24 15:59:59 2012 +0530
Committer: kishan <ki...@cloud.com>
Committed: Fri Aug 24 15:59:59 2012 +0530

----------------------------------------------------------------------
 api/src/com/cloud/api/ApiConstants.java            |    5 +-
 .../com/cloud/api/commands/CreateAccountCmd.java   |   41 +++-
 .../com/cloud/api/commands/DeleteAccountCmd.java   |   18 +-
 .../com/cloud/api/commands/DisableAccountCmd.java  |   24 ++-
 .../com/cloud/api/commands/EnableAccountCmd.java   |   16 +-
 .../com/cloud/api/commands/UpdateAccountCmd.java   |   16 +-
 api/src/com/cloud/region/RegionService.java        |    6 +
 api/src/com/cloud/user/Account.java                |    4 +
 api/src/com/cloud/user/AccountService.java         |    2 +-
 core/src/com/cloud/user/AccountVO.java             |    4 +-
 core/src/com/cloud/user/UserVO.java                |    7 +-
 .../src/com/cloud/projects/ProjectManagerImpl.java |    2 +-
 server/src/com/cloud/region/RegionManager.java     |    7 +-
 server/src/com/cloud/region/RegionManagerImpl.java |  198 ++++++++++++++-
 server/src/com/cloud/region/RegionVO.java          |    8 +-
 server/src/com/cloud/user/AccountManager.java      |    2 +-
 server/src/com/cloud/user/AccountManagerImpl.java  |   83 +++++--
 server/src/com/cloud/user/dao/AccountDaoImpl.java  |    7 -
 18 files changed, 380 insertions(+), 70 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/api/src/com/cloud/api/ApiConstants.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java
index 69e7939..b5e6002 100755
--- a/api/src/com/cloud/api/ApiConstants.java
+++ b/api/src/com/cloud/api/ApiConstants.java
@@ -358,7 +358,10 @@ public class ApiConstants {
     public static final String VSM_DEVICE_STATE = "vsmdevicestate";
     public static final String ADD_VSM_FLAG = "addvsmflag";
 	public static final String END_POINT = "endpoint";
-    
+	//public static final String REGION_DETAILS = "regiondetails";
+	public static final String REGION_ID = "regionid";
+	public static final String IS_PROPAGATE = "ispropagate";
+	
     public enum HostDetails {
         all, capacity, events, stats, min;
     }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/api/src/com/cloud/api/commands/CreateAccountCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/CreateAccountCmd.java b/api/src/com/cloud/api/commands/CreateAccountCmd.java
index 00e8776..9fc7d2d 100755
--- a/api/src/com/cloud/api/commands/CreateAccountCmd.java
+++ b/api/src/com/cloud/api/commands/CreateAccountCmd.java
@@ -76,6 +76,20 @@ public class CreateAccountCmd extends BaseCmd {
 
 	@Parameter(name = ApiConstants.ACCOUNT_DETAILS, type = CommandType.MAP, description = "details for account used to store specific parameters")
     private Map<String, String> details;
+	
+	//@Parameter(name = ApiConstants.REGION_DETAILS, type = CommandType.MAP, description = "details for account used to store region specific parameters")
+    //private Map<String, String> regionDetails;
+	
+    @Parameter(name=ApiConstants.ACCOUNT_ID, type=CommandType.STRING, description="Account UUID, required for adding account from another Region")
+    private String accountUUID;
+
+    @Parameter(name=ApiConstants.USER_ID, type=CommandType.STRING, description="User UUID, required for adding account from another Region")
+    private String userUUID;
+
+    @Parameter(name=ApiConstants.REGION_ID, type=CommandType.LONG, description="Id of the Region creating the account")
+    private Long regionId;
+
+    
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -130,11 +144,31 @@ public class CreateAccountCmd extends BaseCmd {
     	return params;
     }
 
+    /*public Map<String, String> getRegionDetails() {
+    	if (regionDetails == null || regionDetails.isEmpty()) {
+    		return null;
+    	}
+    	
+		return regionDetails;
+	}*/
+    
+    public String getAccountUUID() {
+		return accountUUID;
+	}
+
+	public String getUserUUID() {
+		return userUUID;
+	}
+
+	public Long getRegionId() {
+		return regionId;
+	}
+    
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
 
-    @Override
+	@Override
     public String getCommandName() {
         return s_name;
     }
@@ -144,10 +178,11 @@ public class CreateAccountCmd extends BaseCmd {
         return Account.ACCOUNT_ID_SYSTEM;
     }
     
-    @Override
+	@Override
     public void execute(){
         UserContext.current().setEventDetails("Account Name: "+getAccountName()+", Domain Id:"+getDomainId());
-        UserAccount userAccount = _accountService.createUserAccount(getUsername(), getPassword(), getFirstName(), getLastName(), getEmail(), getTimeZone(), getAccountName(), getAccountType(), getDomainId(), getNetworkDomain(), getDetails());
+        UserAccount userAccount = _accountService.createUserAccount(getUsername(), getPassword(), getFirstName(), getLastName(), getEmail(), getTimeZone(), getAccountName(), getAccountType(), getDomainId(), getNetworkDomain(), getDetails(), 
+        		getAccountUUID(), getUserUUID(), getRegionId());
         if (userAccount != null) {
             AccountResponse response = _responseGenerator.createUserAccountResponse(userAccount);
             response.setResponseName(getCommandName());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/api/src/com/cloud/api/commands/DeleteAccountCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/DeleteAccountCmd.java b/api/src/com/cloud/api/commands/DeleteAccountCmd.java
index a7bfca7..9b40e6b 100755
--- a/api/src/com/cloud/api/commands/DeleteAccountCmd.java
+++ b/api/src/com/cloud/api/commands/DeleteAccountCmd.java
@@ -46,15 +46,21 @@ public class DeleteAccountCmd extends BaseAsyncCmd {
     @Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="Account id")
     private Long id;
 
+    @Parameter(name=ApiConstants.IS_PROPAGATE, type=CommandType.BOOLEAN, description="True if command is sent from another Region")
+    private Boolean isPropagate;
 
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
 
-    public Long getId() {
+
+	public Long getId() {
         return id;
     }
-
+    
+	public Boolean getIsPropagate() {
+		return isPropagate;
+	}
 
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
@@ -93,7 +99,13 @@ public class DeleteAccountCmd extends BaseAsyncCmd {
     @Override
     public void execute(){
         UserContext.current().setEventDetails("Account Id: "+getId());
-        boolean result = _accountService.deleteUserAccount(getId());
+        boolean isPopagate = (getIsPropagate() != null ) ? getIsPropagate() : false; 
+        boolean result = false;
+        if(isPopagate){
+        	result = _accountService.deleteUserAccount(getId());
+        } else {
+        	result = _regionService.deleteUserAccount(getId());
+        }
         if (result) {
             SuccessResponse response = new SuccessResponse(getCommandName());
             this.setResponseObject(response);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/api/src/com/cloud/api/commands/DisableAccountCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/DisableAccountCmd.java b/api/src/com/cloud/api/commands/DisableAccountCmd.java
index 7c5e5e3..ba22166 100644
--- a/api/src/com/cloud/api/commands/DisableAccountCmd.java
+++ b/api/src/com/cloud/api/commands/DisableAccountCmd.java
@@ -25,6 +25,7 @@ import com.cloud.api.IdentityMapper;
 import com.cloud.api.Implementation;
 import com.cloud.api.Parameter;
 import com.cloud.api.ServerApiException;
+import com.cloud.api.BaseCmd.CommandType;
 import com.cloud.api.response.AccountResponse;
 import com.cloud.async.AsyncJob;
 import com.cloud.event.EventTypes;
@@ -55,6 +56,9 @@ public class DisableAccountCmd extends BaseAsyncCmd {
     @Parameter(name=ApiConstants.LOCK, type=CommandType.BOOLEAN, required=true, description="If true, only lock the account; else disable the account")
     private Boolean lockRequested;
 
+    @Parameter(name=ApiConstants.IS_PROPAGATE, type=CommandType.BOOLEAN, description="True if command is sent from another Region")
+    private Boolean isPropagate;
+    
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -71,6 +75,10 @@ public class DisableAccountCmd extends BaseAsyncCmd {
         return domainId;
     }
 
+	public Boolean getIsPropagate() {
+		return isPropagate;
+	}
+    
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
@@ -109,10 +117,18 @@ public class DisableAccountCmd extends BaseAsyncCmd {
     public void execute() throws ConcurrentOperationException, ResourceUnavailableException{
         UserContext.current().setEventDetails("Account Name: "+getAccountName()+", Domain Id:"+getDomainId());
     	Account result = null;
-    	if(lockRequested)
-    		result = _accountService.lockAccount(getAccountName(), getDomainId(), getId());
-    	else
-    		result = _accountService.disableAccount(getAccountName(), getDomainId(), getId());
+    	boolean isPopagate = (getIsPropagate() != null ) ? getIsPropagate() : false;
+    	if(isPopagate){
+    		if(lockRequested)
+    			result = _accountService.lockAccount(getAccountName(), getDomainId(), getId());
+    		else
+    			result = _accountService.disableAccount(getAccountName(), getDomainId(), getId());
+    	} else {
+    		if(lockRequested)
+    			result = _regionService.lockAccount(getAccountName(), getDomainId(), getId());
+    		else
+    			result = _regionService.disableAccount(getAccountName(), getDomainId(), getId());
+    	}
         if (result != null){
             AccountResponse response = _responseGenerator.createAccountResponse(result);
             response.setResponseName(getCommandName());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/api/src/com/cloud/api/commands/EnableAccountCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/EnableAccountCmd.java b/api/src/com/cloud/api/commands/EnableAccountCmd.java
index 576f935..536358e 100644
--- a/api/src/com/cloud/api/commands/EnableAccountCmd.java
+++ b/api/src/com/cloud/api/commands/EnableAccountCmd.java
@@ -24,6 +24,7 @@ import com.cloud.api.IdentityMapper;
 import com.cloud.api.Implementation;
 import com.cloud.api.Parameter;
 import com.cloud.api.ServerApiException;
+import com.cloud.api.BaseCmd.CommandType;
 import com.cloud.api.response.AccountResponse;
 import com.cloud.user.Account;
 
@@ -46,6 +47,9 @@ public class EnableAccountCmd extends BaseCmd {
     @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.LONG, description="Enables specified account in this domain.")
     private Long domainId;
 
+    @Parameter(name=ApiConstants.IS_PROPAGATE, type=CommandType.BOOLEAN, description="True if command is sent from another Region")
+    private Boolean isPropagate;
+    
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -62,6 +66,10 @@ public class EnableAccountCmd extends BaseCmd {
         return domainId;
     }
 
+	public Boolean getIsPropagate() {
+		return isPropagate;
+	}
+    
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
@@ -88,7 +96,13 @@ public class EnableAccountCmd extends BaseCmd {
 
     @Override
     public void execute(){
-        Account result = _accountService.enableAccount(getAccountName(), getDomainId(), getId());
+    	boolean isPopagate = (getIsPropagate() != null ) ? getIsPropagate() : false;
+    	Account result = null;
+    	if(isPopagate){
+    		result = _accountService.enableAccount(getAccountName(), getDomainId(), getId());
+    	} else {
+    		result = _regionService.enableAccount(getAccountName(), getDomainId(), getId());
+    	}
         if (result != null){
             AccountResponse response = _responseGenerator.createAccountResponse(result);
             response.setResponseName(getCommandName());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/api/src/com/cloud/api/commands/UpdateAccountCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/UpdateAccountCmd.java b/api/src/com/cloud/api/commands/UpdateAccountCmd.java
index 8e3ef43..377a61b 100755
--- a/api/src/com/cloud/api/commands/UpdateAccountCmd.java
+++ b/api/src/com/cloud/api/commands/UpdateAccountCmd.java
@@ -27,6 +27,7 @@ import com.cloud.api.IdentityMapper;
 import com.cloud.api.Implementation;
 import com.cloud.api.Parameter;
 import com.cloud.api.ServerApiException;
+import com.cloud.api.BaseCmd.CommandType;
 import com.cloud.api.response.AccountResponse;
 import com.cloud.user.Account;
 
@@ -59,6 +60,9 @@ public class UpdateAccountCmd extends BaseCmd{
 	@Parameter(name = ApiConstants.ACCOUNT_DETAILS, type = CommandType.MAP, description = "details for account used to store specific parameters")
     private Map details;
 
+    @Parameter(name=ApiConstants.IS_PROPAGATE, type=CommandType.BOOLEAN, description="True if command is sent from another Region")
+    private Boolean isPropagate;
+	
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -93,6 +97,10 @@ public class UpdateAccountCmd extends BaseCmd{
     	return params;
     }
 
+	public Boolean getIsPropagate() {
+		return isPropagate;
+	}
+    
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
@@ -118,7 +126,13 @@ public class UpdateAccountCmd extends BaseCmd{
     
     @Override
     public void execute(){
-        Account result = _accountService.updateAccount(this);
+    	boolean isPopagate = (getIsPropagate() != null ) ? getIsPropagate() : false;
+    	Account result = null;
+    	if(isPopagate){
+    		result = _accountService.updateAccount(this);
+        } else {
+        	result = _regionService.updateAccount(this);
+        }
         if (result != null){
             AccountResponse response = _responseGenerator.createAccountResponse(result);
             response.setResponseName(getCommandName());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/api/src/com/cloud/region/RegionService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/region/RegionService.java b/api/src/com/cloud/region/RegionService.java
index e149776..f9cfeba 100644
--- a/api/src/com/cloud/region/RegionService.java
+++ b/api/src/com/cloud/region/RegionService.java
@@ -19,6 +19,7 @@ package com.cloud.region;
 import java.util.List;
 
 import com.cloud.api.commands.ListRegionsCmd;
+import com.cloud.api.commands.UpdateAccountCmd;
 import com.cloud.user.Account;
 
 
@@ -27,4 +28,9 @@ public interface RegionService {
 	public Region updateRegion(long id, String name, String endPoint);
 	public boolean removeRegion(long id);
 	public List<? extends Region> listRegions(ListRegionsCmd cmd);
+	boolean deleteUserAccount(long accountId);
+	Account updateAccount(UpdateAccountCmd cmd);
+	public Account lockAccount(String accountName, Long domainId, Long id);
+	public Account disableAccount(String accountName, Long domainId, Long id);
+	public Account enableAccount(String accountName, Long domainId, Long id);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/api/src/com/cloud/user/Account.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/user/Account.java b/api/src/com/cloud/user/Account.java
index 18f585b..6ae93e2 100755
--- a/api/src/com/cloud/user/Account.java
+++ b/api/src/com/cloud/user/Account.java
@@ -61,4 +61,8 @@ public interface Account extends ControlledEntity {
     public String getNetworkDomain();
     
     public Long getDefaultZoneId();
+    
+    public long getRegionId();
+    
+    public String getUuid();
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/api/src/com/cloud/user/AccountService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/user/AccountService.java b/api/src/com/cloud/user/AccountService.java
index 02e9b27..0cb36d4 100755
--- a/api/src/com/cloud/user/AccountService.java
+++ b/api/src/com/cloud/user/AccountService.java
@@ -62,7 +62,7 @@ public interface AccountService {
      * @return the user if created successfully, null otherwise
      */
     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);
+            Map<String, String> details, String accountUUID, String userUUID, Long regionId);
 
     /**
      * Deletes a user by userId

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/core/src/com/cloud/user/AccountVO.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/user/AccountVO.java b/core/src/com/cloud/user/AccountVO.java
index a9bb51a..629869d 100644
--- a/core/src/com/cloud/user/AccountVO.java
+++ b/core/src/com/cloud/user/AccountVO.java
@@ -75,12 +75,14 @@ public class AccountVO implements Account, Identity {
     	this.uuid = UUID.randomUUID().toString();
     }
     
-    public AccountVO(String accountName, long domainId, String networkDomain, short type) {
+    public AccountVO(String accountName, long domainId, String networkDomain, short type, String uuid, long regionId) {
         this.accountName = accountName;
         this.domainId = domainId;
         this.networkDomain = networkDomain;
         this.type = type;
         this.state = State.enabled;
+        this.uuid = uuid;
+        this.regionId = regionId;
     }
     
     public void setNeedsCleanup(boolean value) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/core/src/com/cloud/user/UserVO.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/user/UserVO.java b/core/src/com/cloud/user/UserVO.java
index efb0583..96e4465 100644
--- a/core/src/com/cloud/user/UserVO.java
+++ b/core/src/com/cloud/user/UserVO.java
@@ -101,7 +101,7 @@ public class UserVO implements User, Identity {
     	this.uuid = UUID.randomUUID().toString();
     }
     
-    public UserVO(long accountId, String username, String password, String firstName, String lastName, String email, String timezone) {
+    public UserVO(long accountId, String username, String password, String firstName, String lastName, String email, String timezone, String uuid, long regionId) {
         this.accountId = accountId;
         this.username = username;
         this.password = password;
@@ -110,9 +110,10 @@ public class UserVO implements User, Identity {
         this.email = email;
         this.timezone = timezone;
         this.state = State.enabled;
-    	this.uuid = UUID.randomUUID().toString();
+    	this.uuid = uuid;
+    	this.regionId = regionId;
     }
-
+    
     @Override
     public long getId() {
         return id;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/server/src/com/cloud/projects/ProjectManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/projects/ProjectManagerImpl.java b/server/src/com/cloud/projects/ProjectManagerImpl.java
index 01fdeda..b37e183 100755
--- a/server/src/com/cloud/projects/ProjectManagerImpl.java
+++ b/server/src/com/cloud/projects/ProjectManagerImpl.java
@@ -199,7 +199,7 @@ public class ProjectManagerImpl implements ProjectManager, Manager{
         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, "", 0L);
         
         Project project = _projectDao.persist(new ProjectVO(name, displayText, owner.getDomainId(), projectAccount.getId()));
         

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/server/src/com/cloud/region/RegionManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/region/RegionManager.java b/server/src/com/cloud/region/RegionManager.java
index 4b61bed..65b5cd6 100644
--- a/server/src/com/cloud/region/RegionManager.java
+++ b/server/src/com/cloud/region/RegionManager.java
@@ -16,11 +16,12 @@
 // under the License.
 package com.cloud.region;
 
+import java.util.Map;
+
 
 public interface RegionManager {
-	public boolean propogateAddResource();
-	public boolean propogateUpdateResource();
-	public boolean propogateDeleteResource();
+	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, long regionId);
 	public boolean addResource();
 	public boolean updateResource();
 	public boolean deleteResource();

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/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 a440871..804c146 100755
--- a/server/src/com/cloud/region/RegionManagerImpl.java
+++ b/server/src/com/cloud/region/RegionManagerImpl.java
@@ -16,6 +16,7 @@
 // under the License.
 package com.cloud.region;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -23,13 +24,23 @@ 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.log4j.Logger;
 
 import com.cloud.api.commands.ListRegionsCmd;
+import com.cloud.api.commands.UpdateAccountCmd;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.region.dao.RegionDao;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.AccountVO;
+import com.cloud.user.dao.AccountDao;
 import com.cloud.utils.component.Inject;
 import com.cloud.utils.component.Manager;
+import com.cloud.utils.exception.CloudRuntimeException;
 
 @Local(value = { RegionManager.class, RegionService.class })
 public class RegionManagerImpl implements RegionManager, RegionService, Manager{
@@ -37,9 +48,13 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
     
     @Inject
     private RegionDao _regionDao;
+    @Inject
+    private AccountDao _accountDao;
+    @Inject
+    private AccountManager _accountMgr;
     
     private String _name;
-    private long _id = 1; //ToDo, get this from config
+    private long _id = 1; //ToDo, get this from config or db.properties
     
     @Override
     public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
@@ -63,23 +78,161 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
     }
 
 	@Override
-	public boolean propogateAddResource() {
-		// TODO Auto-generated method stub
-		return false;
+	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, long regionId) {
+		List<RegionVO> regions =  _regionDao.listAll();
+		StringBuffer params = new StringBuffer("/api?command=createAccount");
+		params.append("&username="+userName);
+		params.append("&password="+password);
+		params.append("&firstname="+firstName);
+		params.append("&lastname="+lastName);
+		params.append("&email="+email);
+		if(timezone != null){
+			params.append("&timezone="+timezone);		
+		}
+		if(accountName != null){
+			params.append("&account="+accountName);			
+		}
+		params.append("&accounttype="+accountType);
+		if(domainId != null){
+			params.append("&domainid="+domainId); //use UUID			
+		}
+		if(networkDomain != null){
+			params.append("&networkdomain="+networkDomain);			
+		}
+		if(details != null){
+			params.append("&accountdetails="+details); //ToDo change to Map
+		}
+		params.append("&accountid="+accountUUID);
+		params.append("&userid="+userUUID);
+		params.append("&regionid="+regionId);
+		
+		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)) {
+				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;
 	}
 
 	@Override
-	public boolean propogateUpdateResource() {
-		// TODO Auto-generated method stub
-		return false;
+	public boolean deleteUserAccount(long accountId) {
+		AccountVO account = _accountDao.findById(accountId);
+		//Check null account
+		String accountUUID = account.getUuid();
+		long regionId = account.getRegionId();
+		String params = "/api?command=deleteAccount&id="+accountUUID+"&ispropagate=true";
+		if(getId() == regionId){
+			if(_accountMgr.deleteUserAccount(accountId)){
+				List<RegionVO> regions =  _regionDao.listAll();
+				for (Region region : regions){
+					if(region.getId() == getId()){
+						continue;
+					}
+					String url = region.getEndPoint() + params;
+					if (makeAPICall(url)) {
+						s_logger.debug("Successfully deleted account :"+accountUUID+" in Region: "+region.getId());
+					} else {
+						s_logger.error("Error while deleted account :"+accountUUID+" in Region: "+region.getId());
+					}
+				}
+				return true;
+			} else {
+				return false;
+			}
+		} else {
+			//First delete in the Region where account is created
+			params = "/api?command=deleteAccount&id="+accountUUID;
+			Region region = _regionDao.findById(regionId);
+			String url = region.getEndPoint() + params;
+			if (makeAPICall(url)) {
+				s_logger.debug("Successfully deleted account :"+accountUUID+" in Region: "+region.getId());
+				return true;
+			} else {
+				s_logger.error("Error while deleted account :"+accountUUID+" in Region: "+region.getId());
+				return false;
+			}
+		}
 	}
-
+	
 	@Override
-	public boolean propogateDeleteResource() {
-		// TODO Auto-generated method stub
-		return false;
+	public Account updateAccount(UpdateAccountCmd cmd) {
+        Long accountId = cmd.getId();
+        Long domainId = cmd.getDomainId();
+        String accountName = cmd.getAccountName();
+        String newAccountName = cmd.getNewName();
+        String networkDomain = cmd.getNetworkDomain();
+        Map<String, String> details = cmd.getDetails();
+        
+        AccountVO account = _accountDao.findById(accountId);
+		//Check null account
+		String accountUUID = account.getUuid();
+		long regionId = account.getRegionId();
+		if(getId() == regionId){
+			Account updateAccount = _accountMgr.updateAccount(cmd);
+			if(updateAccount != null){
+				List<RegionVO> regions =  _regionDao.listAll();
+				StringBuffer params = new StringBuffer("/api?command=updateAccount"+"&ispropagate=true");
+				for (Region region : regions){
+					if(region.getId() == getId()){
+						continue;
+					}
+					String url = region.getEndPoint() + params;
+					if (makeAPICall(url)) {
+						s_logger.debug("Successfully updated account :"+accountUUID+" in Region: "+region.getId());
+					} else {
+						s_logger.error("Error while updated account :"+accountUUID+" in Region: "+region.getId());
+					}
+				}
+			}
+			return updateAccount;
+		} else {
+			//First update in the Region where account is created
+			StringBuffer params = new StringBuffer("/api?command=updateAccount");
+			//add params
+			Region region = _regionDao.findById(regionId);
+			String url = region.getEndPoint() + params;
+			if (makeAPICall(url)) {
+				s_logger.debug("Successfully updated account :"+accountUUID+" in source Region: "+region.getId());
+				//return Account object
+				return null;
+			} else {
+				s_logger.error("Error while updated account :"+accountUUID+" in source Region: "+region.getId());
+				//throw exception;
+				return null;
+			}
+		}
 	}
 
+	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 boolean addResource() {
 		// TODO Auto-generated method stub
@@ -115,7 +268,8 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 			region.setEndPoint(endPoint);
 		}
 		
-		return region;
+		_regionDao.update(id, region);
+		return _regionDao.findById(id);
 	}
 
 	@Override
@@ -145,5 +299,23 @@ public class RegionManagerImpl implements RegionManager, RegionService, Manager{
 		}
 		return _regionDao.listAll();
 	}
-    
+
+	@Override
+	public Account lockAccount(String accountName, Long domainId, Long id) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Account disableAccount(String accountName, Long domainId, Long id) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Account enableAccount(String accountName, Long domainId, Long id) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/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 3a3efd5..4836594 100644
--- a/server/src/com/cloud/region/RegionVO.java
+++ b/server/src/com/cloud/region/RegionVO.java
@@ -34,17 +34,17 @@ public class RegionVO implements Region{
 
     @Id
     @Column(name="id")
-    long id;
+    private long id;
     
     @Column(name="name")
-    String name;
+    private String name;
 
     @Column(name="end_point")
-    String endPoint;
+    private String endPoint;
     
     @Column(name="status")
     @Enumerated(value=EnumType.STRING)
-    Region.State status;
+    private Region.State status;
     
     @Column(name=GenericDao.REMOVED_COLUMN)
     private Date removed;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/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 a7f5a68..6904da7 100755
--- a/server/src/com/cloud/user/AccountManager.java
+++ b/server/src/com/cloud/user/AccountManager.java
@@ -45,7 +45,7 @@ public interface AccountManager extends AccountService {
 
 	Long checkAccessAndSpecifyAuthority(Account caller, Long zoneId);
 	
-	Account createAccount(String accountName, short accountType, Long domainId, String networkDomain, Map details);
+	Account createAccount(String accountName, short accountType, Long domainId, String networkDomain, Map details, String uuid, long 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/4ea36b82/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 cd63b4d..c174e5c 100755
--- a/server/src/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/com/cloud/user/AccountManagerImpl.java
@@ -85,6 +85,7 @@ import com.cloud.projects.ProjectManager;
 import com.cloud.projects.ProjectVO;
 import com.cloud.projects.dao.ProjectAccountDao;
 import com.cloud.projects.dao.ProjectDao;
+import com.cloud.region.RegionManager;
 import com.cloud.server.auth.UserAuthenticator;
 import com.cloud.storage.StorageManager;
 import com.cloud.storage.VMTemplateVO;
@@ -199,8 +200,8 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag
     private ProjectAccountDao _projectAccountDao;
     @Inject
     private IPAddressDao _ipAddressDao;
-    //@Inject
-    //private RegionManager _regionMgr;
+    @Inject
+    private RegionManager _regionMgr;
     
     private Adapters<UserAuthenticator> _userAuthenticators;
 
@@ -678,7 +679,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) {
+            Map<String, String> details, String accountUUID, String userUUID, Long regionId) {
 
         if (accountName == null) {
             accountName = userName;
@@ -720,25 +721,51 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag
             }
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
+        if(regionId == null){
+            Transaction txn = Transaction.currentTxn();
+            txn.start();
 
-        // create account
-        Account account = createAccount(accountName, accountType, domainId, networkDomain, details);
-        long accountId = account.getId();
+        	// create account
+        	AccountVO account = createAccount(accountName, accountType, domainId, networkDomain, details, UUID.randomUUID().toString(), _regionMgr.getId());
+        	long accountId = account.getId();
 
-        // create the first user for the account
-        UserVO user = createUser(accountId, userName, password, firstName, lastName, email, timezone);
+        	// create the first user for the account
+        	UserVO user = createUser(accountId, userName, password, firstName, lastName, email, timezone);
 
-        if (accountType == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
-            // set registration token
-            byte[] bytes = (domainId + accountName + userName + System.currentTimeMillis()).getBytes();
-            String registrationToken = UUID.nameUUIDFromBytes(bytes).toString();
-            user.setRegistrationToken(registrationToken);
-        }
+        	if (accountType == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
+        		// set registration token
+        		byte[] bytes = (domainId + accountName + userName + System.currentTimeMillis()).getBytes();
+        		String registrationToken = UUID.nameUUIDFromBytes(bytes).toString();
+        		user.setRegistrationToken(registrationToken);
+        	}
+        	txn.commit();
+        	//Propogate Add account to other Regions
+        	_regionMgr.propogateAddAccount(userName, password, firstName, lastName, email, timezone, accountName, accountType, domainId, 
+        			networkDomain, details, account.getUuid(), user.getUuid(), _regionMgr.getId());
+        	//check success
+            return _userAccountDao.findById(user.getId());
+        } else {
+        	// Account is propogated from another Region
 
-        txn.commit();
-        return _userAccountDao.findById(user.getId());
+        	Transaction txn = Transaction.currentTxn();
+            txn.start();
+
+            // create account
+            AccountVO account = createAccount(accountName, accountType, domainId, networkDomain, details, accountUUID, regionId);
+            long accountId = account.getId();
+
+            // create the first user for the account
+            UserVO user = createUser(accountId, userName, password, firstName, lastName, email, timezone, userUUID, regionId);
+
+            if (accountType == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
+                // set registration token
+                byte[] bytes = (domainId + accountName + userName + System.currentTimeMillis()).getBytes();
+                String registrationToken = UUID.nameUUIDFromBytes(bytes).toString();
+                user.setRegistrationToken(registrationToken);
+            }
+            txn.commit();
+            return _userAccountDao.findById(user.getId());
+        }
     }
 
     @Override
@@ -1061,7 +1088,6 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag
 
             throw new InvalidParameterValueException("The account id=" + accountId + " manages project(s) with ids " + projectIds + "and can't be removed");
         }
-
         return deleteAccount(account, callerUserId, caller);
     }
 
@@ -1161,7 +1187,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag
         String newAccountName = cmd.getNewName();
         String networkDomain = cmd.getNetworkDomain();
         Map<String, String> details = cmd.getDetails();
-
+        
         boolean success = false;
         Account account = null;
         if (accountId != null) {
@@ -1516,7 +1542,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag
 
     @Override
     @DB
-    public Account createAccount(String accountName, short accountType, Long domainId, String networkDomain, Map details) {
+    public AccountVO createAccount(String accountName, short accountType, Long domainId, String networkDomain, Map details, String uuid, long regionId) {
         // Validate domain
         Domain domain = _domainMgr.getDomain(domainId);
         if (domain == null) {
@@ -1560,7 +1586,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag
         Transaction txn = Transaction.currentTxn();
         txn.start();
 
-        Account account = _accountDao.persist(new AccountVO(accountName, domainId, networkDomain, accountType));
+        AccountVO account = _accountDao.persist(new AccountVO(accountName, domainId, networkDomain, accountType, uuid, regionId));
 
         if (account == null) {
             throw new CloudRuntimeException("Failed to create account name " + accountName + " in domain id=" + domainId);
@@ -1589,7 +1615,18 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag
         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));
+        
+        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, long 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));
 
         return user;
     }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/4ea36b82/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 be14ec3..a7c399b 100755
--- a/server/src/com/cloud/user/dao/AccountDaoImpl.java
+++ b/server/src/com/cloud/user/dao/AccountDaoImpl.java
@@ -49,7 +49,6 @@ public class AccountDaoImpl extends GenericDaoBase<AccountVO, Long> implements A
     protected final SearchBuilder<AccountVO> CleanupForRemovedAccountsSearch;
     protected final SearchBuilder<AccountVO> CleanupForDisabledAccountsSearch;
     protected final SearchBuilder<AccountVO> NonProjectAccountSearch;
-    private final long _regionId = 1;
     
     protected AccountDaoImpl() {
         AllFieldsSearch = createSearchBuilder();
@@ -260,10 +259,4 @@ public class AccountDaoImpl extends GenericDaoBase<AccountVO, Long> implements A
 		}
 	}
 	
-	@Override
-	@DB
-	public AccountVO persist(AccountVO account) {
-		account.setRegionId(_regionId);
-		return super.persist(account);
-	}
 }