Search in sources :

Example 16 with CreateContainerMetadata

use of io.fabric8.api.CreateContainerMetadata in project fabric8 by jboss-fuse.

the class FabricServiceImpl method createContainers.

@Override
public CreateContainerMetadata[] createContainers(CreateContainerOptions options, CreationStateListener listener) {
    assertValid();
    try {
        final ContainerProvider provider = getProvider(options.getProviderType());
        if (provider == null) {
            throw new FabricException("Unable to find a container provider supporting '" + options.getProviderType() + "'");
        }
        if (!provider.isValidProvider()) {
            throw new FabricException("The provider '" + options.getProviderType() + "' is not valid in current environment");
        }
        String originalName = options.getName();
        if (originalName == null || originalName.length() == 0) {
            throw new FabricException("A name must be specified when creating containers");
        }
        // Only allow containers with valid names to get created.
        FabricValidations.validateContainerName(originalName);
        if (listener == null) {
            listener = new NullCreationStateListener();
        }
        validateProfileDependencies(options);
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        Map optionsMap = mapper.readValue(mapper.writeValueAsString(options), Map.class);
        String versionId = options.getVersion() != null ? options.getVersion() : dataStore.get().getDefaultVersion();
        Set<String> profileIds = options.getProfiles();
        if (profileIds == null || profileIds.isEmpty()) {
            profileIds = new LinkedHashSet<String>();
            profileIds.add("default");
        }
        optionsMap.put("version", versionId);
        optionsMap.put("profiles", profileIds);
        optionsMap.put("number", 0);
        // assign parent resolver if it's a child container, else assign global resolver policy
        if (bootstrapConfig != null) {
            String configuredGlobalResolver = bootstrapConfig.getGlobalResolver();
            if (!Strings.isNullOrEmpty(configuredGlobalResolver)) {
                optionsMap.put("globalResolver", configuredGlobalResolver);
                if (optionsMap.get("resolver") == null) {
                    if (optionsMap.get("parent") == null) {
                        optionsMap.put("resolver", configuredGlobalResolver);
                    }
                }
            }
        }
        final List<CreateContainerMetadata> metadatas = new CopyOnWriteArrayList<CreateContainerMetadata>();
        int orgNumber = options.getNumber();
        int number = Math.max(orgNumber, 1);
        if (orgNumber > 1) {
            originalName = originalName + "1";
        }
        final CountDownLatch latch = new CountDownLatch(number);
        Set<String> ignoreContainerNames = new HashSet<>();
        Container[] containers = getContainers();
        // check that there is no container with the given name
        for (Container container : containers) {
            if (container.getId().equals(options.getName())) {
                throw new IllegalArgumentException("A container with name " + options.getName() + " already exists.");
            }
        }
        for (int i = 1; i <= number; i++) {
            NameValidator validator = Containers.createNameValidator(containers, ignoreContainerNames);
            final String containerName = Containers.createUniqueContainerName(containers, originalName, validator);
            ignoreContainerNames.add(containerName);
            optionsMap.put("name", containerName);
            // Check if datastore configuration has been specified and fallback to current container settings.
            if (!hasValidDataStoreProperties(optionsMap)) {
                optionsMap.put("dataStoreProperties", profileRegistry.get().getDataStoreProperties());
            }
            Class cl = options.getClass().getClassLoader().loadClass(options.getClass().getName() + "$Builder");
            CreateContainerBasicOptions.Builder builder = (CreateContainerBasicOptions.Builder) mapper.readValue(mapper.writeValueAsString(optionsMap), cl);
            // We always want to pass the obfuscated version of the password to the container provider.
            builder = (CreateContainerBasicOptions.Builder) builder.zookeeperPassword(PasswordEncoder.encode(getZookeeperPassword()));
            final CreateContainerOptions containerOptions = builder.build();
            final CreationStateListener containerListener = listener;
            final FabricService fabricService = this;
            new Thread("Creating container " + containerName) {

                public void run() {
                    try {
                        if (dataStore.get().hasContainer(containerName)) {
                            CreateContainerBasicMetadata metadata = new CreateContainerBasicMetadata();
                            metadata.setContainerName(containerName);
                            metadata.setCreateOptions(containerOptions);
                            metadata.setFailure(new IllegalArgumentException("A container with name " + containerName + " already exists."));
                            metadatas.add(metadata);
                            return;
                        }
                        dataStore.get().createContainerConfig(containerOptions);
                        CreateContainerMetadata metadata = provider.create(containerOptions, containerListener);
                        if (metadata.isSuccess()) {
                            Container parent = containerOptions.getParent() != null ? getContainer(containerOptions.getParent()) : null;
                            // TODO: We need to make sure that this entries are somehow added even to ensemble servers.
                            if (!containerOptions.isEnsembleServer()) {
                                dataStore.get().createContainerConfig(metadata);
                            }
                            ContainerImpl container = new ContainerImpl(parent, metadata.getContainerName(), FabricServiceImpl.this);
                            metadata.setContainer(container);
                            LOGGER.info("The container " + metadata.getContainerName() + " has been successfully created");
                        } else {
                            LOGGER.warn("The creation of the container " + metadata.getContainerName() + " has failed", metadata.getFailure());
                            dataStore.get().deleteContainer(fabricService, containerOptions.getName());
                        }
                        metadatas.add(metadata);
                    } catch (Throwable t) {
                        CreateContainerBasicMetadata metadata = new CreateContainerBasicMetadata();
                        metadata.setContainerName(containerName);
                        metadata.setCreateOptions(containerOptions);
                        metadata.setFailure(t);
                        metadatas.add(metadata);
                        dataStore.get().deleteContainer(fabricService, containerOptions.getName());
                    } finally {
                        latch.countDown();
                    }
                }
            }.start();
        }
        if (!latch.await(30, TimeUnit.MINUTES)) {
            throw new FabricException("Timeout waiting for container creation");
        }
        return metadatas.toArray(new CreateContainerMetadata[metadatas.size()]);
    } catch (Exception e) {
        LOGGER.error("Failed to create containers " + e, e);
        throw FabricException.launderThrowable(e);
    }
}
Also used : ContainerProvider(io.fabric8.api.ContainerProvider) NullCreationStateListener(io.fabric8.api.NullCreationStateListener) NameValidator(io.fabric8.api.NameValidator) ProfileBuilder(io.fabric8.api.ProfileBuilder) FabricException(io.fabric8.api.FabricException) CreateContainerOptions(io.fabric8.api.CreateContainerOptions) Container(io.fabric8.api.Container) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) HashSet(java.util.HashSet) LinkedHashSet(java.util.LinkedHashSet) CreateContainerMetadata(io.fabric8.api.CreateContainerMetadata) CountDownLatch(java.util.concurrent.CountDownLatch) CreateContainerBasicMetadata(io.fabric8.api.CreateContainerBasicMetadata) ProfileDependencyException(io.fabric8.api.ProfileDependencyException) EncryptionOperationNotPossibleException(org.jasypt.exceptions.EncryptionOperationNotPossibleException) FabricException(io.fabric8.api.FabricException) IOException(java.io.IOException) NullCreationStateListener(io.fabric8.api.NullCreationStateListener) CreationStateListener(io.fabric8.api.CreationStateListener) FabricService(io.fabric8.api.FabricService) ContainerImpl(io.fabric8.internal.ContainerImpl) CreateContainerBasicOptions(io.fabric8.api.CreateContainerBasicOptions) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) SortedMap(java.util.SortedMap) HashMap(java.util.HashMap) TreeMap(java.util.TreeMap) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList)

