From 36aa2eb3e326d96f490a886d3a6978fc3756f49c Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Thu, 17 Mar 2016 14:58:20 +1100 Subject: [PATCH] Issue #188 Jetty9 clustered session example Issue #188 Jetty9 clustered session example --- managed_vms/jetty9-gcloud-sessions/README.md | 44 ++++++++ managed_vms/jetty9-gcloud-sessions/pom.xml | 86 ++++++++++++++++ .../src/main/appengine/Dockerfile | 7 ++ .../src/main/appengine/app.yaml | 4 + .../google/appengine/demos/DumpServlet.java | 95 ++++++++++++++++++ .../jetty-base/etc/jetty-gcloud-sessions.xml | 33 ++++++ .../etc/jetty9-work-fe328934f681.p12 | Bin 0 -> 2476 bytes .../start.d/gcloud-sessions-config.ini | 18 ++++ .../src/main/jetty-base/webapps/root.xml | 26 +++++ .../main/webapp/WEB-INF/logging.properties | 13 +++ .../src/main/webapp/WEB-INF/web.xml | 55 ++++++++++ .../src/main/webapp/index.html | 8 ++ 12 files changed, 389 insertions(+) create mode 100644 managed_vms/jetty9-gcloud-sessions/README.md create mode 100644 managed_vms/jetty9-gcloud-sessions/pom.xml create mode 100644 managed_vms/jetty9-gcloud-sessions/src/main/appengine/Dockerfile create mode 100644 managed_vms/jetty9-gcloud-sessions/src/main/appengine/app.yaml create mode 100644 managed_vms/jetty9-gcloud-sessions/src/main/java/com/google/appengine/demos/DumpServlet.java create mode 100644 managed_vms/jetty9-gcloud-sessions/src/main/jetty-base/etc/jetty-gcloud-sessions.xml create mode 100644 managed_vms/jetty9-gcloud-sessions/src/main/jetty-base/etc/jetty9-work-fe328934f681.p12 create mode 100644 managed_vms/jetty9-gcloud-sessions/src/main/jetty-base/start.d/gcloud-sessions-config.ini create mode 100644 managed_vms/jetty9-gcloud-sessions/src/main/jetty-base/webapps/root.xml create mode 100644 managed_vms/jetty9-gcloud-sessions/src/main/webapp/WEB-INF/logging.properties create mode 100644 managed_vms/jetty9-gcloud-sessions/src/main/webapp/WEB-INF/web.xml create mode 100644 managed_vms/jetty9-gcloud-sessions/src/main/webapp/index.html diff --git a/managed_vms/jetty9-gcloud-sessions/README.md b/managed_vms/jetty9-gcloud-sessions/README.md new file mode 100644 index 00000000000..613159138b1 --- /dev/null +++ b/managed_vms/jetty9-gcloud-sessions/README.md @@ -0,0 +1,44 @@ + +# Example Web App Jetty9 image and GCload data store for session + +This web app demonstrates using the pure jetty9 image configured to use gcloud datastore for sessions. + + +## Initial Setup ## + +First, complete the following steps: + +- [Create your project](https://developers.google.com/appengine/docs/managed-vms/) and have it enabled for Managed VMs. +- Obtain an app key for the Google Places WebService API. +- Download and install [the Beta build of the Google Cloud SDK](https://developers.google.com/cloud/sdk/#Quick_Start). +- Install the Cloud SDK `app-engine-java` component. +- Authenticate wth the gcloud SDK: gcloud auth login. +- Install [Maven](http://maven.apache.org/download.cgi) if you haven't already. + + + +## Providing your Google Places API key ## + +You will need to edit the pom.xml file and replace YOUR_PLACES_APP_KEY with the value of your key: + + YOUR_PLACES_APP_KEY + +You then have several options of how to run it: + +## Running locally without the AppEngine environment ## + +The application does not use any AppEngine specific services, so you can run it simply on your local machine by doing: + + mvn jetty:run + +Go to http://localhost:8080 to see the webapp. + + +## Deploying to the cloud as an AppEngine ManagedVM ## + +To automatically stage and deploy the webapp to your project in the cloud do: + + mvn gcloud:deploy + +See here for more information on the [GCloud Maven Plugin](https://github.com/GoogleCloudPlatform/gcloud-maven-plugin). + diff --git a/managed_vms/jetty9-gcloud-sessions/pom.xml b/managed_vms/jetty9-gcloud-sessions/pom.xml new file mode 100644 index 00000000000..7bfa8a8f506 --- /dev/null +++ b/managed_vms/jetty9-gcloud-sessions/pom.xml @@ -0,0 +1,86 @@ + + + + + + 4.0.0 + war + 1.0-SNAPSHOT + + com.google.appengine.demos + jetty9-gcloud-session + + + 1.9.30 + UTF-8 + + + + + + com.google.appengine + appengine-api-1.0-sdk + ${appengine.target.version} + + + javax.servlet + javax.servlet-api + 3.1.0 + jar + provided + + + + + + + ${project.build.directory}/appengine-staging/jetty-base + false + ${basedir}/src/main/jetty-base + + ** + + + + + + target/${project.artifactId}-${project.version}/WEB-INF/classes + + + org.apache.maven.plugins + 2.5.1 + maven-compiler-plugin + + 1.8 + 1.8 + + + + + com.google.appengine + gcloud-maven-plugin + 2.0.9.90.v20151210 + + /usr/local/google-cloud-sdk + + + + + + diff --git a/managed_vms/jetty9-gcloud-sessions/src/main/appengine/Dockerfile b/managed_vms/jetty9-gcloud-sessions/src/main/appengine/Dockerfile new file mode 100644 index 00000000000..ff996a5f2c2 --- /dev/null +++ b/managed_vms/jetty9-gcloud-sessions/src/main/appengine/Dockerfile @@ -0,0 +1,7 @@ +FROM gcr.io/google_appengine/jetty9 +ADD jetty9-gcloud-session-1.0-SNAPSHOT.war $JETTY_BASE/webapps/root.war +ADD jetty-base $JETTY_BASE/ +WORKDIR $JETTY_BASE +RUN java -jar $JETTY_HOME/start.jar --approve-all-licenses --add-to-startd=gcloud-sessions \ + && chown -R jetty:jetty $JETTY_BASE +RUN ls -lR diff --git a/managed_vms/jetty9-gcloud-sessions/src/main/appengine/app.yaml b/managed_vms/jetty9-gcloud-sessions/src/main/appengine/app.yaml new file mode 100644 index 00000000000..962d7a6a5e8 --- /dev/null +++ b/managed_vms/jetty9-gcloud-sessions/src/main/appengine/app.yaml @@ -0,0 +1,4 @@ +runtime: custom +vm: true +manual_scaling: + instances: 2 diff --git a/managed_vms/jetty9-gcloud-sessions/src/main/java/com/google/appengine/demos/DumpServlet.java b/managed_vms/jetty9-gcloud-sessions/src/main/java/com/google/appengine/demos/DumpServlet.java new file mode 100644 index 00000000000..fc639d5178b --- /dev/null +++ b/managed_vms/jetty9-gcloud-sessions/src/main/java/com/google/appengine/demos/DumpServlet.java @@ -0,0 +1,95 @@ +package com.google.appengine.demos; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +@SuppressWarnings("serial") +public class DumpServlet extends HttpServlet +{ + @Override + protected void doGet( HttpServletRequest request, + HttpServletResponse response ) throws ServletException, + IOException + { + response.setContentType("text/html"); + response.setStatus(HttpServletResponse.SC_OK); + + PrintWriter out = response.getWriter(); + + out.printf("

