diff --git a/managed_vms/cloudsql/.gitignore b/managed_vms/cloudsql/.gitignore
new file mode 100644
index 00000000000..ae3c1726048
--- /dev/null
+++ b/managed_vms/cloudsql/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/managed_vms/cloudsql/README.md b/managed_vms/cloudsql/README.md
new file mode 100644
index 00000000000..651570142a2
--- /dev/null
+++ b/managed_vms/cloudsql/README.md
@@ -0,0 +1,30 @@
+# Cloud SQL sample for Google Managed VMs
+This sample demonstrates how to use [Cloud SQL](https://cloud.google.com/sql/) on Google Managed VMs.
+
+## Setup
+Before you can run or deploy the sample, you will need to do the following:
+
+1. Create a [Second Generation Cloud SQL](https://cloud.google.com/sql/docs/create-instance) instance. You can do this from the [Cloud Console](https://console.developers.google.com) or via the [Cloud SDK](https://cloud.google.com/sdk). To create it via the SDK use the following command:
+
+ $ gcloud sql instances create YOUR_INSTANCE_NAME \
+ --activation-policy=ALWAYS \
+ --tier=db-n1-standard-1
+
+1. Set the root password on your Cloud SQL instance:
+
+ $ gcloud sql instances set-root-password YOUR_INSTANCE_NAME --password YOUR_INSTANCE_ROOT_PASSWORD
+
+1. Use the MySQL command line tools (or a management tool of your choice) to create a [new user](https://cloud.google.com/sql/docs/create-user) and [database](https://cloud.google.com/sql/docs/create-database) for your application:
+
+ $ mysql -h [IP Address of database] -u root -p
+ mysql> create database YOUR_DATABASE;
+ mysql> create user 'YOUR_USER'@'%' identified by 'PASSWORD';
+ mysql> grant all on YOUR_DATABASE.* to 'YOUR_USER'@'%';
+
+1. Set the connection string environment variable in src/main/appengine/app.yaml
+
+## Running locally
+ $ mvn clean jetty:run
+
+## Deploying
+ $ mvn clean gcloud:deploy
diff --git a/managed_vms/cloudsql/pom.xml b/managed_vms/cloudsql/pom.xml
new file mode 100644
index 00000000000..82888c62f07
--- /dev/null
+++ b/managed_vms/cloudsql/pom.xml
@@ -0,0 +1,85 @@
+
+
+
+ 4.0.0
+ war
+ 1.0-SNAPSHOT
+ com.example.managedvms
+ managed-vms-cloudsql
+
+
+ doc-samples
+ com.google.cloud
+ 1.0.0
+ ../..
+
+
+
+
+ javax.servlet
+ javax.servlet-api
+ 3.1.0
+ jar
+ provided
+
+
+
+ mysql
+ mysql-connector-java
+ 5.1.38
+
+
+ com.google.cloud.sql
+ mysql-socket-factory
+ 1.0.0-beta1
+
+
+
+
+
+ ${project.build.directory}/${project.build.finalName}/WEB-INF/classes
+
+
+ com.google.appengine
+ gcloud-maven-plugin
+ ${maven.plugin.version}
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ 2.6
+
+ false
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.3
+
+ 1.8
+ 1.8
+
+
+
+ org.eclipse.jetty
+ jetty-maven-plugin
+ 9.3.7.v20160115
+
+
+
+
diff --git a/managed_vms/cloudsql/src/main/appengine/app.yaml b/managed_vms/cloudsql/src/main/appengine/app.yaml
new file mode 100644
index 00000000000..876807c5037
--- /dev/null
+++ b/managed_vms/cloudsql/src/main/appengine/app.yaml
@@ -0,0 +1,27 @@
+# Copyright 2016 Google Inc. All Rights Reserved.
+#
+# Licensed 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.
+
+runtime: java
+vm: true
+
+handlers:
+- url: /.*
+ script: this field is required, but ignored
+ secure: always
+
+# [START env_variables]
+env_variables:
+ SQL_REMOTE_URL: jdbc:mysql://google/YOUR-DB-NAME?cloudSqlInstance=YOUR-INSTANCE-NAME&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=USERNAME&password=PASSWORD
+ SQL_LOCAL_URL: jdbc:mysql://localhost/YOUR-DB-NAME?user=YOUR-USERNAME&password=PASSWORD&useSSL=false
+# [END env_variables]
diff --git a/managed_vms/cloudsql/src/main/java/com/example/managedvms/cloudsql/CloudSqlServlet.java b/managed_vms/cloudsql/src/main/java/com/example/managedvms/cloudsql/CloudSqlServlet.java
new file mode 100644
index 00000000000..64cb9a7b737
--- /dev/null
+++ b/managed_vms/cloudsql/src/main/java/com/example/managedvms/cloudsql/CloudSqlServlet.java
@@ -0,0 +1,95 @@
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed 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 com.example.managedvms.cloudsql;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.util.Date;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+// [START example]
+@SuppressWarnings("serial")
+@WebServlet(name = "cloudsql", value = "")
+public class CloudSqlServlet extends HttpServlet {
+
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException,
+ ServletException {
+ // store only the first two octets of a users ip address
+ String userIp = req.getRemoteAddr();
+ InetAddress address = InetAddress.getByName(userIp);
+ if (address instanceof Inet6Address) {
+ // nest indexOf calls to find the second occurrence of a character in a
+ // string
+ // an alternative is to use Apache Commons Lang:
+ // StringUtils.ordinalIndexOf()
+ userIp = userIp.substring(0, userIp.indexOf(":", userIp.indexOf(":") + 1)) + ":*:*:*:*:*:*";
+ } else if (address instanceof Inet4Address) {
+ userIp = userIp.substring(0, userIp.indexOf(".", userIp.indexOf(".") + 1)) + ".*.*";
+ }
+
+ final String createTableSql = "CREATE TABLE IF NOT EXISTS visits ( visit_id INT NOT NULL "
+ + "AUTO_INCREMENT, user_ip VARCHAR(46) NOT NULL, timestamp DATETIME NOT NULL, "
+ + "PRIMARY KEY (visit_id) )";
+ final String createVisitSql = "INSERT INTO visits (user_ip, timestamp) VALUES (?, ?)";
+ final String selectSql = "SELECT user_ip, timestamp FROM visits ORDER BY timestamp DESC "
+ + "LIMIT 10";
+ PrintWriter out = resp.getWriter();
+ resp.setContentType("text/plain");
+ // Detect if running remotely or locally and select correct connection url
+ String url;
+ if (System.getenv().containsKey("GAE_MODULE_INSTANCE")) {
+ url = System.getenv("SQL_REMOTE_URL");
+ } else {
+ url = System.getenv("SQL_LOCAL_URL");
+ }
+
+ try (Connection conn = DriverManager.getConnection(url);
+ PreparedStatement statementCreateVisit = conn.prepareStatement(createVisitSql)) {
+ conn.createStatement().executeUpdate(createTableSql);
+ statementCreateVisit.setString(1, userIp);
+ statementCreateVisit.setTimestamp(2, new Timestamp(new Date().getTime()));
+ statementCreateVisit.executeUpdate();
+
+ try (ResultSet rs = conn.prepareStatement(selectSql).executeQuery()) {
+ out.print("Last 10 visits:\n");
+ while (rs.next()) {
+ String savedIp = rs.getString("user_ip");
+ String timeStamp = rs.getString("timestamp");
+ out.print("Time: " + timeStamp + " Addr: " + savedIp + "\n");
+ }
+ }
+ } catch (SQLException e) {
+ throw new ServletException("SQL error", e);
+ }
+ }
+}
+// [END example]
diff --git a/pom.xml b/pom.xml
index bb7bdb7d332..fa9f427db02 100644
--- a/pom.xml
+++ b/pom.xml
@@ -36,6 +36,7 @@
1.19.01.71.7
+ 2.0.9.111.v20160525
@@ -82,6 +83,7 @@
loggingmanaged_vms/analyticsmanaged_vms/async-rest
+ managed_vms/cloudsqlmanaged_vms/cloudstoragemanaged_vms/cronmanaged_vms/datastore