[JCLOUDS-1468] Adding missing options for the ListUsageRecords API call.
diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/UsageRecord.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/UsageRecord.java
index 55adab9..ddcd48f 100644
--- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/UsageRecord.java
+++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/UsageRecord.java
@@ -30,6 +30,7 @@
 import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
+import java.util.Set;
 
 /**
  * Represents a usage record from CloudStack
@@ -53,6 +54,13 @@
       PORT_FORWARDING_RULE(12),
       NETWORK_OFFERING(13),
       VPN_USERS(14),
+      VM_DISK_IO_READ(21),
+      VM_DISK_IO_WRITE(22),
+      VM_DISK_BYTES_READ(23),
+      VM_DISK_BYTES_WRITE(24),
+      VM_SNAPSHOT(25),
+      VOLUME_SECONDARY(26),
+      VM_SNAPSHOT_ON_PRIMARY(27),
       UNRECOGNIZED(0);
 
       private int code;
@@ -109,7 +117,7 @@
       protected String serviceOfferingId;
       protected String templateId;
       protected String ipAddress;
-      protected boolean isSourceNAT;
+      protected Boolean isSourceNAT;
       protected double rawUsageHours;
       protected String usage;
       protected Long size;
@@ -117,6 +125,15 @@
       protected UsageType usageType;
       protected String project;
       protected String projectId;
+      protected String domain;
+      protected Long virtualSize;
+      protected Long cpuNumber;
+      protected Long cpuSpeed;
+      protected Long memory;
+      protected Boolean isSystem;
+      protected String networkId;
+      protected Boolean isDefault;
+      protected Set<Tag> tags;
 
       /**
        * @see UsageRecord#getId()
@@ -241,7 +258,7 @@
       /**
        * @see UsageRecord#isSourceNAT()
        */
-      public T isSourceNAT(boolean isSourceNAT) {
+      public T isSourceNAT(Boolean isSourceNAT) {
          this.isSourceNAT = isSourceNAT;
          return self();
       }
@@ -301,10 +318,82 @@
          this.projectId = projectId;
          return self();
       }
+      
+      /**
+       * @see UsageRecord#getDomain()
+       */
+      public T domain(String domain) {
+          this.domain = domain;
+          return self();
+      }
+      
+      /**
+       * @see UsageRecord#getVirtualSize()
+       */
+      public T virtualSize(Long virtualSize) {
+          this.virtualSize = virtualSize;
+          return self();
+      }
+      
+      /**
+       * @see UsageRecord#getCpuNumber()
+       */
+      public T cpuNumber(Long cpuNumber) {
+          this.cpuNumber = cpuNumber;
+          return self();
+      }
+    
+      /**
+       * @see UsageRecord#getCpuSpeed()
+       */
+      public T cpuSpeed(Long cpuSpeed) {
+          this.cpuSpeed = cpuSpeed;
+          return self();
+      }
+    
+      /**
+       * @see UsageRecord#getMemory()
+       */
+      public T memory(Long memory) {
+          this.memory = memory;
+          return self();
+      }
+      
+      /**
+       * @see UsageRecord#isSystem()
+       */
+      public T isSystem(Boolean isSystem) {
+          this.isSystem = isSystem;
+          return self();
+      }
+      
+      /**
+       * @see UsageRecord#getNetworkId()
+       */
+      public T networkId(String networkId) {
+          this.networkId = networkId;
+          return self();
+      }
+      
+      /**
+       * @see UsageRecord#isDefault()
+       */
+      public T isDefault(Boolean isDefault) {
+          this.isDefault = isDefault;
+          return self();
+      }
+      /**
+       * @see UsageRecord#getTags()
+       */
+      public T tags(Set<Tag> tags) {
+          this.tags = tags;
+          return self();
+      }
       public UsageRecord build() {
          return new UsageRecord(id, description, accountId, accountName, domainId, startDate, endDate, assignDate, releaseDate,
                zoneId, virtualMachineId, virtualMachineName, serviceOfferingId, templateId, ipAddress, isSourceNAT, rawUsageHours,
-               usage, size, type, usageType, project, projectId);
+               usage, size, type, usageType, project, projectId, domain, virtualSize, cpuNumber, cpuSpeed, memory, isSystem,
+               networkId, isDefault, tags);
       }
 
       public T fromUsageRecord(UsageRecord in) {
@@ -331,7 +420,16 @@
                .type(in.getType())
                .usageType(in.getUsageType())
                .project(in.getProject())
-               .projectId(in.getProjectId());
+               .projectId(in.getProjectId())
+               .domain(in.getDomain())
+               .virtualSize(in.getVirtualSize())
+               .cpuNumber(in.getCpuNumber())
+               .cpuSpeed(in.getCpuSpeed())
+               .memory(in.getMemory())
+               .isSystem(in.isSystem())
+               .networkId(in.getNetworkId())
+               .isDefault(in.isDefault())
+               .tags(in.getTags());
       }
    }
 
