Fixes issue where glance fails to parse image details with milli seconds in the date
diff --git a/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/functions/ParseImageDetailsFromHeaders.java b/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/functions/ParseImageDetailsFromHeaders.java
index 776604d..4c4ea78 100644
--- a/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/functions/ParseImageDetailsFromHeaders.java
+++ b/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/functions/ParseImageDetailsFromHeaders.java
@@ -68,8 +68,8 @@
.minDisk(Long.parseLong(from.getFirstHeaderOrNull(MIN_DISK.asHeader())))
.minRam(Long.parseLong(from.getFirstHeaderOrNull(MIN_RAM.asHeader())))
.isPublic(Boolean.parseBoolean(from.getFirstHeaderOrNull(IS_PUBLIC.asHeader())))
- .createdAt(dateService.iso8601SecondsDateParse(from.getFirstHeaderOrNull(CREATED_AT.asHeader())))
- .updatedAt(dateService.iso8601SecondsDateParse(from.getFirstHeaderOrNull(UPDATED_AT.asHeader())))
+ .createdAt(dateService.iso8601DateOrSecondsDateParse(from.getFirstHeaderOrNull(CREATED_AT.asHeader())))
+ .updatedAt(dateService.iso8601DateOrSecondsDateParse(from.getFirstHeaderOrNull(UPDATED_AT.asHeader())))
.owner(from.getFirstHeaderOrNull(OWNER.asHeader()))
.location(from.getFirstHeaderOrNull(LOCATION.asHeader()))
.status(Status.fromValue(from.getFirstHeaderOrNull(STATUS.asHeader())));
diff --git a/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/functions/ParseImageDetailsFromHeadersTest.java b/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/functions/ParseImageDetailsFromHeadersTest.java
index 920524c..8e25200 100644
--- a/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/functions/ParseImageDetailsFromHeadersTest.java
+++ b/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/functions/ParseImageDetailsFromHeadersTest.java
@@ -59,10 +59,39 @@
.build())
.build();
+ public HttpResponse responseWithDateMilli = HttpResponse.builder()
+ .message("HTTP/1.1 200 OK")
+ .statusCode(200)
+ .headers(ImmutableMultimap.<String, String>builder()
+ .put("X-Image-Meta-Id", "fcc451d0-f6e4-4824-ad8f-70ec12326d07")
+ .put("X-Image-Meta-Deleted", "False")
+ .put("X-Image-Meta-Container_format", "bare")
+ .put("X-Image-Meta-Checksum", "233afa7b8809d840679b5f0d36d7350a")
+ .put("X-Image-Meta-Protected", "False")
+ .put("X-Image-Meta-Min_disk", "0")
+ .put("X-Image-Meta-Created_at", "2012-05-18T18:06:44.000+0000")
+ .put("X-Image-Meta-Size", "65645798")
+ .put("X-Image-Meta-Status", "active")
+ .put("X-Image-Meta-Is_public", "True")
+ .put("X-Image-Meta-Min_ram", "0")
+ .put("X-Image-Meta-Owner", "5821675")
+ .put("X-Image-Meta-Updated_at", "2012-05-18T18:42:58.000+0000")
+ .put("X-Image-Meta-Disk_format", "raw")
+ .put("X-Image-Meta-Name", "debian")
+ .put("X-Image-Meta-Property-Description", "debian image description")
+ .put("Location", "http://HOST/v1/images/fcc451d0-f6e4-4824-ad8f-70ec12326d07")
+ .put("Etag", "233afa7b8809d840679b5f0d36d7350a")
+ .build())
+ .build();
+
public void test() {
assertEquals(fn.apply(response).toString(), expected().toString());
}
+ public void testResponseWithDateMilli() {
+ assertEquals(fn.apply(responseWithDateMilli).toString(), expected().toString());
+ }
+
public ImageDetails expected() {
return ImageDetails.builder()
.id("fcc451d0-f6e4-4824-ad8f-70ec12326d07")
@@ -75,8 +104,8 @@
.status(Image.Status.ACTIVE)
.owner("5821675")
.isPublic(true)
- .createdAt(new SimpleDateFormatDateService().iso8601SecondsDateParse("2012-05-18T18:06:44"))
- .updatedAt(new SimpleDateFormatDateService().iso8601SecondsDateParse("2012-05-18T18:42:58"))
+ .createdAt(new SimpleDateFormatDateService().iso8601DateOrSecondsDateParse("2012-05-18T18:06:44"))
+ .updatedAt(new SimpleDateFormatDateService().iso8601DateOrSecondsDateParse("2012-05-18T18:42:58"))
.build();
}
}