Example 17 with CreateContainerMetadata

use of io.fabric8.api.CreateContainerMetadata in project fabric8 by jboss-fuse.

the class ZkDataStoreImpl method getContainerMetadata.

@Override
public CreateContainerMetadata getContainerMetadata(String containerId, final ClassLoader classLoader) {
    assertValid();
    try {
        byte[] encoded = getByteData(configCache, ZkPath.CONTAINER_METADATA.getPath(containerId));
        if (encoded == null) {
            return null;
        }
        byte[] decoded = Base64Encoder.decode(encoded);
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(decoded)) {

            @Override
            protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
                return classLoader.loadClass(desc.getName());
            }
        };
        return (CreateContainerMetadata) ois.readObject();
    } catch (ClassNotFoundException | InvalidClassException | KeeperException.NoNodeException e) {
        return null;
    } catch (Exception e) {
        throw FabricException.launderThrowable(e);
    }
}
Also used : ByteArrayInputStream(java.io.ByteArrayInputStream) CreateContainerMetadata(io.fabric8.api.CreateContainerMetadata) InvalidClassException(java.io.InvalidClassException) ObjectStreamClass(java.io.ObjectStreamClass) FabricException(io.fabric8.api.FabricException) InvalidClassException(java.io.InvalidClassException) KeeperException(org.apache.zookeeper.KeeperException) IOException(java.io.IOException) ObjectInputStream(java.io.ObjectInputStream)

