Search in sources :

Example 21 with FabricException

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");
    }
}
Also used : ServiceListener(org.osgi.framework.ServiceListener) BootstrapConfiguration(io.fabric8.zookeeper.bootstrap.BootstrapConfiguration) Configuration(org.osgi.service.cm.Configuration) ComponentContext(org.osgi.service.component.ComponentContext) BootstrapConfiguration(io.fabric8.zookeeper.bootstrap.BootstrapConfiguration) FabricException(io.fabric8.api.FabricException) AtomicReference(java.util.concurrent.atomic.AtomicReference) CuratorComplete(io.fabric8.api.CuratorComplete) CountDownLatch(java.util.concurrent.CountDownLatch) TimeoutException(java.util.concurrent.TimeoutException) BundleException(org.osgi.framework.BundleException) InvalidSyntaxException(org.osgi.framework.InvalidSyntaxException) FabricException(io.fabric8.api.FabricException) IOException(java.io.IOException) ServiceReference(org.osgi.framework.ServiceReference) ServiceEvent(org.osgi.framework.ServiceEvent) File(java.io.File) TimeoutException(java.util.concurrent.TimeoutException)

Example 22 with FabricException

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);
    }
}
Also used : ConfigurationEvent(org.osgi.service.cm.ConfigurationEvent) BootstrapConfiguration(io.fabric8.zookeeper.bootstrap.BootstrapConfiguration) FabricException(io.fabric8.api.FabricException) CountDownLatch(java.util.concurrent.CountDownLatch) TimeoutException(java.util.concurrent.TimeoutException) BundleException(org.osgi.framework.BundleException) InvalidSyntaxException(org.osgi.framework.InvalidSyntaxException) FabricException(io.fabric8.api.FabricException) IOException(java.io.IOException) ConfigurationListener(org.osgi.service.cm.ConfigurationListener) CuratorFramework(org.apache.curator.framework.CuratorFramework) RuntimeProperties(io.fabric8.api.RuntimeProperties) BundleContext(org.osgi.framework.BundleContext)

Example 23 with FabricException

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);
    }
}
Also used : Lease(org.apache.curator.framework.recipes.locks.Lease) FabricException(io.fabric8.api.FabricException) FabricException(io.fabric8.api.FabricException)

Example 24 with FabricException

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);
        }
    }
}
Also used : Lease(org.apache.curator.framework.recipes.locks.Lease) FabricException(io.fabric8.api.FabricException) FabricException(io.fabric8.api.FabricException)

Example 25 with FabricException

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;
}
Also used : Container(io.fabric8.api.Container) CreateContainerMetadata(io.fabric8.api.CreateContainerMetadata) FabricException(io.fabric8.api.FabricException) HashSet(java.util.HashSet)

Aggregations

FabricException (io.fabric8.api.FabricException)29 IOException (java.io.IOException)10 Container (io.fabric8.api.Container)7 CreateContainerMetadata (io.fabric8.api.CreateContainerMetadata)6 Lease (org.apache.curator.framework.recipes.locks.Lease)6 HashSet (java.util.HashSet)5 EncryptionOperationNotPossibleException (org.jasypt.exceptions.EncryptionOperationNotPossibleException)5 Session (com.jcraft.jsch.Session)4 FabricService (io.fabric8.api.FabricService)3 Profile (io.fabric8.api.Profile)3 ProfileDependencyException (io.fabric8.api.ProfileDependencyException)3 HashMap (java.util.HashMap)3 Map (java.util.Map)3 SortedMap (java.util.SortedMap)3 TreeMap (java.util.TreeMap)3 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)3 CountDownLatch (java.util.concurrent.CountDownLatch)3 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)2 ContainerProvider (io.fabric8.api.ContainerProvider)2 ProfileBuilder (io.fabric8.api.ProfileBuilder)2