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

Reply via email to