You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by jd...@apache.org on 2014/06/20 20:11:47 UTC
git commit: JCLOUDS-455: Add get() method to KeyPairApi
Repository: jclouds
Updated Branches:
refs/heads/master b0250cfb4 -> da50cd6cb
JCLOUDS-455: Add get() method to KeyPairApi
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/da50cd6c
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/da50cd6c
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/da50cd6c
Branch: refs/heads/master
Commit: da50cd6cbe09a57e7453bed7ae523fb61e4343b8
Parents: b0250cf
Author: Jeremy Daggett <je...@rackspace.com>
Authored: Mon Jun 2 10:23:46 2014 -0700
Committer: Jeremy Daggett <jd...@apache.org>
Committed: Fri Jun 20 11:11:30 2014 -0700
----------------------------------------------------------------------
.../nova/v2_0/extensions/KeyPairApi.java | 32 +++++++++++-----
.../nova/v2_0/extensions/KeyPairAsyncApi.java | 25 ++++++++-----
.../v2_0/extensions/KeyPairApiExpectTest.java | 39 +++++++++++++++++++-
.../v2_0/extensions/KeyPairApiLiveTest.java | 38 ++++++++++++-------
.../nova/v2_0/parse/ParseKeyPairTest.java | 5 ++-
.../src/test/resources/keypair_created.json | 9 -----
.../src/test/resources/keypair_details.json | 9 +++++
7 files changed, 112 insertions(+), 45 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/da50cd6c/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApi.java
index 5b861fd..41818b5 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApi.java
@@ -24,7 +24,7 @@ import com.google.common.annotations.Beta;
import com.google.common.collect.FluentIterable;
/**
- * Provides synchronous access to Security Groups.
+ * Provides synchronous access to the OpenStack Nova Key Pair Extension API.
* <p/>
*
* @see KeyPairAsyncApi
@@ -34,30 +34,44 @@ import com.google.common.collect.FluentIterable;
public interface KeyPairApi {
/**
- * List all Key Pairs.
+ * Lists all Key Pairs.
*
* @return all Key Pairs
*/
- FluentIterable<? extends KeyPair> list();
+ FluentIterable<KeyPair> list();
/**
- * Create a Key Pair.
+ * Creates a {@link KeyPair}.
*
- * @return a Key Pair
+ * @return the created {@link KeyPair}.
*/
KeyPair create(String name);
+
/**
- * Create a Key Pair with a public key.
+ * Creates a {@link KeyPair} with a public key.
*
- * @return a Key Pair with a public key.
+ * @return the created {@link KeyPair}.
*/
KeyPair createWithPublicKey(String name, String publicKey);
/**
- * Delete a Key Pairs.
+ * Gets a specific {@link KeyPair} by name.
+ *
+ * @param name
+ * the name of the {@link KeyPair}
+ *
+ * @return the specified {@link KeyPair}, otherwise null.
+ */
+ KeyPair get(String name);
+
+ /**
+ * Deletes a {@link KeyPair}.
+ *
+ * @param name
+ * the name of the {@link KeyPair}
*
- * @return
+ * @return {@code true} if the {@link KeyPair} was deleted, otherwise {@code false}.
*/
boolean delete(String name);
http://git-wip-us.apache.org/repos/asf/jclouds/blob/da50cd6c/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairAsyncApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairAsyncApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairAsyncApi.java
index 5a9bcc2..8e5c20a 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairAsyncApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairAsyncApi.java
@@ -28,6 +28,8 @@ import javax.ws.rs.core.MediaType;
import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
import org.jclouds.Fallbacks.FalseOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.javax.annotation.Nullable;
import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
import org.jclouds.openstack.nova.v2_0.binders.BindKeyPairToJsonPayload;
import org.jclouds.openstack.nova.v2_0.domain.KeyPair;
@@ -47,16 +49,10 @@ import com.google.common.collect.FluentIterable;
import com.google.common.util.concurrent.ListenableFuture;
/**
- * Provides asynchronous access to Key Pairs via the REST API.
+ * Provides asynchronous access to the OpenStack Nova Key Pair Extension API.
* <p/>
*
* @see KeyPairApi
- * @see ExtensionAsyncApi
- * @see <a href=
- * "http://docs.openstack.org/api/openstack-compute/2/content/Extensions-d1e1444.html"
- * />
- * @see <a href="http://nova.openstack.org/api_ext" />
- * @see <a href="http://nova.openstack.org/api_ext/ext_keypairs.html" />
*/
@Beta
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.KEYPAIRS)
@@ -69,7 +65,7 @@ public interface KeyPairAsyncApi {
@ResponseParser(ParseKeyPairs.class)
@Consumes(MediaType.APPLICATION_JSON)
@Fallback(EmptyFluentIterableOnNotFoundOr404.class)
- ListenableFuture<? extends FluentIterable<? extends KeyPair>> list();
+ ListenableFuture<FluentIterable<KeyPair>> list();
@Named("keypair:create")
@POST
@@ -78,7 +74,16 @@ public interface KeyPairAsyncApi {
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Payload("%7B\"keypair\":%7B\"name\":\"{name}\"%7D%7D")
- ListenableFuture<? extends KeyPair> create(@PayloadParam("name") String name);
+ ListenableFuture<KeyPair> create(@PayloadParam("name") String name);
+
+ @Named("keypair:get")
+ @GET
+ @Path("/os-keypairs/{name}")
+ @SelectJson("keypair")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Fallback(NullOnNotFoundOr404.class)
+ @Nullable
+ ListenableFuture<KeyPair> get(@PathParam("name") String name);
@Named("keypair:create")
@POST
@@ -87,7 +92,7 @@ public interface KeyPairAsyncApi {
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@MapBinder(BindKeyPairToJsonPayload.class)
- ListenableFuture<? extends KeyPair> createWithPublicKey(@PayloadParam("name") String name,
+ ListenableFuture<KeyPair> createWithPublicKey(@PayloadParam("name") String name,
@PayloadParam("public_key") String publicKey);
@Named("keypair:delete")
http://git-wip-us.apache.org/repos/asf/jclouds/blob/da50cd6c/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApiExpectTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApiExpectTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApiExpectTest.java
index 6ea6813..a9d362c 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApiExpectTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApiExpectTest.java
@@ -18,6 +18,7 @@ package org.jclouds.openstack.nova.v2_0.extensions;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertNull;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
@@ -84,7 +85,7 @@ public class KeyPairApiExpectTest extends BaseNovaApiExpectTest {
.build();
HttpResponse createResponse = HttpResponse.builder().statusCode(200)
- .payload(payloadFromResource("/keypair_created.json")).build();
+ .payload(payloadFromResource("/keypair_details.json")).build();
NovaApi apiWhenServersExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, create, createResponse);
@@ -107,7 +108,7 @@ public class KeyPairApiExpectTest extends BaseNovaApiExpectTest {
"application/json")).build();
HttpResponse createResponse = HttpResponse.builder().statusCode(200)
- .payload(payloadFromResource("/keypair_created.json")).build();
+ .payload(payloadFromResource("/keypair_details.json")).build();
NovaApi apiWhenServersExist = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, create, createResponse);
@@ -137,4 +138,38 @@ public class KeyPairApiExpectTest extends BaseNovaApiExpectTest {
assertTrue(apiWhenServersExist.getKeyPairExtensionForZone("az-1.region-a.geo-1").get().delete("testkeypair"));
}
+
+ public void testGetKeyPairWhenResponseIs2xx() throws Exception {
+ HttpRequest get = HttpRequest
+ .builder()
+ .method("GET")
+ .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-keypairs/testkeypair")
+ .addHeader("Accept", "application/json")
+ .addHeader("X-Auth-Token", authToken).build();
+
+ HttpResponse getResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/keypair_details.json")).build();
+
+ NovaApi apiWhenKeyPairExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, get, getResponse);
+
+ assertEquals(apiWhenKeyPairExists.getKeyPairExtensionForZone("az-1.region-a.geo-1").get().get("testkeypair"),
+ new ParseKeyPairTest().expected());
+ }
+
+ public void testGetKeyPairWhenResponseIs404() throws Exception {
+ HttpRequest get = HttpRequest
+ .builder()
+ .method("GET")
+ .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/os-keypairs/testkeypair")
+ .addHeader("Accept", "application/json")
+ .addHeader("X-Auth-Token", authToken).build();
+
+ HttpResponse getResponse = HttpResponse.builder().statusCode(404).build();
+
+ NovaApi apiWhenNoKeyPairExists = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
+ responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, get, getResponse);
+
+ assertNull(apiWhenNoKeyPairExists.getKeyPairExtensionForZone("az-1.region-a.geo-1").get().get("testkeypair"));
+ }
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/da50cd6c/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApiLiveTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApiLiveTest.java
index f545ab6..4edfed8 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApiLiveTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApiLiveTest.java
@@ -16,6 +16,7 @@
*/
package org.jclouds.openstack.nova.v2_0.extensions;
+import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import org.jclouds.openstack.nova.v2_0.domain.KeyPair;
@@ -25,11 +26,14 @@ import org.testng.annotations.Test;
import com.google.common.collect.FluentIterable;
/**
- * Tests behavior of {@code KeyPairApi}
+ * Tests live behavior of {@code KeyPairApi}
*/
@Test(groups = "live", testName = "KeyPairApiLiveTest")
public class KeyPairApiLiveTest extends BaseNovaApiLiveTest {
+ final String KEYPAIR_NAME = "testkp";
+ final String PUBLIC_KEY = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCrrBREFxz3002l1HuXz0+UOdJQ/mOYD5DiJwwB/TOybwIKQJPOxJWA9gBoo4k9dthTKBTaEYbzrll7iZcp59E80S6mNiAr3mUgi+x5Y8uyXeJ2Ws+h6peVyFVUu9epkwpcTd1GVfdcVWsTajwDz9+lxCDhl0RZKDFoT0scTxbj/w== nova@nv-aw2az2-api0002";
+
public void testListKeyPairs() throws Exception {
for (String zoneId : api.getConfiguredZones()) {
KeyPairApi keyPairApi = api.getKeyPairExtensionForZone(zoneId).get();
@@ -38,16 +42,20 @@ public class KeyPairApiLiveTest extends BaseNovaApiLiveTest {
}
}
- public void testCreateAndDeleteKeyPair() throws Exception {
- final String KEYPAIR_NAME = "testkp";
+ public void testCreateAndGetAndDeleteKeyPair() throws Exception {
for (String zoneId : api.getConfiguredZones()) {
KeyPairApi keyPairApi = api.getKeyPairExtensionForZone(zoneId).get();
- KeyPair keyPair = null;
+ KeyPair createdKeyPair = null;
try {
- keyPair = keyPairApi.create(KEYPAIR_NAME);
- assertNotNull(keyPair);
+ createdKeyPair = keyPairApi.create(KEYPAIR_NAME);
+ assertNotNull(createdKeyPair);
+
+ KeyPair keyPair = keyPairApi.get(KEYPAIR_NAME);
+ assertEquals(keyPair.getName(), createdKeyPair.getName());
+ assertEquals(keyPair.getFingerprint(), createdKeyPair.getFingerprint());
+ assertEquals(keyPair.getPublicKey(), createdKeyPair.getPublicKey());
} finally {
- if (keyPair != null) {
+ if (createdKeyPair != null) {
keyPairApi.delete(KEYPAIR_NAME);
}
}
@@ -55,17 +63,19 @@ public class KeyPairApiLiveTest extends BaseNovaApiLiveTest {
}
public void testCreateAndDeleteKeyPairWithPublicKey() throws Exception {
- final String KEYPAIR_NAME = "testkp";
- final String PUBLIC_KEY = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCrrBREFxz3002l1HuXz0+UOdJQ/mOYD5DiJwwB/TOybwIKQJPOxJWA9gBoo4k9dthTKBTaEYbzrll7iZcp59E80S6mNiAr3mUgi+x5Y8uyXeJ2Ws+h6peVyFVUu9epkwpcTd1GVfdcVWsTajwDz9+lxCDhl0RZKDFoT0scTxbj/w== nova@nv-aw2az2-api0002";
-
for (String zoneId : api.getConfiguredZones()) {
KeyPairApi keyPairApi = api.getKeyPairExtensionForZone(zoneId).get();
- KeyPair keyPair = null;
+ KeyPair createdKeyPair = null;
try {
- keyPair = keyPairApi.createWithPublicKey(KEYPAIR_NAME, PUBLIC_KEY);
- assertNotNull(keyPair);
+ createdKeyPair = keyPairApi.createWithPublicKey(KEYPAIR_NAME, PUBLIC_KEY);
+ assertNotNull(createdKeyPair);
+
+ KeyPair keyPair = keyPairApi.get(KEYPAIR_NAME);
+ assertEquals(keyPair.getName(), createdKeyPair.getName());
+ assertEquals(keyPair.getFingerprint(), createdKeyPair.getFingerprint());
+ assertEquals(keyPair.getPublicKey(), createdKeyPair.getPublicKey());
} finally {
- if (keyPair != null) {
+ if (createdKeyPair != null) {
keyPairApi.delete(KEYPAIR_NAME);
}
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/da50cd6c/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseKeyPairTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseKeyPairTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseKeyPairTest.java
index 2d7bb13..02dac16 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseKeyPairTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseKeyPairTest.java
@@ -29,12 +29,15 @@ import org.testng.annotations.Test;
import com.google.inject.Guice;
import com.google.inject.Injector;
+/**
+ * Tests parsing of a {@link KeyPair}.
+ */
@Test(groups = "unit", testName = "ParseKeyPairTest")
public class ParseKeyPairTest extends BaseItemParserTest<KeyPair> {
@Override
public String resource() {
- return "/keypair_created.json";
+ return "/keypair_details.json";
}
@Override
http://git-wip-us.apache.org/repos/asf/jclouds/blob/da50cd6c/apis/openstack-nova/src/test/resources/keypair_created.json
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/resources/keypair_created.json b/apis/openstack-nova/src/test/resources/keypair_created.json
deleted file mode 100644
index 188f929..0000000
--- a/apis/openstack-nova/src/test/resources/keypair_created.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "keypair": {
- "public_key": "ssh-rsa AAAXB3NzaC1yc2EAAAADAQABAAAAgQDFNyGjgs6c9akgmZ2ou/fJf7Pdrc23hC95/gM/33OrG4GZABACE4DTioa/PGN+7rHv9YUavUCtXrWayhGniKq/wCuI5fo5TO4AmDNv7/sCGHIHFumADSIoLx0vFhGJIetXEWxL9r0lfFC7//6yZM2W3KcGjbMtlPXqBT9K9PzdyQ== nova@nv-aw2az1-api0001\n",
- "private_key": "-----BEGIN RSA PRIVATE KEY-----\nMIICXQIAAAKBgQDFNyGjgs6c9akgmZ2ou/fJf7Pdrc23hC95/gM/33OrG4GZABAC\nE4DTioa/PGN+7rHv9YUavUCtXrWayhGniKq/wCuI5fo5TO4AmDNv7/sCGHIHFumA\nDSIoLx0vFhGJIetXEWxL9r0lfFC7//6yZM2W3KcGjbMtlPXqBT9K9PzdyQIDAQAB\nAoGAW8Ww+KbpQK8smcgCTr/RqcmsSI8VeL2hXjJvDq0L5WbyYuFdkanDvCztUVZn\nsmyfDtwAqZXB4Ct/dN1tY7m8QpdyRaKRW4Q+hghGCAQpsG7rYDdvwdEyvMaW5RA4\ntucQyajMNyQ/tozU3wMx/v8A7RvGcE9tqoG0WK1C3kBu95UCQQDrOd+joYDkvccz\nFIVu5gNPMXEh3fGGzDxk225UlvESquYLzfz4TfmuUjH4Z1BL3wRiwfJsrrjFkm33\njIidDE8PAkEA1qHjxuaIS1yz/rfzErmcOVNlbFHMP4ihjGTTvh1ZctXlNeLwzENQ\nEDaQV3IpUY1KQR6rxcWb5AXgfF9D9PYFpwJBANucAqGAbRgh3lJgPFtXP4u2O0tF\nLPOOxmvbOdybt6KYD4LB5AXmts77SlACFMNhCXUyYaT6UuOSXDyb5gfJsB0CQQC3\nFaGXKU9Z+doQjhlq/6mjvN/nZl80Uvh7Kgb1RVPoAU1kihGeLE0/h0vZTCiyyDNv\nGRqtucMg32J+tUTi0HpBAkAwHiCZMHMeJWHUwIwlRQY/dnR86FWobRl98ViF2rCL\nDHkDVOeIser3Q6zSqU5/m99lX6an5g8pAh/R5LqnOQZC\n-----END RSA PRIVATE KEY-----\n",
- "user_id": "65649731189278",
- "name": "testkeypair",
- "fingerprint": "d2:1f:c9:2b:d8:90:77:5f:15:64:27:e3:9f:77:1d:e4"
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/jclouds/blob/da50cd6c/apis/openstack-nova/src/test/resources/keypair_details.json
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/resources/keypair_details.json b/apis/openstack-nova/src/test/resources/keypair_details.json
new file mode 100644
index 0000000..188f929
--- /dev/null
+++ b/apis/openstack-nova/src/test/resources/keypair_details.json
@@ -0,0 +1,9 @@
+{
+ "keypair": {
+ "public_key": "ssh-rsa AAAXB3NzaC1yc2EAAAADAQABAAAAgQDFNyGjgs6c9akgmZ2ou/fJf7Pdrc23hC95/gM/33OrG4GZABACE4DTioa/PGN+7rHv9YUavUCtXrWayhGniKq/wCuI5fo5TO4AmDNv7/sCGHIHFumADSIoLx0vFhGJIetXEWxL9r0lfFC7//6yZM2W3KcGjbMtlPXqBT9K9PzdyQ== nova@nv-aw2az1-api0001\n",
+ "private_key": "-----BEGIN RSA PRIVATE KEY-----\nMIICXQIAAAKBgQDFNyGjgs6c9akgmZ2ou/fJf7Pdrc23hC95/gM/33OrG4GZABAC\nE4DTioa/PGN+7rHv9YUavUCtXrWayhGniKq/wCuI5fo5TO4AmDNv7/sCGHIHFumA\nDSIoLx0vFhGJIetXEWxL9r0lfFC7//6yZM2W3KcGjbMtlPXqBT9K9PzdyQIDAQAB\nAoGAW8Ww+KbpQK8smcgCTr/RqcmsSI8VeL2hXjJvDq0L5WbyYuFdkanDvCztUVZn\nsmyfDtwAqZXB4Ct/dN1tY7m8QpdyRaKRW4Q+hghGCAQpsG7rYDdvwdEyvMaW5RA4\ntucQyajMNyQ/tozU3wMx/v8A7RvGcE9tqoG0WK1C3kBu95UCQQDrOd+joYDkvccz\nFIVu5gNPMXEh3fGGzDxk225UlvESquYLzfz4TfmuUjH4Z1BL3wRiwfJsrrjFkm33\njIidDE8PAkEA1qHjxuaIS1yz/rfzErmcOVNlbFHMP4ihjGTTvh1ZctXlNeLwzENQ\nEDaQV3IpUY1KQR6rxcWb5AXgfF9D9PYFpwJBANucAqGAbRgh3lJgPFtXP4u2O0tF\nLPOOxmvbOdybt6KYD4LB5AXmts77SlACFMNhCXUyYaT6UuOSXDyb5gfJsB0CQQC3\nFaGXKU9Z+doQjhlq/6mjvN/nZl80Uvh7Kgb1RVPoAU1kihGeLE0/h0vZTCiyyDNv\nGRqtucMg32J+tUTi0HpBAkAwHiCZMHMeJWHUwIwlRQY/dnR86FWobRl98ViF2rCL\nDHkDVOeIser3Q6zSqU5/m99lX6an5g8pAh/R5LqnOQZC\n-----END RSA PRIVATE KEY-----\n",
+ "user_id": "65649731189278",
+ "name": "testkeypair",
+ "fingerprint": "d2:1f:c9:2b:d8:90:77:5f:15:64:27:e3:9f:77:1d:e4"
+ }
+}
\ No newline at end of file