DumpServlet on instance %s

%n",System.getenv("GAE_MODULE_INSTANCE")); + + out.println("

Session:

"); + out.println("
");
+        HttpSession session = request.getSession(true);
+        if (session != null) {
+          for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {
+            String n = e.nextElement();
+            session.setAttribute(n, request.getParameter(n));
+          }
+          out.printf("s.id()=%s%n", session.getId());
+          out.printf("s.new()=%b%n", session.isNew());
+          out.printf("s.last()=%b%n", session.getLastAccessedTime());
+          for (Enumeration e = session.getAttributeNames(); e.hasMoreElements();) {
+            String n = e.nextElement();
+            out.printf("%s=%s%n", n, session.getAttribute(n));
+          }
+        }
+        out.println("
"); + + out.println("

Context Fields:

"); + out.println("
");
+        out.printf("serverInfo=%s%n",getServletContext().getServerInfo());
+        out.printf("getServletContextName=%s%n",getServletContext().getServletContextName());
+        out.printf("virtualServerName=%s%n",getServletContext().getVirtualServerName());
+        out.printf("contextPath=%s%n",getServletContext().getContextPath());
+        out.printf("version=%d.%d%n",getServletContext().getMajorVersion(),getServletContext().getMinorVersion());
+        out.printf("effectiveVersion=%d.%d%n",getServletContext().getEffectiveMajorVersion(),getServletContext().getEffectiveMinorVersion());
+        out.println("
"); + + out.println("

Request Methods:

"); + out.println("
");
+        out.printf("remoteHost/Addr:port=%s/%s:%d%n",request.getRemoteHost(),request.getRemoteAddr(),request.getRemotePort());
+        out.printf("localName/Addr:port=%s/%s:%d%n",request.getLocalName(),request.getLocalAddr(),request.getLocalPort());
+        out.printf("scheme=%s method=%s protocol=%s%n",request.getScheme(), request.getMethod(), request.getProtocol());
+        out.printf("serverName:serverPort=%s:%d%n",request.getServerName(),request.getServerPort());
+        out.printf("requestURI=%s%n",request.getRequestURI());
+        out.printf("requestURL=%s%n",request.getRequestURL().toString());
+        out.printf("contextPath|servletPath|pathInfo=%s|%s|%s%n",request.getContextPath(),request.getServletPath(),request.getPathInfo());
+        out.println("
"); + + out.println("

Request Headers:

"); + out.println("
");
+        for (String n : Collections.list(request.getHeaderNames()))
+            for (String v : Collections.list(request.getHeaders(n)))
+                out.printf("%s: %s%n",n,v);
+        out.println("
"); + + out.println("

Response Fields:

"); + out.println("
");
+        out.printf("bufferSize=%d%n",response.getBufferSize());
+        out.printf("encodedURL(\"/foo/bar\")=%s%n",response.encodeURL("/foo/bar"));
+        out.printf("encodedRedirectURL(\"/foo/bar\")=%s%n",response.encodeRedirectURL("/foo/bar"));
+        out.println("
"); + + out.println("

Environment:

"); + out.println("
");
+        for (Map.Entry e : System.getenv().entrySet())
+          out.printf("%s=%s%n",e.getKey(),e.getValue());
+        out.println("
"); + + out.println("

System Properties:

"); + out.println("
");
+        for (Object n : System.getProperties().keySet())
+          out.printf("%s=%s%n",n,System.getProperty(n.toString()));
+        out.println("
"); + } +} diff --git a/managed_vms/jetty9-gcloud-sessions/src/main/jetty-base/etc/jetty-gcloud-sessions.xml b/managed_vms/jetty9-gcloud-sessions/src/main/jetty-base/etc/jetty-gcloud-sessions.xml new file mode 100644 index 00000000000..a94c8198194 --- /dev/null +++ b/managed_vms/jetty9-gcloud-sessions/src/main/jetty-base/etc/jetty-gcloud-sessions.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + node + + + + + diff --git a/managed_vms/jetty9-gcloud-sessions/src/main/jetty-base/etc/jetty9-work-fe328934f681.p12 b/managed_vms/jetty9-gcloud-sessions/src/main/jetty-base/etc/jetty9-work-fe328934f681.p12 new file mode 100644 index 0000000000000000000000000000000000000000..1bdbd6eb8048b46c3d97f61730ef1c03ecfa60f0 GIT binary patch literal 2476 zcmY+Ec{CIX8^&kFjD|4ClG|io8*7%yR+elD$q3oTrE8}cyRj?EKE^hdqRXJNg^;og zDqD&fM#`Qo%_!V_?m6Fg@A>|C&U?=9dEWQG_dye2H6S1uO@O(x!Q_%nllKrnb|9Gm zvxN{~SB|kcng9*_KMU#xAwZpvG4@#3*f{^Ybpj3qkqMA}Gy%dw%do-!hmVg7Ly+T5 z8H5@c+*Q6}`NyvySK>FT))^oW1OOpG27#PYHGm?wOMQ;e>)!m|WZk|$ZeHQuvUnI= zRo9Z&BkG!QZOnvzQ_kJ>+eK(s;~#LOremj(qecZeLTncU&Ig40Xc+fuqmB2SClgkc zLN%0Jk|m^=USa)x%X(r_J!eG>q=a%M=4HQ+_twrSXy{Oq@-7?t2FJdEG)({OshBf} zy9_d%E;Ft3OdTr>f5Q8CjuX*r`L&APsHmz9yXY|&I?kKZL8eQk4&6#|wy1>B0(P_; zl=%9Lc=`>?L^6gD<9IHEo@hyo?gNFDJ=f3VHcGmDib!QH=Q zl>7ct*@%^|%TJ?XC5qX5%k5~LWOYmG#HuNnIB}m*BJL<1>c@Lo#cUB$sr@2rJB%IQ zXdLGp`H3NFrQPLVLCb)Ytui=5??#5MntO^c_?-?8U!Lm3RZ|sziA0e21+Vp*?i}t_ z1hzL;IEuT%9n&Dhn2YOnv z62Sd7U`HyiQf}nQVIlLNSJd?HdF$r=R`YP8QR*1<-Z*Pg-jm7{cq9}+WTF!6`|9l& z6WN1VA->^jC9(HD%|}+vTGS6b2~11NZ#}adX{;oD}2L6IxN1y7qgs&Njzp{fz0@B(7yx zT6qRMKr&s~&fZ^86}KeSKbtU1shcYeOk|&p3TpV2=X%s&t{dFO(myiSF;RJwTP(CG-m){sh3KY2>1wr!^-fND2&Q)=71O_*$W`035d7P9p04kfJ z#s6ta7*bh43<(GX1Ot2kcK~jHPyi0_$FcBe)W0EqWh8{x&c_dTMp;c=LrWE{rlE;e z)toad0s@Z5^M4)S{}nCU-$gr*=?oFPDEGO$#p@aR0sTgJb|v8N zqKzYf<9uTt>PS)xb$9ZOkSCV%Fom52N3IvSTO-OVne(MIT9F|kwTMx^Q>UfE>98^D z*i4L^Ef*@_Ex<1V;G|xU!))6jj*;osIu0W?%RqC@`R?Iov7D^|Tq}kjB=y*dVjG4( zNl95P%@zzDaUmP!#@en-TkHb)t9;Ch>9(_XLrS+2e2>~nfTQ_XYPjH(WcDNL!A{Mo zYlihU!85>SiHgd}-Pj35`>VpL;VEC#%e-u~LY!Pw%FDkY9moX&+Xq4$PC#1j%SbW1 z?YHJsyO@LV`M3M+FCUt`A4p-%#^{<_-F9X%H={0=+!|%njnr>kPZMK{P{XslokYfd zdHa#1){BDR^{X4I7BRB|6-~MvE?e()n+M#U3Uoi(y&DK_DZ}|XXMOP+0!)bgocB`} zjn22d4IAD8(!}b8+%baELGdTH0aX|9yy6V}gjz22RE_Yf)VMFnV^s*+PfW7T&X+Sce6(4#G(JWnW(%PT7k#8qe?@Ei(H7VjE18>8v@&- zt!IP*pg)zRE8>IJuS%)e-)++q_FFxjU7_M~qj00I!(F3A8~$mvSiXI126?%E`>6qh zBsgek!5OU?=#P4Vkjx!uXX?vP79ErnRoI_PH~PyRWfa&uIkK7NEmd`XZrS$ur9Kep z;yPgWF&D(+SM;y!8f+b&!*rZRttHiG-S4J*P5GbnXs4Jy zT#a*!eH2LfbKnvzi4yimci2wkLOlPd>>u`YKq_uXJ?qEz)dXyH8s{dqJ8|ZQg{^@? z`_Aa^u!knmg$2&BkkExS;$6F7WCTA~fC|;BzK?r)s6&;M{>B3tg#Ds6sV3LvgYGRC z{;0Ut*xS<7W*G~I&C)dS` + + + + + / + /root.war + + + + + + + + + + + + + 600 + 1 + + + + + diff --git a/managed_vms/jetty9-gcloud-sessions/src/main/webapp/WEB-INF/logging.properties b/managed_vms/jetty9-gcloud-sessions/src/main/webapp/WEB-INF/logging.properties new file mode 100644 index 00000000000..e23a81e59d6 --- /dev/null +++ b/managed_vms/jetty9-gcloud-sessions/src/main/webapp/WEB-INF/logging.properties @@ -0,0 +1,13 @@ +# A default java.util.logging configuration. +# (All App Engine logging is through java.util.logging by default). +# +# To use this configuration, copy it into your application's WEB-INF +# folder and add the following to your appengine-web.xml: +# +# +# +# +# + +# Set the default logging level for all loggers to INFO +.level = INFO diff --git a/managed_vms/jetty9-gcloud-sessions/src/main/webapp/WEB-INF/web.xml b/managed_vms/jetty9-gcloud-sessions/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000000..1bc96c2187c --- /dev/null +++ b/managed_vms/jetty9-gcloud-sessions/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,55 @@ + + + + + + + secured-resource + /dump/auth/* + + + * + + + + + data-constraint + /dump/ssl/* + + CONFIDENTIAL + + + + data-constraint + /dump/auth/relax/* + + + + + DumpServlet + DumpServlet + com.google.appengine.demos.DumpServlet + + + DumpServlet + /dump/* + + + + index.html + + diff --git a/managed_vms/jetty9-gcloud-sessions/src/main/webapp/index.html b/managed_vms/jetty9-gcloud-sessions/src/main/webapp/index.html new file mode 100644 index 00000000000..3b9e0bf16d1 --- /dev/null +++ b/managed_vms/jetty9-gcloud-sessions/src/main/webapp/index.html @@ -0,0 +1,8 @@ +

Jetty9 GCloud Session Test Webapp

+This webapp demonstrates the use of the GCloud session manager with an +application deployed on the pure Jetty9 GAE image. + +The Dump Servlet can be used to see both the instance and +session used by each request. You can add request query parameters to the URI to +set session attributes, which should then be seen of subsequent reloads, no matter +which instance is hit.