From 5ffd233bb487daa061d1ef53c1dfc1ad08822d63 Mon Sep 17 00:00:00 2001 From: alena Date: Thu, 20 Oct 2011 11:30:45 -0700 Subject: [PATCH] Made all project commands except list* to be Async --- .../api/commands/ActivateProjectCmd.java | 15 ++++++- .../api/commands/AddAccountToProjectCmd.java | 22 +++++++++- .../cloud/api/commands/CreateProjectCmd.java | 43 ++++++++++++++++--- .../commands/DeleteAccountFromProjectCmd.java | 14 +++++- .../cloud/api/commands/JoinProjectCmd.java | 14 +++++- .../cloud/api/commands/SuspendProjectCmd.java | 1 - .../cloud/api/commands/UpdateProjectCmd.java | 15 ++++++- api/src/com/cloud/event/EventTypes.java | 1 + .../com/cloud/projects/ProjectService.java | 2 + client/tomcatconf/commands.properties.in | 1 - .../cloud/projects/ProjectManagerImpl.java | 35 +++++++++++++-- server/src/com/cloud/projects/ProjectVO.java | 2 +- 12 files changed, 147 insertions(+), 18 deletions(-) diff --git a/api/src/com/cloud/api/commands/ActivateProjectCmd.java b/api/src/com/cloud/api/commands/ActivateProjectCmd.java index b96e7dce9b5..8db959eb2d5 100644 --- a/api/src/com/cloud/api/commands/ActivateProjectCmd.java +++ b/api/src/com/cloud/api/commands/ActivateProjectCmd.java @@ -21,17 +21,20 @@ package com.cloud.api.commands; import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCmd; import com.cloud.api.BaseCmd; +import com.cloud.api.BaseCmd.CommandType; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.ProjectResponse; +import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; import com.cloud.projects.Project; import com.cloud.user.UserContext; @Implementation(description="Activates a project", responseObject=ProjectResponse.class) -public class ActivateProjectCmd extends BaseCmd { +public class ActivateProjectCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(ActivateProjectCmd.class.getName()); private static final String s_name = "activaterojectresponse"; @@ -84,4 +87,14 @@ public class ActivateProjectCmd extends BaseCmd { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to activate a project"); } } + + @Override + public String getEventType() { + return EventTypes.EVENT_PROJECT_ACTIVATE; + } + + @Override + public String getEventDescription() { + return "Activating project: " + id; + } } \ No newline at end of file diff --git a/api/src/com/cloud/api/commands/AddAccountToProjectCmd.java b/api/src/com/cloud/api/commands/AddAccountToProjectCmd.java index 98b5a569668..450ea857a7c 100644 --- a/api/src/com/cloud/api/commands/AddAccountToProjectCmd.java +++ b/api/src/com/cloud/api/commands/AddAccountToProjectCmd.java @@ -21,17 +21,19 @@ package com.cloud.api.commands; import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCmd; import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.SuccessResponse; +import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; import com.cloud.projects.Project; import com.cloud.user.UserContext; @Implementation(description="Adds acoount to a project", responseObject=SuccessResponse.class) -public class AddAccountToProjectCmd extends BaseCmd { +public class AddAccountToProjectCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(AddAccountToProjectCmd.class.getName()); private static final String s_name = "addaccounttoprojectresponse"; @@ -78,6 +80,10 @@ public class AddAccountToProjectCmd extends BaseCmd { @Override public void execute(){ + if (accountName == null && email == null) { + throw new InvalidParameterValueException("Either accountName or email is required"); + } + UserContext.current().setEventDetails("Project id: "+ projectId + "; accountName " + accountName); boolean result = _projectService.addAccountToProject(getProjectId(), getAccountName(), getEmail()); if (result) { @@ -98,4 +104,18 @@ public class AddAccountToProjectCmd extends BaseCmd { return _projectService.getProjectOwner(projectId).getId(); } + + @Override + public String getEventType() { + return EventTypes.EVENT_PROJECT_ACCOUNT_ADD; + } + + @Override + public String getEventDescription() { + if (accountName != null) { + return "Adding account " + accountName + " to project: " + projectId; + } else { + return "Sending invitation to email " + email + " to join project: " + projectId; + } + } } \ No newline at end of file diff --git a/api/src/com/cloud/api/commands/CreateProjectCmd.java b/api/src/com/cloud/api/commands/CreateProjectCmd.java index 05ac04147bb..541448d21a5 100644 --- a/api/src/com/cloud/api/commands/CreateProjectCmd.java +++ b/api/src/com/cloud/api/commands/CreateProjectCmd.java @@ -21,11 +21,13 @@ package com.cloud.api.commands; import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCreateCmd; import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.ProjectResponse; +import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ResourceAllocationException; import com.cloud.projects.Project; @@ -33,7 +35,7 @@ import com.cloud.user.Account; import com.cloud.user.UserContext; @Implementation(description="Creates a project", responseObject=ProjectResponse.class) -public class CreateProjectCmd extends BaseCmd { +public class CreateProjectCmd extends BaseAsyncCreateCmd { public static final Logger s_logger = Logger.getLogger(CreateProjectCmd.class.getName()); private static final String s_name = "createprojectresponse"; @@ -59,11 +61,20 @@ public class CreateProjectCmd extends BaseCmd { ///////////////////////////////////////////////////// public String getAccountName() { - return accountName; + if (accountName != null) { + return accountName; + } else { + return UserContext.current().getCaller().getAccountName(); + } } public Long getDomainId() { - return domainId; + if (domainId != null) { + return domainId; + } else { + return UserContext.current().getCaller().getDomainId(); + } + } public String getName() { @@ -100,9 +111,8 @@ public class CreateProjectCmd extends BaseCmd { ///////////////////////////////////////////////////// @Override - public void execute() throws ResourceAllocationException{ - UserContext.current().setEventDetails("Project Name: "+ getName()); - Project project = _projectService.createProject(getName(), getDisplayText(), getAccountName(), getDomainId()); + public void execute(){ + Project project = _projectService.enableProject(this.getEntityId()); if (project != null) { ProjectResponse response = _responseGenerator.createProjectResponse(project); response.setResponseName(getCommandName()); @@ -111,4 +121,25 @@ public class CreateProjectCmd extends BaseCmd { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create a project"); } } + + @Override + public void create() throws ResourceAllocationException{ + UserContext.current().setEventDetails("Project Name: "+ getName()); + Project project = _projectService.createProject(getName(), getDisplayText(), getAccountName(), getDomainId()); + if (project != null) { + this.setEntityId(project.getId()); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create a project"); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_PROJECT_CREATE; + } + + @Override + public String getEventDescription() { + return "creating project"; + } } \ No newline at end of file diff --git a/api/src/com/cloud/api/commands/DeleteAccountFromProjectCmd.java b/api/src/com/cloud/api/commands/DeleteAccountFromProjectCmd.java index 3abd21ad011..73829f3e00f 100644 --- a/api/src/com/cloud/api/commands/DeleteAccountFromProjectCmd.java +++ b/api/src/com/cloud/api/commands/DeleteAccountFromProjectCmd.java @@ -21,17 +21,19 @@ package com.cloud.api.commands; import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCmd; import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.SuccessResponse; +import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; import com.cloud.projects.Project; import com.cloud.user.UserContext; @Implementation(description="Deletes account from the project", responseObject=SuccessResponse.class) -public class DeleteAccountFromProjectCmd extends BaseCmd { +public class DeleteAccountFromProjectCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(DeleteProjectCmd.class.getName()); private static final String s_name = "deleteaccountfromprojectresponse"; @@ -92,4 +94,14 @@ public class DeleteAccountFromProjectCmd extends BaseCmd { return _projectService.getProjectOwner(projectId).getId(); } + + @Override + public String getEventType() { + return EventTypes.EVENT_PROJECT_ACCOUNT_REMOVE; + } + + @Override + public String getEventDescription() { + return "Removing account " + accountName + " from project: " + projectId; + } } \ No newline at end of file diff --git a/api/src/com/cloud/api/commands/JoinProjectCmd.java b/api/src/com/cloud/api/commands/JoinProjectCmd.java index 37333964efc..033cc7ce050 100644 --- a/api/src/com/cloud/api/commands/JoinProjectCmd.java +++ b/api/src/com/cloud/api/commands/JoinProjectCmd.java @@ -20,16 +20,18 @@ package com.cloud.api.commands; import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCmd; import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.SuccessResponse; +import com.cloud.event.EventTypes; import com.cloud.user.Account; import com.cloud.user.UserContext; @Implementation(description="Makes account to join the project", responseObject=SuccessResponse.class) -public class JoinProjectCmd extends BaseCmd { +public class JoinProjectCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(JoinProjectCmd.class.getName()); private static final String s_name = "joinprojectresponse"; @@ -87,4 +89,14 @@ public class JoinProjectCmd extends BaseCmd { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to join the project"); } } + + @Override + public String getEventType() { + return EventTypes.EVENT_PROJECT_JOIN; + } + + @Override + public String getEventDescription() { + return "Account " + accountName + " joining the project: " + projectId; + } } diff --git a/api/src/com/cloud/api/commands/SuspendProjectCmd.java b/api/src/com/cloud/api/commands/SuspendProjectCmd.java index dc699af4483..727d007492c 100644 --- a/api/src/com/cloud/api/commands/SuspendProjectCmd.java +++ b/api/src/com/cloud/api/commands/SuspendProjectCmd.java @@ -27,7 +27,6 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.ProjectResponse; -import com.cloud.api.response.SuccessResponse; import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InvalidParameterValueException; diff --git a/api/src/com/cloud/api/commands/UpdateProjectCmd.java b/api/src/com/cloud/api/commands/UpdateProjectCmd.java index f8e7239d009..4801ce257a3 100644 --- a/api/src/com/cloud/api/commands/UpdateProjectCmd.java +++ b/api/src/com/cloud/api/commands/UpdateProjectCmd.java @@ -21,17 +21,20 @@ package com.cloud.api.commands; import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCmd; import com.cloud.api.BaseCmd; +import com.cloud.api.BaseCmd.CommandType; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.ProjectResponse; +import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; import com.cloud.projects.Project; import com.cloud.user.UserContext; @Implementation(description="Updates a project", responseObject=ProjectResponse.class) -public class UpdateProjectCmd extends BaseCmd { +public class UpdateProjectCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(UpdateProjectCmd.class.getName()); private static final String s_name = "updateprojectresponse"; @@ -98,4 +101,14 @@ public class UpdateProjectCmd extends BaseCmd { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to update a project"); } } + + @Override + public String getEventType() { + return EventTypes.EVENT_PROJECT_UPDATE; + } + + @Override + public String getEventDescription() { + return "Updating project: " + id; + } } \ No newline at end of file diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java index 25319a7b362..20d95d05bbe 100755 --- a/api/src/com/cloud/event/EventTypes.java +++ b/api/src/com/cloud/event/EventTypes.java @@ -210,5 +210,6 @@ public class EventTypes { public static final String EVENT_PROJECT_ACTIVATE = "PROJECT.ACTIVATE"; public static final String EVENT_PROJECT_SUSPEND = "PROJECT.SUSPEND"; public static final String EVENT_PROJECT_ACCOUNT_ADD = "PROJECT.ACCOUNT.ADD"; + public static final String EVENT_PROJECT_JOIN = "PROJECT.JOIN"; public static final String EVENT_PROJECT_ACCOUNT_REMOVE = "PROJECT.ACCOUNT.REMOVE"; } diff --git a/api/src/com/cloud/projects/ProjectService.java b/api/src/com/cloud/projects/ProjectService.java index edd241590d8..fa2148dd0af 100644 --- a/api/src/com/cloud/projects/ProjectService.java +++ b/api/src/com/cloud/projects/ProjectService.java @@ -65,4 +65,6 @@ public interface ProjectService { Project activateProject(long projectId); Project suspendProject(long projectId) throws ConcurrentOperationException, ResourceUnavailableException; + + Project enableProject(long projectId); } diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index 778c8ff71d2..e5c0743077d 100755 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -276,7 +276,6 @@ addAccountToProject=com.cloud.api.commands.AddAccountToProjectCmd;15 deleteAccountFromProject=com.cloud.api.commands.DeleteAccountFromProjectCmd;15 listProjectAccounts=com.cloud.api.commands.ListProjectAccountsCmd;15 listProjectInvitations=com.cloud.api.commands.ListProjectInvitationsCmd;15 - joinProject=com.cloud.api.commands.JoinProjectCmd;15 #### diff --git a/server/src/com/cloud/projects/ProjectManagerImpl.java b/server/src/com/cloud/projects/ProjectManagerImpl.java index 6ff5647233b..b20ebd95a97 100644 --- a/server/src/com/cloud/projects/ProjectManagerImpl.java +++ b/server/src/com/cloud/projects/ProjectManagerImpl.java @@ -154,7 +154,7 @@ public class ProjectManagerImpl implements ProjectManager, Manager{ } @Override - @ActionEvent(eventType = EventTypes.EVENT_PROJECT_CREATE, eventDescription = "creating project") + @ActionEvent(eventType = EventTypes.EVENT_PROJECT_CREATE, eventDescription = "creating project", create=true) @DB public Project createProject(String name, String displayText, String accountName, Long domainId) throws ResourceAllocationException{ Account caller = UserContext.current().getCaller(); @@ -203,6 +203,29 @@ public class ProjectManagerImpl implements ProjectManager, Manager{ return project; } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_PROJECT_CREATE, eventDescription = "creating project", async=true) + @DB + public Project enableProject(long projectId){ + Account caller = UserContext.current().getCaller(); + + ProjectVO project= getProject(projectId); + //verify input parameters + if (project == null) { + throw new InvalidParameterValueException("Unable to find project by id " + projectId); + } + + _accountMgr.checkAccess(caller, _domainDao.findById(project.getDomainId()), AccessType.ModifyProject); + + //at this point enabling project doesn't require anything, so just update the state + project.setState(State.Active); + _projectDao.update(projectId, project); + + return project; + } + + @Override @ActionEvent(eventType = EventTypes.EVENT_PROJECT_DELETE, eventDescription = "deleting project", async = true) @DB @@ -382,7 +405,6 @@ public class ProjectManagerImpl implements ProjectManager, Manager{ } @Override - @ActionEvent(eventType = EventTypes.EVENT_PROJECT_ACCOUNT_ADD, eventDescription = "adding account to project") public ProjectAccount assignAccountToProject(Project project, long accountId, ProjectAccount.Role accountRole) { return _projectAccountDao.persist(new ProjectAccountVO(project, accountId, accountRole)); } @@ -436,7 +458,7 @@ public class ProjectManagerImpl implements ProjectManager, Manager{ } @Override @DB - @ActionEvent(eventType = EventTypes.EVENT_PROJECT_UPDATE, eventDescription = "updating project") + @ActionEvent(eventType = EventTypes.EVENT_PROJECT_UPDATE, eventDescription = "updating project", async=true) public Project updateProject(long projectId, String displayText, String newOwnerName) { Account caller = UserContext.current().getCaller(); @@ -491,6 +513,7 @@ public class ProjectManagerImpl implements ProjectManager, Manager{ } @Override + @ActionEvent(eventType = EventTypes.EVENT_PROJECT_ACCOUNT_ADD, eventDescription = "adding account to project", async=true) public boolean addAccountToProject(long projectId, String accountName, String email) { Account caller = UserContext.current().getCaller(); @@ -523,6 +546,9 @@ public class ProjectManagerImpl implements ProjectManager, Manager{ if (_invitationRequired) { return inviteAccountToProject(project, account, email); } else { + if (account == null) { + throw new InvalidParameterValueException("Account information is required for assigning account to the project"); + } if (assignAccountToProject(project, account.getId(), ProjectAccount.Role.Regular) != null) { return true; } else { @@ -557,7 +583,7 @@ public class ProjectManagerImpl implements ProjectManager, Manager{ } @Override - @ActionEvent(eventType = EventTypes.EVENT_PROJECT_ACCOUNT_REMOVE, eventDescription = "removing account from project") + @ActionEvent(eventType = EventTypes.EVENT_PROJECT_ACCOUNT_REMOVE, eventDescription = "removing account from project", async=true) public boolean deleteAccountFromProject(long projectId, String accountName) { Account caller = UserContext.current().getCaller(); @@ -755,6 +781,7 @@ public class ProjectManagerImpl implements ProjectManager, Manager{ } @Override @DB + @ActionEvent(eventType = EventTypes.EVENT_PROJECT_JOIN, eventDescription = "account joining from project", async=true) public boolean joinProject(long projectId, String accountName, String token) { Account caller = UserContext.current().getCaller(); Long accountId = null; diff --git a/server/src/com/cloud/projects/ProjectVO.java b/server/src/com/cloud/projects/ProjectVO.java index 5c93c371b3b..02c74ba6e82 100644 --- a/server/src/com/cloud/projects/ProjectVO.java +++ b/server/src/com/cloud/projects/ProjectVO.java @@ -68,7 +68,7 @@ public class ProjectVO implements Project{ this.displayText = displayText; this.projectAccountId = projectAccountId; this.domainId = domainId; - this.state = State.Active; + this.state = State.Disabled; } @Override