in software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java [168:287]
public void customize() {
newScript(CUSTOMIZING)
.failOnNonZeroResultCode()
.body.append(
// workaround for AMP distribution placing everything in the root of this archive, but
// brooklyn distribution placing everything in a subdirectory: check to see if subdirectory
// with expected name exists; symlink to same directory if it doesn't
// FIXME remove when all downstream usages don't use this
format("[ -d %1$s ] || ln -s . %1$s", getExpandedInstallDir(), getExpandedInstallDir()),
// previously we only copied bin,conf and set BROOKLYN_HOME to the install dir;
// but that does not play nicely if installing dists other than brooklyn
// (such as what is built by our artifact)
format("cp -R %s/* .", getExpandedInstallDir()),
"mkdir -p ./lib/dropins/")
.execute();
SshMachineLocation machine = getMachine();
BrooklynNode entity = getEntity();
String brooklynGlobalPropertiesRemotePath = entity.getConfig(BrooklynNode.BROOKLYN_GLOBAL_PROPERTIES_REMOTE_PATH);
String brooklynGlobalPropertiesContents = entity.getConfig(BrooklynNode.BROOKLYN_GLOBAL_PROPERTIES_CONTENTS);
String brooklynGlobalPropertiesUri = entity.getConfig(BrooklynNode.BROOKLYN_GLOBAL_PROPERTIES_URI);
String brooklynLocalPropertiesRemotePath = processTemplateContents(entity.getConfig(BrooklynNode.BROOKLYN_LOCAL_PROPERTIES_REMOTE_PATH));
String brooklynLocalPropertiesContents = entity.getConfig(BrooklynNode.BROOKLYN_LOCAL_PROPERTIES_CONTENTS);
String brooklynLocalPropertiesUri = entity.getConfig(BrooklynNode.BROOKLYN_LOCAL_PROPERTIES_URI);
String brooklynCatalogInitialBomRemotePath = processTemplateContents(entity.getConfig(BrooklynNode.BROOKLYN_CATALOG_INITIAL_BOM_REMOTE_PATH));
String brooklynCatalogInitialBomUri = entity.getConfig(BrooklynNode.BROOKLYN_CATALOG_INITIAL_BOM_URI);
String brooklynCatalogInitialBomContents = entity.getConfig(BrooklynNode.BROOKLYN_CATALOG_INITIAL_BOM_CONTENTS);
// Override the ~/.brooklyn/brooklyn.properties if required
if (brooklynGlobalPropertiesContents != null || brooklynGlobalPropertiesUri != null) {
ExistingFileBehaviour onExisting = entity.getConfig(BrooklynNode.ON_EXISTING_PROPERTIES_FILE);
Integer checkExists = DynamicTasks.queue(SshEffectorTasks.ssh("ls \""+brooklynGlobalPropertiesRemotePath+"\"").allowingNonZeroExitCode()).get();
boolean doUpload = true;
if (checkExists==0) {
switch (onExisting) {
case USE_EXISTING: doUpload = false; break;
case OVERWRITE: break;
case DO_NOT_USE:
throw new IllegalStateException("Properties file "+brooklynGlobalPropertiesContents+" already exists and "+
"even though it is not being used, content for it was supplied");
case FAIL:
throw new IllegalStateException("Properties file "+brooklynGlobalPropertiesContents+" already exists and "+
BrooklynNode.ON_EXISTING_PROPERTIES_FILE+" response is to fail");
default:
throw new IllegalStateException("Properties file "+brooklynGlobalPropertiesContents+" already exists and "+
BrooklynNode.ON_EXISTING_PROPERTIES_FILE+" response "+onExisting+" is unknown");
}
}
if (onExisting==ExistingFileBehaviour.DO_NOT_USE) {
log.warn("Global properties supplied when told not to use them; no global properties exists, so it will be installed, but it will not be used.");
}
if (doUpload)
uploadFileContents(brooklynGlobalPropertiesContents, brooklynGlobalPropertiesUri, brooklynGlobalPropertiesRemotePath);
}
// Upload a local-brooklyn.properties if required
if (brooklynLocalPropertiesContents != null || brooklynLocalPropertiesUri != null) {
uploadFileContents(brooklynLocalPropertiesContents, brooklynLocalPropertiesUri, brooklynLocalPropertiesRemotePath);
}
// Upload a local-catalog.bom if required
if (brooklynCatalogInitialBomContents != null || brooklynCatalogInitialBomUri != null) {
uploadFileContents(brooklynCatalogInitialBomContents, brooklynCatalogInitialBomUri, brooklynCatalogInitialBomRemotePath);
}
// Copy additional resources to the server
for (Map.Entry<String,String> entry : getEntity().getAttribute(BrooklynNode.COPY_TO_RUNDIR).entrySet()) {
Map<String, String> substitutions = ImmutableMap.of("RUN", getRunDir());
String localResource = entry.getKey();
String remotePath = entry.getValue();
String resolvedRemotePath = remotePath;
for (Map.Entry<String,String> substitution : substitutions.entrySet()) {
String key = substitution.getKey();
String val = substitution.getValue();
resolvedRemotePath = resolvedRemotePath.replace("${"+key+"}", val).replace("$"+key, val);
}
machine.copyTo(MutableMap.of("permissions", "0600"), resource.getResourceFromUrl(localResource), resolvedRemotePath);
}
for (Object entry : getEntity().getClasspath()) {
String filename = null;
String url = null;
if (entry instanceof String) {
url = (String) entry;
} else {
if (entry instanceof Map) {
url = (String) ((Map) entry).get("url");
filename = (String) ((Map) entry).get("filename");
}
}
checkNotNull(url, "url");
// If a local folder, then create archive from contents first
List<File> filesToDelete = MutableList.of();
if (Urls.isDirectory(url)) {
File jarFile = ArchiveBuilder.jar().addDirContentsAt(new File(url), "").create();
filesToDelete.add(jarFile);
url = jarFile.getAbsolutePath();
}
if (filename == null) {
// Determine filename
filename = getFilename(url);
}
ArchiveUtils.deploy(MutableMap.<String, Object>of(), url, machine, getRunDir(), Os.mergePaths(getRunDir(), "lib", "dropins"), filename);
filesToDelete.forEach(f -> f.delete());
}
String cmd = entity.getConfig(BrooklynNode.EXTRA_CUSTOMIZATION_SCRIPT);
if (Strings.isNonBlank(cmd)) {
DynamicTasks.queueIfPossible( SshEffectorTasks.ssh(cmd).summary("Bespoke BrooklynNode customization script")
.requiringExitCodeZero() )
.orSubmitAndBlock(getEntity());
}
}