mirror of https://github.com/apache/jclouds.git
Adding key name when creating server and floating ip methods
This commit is contained in:
parent
c151e5bdd7
commit
03a5a55fcc
|
@ -317,5 +317,28 @@ public interface NovaAsyncClient {
|
|||
@Path("/servers/{id}/ips/private")
|
||||
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
|
||||
ListenableFuture<? extends Set<String>> listPrivateAddresses(@PathParam("id") int serverId);
|
||||
|
||||
@POST
|
||||
@Path("/servers/{id}/action")
|
||||
@Consumes
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
@Payload("%7B\"addFloatingIp\":%7B\"address\":\"{address}\"%7D%7D")
|
||||
ListenableFuture<Void> addFloatingIp(@PathParam("id") int serverId, @PayloadParam("address") String ip);
|
||||
|
||||
@GET
|
||||
@Unwrap
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@QueryParams(keys = "format", values = "json")
|
||||
@Path("/os-floating-ips")
|
||||
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
|
||||
ListenableFuture<? extends Set<FloatingIP>> listFloatingIPs();
|
||||
|
||||
@GET
|
||||
@Unwrap
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@QueryParams(keys = "format", values = "json")
|
||||
@Path("/os-floating-ips/{id}")
|
||||
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||
ListenableFuture<FloatingIP> getFloatingIP(@PathParam("id") int id);
|
||||
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ import java.util.concurrent.TimeUnit;
|
|||
import org.jclouds.concurrent.Timeout;
|
||||
import org.jclouds.openstack.nova.domain.Addresses;
|
||||
import org.jclouds.openstack.nova.domain.Flavor;
|
||||
import org.jclouds.openstack.nova.domain.FloatingIP;
|
||||
import org.jclouds.openstack.nova.domain.Image;
|
||||
import org.jclouds.openstack.nova.domain.RebootType;
|
||||
import org.jclouds.openstack.nova.domain.Server;
|
||||
|
@ -281,4 +282,29 @@ public interface NovaClient {
|
|||
*/
|
||||
Set<String> listPrivateAddresses(int serverId);
|
||||
|
||||
/**
|
||||
* Add a floating IP to the given server. The floating IP can just be added
|
||||
* if the server has a fixed IP. It means that it is not possible to
|
||||
* directly add the floating IP just after creating the server but have to
|
||||
* poll if the server has an IP.
|
||||
*
|
||||
* @param serverId
|
||||
* @param ip
|
||||
*/
|
||||
void addFloatingIp(int serverId, String ip);
|
||||
|
||||
/**
|
||||
* Get all the defined floating IPs
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
Set<FloatingIP> listFloatingIPs();
|
||||
|
||||
/**
|
||||
* Get floating IP details from its ID
|
||||
*
|
||||
* @param id the floating IP id
|
||||
* @return the floating IP or null if not found
|
||||
*/
|
||||
FloatingIP getFloatingIP(int id);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,169 @@
|
|||
/**
|
||||
* 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.domain;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
/**
|
||||
* Check <a href="http://wiki.openstack.org/os_api_floating_ip">Floating IP Wiki page</a>
|
||||
*
|
||||
* @author chamerling
|
||||
*
|
||||
*/
|
||||
public class FloatingIP extends Resource {
|
||||
|
||||
private int id;
|
||||
|
||||
private String ip;
|
||||
|
||||
@SerializedName(value="fixed_ip")
|
||||
private String fixedIP;
|
||||
|
||||
@SerializedName(value = "instance_id")
|
||||
private int instanceID;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private FloatingIP() {
|
||||
}
|
||||
|
||||
public FloatingIP(int id, String ip, String fixedIP, int instanceID) {
|
||||
this.id = id;
|
||||
this.ip = ip;
|
||||
this.fixedIP = fixedIP;
|
||||
this.instanceID = instanceID;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the id
|
||||
*/
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param id the id to set
|
||||
*/
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the ip
|
||||
*/
|
||||
public String getIp() {
|
||||
return ip;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ip the ip to set
|
||||
*/
|
||||
public void setIp(String ip) {
|
||||
this.ip = ip;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the fixedIP
|
||||
*/
|
||||
public String getFixedIP() {
|
||||
return fixedIP;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param fixedIP the fixedIP to set
|
||||
*/
|
||||
public void setFixedIP(String fixedIP) {
|
||||
this.fixedIP = fixedIP;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the instanceID
|
||||
*/
|
||||
public int getInstanceID() {
|
||||
return instanceID;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param instanceID the instanceID to set
|
||||
*/
|
||||
public void setInstanceID(int instanceID) {
|
||||
this.instanceID = instanceID;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see java.lang.Object#toString()
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append("FloatingIP [id=");
|
||||
builder.append(id);
|
||||
builder.append(", ip=");
|
||||
builder.append(ip);
|
||||
builder.append(", fixedIP=");
|
||||
builder.append(fixedIP);
|
||||
builder.append(", instanceID=");
|
||||
builder.append(instanceID);
|
||||
builder.append("]");
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see java.lang.Object#hashCode()
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((fixedIP == null) ? 0 : fixedIP.hashCode());
|
||||
result = prime * result + id;
|
||||
result = prime * result + instanceID;
|
||||
result = prime * result + ((ip == null) ? 0 : ip.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see java.lang.Object#equals(java.lang.Object)
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
FloatingIP other = (FloatingIP) obj;
|
||||
if (fixedIP == null) {
|
||||
if (other.fixedIP != null)
|
||||
return false;
|
||||
} else if (!fixedIP.equals(other.fixedIP))
|
||||
return false;
|
||||
if (id != other.id)
|
||||
return false;
|
||||
if (instanceID != other.instanceID)
|
||||
return false;
|
||||
if (ip == null) {
|
||||
if (other.ip != null)
|
||||
return false;
|
||||
} else if (!ip.equals(other.ip))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -76,6 +76,7 @@ public class CreateServerOptions implements MapBinder {
|
|||
final String flavorRef;
|
||||
Map<String, String> metadata;
|
||||
List<File> personality;
|
||||
String key_name;
|
||||
|
||||
private ServerRequest(String name, String imageRef, String flavorRef) {
|
||||
this.name = name;
|
||||
|
@ -87,6 +88,7 @@ public class CreateServerOptions implements MapBinder {
|
|||
|
||||
private Map<String, String> metadata = Maps.newHashMap();
|
||||
private List<File> files = Lists.newArrayList();
|
||||
private String keyName;
|
||||
|
||||
@Override
|
||||
public <R extends HttpRequest> R bindToRequest(R request, Map<String, String> postParams) {
|
||||
|
@ -97,6 +99,8 @@ public class CreateServerOptions implements MapBinder {
|
|||
server.metadata = metadata;
|
||||
if (files.size() > 0)
|
||||
server.personality = files;
|
||||
if (keyName != null)
|
||||
server.key_name = keyName;
|
||||
|
||||
return bindToRequest(request, ImmutableMap.of("server", server));
|
||||
}
|
||||
|
@ -143,7 +147,13 @@ public class CreateServerOptions implements MapBinder {
|
|||
this.metadata = metadata;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public CreateServerOptions withKeyName(String keyName) {
|
||||
checkNotNull(keyName, "keyName");
|
||||
this.keyName = keyName;
|
||||
return this;
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
|
||||
/**
|
||||
|
@ -161,6 +171,14 @@ public class CreateServerOptions implements MapBinder {
|
|||
CreateServerOptions options = new CreateServerOptions();
|
||||
return options.withMetadata(metadata);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see CreateServerOptions#withKeyPair(String)
|
||||
*/
|
||||
public static CreateServerOptions withKeyName(String keyName) {
|
||||
CreateServerOptions options = new CreateServerOptions();
|
||||
return options.withKeyName(keyName);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -58,6 +58,7 @@ import static org.jclouds.openstack.nova.options.CreateServerOptions.Builder.wit
|
|||
import static org.jclouds.openstack.nova.options.ListOptions.Builder.changesSince;
|
||||
import static org.jclouds.openstack.nova.options.ListOptions.Builder.withDetails;
|
||||
import static org.jclouds.openstack.nova.options.RebuildServerOptions.Builder.withImage;
|
||||
//import static org.junit.Assert.*;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
|
@ -132,6 +133,26 @@ public class NovaAsyncClientTest extends RestClientTest<NovaAsyncClient> {
|
|||
|
||||
checkFilters(request);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateServerWithKeyName() throws Exception {
|
||||
Method method = NovaAsyncClient.class.getMethod("createServer", String.class, String.class, String.class,
|
||||
createServerOptionsVarargsClass);
|
||||
HttpRequest request = processor.createRequest(method, "ralphie", 2, 1,
|
||||
withMetadata(ImmutableMap.of("foo", "bar")).withKeyName("mykey"));
|
||||
|
||||
assertRequestLineEquals(request, "POST http://endpoint/vapi-version/servers?format=json HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "Accept: application/json\n");
|
||||
assertPayloadEquals(request,
|
||||
"{\"server\":{\"name\":\"ralphie\",\"imageRef\":\"2\",\"flavorRef\":\"1\",\"metadata\":{\"foo\":\"bar\"},\"key_name\":\"mykey\"}}",
|
||||
"application/json", false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, UnwrapOnlyJsonValue.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, null);
|
||||
|
||||
checkFilters(request);
|
||||
}
|
||||
|
||||
public void testDeleteImage() throws IOException, SecurityException, NoSuchMethodException {
|
||||
|
@ -635,8 +656,44 @@ public class NovaAsyncClientTest extends RestClientTest<NovaAsyncClient> {
|
|||
assertExceptionParserClassEquals(method, null);
|
||||
|
||||
checkFilters(request);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void testGetFloatingIP() throws SecurityException,
|
||||
NoSuchMethodException {
|
||||
Method method = NovaAsyncClient.class.getMethod("getFloatingIP",
|
||||
int.class);
|
||||
HttpRequest request = processor.createRequest(method, 2);
|
||||
|
||||
assertRequestLineEquals(request,
|
||||
"GET http://endpoint/vapi-version/os-floating-ips/2?format=json HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "Accept: application/json\n");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, request,
|
||||
UnwrapOnlyJsonValue.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method,
|
||||
ReturnNullOnNotFoundOr404.class);
|
||||
|
||||
checkFilters(request);
|
||||
}
|
||||
|
||||
public void testListFloatingIPs() throws SecurityException, NoSuchMethodException {
|
||||
Method method = NovaAsyncClient.class.getMethod("listFloatingIPs");
|
||||
HttpRequest request = processor.createRequest(method);
|
||||
|
||||
assertRequestLineEquals(request,
|
||||
"GET http://endpoint/vapi-version/os-floating-ips?format=json HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "Accept: application/json\n");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, UnwrapOnlyJsonValue.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
|
||||
|
||||
checkFilters(request);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TypeLiteral<RestAnnotationProcessor<NovaAsyncClient>> createTypeLiteral() {
|
||||
return new TypeLiteral<RestAnnotationProcessor<NovaAsyncClient>>() {
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
/**
|
||||
* 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.functions;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import static org.testng.Assert.assertNotNull;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
|
||||
import org.jclouds.io.Payloads;
|
||||
import org.jclouds.json.config.GsonModule;
|
||||
import org.jclouds.openstack.nova.domain.FloatingIP;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
/**
|
||||
* @author chamerling
|
||||
*
|
||||
*/
|
||||
@Test(groups = "unit")
|
||||
public class ParseFloatingIPFromJsonResponse {
|
||||
|
||||
@Test
|
||||
public void testParseFloatingIPFromJsonResponseTest() throws IOException {
|
||||
FloatingIP response = parseFLoatingIP();
|
||||
|
||||
String json = new Gson().toJson(response);
|
||||
assertNotNull(json);
|
||||
|
||||
assertEquals(response.getId(), 1);
|
||||
assertEquals(response.getFixedIP(), "10.0.0.2");
|
||||
assertEquals(response.getInstanceID(), 123);
|
||||
assertEquals(response.getIp(), "10.0.0.3");
|
||||
}
|
||||
|
||||
public static FloatingIP parseFLoatingIP() {
|
||||
Injector i = Guice.createInjector(new GsonModule());
|
||||
|
||||
InputStream is = ParseFloatingIPFromJsonResponse.class
|
||||
.getResourceAsStream("/test_get_floatingip.json");
|
||||
|
||||
UnwrapOnlyJsonValue<FloatingIP> parser = i.getInstance(Key
|
||||
.get(new TypeLiteral<UnwrapOnlyJsonValue<FloatingIP>>() {
|
||||
}));
|
||||
return parser.apply(new HttpResponse(200, "ok", Payloads
|
||||
.newInputStreamPayload(is)));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
/**
|
||||
* 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.functions;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.List;
|
||||
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
|
||||
import org.jclouds.io.Payloads;
|
||||
import org.jclouds.json.config.GsonModule;
|
||||
import org.jclouds.openstack.nova.domain.FloatingIP;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
/**
|
||||
* @author chamerling
|
||||
*
|
||||
*/
|
||||
@Test(groups = "unit")
|
||||
public class ParseFloatingIPListFromJsonResponse {
|
||||
Injector i = Guice.createInjector(new GsonModule());
|
||||
|
||||
@Test
|
||||
public void testParseFloatingIPListFromJsonResponseTest() throws UnknownHostException {
|
||||
InputStream is = getClass().getResourceAsStream(
|
||||
"/test_list_floatingips.json");
|
||||
|
||||
UnwrapOnlyJsonValue<List<FloatingIP>> parser = i.getInstance(Key
|
||||
.get(new TypeLiteral<UnwrapOnlyJsonValue<List<FloatingIP>>>() {
|
||||
}));
|
||||
List<FloatingIP> response = parser.apply(new HttpResponse(200, "ok",
|
||||
Payloads.newInputStreamPayload(is)));
|
||||
|
||||
assertEquals(response.size(), 1);
|
||||
FloatingIP floatingIP = new FloatingIP(1, "10.0.0.3", "11.0.0.1", 12);
|
||||
assertEquals(response.get(0), floatingIP);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"floating_ip" :
|
||||
{
|
||||
"id" : 1,
|
||||
"ip" : "10.0.0.3",
|
||||
"fixed_ip" : "10.0.0.2",
|
||||
"instance_id" : 123
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"floating_ips" : [
|
||||
{
|
||||
"id" : 1,
|
||||
"ip" : "10.0.0.3",
|
||||
"fixed_ip": "11.0.0.1",
|
||||
"instance_id": 12
|
||||
}
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue