use of io.fabric8.api.FabricService in project fabric8 by jboss-fuse.
the class Utils method findProfileChecksums.
public static Properties findProfileChecksums(FabricService fabricService, Profile profile) {
Properties checksums = null;
String versionId = profile.getVersion();
String profileId = profile.getId();
Container[] containers = fabricService.getAssociatedContainers(versionId, profileId);
if (containers != null) {
for (Container container : containers) {
checksums = container.getProvisionChecksums();
if (checksums != null) {
break;
}
}
}
return checksums;
}
use of io.fabric8.api.FabricService in project fabric8 by jboss-fuse.
the class DeploymentAgent method updateStatus.
private void updateStatus(FabricService fs, String status, Throwable result, boolean force) /*=false*/
{
if (!force && System.currentTimeMillis() < lastStatusUpdate + UPDATE_INTERVAL) {
return;
}
lastStatusUpdate = System.currentTimeMillis();
try {
provisioningStatus = status;
provisioningError = result;
if (fs != null) {
fabricNotAvailableLogged = false;
Container container = fs.getCurrentContainer();
String e;
if (result == null) {
e = null;
} else {
StringWriter sw = new StringWriter();
result.printStackTrace(new PrintWriter(sw));
e = sw.toString();
}
if (provisionList != null) {
Set<String> uris = new TreeSet<>();
for (Resource res : provisionList) {
uris.add(getUri(res));
}
container.setProvisionList(new ArrayList<>(uris));
}
container.setProvisionResult(status);
container.setProvisionException(e);
java.util.Properties provisionChecksums = new java.util.Properties();
for (Map.Entry<Long, Long> entry : state.bundleChecksums.entrySet()) {
Bundle bundle = systemBundleContext.getBundle(entry.getKey());
String location = bundle.getLocation();
provisionChecksums.put(location, entry.getValue().toString());
}
/*
putAllProperties(provisionChecksums, libChecksums);
putAllProperties(provisionChecksums, endorsedChecksums);
putAllProperties(provisionChecksums, extensionChecksums);
*/
container.setProvisionChecksums(provisionChecksums);
} else {
if (!fabricNotAvailableLogged) {
fabricNotAvailableLogged = true;
LOGGER.info("Unable to set provisioning status as FabricService is not available");
}
}
} catch (Throwable e) {
LOGGER.warn("Unable to set provisioning result");
}
}
use of io.fabric8.api.FabricService in project fabric8 by jboss-fuse.
the class DeploymentAgent method handleRestartJvmFlag.
/**
* Adds support for a directive to force a restart upon the first assignment of a specific profile to a container.
* It creates an entry in zk so that a subsequent modification to the same profile, will not trigger a jvm restart.
* The behavior is useful for situation when a profile provision .jars in lib/ folder, that are picked up only at
* jvm boot time.
*
* @param profile
* @param restart
* @return
*/
protected boolean handleRestartJvmFlag(Profile profile, AtomicBoolean restart) {
boolean result = false;
List<String> profilesRequiringRestart = new ArrayList<>();
ServiceReference<CuratorFramework> curatorServiceReference = systemBundleContext.getServiceReference(CuratorFramework.class);
ServiceReference<FabricService> fabricServiceReference = systemBundleContext.getServiceReference(FabricService.class);
if (curatorServiceReference != null && fabricServiceReference != null) {
CuratorFramework curator = systemBundleContext.getService(curatorServiceReference);
FabricService fs = systemBundleContext.getService(fabricServiceReference);
String currentContainerName = fs.getCurrentContainerName();
List<String> activeProfiles = fs.getCurrentContainer().getProfileIds();
// check for jvm restart requests
Map<String, String> agentProperties = profile.getConfiguration("io.fabric8.agent");
Map<String, String> jvmRestartEntries = new HashMap<>();
for (String key : agentProperties.keySet()) {
if (key.startsWith("io.fabric8.agent.forceOneTimeJVMRestart")) {
jvmRestartEntries.put(key, agentProperties.get(key));
LOGGER.info("Found a profile carrying a one-time JVM restart request: {}", key);
}
}
// clean old entries
String basePath = ZkPath.CONTAINER_PROVISION_RESTART.getPath(currentContainerName);
try {
if (ZooKeeperUtils.exists(curator, basePath) != null) {
List<String> zkPaths = ZooKeeperUtils.getAllChildren(curator, ZkPath.CONTAINER_PROVISION_RESTART.getPath(currentContainerName));
for (String zkPath : zkPaths) {
String[] split = zkPath.split("/");
String prof = split[split.length - 1];
if (!activeProfiles.contains(prof)) {
LOGGER.info("Deleting old JVM restart request status: {}", zkPath);
ZooKeeperUtils.delete(curator, zkPath);
}
}
}
} catch (Exception e) {
LOGGER.error("Unable to check ZK connection", e);
}
for (String key : jvmRestartEntries.keySet()) {
String[] split = key.split("\\.");
String profileForcingRestart = split[split.length - 1];
try {
String zkPath = ZkPath.CONTAINER_PROVISION_RESTART_PROFILES.getPath(currentContainerName, profileForcingRestart);
Stat exists = exists(curator, zkPath);
if (exists == null) {
ZooKeeperUtils.create(curator, zkPath);
profilesRequiringRestart.add(profileForcingRestart);
result = true;
}
} catch (Exception e) {
LOGGER.error("Unable to check ZK connection", e);
}
}
}
if (result) {
System.setProperty("karaf.restart.jvm", "true");
restart.set(true);
LOGGER.warn("Profiles {} scheduled a JVM restart request. Automated JVM restart support is not universally available. If your jvm doesn't support it you are required to manually restart the container that has just been assigned the profile.", profilesRequiringRestart);
try {
bundleContext.getBundle(0).stop();
} catch (BundleException e) {
LOGGER.error("Error when forcing a JVM restart", e);
}
}
return result;
}
use of io.fabric8.api.FabricService in project fabric8 by jboss-fuse.
the class DeploymentAgent method doUpdate.
public boolean doUpdate(Dictionary<String, ?> props) throws Exception {
if (props == null || Boolean.parseBoolean((String) props.get("disabled"))) {
return false;
}
final Hashtable<String, String> properties = new Hashtable<>();
for (Enumeration e = props.keys(); e.hasMoreElements(); ) {
Object key = e.nextElement();
Object val = props.get(key);
if (!"service.pid".equals(key) && !FeatureConfigInstaller.FABRIC_ZOOKEEPER_PID.equals(key)) {
properties.put(key.toString(), val.toString());
}
}
updateStatus("analyzing", null);
// Building configuration
curatorCompleteService.waitForService(TimeUnit.SECONDS.toMillis(30));
String httpUrl;
List<URI> mavenRepoURIs;
// force reading of updated informations from ZK
if (!fabricService.isEmpty()) {
updateMavenRepositoryConfiguration(fabricService.getService());
}
try {
fabricServiceOperations.lock();
// no one will change the members now
httpUrl = this.httpUrl;
mavenRepoURIs = this.mavenRepoURIs;
} finally {
fabricServiceOperations.unlock();
}
addMavenProxies(properties, httpUrl, mavenRepoURIs);
final MavenResolver resolver = MavenResolvers.createMavenResolver(properties, "org.ops4j.pax.url.mvn");
final DownloadManager manager = DownloadManagers.createDownloadManager(resolver, getDownloadExecutor());
manager.addListener(new DownloadCallback() {
@Override
public void downloaded(StreamProvider provider) throws Exception {
int pending = manager.pending();
updateStatus(pending > 0 ? "downloading (" + pending + " pending)" : "downloading", null);
}
});
// Update framework, libs, system and config props
final Object lock = new Object();
final AtomicBoolean restart = new AtomicBoolean();
final Set<String> libsToRemove = new HashSet<>(managedLibs.keySet());
final Set<String> endorsedLibsToRemove = new HashSet<>(managedEndorsedLibs.keySet());
final Set<String> extensionLibsToRemove = new HashSet<>(managedExtensionLibs.keySet());
final Set<String> sysPropsToRemove = new HashSet<>(managedSysProps.keySet());
final Set<String> configPropsToRemove = new HashSet<>(managedConfigProps.keySet());
final Set<String> etcsToRemove = new HashSet<>(managedEtcs.keySet());
final Properties configProps = new Properties(new File(KARAF_BASE + File.separator + "etc" + File.separator + "config.properties"));
final Properties systemProps = new Properties(new File(KARAF_BASE + File.separator + "etc" + File.separator + "system.properties"));
Downloader downloader = manager.createDownloader();
for (String key : properties.keySet()) {
if (key.equals("framework")) {
String url = properties.get(key);
if (!url.startsWith("mvn:")) {
throw new IllegalArgumentException("Framework url must use the mvn: protocol");
}
downloader.download(url, new DownloadCallback() {
@Override
public void downloaded(StreamProvider provider) throws Exception {
File file = provider.getFile();
String path = file.getPath();
if (path.startsWith(KARAF_HOME)) {
path = path.substring(KARAF_HOME.length() + 1);
}
synchronized (lock) {
if (!path.equals(configProps.get("karaf.framework.felix"))) {
configProps.put("karaf.framework", "felix");
configProps.put("karaf.framework.felix", path);
restart.set(true);
}
}
}
});
} else if (key.startsWith("config.")) {
String k = key.substring("config.".length());
String v = properties.get(key);
synchronized (lock) {
managedConfigProps.put(k, v);
configPropsToRemove.remove(k);
if (!v.equals(configProps.get(k))) {
configProps.put(k, v);
restart.set(true);
}
}
} else if (key.startsWith("system.")) {
String k = key.substring("system.".length());
synchronized (lock) {
String v = properties.get(key);
managedSysProps.put(k, v);
sysPropsToRemove.remove(k);
if (!v.equals(systemProps.get(k))) {
systemProps.put(k, v);
restart.set(true);
}
}
} else if (key.startsWith("lib.")) {
String value = properties.get(key);
downloader.download(value, new DownloadCallback() {
@Override
public void downloaded(StreamProvider provider) throws Exception {
File libFile = provider.getFile();
String libName = libFile.getName();
Long checksum = ChecksumUtils.checksum(libFile);
boolean update;
synchronized (lock) {
managedLibs.put(libName, "true");
libsToRemove.remove(libName);
update = !Long.toString(checksum).equals(libChecksums.getProperty(libName));
}
if (update) {
Files.copy(libFile, new File(LIB_PATH, libName));
restart.set(true);
}
}
});
} else if (key.startsWith("endorsed.")) {
String value = properties.get(key);
downloader.download(value, new DownloadCallback() {
@Override
public void downloaded(StreamProvider provider) throws Exception {
File libFile = provider.getFile();
String libName = libFile.getName();
Long checksum = ChecksumUtils.checksum(new FileInputStream(libFile));
boolean update;
synchronized (lock) {
managedEndorsedLibs.put(libName, "true");
endorsedLibsToRemove.remove(libName);
update = !Long.toString(checksum).equals(endorsedChecksums.getProperty(libName));
}
if (update) {
Files.copy(libFile, new File(LIB_ENDORSED_PATH, libName));
restart.set(true);
}
}
});
} else if (key.startsWith("extension.")) {
String value = properties.get(key);
downloader.download(value, new DownloadCallback() {
@Override
public void downloaded(StreamProvider provider) throws Exception {
File libFile = provider.getFile();
String libName = libFile.getName();
Long checksum = ChecksumUtils.checksum(libFile);
boolean update;
synchronized (lock) {
managedExtensionLibs.put(libName, "true");
extensionLibsToRemove.remove(libName);
update = !Long.toString(checksum).equals(extensionChecksums.getProperty(libName));
}
if (update) {
Files.copy(libFile, new File(LIB_EXT_PATH, libName));
restart.set(true);
}
}
});
} else if (key.startsWith("etc.")) {
String value = properties.get(key);
downloader.download(value, new DownloadCallback() {
@Override
public void downloaded(StreamProvider provider) throws Exception {
File etcFile = provider.getFile();
String etcName = etcFile.getName();
Long checksum = ChecksumUtils.checksum(new FileInputStream(etcFile));
boolean update;
synchronized (lock) {
managedEtcs.put(etcName, "true");
etcsToRemove.remove(etcName);
update = !Long.toString(checksum).equals(etcChecksums.getProperty(etcName));
}
if (update) {
Files.copy(etcFile, new File(KARAF_ETC, etcName));
}
}
});
}
}
downloader.await();
// Remove unused libs, system & config properties
for (String sysProp : sysPropsToRemove) {
systemProps.remove(sysProp);
managedSysProps.remove(sysProp);
System.clearProperty(sysProp);
restart.set(true);
}
for (String configProp : configPropsToRemove) {
configProps.remove(configProp);
managedConfigProps.remove(configProp);
restart.set(true);
}
for (String lib : libsToRemove) {
File libFile = new File(LIB_PATH, lib);
libFile.delete();
libChecksums.remove(lib);
managedLibs.remove(lib);
restart.set(true);
}
for (String lib : endorsedLibsToRemove) {
File libFile = new File(LIB_ENDORSED_PATH, lib);
libFile.delete();
endorsedChecksums.remove(lib);
managedEndorsedLibs.remove(lib);
restart.set(true);
}
for (String lib : extensionLibsToRemove) {
File libFile = new File(LIB_EXT_PATH, lib);
libFile.delete();
extensionChecksums.remove(lib);
managedExtensionLibs.remove(lib);
restart.set(true);
}
for (String etc : etcsToRemove) {
File etcFile = new File(KARAF_ETC, etc);
etcFile.delete();
etcChecksums.remove(etc);
managedEtcs.remove(etc);
}
libChecksums.save();
endorsedChecksums.save();
extensionChecksums.save();
etcChecksums.save();
managedLibs.save();
managedEndorsedLibs.save();
managedExtensionLibs.save();
managedConfigProps.save();
managedSysProps.save();
managedEtcs.save();
if (restart.get()) {
updateStatus("restarting", null);
configProps.save();
systemProps.save();
System.setProperty("karaf.restart", "true");
bundleContext.getBundle(0).stop();
return false;
}
FeatureConfigInstaller configInstaller = null;
ServiceReference configAdminServiceReference = bundleContext.getServiceReference(ConfigurationAdmin.class.getName());
if (configAdminServiceReference != null) {
ConfigurationAdmin configAdmin = (ConfigurationAdmin) bundleContext.getService(configAdminServiceReference);
configInstaller = new FeatureConfigInstaller(bundleContext, configAdmin, manager);
}
int bundleStartTimeout = Constants.BUNDLE_START_TIMEOUT;
String overriddenTimeout = properties.get(Constants.BUNDLE_START_TIMEOUT_PID_KEY);
try {
if (overriddenTimeout != null)
bundleStartTimeout = Integer.parseInt(overriddenTimeout);
} catch (Exception e) {
LOGGER.warn("Failed to set {} value: [{}], applying default value: {}", Constants.BUNDLE_START_TIMEOUT_PID_KEY, overriddenTimeout, Constants.BUNDLE_START_TIMEOUT);
}
Agent agent = new Agent(bundleContext.getBundle(), systemBundleContext, manager, configInstaller, null, DEFAULT_FEATURE_RESOLUTION_RANGE, DEFAULT_BUNDLE_UPDATE_RANGE, DEFAULT_UPDATE_SNAPSHOTS, bundleContext.getDataFile(STATE_FILE), bundleStartTimeout) {
@Override
public void updateStatus(String status) {
DeploymentAgent.this.updateStatus(status, null, false);
}
@Override
public void updateStatus(String status, boolean force) {
DeploymentAgent.this.updateStatus(status, null, force);
}
@Override
protected void saveState(State newState) throws IOException {
super.saveState(newState);
DeploymentAgent.this.state.replace(newState);
}
@Override
protected void provisionList(Set<Resource> resources) {
DeploymentAgent.this.provisionList = resources;
}
@Override
protected boolean done(boolean agentStarted, List<String> urls) {
if (agentStarted) {
// let's do patch-management "last touch" only if new agent wasn't started.
return true;
}
// agent finished provisioning, we can call back to low level patch management
ServiceReference<PatchManagement> srPm = systemBundleContext.getServiceReference(PatchManagement.class);
ServiceReference<FabricService> srFs = systemBundleContext.getServiceReference(FabricService.class);
if (srPm != null && srFs != null) {
PatchManagement pm = systemBundleContext.getService(srPm);
FabricService fs = systemBundleContext.getService(srFs);
if (pm != null && fs != null) {
LOGGER.info("Validating baseline information");
this.updateStatus("validating baseline information", true);
Profile profile = fs.getCurrentContainer().getOverlayProfile();
Map<String, String> versions = profile.getConfiguration("io.fabric8.version");
File localRepository = resolver.getLocalRepository();
if (pm.alignTo(versions, urls, localRepository, new PatchSynchronization())) {
this.updateStatus("requires full restart", true);
// let's reuse the same flag
restart.set(true);
return false;
}
if (handleRestartJvmFlag(profile, restart)) {
return false;
}
}
}
return true;
}
};
agent.setDeploymentAgentId(deploymentAgentId);
agent.provision(getPrefixedProperties(properties, "repository."), getPrefixedProperties(properties, "feature."), getPrefixedProperties(properties, "bundle."), getPrefixedProperties(properties, "req."), getPrefixedProperties(properties, "override."), getPrefixedProperties(properties, "optional."), getMetadata(properties, "metadata#"));
if (restart.get()) {
// prevent updating status to "success"
return false;
}
return true;
}
use of io.fabric8.api.FabricService in project fabric8 by jboss-fuse.
the class ProfileDownloader method downloadProfile.
/**
* Downloads the bundles, features and FABs for this profile.
*/
public void downloadProfile(Profile profile) throws Exception {
if (listener != null) {
listener.beforeDownloadProfile(profile);
}
ProfileService profileService = fabricService.adapt(ProfileService.class);
if (!profile.isOverlay()) {
profile = profileService.getOverlayProfile(profile);
}
DownloadManager downloadManager = DownloadManagers.createDownloadManager(fabricService, executorService);
Set<String> bundles = new LinkedHashSet<String>();
Set<Feature> features = new LinkedHashSet<Feature>();
addMavenBundles(fabricService, profile, bundles, profile.getBundles());
addMavenBundles(fabricService, profile, bundles, profile.getFabs());
AgentUtils.addFeatures(features, fabricService, downloadManager, profile);
Map<String, File> files = AgentUtils.downloadBundles(downloadManager, features, bundles, Collections.<String>emptySet(), !isDownloadFilesFromProfile());
Set<Map.Entry<String, File>> entries = files.entrySet();
for (Map.Entry<String, File> entry : entries) {
String name = entry.getKey();
File file = entry.getValue();
if (processedFiles.add(file)) {
String fileName = file.getName();
String mvnCoords = getMavenCoords(name);
File destFile;
if (mvnCoords != null) {
Parser parser = new Parser(mvnCoords);
destFile = new File(target, parser.getArtifactPath());
} else {
destFile = new File(target, fileName);
}
if (force || !destFile.exists()) {
LOG.info("Copying file: " + file + " to: " + destFile.getCanonicalPath());
Files.copy(file, destFile);
if (listener != null) {
listener.onCopyDone(profile, destFile);
}
}
}
}
if (listener != null) {
listener.afterDownloadProfile(profile);
}
}
Aggregations