use of io.fabric8.api.FabricException in project fabric8 by jboss-fuse.
the class ZooKeeperClusterBootstrapImpl method cleanInternal.
private BootstrapConfiguration cleanInternal(final BundleContext syscontext, final BootstrapConfiguration bootConfig, RuntimeProperties runtimeProps) throws TimeoutException {
LOGGER.debug("Begin clean fabric");
try {
Configuration zkClientCfg = null;
Configuration zkServerCfg = null;
Configuration[] configsSet = configAdmin.get().listConfigurations("(|(service.factoryPid=io.fabric8.zookeeper.server)(service.pid=io.fabric8.zookeeper))");
if (configsSet != null) {
for (Configuration cfg : configsSet) {
// let's explicitly delete client config first
if ("io.fabric8.zookeeper".equals(cfg.getPid())) {
zkClientCfg = cfg;
}
if ("io.fabric8.zookeeper.server".equals(cfg.getFactoryPid())) {
zkServerCfg = cfg;
}
}
}
File karafData = new File(data);
// Setup the listener for unregistration of {@link BootstrapConfiguration}
final CountDownLatch unregisterLatch = new CountDownLatch(1);
ServiceListener listener = new ServiceListener() {
@Override
public void serviceChanged(ServiceEvent event) {
if (event.getType() == ServiceEvent.UNREGISTERING) {
LOGGER.debug("Unregistering BootstrapConfiguration");
bootConfig.getComponentContext().getBundleContext().removeServiceListener(this);
unregisterLatch.countDown();
}
}
};
String filter = "(objectClass=" + BootstrapConfiguration.class.getName() + ")";
// FABRIC-1052: register listener using the same bundle context that is used for listeners related to SCR
bootConfig.getComponentContext().getBundleContext().addServiceListener(listener, filter);
CountDownLatch unregisterLatch2 = null;
if (syscontext.getServiceReference(CuratorComplete.class) != null) {
unregisterLatch2 = new CountDownLatch(1);
final CountDownLatch finalUnregisterLatch = unregisterLatch2;
listener = new ServiceListener() {
@Override
public void serviceChanged(ServiceEvent event) {
if (event.getType() == ServiceEvent.UNREGISTERING) {
LOGGER.debug("Unregistering CuratorComplete");
bootConfig.getComponentContext().getBundleContext().removeServiceListener(this);
finalUnregisterLatch.countDown();
}
}
};
bootConfig.getComponentContext().getBundleContext().addServiceListener(listener, "(objectClass=" + CuratorComplete.class.getName() + ")");
}
// Disable the BootstrapConfiguration component
// ENTESB-4827: disabling BootstrapConfiguration leads to deactivation of FabricService and ProfileUrlHandler
// and we have race condition if we're --cleaning after recently created fabric. previous fabric
// started FabricConfigAdminBridge which scheduled CM updates for tens of PIDs - among others,
// org.ops4j.pax.web, which leads to an attempt to reconfigure Jetty with "profile:jetty.xml"
// and if we disable ProfileUrlHandler we may loose Jetty instance
LOGGER.debug("Disable BootstrapConfiguration");
ComponentContext componentContext = bootConfig.getComponentContext();
componentContext.disableComponent(BootstrapConfiguration.COMPONENT_NAME);
if (!unregisterLatch.await(30, TimeUnit.SECONDS))
throw new TimeoutException("Timeout for unregistering BootstrapConfiguration service");
if (unregisterLatch2 != null && !unregisterLatch2.await(30, TimeUnit.SECONDS))
throw new TimeoutException("Timeout for unregistering CuratorComplete service");
// Do the cleanup
runtimeProps.clearRuntimeAttributes();
cleanConfigurations(syscontext, zkClientCfg, zkServerCfg);
cleanZookeeperDirectory(karafData);
cleanGitDirectory(karafData);
// Setup the registration listener for the new {@link BootstrapConfiguration}
final CountDownLatch registerLatch = new CountDownLatch(1);
final AtomicReference<ServiceReference<?>> sref = new AtomicReference<ServiceReference<?>>();
listener = new ServiceListener() {
@Override
public void serviceChanged(ServiceEvent event) {
if (event.getType() == ServiceEvent.REGISTERED) {
LOGGER.debug("Registered BootstrapConfiguration");
syscontext.removeServiceListener(this);
sref.set(event.getServiceReference());
registerLatch.countDown();
}
}
};
syscontext.addServiceListener(listener, "(objectClass=" + BootstrapConfiguration.class.getName() + ")");
// Enable the {@link BootstrapConfiguration} component and await the registration of the respective service
LOGGER.debug("Enable BootstrapConfiguration");
componentContext.enableComponent(BootstrapConfiguration.COMPONENT_NAME);
if (!registerLatch.await(30, TimeUnit.SECONDS))
throw new TimeoutException("Timeout for registering BootstrapConfiguration service");
return (BootstrapConfiguration) syscontext.getService(sref.get());
} catch (RuntimeException rte) {
throw rte;
} catch (TimeoutException toe) {
throw toe;
} catch (Exception ex) {
throw new FabricException("Unable to delete zookeeper configuration", ex);
} finally {
LOGGER.debug("End clean fabric");
}
}
use of io.fabric8.api.FabricException in project fabric8 by jboss-fuse.
the class ZooKeeperClusterBootstrapImpl method create.
@Override
public void create(CreateEnsembleOptions options) {
assertValid();
try {
// Wait for bootstrap to be complete
ServiceLocator.awaitService(BootstrapComplete.class);
LOGGER.info("Create fabric with: {}", options);
stopBundles();
BundleContext syscontext = bundleContext.getBundle(0).getBundleContext();
long bootstrapTimeout = options.getBootstrapTimeout();
RuntimeProperties runtimeProps = runtimeProperties.get();
BootstrapConfiguration bootConfig = bootstrapConfiguration.get();
if (options.isClean()) {
bootConfig = cleanInternal(syscontext, bootConfig, runtimeProps);
}
// before we start fabric, register CM listener that'll mark end of work of FabricConfigAdminBridge
final CountDownLatch fcabLatch = new CountDownLatch(1);
final ServiceRegistration<ConfigurationListener> registration = bundleContext.registerService(ConfigurationListener.class, new ConfigurationListener() {
@Override
public void configurationEvent(ConfigurationEvent event) {
if (event.getType() == ConfigurationEvent.CM_UPDATED && event.getPid() != null && event.getPid().equals(Constants.CONFIGADMIN_BRIDGE_PID)) {
fcabLatch.countDown();
}
}
}, null);
BootstrapCreateHandler createHandler = new BootstrapCreateHandler(syscontext, bootConfig, runtimeProps);
createHandler.bootstrapFabric(name, homeDir, options);
startBundles(options);
long startTime = System.currentTimeMillis();
ServiceLocator.awaitService(FabricComplete.class, bootstrapTimeout, TimeUnit.MILLISECONDS);
// FabricComplete is registered somewhere in the middle of registering CuratorFramework (SCR activates
// it when CuratorFramework is registered), but CuratorFramework leads to activation of >100 SCR
// components, so let's wait for new CuratorComplete service - it is registered after registration
// of CuratorFramework finishes
ServiceLocator.awaitService(CuratorComplete.class, bootstrapTimeout, TimeUnit.MILLISECONDS);
CuratorFramework curatorFramework = ServiceLocator.getService(CuratorFramework.class);
Map<String, String> dataStoreProperties = options.getDataStoreProperties();
if (ZooKeeperUtils.exists(curatorFramework, ZkPath.CONFIG_GIT_EXTERNAL.getPath()) == null)
ZooKeeperUtils.create(curatorFramework, ZkPath.CONFIG_GIT_EXTERNAL.getPath());
if (dataStoreProperties != null) {
String remoteUrl = dataStoreProperties.get(Constants.GIT_REMOTE_URL);
if (remoteUrl != null) {
ZooKeeperUtils.create(curatorFramework, ZkPath.CONFIG_GIT_EXTERNAL_URL.getPath());
ZooKeeperUtils.add(curatorFramework, ZkPath.CONFIG_GIT_EXTERNAL_URL.getPath(), remoteUrl);
}
String remoteUser = dataStoreProperties.get("gitRemoteUser");
if (remoteUser != null) {
ZooKeeperUtils.create(curatorFramework, ZkPath.CONFIG_GIT_EXTERNAL_USER.getPath());
ZooKeeperUtils.add(curatorFramework, ZkPath.CONFIG_GIT_EXTERNAL_USER.getPath(), remoteUser);
}
String remotePassword = dataStoreProperties.get("gitRemotePassword");
if (remotePassword != null) {
ZooKeeperUtils.create(curatorFramework, ZkPath.CONFIG_GIT_EXTERNAL_PASSWORD.getPath());
ZooKeeperUtils.add(curatorFramework, ZkPath.CONFIG_GIT_EXTERNAL_PASSWORD.getPath(), remotePassword);
}
}
// HttpService is registered differently. not as SCR component activation, but after
// FabricConfigAdminBridge updates (or doesn't touch) org.ops4j.pax.web CM configuration
// however in fabric, this PID contains URL to jetty configuration in the form "profile:jetty.xml"
// so we have to have FabricService and ProfileUrlHandler active
// some ARQ (single container instance) tests failed because tests ended without http service running
// of course we have to think if all fabric instances need http service
ServiceLocator.awaitService("org.osgi.service.http.HttpService", bootstrapTimeout, TimeUnit.MILLISECONDS);
// and last wait - too much synchronization never hurts
fcabLatch.await(bootstrapTimeout, TimeUnit.MILLISECONDS);
registration.unregister();
long timeDiff = System.currentTimeMillis() - startTime;
createHandler.waitForContainerAlive(name, syscontext, bootstrapTimeout);
if (options.isWaitForProvision() && options.isAgentEnabled()) {
long currentTime = System.currentTimeMillis();
createHandler.waitForSuccessfulDeploymentOf(name, syscontext, bootstrapTimeout - (currentTime - startTime));
}
} catch (RuntimeException rte) {
throw rte;
} catch (Exception ex) {
throw new FabricException("Unable to create zookeeper server configuration", ex);
}
}
use of io.fabric8.api.FabricException in project fabric8 by jboss-fuse.
the class ZookeeperPortService method unregisterPort.
@Override
public void unregisterPort(Container container) {
assertValid();
String containerPortsPath = ZkPath.PORTS_CONTAINER.getPath(container.getId());
String reservedPortsPath = ZkPath.PORTS_CONTAINER_RESERVED_PORTS.getPath(container.getId());
String ip = container.getIp();
String ipPortsPath = ZkPath.PORTS_IP.getPath(ip);
Lease lease = null;
try {
lease = interProcessLock.acquire(60, TimeUnit.SECONDS);
if (lease != null) {
if (exists(curator.get(), containerPortsPath) != null) {
for (String pid : getChildren(curator.get(), containerPortsPath)) {
unregisterPort(container, pid, lease);
if (exists(curator.get(), reservedPortsPath) != null) {
Set<Integer> allPorts = findUsedPortByHost(container, lease);
String reservedPortsPerContainer = getStringData(curator.get(), reservedPortsPath);
String[] split = reservedPortsPerContainer.split(" ");
for (String p : split) {
allPorts.remove(Integer.valueOf(p));
}
StringBuilder sb = buildPortsString(allPorts);
setData(curator.get(), ipPortsPath, sb.toString());
}
}
deleteSafe(curator.get(), reservedPortsPath);
deleteSafe(curator.get(), containerPortsPath);
}
} else {
throw new FabricException("Could not acquire port lock");
}
} catch (InterruptedException ex) {
cleanUpDirtyZKNodes(interProcessLock);
throw FabricException.launderThrowable(ex);
} catch (Exception ex) {
throw FabricException.launderThrowable(ex);
} finally {
releaseLock(lease);
}
}
use of io.fabric8.api.FabricException in project fabric8 by jboss-fuse.
the class ZookeeperPortService method unregisterPort.
private void unregisterPort(Container container, String pid, Lease existingLease) {
assertValid();
String containerPortsPidPath = ZkPath.PORTS_CONTAINER_PID.getPath(container.getId(), pid);
Lease lease = null;
try {
if (existingLease != null) {
lease = existingLease;
} else {
lease = interProcessLock.acquire(60, TimeUnit.SECONDS);
}
if (lease != null) {
if (exists(curator.get(), containerPortsPidPath) != null) {
for (String key : getChildren(curator.get(), containerPortsPidPath)) {
unregisterPort(container, pid, key, lease);
}
deleteSafe(curator.get(), containerPortsPidPath);
}
} else {
throw new FabricException("Could not acquire port lock for pid " + pid);
}
} catch (InterruptedException ex) {
cleanUpDirtyZKNodes(interProcessLock);
throw FabricException.launderThrowable(ex);
} catch (Exception ex) {
throw FabricException.launderThrowable(ex);
} finally {
if (existingLease == null) {
releaseLock(lease);
}
}
}
use of io.fabric8.api.FabricException in project fabric8 by jboss-fuse.
the class CreateContainerTask method call.
@Override
public Set<Container> call() throws Exception {
Set<Container> containers = new HashSet<Container>();
CreateContainerMetadata[] allMetadata = fabricService.createContainers(optionsBuilder.build());
if (allMetadata != null && allMetadata.length > 0) {
for (CreateContainerMetadata metadata : allMetadata) {
Container container = metadata.getContainer();
containers.add(container);
if (!metadata.isSuccess()) {
throw new FabricException("Failed to create container.", metadata.getFailure());
}
}
}
return containers;
}
Aggregations