Pierre Souchay created JCLOUDS-807:
--------------------------------------
Summary:
org.jclouds.openstack.nova.v2_0.features.ImageApi.listInDetail may fail for
some Images with structured metadata
Key: JCLOUDS-807
URL: https://issues.apache.org/jira/browse/JCLOUDS-807
Project: jclouds
Issue Type: Bug
Components: jclouds-labs-openstack
Affects Versions: 1.8.0, 2.0.0
Reporter: Pierre Souchay
In our environment (Openstack Icehouse), the list of images with details may
return some structured data in metadata, for instance :
{code}
"metadata": {
"block_device_mapping": [
{
"guest_format": null,
"boot_index": 0,
"no_device": null,
"volume_id": null,
"volume_size": null,
"disk_bus": "virtio",
"image_id": null,
"source_type": "snapshot",
"device_type": "disk",
"snapshot_id": "ce746121-7829-4818-bf5b-2b86d48b5ce0",
"destination_type": "volume",
"delete_on_termination": null
},
{
"guest_format": null,
"boot_index": null,
"no_device": null,
"volume_id": null,
"volume_size": null,
"disk_bus": null,
"image_id": null,
"source_type": "snapshot",
"device_type": null,
"snapshot_id": "a659cb24-c84e-472b-8ec2-9e4af8211d08",
"destination_type": "volume",
"delete_on_termination": null
}
],
"container_format": "bare"
[...]
}
{code}
In that case, the deserialization code fails with the following message
"com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected
a string but was BEGIN_ARRAY ..." since the class
org.jclouds.openstack.nova.v2_0.domain.Image contains metadata as a Map<String,
String> but block_device_mapping is an array of objects instead of a String.
This issue seems present in 1.8.x and 2.0.0
A modification of the test case
jclouds/apis/openstack-nova/src/test/resources/image_details.json explains the
problem :
put:
{code}
"metadata": {
"ImageType": "Gold",
"ImageVersion": "1.5",
"block_device_mapping": [{"guest_format": null, "boot_index": 0,
"no_device": null, "volume_id": null, "volume_size": null, "disk_bus":
"virtio", "image_id": null, "source_type": "snapshot", "device_type": "disk",
"snapshot_id": "ce746121-7829-4818-bf5b-2b86d48b5ce0", "destination_type":
"volume", "delete_on_termination": null}, {"guest_format": null, "boot_index":
null, "no_device": null, "volume_id": null, "volume_size": null, "disk_bus":
null, "image_id": null, "source_type": "snapshot", "device_type": null,
"snapshot_id": "a659cb24-c84e-472b-8ec2-9e4af8211d08", "destination_type":
"volume", "delete_on_termination": null}]
},
{code}
instead of
{code}
"metadata": {
"ImageType": "Gold",
"ImageVersion": "1.5"
}
{code}
The message is then:
{code}
testGetImageWhenResponseIs2xx(org.jclouds.openstack.nova.v2_0.features.ImageApiExpectTest)
Time elapsed: 0.006 sec <<< FAILURE!
java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line
16 column 38 path $.image.metadata.
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)