You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by za...@apache.org on 2013/10/08 21:54:00 UTC
git commit: Add examples for clouddatabases
https://issues.apache.org/jira/browse/JCLOUDS-108
Updated Branches:
refs/heads/master e383e4bfb -> e9dccd310
Add examples for clouddatabases https://issues.apache.org/jira/browse/JCLOUDS-108
Project: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/commit/e9dccd31
Tree: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/tree/e9dccd31
Diff: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/diff/e9dccd31
Branch: refs/heads/master
Commit: e9dccd310e0d8ab1308bf677a893dd7c2005f038
Parents: e383e4b
Author: zack-shoylev <za...@rackspace.com>
Authored: Mon Jun 3 18:50:05 2013 -0500
Committer: Zack Shoylev <za...@rackspace.com>
Committed: Tue Oct 8 14:53:18 2013 -0500
----------------------------------------------------------------------
rackspace/README.md | 8 +
rackspace/pom.xml | 15 +
.../jclouds/examples/rackspace/SmokeTest.java | 25 +-
.../rackspace/clouddatabases/Constants.java | 33 ++
.../clouddatabases/CreateDatabase.java | 111 +++++++
.../clouddatabases/CreateInstance.java | 107 +++++++
.../rackspace/clouddatabases/CreateUser.java | 110 +++++++
.../clouddatabases/DeleteDatabase.java | 110 +++++++
.../clouddatabases/DeleteInstance.java | 115 +++++++
.../rackspace/clouddatabases/DeleteUser.java | 110 +++++++
.../clouddatabases/GrantRootAccess.java | 107 +++++++
.../rackspace/clouddatabases/TestDatabase.java | 301 +++++++++++++++++++
12 files changed, 1146 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/blob/e9dccd31/rackspace/README.md
----------------------------------------------------------------------
diff --git a/rackspace/README.md b/rackspace/README.md
index 4025bfe..6491f81 100644
--- a/rackspace/README.md
+++ b/rackspace/README.md
@@ -63,6 +63,14 @@ The [clouddns package](https://github.com/jclouds/jclouds-examples/tree/master/r
* [CRUDReverseDNSRecords.java](https://github.com/jclouds/jclouds-examples/blob/master/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddns/CRUDReverseDNSRecords.java) - An example of creating a Cloud Server and a reverse DNS record (PTR) to go along with it.
* Other examples of creating, manipulating, listing, and deleting domains and records.
+The [clouddatabases package](https://github.com/jclouds/jclouds-examples/tree/master/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases) demonstrates how to accomplish common tasks for working with databases in the cloud.
+
+ * [CreateInstance.java](https://github.com/jclouds/jclouds-examples/blob/master/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateInstance.java) - An example of creating a database instance.
+ * [CreateDatabase.java](https://github.com/jclouds/jclouds-examples/blob/master/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateDatabase.java) - An example of creating a database on the database instance.
+ * [CreateUser.java](https://github.com/jclouds/jclouds-examples/blob/master/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateUser.java) - An example of creating a database user.
+ * [TestDatabase.java](https://github.com/jclouds/jclouds-examples/blob/master/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/TestDatabase.java) - An example of connecting to the database from the public Internet and making a simple request.
+ * Other examples include deleting instances, databases, and users, and granting root access.
+
## Command Line
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/blob/e9dccd31/rackspace/pom.xml
----------------------------------------------------------------------
diff --git a/rackspace/pom.xml b/rackspace/pom.xml
index 7a53c9a..705bec6 100644
--- a/rackspace/pom.xml
+++ b/rackspace/pom.xml
@@ -69,6 +69,11 @@
<artifactId>rackspace-cloudloadbalancers-us</artifactId>
<version>${jclouds.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.jclouds.labs</groupId>
+ <artifactId>rackspace-clouddatabases-us</artifactId>
+ <version>${jclouds.version}</version>
+ </dependency>
<!-- UK -->
<dependency>
<groupId>org.apache.jclouds.provider</groupId>
@@ -95,5 +100,15 @@
<artifactId>rackspace-cloudloadbalancers-uk</artifactId>
<version>${jclouds.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.jclouds.labs</groupId>
+ <artifactId>rackspace-clouddatabases-uk</artifactId>
+ <version>${jclouds.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ <version>5.1.25</version>
+ </dependency>
</dependencies>
</project>
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/blob/e9dccd31/rackspace/src/main/java/org/jclouds/examples/rackspace/SmokeTest.java
----------------------------------------------------------------------
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/SmokeTest.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/SmokeTest.java
index 6db3dab..d83b2e4 100644
--- a/rackspace/src/main/java/org/jclouds/examples/rackspace/SmokeTest.java
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/SmokeTest.java
@@ -6,9 +6,9 @@
* to you 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
@@ -18,15 +18,18 @@
*/
package org.jclouds.examples.rackspace;
+import java.io.IOException;
+
import org.jclouds.examples.rackspace.cloudblockstorage.*;
import org.jclouds.examples.rackspace.clouddns.*;
import org.jclouds.examples.rackspace.cloudfiles.*;
import org.jclouds.examples.rackspace.cloudloadbalancers.*;
import org.jclouds.examples.rackspace.cloudservers.*;
+import org.jclouds.examples.rackspace.clouddatabases.*;
/**
* This example smoke tests all of the other examples in these packages.
- *
+ *
* @author Everett Toews
*/
public class SmokeTest {
@@ -37,13 +40,14 @@ public class SmokeTest {
*
* The first argument (args[0]) must be your username
* The second argument (args[1]) must be your API key
+ * @throws IOException
*/
- public static void main(String[] args) {
+ public static void main(String[] args) throws IOException {
SmokeTest smokeTest = new SmokeTest();
smokeTest.smokeTest(args);
}
- private void smokeTest(String[] args) {
+ private void smokeTest(String[] args) throws IOException {
Authentication.main(args);
Logging.main(args);
@@ -81,7 +85,7 @@ public class SmokeTest {
CreateLoadBalancerWithNewServers.main(args);
DeleteServer.main(args);
DeleteLoadBalancers.main(args);
-
+
CreateDomains.main(args);
ListDomains.main(args);
UpdateDomains.main(args);
@@ -92,5 +96,14 @@ public class SmokeTest {
CRUDReverseDNSRecords.main(args);
DeleteServer.main(args);
DeleteDomains.main(args);
+
+ CreateInstance.main(args);
+ CreateDatabase.main(args);
+ CreateUser.main(args);
+ TestDatabase.main(args);
+ GrantRootAccess.main(args);
+ DeleteDatabase.main(args);
+ DeleteUser.main(args);
+ DeleteInstance.main(args);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/blob/e9dccd31/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/Constants.java
----------------------------------------------------------------------
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/Constants.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/Constants.java
new file mode 100644
index 0000000..e3a26ac
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/Constants.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.examples.rackspace.clouddatabases;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+/**
+ * Constants used by the Rackspace Examples.
+ *
+ * @author Zack Shoylev
+ */
+public interface Constants {
+ public static final String NAME = "jclouds-example";
+ public static final String PASSWORD = "0192j41dm311iaadjaoqpvplw";
+ public static final String ZONE = "DFW";
+ public static final String POLL_PERIOD_TWENTY_SECONDS = String.valueOf(SECONDS.toMillis(20));
+}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/blob/e9dccd31/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateDatabase.java
----------------------------------------------------------------------
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateDatabase.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateDatabase.java
new file mode 100644
index 0000000..beeba17
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateDatabase.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.examples.rackspace.clouddatabases;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.concurrent.TimeoutException;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.openstack.trove.v1.TroveApi;
+import org.jclouds.openstack.trove.v1.domain.Instance;
+import org.jclouds.openstack.trove.v1.features.DatabaseApi;
+import org.jclouds.openstack.trove.v1.features.InstanceApi;
+
+import com.google.common.io.Closeables;
+
+/**
+ * This example creates a MySQL database on a Cloud Databases instance.
+ * The instance is created in the CreateInstance example.
+ * Think of the instance as a type of server. Multiple databases can run on the same instance.
+ *
+ * @author Zack Shoylev
+ */
+public class CreateDatabase implements Closeable {
+ private TroveApi api;
+ private InstanceApi instanceApi;
+ private DatabaseApi databaseApi;
+
+ /**
+ * To get a username and API key see
+ * http://www.jclouds.org/documentation/quickstart/rackspace/
+ *
+ * The first argument (args[0]) must be your username.
+ * The second argument (args[1]) must be your API key.
+ * @throws IOException
+ */
+ public static void main(String[] args) throws IOException {
+
+ CreateDatabase createDatabase = new CreateDatabase();
+
+ try {
+ createDatabase.init(args);
+ Instance instance = createDatabase.getInstance();
+ createDatabase.createDatabase(instance);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ createDatabase.close();
+ }
+ }
+
+ private void init(String[] args) {
+ // The provider configures jclouds to use the Rackspace Cloud (US).
+ // To use the Rackspace Cloud (UK) set the provider to "rackspace-clouddatabases-uk".
+ String provider = "rackspace-clouddatabases-us";
+
+ String username = args[0];
+ String apiKey = args[1];
+
+ api = ContextBuilder.newBuilder(provider)
+ .credentials(username, apiKey)
+ .buildApi(TroveApi.class);
+
+ instanceApi = api.getInstanceApiForZone(Constants.ZONE);
+ databaseApi = api.getDatabaseApiForInstanceInZone(getInstance().getId(), Constants.ZONE);
+ }
+
+ /**
+ * @return Instance The Instance created in the CreateInstance example.
+ */
+ private Instance getInstance() {
+ for (Instance instance: instanceApi.list()) {
+ if (instance.getName().startsWith(Constants.NAME)) {
+ return instance;
+ }
+ }
+
+ throw new RuntimeException(Constants.NAME + " not found. Run the CreateInstance example first.");
+ }
+
+ private void createDatabase(Instance instance) throws TimeoutException {
+ System.out.println("Create Database");
+
+ boolean result = databaseApi.create(Constants.NAME);
+ System.out.println(" " + result);
+ }
+
+ /**
+ * Always close your service when you're done with it.
+ * @throws IOException
+ */
+ public void close() throws IOException {
+ Closeables.close(api, true);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/blob/e9dccd31/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateInstance.java
----------------------------------------------------------------------
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateInstance.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateInstance.java
new file mode 100644
index 0000000..3013a9c
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateInstance.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.examples.rackspace.clouddatabases;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.concurrent.TimeoutException;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.openstack.trove.v1.TroveApi;
+import org.jclouds.openstack.trove.v1.domain.Flavor;
+import org.jclouds.openstack.trove.v1.domain.Instance;
+import org.jclouds.openstack.trove.v1.features.FlavorApi;
+import org.jclouds.openstack.trove.v1.utils.TroveUtils;
+
+import com.google.common.collect.Iterables;
+import com.google.common.io.Closeables;
+
+/**
+ * This example creates a Cloud Databases instance.
+ * This instance will be used to run a database later on in the Create Database example.
+ *
+ * @author Zack Shoylev
+ */
+public class CreateInstance implements Closeable {
+ private TroveApi api;
+ private FlavorApi flavorApi;
+
+ /**
+ * To get a username and API key see
+ * http://www.jclouds.org/documentation/quickstart/rackspace/
+ *
+ * The first argument (args[0]) must be your username.
+ * The second argument (args[1]) must be your API key.
+ * @throws IOException
+ */
+ public static void main(String[] args) throws IOException {
+
+ CreateInstance createInstance = new CreateInstance();
+
+ try {
+ createInstance.init(args);
+ Flavor flavor = createInstance.getFlavor();
+ createInstance.createInstance(flavor);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ createInstance.close();
+ }
+ }
+
+ private void init(String[] args) {
+ // The provider configures jclouds to use the Rackspace Cloud (US).
+ // To use the Rackspace Cloud (UK) set the provider to "rackspace-clouddatabases-uk".
+ String provider = "rackspace-clouddatabases-us";
+
+ String username = args[0];
+ String apiKey = args[1];
+
+ api = ContextBuilder.newBuilder(provider)
+ .credentials(username, apiKey)
+ .buildApi(TroveApi.class);
+
+ flavorApi = api.getFlavorApiForZone(Constants.ZONE);
+ }
+
+ /**
+ * @return Flavor The first Flavor available.
+ */
+ private Flavor getFlavor() {
+ return Iterables.getFirst(flavorApi.list(), null);
+ }
+
+ private void createInstance(Flavor flavor) throws TimeoutException {
+ System.out.println("Create Instance for flavor: " + flavor.getId());
+
+ TroveUtils utils = new TroveUtils(api);
+ // This call will take a while - it ensures a working instance is created.
+ Instance instance = utils.getWorkingInstance(Constants.ZONE, Constants.NAME, "" + flavor.getId(), 1);
+
+ System.out.println(" " + instance);
+ }
+
+ /**
+ * Always close your service when you're done with it.
+ * @throws IOException
+ */
+ public void close() throws IOException {
+ Closeables.close(api, true);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/blob/e9dccd31/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateUser.java
----------------------------------------------------------------------
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateUser.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateUser.java
new file mode 100644
index 0000000..5c4553c
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/CreateUser.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.examples.rackspace.clouddatabases;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.concurrent.TimeoutException;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.openstack.trove.v1.TroveApi;
+import org.jclouds.openstack.trove.v1.domain.Instance;
+import org.jclouds.openstack.trove.v1.features.InstanceApi;
+import org.jclouds.openstack.trove.v1.features.UserApi;
+
+import com.google.common.io.Closeables;
+
+/**
+ * This example will create a User on the database created in the CreateDatabase example.
+ *
+ * @author Zack Shoylev
+ */
+public class CreateUser implements Closeable {
+ private TroveApi api;
+ private InstanceApi instanceApi;
+ private UserApi userApi;
+
+ /**
+ * To get a username and API key see
+ * http://www.jclouds.org/documentation/quickstart/rackspace/
+ *
+ * The first argument (args[0]) must be your username.
+ * The second argument (args[1]) must be your API key.
+ * @throws IOException
+ */
+ public static void main(String[] args) throws IOException {
+
+ CreateUser createUser = new CreateUser();
+
+ try {
+ createUser.init(args);
+ Instance instance = createUser.getInstance();
+ createUser.createUser(instance);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ createUser.close();
+ }
+ }
+
+ private void init(String[] args) {
+ // The provider configures jclouds to use the Rackspace Cloud (US).
+ // To use the Rackspace Cloud (UK) set the provider to "rackspace-clouddatabases-uk".
+ String provider = "rackspace-clouddatabases-us";
+
+ String username = args[0];
+ String apiKey = args[1];
+
+ api = ContextBuilder.newBuilder(provider)
+ .credentials(username, apiKey)
+ .buildApi(TroveApi.class);
+
+ instanceApi = api.getInstanceApiForZone(Constants.ZONE);
+ userApi = api.getUserApiForInstanceInZone(getInstance().getId(), Constants.ZONE);
+ }
+
+ /**
+ * @return Instance The Instance created in the CreateInstance example.
+ */
+ private Instance getInstance() {
+ for (Instance instance: instanceApi.list()) {
+ if (instance.getName().startsWith(Constants.NAME)) {
+ return instance;
+ }
+ }
+
+ throw new RuntimeException(Constants.NAME + " not found. Run the CreateInstance example first.");
+ }
+
+ private void createUser(Instance instance) throws TimeoutException {
+ System.out.println("Create User");
+
+ boolean result = userApi.create(Constants.NAME, Constants.PASSWORD, Constants.NAME);
+
+ System.out.println("Create user: " + result);
+ }
+
+ /**
+ * Always close your service when you're done with it.
+ * @throws IOException
+ */
+ public void close() throws IOException {
+ Closeables.close(api, true);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/blob/e9dccd31/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/DeleteDatabase.java
----------------------------------------------------------------------
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/DeleteDatabase.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/DeleteDatabase.java
new file mode 100644
index 0000000..e549e9c
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/DeleteDatabase.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.examples.rackspace.clouddatabases;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.concurrent.TimeoutException;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.examples.rackspace.cloudblockstorage.Constants;
+import org.jclouds.openstack.trove.v1.TroveApi;
+import org.jclouds.openstack.trove.v1.domain.Instance;
+import org.jclouds.openstack.trove.v1.features.DatabaseApi;
+import org.jclouds.openstack.trove.v1.features.InstanceApi;
+
+import com.google.common.io.Closeables;
+
+/**
+ * This example will delete the database created in the CreateDatabase example.
+ *
+ * @author Zack Shoylev
+ */
+public class DeleteDatabase implements Closeable {
+ private TroveApi api;
+ private InstanceApi instanceApi;
+ private DatabaseApi databaseApi;
+
+ /**
+ * To get a username and API key see
+ * http://www.jclouds.org/documentation/quickstart/rackspace/
+ *
+ * The first argument (args[0]) must be your username.
+ * The second argument (args[1]) must be your API key.
+ * @throws IOException
+ */
+ public static void main(String[] args) throws IOException {
+
+ DeleteDatabase deleteDatabase = new DeleteDatabase();
+
+ try {
+ deleteDatabase.init(args);
+ deleteDatabase.deleteDatabase(deleteDatabase.getInstance());
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ deleteDatabase.close();
+ }
+ }
+
+ private void init(String[] args) {
+ // The provider configures jclouds to use the Rackspace Cloud (US).
+ // To use the Rackspace Cloud (UK) set the provider to "rackspace-clouddatabases-uk".
+ String provider = "rackspace-clouddatabases-us";
+
+ String username = args[0];
+ String apiKey = args[1];
+
+ api = ContextBuilder.newBuilder(provider)
+ .credentials(username, apiKey)
+ .buildApi(TroveApi.class);
+
+ instanceApi = api.getInstanceApiForZone(Constants.ZONE);
+ databaseApi = api.getDatabaseApiForInstanceInZone(getInstance().getId(), Constants.ZONE);
+ }
+
+ /**
+ * @return Instance The Instance created in the CreateInstance example.
+ */
+ private Instance getInstance() {
+ for (Instance instance : instanceApi.list()) {
+ if (instance.getName().startsWith(Constants.NAME)) {
+ return instance;
+ }
+ }
+
+ throw new RuntimeException(Constants.NAME + " not found. Run the CreateInstance example first.");
+ }
+
+ private void deleteDatabase(Instance instance) throws TimeoutException {
+ System.out.println("Delete Database");
+
+ boolean result = databaseApi.delete(Constants.NAME);
+
+ System.out.println(" " + result);
+ }
+
+ /**
+ * Always close your service when you're done with it.
+ * @throws IOException
+ */
+ public void close() throws IOException {
+ Closeables.close(api, true);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/blob/e9dccd31/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/DeleteInstance.java
----------------------------------------------------------------------
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/DeleteInstance.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/DeleteInstance.java
new file mode 100644
index 0000000..d932f79
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/DeleteInstance.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.examples.rackspace.clouddatabases;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.concurrent.TimeoutException;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.examples.rackspace.cloudblockstorage.Constants;
+import org.jclouds.openstack.trove.v1.TroveApi;
+import org.jclouds.openstack.trove.v1.domain.Instance;
+import org.jclouds.openstack.trove.v1.features.InstanceApi;
+import org.jclouds.openstack.trove.v1.predicates.InstancePredicates;
+
+import com.google.common.io.Closeables;
+
+/**
+ * This example will delete the instance created in the CreateInstance example.
+ *
+ * @author Zack Shoylev
+ */
+public class DeleteInstance implements Closeable {
+ private TroveApi api;
+ private InstanceApi instanceApi;
+
+ /**
+ * To get a username and API key see
+ * http://www.jclouds.org/documentation/quickstart/rackspace/
+ *
+ * The first argument (args[0]) must be your username.
+ * The second argument (args[1]) must be your API key.
+ * @throws IOException
+ */
+ public static void main(String[] args) throws IOException {
+
+ DeleteInstance deleteInstance = new DeleteInstance();
+
+ try {
+ deleteInstance.init(args);
+ deleteInstance.deleteInstance(deleteInstance.getInstance());
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ deleteInstance.close();
+ }
+ }
+
+ private void init(String[] args) {
+ // The provider configures jclouds to use the Rackspace Cloud (US).
+ // To use the Rackspace Cloud (UK) set the provider to "rackspace-clouddatabases-uk".
+ String provider = "rackspace-clouddatabases-us";
+
+ String username = args[0];
+ String apiKey = args[1];
+
+ api = ContextBuilder.newBuilder(provider)
+ .credentials(username, apiKey)
+ .buildApi(TroveApi.class);
+
+ instanceApi = api.getInstanceApiForZone(Constants.ZONE);
+ }
+
+ /**
+ * @return Instance The Instance created in the CreateInstance example.
+ */
+ private Instance getInstance() {
+ for (Instance instance : instanceApi.list()) {
+ if (instance.getName().startsWith(Constants.NAME)) {
+ return instance;
+ }
+ }
+
+ throw new RuntimeException(Constants.NAME + " not found. Run the CreateInstance example first.");
+ }
+
+ private void deleteInstance(Instance instance) throws TimeoutException {
+ System.out.println("Delete Instance");
+
+ boolean result = instanceApi.delete(instance.getId());
+
+ // Wait for the instance to be deleted before moving on
+ // If you want to know what's happening during the polling, enable logging. See
+ // /jclouds-example/rackspace/src/main/java/org/jclouds/examples/rackspace/Logging.java
+ if (!InstancePredicates.awaitDeleted(instanceApi).apply(instance)) {
+ throw new TimeoutException("Timeout on instance: " + instance);
+ }
+
+ System.out.println(" " + result);
+ }
+
+ /**
+ * Always close your service when you're done with it.
+ * @throws IOException
+ */
+ public void close() throws IOException {
+ Closeables.close(api, true);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/blob/e9dccd31/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/DeleteUser.java
----------------------------------------------------------------------
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/DeleteUser.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/DeleteUser.java
new file mode 100644
index 0000000..861980b
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/DeleteUser.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.examples.rackspace.clouddatabases;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.concurrent.TimeoutException;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.examples.rackspace.cloudblockstorage.Constants;
+import org.jclouds.openstack.trove.v1.TroveApi;
+import org.jclouds.openstack.trove.v1.domain.Instance;
+import org.jclouds.openstack.trove.v1.features.InstanceApi;
+import org.jclouds.openstack.trove.v1.features.UserApi;
+
+import com.google.common.io.Closeables;
+
+/**
+ * This example will delete the User created in the CreateUser example.
+ *
+ * @author Zack Shoylev
+ */
+public class DeleteUser implements Closeable {
+ private TroveApi api;
+ private InstanceApi instanceApi;
+ private UserApi userApi;
+
+ /**
+ * To get a username and API key see
+ * http://www.jclouds.org/documentation/quickstart/rackspace/
+ *
+ * The first argument (args[0]) must be your username.
+ * The second argument (args[1]) must be your API key.
+ * @throws IOException
+ */
+ public static void main(String[] args) throws IOException {
+
+ DeleteUser deleteUser = new DeleteUser();
+
+ try {
+ deleteUser.init(args);
+ deleteUser.deleteUser(deleteUser.getInstance());
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ deleteUser.close();
+ }
+ }
+
+ private void init(String[] args) {
+ // The provider configures jclouds to use the Rackspace Cloud (US).
+ // To use the Rackspace Cloud (UK) set the provider to "rackspace-clouddatabases-uk".
+ String provider = "rackspace-clouddatabases-us";
+
+ String username = args[0];
+ String apiKey = args[1];
+
+ api = ContextBuilder.newBuilder(provider)
+ .credentials(username, apiKey)
+ .buildApi(TroveApi.class);
+
+ instanceApi = api.getInstanceApiForZone(Constants.ZONE);
+ userApi = api.getUserApiForInstanceInZone(getInstance().getId(), Constants.ZONE);
+ }
+
+ /**
+ * @return Instance The Instance created in the CreateInstance example.
+ */
+ private Instance getInstance() {
+ for (Instance instance : instanceApi.list()) {
+ if (instance.getName().startsWith(Constants.NAME)) {
+ return instance;
+ }
+ }
+
+ throw new RuntimeException(Constants.NAME + " not found. Run the CreateInstance example first.");
+ }
+
+ private void deleteUser(Instance instance) throws TimeoutException {
+ System.out.println("Delete User");
+
+ boolean result = userApi.delete(Constants.NAME);
+
+ System.out.println(" " + result);
+ }
+
+ /**
+ * Always close your service when you're done with it.
+ * @throws IOException
+ */
+ public void close() throws IOException {
+ Closeables.close(api, true);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/blob/e9dccd31/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/GrantRootAccess.java
----------------------------------------------------------------------
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/GrantRootAccess.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/GrantRootAccess.java
new file mode 100644
index 0000000..8859636
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/GrantRootAccess.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.examples.rackspace.clouddatabases;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.concurrent.TimeoutException;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.openstack.trove.v1.TroveApi;
+import org.jclouds.openstack.trove.v1.domain.Instance;
+import org.jclouds.openstack.trove.v1.features.InstanceApi;
+
+import com.google.common.io.Closeables;
+
+/**
+ * This example grants root permissions to the instance created in the CreateInstance example.
+ *
+ * @author Zack Shoylev
+ */
+public class GrantRootAccess implements Closeable {
+ private TroveApi api;
+ private InstanceApi instanceApi;
+
+ /**
+ * To get a username and API key see
+ * http://www.jclouds.org/documentation/quickstart/rackspace/
+ *
+ * The first argument (args[0]) must be your username.
+ * The second argument (args[1]) must be your API key.
+ * @throws IOException
+ */
+ public static void main(String[] args) throws IOException {
+
+ GrantRootAccess grantRootAccess = new GrantRootAccess();
+
+ try {
+ grantRootAccess.init(args);
+ Instance instance = grantRootAccess.getInstance();
+ grantRootAccess.grantRootAccess(instance);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ grantRootAccess.close();
+ }
+ }
+
+ private void init(String[] args) {
+ // The provider configures jclouds to use the Rackspace Cloud (US).
+ // To use the Rackspace Cloud (UK) set the provider to "rackspace-clouddatabases-uk".
+ String provider = "rackspace-clouddatabases-us";
+
+ String username = args[0];
+ String apiKey = args[1];
+
+ api = ContextBuilder.newBuilder(provider)
+ .credentials(username, apiKey)
+ .buildApi(TroveApi.class);
+
+ instanceApi = api.getInstanceApiForZone(Constants.ZONE);
+ }
+
+ /**
+ * @return Instance The Instance created in the CreateInstance example.
+ */
+ private Instance getInstance() {
+ for (Instance instance: instanceApi.list()) {
+ if (instance.getName().startsWith(Constants.NAME)) {
+ return instance;
+ }
+ }
+
+ throw new RuntimeException(Constants.NAME + " not found. Run the CreateInstance example first.");
+ }
+
+ private void grantRootAccess(Instance instance) throws TimeoutException {
+ System.out.println("Grant root access");
+
+ String password = instanceApi.enableRoot(getInstance().getId()); // enable root on the instance
+
+ System.out.println(" " + password);
+ }
+
+ /**
+ * Always close your service when you're done with it.
+ * @throws IOException
+ */
+ public void close() throws IOException {
+ Closeables.close(api, true);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-examples/blob/e9dccd31/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/TestDatabase.java
----------------------------------------------------------------------
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/TestDatabase.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/TestDatabase.java
new file mode 100644
index 0000000..a3cd4a1
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/clouddatabases/TestDatabase.java
@@ -0,0 +1,301 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.jclouds.examples.rackspace.clouddatabases;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.openstack.trove.v1.TroveApi;
+import org.jclouds.openstack.trove.v1.domain.Instance;
+import org.jclouds.openstack.trove.v1.features.InstanceApi;
+import org.jclouds.rackspace.cloudloadbalancers.v1.CloudLoadBalancersApi;
+import org.jclouds.rackspace.cloudloadbalancers.v1.domain.AddNode;
+import org.jclouds.rackspace.cloudloadbalancers.v1.domain.CreateLoadBalancer;
+import org.jclouds.rackspace.cloudloadbalancers.v1.domain.LoadBalancer;
+import org.jclouds.rackspace.cloudloadbalancers.v1.domain.Node;
+import org.jclouds.rackspace.cloudloadbalancers.v1.domain.VirtualIP;
+import org.jclouds.rackspace.cloudloadbalancers.v1.domain.VirtualIPWithId;
+import org.jclouds.rackspace.cloudloadbalancers.v1.features.LoadBalancerApi;
+import org.jclouds.rackspace.cloudloadbalancers.v1.predicates.LoadBalancerPredicates;
+
+import com.google.common.collect.Sets;
+import com.google.common.io.Closeables;
+import com.google.common.util.concurrent.Uninterruptibles;
+
+/**
+ * This example uses the already created database instance, database user, and database from the examples:
+ * CreateInstance, CreateDatabase, CreateUser
+ * This example will create a load balancer to allow public access to the database.
+ * The load balancer is only needed for public access - it is not needed when accessing the database from the rackspace network.
+ * For more information: http://www.rackspace.com/knowledge_center/article/public-vs-private-access
+ * The example connects to the database using JDBC over the load balancer and executes a simple command to confirm that the database is online.
+ *
+ * @author Zack Shoylev
+ */
+public class TestDatabase implements Closeable {
+ // private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(TestDatabase.class); // If you want to log instead of print
+ private CloudLoadBalancersApi clb;
+ private LoadBalancerApi lbApi;
+ private TroveApi api;
+ private InstanceApi instanceApi;
+
+ /**
+ * To get a username and API key see
+ * http://www.jclouds.org/documentation/quickstart/rackspace/
+ *
+ * The first argument (args[0]) must be your username.
+ * The second argument (args[1]) must be your API key.
+ * @throws IOException
+ */
+ public static void main(String[] args) throws IOException {
+
+ TestDatabase testDatabase = new TestDatabase();
+
+ try {
+ testDatabase.init(args);
+
+ Instance instance = testDatabase.getInstance();
+
+ Set<AddNode> addNodes = testDatabase.addNodesOfDatabaseInstances();
+ testDatabase.createLoadBalancer(addNodes);
+
+ boolean success;
+ do{
+ success = testDatabase.testDatabase(instance);
+ Uninterruptibles.sleepUninterruptibly(5, TimeUnit.SECONDS);
+ } while(!success);
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ testDatabase.close();
+ }
+ }
+
+ private void init(String[] args) {
+ // The provider configures jclouds to use the Rackspace Cloud (US).
+ // To use the Rackspace Cloud (UK) set the provider to "rackspace-cloudloadbalancers-uk"
+ String provider = "rackspace-cloudloadbalancers-us";
+
+ String username = args[0];
+ String apiKey = args[1];
+
+ clb = ContextBuilder.newBuilder(provider)
+ .credentials(username, apiKey)
+ .buildApi(CloudLoadBalancersApi.class);
+ lbApi = clb.getLoadBalancerApiForZone(Constants.ZONE);
+
+ // The provider configures jclouds to use the Rackspace Cloud (US).
+ // To use the Rackspace Cloud (UK) set the provider to "rackspace-clouddatabases-uk".
+ provider = "rackspace-clouddatabases-us";
+
+ api = ContextBuilder.newBuilder(provider)
+ .credentials(username, apiKey)
+ .buildApi(TroveApi.class);
+
+ instanceApi = api.getInstanceApiForZone(Constants.ZONE);
+ }
+
+ /**
+ * @return Instance The Instance created in the CreateInstance example.
+ */
+ private Instance getInstance() {
+ for (Instance instance: instanceApi.list()) {
+ if (instance.getName().startsWith(Constants.NAME)) {
+ return instanceApi.get(instance.getId());
+ }
+ }
+
+ throw new RuntimeException(Constants.NAME + " not found. Run the CreateInstance example first.");
+ }
+
+ /**
+ * @return Returns a set of a single cloud load balancer node that can be used to connect to the database from the public Internet
+ */
+ private Set<AddNode> addNodesOfDatabaseInstances() {
+ AddNode addNode01 = AddNode.builder()
+ .address(getInstance().getHostname())
+ .condition(Node.Condition.ENABLED)
+ .port(3306)
+ .build();
+
+ return Sets.newHashSet(addNode01);
+ }
+
+ /**
+ * Builds and executes the request to create a load balancer service using a set of nodes.
+ *
+ * @param addNodes The set of cloud load balancer nodes.
+ * @throws TimeoutException
+ */
+ private void createLoadBalancer(Set<AddNode> addNodes) throws TimeoutException {
+ System.out.println("Create Cloud Load Balancer");
+
+ CreateLoadBalancer createLB = CreateLoadBalancer.builder()
+ .name(Constants.NAME)
+ .protocol("MYSQL")
+ .port(3306)
+ .algorithm(LoadBalancer.Algorithm.RANDOM)
+ .nodes(addNodes)
+ .virtualIPType(VirtualIP.Type.PUBLIC)
+ .build();
+
+ // This will fail if the service cannot resolve the hostname of the database instance.
+ // This happens when the internal DNS record for the database hostname has not propagated yet. Just retry to fix.
+ LoadBalancer loadBalancer;
+ do {
+ loadBalancer = lbApi.create(createLB);
+ Uninterruptibles.sleepUninterruptibly(30, TimeUnit.SECONDS);
+ } while(loadBalancer == null);
+
+
+ // Wait for the Load Balancer to become Active before moving on.
+ // If you want to know what's happening during the polling, enable logging. See
+ // /jclouds-example/rackspace/src/main/java/org/jclouds/examples/rackspace/Logging.java
+ // Even when the load balancer returns active, it might take a while before connections to the database are possible.
+ if (!LoadBalancerPredicates.awaitAvailable(lbApi).apply(loadBalancer)) {
+ throw new TimeoutException("Timeout on loadBalancer: " + loadBalancer);
+ }
+
+ System.out.println(" " + loadBalancer);
+ System.out.println(" Go to http://" + getVirtualIPv4(loadBalancer.getVirtualIPs()));
+ }
+
+ private String getVirtualIPv4(Set<VirtualIPWithId> set) {
+ for (VirtualIPWithId virtualIP: set) {
+ if (virtualIP.getType().equals(VirtualIP.Type.PUBLIC) &&
+ virtualIP.getIpVersion().equals(VirtualIP.IPVersion.IPV4)) {
+ return virtualIP.getAddress();
+ }
+ }
+
+ throw new RuntimeException("Public IPv4 address not found.");
+ }
+
+ /**
+ * @return LoadBalancer The LoadBalancer created in this example.
+ */
+ private LoadBalancer getLb() {
+ for (LoadBalancer ls : lbApi.list().concat()) {
+ if (ls.getName().startsWith(Constants.NAME)) {
+ return ls;
+ }
+ }
+
+ throw new RuntimeException(Constants.NAME + " not found. Run the CreateInstance example first.");
+ }
+
+ /**
+ * Connects to the database using JDBC over the load balancer and executes a simple query without creating a database table.
+ * This will verify that the database engine is running on the remote instance.
+ *
+ * @param instance The database instance to test against.
+ * @return true if connection successful and database engine responsive.
+ * @throws TimeoutException
+ */
+ private boolean testDatabase(Instance instance) throws TimeoutException {
+ System.out.println("Connect to database");
+
+ // See http://dev.mysql.com/doc/refman/5.6/en/connector-j-examples.html
+ Connection conn = null;
+ try {
+ StringBuilder connString = new StringBuilder();
+ connString.append( "jdbc:mysql://" ); // Begin building the JDBC connection string by specifying the database type.
+ connString.append( getVirtualIPv4(getLb().getVirtualIPs()) ); // IPv4 of cloud load balancer that will be used to connect to the database
+ connString.append("/");
+ connString.append(Constants.NAME); // Database name
+ connString.append("?user=");
+ connString.append(Constants.NAME); // User name
+ connString.append("&password=");
+ connString.append(Constants.PASSWORD); // Database user password
+
+ System.out.println("Connecting to " + connString);
+
+ conn = DriverManager.getConnection(connString.toString());
+
+ Statement stmt = null;
+ ResultSet rs = null;
+
+ try {
+ stmt = conn.createStatement();
+ rs = stmt.executeQuery("SELECT 3+5"); // A simple query that tests the engine but creates no tables and is fairly fast.
+ rs.first();
+ System.out.println("3+5 is " + rs.getInt(1));
+ } catch (SQLException e){
+ // handle any errors
+ System.out.println("SQLException: " + e.getMessage());
+ System.out.println("SQLState: " + e.getSQLState());
+ System.out.println("VendorError: " + e.getErrorCode());
+ e.printStackTrace();
+ return false;
+ } finally {
+ // Release resources in reverse order of creation.
+
+ if (rs != null) {
+ try {
+ rs.close();
+ } catch (SQLException sqlEx) { } // Ignore - you might get an exception if closing out of order.
+
+ rs = null;
+ }
+
+ if (stmt != null) {
+ try {
+ stmt.close();
+ } catch (SQLException sqlEx) { } // Ignore - you might get an exception if closing out of order.
+
+ stmt = null;
+ }
+
+ if(conn != null)
+ try {
+ conn.close();
+ } catch (SQLException sqlEx) { } // Ignore - rare bugs not necessarily related to a specific database.
+ }
+ } catch (SQLException e) {
+ // handle any errors
+ System.out.println("SQLException: " + e.getMessage());
+ System.out.println("SQLState: " + e.getSQLState());
+ System.out.println("VendorError: " + e.getErrorCode());
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Always close your service when you're done with it.
+ * @throws IOException
+ */
+ public void close() throws IOException {
+ if(lbApi != null) {
+ lbApi.delete(getLb().getId());
+ }
+ Closeables.close(api, true);
+ Closeables.close(clb, true);
+ }
+}