From bc64c469b0ac39643e4136d308e8af13cbfb4d28 Mon Sep 17 00:00:00 2001 From: Shun Fan Date: Wed, 8 Jun 2016 11:35:12 -0700 Subject: [PATCH 1/2] Add cloudsql gen2 managed vms sample --- managed_vms/cloudsql/.gitignore | 1 + managed_vms/cloudsql/README.md | 30 ++++++ managed_vms/cloudsql/pom.xml | 85 +++++++++++++++++ .../cloudsql/src/main/appengine/app.yaml | 27 ++++++ .../managedvms/cloudsql/CloudSqlServlet.java | 95 +++++++++++++++++++ pom.xml | 1 + 6 files changed, 239 insertions(+) create mode 100644 managed_vms/cloudsql/.gitignore create mode 100644 managed_vms/cloudsql/README.md create mode 100644 managed_vms/cloudsql/pom.xml create mode 100644 managed_vms/cloudsql/src/main/appengine/app.yaml create mode 100644 managed_vms/cloudsql/src/main/java/com/example/managedvms/cloudsql/CloudSqlServlet.java 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..39df8e843ae --- /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 + 2.0.9.106.v20160420 + + + 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..f771d5859b7 --- /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] \ No newline at end of file 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..ea4a0bde2c5 100644 --- a/pom.xml +++ b/pom.xml @@ -82,6 +82,7 @@ logging managed_vms/analytics managed_vms/async-rest + managed_vms/cloudsql managed_vms/cloudstorage managed_vms/cron managed_vms/datastore From 067a1f2705e8db0c9503642798679f5a9935657b Mon Sep 17 00:00:00 2001 From: Shun Fan Date: Wed, 8 Jun 2016 13:56:34 -0700 Subject: [PATCH 2/2] Fix formatting and versions in managed vms cloudsql --- managed_vms/cloudsql/pom.xml | 2 +- managed_vms/cloudsql/src/main/appengine/app.yaml | 2 +- pom.xml | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/managed_vms/cloudsql/pom.xml b/managed_vms/cloudsql/pom.xml index 39df8e843ae..82888c62f07 100644 --- a/managed_vms/cloudsql/pom.xml +++ b/managed_vms/cloudsql/pom.xml @@ -56,7 +56,7 @@ Copyright 2016 Google Inc. All Rights Reserved. com.google.appengine gcloud-maven-plugin - 2.0.9.106.v20160420 + ${maven.plugin.version} org.apache.maven.plugins diff --git a/managed_vms/cloudsql/src/main/appengine/app.yaml b/managed_vms/cloudsql/src/main/appengine/app.yaml index f771d5859b7..876807c5037 100644 --- a/managed_vms/cloudsql/src/main/appengine/app.yaml +++ b/managed_vms/cloudsql/src/main/appengine/app.yaml @@ -24,4 +24,4 @@ handlers: 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] \ No newline at end of file +# [END env_variables] diff --git a/pom.xml b/pom.xml index ea4a0bde2c5..fa9f427db02 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,7 @@ 1.19.0 1.7 1.7 + 2.0.9.111.v20160525