You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ma...@apache.org on 2014/07/08 09:41:59 UTC
[09/14] Clustering changes for stratos
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/impl/GitBasedArtifactRepository.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/impl/GitBasedArtifactRepository.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/impl/GitBasedArtifactRepository.java
index 0e3982b..7954dc9 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/impl/GitBasedArtifactRepository.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/impl/GitBasedArtifactRepository.java
@@ -21,15 +21,18 @@ package org.apache.stratos.cartridge.agent.artifact.deployment.synchronizer.git.
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.cartridge.agent.CartridgeAgent;
import org.apache.stratos.cartridge.agent.artifact.deployment.synchronizer.RepositoryInformation;
import org.apache.stratos.cartridge.agent.artifact.deployment.synchronizer.git.internal.CustomJschConfigSessionFactory;
import org.apache.stratos.cartridge.agent.artifact.deployment.synchronizer.git.internal.GitDeploymentSynchronizerConstants;
import org.apache.stratos.cartridge.agent.artifact.deployment.synchronizer.git.internal.RepositoryContext;
import org.apache.stratos.cartridge.agent.artifact.deployment.synchronizer.git.util.Utilities;
-import org.apache.stratos.cartridge.agent.util.ExtensionUtils;
+import org.apache.stratos.cartridge.agent.config.CartridgeAgentConfiguration;
+import org.apache.stratos.cartridge.agent.extensions.ExtensionHandler;
import org.eclipse.jgit.api.*;
import org.eclipse.jgit.api.errors.*;
import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.storage.file.FileRepository;
import org.eclipse.jgit.transport.SshSessionFactory;
@@ -38,33 +41,32 @@ import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
-import java.util.Map.Entry;
+import java.util.List;
import java.util.Set;
import java.util.concurrent.*;
/**
* Git based artifact repository.
- *
- *
*/
public class GitBasedArtifactRepository {
private static final int SUPER_TENANT_ID = -1234;
- private static final Log log = LogFactory.getLog(GitBasedArtifactRepository.class);
+ private static final Log log = LogFactory.getLog(GitBasedArtifactRepository.class);
+ private final ExtensionHandler extensionHandler;
//Map to keep track of git context per tenant (remote urls, jgit git objects, etc.)
private static ConcurrentHashMap<Integer, RepositoryContext>
- tenantToRepoContextMap = new ConcurrentHashMap<Integer, RepositoryContext>();
+ tenantToRepoContextMap = new ConcurrentHashMap<Integer, RepositoryContext>();
private static volatile GitBasedArtifactRepository gitBasedArtifactRepository;
- private static String SUPER_TENANT_APP_PATH = "/repository/deployment/server/";
- private static String TENANT_PATH = "/repository/tenants/";
-
- private GitBasedArtifactRepository () {
+ private static String SUPER_TENANT_REPO_PATH = "/repository/deployment/server/";
+ private static String TENANT_REPO_PATH = "/repository/tenants/";
+ private GitBasedArtifactRepository() {
+ extensionHandler = CartridgeAgent.getExtensionHandler();
}
- public static GitBasedArtifactRepository getInstance () {
+ public static GitBasedArtifactRepository getInstance() {
if (gitBasedArtifactRepository == null) {
synchronized (GitBasedArtifactRepository.class) {
@@ -80,40 +82,38 @@ public class GitBasedArtifactRepository {
* initializes and populates the git context with relevant data
*
* @param repositoryInformation id of the tenant
- *
*/
- private void initGitContext (RepositoryInformation repositoryInformation) {
+ private void initGitContext(RepositoryInformation repositoryInformation) {
+
+
+ log.info("Initializing git context.");
-
- log.info("Initializing git context.");
-
- int tenantId = Integer.parseInt(repositoryInformation.getTenantId());
- String gitLocalRepoPath = repositoryInformation.getRepoPath();
+ int tenantId = Integer.parseInt(repositoryInformation.getTenantId());
+ String gitLocalRepoPath = repositoryInformation.getRepoPath();
RepositoryContext gitRepoCtx = new RepositoryContext();
String gitRemoteRepoUrl = repositoryInformation.getRepoUrl();
boolean isMultitenant = repositoryInformation.isMultitenant();
-
+
log.info("local path " + gitLocalRepoPath);
log.info("remote url " + gitRemoteRepoUrl);
log.info("tenant " + tenantId);
-
+
gitRepoCtx.setTenantId(tenantId);
- gitRepoCtx.setGitLocalRepoPath(getRepoPathForTenantId(tenantId,gitLocalRepoPath,isMultitenant));
+ gitRepoCtx.setGitLocalRepoPath(getRepoPathForTenantId(tenantId, gitLocalRepoPath, isMultitenant));
gitRepoCtx.setGitRemoteRepoUrl(gitRemoteRepoUrl);
-
- gitRepoCtx.setRepoUsername(repositoryInformation.getRepoUsername());
- gitRepoCtx.setRepoPassword(repositoryInformation.getRepoPassword());
+
+ gitRepoCtx.setRepoUsername(repositoryInformation.getRepoUsername());
+ gitRepoCtx.setRepoPassword(repositoryInformation.getRepoPassword());
try {
- if(isKeyBasedAuthentication(gitRemoteRepoUrl, tenantId)) {
- gitRepoCtx.setKeyBasedAuthentication(true);
- initSSHAuthentication();
- }
- else
- gitRepoCtx.setKeyBasedAuthentication(false);
- } catch (Exception e1) {
- log.error("Exception occurred.. " + e1.getMessage(), e1);
- }
+ if (isKeyBasedAuthentication(gitRemoteRepoUrl, tenantId)) {
+ gitRepoCtx.setKeyBasedAuthentication(true);
+ initSSHAuthentication();
+ } else
+ gitRepoCtx.setKeyBasedAuthentication(false);
+ } catch (Exception e1) {
+ log.error("Exception occurred.. " + e1.getMessage(), e1);
+ }
FileRepository localRepo = null;
try {
@@ -133,54 +133,66 @@ public class GitBasedArtifactRepository {
}
-
// If tenant id is "-1234", then its super tenant, else tenant
private static String getRepoPathForTenantId(int tenantId,
- String gitLocalRepoPath, boolean isMultitenant) {
-
-
- StringBuilder repoPathBuilder = new StringBuilder();
- String repoPath = null;
-
- if (isMultitenant) {
- if (tenantId == SUPER_TENANT_ID) {
- repoPathBuilder.append(gitLocalRepoPath).append(
- SUPER_TENANT_APP_PATH);
- } else {
- // create folder with tenant id
- createTenantDir(tenantId, gitLocalRepoPath);
- repoPathBuilder.append(gitLocalRepoPath).append(TENANT_PATH)
- .append(tenantId);
- }
-
- repoPath = repoPathBuilder.toString();
- } else {
- repoPath = gitLocalRepoPath;
- }
- log.info("Repo path returned : " + repoPath);
- return repoPath;
- }
+ String gitLocalRepoPath, boolean isMultitenant) {
- private static void createTenantDir(int tenantId, String path) {
- String dirPathName = path+TENANT_PATH+tenantId;
- boolean dirStatus = new File(dirPathName).mkdir();
- if(dirStatus){
- log.info("Successfully created directory ["+dirPathName+"] ");
- }else {
- log.error("Directory creating failed in ["+dirPathName+"] ");
- }
- }
+ StringBuilder repoPathBuilder = new StringBuilder();
+ String repoPath = null;
+
+ if (isMultitenant) {
+ if (tenantId == SUPER_TENANT_ID) {
+ //check if the relevant path is set as a startup param
+ String superTenantRepoPath = CartridgeAgentConfiguration.getInstance().getSuperTenantRepositoryPath();
+
+ if (superTenantRepoPath != null && !superTenantRepoPath.isEmpty()) {
+ superTenantRepoPath = superTenantRepoPath.startsWith("/") ? superTenantRepoPath : "/".concat(superTenantRepoPath);
+ repoPathBuilder.append(gitLocalRepoPath).append(superTenantRepoPath);
+
+ } else {
+ repoPathBuilder.append(gitLocalRepoPath).append(SUPER_TENANT_REPO_PATH);
+ }
+ } else {
+ // create folder with tenant id
+ createTenantDir(tenantId, gitLocalRepoPath);
+ //check if the relevant path is set as a startup param
+ String tenantRepoPath = CartridgeAgentConfiguration.getInstance().getTenantRepositoryPath();
+
+ if (tenantRepoPath != null && !tenantRepoPath.isEmpty()) {
+ tenantRepoPath = tenantRepoPath.startsWith("/") ? tenantRepoPath : "/".concat(tenantRepoPath);
+ tenantRepoPath = tenantRepoPath.endsWith("/") ? tenantRepoPath : tenantRepoPath.concat("/");
+
+ repoPathBuilder.append(gitLocalRepoPath).append(tenantRepoPath).append(tenantId);
+ } else {
+ repoPathBuilder.append(gitLocalRepoPath).append(TENANT_REPO_PATH).append(tenantId);
+ }
+ }
+ repoPath = repoPathBuilder.toString();
+ } else {
+ repoPath = gitLocalRepoPath;
+ }
+ log.info("Repo path returned : " + repoPath);
+ return repoPath;
+ }
+ private static void createTenantDir(int tenantId, String path) {
+ String dirPathName = path + TENANT_REPO_PATH + tenantId;
+ boolean dirStatus = new File(dirPathName).mkdir();
+ if (dirStatus) {
+ log.info("Successfully created directory [" + dirPathName + "] ");
+ } else {
+ log.error("Directory creating failed in [" + dirPathName + "] ");
+ }
+ }
/**
* Checks if key based authentication (SSH) is required
*
- * @param url git repository url for the tenant
+ * @param url git repository url for the tenant
* @param tenantId id of the tenant
- *
* @return true if SSH authentication is required, else false
*/
private boolean isKeyBasedAuthentication(String url, int tenantId) {
@@ -189,20 +201,14 @@ public class GitBasedArtifactRepository {
url.startsWith(GitDeploymentSynchronizerConstants.GIT_HTTPS_REPO_URL_PREFIX)) {//http or https url
// authentication with username and password, not key based
return false;
- }
-
- else if (url.startsWith(GitDeploymentSynchronizerConstants.GITHUB_READ_ONLY_REPO_URL_PREFIX)) { //github read-only repo url
+ } else if (url.startsWith(GitDeploymentSynchronizerConstants.GITHUB_READ_ONLY_REPO_URL_PREFIX)) { //github read-only repo url
// no authentication required
return false;
- }
-
- else if (url.startsWith(GitDeploymentSynchronizerConstants.GIT_REPO_SSH_URL_PREFIX) ||
+ } else if (url.startsWith(GitDeploymentSynchronizerConstants.GIT_REPO_SSH_URL_PREFIX) ||
url.contains(GitDeploymentSynchronizerConstants.GIT_REPO_SSH_URL_SUBSTRING)) { //other repo, needs ssh authentication
// key based authentication
return true;
- }
-
- else {
+ } else {
log.error("Invalid git URL provided for tenant " + tenantId);
throw new RuntimeException("Invalid git URL provided for tenant " + tenantId);
}
@@ -211,7 +217,7 @@ public class GitBasedArtifactRepository {
/**
* Initializes SSH authentication
*/
- private void initSSHAuthentication () {
+ private void initSSHAuthentication() {
SshSessionFactory.setInstance(new CustomJschConfigSessionFactory());
}
@@ -219,24 +225,23 @@ public class GitBasedArtifactRepository {
/**
* Caches RepositoryContext against tenant repository path
*
- * @param tenantId tenant repository path
+ * @param tenantId tenant repository path
* @param gitRepoCtx RepositoryContext instance for tenant
*/
private void cacheGitRepoContext(int tenantId, RepositoryContext gitRepoCtx) {
- log.info("caching repo context");
- tenantToRepoContextMap.put(tenantId, gitRepoCtx);
- }
+ log.info("caching repo context");
+ tenantToRepoContextMap.put(tenantId, gitRepoCtx);
+}
/**
* Retrieve cached RepositoryContext relevant to the tenant's local repo path
*
* @param tenantId
- *
* @return corresponding RepositoryContext instance for the
* tenant's local repo if available, else null
*/
- private RepositoryContext retrieveCachedGitContext (int tenantId) {
+ private RepositoryContext retrieveCachedGitContext(int tenantId) {
return tenantToRepoContextMap.get(tenantId);
}
@@ -245,66 +250,55 @@ public class GitBasedArtifactRepository {
* Commits any changes in the local repository to the relevant remote repository
*
* @return
- *
*/
- public boolean commit() {
- // TODO implement later, this is applicable for management node.
-
- for (Entry<Integer, RepositoryContext> tenantMap : tenantToRepoContextMap
- .entrySet()) {
-
- int tenantId = tenantMap.getKey();
- //log.info("map count has values..tenant Id : " + tenantId);
-
- RepositoryContext gitRepoCtx = retrieveCachedGitContext(tenantId);
- if (gitRepoCtx == null) {
-
- log.info("No git repository context information found for tenant "
- + tenantId);
-
- return false;
- }
-
- Git git = gitRepoCtx.getGit();
- StatusCommand statusCmd = git.status();
- Status status = null;
- try {
- status = statusCmd.call();
-
- } catch (GitAPIException e) {
- log.error(
- "Git status operation for tenant "
- + gitRepoCtx.getTenantId() + " failed, ", e);
- return false;
- }
- //log.info("status : " + status.toString());
- if (status.isClean()) {// no changes, nothing to commit
-
- log.debug("No changes detected in the local repository for tenant "
- + tenantId);
- return false;
- }
-
- addArtifacts(gitRepoCtx, getNewArtifacts(status));
- addArtifacts(gitRepoCtx, getModifiedArtifacts(status));
- removeArtifacts(gitRepoCtx, getRemovedArtifacts(status));
- commitToLocalRepo(gitRepoCtx);
- pushToRemoteRepo(gitRepoCtx);
-
- return false;
-
- }
- return false;
+ public void commit(RepositoryInformation repoInfo) {
+ // TODO implement later, this is applicable for management node.
+
+ // for (Entry<Integer, RepositoryContext> tenantMap : tenantToRepoContextMap
+ // .entrySet()) {
+
+ int tenantId = Integer.parseInt(repoInfo.getTenantId());
+ //log.info("map count has values..tenant Id : " + tenantId);
+
+ RepositoryContext gitRepoCtx = retrieveCachedGitContext(tenantId);
+ Git git = gitRepoCtx.getGit();
+ StatusCommand statusCmd = git.status();
+ Status status = null;
+ try {
+ status = statusCmd.call();
+
+ } catch (GitAPIException e) {
+ log.error(
+ "Git status operation for tenant "
+ + gitRepoCtx.getTenantId() + " failed, ", e);
+
+ }
+ //log.info("status : " + status.toString());
+ if (status.isClean()) {// no changes, nothing to commit
+ if (log.isDebugEnabled()) {
+ log.debug("No changes detected in the local repository for tenant " + tenantId);
+ }
+
+ return;
+ }
+
+ addArtifacts(gitRepoCtx, getNewArtifacts(status));
+ addArtifacts(gitRepoCtx, getModifiedArtifacts(status));
+ removeArtifacts(gitRepoCtx, getRemovedArtifacts(status));
+ commitToLocalRepo(gitRepoCtx);
+ pushToRemoteRepo(gitRepoCtx);
+
+ //}
+ //return false;
}
/**
* Returns the newly added artifact set relevant to the current status of the repository
*
* @param status git status
- *
* @return artifact names set
*/
- private Set<String> getNewArtifacts (Status status) {
+ private Set<String> getNewArtifacts(Status status) {
return status.getUntracked();
}
@@ -313,10 +307,9 @@ public class GitBasedArtifactRepository {
* Returns the removed (undeployed) artifact set relevant to the current status of the repository
*
* @param status git status
- *
* @return artifact names set
*/
- private Set<String> getRemovedArtifacts (Status status) {
+ private Set<String> getRemovedArtifacts(Status status) {
return status.getMissing();
}
@@ -325,10 +318,9 @@ public class GitBasedArtifactRepository {
* Return the modified artifacts set relevant to the current status of the repository
*
* @param status git status
- *
* @return artifact names set
*/
- private Set<String> getModifiedArtifacts (Status status) {
+ private Set<String> getModifiedArtifacts(Status status) {
return status.getModified();
}
@@ -337,36 +329,40 @@ public class GitBasedArtifactRepository {
* Adds the artifacts to the local staging area
*
* @param gitRepoCtx RepositoryContext instance
- * @param artifacts set of artifacts
+ * @param artifacts set of artifacts
*/
- private void addArtifacts (RepositoryContext gitRepoCtx, Set<String> artifacts) {
+ private void addArtifacts(RepositoryContext gitRepoCtx, Set<String> artifacts) {
- if(artifacts.isEmpty())
+ if (artifacts.isEmpty())
return;
AddCommand addCmd = gitRepoCtx.getGit().add();
Iterator<String> it = artifacts.iterator();
- while(it.hasNext())
+ while (it.hasNext())
addCmd.addFilepattern(it.next());
try {
addCmd.call();
+ if (log.isDebugEnabled()) {
+ log.debug("Added artifacts for tenant : " + gitRepoCtx.getTenantId());
+ }
} catch (GitAPIException e) {
log.error("Adding artifact to the local repository at " + gitRepoCtx.getGitLocalRepoPath() + "failed", e);
- e.printStackTrace();
+ log.error(e);
}
+
}
/**
* Removes the set of artifacts from local repo
*
* @param gitRepoCtx RepositoryContext instance
- * @param artifacts Set of artifact names to remove
+ * @param artifacts Set of artifact names to remove
*/
- private void removeArtifacts (RepositoryContext gitRepoCtx, Set<String> artifacts) {
+ private void removeArtifacts(RepositoryContext gitRepoCtx, Set<String> artifacts) {
- if(artifacts.isEmpty())
+ if (artifacts.isEmpty())
return;
RmCommand rmCmd = gitRepoCtx.getGit().rm();
@@ -377,10 +373,13 @@ public class GitBasedArtifactRepository {
try {
rmCmd.call();
+ if (log.isDebugEnabled()) {
+ log.debug("Removed artifacts for tenant : " + gitRepoCtx.getTenantId());
+ }
} catch (GitAPIException e) {
log.error("Removing artifact from the local repository at " + gitRepoCtx.getGitLocalRepoPath() + "failed", e);
- e.printStackTrace();
+ log.error(e);
}
}
@@ -389,7 +388,7 @@ public class GitBasedArtifactRepository {
*
* @param gitRepoCtx RepositoryContext instance for the tenant
*/
- private void commitToLocalRepo (RepositoryContext gitRepoCtx) {
+ private void commitToLocalRepo(RepositoryContext gitRepoCtx) {
CommitCommand commitCmd = gitRepoCtx.getGit().commit();
commitCmd.setMessage("tenant " + gitRepoCtx.getTenantId() + "'s artifacts committed to local repo at " +
@@ -397,10 +396,12 @@ public class GitBasedArtifactRepository {
try {
commitCmd.call();
+ if (log.isDebugEnabled()) {
+ log.debug("Committed artifacts for tenant : " + gitRepoCtx.getTenantId());
+ }
} catch (GitAPIException e) {
log.error("Committing artifacts to local repository failed for tenant " + gitRepoCtx.getTenantId(), e);
- e.printStackTrace();
}
}
@@ -412,7 +413,7 @@ public class GitBasedArtifactRepository {
private void pushToRemoteRepo(RepositoryContext gitRepoCtx) {
PushCommand pushCmd = gitRepoCtx.getGit().push();
- if(!gitRepoCtx.getKeyBasedAuthentication()) {
+ if (!gitRepoCtx.getKeyBasedAuthentication()) {
UsernamePasswordCredentialsProvider credentialsProvider = createCredentialsProvider(gitRepoCtx);
if (credentialsProvider != null)
pushCmd.setCredentialsProvider(credentialsProvider);
@@ -420,47 +421,173 @@ public class GitBasedArtifactRepository {
try {
pushCmd.call();
+ if (log.isDebugEnabled()) {
+ log.debug("Pushed artifacts for tenant : " + gitRepoCtx.getTenantId());
+ }
} catch (GitAPIException e) {
log.error("Pushing artifacts to remote repository failed for tenant " + gitRepoCtx.getTenantId(), e);
- e.printStackTrace();
+
}
}
- public boolean checkout(RepositoryInformation repositoryInformation) {
- /*if(log.isInfoEnabled()) {
- log.info("Executing checkout");
- }*/
+ /* public boolean checkout(RepositoryInformation repositoryInformation) {
+
if (log.isDebugEnabled()) {
log.debug("Artifact checkout done by thread " + Thread.currentThread().getName() + " - " +
- Thread.currentThread().getId());
+ Thread.currentThread().getId());
}
- int tenantId = Integer.parseInt(repositoryInformation.getTenantId());
-
- // if context for tenant is not initialized
- if(tenantToRepoContextMap.get(tenantId) == null)
- initGitContext(repositoryInformation);
-
-
- RepositoryContext gitRepoCtx = retrieveCachedGitContext(tenantId);
- if(gitRepoCtx == null) { //to handle super tenant scenario
- // if(log.isDebugEnabled())
- log.info("No git repository context information found for deployment synchronizer");
+ int tenantId = Integer.parseInt(repositoryInformation.getTenantId());
+
+ // if context for tenant is not initialized
+ if (tenantToRepoContextMap.get(tenantId) == null)
+ initGitContext(repositoryInformation);
+
+
+ RepositoryContext gitRepoCtx = retrieveCachedGitContext(tenantId);
+ if (gitRepoCtx == null) { //to handle super tenant scenario
+ // if(log.isDebugEnabled())
+ log.info("No git repository context information found for deployment synchronizer");
return true;
}
synchronized (gitRepoCtx) {
- if(!gitRepoCtx.cloneExists())
+ if (!gitRepoCtx.cloneExists())
cloneRepository(gitRepoCtx);
return pullArtifacts(gitRepoCtx);
}
+ } */
+ public boolean checkout (RepositoryInformation repositoryInformation) throws Exception {
+
+ int tenantId = Integer.parseInt(repositoryInformation.getTenantId());
+
+ // if context for tenant is not initialized
+ if (tenantToRepoContextMap.get(tenantId) == null) {
+ initGitContext(repositoryInformation);
+ }
+
+ RepositoryContext gitRepoCtx = retrieveCachedGitContext(tenantId);
+
+ File gitRepoDir = new File(gitRepoCtx.getGitLocalRepoPath());
+ if (!gitRepoDir.exists()) {
+ return cloneRepository(gitRepoCtx);
+ }
+ else {
+ if (isValidGitRepo(gitRepoCtx)) {
+ if (log.isDebugEnabled()) {
+ log.debug("Existing git repository detected for tenant " + gitRepoCtx.getTenantId() + ", no clone required");
+ }
+
+ return pullAndHandleErrors(gitRepoCtx);
+
+ } else {
+ // not a valid git repo, check if the directory is non-empty
+ if (gitRepoDir.list().length > 0) {
+ // directory is non empty. sync existing artifacts with the remote repository
+ if (syncInitialLocalArtifacts(gitRepoCtx)) {
+ log.info("Existing local artifacts for tenant [" + gitRepoCtx.getTenantId() + "] synchronized with remote repository successfully");
+ // pull any changes from the remote repo
+ return pullAndHandleErrors(gitRepoCtx);
+ }
+ return false;
+
+ } else {
+ // directory is empty, clone
+ return cloneRepository(gitRepoCtx);
+ }
+ }
+ }
+ }
+
+ private boolean pullAndHandleErrors (RepositoryContext gitRepoCtx) {
+
+ try {
+ return pullArtifacts(gitRepoCtx);
+
+ } catch (CheckoutConflictException e) {
+ // checkout from remote HEAD
+ return checkoutFromRemoteHead(gitRepoCtx, e.getConflictingPaths());
+ // pull again
+ /*try {
+ return pullArtifacts(gitRepoCtx);
+
+ } catch (GitAPIException e1) {
+ //cannot happen here
+ log.error("Git pull failed for tenant " + gitRepoCtx.getTenantId(), e1);
+ return false;
+ }*/
+ }
+ }
+
+ private boolean checkoutFromRemoteHead(RepositoryContext gitRepoCtx, List<String> paths) {
+
+ boolean checkoutSuccess = false;
+
+ CheckoutCommand checkoutCmd = gitRepoCtx.getGit().checkout();
+ for(String path : paths) {
+ checkoutCmd.addPath(path);
+ if(log.isDebugEnabled()) {
+ log.debug("Added the file path " + path + " to checkout from the remote repository");
+ }
+ }
+ // specify the start point as the HEAD of remote repository
+ checkoutCmd.setStartPoint(GitDeploymentSynchronizerConstants.REMOTES_ORIGIN_MASTER);
+
+ try {
+ checkoutCmd.call();
+ checkoutSuccess = true;
+ log.info("Checked out the conflicting files from the remote repository successfully");
+
+ } catch (GitAPIException e) {
+ log.error("Checking out artifacts from index failed", e);
+ }
+
+ return checkoutSuccess;
}
-
- public void scheduleSyncTask (RepositoryInformation repoInformation, long delay) {
+
+ private void resetToRemoteHead (RepositoryContext gitRepoCtx, List<String> paths) {
+
+ ResetCommand resetCmd = gitRepoCtx.getGit().reset();
+
+ // reset type is HARD, to remote master branch
+ resetCmd.setMode(ResetCommand.ResetType.HARD).
+ setRef(GitDeploymentSynchronizerConstants.ORIGIN + "/" + GitDeploymentSynchronizerConstants.MASTER);
+
+ // add paths
+ for(String path : paths) {
+ resetCmd.addPath(path);
+ if(log.isDebugEnabled()) {
+ log.debug("Added the file path " + path + " to reset");
+ }
+ }
+
+ try {
+ resetCmd.call();
+ log.info("Reset the local branch to origin master successfully");
+
+ } catch (GitAPIException e) {
+ log.error("Reset to origin master failed", e);
+ }
+
+ }
+
+ private boolean syncInitialLocalArtifacts(RepositoryContext gitRepoCtx) throws Exception {
+
+ boolean syncedLocalArtifacts;
+
+ //initialize repository
+ InitGitRepository(new File(gitRepoCtx.getGitLocalRepoPath()));
+ //add the remote repository (origin)
+ syncedLocalArtifacts = addRemote(gitRepoCtx.getLocalRepo(), gitRepoCtx.getGitRemoteRepoUrl());
+
+ return syncedLocalArtifacts;
+ }
+
+ public void scheduleSyncTask(RepositoryInformation repoInformation, boolean autoCheckout, boolean autoCommit, long delay) {
int tenantId = Integer.parseInt(repoInformation.getTenantId());
@@ -471,37 +598,38 @@ public class GitBasedArtifactRepository {
}
if (repoCtxt.getArtifactSyncSchedular() == null) {
- synchronized (repoCtxt) {
- if (repoCtxt.getArtifactSyncSchedular() == null) {
- // create a new ScheduledExecutorService instance
- final ScheduledExecutorService artifactSyncScheduler = Executors.newScheduledThreadPool(1,
- new ArtifactSyncTaskThreadFactory(repoCtxt.getGitLocalRepoPath()));
+ synchronized (repoCtxt) {
+ if (repoCtxt.getArtifactSyncSchedular() == null) {
+ // create a new ScheduledExecutorService instance
+ final ScheduledExecutorService artifactSyncScheduler = Executors.newScheduledThreadPool(1,
+ new ArtifactSyncTaskThreadFactory(repoCtxt.getGitLocalRepoPath()));
- // schedule at the given interval
- artifactSyncScheduler.scheduleAtFixedRate(new ArtifactSyncTask(repoInformation), delay, delay, TimeUnit.SECONDS);
- // cache
- repoCtxt.setArtifactSyncSchedular(artifactSyncScheduler);
+ // schedule at the given interval
+ artifactSyncScheduler.scheduleAtFixedRate(new ArtifactSyncTask(repoInformation, autoCheckout, autoCommit), delay, delay, TimeUnit.SECONDS);
+ // cache
+ repoCtxt.setArtifactSyncSchedular(artifactSyncScheduler);
- log.info("Scheduled Artifact Synchronization Task for path " + repoCtxt.getGitLocalRepoPath());
+ log.info("Scheduled Artifact Synchronization Task for path " + repoCtxt.getGitLocalRepoPath());
- } else {
- log.info("Artifact Synchronization Task for path " + repoCtxt.getGitLocalRepoPath() + " already scheduled");
- }
- }
+ } else {
+ log.info("Artifact Synchronization Task for path " + repoCtxt.getGitLocalRepoPath() + " already scheduled");
+ }
+ }
}
}
-
+
public boolean cloneExists(RepositoryInformation repositoryInformation) {
-
- int tenantId = Integer.parseInt(repositoryInformation.getTenantId());
-
- // if context for tenant is not initialized
- if(tenantToRepoContextMap.get(tenantId) == null)
- initGitContext(repositoryInformation);
-
-
- RepositoryContext gitRepoCtx = retrieveCachedGitContext(tenantId);
- if(gitRepoCtx == null) {
+
+ int tenantId = Integer.parseInt(repositoryInformation.getTenantId());
+
+ // if context for tenant is not initialized
+ if (tenantToRepoContextMap.get(tenantId) == null) {
+ initGitContext(repositoryInformation);
+ }
+
+
+ RepositoryContext gitRepoCtx = retrieveCachedGitContext(tenantId);
+ if (gitRepoCtx == null) {
return false;
}
@@ -515,16 +643,15 @@ public class GitBasedArtifactRepository {
* will call 'RepositoryInformationService' for credentials.
*
* @param gitRepoCtx RepositoryContext instance for tenant
- *
* @return true if success, else false
*/
- private boolean pullArtifacts (RepositoryContext gitRepoCtx) {
- if(log.isDebugEnabled()) {
- log.debug("Pulling artifacts");
+ /*private boolean pullArtifacts(RepositoryContext gitRepoCtx) {
+ if (log.isDebugEnabled()) {
+ log.debug("Pulling artifacts");
}
PullCommand pullCmd = gitRepoCtx.getGit().pull();
- if(!gitRepoCtx.getKeyBasedAuthentication()) {
+ if (!gitRepoCtx.getKeyBasedAuthentication()) {
UsernamePasswordCredentialsProvider credentialsProvider = createCredentialsProvider(gitRepoCtx);
if (credentialsProvider != null)
pullCmd.setCredentialsProvider(credentialsProvider);
@@ -540,7 +667,7 @@ public class GitBasedArtifactRepository {
}
// execute artifact update extension
- ExtensionUtils.executeArtifactsUpdatedExtension();
+ extensionHandler.onArtifactUpdateSchedulerEvent(String.valueOf(gitRepoCtx.getTenantId()));
}
} catch (InvalidConfigurationException e) {
@@ -550,7 +677,7 @@ public class GitBasedArtifactRepository {
Utilities.deleteFolderStructure(new File(gitRepoCtx.getGitLocalRepoPath()));
cloneRepository(gitRepoCtx);
// execute artifact update extension
- ExtensionUtils.executeArtifactsUpdatedExtension();
+ extensionHandler.onArtifactUpdateSchedulerEvent(String.valueOf(gitRepoCtx.getTenantId()));
return true;
} catch (JGitInternalException e) {
@@ -567,7 +694,7 @@ public class GitBasedArtifactRepository {
Utilities.deleteFolderStructure(new File(gitRepoCtx.getGitLocalRepoPath()));
cloneRepository(gitRepoCtx);
// execute artifact update extension
- ExtensionUtils.executeArtifactsUpdatedExtension();
+ extensionHandler.onArtifactUpdateSchedulerEvent(String.valueOf(gitRepoCtx.getTenantId()));
return true;
} catch (GitAPIException e) {
@@ -576,6 +703,62 @@ public class GitBasedArtifactRepository {
return false;
}
return true;
+ }*/
+
+ private boolean pullArtifacts (RepositoryContext gitRepoCtx) throws CheckoutConflictException {
+
+ PullCommand pullCmd = gitRepoCtx.getGit().pull();
+
+ UsernamePasswordCredentialsProvider credentialsProvider = createCredentialsProvider(gitRepoCtx);
+
+ if (credentialsProvider == null) {
+ log.warn ("Remote repository credentials not available for tenant " + gitRepoCtx.getTenantId() +
+ ", aborting pull");
+ return false;
+ }
+ pullCmd.setCredentialsProvider(credentialsProvider);
+
+ try {
+ PullResult pullResult = pullCmd.call();
+ // check if we have received any updates
+ if (!pullResult.getFetchResult().getTrackingRefUpdates().isEmpty()) {
+ if (log.isDebugEnabled()) {
+ log.debug("Artifacts were updated as a result of the pull operation, thread: " + Thread.currentThread().getName() + " - " +
+ Thread.currentThread().getId());
+ }
+
+ // execute artifact update extension
+ extensionHandler.onArtifactUpdateSchedulerEvent(String.valueOf(gitRepoCtx.getTenantId()));
+ }
+
+ } catch (InvalidConfigurationException e) {
+ log.warn("Git pull unsuccessful for tenant " + gitRepoCtx.getTenantId() + ", invalid configuration. " + e.getMessage());
+ // FileUtilities.deleteFolderStructure(new File(gitRepoCtx.getLocalRepoPath()));
+ //cloneRepository(gitRepoCtx);
+ Utilities.deleteFolderStructure(new File(gitRepoCtx.getGitLocalRepoPath()));
+ cloneRepository(gitRepoCtx);
+ // execute artifact update extension
+ extensionHandler.onArtifactUpdateSchedulerEvent(String.valueOf(gitRepoCtx.getTenantId()));
+ return true;
+
+ } catch (JGitInternalException e) {
+ log.warn("Git pull unsuccessful for tenant " + gitRepoCtx.getTenantId() + ", " + e.getMessage());
+ return false;
+
+ } catch (TransportException e) {
+ log.error("Accessing remote git repository " + gitRepoCtx.getGitRemoteRepoUrl() + " failed for tenant " + gitRepoCtx.getTenantId(), e);
+ return false;
+
+ } catch (CheckoutConflictException e) {
+ log.warn("Git pull unsuccessful for tenant " + gitRepoCtx.getTenantId() + ", conflicts detected");
+ throw e;
+
+ } catch (GitAPIException e) {
+ log.error("Git pull operation for tenant " + gitRepoCtx.getTenantId() + " failed", e);
+ return false;
+ }
+
+ return true;
}
/**
@@ -583,30 +766,30 @@ public class GitBasedArtifactRepository {
*
* @param gitRepoCtx RepositoryContext instance of the tenant
*/
- private void handleInvalidConfigurationError (RepositoryContext gitRepoCtx) {
+ private void handleInvalidConfigurationError(RepositoryContext gitRepoCtx) {
StoredConfig storedConfig = gitRepoCtx.getLocalRepo().getConfig();
boolean modifiedConfig = false;
- if(storedConfig != null) {
+ if (storedConfig != null) {
- if(storedConfig.getString("branch", "master", "remote") == null ||
+ if (storedConfig.getString("branch", "master", "remote") == null ||
storedConfig.getString("branch", "master", "remote").isEmpty()) {
storedConfig.setString("branch", "master", "remote", "origin");
modifiedConfig = true;
}
- if(storedConfig.getString("branch", "master", "merge") == null ||
+ if (storedConfig.getString("branch", "master", "merge") == null ||
storedConfig.getString("branch", "master", "merge").isEmpty()) {
storedConfig.setString("branch", "master", "merge", "refs/heads/master");
modifiedConfig = true;
}
- if(modifiedConfig) {
+ if (modifiedConfig) {
try {
storedConfig.save();
- // storedConfig.load();
+ // storedConfig.load();
} catch (IOException e) {
log.error("Error saving git configuration file in local repo at " + gitRepoCtx.getGitLocalRepoPath(), e);
@@ -623,27 +806,26 @@ public class GitBasedArtifactRepository {
*
* @param gitRepoCtx RepositoryContext for the tenant
*/
- private static void cloneRepository (RepositoryContext gitRepoCtx) { //should happen only at the beginning
+ /*private static void cloneRepository(RepositoryContext gitRepoCtx) { //should happen only at the beginning
File gitRepoDir = new File(gitRepoCtx.getGitLocalRepoPath());
if (gitRepoDir.exists()) {
- if(isValidGitRepo(gitRepoCtx)) { //check if a this is a valid git repo
+ if (isValidGitRepo(gitRepoCtx)) { //check if a this is a valid git repo
log.info("Existing git repository detected for tenant " + gitRepoCtx.getTenantId() + ", no clone required");
gitRepoCtx.setCloneExists(true);
return;
- }
- else {
- if(log.isDebugEnabled())
+ } else {
+ if (log.isDebugEnabled())
log.debug("Repository for tenant " + gitRepoCtx.getTenantId() + " is not a valid git repo");
Utilities.deleteFolderStructure(gitRepoDir); //if not a valid git repo but non-empty, delete it (else the clone will not work)
}
}
- CloneCommand cloneCmd = gitRepoCtx.getGit().cloneRepository().
- setURI(gitRepoCtx.getGitRemoteRepoUrl()).
- setDirectory(gitRepoDir);
+ CloneCommand cloneCmd = gitRepoCtx.getGit().cloneRepository().
+ setURI(gitRepoCtx.getGitRemoteRepoUrl()).
+ setDirectory(gitRepoDir);
- if(!gitRepoCtx.getKeyBasedAuthentication()) {
+ if (!gitRepoCtx.getKeyBasedAuthentication()) {
UsernamePasswordCredentialsProvider credentialsProvider = createCredentialsProvider(gitRepoCtx);
if (credentialsProvider != null)
cloneCmd.setCredentialsProvider(credentialsProvider);
@@ -662,6 +844,42 @@ public class GitBasedArtifactRepository {
log.error("Git clone operation for tenant " + gitRepoCtx.getTenantId() + " failed", e);
e.printStackTrace();
}
+ }*/
+
+ private boolean cloneRepository (RepositoryContext gitRepoCtx) { //should happen only at the beginning
+
+ boolean cloneSuccess = false;
+
+ File gitRepoDir = new File(gitRepoCtx.getGitLocalRepoPath());
+
+ CloneCommand cloneCmd = Git.cloneRepository().
+ setURI(gitRepoCtx.getGitRemoteRepoUrl()).
+ setDirectory(gitRepoDir).
+ setBranch(GitDeploymentSynchronizerConstants.GIT_REFS_HEADS_MASTER);
+
+ UsernamePasswordCredentialsProvider credentialsProvider = createCredentialsProvider(gitRepoCtx);
+
+ if (credentialsProvider == null) {
+ log.warn ("Remote repository credentials not available for tenant " + gitRepoCtx.getTenantId() +
+ ", aborting clone");
+ return false;
+ }
+ cloneCmd.setCredentialsProvider(credentialsProvider);
+
+ try {
+ cloneCmd.call();
+ log.info("Git clone operation for tenant " + gitRepoCtx.getTenantId() + " successful");
+ gitRepoCtx.setCloneExists(true);
+ cloneSuccess = true;
+
+ } catch (TransportException e) {
+ log.error("Accessing remote git repository failed for tenant " + gitRepoCtx.getTenantId(), e);
+
+ } catch (GitAPIException e) {
+ log.error("Git clone operation for tenant " + gitRepoCtx.getTenantId() + " failed", e);
+ }
+
+ return cloneSuccess;
}
/**
@@ -669,11 +887,10 @@ public class GitBasedArtifactRepository {
* and creates a UsernamePasswordCredentialsProvider from a valid username and a password
*
* @param gitRepoCtx RepositoryContext instance
- *
* @return UsernamePasswordCredentialsProvider instance or null if service invocation failed or
* username/password is not valid
*/
- private static UsernamePasswordCredentialsProvider createCredentialsProvider (RepositoryContext gitRepoCtx) {
+ private static UsernamePasswordCredentialsProvider createCredentialsProvider(RepositoryContext gitRepoCtx) {
return new UsernamePasswordCredentialsProvider(gitRepoCtx.getRepoUsername(), gitRepoCtx.getRepoPassword());
}
@@ -681,10 +898,15 @@ public class GitBasedArtifactRepository {
* Checks if an existing local repository is a valid git repository
*
* @param gitRepoCtx RepositoryContext instance
- *
* @return true if a valid git repo, else false
*/
- private static boolean isValidGitRepo (RepositoryContext gitRepoCtx) {
+ private static boolean isValidGitRepo(RepositoryContext gitRepoCtx) {
+
+ // check if has been marked as cloned before
+ if(gitRepoCtx.cloneExists()) {
+ // repo is valid
+ return true;
+ }
for (Ref ref : gitRepoCtx.getLocalRepo().getAllRefs().values()) { //check if has been previously cloned successfully, not empty
if (ref.getObjectId() == null)
@@ -695,6 +917,55 @@ public class GitBasedArtifactRepository {
return false;
}
+ public static void InitGitRepository (File gitRepoDir) throws Exception {
+
+ try {
+ Git.init().setDirectory(gitRepoDir).setBare(false).call();
+
+ } catch (GitAPIException e) {
+ String errorMsg = "Initializing local repo at " + gitRepoDir.getPath() + " failed";
+ log.error(errorMsg, e);
+ throw new Exception(errorMsg, e);
+ }
+ }
+
+ public static boolean addRemote (Repository repository, String remoteUrl) {
+
+ boolean remoteAdded = false;
+
+ StoredConfig config = repository.getConfig();
+ config.setString(GitDeploymentSynchronizerConstants.REMOTE,
+ GitDeploymentSynchronizerConstants.ORIGIN,
+ GitDeploymentSynchronizerConstants.URL,
+ remoteUrl);
+
+ config.setString(GitDeploymentSynchronizerConstants.REMOTE,
+ GitDeploymentSynchronizerConstants.ORIGIN,
+ GitDeploymentSynchronizerConstants.FETCH,
+ GitDeploymentSynchronizerConstants.FETCH_LOCATION);
+
+ config.setString(GitDeploymentSynchronizerConstants.BRANCH,
+ GitDeploymentSynchronizerConstants.MASTER,
+ GitDeploymentSynchronizerConstants.REMOTE,
+ GitDeploymentSynchronizerConstants.ORIGIN);
+
+ config.setString(GitDeploymentSynchronizerConstants.BRANCH,
+ GitDeploymentSynchronizerConstants.MASTER,
+ GitDeploymentSynchronizerConstants.MERGE,
+ GitDeploymentSynchronizerConstants.GIT_REFS_HEADS_MASTER);
+
+ try {
+ config.save();
+ remoteAdded = true;
+
+ } catch (IOException e) {
+ log.error("Error in adding remote origin " + remoteUrl + " for local repository " +
+ repository.toString(), e);
+ }
+
+ return remoteAdded;
+ }
+
public void cleanupAutoCheckout() {
@@ -705,17 +976,30 @@ public class GitBasedArtifactRepository {
return null;
}
- private class ArtifactSyncTask implements Runnable {
+ private class ArtifactSyncTask implements Runnable {
private RepositoryInformation repositoryInformation;
+ private boolean autoCheckout;
+ private boolean autoCommit;
- public ArtifactSyncTask (RepositoryInformation repositoryInformation) {
+ public ArtifactSyncTask(RepositoryInformation repositoryInformation, boolean autoCheckout, boolean autoCommit) {
this.repositoryInformation = repositoryInformation;
+ this.autoCheckout = autoCheckout;
+ this.autoCommit = autoCommit;
}
@Override
public void run() {
- checkout(repositoryInformation);
+ try {
+ if (autoCheckout) {
+ checkout(repositoryInformation);
+ }
+ } catch (Exception e) {
+ log.error(e);
+ }
+ if (autoCommit) {
+ commit(repositoryInformation);
+ }
}
}
@@ -723,7 +1007,7 @@ public class GitBasedArtifactRepository {
private String localRepoPath;
- public ArtifactSyncTaskThreadFactory (String localRepoPath) {
+ public ArtifactSyncTaskThreadFactory(String localRepoPath) {
this.localRepoPath = localRepoPath;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/internal/GitDeploymentSynchronizerConstants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/internal/GitDeploymentSynchronizerConstants.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/internal/GitDeploymentSynchronizerConstants.java
index 19c104d..dcada46 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/internal/GitDeploymentSynchronizerConstants.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/internal/GitDeploymentSynchronizerConstants.java
@@ -58,4 +58,16 @@ public class GitDeploymentSynchronizerConstants {
public static final String USERNAME_REGEX = "username:(.*?),";
public static final String PASSWORD_REGEX = "password:(.*?)}";
+ //Git based constants
+ public static final String GIT_REFS_HEADS_MASTER = "refs/heads/master";
+ public static final String REMOTES_ORIGIN_MASTER = "remotes/origin/master";
+ public static final String REMOTE = "remote";
+ public static final String ORIGIN = "origin";
+ public static final String URL = "url";
+ public static final String FETCH = "fetch";
+ public static final String BRANCH = "branch";
+ public static final String MASTER = "master";
+ public static final String MERGE = "merge";
+ public static final String FETCH_LOCATION = "+refs/heads/*:refs/remotes/origin/*";
+
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/util/Utilities.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/util/Utilities.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/util/Utilities.java
index a6c2f4b..6d9bec6 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/util/Utilities.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/artifact/deployment/synchronizer/git/util/Utilities.java
@@ -64,6 +64,9 @@ public class Utilities {
try {
FileUtils.deleteDirectory(existingDir);
+ if(log.isDebugEnabled()) {
+ log.debug(" Directory [" + existingDir + "] deleted. ");
+ }
} catch (IOException e) {
log.error("Deletion of existing non-git repository structure failed");
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
index 7c378f6..947329d 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/CartridgeAgentConfiguration.java
@@ -28,11 +28,7 @@ import org.apache.stratos.cartridge.agent.util.CartridgeAgentConstants;
import org.apache.stratos.cartridge.agent.util.CartridgeAgentUtils;
import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Scanner;
+import java.util.*;
/**
* Cartridge agent configuration.
@@ -41,7 +37,7 @@ public class CartridgeAgentConfiguration {
private static final Log log = LogFactory.getLog(CartridgeAgentConfiguration.class);
private static volatile CartridgeAgentConfiguration instance;
-
+ private final String serviceGroup;
private final String serviceName;
private final String clusterId;
private final String networkPartitionId;
@@ -52,16 +48,32 @@ public class CartridgeAgentConfiguration {
private final String repoUrl;
private final List<Integer> ports;
private final List<String> logFilePaths;
+ private final boolean isCommitsEnabled;
+ private final boolean isCheckoutEnabled;
+ private final String listenAddress;
+ private final String lbClusterId;
+ private final String tenantId;
+ private final String isClustered;
+ private final String minCount;
private Map<String, String> parameters;
private boolean isMultitenant;
private String persistenceMappings;
- private final boolean isCommitsEnabled;
- private final String listenAddress;
+ private boolean isInternalRepo;
+ private String isPrimary;
+ private String lbPrivateIp;
+ private String lbPublicIp;
+ private String deployment;
+ private String managerServiceName;
+ private String workerServiceName;
+ private String superTenantRepositoryPath;
+ private String tenantRepositoryPath;
private CartridgeAgentConfiguration() {
- parameters = loadParametersFile();
+ parameters = loadParametersFile();
try {
+ serviceGroup = readServiceGroup();
+ isClustered = readClustering();
serviceName = readParameterValue(CartridgeAgentConstants.SERVICE_NAME);
clusterId = readParameterValue(CartridgeAgentConstants.CLUSTER_ID);
networkPartitionId = readParameterValue(CartridgeAgentConstants.NETWORK_PARTITION_ID);
@@ -73,19 +85,34 @@ public class CartridgeAgentConfiguration {
ports = readPorts();
logFilePaths = readLogFilePaths();
isMultitenant = readMultitenant(CartridgeAgentConstants.MULTITENANT);
- persistenceMappings = readPersisenceMapping();
- isCommitsEnabled = readCommitsEnabled(CartridgeAgentConstants.COMMIT_ENABLED);
- listenAddress = System.getProperty(CartridgeAgentConstants.LISTEN_ADDRESS);
+ persistenceMappings = readPersistenceMapping();
+ isCommitsEnabled = readCommitParameterValue();
+ isCheckoutEnabled = Boolean.parseBoolean(System.getProperty(CartridgeAgentConstants.AUTO_CHECKOUT));
+ listenAddress = System.getProperty(CartridgeAgentConstants.LISTEN_ADDRESS);
+ isInternalRepo = readInternalRepo(CartridgeAgentConstants.PROVIDER);
+ tenantId = readParameterValue(CartridgeAgentConstants.TENANT_ID);
+ lbClusterId = readParameterValue(CartridgeAgentConstants.LB_CLUSTER_ID);
+ minCount = readParameterValue(CartridgeAgentConstants.MIN_INSTANCE_COUNT);
+ // not mandatory
+ lbPrivateIp = System.getProperty(CartridgeAgentConstants.LB_PRIVATE_IP);
+ lbPublicIp = System.getProperty(CartridgeAgentConstants.LB_PUBLIC_IP);
+ tenantRepositoryPath = System.getProperty(CartridgeAgentConstants.TENANT_REPO_PATH);
+ superTenantRepositoryPath = System.getProperty(CartridgeAgentConstants.SUPER_TENANT_REPO_PATH);
+
+ deployment = readDeployment();
+ managerServiceName = readManagerServiceType();
+ workerServiceName = readWorkerServiceType();
+ isPrimary = readIsPrimary();
} catch (ParameterNotFoundException e) {
throw new RuntimeException(e);
}
- if(log.isInfoEnabled()) {
+ if (log.isInfoEnabled()) {
log.info("Cartridge agent configuration initialized");
}
- if(log.isDebugEnabled()) {
+ if (log.isDebugEnabled()) {
log.debug(String.format("service-name: %s", serviceName));
log.debug(String.format("cluster-id: %s", clusterId));
log.debug(String.format("network-partition-id: %s", networkPartitionId));
@@ -95,26 +122,76 @@ public class CartridgeAgentConfiguration {
log.debug(String.format("app-path: %s", appPath));
log.debug(String.format("repo-url: %s", repoUrl));
log.debug(String.format("ports: %s", ports.toString()));
+ log.debug(String.format("lb-private-ip: %s", lbPrivateIp));
+ log.debug(String.format("lb-public-ip: %s", lbPublicIp));
}
}
- private boolean readCommitsEnabled(String commitEnabled) {
- boolean isCommitEnabled = false;
- try {
- isCommitEnabled = Boolean.parseBoolean(readParameterValue(commitEnabled));
- } catch (ParameterNotFoundException e) {
- // Missing commits enabled flag is not an exception
- log.error(" Commits enabled payload parameter is not found");
- }
- return isCommitEnabled;
- }
+ private String readDeployment(){
+ if (parameters.containsKey(CartridgeAgentConstants.DEPLOYMENT)) {
+ return parameters.get(CartridgeAgentConstants.DEPLOYMENT);
+ }
+ return null;
+ }
- private boolean readMultitenant(String multitenant) throws ParameterNotFoundException {
- String multitenantStringValue = readParameterValue(multitenant);
- return Boolean.parseBoolean(multitenantStringValue);
- }
+ private String readManagerServiceType(){
+
+ if (deployment == null) {
+ return null;
+ }
+
+ if (getDeployment().equalsIgnoreCase(CartridgeAgentConstants.DEPLOYMENT_MANAGER)) {
+ // if this is a manager, manager service type = service name
+ return serviceName;
+
+ } else if (getDeployment().equalsIgnoreCase(CartridgeAgentConstants.DEPLOYMENT_WORKER)) {
+ // if a worker, need to read the manager service type sent by payload
+ if (parameters.containsKey(CartridgeAgentConstants.MANAGER_SERVICE_TYPE)) {
+ return parameters.get(CartridgeAgentConstants.MANAGER_SERVICE_TYPE);
+ }
+
+ } else if (getDeployment().equalsIgnoreCase(CartridgeAgentConstants.DEPLOYMENT_DEFAULT)) {
+ // for default deployment, no manager service type
+ return null;
+
+ }
+
+ return null;
+ }
+
+ private String readWorkerServiceType(){
+
+ if (deployment == null) {
+ return null;
+ }
+
+ if (getDeployment().equalsIgnoreCase(CartridgeAgentConstants.DEPLOYMENT_WORKER)) {
+ // if this is a worker, worker service type = service name
+ return serviceName;
+
+ } else if (getDeployment().equalsIgnoreCase(CartridgeAgentConstants.DEPLOYMENT_MANAGER)) {
+ // if a manager, need to read the worker service type sent by payload
+ if (parameters.containsKey(CartridgeAgentConstants.WORKER_SERVICE_TYPE)) {
+ return parameters.get(CartridgeAgentConstants.WORKER_SERVICE_TYPE);
+ }
- /**
+ } else if (getDeployment().equalsIgnoreCase(CartridgeAgentConstants.DEPLOYMENT_DEFAULT)) {
+ // for default deployment, no worker service type
+ return null;
+
+ }
+
+ return null;
+ }
+
+ private String readIsPrimary(){
+ if (parameters.containsKey(CartridgeAgentConstants.CLUSTERING_PRIMARY_KEY)) {
+ return parameters.get(CartridgeAgentConstants.CLUSTERING_PRIMARY_KEY);
+ }
+ return null;
+ }
+
+ /**
* Get cartridge agent configuration singleton instance.
*
* @return
@@ -130,7 +207,40 @@ public class CartridgeAgentConfiguration {
return instance;
}
- private String readPersisenceMapping() {
+ private boolean readCommitsEnabled(String commitEnabled) {
+ boolean isCommitEnabled = false;
+ try {
+ isCommitEnabled = Boolean.parseBoolean(readParameterValue(commitEnabled));
+
+ } catch (ParameterNotFoundException e) {
+ // Missing commits enabled flag is not an exception
+ log.error(" Commits enabled payload parameter is not found");
+ }
+ return isCommitEnabled;
+ }
+
+ private boolean readMultitenant(String multitenant) throws ParameterNotFoundException {
+ String multitenantStringValue = readParameterValue(multitenant);
+ return Boolean.parseBoolean(multitenantStringValue);
+ }
+
+ private boolean readInternalRepo(String internalRepo) {
+ String internalRepoStringValue = null;
+ try {
+ internalRepoStringValue = readParameterValue(internalRepo);
+ } catch (ParameterNotFoundException e) {
+ // Missing INTERNAL parameter is not an exception
+ log.info(" INTERNAL payload parameter is not found");
+ }
+
+ if(internalRepoStringValue.equals(CartridgeAgentConstants.INTERNAL)) {
+ return true;
+ } else{
+ return false;
+ }
+ }
+
+ private String readPersistenceMapping() {
String persistenceMapping = null;
try {
persistenceMapping = readParameterValue("PERSISTENCE_MAPPING");
@@ -145,14 +255,14 @@ public class CartridgeAgentConfiguration {
return persistenceMapping;
}
-
+
private Map<String, String> loadParametersFile() {
- Map<String, String> parameters = new HashMap<String, String>();
- try {
+ Map<String, String> parameters = new HashMap<String, String>();
+ try {
// read launch params
File file = new File(System.getProperty(CartridgeAgentConstants.PARAM_FILE_PATH));
- if(!file.exists()) {
+ if (!file.exists()) {
log.warn(String.format("File not found: %s", CartridgeAgentConstants.PARAM_FILE_PATH));
return parameters;
}
@@ -161,48 +271,81 @@ public class CartridgeAgentConfiguration {
String line = scanner.nextLine();
String[] params = line.split(",");
for (String string : params) {
- if (string != null) {
- String[] var = string.split("=");
- if (var.length >= 2) {
- parameters.put(var[0], var[1]);
- }
- }
+ if (string != null) {
+ String[] var = string.split("=");
+ if (var.length >= 2) {
+ parameters.put(var[0], var[1]);
+ }
+ }
}
}
scanner.close();
} catch (Exception e) {
- String message = "Could not read launch parameter file, hence trying to read from System properties.";
- log.warn(message, e);
+ String message = "Could not read launch parameter file, hence trying to read from System properties.";
+ log.warn(message, e);
+ }
+
+ return parameters;
+ }
+
+ private String readServiceGroup() {
+ if (parameters.containsKey(CartridgeAgentConstants.SERVICE_GROUP)) {
+ return parameters.get(CartridgeAgentConstants.SERVICE_GROUP);
+ } else {
+ return null;
+ }
+ }
+
+ private String readClustering() {
+ if (parameters.containsKey(CartridgeAgentConstants.CLUSTERING)) {
+ return parameters.get(CartridgeAgentConstants.CLUSTERING);
+ } else {
+ return null;
}
-
- return parameters;
}
- private String readParameterValue(String parameterName) throws ParameterNotFoundException{
+ private String readParameterValue(String parameterName) throws ParameterNotFoundException {
- if (parameters.containsKey(parameterName)) {
- return parameters.get(parameterName);
- }
+ if (parameters.containsKey(parameterName)) {
+ return parameters.get(parameterName);
+ }
- if (System.getProperty(parameterName) != null) {
- return System.getProperty(parameterName);
- }
+ if (System.getProperty(parameterName) != null) {
+ return System.getProperty(parameterName);
+ }
- String message = "Cannot find the value of required parameter: "+parameterName;
- throw new ParameterNotFoundException(message);
- }
+ String message = "Cannot find the value of required parameter: " + parameterName;
+ throw new ParameterNotFoundException(message);
+ }
+
+ private boolean readCommitParameterValue() throws ParameterNotFoundException {
+
+ if (parameters.containsKey(CartridgeAgentConstants.COMMIT_ENABLED)) {
+ return Boolean.parseBoolean(parameters.get(CartridgeAgentConstants.COMMIT_ENABLED));
+ }
+
+ if (System.getProperty(CartridgeAgentConstants.COMMIT_ENABLED) != null) {
+ return Boolean.parseBoolean(System.getProperty(CartridgeAgentConstants.COMMIT_ENABLED));
+ }
+
+ if (System.getProperty(CartridgeAgentConstants.AUTO_COMMIT) != null) {
+ return Boolean.parseBoolean(System.getProperty(CartridgeAgentConstants.AUTO_COMMIT));
+ }
+ log.info(CartridgeAgentConstants.COMMIT_ENABLED + " is not found and setting it to false");
+ return false;
+ }
private List<Integer> readPorts() throws ParameterNotFoundException {
List<Integer> ports = new ArrayList<Integer>();
String portsStr = readParameterValue(CartridgeAgentConstants.PORTS);
List<String> portsStrList = CartridgeAgentUtils.splitUsingTokenizer(portsStr, "|");
- for(String port : portsStrList) {
+ for (String port : portsStrList) {
ports.add(Integer.parseInt(port));
}
return ports;
}
- private List<String> readLogFilePaths () {
+ private List<String> readLogFilePaths() {
String logFileStr = null;
try {
@@ -258,20 +401,99 @@ public class CartridgeAgentConfiguration {
return logFilePaths;
}
- public boolean isMultitenant() {
- return isMultitenant;
- }
+ public boolean isMultitenant() {
+ return isMultitenant;
+ }
public String getPersistenceMappings() {
return persistenceMappings;
}
- public boolean isCommitsEnabled() {
- return isCommitsEnabled;
- }
-
+ public boolean isCommitsEnabled() {
+ return isCommitsEnabled;
+ }
public String getListenAddress() {
return listenAddress;
}
+
+ public boolean isInternalRepo() {
+ return isInternalRepo;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public String getLbClusterId() {
+ return lbClusterId;
+ }
+
+ public String getServiceGroup() {
+ return serviceGroup;
+ }
+
+ public String getIsClustered() {
+ return isClustered;
+ }
+
+ public String getMinCount() {
+ return minCount;
+ }
+
+ public String getIsPrimary() {
+ return isPrimary;
+ }
+
+ public String getLbPublicIp() {
+ return lbPublicIp;
+ }
+
+ public void setLbPublicIp(String lbPublicIp) {
+ this.lbPublicIp = lbPublicIp;
+ }
+
+ public String getLbPrivateIp() {
+ return lbPrivateIp;
+ }
+
+ public void setLbPrivateIp(String lbPrivateIp) {
+ this.lbPrivateIp = lbPrivateIp;
+ }
+
+ public String getDeployment() {
+ return deployment;
+ }
+
+ public void setDeployment(String deployment) {
+ this.deployment = deployment;
+ }
+
+ public String getManagerServiceName() {
+ return managerServiceName;
+ }
+
+ public void setManagerServiceName(String managerServiceName) {
+ this.managerServiceName = managerServiceName;
+ }
+
+ public String getWorkerServiceName() {
+ return workerServiceName;
+ }
+
+ public void setWorkerServiceName(String workerServiceName) {
+ this.workerServiceName = workerServiceName;
+ }
+
+ public String getSuperTenantRepositoryPath() {
+ return superTenantRepositoryPath;
+ }
+
+ public String getTenantRepositoryPath() {
+ return tenantRepositoryPath;
+ }
+
+ public boolean isCheckoutEnabled() {
+ return isCheckoutEnabled;
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/configurator/JndiConfigurator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/configurator/JndiConfigurator.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/configurator/JndiConfigurator.java
index 072734d..838dfd7 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/configurator/JndiConfigurator.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/config/configurator/JndiConfigurator.java
@@ -23,8 +23,6 @@ import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.cartridge.agent.config.CartridgeAgentConfiguration;
-import org.wso2.carbon.utils.CarbonUtils;
import java.io.File;
import java.io.FileInputStream;
@@ -38,7 +36,7 @@ public class JndiConfigurator {
private static final Log log = LogFactory.getLog(JndiConfigurator.class);
public static void configure() {
- if(log.isDebugEnabled()) {
+ if (log.isDebugEnabled()) {
log.debug("Configuring jndi.properties file");
}
generateJndiPropertiesFile();
@@ -46,26 +44,25 @@ public class JndiConfigurator {
private static void generateJndiPropertiesFile() {
String mbIp = System.getProperty("mb.ip");
- if(StringUtils.isBlank(mbIp)) {
+ if (StringUtils.isBlank(mbIp)) {
throw new RuntimeException("System property not found: mb.ip");
}
String mbPort = System.getProperty("mb.port");
- if(StringUtils.isBlank(mbPort)) {
+ if (StringUtils.isBlank(mbPort)) {
throw new RuntimeException("System property not found: mb.port");
}
- String templateFilePath = System.getProperty("jndi.properties.template.file.path");
- if(StringUtils.isBlank(templateFilePath)) {
+ String templateFilePath = System.getProperty("jndi.properties.template.file.path");
+ if (StringUtils.isBlank(templateFilePath)) {
throw new RuntimeException("System property not found: jndi.properties.template.file.path");
}
String jndiFileDir = System.getProperty("jndi.properties.dir");
- if(StringUtils.isBlank(jndiFileDir)) {
+ if (StringUtils.isBlank(jndiFileDir)) {
throw new RuntimeException("System property not found: jndi.properties.dir");
}
String jndiFilePath = null;
- if(jndiFileDir.endsWith("/")) {
+ if (jndiFileDir.endsWith("/")) {
jndiFilePath = jndiFileDir + "jndi.properties";
- }
- else {
+ } else {
jndiFilePath = jndiFileDir + "/" + "jndi.properties";
}
@@ -83,7 +80,7 @@ public class JndiConfigurator {
// Write jndi.properties file
writeFileContent(content, jndiFilePath);
- if(log.isDebugEnabled()) {
+ if (log.isDebugEnabled()) {
log.debug(String.format("jndi.properties file written to: %s", jndiFilePath));
}
} catch (Exception e) {
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/Constants.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/Constants.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/Constants.java
index 8a721fc..067961d 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/Constants.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/Constants.java
@@ -26,4 +26,17 @@ public class Constants {
public static String TAIL_COMMAND = "tail -n 100 -F ";
public static String MEMBER_ID = "memberId";
public static String LOG_EVENT = "logEvent";
+
+ public static String DATE_FORMATTER = "yyyy-MM-dd";
+ public static String DATE_TIME_FORMATTER = "yyyy-MM-dd HH:mm:ss,SSS";
+ public static String TENANT_ID = "tenantID";
+ public static String SERVER_NAME = "serverName";
+ public static String APP_NAME = "appName";
+ public static String LOG_TIME = "logTime";
+ public static String PRIORITY = "priority";
+ public static String MESSAGE = "message";
+ public static String LOGGER = "logger";
+ public static String IP = "ip";
+ public static String INSTANCE = "instance";
+ public static String STACKTRACE = "stacktrace";
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/FileBasedLogPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/FileBasedLogPublisher.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/FileBasedLogPublisher.java
index f75aa27..01e681e 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/FileBasedLogPublisher.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/FileBasedLogPublisher.java
@@ -39,9 +39,9 @@ public class FileBasedLogPublisher extends LogPublisher implements Runnable {
private Process process;
private Scanner scanner;
- public FileBasedLogPublisher(DataPublisherConfiguration dataPublisherConfig, StreamDefinition streamDefinition, String filePath, String memberId) {
+ public FileBasedLogPublisher(DataPublisherConfiguration dataPublisherConfig, StreamDefinition streamDefinition, String filePath, String memberId, String tenantId, String alias, Long datetime) {
- super(dataPublisherConfig, streamDefinition, filePath, memberId);
+ super(dataPublisherConfig, streamDefinition, filePath, memberId, tenantId, alias, datetime);
this.executorService = Executors.newSingleThreadExecutor(new FileBasedLogPublisherTaskThreadFactory(filePath));
}
@@ -88,7 +88,7 @@ public class FileBasedLogPublisher extends LogPublisher implements Runnable {
// set the relevant data
dataContext.setCorrelationData(null);
dataContext.setMetaData(new Object[] {memberId});
- dataContext.setPayloadData(new Object[] {scanner.nextLine()});
+ dataContext.setPayloadData(new Object[] {tenantId, alias, "", datetime, "", scanner.nextLine(), "","",memberId, ""});
// publish data
publish(dataContext);
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisher.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisher.java
index 306f109..ae7412c 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisher.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisher.java
@@ -31,12 +31,19 @@ public abstract class LogPublisher extends DataPublisher {
protected String memberId;
protected String filePath;
+ protected String tenantId;
+ protected String alias;
+ protected Long datetime;
+ protected String serverName;
- public LogPublisher (DataPublisherConfiguration dataPublisherConfig, StreamDefinition streamDefinition, String filePath, String memberId) {
+ public LogPublisher (DataPublisherConfiguration dataPublisherConfig, StreamDefinition streamDefinition, String filePath, String memberId, String tenantId, String alias, Long datetime) {
super(dataPublisherConfig, streamDefinition);
this.filePath = filePath;
this.memberId = memberId;
+ this.tenantId = tenantId;
+ this.alias = alias;
+ this.datetime = datetime;
}
public void start () {
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisherManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisherManager.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisherManager.java
index 02b8e63..5ca3c89 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisherManager.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/data/publisher/log/LogPublisherManager.java
@@ -19,21 +19,25 @@
package org.apache.stratos.cartridge.agent.data.publisher.log;
+import java.io.File;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.cartridge.agent.config.CartridgeAgentConfiguration;
import org.apache.stratos.cartridge.agent.data.publisher.DataPublisherConfiguration;
import org.apache.stratos.cartridge.agent.data.publisher.exception.DataPublisherException;
import org.apache.stratos.cartridge.agent.util.CartridgeAgentUtils;
+import org.wso2.carbon.base.MultitenantConstants;
import org.wso2.carbon.databridge.commons.Attribute;
import org.wso2.carbon.databridge.commons.AttributeType;
import org.wso2.carbon.databridge.commons.StreamDefinition;
import org.wso2.carbon.databridge.commons.exception.MalformedStreamDefinitionException;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
public class LogPublisherManager {
private static final Log log = LogFactory.getLog(LogPublisherManager.class);
@@ -58,7 +62,7 @@ public class LogPublisherManager {
// stream definition identifier = {log.publisher.<cluster id>}
try {
- streamDefinition = new StreamDefinition(Constants.LOG_PUBLISHER_STREAM_PREFIX + CartridgeAgentConfiguration.getInstance().getClusterId(),
+ streamDefinition = new StreamDefinition(Constants.LOG_PUBLISHER_STREAM_PREFIX + getValidTenantId(CartridgeAgentConfiguration.getInstance().getTenantId()) + "." + getAlias(CartridgeAgentConfiguration.getInstance().getClusterId()) + "." + getCurrentDate(),
Constants.LOG_PUBLISHER_STREAM_VERSION);
} catch (MalformedStreamDefinitionException e) {
@@ -71,8 +75,17 @@ public class LogPublisherManager {
metaDataDefinition.add(new Attribute(Constants.MEMBER_ID, AttributeType.STRING));
List<Attribute> payloadDataDefinition = new ArrayList<Attribute>();
- payloadDataDefinition.add(new Attribute(Constants.LOG_EVENT, AttributeType.STRING));
-
+ payloadDataDefinition.add(new Attribute(Constants.TENANT_ID, AttributeType.STRING));
+ payloadDataDefinition.add(new Attribute(Constants.SERVER_NAME, AttributeType.STRING));
+ payloadDataDefinition.add(new Attribute(Constants.APP_NAME, AttributeType.STRING));
+ payloadDataDefinition.add(new Attribute(Constants.LOG_TIME, AttributeType.LONG));
+ payloadDataDefinition.add(new Attribute(Constants.PRIORITY, AttributeType.STRING));
+ payloadDataDefinition.add(new Attribute(Constants.MESSAGE, AttributeType.STRING));
+ payloadDataDefinition.add(new Attribute(Constants.LOGGER, AttributeType.STRING));
+ payloadDataDefinition.add(new Attribute(Constants.IP, AttributeType.STRING));
+ payloadDataDefinition.add(new Attribute(Constants.INSTANCE, AttributeType.STRING));
+ payloadDataDefinition.add(new Attribute(Constants.STACKTRACE, AttributeType.STRING));
+
streamDefinition.setMetaData(metaDataDefinition);
streamDefinition.setPayloadData(payloadDataDefinition);
}
@@ -85,7 +98,10 @@ public class LogPublisherManager {
}
LogPublisher fileBasedLogPublisher = new FileBasedLogPublisher(dataPublisherConfig, streamDefinition, filePath,
- CartridgeAgentConfiguration.getInstance().getMemberId());
+ CartridgeAgentConfiguration.getInstance().getMemberId(),
+ getValidTenantId(CartridgeAgentConfiguration.getInstance().getTenantId()),
+ getAlias(CartridgeAgentConfiguration.getInstance().getClusterId()),
+ getDateTime());
fileBasedLogPublisher.initialize();
fileBasedLogPublisher.start();
@@ -102,4 +118,37 @@ public class LogPublisherManager {
}
}
}
+
+ private String getCurrentDate() {
+ Date now = new Date();
+ DateFormat formatter = new SimpleDateFormat(Constants.DATE_FORMATTER);
+ String formattedDate = formatter.format(now);
+ return formattedDate.replace("-", ".");
+ }
+
+ private String getAlias(String clusterId) {
+ String alias;
+ try {
+ alias = clusterId.split("\\.")[0];
+ } catch (Exception e) {
+ e.printStackTrace();
+ alias = clusterId;
+ }
+ return alias;
+ }
+
+ private Long getDateTime() {
+ Date date = new Date();
+ return date.getTime();
+ }
+
+ private String getValidTenantId(String tenantId) {
+ if (tenantId.equals(String
+ .valueOf(MultitenantConstants.INVALID_TENANT_ID))
+ || tenantId.equals(String
+ .valueOf(MultitenantConstants.SUPER_TENANT_ID))) {
+ return "0";
+ }
+ return tenantId;
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/7b35e29e/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java
index 9c2e21f..1046482 100644
--- a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java
+++ b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/event/publisher/CartridgeAgentEventPublisher.java
@@ -25,7 +25,6 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.cartridge.agent.config.CartridgeAgentConfiguration;
import org.apache.stratos.cartridge.agent.statistics.publisher.HealthStatisticsNotifier;
-import org.apache.stratos.cartridge.agent.util.ExtensionUtils;
import org.apache.stratos.messaging.broker.publish.EventPublisher;
import org.apache.stratos.messaging.broker.publish.EventPublisherPool;
import org.apache.stratos.messaging.event.instance.status.InstanceActivatedEvent;
@@ -63,7 +62,6 @@ public class CartridgeAgentEventPublisher {
log.info("Instance started event published");
}
- ExtensionUtils.executeInstanceStartedExtension();
} else {
if (log.isWarnEnabled()) {
log.warn("Instance already started");
@@ -81,7 +79,8 @@ public class CartridgeAgentEventPublisher {
CartridgeAgentConfiguration.getInstance().getClusterId(),
CartridgeAgentConfiguration.getInstance().getNetworkPartitionId(),
CartridgeAgentConfiguration.getInstance().getPartitionId(),
- CartridgeAgentConfiguration.getInstance().getMemberId());
+ CartridgeAgentConfiguration.getInstance().getMemberId()
+ );
// Event publisher connection will
EventPublisher eventPublisher = EventPublisherPool.getPublisher(Constants.INSTANCE_STATUS_TOPIC);
@@ -90,8 +89,6 @@ public class CartridgeAgentEventPublisher {
log.info("Instance activated event published");
}
- ExtensionUtils.executeInstanceActivatedExtension();
-
if (log.isInfoEnabled()) {
log.info("Starting health statistics notifier");
}
@@ -108,7 +105,7 @@ public class CartridgeAgentEventPublisher {
}
}
- public static void publishInstanceReadyToShutdownEvent() {
+ public static void publishInstanceReadyToShutdownEvent() {
if (!isReadyToShutdown()) {
if (log.isInfoEnabled()) {
log.info("Publishing instance activated event");
@@ -133,7 +130,7 @@ public class CartridgeAgentEventPublisher {
}
}
- public static void publishMaintenanceModeEvent() {
+ public static void publishMaintenanceModeEvent() {
if (!isMaintenance()) {
if (log.isInfoEnabled()) {
log.info("Publishing instance maintenance mode event");