Search in sources :

Example 6 with CreateContainerMetadata

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

the class FabricManager method containerCreateOptionsType.

@Override
public String containerCreateOptionsType(String id) {
    CreateContainerMetadata<?> metadata = getContainerMetaData(id);
    if (metadata == null) {
        return null;
    }
    CreateContainerOptions options = metadata.getCreateOptions();
    if (options == null) {
        return null;
    } else {
        return options.getClass().getName();
    }
}
Also used : CreateContainerOptions(io.fabric8.api.CreateContainerOptions)

Example 7 with CreateContainerMetadata

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

the class ContainerProviderUtils method buildInstallAndStartScript.

/**
 * Creates a shell script for installing and starting up a container.
 *
 * @param options
 * @return
 * @throws MalformedURLException
 */
public static String buildInstallAndStartScript(String name, CreateRemoteContainerOptions options) throws MalformedURLException, URISyntaxException {
    String distFilename = String.format(DISTNAME_PATTERN, "karaf", FabricConstants.FABRIC_VERSION);
    String systemDistPath = String.format(SYSTEM_DIST, "karaf", FabricConstants.FABRIC_VERSION);
    StringBuilder sb = new StringBuilder();
    sb.append("#!/bin/bash").append("\n");
    if (logger.isTraceEnabled()) {
        sb.append("set -x ").append("\n");
        sb.append("export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' ").append("\n");
    }
    // Export environmental variables
    HashMap<String, String> environmentalVariables = new HashMap<>();
    if (options.getEnvironmentalVariables() != null) {
        environmentalVariables.putAll(options.getEnvironmentalVariables());
    }
    for (Map.Entry<String, String> entry : environmentalVariables.entrySet()) {
        sb.append("export ").append(entry.getKey()).append("=\"").append(entry.getValue()).append("\"").append("\n");
    }
    sb.append(RUN_FUNCTION).append("\n");
    sb.append(SUDO_N_FUNCTION).append("\n");
    sb.append(DOWNLOAD_FUNCTION).append("\n");
    sb.append(MAVEN_DOWNLOAD_FUNCTION).append("\n");
    sb.append(UPDATE_PKGS).append("\n");
    sb.append(INSTALL_CURL).append("\n");
    sb.append(INSTALL_UNZIP).append("\n");
    sb.append(INSTALL_JDK).append("\n");
    sb.append(VALIDATE_REQUIREMENTS).append("\n");
    sb.append(EXIT_IF_NOT_EXISTS).append("\n");
    sb.append(COPY_NODE_METADATA).append("\n");
    sb.append(KARAF_CHECK).append("\n");
    sb.append(REPLACE_IN_FILE).append("\n");
    sb.append(REPLACE_PROPERTY_VALUE).append("\n");
    sb.append(UNCOMMENT_LINE).append("\n");
    sb.append(CONFIGURE_HOSTNAMES).append("\n");
    sb.append(FIND_FREE_PORT).append("\n");
    sb.append(WAIT_FOR_PORT).append("\n");
    sb.append(EXTRACT_ZIP).append("\n");
    sb.append(GENERATE_SSH_KEYS).append("\n");
    sb.append("run mkdir -p ").append(options.getPath()).append("\n");
    sb.append("run cd ").append(options.getPath()).append("\n");
    sb.append("run mkdir -p ").append(name).append("\n");
    sb.append("run cd ").append(name).append("\n");
    // We need admin access to be able to install curl & java.
    if (options.isAdminAccess()) {
        // This is not really needed.
        // Its just here as a silly workaround for some cases which fail to get the first thing installed.
        sb.append("update_pkgs").append("\n");
        sb.append("install_openjdk").append("\n");
        sb.append("install_curl").append("\n");
        sb.append("install_unzip").append("\n");
    }
    sb.append("validate_requirements").append("\n");
    List<String> fallbackRepositories = new ArrayList<String>();
    List<String> optionsRepos = options.getFallbackRepositories();
    if (optionsRepos != null) {
        fallbackRepositories.addAll(optionsRepos);
    }
    extractZipIntoDirectory(sb, options.getProxyUri(), "io.fabric8", "fabric8-karaf", FabricConstants.FABRIC_VERSION, fallbackRepositories);
    sb.append("run cd `").append(FIRST_FABRIC_DIRECTORY).append("`\n");
    sb.append("run mkdir -p ").append(systemDistPath).append("\n");
    sb.append("run cp ../").append(distFilename).append(" ").append(systemDistPath).append("/\n");
    sb.append("run rm ../").append(distFilename).append("\n");
    sb.append("run chmod +x bin/*").append("\n");
    List<String> lines = new ArrayList<String>();
    String globalResolver = options.getResolver() != null ? options.getResolver() : ZkDefs.DEFAULT_RESOLVER;
    lines.add(ZkDefs.GLOBAL_RESOLVER_PROPERTY + "=" + globalResolver);
    if (options.getBindAddress() != null && !options.getBindAddress().isEmpty()) {
        lines.add(ZkDefs.BIND_ADDRESS + "=" + options.getBindAddress());
    }
    if (options.getManualIp() != null && !options.getManualIp().isEmpty()) {
        lines.add(ZkDefs.MANUAL_IP + "=" + options.getManualIp());
    }
    appendFile(sb, "etc/system.properties", lines);
    replacePropertyValue(sb, "etc/system.properties", "karaf.name", name);
    String dataStoreFile = "etc/" + Constants.DATASTORE_PID + ".cfg";
    for (Map.Entry<String, String> entry : options.getDataStoreProperties().entrySet()) {
        String key = entry.getKey();
        String value = entry.getValue();
        replacePropertyValue(sb, dataStoreFile, key, value);
        uncomment_line(sb, dataStoreFile, key);
    }
    // Apply port range
    sb.append("BIND_ADDRESS=").append(options.getBindAddress() != null && !options.getBindAddress().isEmpty() ? options.getBindAddress() : "0.0.0.0").append("\n");
    sb.append("SSH_PORT=").append("\"").append("`find_free_port ").append(Ports.mapPortToRange(DEFAULT_SSH_PORT, options.getMinimumPort(), options.getMaximumPort())).append(" ").append(options.getMaximumPort()).append("`\"").append("\n");
    sb.append("RMI_REGISTRY_PORT=").append("\"").append("`find_free_port ").append(Ports.mapPortToRange(DEFAULT_RMI_REGISTRY_PORT, options.getMinimumPort(), options.getMaximumPort())).append(" ").append(options.getMaximumPort()).append("`\"").append("\n");
    sb.append("RMI_SERVER_PORT=").append("\"").append("`find_free_port ").append(Ports.mapPortToRange(DEFAULT_RMI_SERVER_PORT, options.getMinimumPort(), options.getMaximumPort())).append(" ").append(options.getMaximumPort()).append("`\"").append("\n");
    sb.append("JMX_SERVER_URL=\"").append("service:jmx:rmi:\\/\\/${BIND_ADDRESS}:${RMI_SERVER_PORT}\\/jndi\\/rmi:\\/\\/${BIND_ADDRESS}:${RMI_REGISTRY_PORT}\\/karaf-").append(name).append("\"\n");
    sb.append("HTTP_PORT=").append("\"").append("`find_free_port ").append(Ports.mapPortToRange(DEFAULT_HTTP_PORT, options.getMinimumPort(), options.getMaximumPort())).append(" ").append(options.getMaximumPort()).append("`\"").append("\n");
    replacePropertyValue(sb, "etc/org.apache.karaf.shell.cfg", "sshPort", "$SSH_PORT");
    replacePropertyValue(sb, "etc/org.apache.karaf.shell.cfg", "sshHost", "$BIND_ADDRESS");
    replacePropertyValue(sb, "etc/org.apache.karaf.management.cfg", "rmiRegistryPort", "$RMI_REGISTRY_PORT");
    replacePropertyValue(sb, "etc/org.apache.karaf.management.cfg", "rmiServerPort", "$RMI_SERVER_PORT");
    replacePropertyValue(sb, "etc/org.apache.karaf.management.cfg", "rmiServerHost", "$BIND_ADDRESS");
    replacePropertyValue(sb, "etc/org.apache.karaf.management.cfg", "rmiRegistryHost", "$BIND_ADDRESS");
    // ENTESB-2733: do not change serviceUrl, let's leave it with placeholders
    // replacePropertyValue(sb, "etc/org.apache.karaf.management.cfg", "serviceUrl", "$JMX_SERVER_URL");
    replacePropertyValue(sb, "etc/org.ops4j.pax.web.cfg", "org.osgi.service.http.port", "$HTTP_PORT");
    replaceLineInFile(sb, "etc/jetty.xml", String.valueOf(DEFAULT_HTTP_PORT), "$HTTP_PORT");
    appendFile(sb, "etc/system.properties", Arrays.asList(ZkDefs.MINIMUM_PORT + "=" + options.getMinimumPort()));
    appendFile(sb, "etc/system.properties", Arrays.asList(ZkDefs.MAXIMUM_PORT + "=" + options.getMaximumPort()));
    appendFile(sb, "etc/system.properties", Arrays.asList("\n"));
    // Read all system properties
    for (Map.Entry<String, Properties> entry : options.getSystemProperties().entrySet()) {
        Properties sysprops = entry.getValue();
        for (Map.Entry syspropEntry : sysprops.entrySet()) {
            Object type = syspropEntry.getKey();
            Object value = syspropEntry.getValue();
            appendFile(sb, "etc/system.properties", Arrays.asList(type + "=" + value));
        }
    }
    // TODO: Be simple & move all of the code below under system properties MAP.
    if (options.getPreferredAddress() != null) {
        appendFile(sb, "etc/system.properties", Arrays.asList(HostUtils.PREFERED_ADDRESS_PROPERTY_NAME + "=" + options.getPreferredAddress()));
    }
    String zkPasswordEncode = System.getProperty("zookeeper.password.encode", "true");
    if (options.isEnsembleServer()) {
        appendFile(sb, "etc/system.properties", Arrays.asList("zookeeper.password = " + options.getZookeeperPassword()));
        appendFile(sb, "etc/system.properties", Arrays.asList("zookeeper.password.encode = " + zkPasswordEncode));
        appendFile(sb, "etc/system.properties", Arrays.asList(CreateEnsembleOptions.ENSEMBLE_AUTOSTART + "=true"));
        appendFile(sb, "etc/system.properties", Arrays.asList(CreateEnsembleOptions.AGENT_AUTOSTART + "=true"));
        appendFile(sb, "etc/system.properties", Arrays.asList(CreateEnsembleOptions.PROFILES_AUTOIMPORT_PATH + "=${runtime.home}/fabric/import/"));
        if (options.getUsers() != null) {
            appendFile(sb, "etc/users.properties", Arrays.asList("\n"));
            for (Map.Entry<String, String> entry : options.getUsers().entrySet()) {
                appendFile(sb, "etc/users.properties", Arrays.asList(entry.getKey() + "=" + entry.getValue()));
            }
        }
    } else if (options.getZookeeperUrl() != null) {
        appendFile(sb, "etc/system.properties", Arrays.asList("zookeeper.url = " + options.getZookeeperUrl()));
        appendFile(sb, "etc/system.properties", Arrays.asList("zookeeper.password = " + options.getZookeeperPassword()));
        appendFile(sb, "etc/system.properties", Arrays.asList("zookeeper.password.encode = " + zkPasswordEncode));
        appendFile(sb, "etc/system.properties", Arrays.asList(CreateEnsembleOptions.AGENT_AUTOSTART + "=true"));
        appendToLineInFile(sb, "etc/org.apache.karaf.features.cfg", "featuresBoot=", "fabric-agent,fabric-git,");
    }
    // Add the proxyURI to the list of repositories
    if (options.getProxyUri() != null) {
        appendToLineInFile(sb, "etc/org.ops4j.pax.url.mvn.cfg", "repositories=", options.getProxyUri().toString() + ",");
    }
    // Just for ensemble servers we want to copy their creation metadata for import.
    if (options.isEnsembleServer()) {
        CreateContainerMetadata metadata = options.getMetadataMap().get(name);
        if (metadata != null) {
            byte[] metadataPayload = ObjectUtils.toBytes(metadata);
            if (metadataPayload != null && metadataPayload.length > 0) {
                sb.append("copy_node_metadata ").append(name).append(" ").append(new String(Base64Encoder.encode(metadataPayload))).append("\n");
            }
        }
    }
    sb.append("generate_ssh_keys").append("\n");
    sb.append("configure_hostnames").append(" ").append(options.getHostNameContext()).append("\n");
    String jvmOptions = options.getJvmOpts();
    if (jvmOptions == null) {
        jvmOptions = "-XX:+UnlockDiagnosticVMOptions -XX:+UnsyncloadClass";
    } else if (!jvmOptions.contains("-XX:+UnlockDiagnosticVMOptions -XX:+UnsyncloadClass")) {
        jvmOptions = jvmOptions + " -XX:+UnlockDiagnosticVMOptions -XX:+UnsyncloadClass";
    }
    if (!jvmOptions.contains("-server")) {
        jvmOptions = jvmOptions + " -server";
    }
    environmentalVariables.put("JAVA_OPTS", jvmOptions);
    ArrayList<String> setenv = new ArrayList<String>();
    for (Map.Entry<String, String> entry : environmentalVariables.entrySet()) {
        setenv.add("export " + entry.getKey() + "=\"" + entry.getValue() + "\"\n");
    }
    writeFile(sb, "bin/setenv", setenv);
    sb.append("nohup bin/start &").append("\n");
    sb.append("karaf_check `pwd`").append("\n");
    sb.append("wait_for_port $SSH_PORT").append("\n");
    sb.append("wait_for_port $RMI_REGISTRY_PORT").append("\n");
    return sb.toString();
}
Also used : HashMap(java.util.HashMap) CreateContainerMetadata(io.fabric8.api.CreateContainerMetadata) ArrayList(java.util.ArrayList) Properties(java.util.Properties) HashMap(java.util.HashMap) Map(java.util.Map)

