diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/pom.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/pom.xml
index 74be4da8da4..21f7fc6c0bf 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/pom.xml
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/pom.xml
@@ -83,6 +83,23 @@
org.eclipse.jetty
jetty-util
+
+
+ org.eclipse.jetty.websocket
+ websocket-server
+ 9.3.2.v20150730
+
+
+ org.eclipse.jetty.websocket
+ websocket-servlet
+ 9.3.2.v20150730
+
+
+
+ org.eclipse.jetty.websocket
+ websocket-client
+ 9.3.2.v20150730
+
com.google.guava
guava
@@ -251,6 +268,11 @@
+
+ org.eclipse.jetty
+ jetty-maven-plugin
+ 9.3.2.v20150730
+
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/ContainerShellWebSocket.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/ContainerShellWebSocket.java
new file mode 100644
index 00000000000..d314d4b5f1e
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/ContainerShellWebSocket.java
@@ -0,0 +1,45 @@
+package org.apache.hadoop.yarn.server.nodemanager.webapp;
+
+import java.io.IOException;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.classification.InterfaceStability;
+
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
+import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
+import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
+import org.eclipse.jetty.websocket.api.annotations.WebSocket;
+
+@InterfaceAudience.LimitedPrivate({"HDFS", "MapReduce", "YARN"})
+@InterfaceStability.Unstable
+
+@WebSocket
+public class ContainerShellWebSocket {
+
+ private DockerExec de;
+
+ @OnWebSocketMessage
+ public void onText(Session session, String message) throws IOException {
+ System.out.println("Message received:" + message);
+ if (session.isOpen()) {
+ String response = message.toUpperCase();
+ session.getRemote().sendString(response);
+ }
+ }
+
+ @OnWebSocketConnect
+ public void onConnect(Session session) {
+ System.out.println(
+ session.getRemoteAddress().getHostString() + " connected!");
+// de = new DockerExec(hsr.getRemoteUser(), container_id, "bash");
+// String cmd = "docker exec -it " + container_id;
+// ProcessBuilder build = new ProcessBuilder(cmd);
+ }
+
+ @OnWebSocketClose
+ public void onClose(Session session, int status, String reason) {
+ System.out.println(session.getRemoteAddress().getHostString() + " closed!");
+ }
+
+}
\ No newline at end of file
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/ContainerShellWebSocketServlet.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/ContainerShellWebSocketServlet.java
new file mode 100644
index 00000000000..1dbaa6147d2
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/ContainerShellWebSocketServlet.java
@@ -0,0 +1,15 @@
+package org.apache.hadoop.yarn.server.nodemanager.webapp;
+
+import javax.servlet.annotation.WebServlet;
+
+import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
+import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
+
+@WebServlet(urlPatterns="/container")
+public class ContainerShellWebSocketServlet extends WebSocketServlet{
+
+ @Override
+ public void configure(WebSocketServletFactory factory) {
+ factory.register(ContainerShellWebSocket.class);
+ }
+}
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/DockerExec.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/DockerExec.java
new file mode 100644
index 00000000000..1ead26e628c
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/DockerExec.java
@@ -0,0 +1,38 @@
+package org.apache.hadoop.yarn.server.nodemanager.webapp;
+
+public class DockerExec {
+
+ private String runtimeUser;
+ private String containerId;
+ private String option;
+
+ public DockerExec(String user, String cId, String opt) {
+ this.runtimeUser = user;
+ this.containerId = cId;
+ this.option = opt;
+ }
+
+ public String getRuntimeUser() {
+ return runtimeUser;
+ }
+
+ public void setRuntimeUser(String runtimeUser) {
+ this.runtimeUser = runtimeUser;
+ }
+
+ public String getContainerId() {
+ return containerId;
+ }
+
+ public void setContainerId(String containerId) {
+ this.containerId = containerId;
+ }
+
+ public String getCommand() {
+ return option;
+ }
+
+ public void setCommand(String opt) {
+ this.option = opt;
+ }
+}
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/WebServer.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/WebServer.java
index 813ba142111..e0e7a0a4e9f 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/WebServer.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/WebServer.java
@@ -19,6 +19,8 @@
package org.apache.hadoop.yarn.server.nodemanager.webapp;
import static org.apache.hadoop.yarn.util.StringHelper.pajoin;
+
+import com.sun.jersey.spi.container.servlet.ServletContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -41,7 +43,9 @@
import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
public class WebServer extends AbstractService {
@@ -64,6 +68,7 @@ public WebServer(Context nmContext, ResourceView resourceView,
@Override
protected void serviceStart() throws Exception {
Configuration conf = getConfig();
+ Map params = new HashMap();
String bindAddress = WebAppUtils.getWebAppBindURL(conf,
YarnConfiguration.NM_BIND_HOST,
WebAppUtils.getNMWebAppURLWithoutScheme(conf));
@@ -98,10 +103,13 @@ protected void serviceStart() throws Exception {
}
LOG.info("Instantiating NMWebApp at " + bindAddress);
try {
+// params.put("javax.websocket.server.ServerContainer",
+// "org.apache.hadoop.yarn.server.nodemanager.webapp.ContainerInteractiveShell");
this.webApp =
WebApps
.$for("node", Context.class, this.nmContext, "ws")
.at(bindAddress)
+ .withServlet("ContainerShellWebSocket", "/container", ContainerShellWebSocketServlet.class, params, false)
.with(conf)
.withHttpSpnegoPrincipalKey(
YarnConfiguration.NM_WEBAPP_SPNEGO_USER_NAME_KEY)