/*
* RHQ Management Platform
* Copyright (C) 2005-2010 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.plugins.filetemplate;
import java.io.File;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.bundle.filetemplate.recipe.RecipeParser;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleResourceDeployment;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.bundle.BundleResourceDeploymentHistory.Category;
import org.rhq.core.domain.bundle.BundleResourceDeploymentHistory.Status;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.pluginapi.bundle.BundleDeployRequest;
import org.rhq.core.pluginapi.bundle.BundleDeployResult;
import org.rhq.core.pluginapi.bundle.BundleFacet;
import org.rhq.core.pluginapi.bundle.BundleManagerProvider;
import org.rhq.core.pluginapi.bundle.BundlePurgeRequest;
import org.rhq.core.pluginapi.bundle.BundlePurgeResult;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.util.FileUtils;
import org.rhq.core.util.file.FileUtil;
/**
* @author John Mazzitelli
*/
@SuppressWarnings("unchecked")
public class FileTemplateBundlePluginServerComponent implements ResourceComponent, BundleFacet {
/** property that should always be available to scripts - it's the location where the deployment should be installed */
private static final String DEPLOY_DIR = "rhq.deploy.dir";
/** property that should always be available to scripts - it's the ID of the bundle deployment */
private static final String DEPLOY_ID = "rhq.deploy.id";
/** property that should always be available to scripts - it's the name of the bundle deployment */
public static final String DEPLOY_NAME = "rhq.deploy.name";
private final Log log = LogFactory.getLog(FileTemplateBundlePluginServerComponent.class);
private ResourceContext resourceContext;
public void start(ResourceContext context) {
resourceContext = context;
}
public void stop() {
}
public AvailabilityType getAvailability() {
return AvailabilityType.UP;
}
public BundleDeployResult deployBundle(BundleDeployRequest request) {
BundleDeployResult result = new BundleDeployResult();
// the file template recipe processor does not support reverting deployments
// thus we need to fail-fast if a revert deployment is being requested
if (request.isRevert()) {
result.setErrorMessage("File template bundles cannot be reverted");
return result;
}
try {
BundleResourceDeployment resourceDeployment = request.getResourceDeployment();
BundleDeployment bundleDeployment = resourceDeployment.getBundleDeployment();
BundleVersion bundleVersion = bundleDeployment.getBundleVersion();
BundleManagerProvider bundleManagerProvider = request.getBundleManagerProvider();
// before processing the recipe, wipe the dest dir if we need to perform a clean deployment
if (request.isCleanDeployment()) {
File deployDir = request.getAbsoluteDestinationDirectory();
if (deployDir.exists()) {
bundleManagerProvider.auditDeployment(resourceDeployment, "Cleaning Deployment", deployDir
.getAbsolutePath(), null, null, "The existing deployment found at ["
+ deployDir.getAbsolutePath() + "] will be removed.", null);
FileUtils.purge(deployDir, true);
}
}
// process the recipe
String recipe = bundleVersion.getRecipe();
RecipeParser parser = new RecipeParser();
ProcessingRecipeContext recipeContext = new ProcessingRecipeContext(recipe, request
.getPackageVersionFiles(), this.resourceContext.getSystemInformation(), request
.getBundleFilesLocation().getAbsolutePath(), resourceDeployment, bundleManagerProvider);
bundleManagerProvider.auditDeployment(resourceDeployment, "Configurtion Variable Replacement",
bundleDeployment.getName(), null, null, "setting replacement variable values using ["
+ bundleDeployment.getConfiguration().toString(true) + "]", null);
recipeContext.setReplacementVariableValues(bundleDeployment.getConfiguration());
recipeContext.addReplacementVariableValue(DEPLOY_DIR, request.getAbsoluteDestinationDirectory()
.getAbsolutePath());
recipeContext.addReplacementVariableValue(DEPLOY_ID, Integer.toString(bundleDeployment.getId()));
recipeContext.addReplacementVariableValue(DEPLOY_NAME, bundleDeployment.getName());
parser.setReplaceReplacementVariables(true);
bundleManagerProvider.auditDeployment(resourceDeployment, "Parse Recipe", bundleDeployment.getName(), null,
null, "Parsing Recipe using context [" + recipeContext + "]", null);
parser.parseRecipe(recipeContext);
} catch (Throwable t) {
log.error("Failed to deploy bundle [" + request + "]", t);
result.setErrorMessage(t);
}
return result;
}
public BundlePurgeResult purgeBundle(BundlePurgeRequest request) {
BundlePurgeResult result = new BundlePurgeResult();
try {
BundleResourceDeployment deploymentToPurge = request.getLiveResourceDeployment();
File deployDir = request.getAbsoluteDestinationDirectory();
String deployDirAbsolutePath = deployDir.getAbsolutePath();
BundleManagerProvider bundleManagerProvider = request.getBundleManagerProvider();
// completely purge the deployment directory.
// TODO: if the receipe copied a file outside of the deployment directory, it will still exist. How do we remove those?
FileUtil.purge(deployDir, true);
if (!deployDir.exists()) {
bundleManagerProvider.auditDeployment(deploymentToPurge, "Purge",
"The destination directory has been purged", Category.AUDIT_MESSAGE, Status.SUCCESS,
"Directory purged: " + deployDirAbsolutePath, null);
} else {
bundleManagerProvider.auditDeployment(deploymentToPurge, "Purge",
"The destination directory failed to be purged", Category.AUDIT_MESSAGE, Status.FAILURE,
"The directory that failed to be purged: " + deployDirAbsolutePath, null);
}
} catch (Throwable t) {
log.error("Failed to purge bundle [" + request + "]", t);
result.setErrorMessage(t);
}
return result;
}
}