@@ -357,7 +455,7 @@
    private final String serviceOfferingId;
    private final String templateId;
    private final String ipAddress;
-   private final boolean isSourceNAT;
+   private final Boolean isSourceNAT;
    private final double rawUsageHours;
    private final String usage;
    private final Long size;
@@ -365,18 +463,30 @@
    private final UsageType usageType;
    private final String project;
    private final String projectId;
+   private final String domain;
+   private final Long virtualSize;
+   private final Long cpuNumber;
+   private final Long cpuSpeed;
+   private final Long memory;
+   private final Boolean isSystem;
+   private final String networkId;
+   private final Boolean isDefault;
+   private final Set<Tag> tags;
 
    @ConstructorProperties({
          "usageid", "description", "accountid", "account", "domainid", "startdate", "enddate", "assigndate", "releasedate",
          "zoneid", "virtualmachineid", "name", "offeringid", "templateid", "ipaddress", "issourcenat", "rawusage", "usage",
-         "size", "type", "usagetype", "project", "projectid"
+         "size", "type", "usagetype", "project", "projectid", "domain", "virtualsize", "cpunumber", "cpuspeed", "memory",
+         "issystem", "networkid", "isdefault", "tags"
    })
    protected UsageRecord(String id, @Nullable String description, @Nullable String accountId, @Nullable String accountName,
                          @Nullable String domainId, @Nullable Date startDate, @Nullable Date endDate, @Nullable Date assignDate,
                          @Nullable String releaseDate, @Nullable String zoneId, @Nullable String virtualMachineId, @Nullable String virtualMachineName,
                          @Nullable String serviceOfferingId, @Nullable String templateId, @Nullable String ipAddress,
-                         boolean isSourceNAT, double rawUsageHours, @Nullable String usage, @Nullable Long size,
-                         @Nullable String type, @Nullable UsageType usageType, @Nullable String project, @Nullable String projectId) {
+                         @Nullable Boolean isSourceNAT, double rawUsageHours, @Nullable String usage, @Nullable Long size,
+                         @Nullable String type, @Nullable UsageType usageType, @Nullable String project, @Nullable String projectId,
+                         @Nullable String domain, @Nullable Long virtualSize, @Nullable Long cpuNumber, @Nullable Long cpuSpeed, @Nullable Long memory, 
+                         @Nullable Boolean isSystem, @Nullable String networkId, @Nullable Boolean isDefault, @Nullable Set<Tag> tags) {
       this.id = id;
       this.description = description;
       this.accountId = accountId;
@@ -400,6 +510,15 @@
       this.usageType = usageType;
       this.project = project;
       this.projectId = projectId;
+      this.domain = domain;
+      this.virtualSize = virtualSize;
+      this.cpuNumber = cpuNumber;
+      this.cpuSpeed = cpuSpeed;
+      this.memory = memory;
+      this.isSystem = isSystem;
+      this.networkId = networkId;
+      this.isDefault = isDefault;
+      this.tags = tags == null ? ImmutableSet.<Tag>of() : ImmutableSet.copyOf(tags);
    }
 
    public String getId() {
@@ -476,7 +595,8 @@
       return this.ipAddress;
    }
 
-   public boolean isSourceNAT() {
+   @Nullable
+   public Boolean isSourceNAT() {
       return this.isSourceNAT;
    }
 
@@ -513,11 +633,55 @@
       return this.projectId;
    }
 
