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