[ https://issues.apache.org/jira/browse/JCLOUDS-558?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14003439#comment-14003439 ]
Ignasi Barrera commented on JCLOUDS-558: ---------------------------------------- A trivial fix would be to try to parse the json and fallback to a parser that tries to parse the "buggy response": In [NovaParserModule.java#L129|https://github.com/jclouds/jclouds/blob/master/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaParserModule.java#L129]: {code:java} Server serverBase = null; try { serverBase = apply((ServerInternal) context.deserialize(jsonElement, ServerInternal.class)); } catch (JsonSyntaxException ex) { // Try to parse the json using the "buggy" server class serverBase = apply((ServerInternal) context.deserialize(jsonElement, ServerInternalWithStringLiteralImage.class)); } {code} And have that {{ServerInternalWithStringLiteralImage}} class declare the {{image}} field as a String instead of as a {{Resource}}. The problem here is that we can't then pass the image field to the parent's constructor, and it is a mandatory field, so we can't just pass a {{null}}. I don't know if relaxing the constraint and making the image nullable would be a fair change just to workaround this issue (as there are many providers using the nova api that might expect the image field to be always set). If we are confident that having a null image won't break stuff, we could add another protected constructor to the parent {{Server}} class, marked deprecated, to be used only by that workaround class, and leaving the field null. I don't know, it's just an idea and would love to hear your ideas too, but I think we should do something with this issue without waiting for a fix in nova. > JSON parse error on createNodesInGroup > -------------------------------------- > > Key: JCLOUDS-558 > URL: https://issues.apache.org/jira/browse/JCLOUDS-558 > Project: jclouds > Issue Type: Bug > Components: jclouds-compute > Affects Versions: 1.7.2 > Environment: jclouds version 1.7.2 and 1.8.0-SNAPSHOT > ubuntu 14.04 x86_64 > $ java -version > java version "1.7.0_55" > OpenJDK Runtime Environment (IcedTea 2.4.7) (7u55-2.4.7-1ubuntu1) > OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode) > openstack Havana 2013.2.3 > Reporter: Andrew Ruef > Assignee: Everett Toews > > using jclouds-example compute-basic: > https://github.com/jclouds/jclouds-examples/tree/master/compute-basics > with command line: > java \ > -Dopenstack-nova.image-id=RegionOne/<image ID> \ > -Dopenstack-nova.login-user=ubuntu \ > -Djclouds.trust-all-certs=true \ > -Djclouds.keystone.credential-type=passwordCredentials \ > -Dopenstack-nova.endpoint=https://<openstack endpoint host>/v2.0 \ > -jar target/compute-basics-jar-with-dependencies.jar \ > openstack-nova <tenant>:<username> <password> mygroup add > Command fails with exception: > {noformat} > - no jclouds.zones configured for provider openstack-nova > - >> invoking server:list > - Sending request 811507394: GET http://<host>/v2/<stuff>/servers/detail > HTTP/1.1 > - >> GET http://<host>/v2/<stuff>/servers/detail HTTP/1.1 > - >> Accept: application/json > - >> X-Auth-Token: <redacted> > - Receiving response 811507394: HTTP/1.1 200 OK > - << HTTP/1.1 200 OK > - << Date: Sat, 03 May 2014 05:36:11 GMT > - << Connection: keep-alive > - << X-Compute-Request-Id: req-30c4d178-ac5f-4f86-8fc3-9dbd10f593ab > - << Content-Type: application/json > - << Content-Length: 1503 > - << "{"servers": [{"status": "ACTIVE", "updated": "2014-05-03T00:45:10Z", > "hostId": "cfcfe7bbd3568725754d4cbf500668e0c3890c3f722d322b219559bd", > "addresses": {"<tenantid>": [{"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:46:45:df", > "version": 4, "addr": "10.10.3.2", "OS-EXT-IPS:type": "fixed"}, > {"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:46:45:df", "version": 4, "addr": > "<ipaddr>", "OS-EXT-IPS:type": "floating"}]}, "links": [{"href": > "http://<hostandport>/v2/<stuff>/servers/6aa6bb89-d9ef-4647-982a-803eee53f573", > "rel": "self"}, {"href": > "http://<hostandport>/<Stuff>/servers/6aa6bb89-d9ef-4647-982a-803eee53f573", > "rel": "bookmark"}], "key_name": "foo-test", "image": "", > "OS-EXT-STS:task_state": null, "OS-EXT-STS:vm_state": "active", > "OS-SRV-USG:launched_at": "2014-05-03T00:45:09.000000", "flavor": {"id": "3", > "links": [{"href": "http://<hostandport>/<stuff>/flavors/3", "rel": > "bookmark"}]}, "id": "6aa6bb89-d9ef-4647-982a-803eee53f573", > "security_groups": [{"name": "default"}], "OS-SRV-USG:terminated_at": null, > "OS-EXT-AZ:availability_zone": "FOO", "user_id": "<username>", "name": > "<hostname>", "created": "2014-05-03T00:44:12Z", "tenant_id": "<stuff>", > "OS-DCF:diskConfig": "MANUAL", "os-extended-volumes:volumes_attached": > [{"id": "<stuff>"}], "accessIPv4": "", "accessIPv6": "", "progress": 0, > "OS-EXT-STS:power_state": 1, "config_drive": "", "metadata": {}}]}" > - Error parsing input > com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: > Expected BEGIN_OBJECT but was STRING > at > org.jclouds.json.internal.DeserializationConstructorAndReflectiveTypeAdapterFactory$DeserializeIntoParameterizedConstructor.read(DeserializationConstructorAndReflectiveTypeAdapterFactory.java:181) > ~[compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.json.internal.DeserializationConstructorAndReflectiveTypeAdapterFactory$ParameterReader.read(DeserializationConstructorAndReflectiveTypeAdapterFactory.java:263) > ~[compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.json.internal.DeserializationConstructorAndReflectiveTypeAdapterFactory$DeserializeIntoParameterizedConstructor.read(DeserializationConstructorAndReflectiveTypeAdapterFactory.java:175) > ~[compute-basics-jar-with-dependencies.jar:na] > at com.google.gson.Gson.fromJson(Gson.java:803) > ~[compute-basics-jar-with-dependencies.jar:na] > at com.google.gson.Gson.fromJson(Gson.java:868) > ~[compute-basics-jar-with-dependencies.jar:na] > at com.google.gson.Gson$1.deserialize(Gson.java:126) > ~[compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.openstack.nova.v2_0.config.NovaParserModule$ServerAdapter.deserialize(NovaParserModule.java:129) > ~[compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.openstack.nova.v2_0.config.NovaParserModule$ServerAdapter.deserialize(NovaParserModule.java:124) > ~[compute-basics-jar-with-dependencies.jar:na] > at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58) > ~[compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.json.internal.NullFilteringTypeAdapterFactories$IterableTypeAdapter.readAndBuild(NullFilteringTypeAdapterFactories.java:92) > ~[compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.json.internal.NullFilteringTypeAdapterFactories$IterableTypeAdapter.read(NullFilteringTypeAdapterFactories.java:84) > ~[compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.json.internal.NullFilteringTypeAdapterFactories$IterableTypeAdapter.read(NullFilteringTypeAdapterFactories.java:63) > ~[compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.json.internal.DeserializationConstructorAndReflectiveTypeAdapterFactory$ParameterReader.read(DeserializationConstructorAndReflectiveTypeAdapterFactory.java:263) > ~[compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.json.internal.DeserializationConstructorAndReflectiveTypeAdapterFactory$DeserializeIntoParameterizedConstructor.read(DeserializationConstructorAndReflectiveTypeAdapterFactory.java:175) > ~[compute-basics-jar-with-dependencies.jar:na] > at com.google.gson.Gson.fromJson(Gson.java:803) > ~[compute-basics-jar-with-dependencies.jar:na] > at com.google.gson.Gson.fromJson(Gson.java:768) > ~[compute-basics-jar-with-dependencies.jar:na] > at com.google.gson.Gson.fromJson(Gson.java:717) > ~[compute-basics-jar-with-dependencies.jar:na] > at org.jclouds.json.internal.GsonWrapper.fromJson(GsonWrapper.java:45) > ~[compute-basics-jar-with-dependencies.jar:na] > at org.jclouds.http.functions.ParseJson.apply(ParseJson.java:84) > [compute-basics-jar-with-dependencies.jar:na] > at org.jclouds.http.functions.ParseJson.apply(ParseJson.java:78) > [compute-basics-jar-with-dependencies.jar:na] > at org.jclouds.http.functions.ParseJson.apply(ParseJson.java:64) > [compute-basics-jar-with-dependencies.jar:na] > at org.jclouds.http.functions.ParseJson.apply(ParseJson.java:44) > [compute-basics-jar-with-dependencies.jar:na] > at > com.google.common.base.Functions$FunctionComposition.apply(Functions.java:216) > [compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.rest.internal.InvokeSyncToAsyncHttpMethod.invoke(InvokeSyncToAsyncHttpMethod.java:129) > [compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.rest.internal.InvokeSyncToAsyncHttpMethod.apply(InvokeSyncToAsyncHttpMethod.java:95) > [compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.rest.internal.InvokeSyncToAsyncHttpMethod.apply(InvokeSyncToAsyncHttpMethod.java:56) > [compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.reflect.FunctionalReflection$FunctionalInvocationHandler.handleInvocation(FunctionalReflection.java:117) > [compute-basics-jar-with-dependencies.jar:na] > at > com.google.common.reflect.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:87) > [compute-basics-jar-with-dependencies.jar:na] > at com.sun.proxy.$Proxy80.listInDetail(Unknown Source) [na:na] > at > org.jclouds.openstack.nova.v2_0.compute.NovaComputeServiceAdapter.listNodes(NovaComputeServiceAdapter.java:205) > [compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.compute.strategy.impl.AdaptingComputeServiceStrategies.listDetailsOnNodesMatching(AdaptingComputeServiceStrategies.java:123) > [compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.compute.strategy.impl.AdaptingComputeServiceStrategies.listNodes(AdaptingComputeServiceStrategies.java:113) > [compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.compute.strategy.impl.CreateNodesWithGroupEncodedIntoNameThenAddToSet.getNextNames(CreateNodesWithGroupEncodedIntoNameThenAddToSet.java:194) > [compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.compute.strategy.impl.CreateNodesWithGroupEncodedIntoNameThenAddToSet.execute(CreateNodesWithGroupEncodedIntoNameThenAddToSet.java:123) > [compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.openstack.nova.v2_0.compute.strategy.ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet.execute(ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet.java:148) > [compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.compute.internal.BaseComputeService.createNodesInGroup(BaseComputeService.java:215) > [compute-basics-jar-with-dependencies.jar:na] > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > ~[na:1.7.0_55] > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > ~[na:1.7.0_55] > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > ~[na:1.7.0_55] > at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_55] > at > com.google.inject.internal.DelegatingInvocationHandler.invoke(DelegatingInvocationHandler.java:37) > [compute-basics-jar-with-dependencies.jar:na] > at com.sun.proxy.$Proxy59.createNodesInGroup(Unknown Source) [na:na] > at org.jclouds.examples.compute.basics.MainApp.main(MainApp.java:169) > [compute-basics-jar-with-dependencies.jar:na] > Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was > STRING > at > com.google.gson.internal.bind.JsonTreeReader.expect(JsonTreeReader.java:139) > ~[compute-basics-jar-with-dependencies.jar:na] > at > com.google.gson.internal.bind.JsonTreeReader.beginObject(JsonTreeReader.java:70) > ~[compute-basics-jar-with-dependencies.jar:na] > at > org.jclouds.json.internal.DeserializationConstructorAndReflectiveTypeAdapterFactory$DeserializeIntoParameterizedConstructor.read(DeserializationConstructorAndReflectiveTypeAdapterFactory.java:167) > ~[compute-basics-jar-with-dependencies.jar:na] > ... 42 common frames omitted > {noformat} > It looks like the JSON schema is not appropriate? This version of OpenStack > seems pretty old.. am I doing something wrong? -- This message was sent by Atlassian JIRA (v6.2#6252)