Example 18 with CreateContainerMetadata

use of io.fabric8.api.CreateContainerMetadata 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)

Example 19 with CreateContainerMetadata

use of io.fabric8.api.CreateContainerMetadata in project fabric8 by jboss-fuse.

the class AbstractContainerCreateAction method displayContainers.

protected void displayContainers(CreateContainerMetadata[] metadatas) {
    List<CreateContainerMetadata> success = new ArrayList<CreateContainerMetadata>();
    List<CreateContainerMetadata> failures = new ArrayList<CreateContainerMetadata>();
    for (CreateContainerMetadata metadata : metadatas) {
        (metadata.isSuccess() ? success : failures).add(metadata);
    }
    if (success.size() > 0) {
        System.out.println("The following containers have been created successfully:");
        for (CreateContainerMetadata m : success) {
            System.out.println("\t" + m.toString());
        }
    }
    if (failures.size() > 0) {
        System.out.println("The following containers have failed:");
        for (CreateContainerMetadata m : failures) {
            System.out.println("\t" + m.getContainerName() + ": " + m.getFailure().getMessage());
        }
    }
}
Also used : CreateContainerMetadata(io.fabric8.api.CreateContainerMetadata) ArrayList(java.util.ArrayList)

Example 20 with CreateContainerMetadata

use of io.fabric8.api.CreateContainerMetadata in project fabric8 by jboss-fuse.

the class AbstractChildContainerCreateAction method displayContainers.

protected void displayContainers(CreateContainerMetadata[] metadatas) {
    List<CreateContainerMetadata> success = new ArrayList<CreateContainerMetadata>();
    List<CreateContainerMetadata> failures = new ArrayList<CreateContainerMetadata>();
    for (CreateContainerMetadata metadata : metadatas) {
        (metadata.isSuccess() ? success : failures).add(metadata);
    }
    if (success.size() > 0) {
        System.out.println("The following containers have been created successfully:");
        for (CreateContainerMetadata m : success) {
            System.out.println("\t" + m.toString());
        }
    }
    if (failures.size() > 0) {
        System.out.println("The following containers have failed:");
        for (CreateContainerMetadata m : failures) {
            System.out.println("\t" + m.getContainerName() + ": " + m.getFailure().getMessage());
        }
    }
}
Also used : CreateContainerMetadata(io.fabric8.api.CreateContainerMetadata) ArrayList(java.util.ArrayList)

Aggregations

CreateContainerMetadata (io.fabric8.api.CreateContainerMetadata)22 FabricException (io.fabric8.api.FabricException)10 CreateContainerOptions (io.fabric8.api.CreateContainerOptions)6 Container (io.fabric8.api.Container)5 IOException (java.io.IOException)5 ArrayList (java.util.ArrayList)5 ContainerProvider (io.fabric8.api.ContainerProvider)4 MalformedURLException (java.net.MalformedURLException)4 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)3 Session (com.jcraft.jsch.Session)3 CreateContainerBasicOptions (io.fabric8.api.CreateContainerBasicOptions)3 FabricService (io.fabric8.api.FabricService)3 HashSet (java.util.HashSet)3 Map (java.util.Map)3 JsonProcessingException (com.fasterxml.jackson.core.JsonProcessingException)2 CreateChildContainerOptions (io.fabric8.api.CreateChildContainerOptions)2 Profile (io.fabric8.api.Profile)2 ToRunScriptOptions (io.fabric8.service.jclouds.functions.ToRunScriptOptions)2 InvalidClassException (java.io.InvalidClassException)2 URISyntaxException (java.net.URISyntaxException)2