mirror of https://github.com/apache/jclouds.git
Support new nova api 1.1 image and flavor entities on the server entity. As of openstack Diablo, imageref and flavorref no longer exist in the api.
This commit is contained in:
parent
6f97696283
commit
882ae7fc41
|
@ -42,6 +42,8 @@ public class Server extends Resource {
|
||||||
private String imageRef;
|
private String imageRef;
|
||||||
private String affinityId;
|
private String affinityId;
|
||||||
private String uuid;
|
private String uuid;
|
||||||
|
private Flavor flavor;
|
||||||
|
private Image image;
|
||||||
|
|
||||||
private Date created;
|
private Date created;
|
||||||
private Date updated;
|
private Date updated;
|
||||||
|
@ -102,6 +104,10 @@ public class Server extends Resource {
|
||||||
this.flavorRef = flavorRef;
|
this.flavorRef = flavorRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in nova 1.1 api at the Diablo release, replaced by {@link #getFlavor()}
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public String getFlavorRef() {
|
public String getFlavorRef() {
|
||||||
return flavorRef;
|
return flavorRef;
|
||||||
}
|
}
|
||||||
|
@ -130,6 +136,10 @@ public class Server extends Resource {
|
||||||
this.imageRef = imageRef;
|
this.imageRef = imageRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated in nova 1.1 api at the Diablo release, replaced by {@link #getImage()}.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public String getImageRef() {
|
public String getImageRef() {
|
||||||
return imageRef;
|
return imageRef;
|
||||||
}
|
}
|
||||||
|
@ -166,6 +176,22 @@ public class Server extends Resource {
|
||||||
this.uuid = uuid;
|
this.uuid = uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Flavor getFlavor() {
|
||||||
|
return flavor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFlavor(Flavor flavor) {
|
||||||
|
this.flavor = flavor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Image getImage() {
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImage(Image image) {
|
||||||
|
this.image = image;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
|
@ -179,6 +205,8 @@ public class Server extends Resource {
|
||||||
result = prime * result + ((metadata == null) ? 0 : metadata.hashCode());
|
result = prime * result + ((metadata == null) ? 0 : metadata.hashCode());
|
||||||
result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
|
result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
|
||||||
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
||||||
|
result = prime * result + ((flavor == null) ? 0 : flavor.hashCode());
|
||||||
|
result = prime * result + ((image == null) ? 0 : image.hashCode());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,6 +261,16 @@ public class Server extends Resource {
|
||||||
return false;
|
return false;
|
||||||
} else if (!name.equals(other.name))
|
} else if (!name.equals(other.name))
|
||||||
return false;
|
return false;
|
||||||
|
if (flavor == null) {
|
||||||
|
if (other.flavor != null)
|
||||||
|
return false;
|
||||||
|
} else if (!flavor.equals(other.flavor))
|
||||||
|
return false;
|
||||||
|
if (image == null) {
|
||||||
|
if (other.image != null)
|
||||||
|
return false;
|
||||||
|
} else if (!image.equals(other.image))
|
||||||
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,108 @@
|
||||||
|
/**
|
||||||
|
* 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 com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.Injector;
|
||||||
|
import com.google.inject.Key;
|
||||||
|
import com.google.inject.TypeLiteral;
|
||||||
|
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.Address;
|
||||||
|
import org.jclouds.openstack.nova.domain.Addresses;
|
||||||
|
import org.jclouds.openstack.nova.domain.Server;
|
||||||
|
import org.jclouds.openstack.nova.domain.ServerStatus;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.UnknownHostException;
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.SimpleTimeZone;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code ParseServerFromJsonResponse} for the transitional nova api 1.1 in the Diablo release
|
||||||
|
*
|
||||||
|
* @author Matt Stephenson
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit")
|
||||||
|
public class ParseServerFromJsonResponseDiabloTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testApplyInputStreamDetails() throws Exception {
|
||||||
|
Server response = parseServer();
|
||||||
|
|
||||||
|
assertEquals(response.getId(), 15);
|
||||||
|
assertEquals(response.getName(), "sample-server");
|
||||||
|
assertEquals(response.getImage().getURI(), new URI("http://servers.api.openstack.org/1234/images/1"));
|
||||||
|
assertEquals(response.getFlavor().getURI(), new URI("http://servers.api.openstack.org/1234/flavors/1"));
|
||||||
|
assertEquals(response.getHostId(), "e4d909c290d0fb1ca068ffaddf22cbd0");
|
||||||
|
assertEquals(response.getStatus(), ServerStatus.BUILD);
|
||||||
|
assertEquals(response.getProgress(), new Integer(60));
|
||||||
|
SimpleDateFormat dateFormat = new SimpleDateFormat(
|
||||||
|
"yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
|
||||||
|
dateFormat.setTimeZone(new SimpleTimeZone(0, "GMT"));
|
||||||
|
assertEquals(response.getCreated(),
|
||||||
|
dateFormat.parse("2010-08-10T12:00:00Z"));
|
||||||
|
assertEquals(response.getUpdated(),
|
||||||
|
dateFormat.parse("2010-10-10T12:00:00Z"));
|
||||||
|
|
||||||
|
List<Address> publicAddresses = ImmutableList.copyOf(Iterables.transform(
|
||||||
|
ImmutableList.of("67.23.10.132", "::babe:67.23.10.132", "67.23.10.131", "::babe:4317:0A83"),
|
||||||
|
Address.newString2AddressFunction()));
|
||||||
|
List<Address> privateAddresses = ImmutableList.copyOf(Iterables.transform(
|
||||||
|
ImmutableList.of("10.176.42.16", "::babe:10.176.42.16"),
|
||||||
|
Address.newString2AddressFunction()));
|
||||||
|
Addresses addresses1 = new Addresses(new HashSet<Address>(publicAddresses), new HashSet<Address>(privateAddresses));
|
||||||
|
assertEquals(response.getAddresses(), addresses1);
|
||||||
|
assertEquals(response.getMetadata(), ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1"));
|
||||||
|
assertEquals(response.getAddresses(), addresses1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Server parseServer() throws NoSuchMethodException, ClassNotFoundException {
|
||||||
|
|
||||||
|
Injector i = Guice.createInjector(new GsonModule() {
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
super.configure();
|
||||||
|
bind(DateAdapter.class).to(Iso8601DateAdapter.class);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
InputStream is = ParseServerFromJsonResponseDiabloTest.class.getResourceAsStream("/test_get_server_detail_diablo.json");
|
||||||
|
|
||||||
|
UnwrapOnlyJsonValue<Server> parser = i.getInstance(Key.get(new TypeLiteral<UnwrapOnlyJsonValue<Server>>() {
|
||||||
|
}));
|
||||||
|
|
||||||
|
return parser.apply(new HttpResponse(200, "ok", Payloads.newInputStreamPayload(is)));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
{
|
||||||
|
"server": {
|
||||||
|
"id": 15,
|
||||||
|
"uuid": "52415800-8b69-11e0-9b19-734f000004d2",
|
||||||
|
"tenant_id": "1234",
|
||||||
|
"user_id": "5678",
|
||||||
|
"name": "sample-server",
|
||||||
|
"updated": "2010-10-10T12:00:00Z",
|
||||||
|
"created": "2010-08-10T12:00:00Z",
|
||||||
|
"hostId": "e4d909c290d0fb1ca068ffaddf22cbd0",
|
||||||
|
"accessIPv4" : "67.23.10.132",
|
||||||
|
"accessIPv6" : "::babe:67.23.10.132",
|
||||||
|
"status": "BUILD",
|
||||||
|
"progress": 60,
|
||||||
|
"key_name": null,
|
||||||
|
"config_drive": "",
|
||||||
|
"image" : {
|
||||||
|
"id": "1",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"rel": "bookmark",
|
||||||
|
"href": "http://servers.api.openstack.org/1234/images/1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"flavor" : {
|
||||||
|
"id": "1",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"rel": "bookmark",
|
||||||
|
"href": "http://servers.api.openstack.org/1234/flavors/1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"addresses": {
|
||||||
|
"public" : [
|
||||||
|
{
|
||||||
|
"version": 4,
|
||||||
|
"addr": "67.23.10.132"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": 6,
|
||||||
|
"addr": "::babe:67.23.10.132"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": 4,
|
||||||
|
"addr": "67.23.10.131"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": 6,
|
||||||
|
"addr": "::babe:4317:0A83"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"private" : [
|
||||||
|
{
|
||||||
|
"version": 4,
|
||||||
|
"addr": "10.176.42.16"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": 6,
|
||||||
|
"addr": "::babe:10.176.42.16"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"Server Label": "Web Head 1",
|
||||||
|
"Image Version": "2.1"
|
||||||
|
},
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"rel": "self",
|
||||||
|
"href": "http://servers.api.openstack.org/v1.1/1234/servers/52415800-8b69-11e0-9b19-734f000004d2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"rel": "bookmark",
|
||||||
|
"href": "http://servers.api.openstack.org/1234/servers/52415800-8b69-11e0-9b19-734f000004d2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue