Adds some jclouds Docker examples that work with getcarina.com
diff --git a/rackspace/pom.xml b/rackspace/pom.xml
index 71ff927..1446e64 100644
--- a/rackspace/pom.xml
+++ b/rackspace/pom.xml
@@ -41,6 +41,12 @@
<artifactId>jclouds-sshj</artifactId>
<version>${jclouds.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.jclouds.labs</groupId>
+ <artifactId>docker</artifactId>
+ <!-- TODO: Update version to variable jclouds.version on next release -->
+ <version>2.0.0-SNAPSHOT</version>
+ </dependency>
<!-- Rackspace US dependencies -->
<dependency>
<groupId>org.apache.jclouds.provider</groupId>
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/carina/CreateComputeContainer.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/carina/CreateComputeContainer.java
new file mode 100644
index 0000000..3476b9e
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/carina/CreateComputeContainer.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.examples.rackspace.carina;
+
+import static org.jclouds.compute.predicates.NodePredicates.runningInGroup;
+
+import java.io.IOException;
+import java.util.Set;
+
+import org.jclouds.compute.ComputeServiceContext;
+import org.jclouds.compute.RunNodesException;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.docker.compute.options.DockerTemplateOptions;
+
+/**
+ * This example creates a container in Carina using the jclouds compute abstraction
+ */
+
+public class CreateComputeContainer {
+
+ public static void main(String[] args) throws IOException, RunNodesException {
+ // Get a context with docker that offers the portable ComputeService api
+ ComputeServiceContext client = Utils.getComputeApiFromCarinaDirectory(args[0]);
+
+ // Carina does not allow privileged mode containers
+ DockerTemplateOptions dto = new DockerTemplateOptions();
+ dto.privileged(false);
+
+ // Use a known sshd image for demonstration purposes: sickp/apline-sshd
+ Template template = client.getComputeService()
+ .templateBuilder()
+ .options(dto)
+ .imageNameMatches("sickp/alpine-sshd")
+ .build();
+
+ // Run a couple nodes accessible via group container
+ Set<? extends NodeMetadata> nodes = client.getComputeService().createNodesInGroup("jcloudscontainertest", 2, template);
+
+ // Show the nodes
+ for(NodeMetadata node : nodes) {
+ System.out.println("Node: " + node.getName());
+ }
+
+ // Cleanup
+ client.getComputeService().destroyNodesMatching(runningInGroup("jcloudscontainertest"));
+
+ // Release resources
+ client.close();
+ }
+}
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/carina/CreateContainer.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/carina/CreateContainer.java
new file mode 100644
index 0000000..e1e6958
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/carina/CreateContainer.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.examples.rackspace.carina;
+
+import static org.jclouds.examples.rackspace.carina.Utils.getDockerApiFromCarinaDirectory;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.UUID;
+
+import org.jclouds.docker.DockerApi;
+import org.jclouds.docker.domain.Config;
+import org.jclouds.docker.domain.Container;
+import org.jclouds.docker.domain.HostConfig;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * This example creates a Carina container
+ *
+ * To use, create/login at getcarina.com; then create a cluster and download the "get access" zip file.
+ * Then extract the zip archive to a directory and pass the directory path as a parameter to main.
+ */
+public class CreateContainer {
+
+ public static void main(String[] args) throws IOException {
+
+ DockerApi dockerApi = getDockerApiFromCarinaDirectory(args[0]);
+
+ /**
+ * Specifying .publishAllPorts(true) in the HostConfig when *creating* the container is the simplest and
+ * arguably best way to publish the ports this container will be using. Using .portBindings to specify particular
+ * ports is somewhat more involved.
+ *
+ * However, because of https://github.com/docker/docker/issues/4635, TCP and UDP will be exposed on different
+ * ports.
+ */
+ Container container = dockerApi.getContainerApi().createContainer("mumble",
+ Config.builder()
+ .image("extra/mumble")
+ .hostConfig(
+ HostConfig.builder()
+ .publishAllPorts(true)
+ .build())
+ .env(
+ ImmutableList.of(
+ "MAX_USERS=50",
+ "SERVER_TEXT=Welcome to My Mumble Server",
+ "SUPW=" + UUID.randomUUID()
+ ))
+ .build());
+
+ String id = container.id();
+
+ dockerApi.getContainerApi().startContainer(id);
+
+ for(Entry<String, List<Map<String, String>>> portList : dockerApi.getContainerApi().inspectContainer(id).networkSettings().ports().entrySet()) {
+ for(Map<String, String> port: portList.getValue()) {
+ System.out.println("Port: " + portList.getKey() + " -> " + port.get("HostIp") + ":" + port.get("HostPort"));
+ }
+ }
+
+ // Cleanup
+ dockerApi.getContainerApi().stopContainer(id);
+ dockerApi.getContainerApi().removeContainer(id);
+
+ dockerApi.close();
+ }
+}
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/carina/ListContainer.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/carina/ListContainer.java
new file mode 100644
index 0000000..7500034
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/carina/ListContainer.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.examples.rackspace.carina;
+
+import static org.jclouds.examples.rackspace.carina.Utils.getDockerApiFromCarinaDirectory;
+
+import java.io.IOException;
+
+import org.jclouds.docker.DockerApi;
+import org.jclouds.docker.domain.ContainerSummary;
+
+/**
+ * This example lists Carina containers
+ *
+ * To use, create/login at getcarina.com; then create a cluster and download the "get access" zip file.
+ * Then extract the zip archive to a directory and pass the directory path as a parameter to main.
+ */
+public class ListContainer {
+
+ public static void main(String[] args) throws IOException {
+
+ DockerApi dockerApi = getDockerApiFromCarinaDirectory(args[0]);
+
+ for( ContainerSummary c : dockerApi.getContainerApi().listContainers()) {
+ System.out.println(c);
+ }
+
+ dockerApi.close();
+ }
+
+
+
+
+}
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/carina/Utils.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/carina/Utils.java
new file mode 100644
index 0000000..cf6f04d
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/carina/Utils.java
@@ -0,0 +1,81 @@
+package org.jclouds.examples.rackspace.carina;/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.util.Properties;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.compute.ComputeServiceContext;
+import org.jclouds.docker.DockerApi;
+import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
+import org.jclouds.sshj.config.SshjSshClientModule;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.io.Files;
+import com.google.inject.Module;
+
+public class Utils {
+ public static DockerApi getDockerApiFromCarinaDirectory(String path) throws IOException {
+ // docker.ps1 contains the endpoint
+ String endpoint = "https://" +
+ Files.readFirstLine(new File(joinPath(path, "docker.ps1")),
+ Charset.forName("UTF-8")).split("=")[1].replace("\"", "").substring(6);
+
+ // enable logging
+ Iterable<Module> modules = ImmutableSet.<Module> of(new SLF4JLoggingModule());
+ Properties overrides = new Properties();
+
+ // disable certificate checking for Carina
+ overrides.setProperty("jclouds.trust-all-certs", "true");
+
+ return ContextBuilder.newBuilder("docker")
+ // Use the unencrypted credentials
+ .credentials(joinPath(path, "cert.pem"), joinPath(path, "key.pem"))
+ .overrides(overrides)
+ .endpoint(endpoint)
+ .modules(modules)
+ .buildApi(DockerApi.class);
+ }
+
+ public static ComputeServiceContext getComputeApiFromCarinaDirectory(String path) throws IOException {
+ // docker.ps1 contains the endpoint
+ String endpoint = "https://" +
+ Files.readFirstLine(new File(joinPath(path, "docker.ps1")),
+ Charset.forName("UTF-8")).split("=")[1].replace("\"", "").substring(6);
+
+ // enable logging and sshj
+ Iterable<Module> modules = ImmutableSet.<Module> of(new SLF4JLoggingModule(), new SshjSshClientModule());
+ Properties overrides = new Properties();
+
+ // disable certificate checking for Carina
+ overrides.setProperty("jclouds.trust-all-certs", "true");
+
+ return ContextBuilder.newBuilder("docker")
+ .credentials(joinPath(path, "cert.pem"), joinPath(path, "key.pem"))
+ .modules(modules)
+ .overrides(overrides)
+ .endpoint(endpoint)
+ .buildView(ComputeServiceContext.class);
+ }
+
+ // Concatenate two different paths
+ public static String joinPath(String path1, String path2) {
+ return new File(path1, path2).toString();
+ }
+}