Repository: jclouds Updated Branches: refs/heads/1.7.x a8ce28190 -> 0aa7abb0b
Fixed NPE when Server has no Image Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/0aa7abb0 Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/0aa7abb0 Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/0aa7abb0 Branch: refs/heads/1.7.x Commit: 0aa7abb0bf707e7649fee894377875100dd74d11 Parents: a8ce281 Author: Everett Toews <[email protected]> Authored: Tue Jun 24 15:30:37 2014 -0500 Committer: Everett Toews <[email protected]> Committed: Thu Jun 26 15:04:32 2014 -0500 ---------------------------------------------------------------------- .../functions/ServerInZoneToNodeMetadata.java | 18 ++++++++++--- .../nova/v2_0/config/NovaParserModule.java | 11 +++----- .../ServerInZoneToNodeMetadataTest.java | 27 +++++++++++++++++++- 3 files changed, 43 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/0aa7abb0/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInZoneToNodeMetadata.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInZoneToNodeMetadata.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInZoneToNodeMetadata.java index 23035c2..8a84470 100644 --- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInZoneToNodeMetadata.java +++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInZoneToNodeMetadata.java @@ -106,7 +106,11 @@ public class ServerInZoneToNodeMetadata implements Function<ServerInZone, NodeMe .description(from.getHostId()).parent(zone).build() : zone); builder.group(groupFromMapOrName(from.getMetadata(), from.getName(), nodeNamingConvention)); addMetadataAndParseTagsFromCommaDelimitedValue(builder, from.getMetadata()); - builder.imageId(ZoneAndId.fromZoneAndId(serverInZone.getZone(), from.getImage().getId()).slashEncode()); + + if (from.getImage() != null) { + builder.imageId(ZoneAndId.fromZoneAndId(serverInZone.getZone(), from.getImage().getId()).slashEncode()); + } + builder.operatingSystem(findOperatingSystemForServerOrNull(serverInZone)); builder.hardware(findHardwareForServerOrNull(serverInZone)); builder.status(toPortableNodeStatus.get(from.getStatus())); @@ -176,9 +180,15 @@ public class ServerInZoneToNodeMetadata implements Function<ServerInZone, NodeMe } protected OperatingSystem findOperatingSystemForServerOrNull(ServerInZone serverInZone) { - Image image = findObjectOfTypeForServerOrNull(images.get(), "image", serverInZone.getServer().getImage().getId(), - serverInZone); - return (image != null) ? image.getOperatingSystem() : null; + if (serverInZone.getServer().getImage() != null) { + Image image = findObjectOfTypeForServerOrNull( + images.get(), "image", serverInZone.getServer().getImage().getId(), serverInZone); + + return (image != null) ? image.getOperatingSystem() : null; + } else { + return null; + } + } public <T extends ComputeMetadata> T findObjectOfTypeForServerOrNull(Set<? extends T> supply, String type, http://git-wip-us.apache.org/repos/asf/jclouds/blob/0aa7abb0/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 af61cdd..3deb5a9 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 @@ -126,13 +126,12 @@ public class NovaParserModule extends AbstractModule { @Override public Server deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException { - Server serverBase = null; + Server serverBase; // 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 { + } else { serverBase = apply((ServerInternalWithoutImage) context.deserialize(jsonElement, ServerInternalWithoutImage.class)); } @@ -148,7 +147,7 @@ public class NovaParserModule extends AbstractModule { return result.build(); } - public Server apply(ServerInternal in) { + public Server apply(Server in) { return in.toBuilder().build(); } @@ -165,10 +164,6 @@ public class NovaParserModule extends AbstractModule { } } - 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" http://git-wip-us.apache.org/repos/asf/jclouds/blob/0aa7abb0/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInZoneToNodeMetadataTest.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInZoneToNodeMetadataTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInZoneToNodeMetadataTest.java index 72b82d5..ce2538e 100644 --- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInZoneToNodeMetadataTest.java +++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInZoneToNodeMetadataTest.java @@ -18,6 +18,7 @@ package org.jclouds.openstack.nova.v2_0.compute.functions; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNull; import java.net.URI; import java.util.Map; @@ -39,6 +40,7 @@ import org.jclouds.openstack.nova.v2_0.compute.config.NovaComputeServiceContextM import org.jclouds.openstack.nova.v2_0.domain.Server; import org.jclouds.openstack.nova.v2_0.domain.zonescoped.ServerInZone; import org.jclouds.openstack.nova.v2_0.parse.ParseServerTest; +import org.jclouds.openstack.nova.v2_0.parse.ParseServerWithoutImageTest; import org.jclouds.openstack.v2_0.domain.Link; import org.jclouds.openstack.v2_0.domain.Resource; import org.testng.annotations.Test; @@ -203,7 +205,30 @@ public class ServerInZoneToNodeMetadataTest { } } - // TODO: clean up this syntax + @Test + public void testServerWithoutImage() { + Hardware existingHardware = new HardwareBuilder().id("az-1.region-a.geo-1/52415800-8b69-11e0-9b19-734f216543fd") + .providerId("52415800-8b69-11e0-9b19-734f216543fd").location(zone).build(); + Image existingImage = new ImageBuilder().id("az-1.region-a.geo-1/52415800-8b69-11e0-9b19-734f6f006e54") + .operatingSystem(OperatingSystem.builder().family(OsFamily.LINUX).description("foobuntu").build()) + .providerId("52415800-8b69-11e0-9b19-734f6f006e54").description("foobuntu").status(Image.Status.AVAILABLE) + .location(zone).build(); + + Server serverToConvert = new ParseServerWithoutImageTest().expected(); + ServerInZone serverInZoneToConvert = new ServerInZone(serverToConvert, "az-1.region-a.geo-1"); + + ServerInZoneToNodeMetadata converter = new ServerInZoneToNodeMetadata( + NovaComputeServiceContextModule.toPortableNodeStatus, locationIndex, + Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(existingImage)), + Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet.of(existingHardware)), + namingConvention); + + NodeMetadata convertedNodeMetadata = converter.apply(serverInZoneToConvert); + + assertNull(convertedNodeMetadata.getImageId()); + } + + // TODO: clean up this syntax private void checkHardwareAndImageStatus(Hardware expectedHardware, Hardware existingHardware, String expectedImageId, OperatingSystem expectedOs, Image existingImage) {
