use of io.fabric8.agent.service.Agent in project fabric8 by jboss-fuse.
the class MQManager method addMasterSlaveStatus.
protected void addMasterSlaveStatus(List<MQBrokerStatusDTO> answer) throws Exception {
Map<String, Map<String, MQBrokerStatusDTO>> groupMap = new HashMap<String, Map<String, MQBrokerStatusDTO>>();
for (MQBrokerStatusDTO status : answer) {
String key = status.getGroup();
Map<String, MQBrokerStatusDTO> list = groupMap.get(key);
if (list == null) {
list = new HashMap<String, MQBrokerStatusDTO>();
groupMap.put(key, list);
}
String statusPath = String.format("%s/%s", status.getContainer(), status.getBrokerName());
list.put(statusPath, status);
}
CuratorFramework curator = getCurator();
// now lets check the cluster status for each group
Set<Map.Entry<String, Map<String, MQBrokerStatusDTO>>> entries = groupMap.entrySet();
for (Map.Entry<String, Map<String, MQBrokerStatusDTO>> entry : entries) {
String group = entry.getKey();
Map<String, MQBrokerStatusDTO> containerMap = entry.getValue();
String groupPath = ZkPath.MQ_CLUSTER.getPath(group);
List<String> children = getChildrenSafe(curator, groupPath);
for (String child : children) {
String childPath = groupPath + "/" + child;
byte[] data = curator.getData().forPath(childPath);
if (data != null && data.length > 0) {
String text = new String(data).trim();
if (!text.isEmpty()) {
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = mapper.readValue(data, HashMap.class);
String id = stringValue(map, "id", "container");
if (id != null) {
String container = stringValue(map, "container", "agent");
String statusPath = String.format("%s/%s", container, id);
MQBrokerStatusDTO containerStatus = containerMap.get(statusPath);
if (containerStatus != null) {
Boolean master = null;
List services = listValue(map, "services");
if (services != null) {
if (!services.isEmpty()) {
List<String> serviceTexts = new ArrayList<String>();
for (Object service : services) {
String serviceText = getSubstitutedData(curator, service.toString());
if (Strings.isNotBlank(serviceText)) {
serviceTexts.add(serviceText);
}
containerStatus.setServices(serviceTexts);
}
master = Boolean.TRUE;
} else {
master = Boolean.FALSE;
}
} else {
master = Boolean.FALSE;
}
containerStatus.setMaster(master);
}
}
}
}
}
}
}
use of io.fabric8.agent.service.Agent in project fabric8 by jboss-fuse.
the class JoinAction method installBundles.
public void installBundles() throws BundleException {
BundleUtils bundleUtils = new BundleUtils(bundleContext);
Bundle bundleFabricCommands = bundleUtils.findBundle("io.fabric8.fabric-commands");
if (bundleFabricCommands == null) {
bundleFabricCommands = bundleUtils.installBundle("mvn:io.fabric8/fabric-commands/" + FabricConstants.FABRIC_VERSION);
}
bundleFabricCommands.start();
Bundle bundleFabricAgent = bundleUtils.findBundle("io.fabric8.fabric-agent");
if (nonManaged && bundleFabricAgent == null) {
// do nothing
} else if (nonManaged && bundleFabricAgent != null) {
bundleFabricAgent.stop();
} else if (bundleFabricAgent == null) {
bundleFabricAgent = bundleUtils.installBundle("mvn:io.fabric8/fabric-agent/" + FabricConstants.FABRIC_VERSION);
bundleFabricAgent.start();
} else {
bundleFabricAgent.start();
}
}
use of io.fabric8.agent.service.Agent in project fabric8 by jboss-fuse.
the class Agent method provision.
public void provision(Map<String, Feature> allFeatures, Set<String> features, Set<String> bundles, Set<String> reqs, Set<String> overrides, Set<String> optionals, Map<String, Map<VersionRange, Map<String, String>>> metadata) throws Exception {
Callable<Map<String, Resource>> res = loadResources(manager, metadata, optionals);
// TODO: requirements should be able to be assigned to a region
Map<String, Set<String>> requirements = new HashMap<>();
for (String feature : features) {
addToMapSet(requirements, ROOT_REGION, "feature:" + feature);
}
for (String bundle : bundles) {
addToMapSet(requirements, ROOT_REGION, "bundle:" + bundle);
}
for (String req : reqs) {
addToMapSet(requirements, ROOT_REGION, "req:" + req);
}
Deployer.DeploymentRequest request = new Deployer.DeploymentRequest();
request.updateSnaphots = updateSnaphots;
request.bundleUpdateRange = bundleUpdateRange;
request.featureResolutionRange = featureResolutionRange;
request.globalRepository = new StaticRepository(res.call().values());
request.overrides = overrides;
request.requirements = requirements;
request.stateChanges = Collections.emptyMap();
request.options = options;
request.metadata = metadata;
request.bundleStartTimeout = bundleStartTimeout;
Deployer.DeploymentState dstate = new Deployer.DeploymentState();
// Service bundle
dstate.serviceBundle = serviceBundle;
// Start level
FrameworkStartLevel fsl = systemBundleContext.getBundle().adapt(FrameworkStartLevel.class);
dstate.initialBundleStartLevel = fsl.getInitialBundleStartLevel();
dstate.currentStartLevel = fsl.getStartLevel();
// Bundles
dstate.bundles = new HashMap<>();
for (Bundle bundle : systemBundleContext.getBundles()) {
dstate.bundles.put(bundle.getBundleId(), bundle);
}
// Features
dstate.features = allFeatures;
// Region -> bundles mapping
// Region -> policy mapping
dstate.bundlesPerRegion = new HashMap<>();
dstate.filtersPerRegion = new HashMap<>();
if (digraph == null) {
for (Long id : dstate.bundles.keySet()) {
addToMapSet(dstate.bundlesPerRegion, ROOT_REGION, id);
}
} else {
RegionDigraph clone = digraph.copy();
for (Region region : clone.getRegions()) {
// Get bundles
dstate.bundlesPerRegion.put(region.getName(), new HashSet<>(region.getBundleIds()));
// Get policies
Map<String, Map<String, Set<String>>> edges = new HashMap<>();
for (RegionDigraph.FilteredRegion fr : clone.getEdges(region)) {
Map<String, Set<String>> policy = new HashMap<>();
Map<String, Collection<String>> current = fr.getFilter().getSharingPolicy();
for (String ns : current.keySet()) {
for (String f : current.get(ns)) {
addToMapSet(policy, ns, f);
}
}
edges.put(fr.getRegion().getName(), policy);
}
dstate.filtersPerRegion.put(region.getName(), edges);
}
}
final State state = new State();
try {
storage.load(state);
} catch (IOException e) {
LOGGER.warn("Error loading agent state", e);
}
if (state.managedBundles.isEmpty()) {
for (Bundle b : systemBundleContext.getBundles()) {
if (b.getBundleId() != 0) {
addToMapSet(state.managedBundles, ROOT_REGION, b.getBundleId());
}
}
}
// corresponding jar url and use that one to compute the checksum of the bundle.
for (Map.Entry<Long, Bundle> entry : dstate.bundles.entrySet()) {
long id = entry.getKey();
Bundle bundle = entry.getValue();
if (id > 0 && isUpdateable(bundle) && !state.bundleChecksums.containsKey(id)) {
try {
URL url = bundle.getResource("META-INF/MANIFEST.MF");
URLConnection con = url.openConnection();
Method method = con.getClass().getDeclaredMethod("getLocalURL");
method.setAccessible(true);
String jarUrl = ((URL) method.invoke(con)).toExternalForm();
if (jarUrl.startsWith("jar:")) {
String jar = jarUrl.substring("jar:".length(), jarUrl.indexOf("!/"));
jar = new URL(jar).getFile();
long checksum = ChecksumUtils.checksumFile(new File(jar));
state.bundleChecksums.put(id, checksum);
}
} catch (Throwable t) {
LOGGER.debug("Error calculating checksum for bundle: %s", bundle, t);
}
}
}
dstate.state = state;
Set<String> prereqs = new HashSet<>();
while (true) {
try {
Deployer.DeployCallback callback = new BaseDeployCallback() {
@Override
public void phase(String message) {
Agent.this.updateStatus(message);
}
@Override
public void saveState(State newState) {
state.replace(newState);
try {
Agent.this.saveState(newState);
} catch (IOException e) {
LOGGER.warn("Error storing agent state", e);
}
}
@Override
public void provisionList(Set<Resource> resources) {
Agent.this.provisionList(resources);
}
@Override
public void restoreConfigAdminIfNeeded() {
if (configInstaller != null) {
configInstaller.restoreConfigAdminIfNeeded();
}
}
@Override
public boolean done(boolean agentStarted, List<String> urls) {
return Agent.this.done(agentStarted, urls);
}
};
// FABRIC-790, FABRIC-981 - wait for ProfileUrlHandler before attempting to load bundles (in subsystem.resolve())
// (which may be the case with bundle.xxx=blueprint:profile:xxx URLs in io.fabric8.agent PID)
// https://developer.jboss.org/message/920681 - 30 seconds is too low sometimes
// there was "url.handler.timeouts" option for agent, but it was removed during migration to karaf 4.x resolver
// LOGGER.debug("Waiting for ProfileUrlHandler");
// awaitService(URLStreamHandlerService.class, "(url.handler.protocol=profile)", 30, TimeUnit.SECONDS);
// LOGGER.debug("Waiting for ProfileUrlHandler finished");
Deployer deployer = new Deployer(manager, callback);
deployer.setDeploymentAgentId(deploymentAgentId);
deployer.deploy(dstate, request);
break;
} catch (Deployer.PartialDeploymentException e) {
if (!prereqs.containsAll(e.getMissing())) {
prereqs.addAll(e.getMissing());
} else {
throw new Exception("Deployment aborted due to loop in missing prerequisites: " + e.getMissing());
}
}
}
}
use of io.fabric8.agent.service.Agent in project fabric8 by jboss-fuse.
the class AgentTest method testAgent.
@Test
public void testAgent() throws Exception {
System.setProperty("karaf.data", new File("target/karaf/data").getAbsolutePath());
System.setProperty("karaf.home", new File("target/karaf").getAbsolutePath());
Dictionary<String, String> resolverProps = new Hashtable<>();
resolverProps.put(ServiceConstants.PROPERTY_REPOSITORIES, "http://repository.jboss.org/nexus/content/repositories/fs-public/@id=jboss.fs.public," + "https://repository.jboss.org/nexus/content/groups/ea/@id=jboss.ea.repo," + "http://repo1.maven.org/maven2@id=maven.central.repo," + "http://download.eng.bos.redhat.com/brewroot/repos/jb-fuse-6.2-build/latest/maven@id=brew");
MavenResolver mavenResolver = MavenResolvers.createMavenResolver(resolverProps, null);
DownloadManager manager = DownloadManagers.createDownloadManager(mavenResolver, Executors.newScheduledThreadPool(8));
BundleContext systemBundleContext = createMock(BundleContext.class);
TestSystemBundle systemBundle = createTestSystemBundle("/common", "system-bundle");
systemBundle.setBundleContext(systemBundleContext);
Bundle serviceBundle = createTestBundle(1l, Bundle.ACTIVE, "/common", "fabric-agent");
expect(systemBundleContext.getBundle()).andReturn(systemBundle).anyTimes();
expect(systemBundleContext.getBundles()).andReturn(new Bundle[] { systemBundle }).anyTimes();
long nextBundleId = 2;
List<Bundle> mockBundles = new ArrayList<>();
String karafVersion = System.getProperty("karaf-version");
String[] bundles = { "mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.api/1.0.1", "mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.cm/1.1.0", "mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.core/1.8.0", "mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.core.compatibility/1.0.0", "mvn:org.apache.aries.proxy/org.apache.aries.proxy/1.1.1", "mvn:org.apache.aries/org.apache.aries.util/1.1.3", "mvn:org.apache.felix/org.apache.felix.configadmin/1.8.12", "mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.command/" + karafVersion, "mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.config/" + karafVersion, "mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.modules/" + karafVersion, "mvn:org.apache.karaf.shell/org.apache.karaf.shell.commands/" + karafVersion, "mvn:org.apache.karaf.shell/org.apache.karaf.shell.console/" + karafVersion, "mvn:org.apache.karaf.shell/org.apache.karaf.shell.dev/" + karafVersion, "mvn:org.apache.karaf.shell/org.apache.karaf.shell.log/" + karafVersion, "mvn:org.apache.karaf.shell/org.apache.karaf.shell.osgi/" + karafVersion, "mvn:org.apache.karaf.shell/org.apache.karaf.shell.packages/" + karafVersion, "mvn:org.apache.karaf.shell/org.apache.karaf.shell.ssh/" + karafVersion, "mvn:org.apache.mina/mina-core/2.0.13", "mvn:org.apache.sshd/sshd-core/0.14.0.redhat-001", "mvn:org.ow2.asm/asm-all/5.0.4", "mvn:org.ops4j.pax.logging/pax-logging-api/1.9.1", "mvn:org.ops4j.pax.logging/pax-logging-service/1.9.1" };
for (String bundleUri : bundles) {
File file = mavenResolver.download(bundleUri);
Hashtable<String, String> headers = doGetMetadata(file);
TestBundle bundle = new TestBundle(++nextBundleId, bundleUri, Bundle.INSTALLED, headers) {
@Override
public void setStartLevel(int startlevel) {
}
@Override
public void start() throws BundleException {
}
};
expect(systemBundleContext.installBundle(EasyMock.eq(bundleUri), EasyMock.<InputStream>anyObject())).andReturn(bundle);
}
ServiceRegistration registration = EasyMock.createMock(ServiceRegistration.class);
expect(systemBundleContext.registerService(EasyMock.eq(ResolverHookFactory.class), EasyMock.<ResolverHookFactory>anyObject(), EasyMock.<Dictionary>isNull())).andReturn(registration);
registration.unregister();
replay(systemBundleContext, registration);
for (Bundle bundle : mockBundles) {
replay(bundle);
}
Agent agent = new Agent(serviceBundle, systemBundleContext, manager) {
@Override
protected <T> void awaitService(Class<T> serviceClass, String filterspec, int timeout, TimeUnit timeUnit) {
}
};
String karafFeaturesUrl = "mvn:org.apache.karaf.assemblies.features/standard/" + System.getProperty("karaf-version") + "/xml/features";
agent.provision(Collections.singleton(karafFeaturesUrl), Collections.singleton("ssh"), Collections.<String>emptySet(), Collections.<String>emptySet(), Collections.<String>emptySet(), new HashSet<>(Arrays.asList("mvn:org.ops4j.pax.logging/pax-logging-api/1.9.1", "mvn:org.ops4j.pax.logging/pax-logging-service/1.9.1", "mvn:org.apache.felix/org.apache.felix.configadmin/1.8.12")), Collections.<String, Map<VersionRange, Map<String, String>>>emptyMap());
}
use of io.fabric8.agent.service.Agent in project fabric8 by jboss-fuse.
the class DeploymentAgentTest method testResolveOptionalImports.
@Test
@SuppressWarnings("unchecked")
public void testResolveOptionalImports() throws Exception {
CommandSupport.executeCommand("fabric:create --force --clean -n --wait-for-provisioning");
CommandSupport.executeCommand("fabric:profile-create --parent default test-profile");
CommandSupport.executeCommand("fabric:profile-edit --pid io.fabric8.agent/resolve.optional.imports=true test-profile");
CommandSupport.executeCommand("fabric:profile-edit --feature spring-struts test-profile");
BundleContext moduleContext = ServiceLocator.getSystemContext();
ServiceProxy<FabricService> fabricProxy = ServiceProxy.createServiceProxy(moduleContext, FabricService.class);
try {
FabricService fabricService = fabricProxy.getService();
Set<Container> containers = ContainerBuilder.create().withName("smoke_cnt_b").withProfiles("test-profile").assertProvisioningResult().build(fabricService);
try {
String command = "fabric:container-connect -u admin -p admin " + containers.iterator().next().getId() + " osgi:list -t 0 -s | grep org.apache.servicemix.bundles.struts";
String result = CommandSupport.executeCommand(command);
assertTrue("Result contains struts, but was: " + result, result.contains("org.apache.servicemix.bundles.struts"));
} finally {
ContainerBuilder.stop(fabricService, containers);
}
} finally {
fabricProxy.close();
}
}
Aggregations