Repository: jclouds Updated Branches: refs/heads/master c417ddef6 -> b95898fc0
Fix for JSON parse error on createNodesInGroup (JCLOUDS-558) Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/b95898fc Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/b95898fc Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/b95898fc Branch: refs/heads/master Commit: b95898fc0a3d574143f89bfd0f2d0d422fc87de2 Parents: c417dde Author: Everett Toews <[email protected]> Authored: Thu Jun 19 15:19:18 2014 -0500 Committer: Everett Toews <[email protected]> Committed: Mon Jun 23 13:40:40 2014 -0500 ---------------------------------------------------------------------- .../nova/v2_0/config/NovaParserModule.java | 28 +++++- .../openstack/nova/v2_0/domain/Server.java | 4 +- .../v2_0/parse/ParseServerWithoutImageTest.java | 99 ++++++++++++++++++++ .../resources/server_details_without_image.json | 74 +++++++++++++++ 4 files changed, 202 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/b95898fc/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaParserModule.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaParserModule.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaParserModule.java index f5f023d..9cc5aef 100644 --- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaParserModule.java +++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaParserModule.java @@ -122,7 +122,16 @@ public class NovaParserModule extends AbstractModule { @Override public Server deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException { - Server serverBase = apply((ServerInternal) context.deserialize(jsonElement, ServerInternal.class)); + Server serverBase = null; + + // Servers can be created without an image so test if an image object is returned + if (jsonElement.getAsJsonObject().get("image").isJsonObject()) { + serverBase = apply((ServerInternal) context.deserialize(jsonElement, ServerInternal.class)); + } + else { + serverBase = apply((ServerInternalWithoutImage) context.deserialize(jsonElement, ServerInternalWithoutImage.class)); + } + Server.Builder<?> result = Server.builder().fromServer(serverBase); ServerExtendedStatus extendedStatus = context.deserialize(jsonElement, ServerExtendedStatus.class); if (!Objects.equal(extendedStatus, ServerExtendedStatus.builder().build())) { @@ -151,5 +160,22 @@ public class NovaParserModule extends AbstractModule { super(id, name, links, uuid, tenantId, userId, updated, created, hostId, accessIPv4, accessIPv6, status, image, flavor, keyName, configDrive, addresses, metadata, extendedStatus, extendedAttributes, diskConfig); } } + + public Server apply(ServerInternalWithoutImage in) { + return in.toBuilder().build(); + } + + private static class ServerInternalWithoutImage extends Server { + @ConstructorProperties({ + "id", "name", "links", "uuid", "tenant_id", "user_id", "updated", "created", "hostId", "accessIPv4", "accessIPv6", "status", "flavor", "key_name", "config_drive", "addresses", "metadata", "extendedStatus", "extendedAttributes", "OS-DCF:diskConfig" + }) + protected ServerInternalWithoutImage(String id, @Nullable String name, java.util.Set<Link> links, @Nullable String uuid, String tenantId, + String userId, Date updated, Date created, @Nullable String hostId, @Nullable String accessIPv4, + @Nullable String accessIPv6, Server.Status status, Resource flavor, @Nullable String keyName, + @Nullable String configDrive, Multimap<String, Address> addresses, Map<String, String> metadata, + @Nullable ServerExtendedStatus extendedStatus, @Nullable ServerExtendedAttributes extendedAttributes, @Nullable String diskConfig) { + super(id, name, links, uuid, tenantId, userId, updated, created, hostId, accessIPv4, accessIPv6, status, null, flavor, keyName, configDrive, addresses, metadata, extendedStatus, extendedAttributes, diskConfig); + } + } } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/b95898fc/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Server.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Server.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Server.java index adea635..220ff62 100644 --- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Server.java +++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Server.java @@ -317,7 +317,7 @@ public class Server extends Resource { }) protected Server(String id, @Nullable String name, java.util.Set<Link> links, @Nullable String uuid, String tenantId, String userId, @Nullable Date updated, Date created, @Nullable String hostId, @Nullable String accessIPv4, - @Nullable String accessIPv6, Server.Status status, Resource image, Resource flavor, @Nullable String keyName, + @Nullable String accessIPv6, Server.Status status, @Nullable Resource image, Resource flavor, @Nullable String keyName, @Nullable String configDrive, Multimap<String, Address> addresses, Map<String, String> metadata, @Nullable ServerExtendedStatus extendedStatus, @Nullable ServerExtendedAttributes extendedAttributes, @Nullable String diskConfig) { @@ -331,7 +331,7 @@ public class Server extends Resource { this.accessIPv4 = Strings.emptyToNull(accessIPv4); this.accessIPv6 = Strings.emptyToNull(accessIPv6); this.status = checkNotNull(status, "status"); - this.image = checkNotNull(image, "image"); + this.image = image; this.flavor = checkNotNull(flavor, "flavor"); this.keyName = Strings.emptyToNull(keyName); this.configDrive = Strings.emptyToNull(configDrive); http://git-wip-us.apache.org/repos/asf/jclouds/blob/b95898fc/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerWithoutImageTest.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerWithoutImageTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerWithoutImageTest.java new file mode 100644 index 0000000..d58d8d0 --- /dev/null +++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerWithoutImageTest.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.v2_0.parse; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.jclouds.date.internal.SimpleDateFormatDateService; +import org.jclouds.json.BaseItemParserTest; +import org.jclouds.json.config.GsonModule; +import org.jclouds.openstack.nova.v2_0.config.NovaParserModule; +import org.jclouds.openstack.nova.v2_0.domain.Address; +import org.jclouds.openstack.nova.v2_0.domain.Server; +import org.jclouds.openstack.nova.v2_0.domain.Server.Status; +import org.jclouds.openstack.v2_0.domain.Link; +import org.jclouds.openstack.v2_0.domain.Link.Relation; +import org.jclouds.openstack.v2_0.domain.Resource; +import org.jclouds.rest.annotations.SelectJson; +import org.testng.annotations.Test; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; +import java.net.URI; + +import static org.jclouds.openstack.nova.v2_0.domain.Address.createV4; +import static org.jclouds.openstack.nova.v2_0.domain.Address.createV6; + +@Test(groups = "unit", testName = "ParseServerWithoutImageTest") +public class ParseServerWithoutImageTest extends BaseItemParserTest<Server> { + + @Override + public String resource() { + return "/server_details_without_image.json"; + } + + @Override + @SelectJson("server") + @Consumes(MediaType.APPLICATION_JSON) + public Server expected() { + return Server + .builder() + .id("52415800-8b69-11e0-9b19-734f000004d2") + .tenantId("1234") + .userId("5678") + .name("sample-f352") + .updated(new SimpleDateFormatDateService().iso8601SecondsDateParse("2010-10-10T12:00:00Z")) + .created(new SimpleDateFormatDateService().iso8601SecondsDateParse("2010-08-10T12:00:00Z")) + .hostId("e4d909c290d0fb1ca068ffaddf22cbd0") + .accessIPv4("67.23.10.132") + .accessIPv6("::babe:67.23.10.132") + .status(Status.BUILD) + .diskConfig(Server.DISK_CONFIG_AUTO) + .flavor( + Resource + .builder() + .id("52415800-8b69-11e0-9b19-734f216543fd") + .name("null") + .links( + Link.create( + Relation.SELF, + URI.create("http://servers.api.openstack.org/v1.1/1234/flavors/52415800-8b69-11e0-9b19-734f216543fd")), + Link.create( + Relation.BOOKMARK, + URI.create("http://servers.api.openstack.org/1234/flavors/52415800-8b69-11e0-9b19-734f216543fd"))) + .build()) + .metadata( + new ImmutableMap.Builder<String, String>().put("Server Label", "Web Head 1") + .put("Image Version", "2.1").build()) + .addresses(ImmutableMultimap.<String, Address>builder() + .putAll("public", createV4("67.23.10.132"), createV6("::babe:67.23.10.132"), createV4("67.23.10.131"), createV6("::babe:4317:0A83")) + .putAll("private", createV4("10.176.42.16"), createV6("::babe:10.176.42.16")) + .build()) + .links(Link.create( + Relation.SELF, URI.create("http://servers.api.openstack.org/v1.1/1234/servers/52415800-8b69-11e0-9b19-734f6f006e54")), + Link.create( + Relation.BOOKMARK, + URI.create("http://servers.api.openstack.org/1234/servers/52415800-8b69-11e0-9b19-734f6f006e54"))) + .build(); + } + + protected Injector injector() { + return Guice.createInjector(new NovaParserModule(), new GsonModule()); + } +} http://git-wip-us.apache.org/repos/asf/jclouds/blob/b95898fc/apis/openstack-nova/src/test/resources/server_details_without_image.json ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/test/resources/server_details_without_image.json b/apis/openstack-nova/src/test/resources/server_details_without_image.json new file mode 100644 index 0000000..9448733 --- /dev/null +++ b/apis/openstack-nova/src/test/resources/server_details_without_image.json @@ -0,0 +1,74 @@ +{ + "server": { + "id": "52415800-8b69-11e0-9b19-734f000004d2", + "tenant_id": "1234", + "user_id": "5678", + "name": "sample-f352", + "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(scheduling)", + "progress": 60, + "OS-DCF:diskConfig": "AUTO", + "image" : "", + "flavor" : { + "id": "52415800-8b69-11e0-9b19-734f216543fd", + "links": [ + { + "rel": "self", + "href": "http://servers.api.openstack.org/v1.1/1234/flavors/52415800-8b69-11e0-9b19-734f216543fd" + }, + { + "rel": "bookmark", + "href": "http://servers.api.openstack.org/1234/flavors/52415800-8b69-11e0-9b19-734f216543fd" + } + ] + }, + "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-734f6f006e54" + }, + { + "rel": "bookmark", + "href": "http://servers.api.openstack.org/1234/servers/52415800-8b69-11e0-9b19-734f6f006e54" + } + ] + } +} \ No newline at end of file
