From 8296d47e96990389e9504304a1ee561c7565bc5b Mon Sep 17 00:00:00 2001 From: Jeremy Daggett Date: Tue, 28 Feb 2012 09:24:29 -0800 Subject: [PATCH] FloatingIP and KeyPair additions --- .../nova/v1_1/domain/FloatingIP.java | 9 +- .../openstack/nova/v1_1/domain/KeyPair.java | 125 ++++++++++++++++++ .../v1_1/features/FloatingIPAsyncClient.java | 24 ++++ .../nova/v1_1/features/FloatingIPClient.java | 23 ++++ .../v1_1/features/KeyPairAsyncClient.java | 88 ++++++++++++ .../nova/v1_1/features/KeyPairClient.java | 66 +++++++++ .../features/FloatingIPClientLiveTest.java | 32 ----- .../src/test/resources/keypair_created.json | 9 ++ .../src/test/resources/keypair_list.json | 18 +++ 9 files changed, 360 insertions(+), 34 deletions(-) create mode 100644 labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/KeyPair.java create mode 100644 labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/KeyPairAsyncClient.java create mode 100644 labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/KeyPairClient.java create mode 100644 labs/openstack-nova/src/test/resources/keypair_created.json create mode 100644 labs/openstack-nova/src/test/resources/keypair_list.json diff --git a/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/FloatingIP.java b/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/FloatingIP.java index b1c945b4f5..ebbbe6eb82 100644 --- a/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/FloatingIP.java +++ b/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/FloatingIP.java @@ -31,7 +31,7 @@ import com.google.gson.annotations.SerializedName; * @author Jeremy Daggett * @author chamerling */ -public class FloatingIP { +public class FloatingIP implements Comparable { public static Builder builder() { return new Builder(); } @@ -108,6 +108,11 @@ public class FloatingIP { return this.fixedIp; } + @Override + public int compareTo(FloatingIP o) { + return this.id.compareTo(o.getId()); + } + @Override public int hashCode() { final int prime = 31; @@ -157,5 +162,5 @@ public class FloatingIP { return toStringHelper("").add("id", id).add("ip", ip) .add("fixedIp", fixedIp).add("instanceId", instanceId).toString(); } - + } diff --git a/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/KeyPair.java b/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/KeyPair.java new file mode 100644 index 0000000000..8deb6529b5 --- /dev/null +++ b/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/KeyPair.java @@ -0,0 +1,125 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds 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.openstack.nova.v1_1.domain; + +import static com.google.common.base.Objects.toStringHelper; + +import org.jclouds.javax.annotation.Nullable; + +import com.google.gson.annotations.SerializedName; + +public class KeyPair { + public static Builder builder() { + return new Builder(); + } + + public Builder toBuilder() { + return builder().fromKeyPair(this); + } + + public static class Builder { + + private String publicKey; + private String privateKey; + private String userId; + private String name; + private String fingerprint; + + public Builder publicKey(String publicKey) { + this.publicKey = publicKey; + return this; + } + + public Builder privateKey(String privateKey) { + this.privateKey = privateKey; + return this; + } + + public Builder userId(String userId) { + this.userId = userId; + return this; + } + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder fingerprint(String fingerprint) { + this.fingerprint = fingerprint; + return this; + } + + public KeyPair build() { + return new KeyPair(publicKey, privateKey, userId, name, fingerprint); + } + + public Builder fromKeyPair(KeyPair in) { + return publicKey(in.getPublicKey()).privateKey(in.getPrivateKey()) + .userId(in.getUserId()).name(in.getName()) + .fingerprint(in.getFingerprint()); + } + + } + + @SerializedName("public_key") + String publicKey; + @SerializedName("private_key") + String privateKey; + @SerializedName("user_id") + String userId; + String name; + String fingerprint; + + protected KeyPair(String publicKey, String privateKey, + @Nullable String userId, String name, String fingerprint) { + this.publicKey = publicKey; + this.privateKey = privateKey; + this.userId = userId; + this.name = name; + this.fingerprint = fingerprint; + } + + public String getPublicKey() { + return this.publicKey; + } + + public String getPrivateKey() { + return this.privateKey; + } + + public String getUserId() { + return this.privateKey; + } + + public String getName() { + return this.name; + } + + public String getFingerprint() { + return this.fingerprint; + } + + @Override + public String toString() { + return toStringHelper("").add("publicKey", publicKey) + .add("privateKey", privateKey).add("userId", userId) + .add("name", name).add("fingerprint", fingerprint).toString(); + } +} \ No newline at end of file diff --git a/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/FloatingIPAsyncClient.java b/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/FloatingIPAsyncClient.java index 391c87a1b4..f296efb019 100644 --- a/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/FloatingIPAsyncClient.java +++ b/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/FloatingIPAsyncClient.java @@ -93,5 +93,29 @@ public interface FloatingIPAsyncClient { @ExceptionParser(ReturnNullOnNotFoundOr404.class) @Path("/os-floating-ips/{id}") ListenableFuture deallocate(@PathParam("id") String id); + + /** + * @see FloatingIPClient#addFloatingIP + */ + @POST + @Path("/servers/{server}/action") + @Consumes + @Produces(MediaType.APPLICATION_JSON) + @Payload("%7B\"addFloatingIp\":%7B\"server\":\"{server}\",\"address\":\"{address}\"%7D%7D") + ListenableFuture addFloatingIP( + @PayloadParam("server") String serverId, + @PayloadParam("address") String address); + + /** + * @see FloatingIPClient#removeFloatingIP + */ + @POST + @Path("/servers/{server}/action") + @Consumes + @Produces(MediaType.APPLICATION_JSON) + @Payload("%7B\"removeFloatingIp\":%7B\"server\":\"{server}\",\"address\":\"{address}\"%7D%7D") + ListenableFuture removeFloatingIP( + @PayloadParam("server") String serverId, + @PayloadParam("address") String address); } diff --git a/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/FloatingIPClient.java b/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/FloatingIPClient.java index 93d328bea1..7c1e72681e 100644 --- a/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/FloatingIPClient.java +++ b/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/FloatingIPClient.java @@ -63,4 +63,27 @@ public interface FloatingIPClient { */ void deallocate(String id); + /** + * Add a Floating IP address to a Server + * + * @param serverId + * the serverId + * @param address + * the IP address to add + * + * NOTE: Possibly move this to ServerClient? + */ + void addFloatingIP(String serverId, String address); + + /** + * Remove a Floating IP address from a Server + * + * @param serverId + * the serverId + * @param address + * the IP address to remove + * + * NOTE: Possibly move this to ServerClient? + */ + void removeFloatingIP(String serverId, String address); } diff --git a/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/KeyPairAsyncClient.java b/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/KeyPairAsyncClient.java new file mode 100644 index 0000000000..0827db62fa --- /dev/null +++ b/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/KeyPairAsyncClient.java @@ -0,0 +1,88 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds 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.openstack.nova.v1_1.features; + +import java.util.Map; +import java.util.Set; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.jclouds.openstack.filters.AuthenticateRequest; +import org.jclouds.openstack.nova.v1_1.domain.KeyPair; +import org.jclouds.rest.annotations.ExceptionParser; +import org.jclouds.rest.annotations.Payload; +import org.jclouds.rest.annotations.PayloadParam; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.SelectJson; +import org.jclouds.rest.annotations.SkipEncoding; +import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404; +import org.jclouds.rest.functions.ReturnFalseOnNotFoundOr404; + +import com.google.common.util.concurrent.ListenableFuture; + +/** + * Provides asynchronous access to Key Pairs via the REST API. + *

+ * + * @see KeyPairClient + * @author Jeremy Daggett + */ +@SkipEncoding({ '/', '=' }) +@RequestFilters(AuthenticateRequest.class) +public interface KeyPairAsyncClient { + + @GET + @Path("/os-keypairs") + @SelectJson("keypairs") + @Consumes(MediaType.APPLICATION_JSON) + @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) + ListenableFuture>> listKeyPairs(); + + + @POST + @Path("/os-keypairs") + @SelectJson("keypair") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Payload("%7B\"keypair\":%7B\"name\":\"{name}\"%7D%7D") + ListenableFuture createKeyPair(@PayloadParam("name") String name); + + @POST + @Path("/os-keypairs") + @SelectJson("keypair") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Payload("%7B\"keypair\":%7B\"name\":\"{name}\",\"public_key\":\"{publicKey}\"%7D%7D") + ListenableFuture createKeyPairWithPublicKey(@PayloadParam("name") String name, + @PayloadParam("publicKey") String publicKey); + + @DELETE + @Path("/os-keypairs/{name}") + @ExceptionParser(ReturnFalseOnNotFoundOr404.class) + @Consumes + ListenableFuture deleteKeyPair(@PathParam("name") String name); + +} diff --git a/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/KeyPairClient.java b/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/KeyPairClient.java new file mode 100644 index 0000000000..7c4cc70094 --- /dev/null +++ b/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/features/KeyPairClient.java @@ -0,0 +1,66 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds 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.openstack.nova.v1_1.features; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import org.jclouds.concurrent.Timeout; +import org.jclouds.openstack.nova.v1_1.domain.KeyPair; + +/** + * Provides synchronous access to Security Groups. + *

+ * + * @see KeyPairAsyncClient + * @author Jeremy Daggett + */ +@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS) +public interface KeyPairClient { + + /** + * List all Key Pairs. + * + * @return all Key Pairs + */ + Set> listKeyPairs(); + + /** + * Create a Key Pair. + * + * @return a Key Pair + */ + KeyPair createKeyPair(String name); + + /** + * Create a Key Pair with a public key. + * + * @return a Key Pair with a public key. + */ + KeyPair createKeyPairWithPublicKey(String name, String publicKey); + + /** + * Delete a Key Pairs. + * + * @return + */ + Boolean deleteKeyPair(String name); + +} diff --git a/labs/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/features/FloatingIPClientLiveTest.java b/labs/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/features/FloatingIPClientLiveTest.java index 4e90af9b70..93115a5735 100644 --- a/labs/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/features/FloatingIPClientLiveTest.java +++ b/labs/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/features/FloatingIPClientLiveTest.java @@ -18,13 +18,11 @@ */ package org.jclouds.openstack.nova.v1_1.features; -import static java.lang.System.out; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import java.util.Set; -import org.jclouds.openstack.domain.Resource; import org.jclouds.openstack.nova.v1_1.domain.FloatingIP; import org.jclouds.openstack.nova.v1_1.domain.Server; import org.jclouds.openstack.nova.v1_1.internal.BaseNovaClientLiveTest; @@ -55,37 +53,7 @@ public class FloatingIPClientLiveTest extends BaseNovaClientLiveTest { assertEquals(newDetails.getFixedIp(), ip.getFixedIp()); assertEquals(newDetails.getInstanceId(), ip.getInstanceId()); - //checkServer(newDetails); } } } - - /* - out.println("Allocating a new floating ip address"); - FloatingIP newIP = ipClient.allocate(); - out.println(newIP); - - - out.println("List of floating ips after allocate"); - floatingIPs = ipClient.listFloatingIPs(); - for (FloatingIP ip : floatingIPs) { - System.out.println("Floating IP: " + ip); - } - - out.println("Get floating ip address 3815"); - FloatingIP getIP = ipClient.getFloatingIP("3815"); - out.println(getIP); - - out.println("Deallocating the floating ip address"); - ipClient.deallocate(newIP.getId()); - - out.println("List of floating ips after deallocate"); - floatingIPs = ipClient.listFloatingIPs(); - for (FloatingIP ip : floatingIPs) { - System.out.println("Floating IP: " + ip); - } - */ - private void checkServer(Server server) { - assert server.getAddresses().size() > 0 : server; - } } diff --git a/labs/openstack-nova/src/test/resources/keypair_created.json b/labs/openstack-nova/src/test/resources/keypair_created.json new file mode 100644 index 0000000000..188f9296ae --- /dev/null +++ b/labs/openstack-nova/src/test/resources/keypair_created.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 diff --git a/labs/openstack-nova/src/test/resources/keypair_list.json b/labs/openstack-nova/src/test/resources/keypair_list.json new file mode 100644 index 0000000000..1c14e2fbe1 --- /dev/null +++ b/labs/openstack-nova/src/test/resources/keypair_list.json @@ -0,0 +1,18 @@ +{ + "keypairs": [ + { + "keypair": { + "public_key": "ssh-rsa AAAXB3NzaC1yc2EAAAADAQABAAAAgQCy9EC3O7Ff80vPEfAHDQob61PGwcpYc5KE7tEZnZhrB9n0NyHPRm0E0M+ls3fcTa04HDi+R0DzmRwoyhHQJyI658v8kWZZcuvFjKCcsgsSh/dzdX0xTreLIzSOzt5U7RnZYfshP5cmxtF99yrEY3M/swdin0L+fXsTSkR1B42STQ== nova@nv-aw2az1-api0001\n", + "name": "default", + "fingerprint": "ab:0c:f4:f3:54:c0:5d:3f:ed:62:ad:d3:94:7c:79:7c" + } + }, + { + "keypair": { + "public_key": "ssh-rsa AAAXB3NzaC1yc2EAAAADAQABAAAAgQDFNyGjgs6c9akgmZ2ou/fJf7Pdrc23hC95/gM/33OrG4GZABACE4DTioa/PGN+7rHv9YUavUCtXrWayhGniKq/wCuI5fo5TO4AmDNv7/sCGHIHFumADSIoLx0vFhGJIetXEWxL9r0lfFC7//6yZM2W3KcGjbMtlPXqBT9K9PzdyQ== nova@nv-aw2az1-api0001\n", + "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