JCLOUDS-1455 - Update ParseResponse to log error details. Add ParseTests for Domain Objects in NetworkApi and ServerApi
diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Response.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Response.java
index d3cea10..fe1d541 100644
--- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Response.java
+++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Response.java
@@ -39,16 +39,16 @@
    public abstract List<Property> info();
 
    @Nullable
-   public abstract List<String> warning();
+   public abstract List<Property> warning();
 
    @Nullable
-   public abstract List<String> error();
+   public abstract List<Property> error();
 
    public abstract String requestId();
 
    @SerializedNames({ "operation", "responseCode", "message", "info", "warning", "error", "requestId" })
    public static Response create(String operation, String responseCode, String message, List<Property> info,
-         List<String> warning, List<String> error, String requestId) {
+         List<Property> warning, List<Property> error, String requestId) {
       return builder().operation(operation).responseCode(responseCode).message(message).info(info).warning(warning)
             .error(error).requestId(requestId).build();
    }
@@ -66,17 +66,17 @@
 
       public abstract Builder info(List<Property> info);
 
-      public abstract Builder warning(List<String> warning);
+      public abstract Builder warning(List<Property> warning);
 
-      public abstract Builder error(List<String> error);
+      public abstract Builder error(List<Property> error);
 
       public abstract Builder requestId(String requestId);
 
       abstract Response autoBuild();
 
-      abstract List<String> warning();
+      abstract List<Property> warning();
 
-      abstract List<String> error();
+      abstract List<Property> error();
 
       abstract List<Property> info();
 
diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/utils/ParseResponse.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/utils/ParseResponse.java
index 6f8b5de..809d934 100644
--- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/utils/ParseResponse.java
+++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/utils/ParseResponse.java
@@ -46,17 +46,19 @@
    }
 
    public String apply(HttpResponse from) {
-      try {
-         InputStream gson = from.getPayload().openStream();
-
-         final Response response = json.fromJson(gson, TypeLiteral.get(Response.class).getType());
+      Response response = null;
+      try (InputStream gson = from.getPayload().openStream()) {
+         response = json.fromJson(gson, TypeLiteral.get(Response.class).getType());
          return tryFindInfoPropertyValue(response);
       } catch (Exception e) {
          StringBuilder message = new StringBuilder();
-         message.append("Error parsing input: ");
-         message.append(e.getMessage());
+         message.append("Error parsing input: ").append(e.getMessage());
+         if (response != null) {
+            message.append(" ").append("Response Message: ").append(response.message());
+            message.append(" ").append(checkForErrorElements(response));
+         }
          logger.error(e, message.toString());
-         throw new HttpResponseException(message.toString() + "\n" + from, null, from, e);
+         throw new HttpResponseException(message.toString() + ".\n" + from, null, from, e);
       } finally {
          releasePayload(from);
       }
@@ -83,4 +85,15 @@
       }
       return "";
    }
+
+   final String checkForErrorElements(final Response response) {
+      if (response.error() != null && !response.error().isEmpty()) {
+         StringBuilder message = new StringBuilder("Error Elements: ");
+         for (Property e : response.error()) {
+            message.append(e.name()).append(":").append(e.value()).append(", ");
+         }
+         return message.subSequence(0, message.length() - 2).toString() + ".";
+      }
+      return null;
+   }
 }
diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/FirewallRuleParseTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/FirewallRuleParseTest.java
new file mode 100644
index 0000000..82150e2
--- /dev/null
+++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/FirewallRuleParseTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.dimensiondata.cloudcontrol.parse;
+
+import org.jclouds.dimensiondata.cloudcontrol.domain.FirewallRule;
+import org.jclouds.dimensiondata.cloudcontrol.domain.FirewallRuleTarget;
+import org.jclouds.dimensiondata.cloudcontrol.domain.IpRange;
+import org.jclouds.dimensiondata.cloudcontrol.domain.State;
+import org.jclouds.dimensiondata.cloudcontrol.internal.BaseDimensionDataCloudControlParseTest;
+import org.testng.annotations.Test;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+@Test(groups = "unit")
+public class FirewallRuleParseTest extends BaseDimensionDataCloudControlParseTest<FirewallRule> {
+
+   @Override
+   public String resource() {
+      return "/firewallRule.json";
+   }
+
+   @Override
+   @Consumes(MediaType.APPLICATION_JSON)
+   public FirewallRule expected() {
+      return FirewallRule.builder().networkDomainId("484174a2-ae74-4658-9e56-50fc90e086cf")
+            .name("CCDEFAULT.BlockOutboundMailIPv6Secure").action("DROP").ipVersion("IPV6").protocol("TCP")
+            .source(FirewallRuleTarget.builder().ip(IpRange.create("ANY", null)).build()).destination(
+                  FirewallRuleTarget.builder().ip(IpRange.create("ANY", null))
+                        .port(FirewallRuleTarget.Port.create(587, null)).build()).ruleType("DEFAULT_RULE").enabled(true)
+            .id("1aa3d0ce-d95d-4296-8338-9717e0d37ff9").datacenterId("NA9").state(State.NORMAL).build();
+   }
+}
diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/NatRuleParseTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/NatRuleParseTest.java
new file mode 100644
index 0000000..ee3cad6
--- /dev/null
+++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/NatRuleParseTest.java
@@ -0,0 +1,42 @@
+/*
+ * 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.dimensiondata.cloudcontrol.parse;
+
+import org.jclouds.dimensiondata.cloudcontrol.domain.NatRule;
+import org.jclouds.dimensiondata.cloudcontrol.domain.State;
+import org.jclouds.dimensiondata.cloudcontrol.internal.BaseDimensionDataCloudControlParseTest;
+import org.testng.annotations.Test;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+@Test(groups = "unit")
+public class NatRuleParseTest extends BaseDimensionDataCloudControlParseTest<NatRule> {
+
+   @Override
+   public String resource() {
+      return "/natRule.json";
+   }
+
+   @Override
+   @Consumes(MediaType.APPLICATION_JSON)
+   public NatRule expected() {
+      return NatRule.builder().networkDomainId("484174a2-ae74-4658-9e56-50fc90e086cf")
+            .createTime(parseDate("2015-03-06T13:45:10.000Z")).internalIp("10.0.0.16").externalIp("165.180.12.19")
+            .state(State.NORMAL).id("2169a38e-5692-497e-a22a-701a838a6539").datacenterId("NA9").build();
+   }
+}
diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/NetworkDomainParseTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/NetworkDomainParseTest.java
new file mode 100644
index 0000000..5292b35
--- /dev/null
+++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/NetworkDomainParseTest.java
@@ -0,0 +1,42 @@
+/*
+ * 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.dimensiondata.cloudcontrol.parse;
+
+import org.jclouds.dimensiondata.cloudcontrol.domain.NetworkDomain;
+import org.jclouds.dimensiondata.cloudcontrol.domain.State;
+import org.jclouds.dimensiondata.cloudcontrol.internal.BaseDimensionDataCloudControlParseTest;
+import org.testng.annotations.Test;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+@Test(groups = "unit")
+public class NetworkDomainParseTest extends BaseDimensionDataCloudControlParseTest<NetworkDomain> {
+
+   @Override
+   public String resource() {
+      return "/networkDomain.json";
+   }
+
+   @Override
+   @Consumes(MediaType.APPLICATION_JSON)
+   public NetworkDomain expected() {
+      return NetworkDomain.builder().name("test").description("").type(NetworkDomain.Type.ESSENTIALS)
+            .snatIpv4Address("168.128.3.44").createTime(parseDate("2016-03-08T14:39:47.000Z")).state(State.NORMAL)
+            .id("8e082ed6-c198-4eff-97cb-aeac6f9685d8").datacenterId("NA9").build();
+   }
+}
diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/PublicIpBlockParseTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/PublicIpBlockParseTest.java
new file mode 100644
index 0000000..f3e3aad
--- /dev/null
+++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/PublicIpBlockParseTest.java
@@ -0,0 +1,42 @@
+/*
+ * 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.dimensiondata.cloudcontrol.parse;
+
+import org.jclouds.dimensiondata.cloudcontrol.domain.PublicIpBlock;
+import org.jclouds.dimensiondata.cloudcontrol.domain.State;
+import org.jclouds.dimensiondata.cloudcontrol.internal.BaseDimensionDataCloudControlParseTest;
+import org.testng.annotations.Test;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+@Test(groups = "unit")
+public class PublicIpBlockParseTest extends BaseDimensionDataCloudControlParseTest<PublicIpBlock> {
+
+   @Override
+   public String resource() {
+      return "/publicIpBlock.json";
+   }
+
+   @Override
+   @Consumes(MediaType.APPLICATION_JSON)
+   public PublicIpBlock expected() {
+      return PublicIpBlock.builder().networkDomainId("690de302-bb80-49c6-b401-8c02bbefb945").baseIp("168.128.6.216")
+            .size(2).createTime(parseDate("2016-03-14T11:49:33.000Z")).state(State.NORMAL)
+            .id("9993e5fc-bdce-11e4-8c14-b8ca3a5d9ef8").datacenterId("NA9").build();
+   }
+}
diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/ServerParseTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/ServerParseTest.java
new file mode 100644
index 0000000..5d44d5e
--- /dev/null
+++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/ServerParseTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.dimensiondata.cloudcontrol.parse;
+
+import org.jclouds.dimensiondata.cloudcontrol.domain.CPU;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Disk;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Guest;
+import org.jclouds.dimensiondata.cloudcontrol.domain.NIC;
+import org.jclouds.dimensiondata.cloudcontrol.domain.NetworkInfo;
+import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Server;
+import org.jclouds.dimensiondata.cloudcontrol.domain.State;
+import org.jclouds.dimensiondata.cloudcontrol.domain.VirtualHardware;
+import org.jclouds.dimensiondata.cloudcontrol.domain.VmTools;
+import org.jclouds.dimensiondata.cloudcontrol.internal.BaseDimensionDataCloudControlParseTest;
+import org.testng.annotations.Test;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+import java.util.Collections;
+
+@Test(groups = "unit")
+public class ServerParseTest extends BaseDimensionDataCloudControlParseTest<Server> {
+
+   @Override
+   public String resource() {
+      return "/server.json";
+   }
+
+   @Override
+   @Consumes(MediaType.APPLICATION_JSON)
+   public Server expected() {
+
+      return Server.builder().id("cb08c7ba-7a51-4e32-8d39-05d2270f8f8b").name("ServerApiLiveTest").datacenterId("EU6")
+            .state(State.NORMAL).sourceImageId("56eb0b7c-15a7-4b63-b373-05b962e37554")
+            .createTime(parseDate("2017-07-03T16:29:33.000Z")).started(true).deployed(true).guest(Guest.builder()
+                  .operatingSystem(
+                        OperatingSystem.builder().id("REDHAT764").displayName("REDHAT7/64").family("UNIX").build())
+                  .vmTools(VmTools.builder().apiVersion(9356).type(VmTools.Type.VMWARE_TOOLS)
+                        .versionStatus(VmTools.VersionStatus.CURRENT).runningStatus(VmTools.RunningStatus.NOT_RUNNING)
+                        .build()).osCustomization(true).build())
+            .cpu(CPU.builder().count(2).speed("STANDARD").coresPerSocket(1).build()).memoryGb(4).disks(Collections
+                  .singletonList(
+                        Disk.builder().id("918f12ba-5e5e-4cd6-87bd-60c18293c24d").scsiId(0).sizeGb(20).speed("STANDARD")
+                              .state("NORMAL").build())).networkInfo(NetworkInfo.builder().primaryNic(
+                  NIC.builder().id("f0c00cab-bfa3-4c51-8c0a-c52fdac1ae4b").privateIpv4("10.0.0.7")
+                        .ipv6("2a00:47c0:111:1131:5851:1950:411c:3dd8").vlanId("7bd12a4d-4e83-4254-a266-174aa5f55187")
+                        .vlanName("jclouds vlan").state("NORMAL").build()).additionalNic(Collections.<NIC>emptyList())
+                  .networkDomainId("d122949b-8990-46d6-98f0-91c8676fc720").build())
+            .virtualHardware(VirtualHardware.builder().upToDate(true).version("vmx-10").build())
+            .softwareLabels(Collections.emptyList()).build();
+   }
+}
diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/ServersParseTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/ServersParseTest.java
new file mode 100644
index 0000000..eb97dae
--- /dev/null
+++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/ServersParseTest.java
@@ -0,0 +1,72 @@
+/*
+ * 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.dimensiondata.cloudcontrol.parse;
+
+import com.google.common.collect.ImmutableList;
+import org.jclouds.dimensiondata.cloudcontrol.domain.CPU;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Disk;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Guest;
+import org.jclouds.dimensiondata.cloudcontrol.domain.NIC;
+import org.jclouds.dimensiondata.cloudcontrol.domain.NetworkInfo;
+import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Server;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Servers;
+import org.jclouds.dimensiondata.cloudcontrol.domain.State;
+import org.jclouds.dimensiondata.cloudcontrol.domain.VirtualHardware;
+import org.jclouds.dimensiondata.cloudcontrol.domain.VmTools;
+import org.jclouds.dimensiondata.cloudcontrol.internal.BaseDimensionDataCloudControlParseTest;
+import org.testng.annotations.Test;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+import java.util.Collections;
+import java.util.List;
+
+@Test(groups = "unit")
+public class ServersParseTest extends BaseDimensionDataCloudControlParseTest<Servers> {
+
+   @Override
+   public String resource() {
+      return "/servers.json";
+   }
+
+   @Override
+   @Consumes(MediaType.APPLICATION_JSON)
+   public Servers expected() {
+      List<Server> servers = ImmutableList
+            .of(Server.builder().id("b8246ba4-847d-475b-b296-f76787a69ca8").name("parser-test-server-name")
+                  .description("parser-test-server-description").datacenterId("NA9").state(State.NORMAL)
+                  .sourceImageId("1e44ab3f-2426-45ec-a1b5-827b2ce58836")
+                  .createTime(parseDate("2016-03-10T13:05:21.000Z")).started(true).deployed(true).guest(Guest.builder()
+                        .operatingSystem(
+                              OperatingSystem.builder().id("CENTOS564").displayName("CENTOS5/64").family("UNIX")
+                                    .build()).vmTools(VmTools.builder().apiVersion(9354).type(VmTools.Type.VMWARE_TOOLS)
+                              .versionStatus(VmTools.VersionStatus.NEED_UPGRADE)
+                              .runningStatus(VmTools.RunningStatus.RUNNING).build()).osCustomization(true).build())
+                  .cpu(CPU.builder().count(2).speed("STANDARD").coresPerSocket(1).build()).memoryGb(4).disks(Collections
+                        .singletonList(Disk.builder().id("0ba67812-d7b7-4c3f-b114-870fbea24d42").scsiId(0).sizeGb(10)
+                              .speed("STANDARD").state("NORMAL").build())).networkInfo(NetworkInfo.builder().primaryNic(
+                        NIC.builder().id("980a9fdd-4ea2-478b-85b4-f016349f1738").privateIpv4("10.0.0.8")
+                              .ipv6("2607:f480:111:1575:c47:7479:2af8:3f1a")
+                              .vlanId("6b25b02e-d3a2-4e69-8ca7-9bab605deebd")
+                              .vlanId("6b25b02e-d3a2-4e69-8ca7-9bab605deebd").vlanName("vlan1").state("NORMAL").build())
+                        .additionalNic(null).networkDomainId("690de302-bb80-49c6-b401-8c02bbefb945").build())
+                  .virtualHardware(VirtualHardware.builder().upToDate(false).version("vmx-08").build())
+                  .softwareLabels(Collections.emptyList()).build());
+      return new Servers(servers, 1, 5, 5, 250);
+   }
+}
diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/VlanParseTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/VlanParseTest.java
new file mode 100644
index 0000000..804e491
--- /dev/null
+++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/parse/VlanParseTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.dimensiondata.cloudcontrol.parse;
+
+import org.jclouds.dimensiondata.cloudcontrol.domain.IpRange;
+import org.jclouds.dimensiondata.cloudcontrol.domain.NetworkDomain;
+import org.jclouds.dimensiondata.cloudcontrol.domain.State;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Vlan;
+import org.jclouds.dimensiondata.cloudcontrol.internal.BaseDimensionDataCloudControlParseTest;
+import org.testng.annotations.Test;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+@Test(groups = "unit")
+public class VlanParseTest extends BaseDimensionDataCloudControlParseTest<Vlan> {
+
+   @Override
+   public String resource() {
+      return "/vlan.json";
+   }
+
+   @Override
+   @Consumes(MediaType.APPLICATION_JSON)
+   public Vlan expected() {
+      return Vlan.builder()
+            .networkDomain(NetworkDomain.builder().id("690de302-bb80-49c6-b401-8c02bbefb945").name("test").build())
+            .name("vlan1").description("").privateIpv4Range(IpRange.create("10.0.0.0", 24))
+            .ipv4GatewayAddress("10.0.0.1").ipv6Range(IpRange.create("2607:f480:111:1575:0:0:0:0", 64))
+            .ipv6GatewayAddress("2607:f480:111:1575:0:0:0:1").createTime(parseDate("2016-03-11T10:41:19.000Z"))
+            .state(State.NORMAL).datacenterId("NA9").id("6b25b02e-d3a2-4e69-8ca7-9bab605deebd").build();
+   }
+}
diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/utils/ResponseParseTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/utils/ParseResponseTest.java
similarity index 75%
rename from dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/utils/ResponseParseTest.java
rename to dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/utils/ParseResponseTest.java
index 5c4ea1d..995e318 100644
--- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/utils/ResponseParseTest.java
+++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/utils/ParseResponseTest.java
@@ -24,8 +24,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
-@Test(groups = "unit", testName = "ResponseParseTest", singleThreaded = true)
-public class ResponseParseTest {
+@Test(groups = "unit", testName = "ParseResponseTest", singleThreaded = true)
+public class ParseResponseTest {
 
    public void testTryFindPropertyValue() {
 
@@ -53,4 +53,18 @@
 
       new ParseResponse(null, "noProperty").tryFindInfoPropertyValue(response);
    }
+
+   public void testTryFindPropertyValue_ErrorReturned() {
+
+      List<Property> errorProperties = new ArrayList<Property>();
+      errorProperties.add(Property.create("propertyName1", "propertyValue1"));
+      errorProperties.add(Property.create("propertyName2", "propertyValue2"));
+
+      Response response = Response.builder().responseCode("responseCode").error(errorProperties).message("message")
+            .operation("operation").requestId("requestId").info(null).build();
+
+      Assert.assertEquals(new ParseResponse(null, "noProperty").checkForErrorElements(response),
+            "Error Elements: propertyName1:propertyValue1, propertyName2:propertyValue2.");
+   }
+
 }
diff --git a/dimensiondata/src/test/resources/firewallRule.json b/dimensiondata/src/test/resources/firewallRule.json
new file mode 100644
index 0000000..e85b5d8
--- /dev/null
+++ b/dimensiondata/src/test/resources/firewallRule.json
@@ -0,0 +1,25 @@
+{
+  "networkDomainId": "484174a2-ae74-4658-9e56-50fc90e086cf",
+  "name": "CCDEFAULT.BlockOutboundMailIPv6Secure",
+  "action": "DROP",
+  "ipVersion": "IPV6",
+  "protocol": "TCP",
+  "source": {
+    "ip": {
+      "address": "ANY"
+    }
+  },
+  "destination": {
+    "ip": {
+      "address": "ANY"
+    },
+    "port": {
+      "begin": 587
+    }
+  },
+  "enabled": true,
+  "state": "NORMAL",
+  "id": "1aa3d0ce-d95d-4296-8338-9717e0d37ff9",
+  "datacenterId": "NA9",
+  "ruleType": "DEFAULT_RULE"
+}
\ No newline at end of file
diff --git a/dimensiondata/src/test/resources/server.json b/dimensiondata/src/test/resources/server.json
index 9ece773..f0804e0 100644
--- a/dimensiondata/src/test/resources/server.json
+++ b/dimensiondata/src/test/resources/server.json
@@ -19,7 +19,7 @@
     "primaryNic": {
       "id": "f0c00cab-bfa3-4c51-8c0a-c52fdac1ae4b",
       "privateIpv4": "10.0.0.7",
-      "ipv6": "2a00:47c0: 111: 1131: 5851: 1950:411c: 3dd8",
+      "ipv6": "2a00:47c0:111:1131:5851:1950:411c:3dd8",
       "vlanId": "7bd12a4d-4e83-4254-a266-174aa5f55187",
       "vlanName": "jclouds vlan",
       "networkAdapter": "E1000",
@@ -32,7 +32,7 @@
   },
   "softwareLabel": [],
   "sourceImageId": "56eb0b7c-15a7-4b63-b373-05b962e37554",
-  "createTime": "2017-07-03T16: 29: 33.000Z",
+  "createTime": "2017-07-03T16:29:33.000Z",
   "deployed": true,
   "started": true,
   "state": "NORMAL",