Example 8 with CreateContainerMetadata

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

the class JcloudsContainerProvider method destroy.

@Override
public void destroy(Container container) {
    assertValid();
    CreateContainerMetadata metadata = container.getMetadata();
    if (!(metadata instanceof CreateJCloudsContainerMetadata)) {
        throw new IllegalStateException("Container doesn't have valid create container metadata type");
    } else {
        container.setProvisionResult(Container.PROVISION_DELETING);
        CreateJCloudsContainerMetadata jCloudsContainerMetadata = (CreateJCloudsContainerMetadata) metadata;
        CreateJCloudsContainerOptions options = jCloudsContainerMetadata.getCreateOptions();
        String nodeId = jCloudsContainerMetadata.getNodeId();
        ComputeService computeService = getOrCreateComputeService(options);
        computeService.destroyNode(nodeId);
    }
}
Also used : CreateContainerMetadata(io.fabric8.api.CreateContainerMetadata) ComputeService(org.jclouds.compute.ComputeService)

Example 9 with CreateContainerMetadata

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

the class JcloudsContainerProvider method stop.

@Override
public void stop(Container container) {
    assertValid();
    CreateContainerMetadata metadata = container.getMetadata();
    if (!(metadata instanceof CreateJCloudsContainerMetadata)) {
        throw new IllegalStateException("Container doesn't have valid create container metadata type");
    } else {
        CreateJCloudsContainerMetadata jCloudsContainerMetadata = (CreateJCloudsContainerMetadata) metadata;
        CreateJCloudsContainerOptions options = jCloudsContainerMetadata.getCreateOptions();
        try {
            ComputeService computeService = getOrCreateComputeService(options);
            String nodeId = jCloudsContainerMetadata.getNodeId();
            Optional<RunScriptOptions> runScriptOptions = ToRunScriptOptions.withComputeService(computeService).apply(jCloudsContainerMetadata);
            String script = buildStopScript(container.getId(), options);
            ExecResponse response;
            container.setProvisionResult(Container.PROVISION_STOPPING);
            if (runScriptOptions.isPresent()) {
                response = computeService.runScriptOnNode(nodeId, script, runScriptOptions.get());
            } else {
                response = computeService.runScriptOnNode(nodeId, script);
            }
            if (response == null) {
                jCloudsContainerMetadata.setFailure(new Exception("No response received for fabric install script."));
            } else if (response.getOutput() != null && response.getOutput().contains(ContainerProviderUtils.FAILURE_PREFIX)) {
                jCloudsContainerMetadata.setFailure(new Exception(ContainerProviderUtils.parseScriptFailure(response.getOutput())));
            }
        } catch (Throwable t) {
            container.setProvisionResult(Container.PROVISION_STOPPED);
            jCloudsContainerMetadata.setFailure(t);
        }
    }
}
Also used : RunScriptOptions(org.jclouds.compute.options.RunScriptOptions) ToRunScriptOptions(io.fabric8.service.jclouds.functions.ToRunScriptOptions) ExecResponse(org.jclouds.compute.domain.ExecResponse) CreateContainerMetadata(io.fabric8.api.CreateContainerMetadata) ComputeService(org.jclouds.compute.ComputeService) URISyntaxException(java.net.URISyntaxException) RunNodesException(org.jclouds.compute.RunNodesException) MalformedURLException(java.net.MalformedURLException)

Example 10 with CreateContainerMetadata

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

the class SshContainerCompleter method getProvider.

private ContainerProvider getProvider(Container container) {
    CreateContainerMetadata metadata = container.getMetadata();
    String type = metadata != null ? metadata.getCreateOptions().getProviderType() : null;
    if (type == null) {
        return null;
    }
    ContainerProvider provider = fabricService.getProvider(type);
    if (provider == null) {
        return null;
    }
    return provider;
}
Also used : ContainerProvider(io.fabric8.api.ContainerProvider) CreateContainerMetadata(io.fabric8.api.CreateContainerMetadata)

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