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)