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) {
 

Reply via email to