+    @Nullable
+    public String getDomain() {
+        return domain;
+    }
+
+    @Nullable
+    public Long getVirtualSize() {
+        return virtualSize;
+    }
+
+    @Nullable
+    public Long getCpuNumber() {
+        return cpuNumber;
+    }
+
+    @Nullable
+    public Long getCpuSpeed() {
+        return cpuSpeed;
+    }
+
+    @Nullable
+    public Long getMemory() {
+        return memory;
+    }
+
+    @Nullable
+    public Boolean isSystem() {
+        return isSystem;
+    }
+
+    @Nullable
+    public String getNetworkId() {
+        return networkId;
+    }
+
+    @Nullable
+    public Boolean isDefault() {
+        return isDefault;
+    }
+   @Nullable
+    public Set<Tag> getTags() {
+        return tags;
+    }
    @Override
    public int hashCode() {
       return Objects.hashCode(id, description, accountId, accountName, domainId, startDate, endDate, assignDate, releaseDate,
             zoneId, virtualMachineId, virtualMachineName, serviceOfferingId, templateId, ipAddress, isSourceNAT, rawUsageHours,
-            size, usage, type, usageType, project, projectId);
+            size, usage, type, usageType, project, projectId, domain, virtualSize, cpuNumber, cpuSpeed, memory, isSystem,
+            networkId, isDefault, tags);
    }
 
    @Override
@@ -547,7 +711,15 @@
             && Objects.equal(this.type, that.type)
             && Objects.equal(this.usageType, that.usageType)
             && Objects.equal(this.project, that.project)
-            && Objects.equal(this.projectId, that.projectId);
+            && Objects.equal(this.domain, that.domain)
+            && Objects.equal(this.virtualSize, that.virtualSize)
+            && Objects.equal(this.cpuNumber, that.cpuNumber)
+            && Objects.equal(this.cpuSpeed, that.cpuSpeed)
+            && Objects.equal(this.memory, that.memory)
+            && Objects.equal(this.isSystem, that.isSystem)
+            && Objects.equal(this.networkId, that.networkId)
+            && Objects.equal(this.isDefault, that.isDefault)
+            && Objects.equal(this.tags, that.tags);
    }
 
    protected ToStringHelper string() {
@@ -557,7 +729,9 @@
             .add("releaseDate", releaseDate).add("zoneId", zoneId).add("virtualMachineId", virtualMachineId)
             .add("virtualMachineName", virtualMachineName).add("serviceOfferingId", serviceOfferingId).add("templateId", templateId)
             .add("ipAddress", ipAddress).add("isSourceNAT", isSourceNAT).add("rawUsageHours", rawUsageHours).add("usage", usage)
-            .add("size", size).add("type", type).add("usageType", usageType).add("project", project).add("projectId", projectId);
+            .add("size", size).add("type", type).add("usageType", usageType).add("project", project).add("projectId", projectId)
+            .add("domain", domain).add("virtualSize", virtualSize).add("cpuNumber", cpuNumber).add("cpuSpeed", cpuSpeed).add("memory", memory)
+            .add("isSystem", isSystem).add("networkId", networkId).add("isDefault", isDefault).add("tags", tags);
    }
 
    @Override
diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/options/ListUsageRecordsOptions.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/options/ListUsageRecordsOptions.java
index 8725226..b070058 100644
--- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/options/ListUsageRecordsOptions.java
+++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/options/ListUsageRecordsOptions.java
@@ -65,6 +65,11 @@
          ListUsageRecordsOptions options = new ListUsageRecordsOptions();
          return options.pageSize(pageSize);
       }
+      
+      public static ListUsageRecordsOptions includeTags(boolean includeTags) {
+         ListUsageRecordsOptions options = new ListUsageRecordsOptions();
+         return options.includeTags(includeTags);
+      }
 
    }
 
@@ -107,5 +112,9 @@
       this.queryParameters.replaceValues("pagesize", ImmutableSet.of(pageSize));
       return this;
    }
-	
+   
+   public ListUsageRecordsOptions includeTags(boolean includeTags) {
+      this.queryParameters.replaceValues("includetags", ImmutableSet.of(includeTags + ""));
+      return this;
+   } 
 }
diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/options/ListUsageRecordsOptionsTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/options/ListUsageRecordsOptionsTest.java
index 80b9896..cc1bcba 100644
--- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/options/ListUsageRecordsOptionsTest.java
+++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/options/ListUsageRecordsOptionsTest.java
@@ -20,6 +20,7 @@
 import static org.jclouds.cloudstack.options.ListUsageRecordsOptions.Builder.accountInDomain;
 import static org.jclouds.cloudstack.options.ListUsageRecordsOptions.Builder.domainId;
 import static org.jclouds.cloudstack.options.ListUsageRecordsOptions.Builder.keyword;
+import static org.jclouds.cloudstack.options.ListUsageRecordsOptions.Builder.includeTags;
 import static org.jclouds.cloudstack.options.ListUsageRecordsOptions.Builder.page;
 import static org.jclouds.cloudstack.options.ListUsageRecordsOptions.Builder.pageSize;
 import static org.jclouds.cloudstack.options.ListUsageRecordsOptions.Builder.type;
@@ -91,5 +92,14 @@
         ListUsageRecordsOptions options = pageSize("500");
         assertEquals(ImmutableSet.of("500"), options.buildQueryParameters().get("pagesize"));
     }
-	
+    
+    public void testIncludeTags() {
+        ListUsageRecordsOptions options = new ListUsageRecordsOptions().includeTags(true);
+        assertEquals(ImmutableSet.of("true"), options.buildQueryParameters().get("includetags"));
+    }
+
+    public void testIncludeTagsStatic() {
+        ListUsageRecordsOptions options = includeTags(true);
+        assertEquals(ImmutableSet.of("true"), options.buildQueryParameters().get("includetags"));
+    }
 }
diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/parse/ListUsageRecordsResponseTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/parse/ListUsageRecordsResponseTest.java
index 9bc5ec3..fe0d09f 100644
--- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/parse/ListUsageRecordsResponseTest.java
+++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/parse/ListUsageRecordsResponseTest.java
@@ -31,6 +31,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
+import org.jclouds.cloudstack.domain.Tag;
 
 @Test(groups = "unit")
 public class ListUsageRecordsResponseTest extends BaseSetParserTest<UsageRecord> {
@@ -61,7 +62,9 @@
                .description("Template Id:203 Size:3117171712")
                .usage("24 Hrs").usageType(UsageRecord.UsageType.TEMPLATE).rawUsageHours(24)
                .size(3117171712L).templateId("0").id("203").project("project1").projectId("1")
-               .startDate(start).endDate(end).build());
+               .startDate(start).endDate(end).domain("myDomain").virtualSize(3117171712L)
+               .cpuNumber(2L).cpuSpeed(1024L).memory(512L).isSystem(false).isDefault(false)
+               .tags(ImmutableSet.of(Tag.builder().key("env").value("dev").build())).build());
 
    }
    
diff --git a/apis/cloudstack/src/test/resources/listusagerecordsresponse.json b/apis/cloudstack/src/test/resources/listusagerecordsresponse.json
index d1bc292..96fdc82 100644
--- a/apis/cloudstack/src/test/resources/listusagerecordsresponse.json
+++ b/apis/cloudstack/src/test/resources/listusagerecordsresponse.json
@@ -1 +1 @@
-{ "listusagerecordsresponse" : { "count":1 ,"usagerecord" : [  {"account":"admin","accountid":2,"domainid":1,"zoneid":1,"description":"Template Id:203 Size:3117171712","usage":"24 Hrs","usagetype":7,"rawusage":"24","templateid":0,"usageid":203,"size":3117171712,"project":"project1","projectid":1,"startdate":"2011-12-15'T'00:00:00+00:00","enddate":"2011-12-15'T'23:59:59+00:00"} ] } }
\ No newline at end of file
+{ "listusagerecordsresponse" : { "count":1 ,"usagerecord" : [  {"account":"admin","accountid":2,"domainid":1,"zoneid":1,"description":"Template Id:203 Size:3117171712","usage":"24 Hrs","usagetype":7,"rawusage":"24","templateid":0,"usageid":203,"size":3117171712,"project":"project1","projectid":1,"startdate":"2011-12-15'T'00:00:00+00:00","enddate":"2011-12-15'T'23:59:59+00:00","domain":"myDomain","virtualsize":3117171712,"cpunumber":2,"cpuspeed":1024,"memory":512,"issystem":false,"isdefault":false,tags:[ { "key":"env","value":"dev" } ] } ] } }
\ No newline at end of file