You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cloudstack.apache.org by Chip Childers <ch...@sungard.com> on 2013/02/05 16:18:41 UTC

Fwd: [2/2] git commit: refs/heads/4.1 - CLOUDSTACK-786, CLOUDSTACK-1014: Moved usage APIs to cloud-api. Removed ManagementServerExt. Usage API related implementation is added to UsageServiceImpl

Hey Kishan,

Was this refactoring needed as part of 4.1?


---------- Forwarded message ----------
From:  <ki...@apache.org>
Date: Tue, Feb 5, 2013 at 6:18 AM
Subject: [2/2] git commit: refs/heads/4.1 - CLOUDSTACK-786,
CLOUDSTACK-1014: Moved usage APIs to cloud-api. Removed
ManagementServerExt. Usage API related implementation is added to
UsageServiceImpl
To: cloudstack-commits@incubator.apache.org


Updated Branches:
  refs/heads/4.1 2fd8b15d6 -> 7970384f6


CLOUDSTACK-786, CLOUDSTACK-1014: Moved usage APIs to cloud-api.
Removed ManagementServerExt. Usage API related implementation is added
to UsageServiceImpl


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/7970384f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/7970384f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/7970384f

Branch: refs/heads/4.1
Commit: 7970384f6e429b5c97f6d6e80f59cbab6ce90ede
Parents: 2fd8b15
Author: Kishan Kavala <ki...@cloud.com>
Authored: Tue Feb 5 16:43:18 2013 +0530
Committer: Kishan Kavala <ki...@cloud.com>
Committed: Tue Feb 5 16:43:40 2013 +0530

----------------------------------------------------------------------
 api/src/com/cloud/dao/EntityManager.java           |   10 +
 api/src/com/cloud/network/NetworkUsageService.java |   37 ++
 api/src/org/apache/cloudstack/api/BaseCmd.java     |    4 +
 .../apache/cloudstack/api/ResponseGenerator.java   |    7 +
 .../command/admin/usage/AddTrafficMonitorCmd.java  |  107 +++++
 .../admin/usage/DeleteTrafficMonitorCmd.java       |   84 ++++
 .../admin/usage/GenerateUsageRecordsCmd.java       |   89 ++++
 .../command/admin/usage/GetUsageRecordsCmd.java    |  126 +++++
 .../admin/usage/ListTrafficMonitorsCmd.java        |   84 ++++
 .../api/command/admin/usage/ListUsageTypesCmd.java |   51 ++
 api/src/org/apache/cloudstack/usage/Usage.java     |   69 +++
 .../org/apache/cloudstack/usage/UsageService.java  |   64 +++
 .../org/apache/cloudstack/usage/UsageTypes.java    |   58 +++
 client/tomcatconf/componentContext.xml.in          |    2 +-
 .../server/ManagementServerSimulatorImpl.java      |    2 +-
 .../dns-notifier/resources/components-example.xml  |    2 +-
 server/src/com/cloud/api/ApiDBUtils.java           |   14 +-
 server/src/com/cloud/api/ApiResponseHelper.java    |  253 ++++++++++
 .../cloud/api/commands/AddTrafficMonitorCmd.java   |  109 -----
 .../api/commands/DeleteTrafficMonitorCmd.java      |   86 ----
 .../api/commands/GenerateUsageRecordsCmd.java      |   91 ----
 .../com/cloud/api/commands/GetUsageRecordsCmd.java |  370 ---------------
 .../cloud/api/commands/ListTrafficMonitorsCmd.java |   86 ----
 .../com/cloud/api/commands/ListUsageTypesCmd.java  |   53 --
 server/src/com/cloud/dao/EntityManagerImpl.java    |    7 +-
 .../src/com/cloud/network/NetworkUsageManager.java |   14 -
 .../com/cloud/network/NetworkUsageManagerImpl.java |   20 +-
 .../src/com/cloud/server/ManagementServerExt.java  |   63 ---
 .../com/cloud/server/ManagementServerExtImpl.java  |  254 ----------
 server/src/com/cloud/usage/UsageServiceImpl.java   |  261 ++++++++++
 server/src/com/cloud/usage/UsageTypes.java         |   58 ---
 server/src/com/cloud/usage/UsageVO.java            |   23 +-
 usage/src/com/cloud/usage/UsageManagerImpl.java    |    1 +
 .../cloud/usage/parser/IPAddressUsageParser.java   |    2 +-
 .../usage/parser/LoadBalancerUsageParser.java      |    2 +-
 .../usage/parser/NetworkOfferingUsageParser.java   |    2 +-
 .../com/cloud/usage/parser/NetworkUsageParser.java |    2 +-
 .../usage/parser/PortForwardingUsageParser.java    |    2 +-
 .../usage/parser/SecurityGroupUsageParser.java     |    2 +-
 .../com/cloud/usage/parser/StorageUsageParser.java |    2 +-
 .../cloud/usage/parser/VMInstanceUsageParser.java  |    2 +-
 .../com/cloud/usage/parser/VPNUserUsageParser.java |    2 +-
 .../com/cloud/usage/parser/VolumeUsageParser.java  |    2 +-
 43 files changed, 1358 insertions(+), 1221 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/com/cloud/dao/EntityManager.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/dao/EntityManager.java
b/api/src/com/cloud/dao/EntityManager.java
index b8fdaa7..8e6a438 100644
--- a/api/src/com/cloud/dao/EntityManager.java
+++ b/api/src/com/cloud/dao/EntityManager.java
@@ -39,6 +39,16 @@ public interface EntityManager {
     public <T, K extends Serializable> T findById(Class<T> entityType, K id);

     /**
+     * Finds an entity by its id including removed.
+     * @param <T> class of the entity you're trying to find.
+     * @param <K> class of the id that the entity uses.
+     * @param entityType Type of the entity.
+     * @param id id value
+     * @return T if found; null if not.
+     */
+    public <T, K extends Serializable> T
findByIdIncludingRemoved(Class<T> entityType, K id);
+
+    /**
      * Finds a unique entity by uuid string
      * @param <T> entity class
      * @param entityType type of entity you're looking for.

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/com/cloud/network/NetworkUsageService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/NetworkUsageService.java
b/api/src/com/cloud/network/NetworkUsageService.java
new file mode 100644
index 0000000..1cfea24
--- /dev/null
+++ b/api/src/com/cloud/network/NetworkUsageService.java
@@ -0,0 +1,37 @@
+// 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 com.cloud.network;
+
+import java.util.List;
+
+import com.cloud.host.Host;
+
+import org.apache.cloudstack.api.command.admin.usage.AddTrafficMonitorCmd;
+import org.apache.cloudstack.api.command.admin.usage.DeleteTrafficMonitorCmd;
+import org.apache.cloudstack.api.command.admin.usage.ListTrafficMonitorsCmd;
+import org.apache.cloudstack.api.response.TrafficMonitorResponse;
+import com.cloud.utils.component.Manager;
+
+public interface NetworkUsageService extends Manager {
+
+    Host addTrafficMonitor(AddTrafficMonitorCmd cmd);
+
+    boolean deleteTrafficMonitor(DeleteTrafficMonitorCmd cmd);
+
+    List<? extends Host> listTrafficMonitors(ListTrafficMonitorsCmd cmd);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/BaseCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java
b/api/src/org/apache/cloudstack/api/BaseCmd.java
index d8e2bff..a9ac489 100644
--- a/api/src/org/apache/cloudstack/api/BaseCmd.java
+++ b/api/src/org/apache/cloudstack/api/BaseCmd.java
@@ -29,6 +29,7 @@ import javax.inject.Inject;

 import org.apache.cloudstack.query.QueryService;
 import org.apache.cloudstack.region.RegionService;
+import org.apache.cloudstack.usage.UsageService;
 import org.apache.log4j.Logger;

 import com.cloud.configuration.ConfigurationService;
@@ -43,6 +44,7 @@ import com.cloud.exception.PermissionDeniedException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.NetworkService;
+import com.cloud.network.NetworkUsageService;
 import com.cloud.network.StorageNetworkService;
 import com.cloud.network.VpcVirtualNetworkApplianceService;
 import com.cloud.network.as.AutoScaleService;
@@ -124,6 +126,8 @@ public abstract class BaseCmd {
     @Inject public Site2SiteVpnService _s2sVpnService;

     @Inject public QueryService _queryService;
+    @Inject public UsageService _usageService;
+    @Inject public NetworkUsageService _networkUsageService;

     public abstract void execute() throws
ResourceUnavailableException, InsufficientCapacityException,
ServerApiException, ConcurrentOperationException,
ResourceAllocationException, NetworkRuleConflictException;


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/ResponseGenerator.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java
b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
index b95f182..0dc85de 100644
--- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java
+++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
@@ -83,7 +83,9 @@ import
org.apache.cloudstack.api.response.SystemVmInstanceResponse;
 import org.apache.cloudstack.api.response.SystemVmResponse;
 import org.apache.cloudstack.api.response.TemplatePermissionsResponse;
 import org.apache.cloudstack.api.response.TemplateResponse;
+import org.apache.cloudstack.api.response.TrafficMonitorResponse;
 import org.apache.cloudstack.api.response.TrafficTypeResponse;
+import org.apache.cloudstack.api.response.UsageRecordResponse;
 import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.api.response.VirtualRouterProviderResponse;
@@ -94,6 +96,7 @@ import org.apache.cloudstack.api.response.VpcResponse;
 import org.apache.cloudstack.api.response.VpnUsersResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
 import org.apache.cloudstack.region.Region;
+import org.apache.cloudstack.usage.Usage;

 import com.cloud.async.AsyncJob;
 import com.cloud.capacity.Capacity;
@@ -375,4 +378,8 @@ public interface ResponseGenerator {
     GuestOSResponse createGuestOSResponse(GuestOS os);

     SnapshotScheduleResponse
createSnapshotScheduleResponse(SnapshotSchedule sched);
+
+    UsageRecordResponse createUsageResponse(Usage usageRecord);
+
+       TrafficMonitorResponse createTrafficMonitorResponse(Host
trafficMonitor);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMonitorCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMonitorCmd.java
b/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMonitorCmd.java
new file mode 100644
index 0000000..48424fe
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMonitorCmd.java
@@ -0,0 +1,107 @@
+// 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.apache.cloudstack.api.command.admin.usage;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.TrafficMonitorResponse;
+import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.log4j.Logger;
+
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.host.Host;
+import com.cloud.user.Account;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+@APICommand(name = "addTrafficMonitor", description="Adds Traffic
Monitor Host for Direct Network Usage", responseObject =
TrafficMonitorResponse.class)
+public class AddTrafficMonitorCmd extends BaseCmd {
+    public static final Logger s_logger =
Logger.getLogger(AddTrafficMonitorCmd.class.getName());
+    private static final String s_name = "addtrafficmonitorresponse";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID,
entityType = ZoneResponse.class,
+            required = true, description="Zone in which to add the
external firewall appliance.")
+    private Long zoneId;
+
+    @Parameter(name=ApiConstants.URL, type=CommandType.STRING,
required = true, description="URL of the traffic monitor Host")
+    private String url;
+
+    @Parameter(name=ApiConstants.INCL_ZONES, type=CommandType.STRING,
description="Traffic going into the listed zones will be metered")
+    private String inclZones;
+
+    @Parameter(name=ApiConstants.EXCL_ZONES, type=CommandType.STRING,
description="Traffic going into the listed zones will not be metered")
+    private String exclZones;
+
+    ///////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public String getInclZones() {
+        return inclZones;
+    }
+
+    public String getExclZones() {
+        return exclZones;
+    }
+
+    public Long getZoneId() {
+        return zoneId;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+    @Override
+    public void execute(){
+        try {
+            Host trafficMonitor = _networkUsageService.addTrafficMonitor(this);
+            TrafficMonitorResponse response =
_responseGenerator.createTrafficMonitorResponse(trafficMonitor);
+            response.setObjectName("trafficmonitor");
+            response.setResponseName(getCommandName());
+            this.setResponseObject(response);
+        } catch (InvalidParameterValueException ipve) {
+                       throw new
ServerApiException(ApiErrorCode.PARAM_ERROR, ipve.getMessage());
+        } catch (CloudRuntimeException cre) {
+                       throw new
ServerApiException(ApiErrorCode.INTERNAL_ERROR, cre.getMessage());
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficMonitorCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficMonitorCmd.java
b/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficMonitorCmd.java
new file mode 100644
index 0000000..e3bb299
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficMonitorCmd.java
@@ -0,0 +1,84 @@
+// 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.apache.cloudstack.api.command.admin.usage;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.HostResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.log4j.Logger;
+
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.user.Account;
+
+@APICommand(name = "deleteTrafficMonitor", description="Deletes an
traffic monitor host.", responseObject = SuccessResponse.class)
+public class DeleteTrafficMonitorCmd extends BaseCmd {
+    public static final Logger s_logger =
Logger.getLogger(DeleteTrafficMonitorCmd.class.getName());
+    private static final String s_name = "deletetrafficmonitorresponse";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name=ApiConstants.ID, type=CommandType.UUID,
entityType = HostResponse.class,
+            required = true, description="Id of the Traffic Monitor Host.")
+    private Long id;
+
+    ///////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+    @Override
+    public void execute(){
+        try {
+            boolean result = _networkUsageService.deleteTrafficMonitor(this);
+            if (result) {
+                SuccessResponse response = new
SuccessResponse(getCommandName());
+                response.setResponseName(getCommandName());
+                this.setResponseObject(response);
+            } else {
+                               throw new
ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete
traffic monitor.");
+            }
+        } catch (InvalidParameterValueException e) {
+                       throw new
ServerApiException(ApiErrorCode.PARAM_ERROR, "Failed to delete traffic
monitor.");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsageRecordsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsageRecordsCmd.java
b/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsageRecordsCmd.java
new file mode 100644
index 0000000..13710f9
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsageRecordsCmd.java
@@ -0,0 +1,89 @@
+// 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.apache.cloudstack.api.command.admin.usage;
+
+import java.util.Date;
+
+import org.apache.cloudstack.api.*;
+import org.apache.cloudstack.api.response.DomainResponse;
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import com.cloud.user.Account;
+
+@APICommand(name = "generateUsageRecords", description="Generates
usage records. This will generate records only if there any records to
be generated, i.e if the scheduled usage job was not run or failed",
responseObject=SuccessResponse.class)
+public class GenerateUsageRecordsCmd extends BaseCmd {
+    public static final Logger s_logger =
Logger.getLogger(GenerateUsageRecordsCmd.class.getName());
+
+    private static final String s_name = "generateusagerecordsresponse";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.UUID,
entityType = DomainResponse.class,
+            description="List events for the specified domain.")
+    private Long domainId;
+
+    @Parameter(name=ApiConstants.END_DATE, type=CommandType.DATE,
required=true, description="End date range for usage record query. Use
yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.")
+    private Date endDate;
+
+    @Parameter(name=ApiConstants.START_DATE, type=CommandType.DATE,
required=true, description="Start date range for usage record query.
Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.")
+    private Date startDate;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getDomainId() {
+        return domainId;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public Date getStartDate() {
+        return startDate;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+    @Override
+    public void execute(){
+        boolean result = _usageService.generateUsageRecords(this);
+        if (result) {
+            SuccessResponse response = new SuccessResponse(getCommandName());
+            this.setResponseObject(response);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
"Failed to generate usage records");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
b/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
new file mode 100644
index 0000000..f4960dd
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
@@ -0,0 +1,126 @@
+// 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.apache.cloudstack.api.command.admin.usage;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.TimeZone;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseListCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.response.AccountResponse;
+import org.apache.cloudstack.api.response.DomainResponse;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.ProjectResponse;
+import org.apache.cloudstack.api.response.UsageRecordResponse;
+import org.apache.cloudstack.usage.Usage;
+import org.apache.log4j.Logger;
+
+@APICommand(name = "listUsageRecords", description="Lists usage
records for accounts", responseObject=UsageRecordResponse.class)
+public class GetUsageRecordsCmd extends BaseListCmd {
+    public static final Logger s_logger =
Logger.getLogger(GetUsageRecordsCmd.class.getName());
+
+    private static final String s_name = "listusagerecordsresponse";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name=ApiConstants.ACCOUNT, type=CommandType.STRING,
description="List usage records for the specified user.")
+    private String accountName;
+
+    @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.UUID,
entityType = DomainResponse.class,
+            description="List usage records for the specified domain.")
+    private Long domainId;
+
+    @Parameter(name=ApiConstants.END_DATE, type=CommandType.DATE,
required=true, description="End date range for usage record query. Use
yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.")
+    private Date endDate;
+
+    @Parameter(name=ApiConstants.START_DATE, type=CommandType.DATE,
required=true, description="Start date range for usage record query.
Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.")
+    private Date startDate;
+
+    @Parameter(name=ApiConstants.ACCOUNT_ID, type=CommandType.UUID,
entityType = AccountResponse.class,
+            description="List usage records for the specified account")
+    private Long accountId;
+
+    @Parameter(name=ApiConstants.PROJECT_ID, type=CommandType.UUID,
entityType = ProjectResponse.class,
+            description="List usage records for specified project")
+    private Long projectId;
+
+    @Parameter(name=ApiConstants.TYPE, type=CommandType.LONG,
description="List usage records for the specified usage type")
+    private Long usageType;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public String getAccountName() {
+        return accountName;
+    }
+
+    public Long getDomainId() {
+        return domainId;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public Date getStartDate() {
+        return startDate;
+    }
+
+    public Long getAccountId() {
+        return accountId;
+    }
+
+    public Long getUsageType() {
+        return usageType;
+    }
+
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public void execute(){
+        List<? extends Usage> usageRecords =
_usageService.getUsageRecords(this);
+        ListResponse<UsageRecordResponse> response = new
ListResponse<UsageRecordResponse>();
+        List<UsageRecordResponse> usageResponses = new
ArrayList<UsageRecordResponse>();
+        for(Usage usageRecord: usageRecords){
+               UsageRecordResponse usageResponse =
_responseGenerator.createUsageResponse(usageRecord);
+               usageResponse.setObjectName("usagerecord");
+               usageResponses.add(usageResponse);
+        }
+
+        response.setResponses(usageResponses);
+        response.setResponseName(getCommandName());
+        this.setResponseObject(response);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMonitorsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMonitorsCmd.java
b/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMonitorsCmd.java
new file mode 100644
index 0000000..e8e3b22
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMonitorsCmd.java
@@ -0,0 +1,84 @@
+// 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.apache.cloudstack.api.command.admin.usage;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseListCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.TrafficMonitorResponse;
+import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.log4j.Logger;
+
+import com.cloud.host.Host;
+
+
+@APICommand(name = "listTrafficMonitors", description="List traffic
monitor Hosts.", responseObject = TrafficMonitorResponse.class)
+public class ListTrafficMonitorsCmd extends BaseListCmd {
+    public static final Logger s_logger =
Logger.getLogger(ListServiceOfferingsCmd.class.getName());
+    private static final String s_name = "listtrafficmonitorsresponse";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID,
entityType = ZoneResponse.class,
+            required = true, description="zone Id")
+    private long zoneId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public long getZoneId() {
+        return zoneId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public void execute(){
+        List<? extends Host> trafficMonitors =
_networkUsageService.listTrafficMonitors(this);
+
+        ListResponse<TrafficMonitorResponse> listResponse = new
ListResponse<TrafficMonitorResponse>();
+        List<TrafficMonitorResponse> responses = new
ArrayList<TrafficMonitorResponse>();
+        for (Host trafficMonitor : trafficMonitors) {
+            TrafficMonitorResponse response =
_responseGenerator.createTrafficMonitorResponse(trafficMonitor);
+            response.setObjectName("trafficmonitor");
+            response.setResponseName(getCommandName());
+            responses.add(response);
+        }
+
+        listResponse.setResponses(responses);
+        listResponse.setResponseName(getCommandName());
+        this.setResponseObject(listResponse);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTypesCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTypesCmd.java
b/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTypesCmd.java
new file mode 100644
index 0000000..bc02911
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTypesCmd.java
@@ -0,0 +1,51 @@
+// 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.apache.cloudstack.api.command.admin.usage;
+
+import java.util.List;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.UsageTypeResponse;
+import com.cloud.user.Account;
+
+@APICommand(name = "listUsageTypes", description = "List Usage
Types", responseObject = UsageTypeResponse.class)
+public class ListUsageTypesCmd extends BaseCmd {
+    public static final Logger s_logger =
Logger.getLogger(ListUsageTypesCmd.class.getName());
+    private static final String s_name = "listusagetypesresponse";
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+    @Override
+    public void execute() {
+        List<UsageTypeResponse> result = _usageService.listUsageTypes();
+        ListResponse<UsageTypeResponse> response = new
ListResponse<UsageTypeResponse>();
+        response.setResponses(result);
+        response.setResponseName(getCommandName());
+        this.setResponseObject(response);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/usage/Usage.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/usage/Usage.java
b/api/src/org/apache/cloudstack/usage/Usage.java
new file mode 100644
index 0000000..c74d3b7
--- /dev/null
+++ b/api/src/org/apache/cloudstack/usage/Usage.java
@@ -0,0 +1,69 @@
+// 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.apache.cloudstack.usage;
+
+import org.apache.cloudstack.api.InternalIdentity;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+public interface Usage {
+
+       public long getId();
+
+       public Long getZoneId();
+
+       public Long getAccountId();
+
+    public Long getDomainId();
+
+       public String getDescription();
+
+       public String getUsageDisplay();
+
+       public int getUsageType();
+
+    public Double getRawUsage();
+
+    public Long getVmInstanceId();
+
+    public String getVmName();
+
+    public Long getOfferingId();
+
+    public Long getTemplateId();
+
+    public Long getUsageId();
+
+    public String getType();
+
+    public Long getNetworkId();
+
+    public Long getSize();
+
+       public Date getStartDate();
+
+       public Date getEndDate();
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/usage/UsageService.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/usage/UsageService.java
b/api/src/org/apache/cloudstack/usage/UsageService.java
new file mode 100755
index 0000000..3838225
--- /dev/null
+++ b/api/src/org/apache/cloudstack/usage/UsageService.java
@@ -0,0 +1,64 @@
+// 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.apache.cloudstack.usage;
+
+import java.util.List;
+import java.util.TimeZone;
+
+import org.apache.cloudstack.api.command.admin.usage.GenerateUsageRecordsCmd;
+import org.apache.cloudstack.api.command.admin.usage.GetUsageRecordsCmd;
+import org.apache.cloudstack.api.response.UsageTypeResponse;
+
+public interface UsageService {
+    /**
+     * Generate Billing Records from the last time it was generated to the
+     * time specified.
+     *
+     * @param cmd the command wrapping the generate parameters
+     *   - userId unique id of the user, pass in -1 to generate billing records
+     *            for all users
+     *   - startDate
+     *   - endDate inclusive.  If date specified is greater than the
current time, the
+     *             system will use the current time.
+     */
+    boolean generateUsageRecords(GenerateUsageRecordsCmd cmd);
+
+    /**
+     * Retrieves all Usage Records generated between the start and
end date specified
+     *
+     * @param userId unique id of the user, pass in -1 to retrieve
billing records
+     *        for all users
+     * @param startDate inclusive.
+     * @param endDate inclusive.  If date specified is greater than
the current time, the
+     *                system will use the current time.
+     * @param page The page of usage records to see (500 results are
returned at a time, if
+     *             more than 500 records exist then additional
results can be retrieved by
+     *             the appropriate page number)
+     * @return a list of usage records
+     */
+    List<? extends Usage> getUsageRecords(GetUsageRecordsCmd cmd);
+
+    /**
+     * Retrieves the timezone used for usage aggregation.  One day is
represented as midnight to 11:59:59pm
+     * in the given time zone
+     * @return the timezone specified by the config value
usage.aggregation.timezone, or GMT if null
+     */
+    TimeZone getUsageTimezone();
+
+       List<UsageTypeResponse> listUsageTypes();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/usage/UsageTypes.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/usage/UsageTypes.java
b/api/src/org/apache/cloudstack/usage/UsageTypes.java
new file mode 100644
index 0000000..2baa1d2
--- /dev/null
+++ b/api/src/org/apache/cloudstack/usage/UsageTypes.java
@@ -0,0 +1,58 @@
+// 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.apache.cloudstack.usage;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cloudstack.api.response.UsageTypeResponse;
+
+public class UsageTypes {
+    public static final int RUNNING_VM = 1;
+    public static final int ALLOCATED_VM = 2; // used for tracking
how long storage has been allocated for a VM
+    public static final int IP_ADDRESS = 3;
+    public static final int NETWORK_BYTES_SENT = 4;
+    public static final int NETWORK_BYTES_RECEIVED = 5;
+    public static final int VOLUME = 6;
+    public static final int TEMPLATE = 7;
+    public static final int ISO = 8;
+    public static final int SNAPSHOT = 9;
+    public static final int SECURITY_GROUP = 10;
+    public static final int LOAD_BALANCER_POLICY = 11;
+    public static final int PORT_FORWARDING_RULE = 12;
+    public static final int NETWORK_OFFERING = 13;
+    public static final int VPN_USERS = 14;
+
+    public static List<UsageTypeResponse> listUsageTypes(){
+       List<UsageTypeResponse> responseList = new
ArrayList<UsageTypeResponse>();
+       responseList.add(new UsageTypeResponse(RUNNING_VM, "Running Vm Usage"));
+       responseList.add(new UsageTypeResponse(ALLOCATED_VM,
"Allocated Vm Usage"));
+       responseList.add(new UsageTypeResponse(IP_ADDRESS, "IP Address Usage"));
+       responseList.add(new UsageTypeResponse(NETWORK_BYTES_SENT,
"Network Usage (Bytes Sent)"));
+       responseList.add(new UsageTypeResponse(NETWORK_BYTES_RECEIVED,
"Network Usage (Bytes Received)"));
+       responseList.add(new UsageTypeResponse(VOLUME, "Volume Usage"));
+       responseList.add(new UsageTypeResponse(TEMPLATE, "Template Usage"));
+       responseList.add(new UsageTypeResponse(ISO, "ISO Usage"));
+       responseList.add(new UsageTypeResponse(SNAPSHOT, "Snapshot Usage"));
+       responseList.add(new UsageTypeResponse(SECURITY_GROUP,
"Security Group Usage"));
+       responseList.add(new UsageTypeResponse(LOAD_BALANCER_POLICY,
"Load Balancer Usage"));
+       responseList.add(new UsageTypeResponse(PORT_FORWARDING_RULE,
"Port Forwarding Usage"));
+       responseList.add(new UsageTypeResponse(NETWORK_OFFERING,
"Network Offering Usage"));
+       responseList.add(new UsageTypeResponse(VPN_USERS, "VPN users usage"));
+       return responseList;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/client/tomcatconf/componentContext.xml.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/componentContext.xml.in
b/client/tomcatconf/componentContext.xml.in
index e3bf982..065188c 100644
--- a/client/tomcatconf/componentContext.xml.in
+++ b/client/tomcatconf/componentContext.xml.in
@@ -36,7 +36,7 @@
   -->
   <bean id="databaseUpgradeChecker"
class="com.cloud.upgrade.DatabaseUpgradeChecker" />

-  <bean id="management-server" class
="com.cloud.server.ManagementServerExtImpl" />
+  <bean id="management-server" class
="com.cloud.server.ManagementServerImpl" />
   <bean id="configuration-server"
class="com.cloud.server.ConfigurationServerImpl" />

   <bean id="clusterManagerImpl" class="com.cloud.cluster.ClusterManagerImpl" />

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
b/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
index db4b619..728271c 100644
--- a/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
+++ b/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
@@ -21,7 +21,7 @@ import java.util.List;

 import com.cloud.api.commands.ConfigureSimulator;

-public class ManagementServerSimulatorImpl extends ManagementServerExtImpl {
+public class ManagementServerSimulatorImpl extends ManagementServerImpl {
     @Override
     public List<Class<?>> getCommands() {
         List<Class<?>> cmdList = super.getCommands();

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/plugins/network-elements/dns-notifier/resources/components-example.xml
----------------------------------------------------------------------
diff --git a/plugins/network-elements/dns-notifier/resources/components-example.xml
b/plugins/network-elements/dns-notifier/resources/components-example.xml
index 412da0e..36441bd 100755
--- a/plugins/network-elements/dns-notifier/resources/components-example.xml
+++ b/plugins/network-elements/dns-notifier/resources/components-example.xml
@@ -29,7 +29,7 @@ under the License.
     </system-integrity-checker>

     <interceptor library="com.cloud.configuration.DefaultInterceptorLibrary"/>
-    <management-server
class="com.cloud.server.ManagementServerExtImpl"
library="com.cloud.configuration.PremiumComponentLibrary">
+    <management-server class="com.cloud.server.ManagementServerImpl"
library="com.cloud.configuration.PremiumComponentLibrary">
         <dao name="Configuration configuration server"
class="com.cloud.configuration.dao.ConfigurationDaoImpl">
              <param name="premium">true</param>
         </dao>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/ApiDBUtils.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiDBUtils.java
b/server/src/com/cloud/api/ApiDBUtils.java
index 8e950ab..83132c6 100755
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@ -83,8 +83,6 @@ import com.cloud.api.query.vo.StoragePoolJoinVO;
 import com.cloud.api.query.vo.UserAccountJoinVO;
 import com.cloud.api.query.vo.UserVmJoinVO;
 import com.cloud.api.query.vo.VolumeJoinVO;
-import com.cloud.api.query.dao.*;
-import com.cloud.api.query.vo.*;
 import com.cloud.async.AsyncJob;
 import com.cloud.async.AsyncJobManager;
 import com.cloud.async.AsyncJobVO;
@@ -108,6 +106,7 @@ import com.cloud.host.Host;
 import com.cloud.host.HostStats;
 import com.cloud.host.HostVO;
 import com.cloud.host.dao.HostDao;
+import com.cloud.host.dao.HostDetailsDao;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.network.IpAddress;
 import com.cloud.network.Network;
@@ -156,10 +155,6 @@ import com.cloud.network.dao.Site2SiteCustomerGatewayDao;
 import com.cloud.network.dao.Site2SiteCustomerGatewayVO;
 import com.cloud.network.dao.Site2SiteVpnGatewayDao;
 import com.cloud.network.dao.Site2SiteVpnGatewayVO;
-import com.cloud.network.*;
-import com.cloud.network.as.*;
-import com.cloud.network.as.dao.*;
-import com.cloud.network.dao.*;
 import com.cloud.network.router.VirtualRouter;
 import com.cloud.network.rules.FirewallRuleVO;
 import com.cloud.network.security.SecurityGroup;
@@ -313,6 +308,7 @@ public class ApiDBUtils {
     static VpcOfferingDao _vpcOfferingDao;
     static SnapshotPolicyDao _snapshotPolicyDao;
     static AsyncJobDao _asyncJobDao;
+    static HostDetailsDao _hostDetailsDao;

     @Inject private ManagementServer ms;
     @Inject public AsyncJobManager asyncMgr;
@@ -410,6 +406,7 @@ public class ApiDBUtils {
     @Inject private VpcOfferingDao vpcOfferingDao;
     @Inject private SnapshotPolicyDao snapshotPolicyDao;
     @Inject private AsyncJobDao asyncJobDao;
+    @Inject private HostDetailsDao hostDetailsDao;

     @PostConstruct
     void init() {
@@ -507,6 +504,7 @@ public class ApiDBUtils {
         _vpcOfferingDao = vpcOfferingDao;
         _snapshotPolicyDao = snapshotPolicyDao;
         _asyncJobDao = asyncJobDao;
+        _hostDetailsDao = hostDetailsDao;

         // Note: stats collector should already have been initialized
by this time, otherwise a null instance is returned
         _statsCollector = StatsCollector.getInstance();
@@ -1493,4 +1491,8 @@ public class ApiDBUtils {
    public static DataCenterJoinVO newDataCenterView(DataCenter dc){
        return _dcJoinDao.newDataCenterView(dc);
    }
+
+   public static Map<String, String> findHostDetailsById(long hostId){
+          return _hostDetailsDao.findDetails(hostId);
+   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java
b/server/src/com/cloud/api/ApiResponseHelper.java
index 411de94..8c97615 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -81,7 +81,9 @@ import
org.apache.cloudstack.api.response.SystemVmInstanceResponse;
 import org.apache.cloudstack.api.response.SystemVmResponse;
 import org.apache.cloudstack.api.response.TemplatePermissionsResponse;
 import org.apache.cloudstack.api.response.TemplateResponse;
+import org.apache.cloudstack.api.response.TrafficMonitorResponse;
 import org.apache.cloudstack.api.response.TrafficTypeResponse;
+import org.apache.cloudstack.api.response.UsageRecordResponse;
 import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.api.response.VirtualRouterProviderResponse;
@@ -103,6 +105,7 @@ import com.cloud.configuration.Configuration;
 import com.cloud.configuration.Resource.ResourceOwnerType;
 import com.cloud.configuration.ResourceCount;
 import com.cloud.configuration.ResourceLimit;
+import com.cloud.dao.EntityManager;
 import com.cloud.dc.*;
 import com.cloud.dc.Vlan.VlanType;
 import com.cloud.domain.Domain;
@@ -139,6 +142,7 @@ import com.cloud.network.dao.PhysicalNetworkVO;
 import com.cloud.network.router.VirtualRouter;
 import com.cloud.network.rules.*;
 import com.cloud.network.security.SecurityGroup;
+import com.cloud.network.security.SecurityGroupVO;
 import com.cloud.network.security.SecurityRule;
 import com.cloud.network.security.SecurityRule.SecurityRuleType;
 import com.cloud.network.vpc.PrivateGateway;
@@ -148,6 +152,7 @@ import com.cloud.network.vpc.VpcOffering;
 import com.cloud.offering.DiskOffering;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offering.ServiceOffering;
+import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.org.Cluster;
 import com.cloud.projects.Project;
 import com.cloud.projects.ProjectAccount;
@@ -155,6 +160,7 @@ import com.cloud.projects.ProjectInvitation;
 import com.cloud.server.Criteria;
 import com.cloud.server.ResourceTag;
 import com.cloud.server.ResourceTag.TaggedResourceType;
+import com.cloud.service.ServiceOfferingVO;
 import com.cloud.storage.*;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Storage.StoragePoolType;
@@ -174,6 +180,7 @@ import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.ConsoleProxyVO;
 import com.cloud.vm.InstanceGroup;
 import com.cloud.vm.NicProfile;
+import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachine.Type;
 import org.apache.cloudstack.acl.ControlledEntity;
@@ -185,11 +192,16 @@ import org.apache.cloudstack.api.ResponseGenerator;
 import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd;
 import org.apache.cloudstack.api.response.*;
 import org.apache.cloudstack.region.Region;
+import org.apache.cloudstack.usage.Usage;
+import org.apache.cloudstack.usage.UsageService;
+import org.apache.cloudstack.usage.UsageTypes;
 import org.apache.log4j.Logger;

 import java.text.DecimalFormat;
 import java.util.*;

+import javax.inject.Inject;
+
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;

@@ -198,6 +210,8 @@ public class ApiResponseHelper implements
ResponseGenerator {

     public final Logger s_logger = Logger.getLogger(ApiResponseHelper.class);
     private static final DecimalFormat s_percentFormat = new
DecimalFormat("##.##");
+    @Inject private EntityManager _entityMgr = null;
+    @Inject private UsageService _usageSvc = null;

     @Override
     public UserResponse createUserResponse(User user) {
@@ -3118,4 +3132,243 @@ public class ApiResponseHelper implements
ResponseGenerator {
         return response;
     }

+
+
+       @Override
+       public UsageRecordResponse createUsageResponse(Usage usageRecord) {
+               UsageRecordResponse usageRecResponse = new
UsageRecordResponse();
+
+               Account account =
ApiDBUtils.findAccountByIdIncludingRemoved(usageRecord.getAccountId());
+               if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) {
+                       //find the project
+                       Project project =
ApiDBUtils.findProjectByProjectAccountIdIncludingRemoved(account.getId());
+                       usageRecResponse.setProjectId(project.getUuid());
+                       usageRecResponse.setProjectName(project.getName());
+               } else {
+                       usageRecResponse.setAccountId(account.getUuid());
+
usageRecResponse.setAccountName(account.getAccountName());
+               }
+
+               Domain domain =
ApiDBUtils.findDomainById(usageRecord.getDomainId());
+               if (domain != null) {
+                       usageRecResponse.setDomainId(domain.getUuid());
+               }
+
+               if (usageRecord.getZoneId() != null) {
+                       DataCenter zone =
ApiDBUtils.findZoneById(usageRecord.getZoneId());
+                       if (zone != null) {
+                               usageRecResponse.setZoneId(zone.getUuid());
+                       }
+               }
+               usageRecResponse.setDescription(usageRecord.getDescription());
+               usageRecResponse.setUsage(usageRecord.getUsageDisplay());
+               usageRecResponse.setUsageType(usageRecord.getUsageType());
+               if (usageRecord.getVmInstanceId() != null) {
+                       VMInstanceVO vm =
_entityMgr.findByIdIncludingRemoved(VMInstanceVO.class,
usageRecord.getVmInstanceId());
+                       usageRecResponse.setVirtualMachineId(vm.getUuid());
+               }
+               usageRecResponse.setVmName(usageRecord.getVmName());
+               if (usageRecord.getTemplateId() != null) {
+                       VMTemplateVO template =
ApiDBUtils.findTemplateById(usageRecord.getTemplateId());
+                       if (template != null) {
+
usageRecResponse.setTemplateId(template.getUuid());
+                       }
+               }
+
+               if(usageRecord.getUsageType() == UsageTypes.RUNNING_VM
|| usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM){
+                       ServiceOfferingVO svcOffering =
_entityMgr.findByIdIncludingRemoved(ServiceOfferingVO.class,
usageRecord.getOfferingId().toString());
+                       //Service Offering Id
+                       usageRecResponse.setOfferingId(svcOffering.getUuid());
+                       //VM Instance ID
+                       VMInstanceVO vm =
_entityMgr.findByIdIncludingRemoved(VMInstanceVO.class,
usageRecord.getUsageId().toString());
+                       usageRecResponse.setUsageId(vm.getUuid());
+                       //Hypervisor Type
+                       usageRecResponse.setType(usageRecord.getType());
+
+               } else if(usageRecord.getUsageType() == UsageTypes.IP_ADDRESS){
+                       //isSourceNAT
+
usageRecResponse.setSourceNat((usageRecord.getType().equals("SourceNat"))?true:false);
+                       //isSystem
+
usageRecResponse.setSystem((usageRecord.getSize() == 1)?true:false);
+                       //IP Address ID
+                       IPAddressVO ip =
_entityMgr.findByIdIncludingRemoved(IPAddressVO.class,
usageRecord.getUsageId().toString());
+                       usageRecResponse.setUsageId(ip.getUuid());
+
+               } else if(usageRecord.getUsageType() ==
UsageTypes.NETWORK_BYTES_SENT || usageRecord.getUsageType() ==
UsageTypes.NETWORK_BYTES_RECEIVED){
+                       //Device Type
+                       usageRecResponse.setType(usageRecord.getType());
+                       if(usageRecord.getType().equals("DomainRouter")){
+                               //Domain Router Id
+                               VMInstanceVO vm =
_entityMgr.findByIdIncludingRemoved(VMInstanceVO.class,
usageRecord.getUsageId().toString());
+                               usageRecResponse.setUsageId(vm.getUuid());
+                       } else {
+                               //External Device Host Id
+                               HostVO host =
_entityMgr.findByIdIncludingRemoved(HostVO.class,
usageRecord.getUsageId().toString());
+                               usageRecResponse.setUsageId(host.getUuid());
+                       }
+                       //Network ID
+                       NetworkVO network =
_entityMgr.findByIdIncludingRemoved(NetworkVO.class,
usageRecord.getNetworkId().toString());
+                       usageRecResponse.setNetworkId(network.getUuid());
+
+               } else if(usageRecord.getUsageType() == UsageTypes.VOLUME){
+                       //Volume ID
+                       VolumeVO volume =
_entityMgr.findByIdIncludingRemoved(VolumeVO.class,
usageRecord.getUsageId().toString());
+                       usageRecResponse.setUsageId(volume.getUuid());
+                       //Volume Size
+                       usageRecResponse.setSize(usageRecord.getSize());
+                       //Disk Offering Id
+                       if(usageRecord.getOfferingId() != null){
+                               DiskOfferingVO diskOff =
_entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class,
usageRecord.getOfferingId().toString());
+
usageRecResponse.setOfferingId(diskOff.getUuid());
+                       }
+
+               } else if(usageRecord.getUsageType() ==
UsageTypes.TEMPLATE || usageRecord.getUsageType() == UsageTypes.ISO){
+                       //Template/ISO ID
+                       VMTemplateVO tmpl =
_entityMgr.findByIdIncludingRemoved(VMTemplateVO.class,
usageRecord.getUsageId().toString());
+                       usageRecResponse.setUsageId(tmpl.getUuid());
+                       //Template/ISO Size
+                       usageRecResponse.setSize(usageRecord.getSize());
+
+               } else if(usageRecord.getUsageType() == UsageTypes.SNAPSHOT){
+                       //Snapshot ID
+                       SnapshotVO snap =
_entityMgr.findByIdIncludingRemoved(SnapshotVO.class,
usageRecord.getUsageId().toString());
+                       usageRecResponse.setUsageId(snap.getUuid());
+                       //Snapshot Size
+                       usageRecResponse.setSize(usageRecord.getSize());
+
+               } else if(usageRecord.getUsageType() ==
UsageTypes.LOAD_BALANCER_POLICY){
+                       //Load Balancer Policy ID
+
usageRecResponse.setUsageId(usageRecord.getUsageId().toString());
+
+               } else if(usageRecord.getUsageType() ==
UsageTypes.PORT_FORWARDING_RULE){
+                       //Port Forwarding Rule ID
+
usageRecResponse.setUsageId(usageRecord.getUsageId().toString());
+
+               } else if(usageRecord.getUsageType() ==
UsageTypes.NETWORK_OFFERING){
+                       //Network Offering Id
+                       NetworkOfferingVO netOff =
_entityMgr.findByIdIncludingRemoved(NetworkOfferingVO.class,
usageRecord.getOfferingId().toString());
+                       usageRecResponse.setOfferingId(netOff.getUuid());
+                       //is Default
+
usageRecResponse.setDefault((usageRecord.getUsageId() == 1)?
true:false);
+
+               } else if(usageRecord.getUsageType() == UsageTypes.VPN_USERS){
+                       //VPN User ID
+
usageRecResponse.setUsageId(usageRecord.getUsageId().toString());
+
+               } else if(usageRecord.getUsageType() ==
UsageTypes.SECURITY_GROUP){
+                       //Security Group Id
+                       SecurityGroupVO sg =
_entityMgr.findByIdIncludingRemoved(SecurityGroupVO.class,
usageRecord.getUsageId().toString());
+                       usageRecResponse.setUsageId(sg.getUuid());
+               }
+
+               if (usageRecord.getRawUsage() != null) {
+                       DecimalFormat decimalFormat = new
DecimalFormat("###########.######");
+
usageRecResponse.setRawUsage(decimalFormat.format(usageRecord.getRawUsage()));
+               }
+
+               if (usageRecord.getStartDate() != null) {
+
usageRecResponse.setStartDate(getDateStringInternal(usageRecord.getStartDate()));
+               }
+               if (usageRecord.getEndDate() != null) {
+
usageRecResponse.setEndDate(getDateStringInternal(usageRecord.getEndDate()));
+               }
+
+               return usageRecResponse;
+       }
+
+
+    public String getDateStringInternal(Date inputDate) {
+        if (inputDate == null) return null;
+
+        TimeZone tz = _usageSvc.getUsageTimezone();
+        Calendar cal = Calendar.getInstance(tz);
+        cal.setTime(inputDate);
+
+        StringBuffer sb = new StringBuffer();
+        sb.append(cal.get(Calendar.YEAR)+"-");
+
+        int month = cal.get(Calendar.MONTH) + 1;
+        if (month < 10) {
+            sb.append("0" + month + "-");
+        } else {
+            sb.append(month+"-");
+        }
+
+        int day = cal.get(Calendar.DAY_OF_MONTH);
+        if (day < 10) {
+            sb.append("0" + day);
+        } else {
+            sb.append(""+day);
+        }
+
+        sb.append("'T'");
+
+        int hour = cal.get(Calendar.HOUR_OF_DAY);
+        if (hour < 10) {
+            sb.append("0" + hour + ":");
+        } else {
+            sb.append(hour+":");
+        }
+
+        int minute = cal.get(Calendar.MINUTE);
+        if (minute < 10) {
+            sb.append("0" + minute + ":");
+        } else {
+            sb.append(minute+":");
+        }
+
+        int seconds = cal.get(Calendar.SECOND);
+        if (seconds < 10) {
+            sb.append("0" + seconds);
+        } else {
+            sb.append(""+seconds);
+        }
+
+        double offset = cal.get(Calendar.ZONE_OFFSET);
+        if (tz.inDaylightTime(inputDate)) {
+            offset += (1.0*tz.getDSTSavings()); // add the timezone's
DST value (typically 1 hour expressed in milliseconds)
+        }
+
+        offset = offset / (1000d*60d*60d);
+        int hourOffset = (int)offset;
+        double decimalVal = Math.abs(offset) - Math.abs(hourOffset);
+        int minuteOffset = (int)(decimalVal * 60);
+
+        if (hourOffset < 0) {
+            if (hourOffset > -10) {
+                sb.append("-0"+Math.abs(hourOffset));
+            } else {
+                sb.append("-"+Math.abs(hourOffset));
+            }
+        } else {
+            if (hourOffset < 10) {
+                sb.append("+0" + hourOffset);
+            } else {
+                sb.append("+" + hourOffset);
+            }
+        }
+
+        sb.append(":");
+
+        if (minuteOffset == 0) {
+            sb.append("00");
+        } else if (minuteOffset < 10) {
+            sb.append("0" + minuteOffset);
+        } else {
+            sb.append("" + minuteOffset);
+        }
+
+        return sb.toString();
+    }
+
+    @Override
+    public TrafficMonitorResponse createTrafficMonitorResponse(Host
trafficMonitor) {
+        Map<String, String> tmDetails =
ApiDBUtils.findHostDetailsById(trafficMonitor.getId());
+        TrafficMonitorResponse response = new TrafficMonitorResponse();
+        response.setId(trafficMonitor.getUuid());
+        response.setIpAddress(trafficMonitor.getPrivateIpAddress());
+        response.setNumRetries(tmDetails.get("numRetries"));
+        response.setTimeout(tmDetails.get("timeout"));
+        return response;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
b/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
deleted file mode 100644
index 8728959..0000000
--- a/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
+++ /dev/null
@@ -1,109 +0,0 @@
-// 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 com.cloud.api.commands;
-
-import javax.inject.Inject;
-
-import org.apache.cloudstack.api.APICommand;
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.ApiErrorCode;
-import org.apache.cloudstack.api.BaseCmd;
-import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.response.TrafficMonitorResponse;
-import org.apache.cloudstack.api.response.ZoneResponse;
-import org.apache.log4j.Logger;
-
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.host.Host;
-import com.cloud.network.NetworkUsageManager;
-import com.cloud.user.Account;
-import com.cloud.utils.exception.CloudRuntimeException;
-
-@APICommand(name = "addTrafficMonitor", description="Adds Traffic
Monitor Host for Direct Network Usage", responseObject =
TrafficMonitorResponse.class)
-public class AddTrafficMonitorCmd extends BaseCmd {
-    public static final Logger s_logger =
Logger.getLogger(AddTrafficMonitorCmd.class.getName());
-    private static final String s_name = "addtrafficmonitorresponse";
-    @Inject NetworkUsageManager networkUsageMgr;
-
-    /////////////////////////////////////////////////////
-    //////////////// API parameters /////////////////////
-    /////////////////////////////////////////////////////
-
-    @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID,
entityType = ZoneResponse.class,
-            required = true, description="Zone in which to add the
external firewall appliance.")
-    private Long zoneId;
-
-    @Parameter(name=ApiConstants.URL, type=CommandType.STRING,
required = true, description="URL of the traffic monitor Host")
-    private String url;
-
-    @Parameter(name=ApiConstants.INCL_ZONES, type=CommandType.STRING,
description="Traffic going into the listed zones will be metered")
-    private String inclZones;
-
-    @Parameter(name=ApiConstants.EXCL_ZONES, type=CommandType.STRING,
description="Traffic going into the listed zones will not be metered")
-    private String exclZones;
-
-    ///////////////////////////////////////////////////
-    /////////////////// Accessors ///////////////////////
-    /////////////////////////////////////////////////////
-
-    public String getInclZones() {
-        return inclZones;
-    }
-
-    public String getExclZones() {
-        return exclZones;
-    }
-
-    public Long getZoneId() {
-        return zoneId;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    /////////////////////////////////////////////////////
-    /////////////// API Implementation///////////////////
-    /////////////////////////////////////////////////////
-
-    @Override
-    public String getCommandName() {
-        return s_name;
-    }
-
-    @Override
-    public long getEntityOwnerId() {
-        return Account.ACCOUNT_ID_SYSTEM;
-    }
-
-    @Override
-    public void execute(){
-        try {
-            Host trafficMonitor = networkUsageMgr.addTrafficMonitor(this);
-            TrafficMonitorResponse response =
networkUsageMgr.getApiResponse(trafficMonitor);
-            response.setObjectName("trafficmonitor");
-            response.setResponseName(getCommandName());
-            this.setResponseObject(response);
-        } catch (InvalidParameterValueException ipve) {
-                       throw new
ServerApiException(ApiErrorCode.PARAM_ERROR, ipve.getMessage());
-        } catch (CloudRuntimeException cre) {
-                       throw new
ServerApiException(ApiErrorCode.INTERNAL_ERROR, cre.getMessage());
-        }
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
b/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
deleted file mode 100644
index 081d0be..0000000
--- a/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
+++ /dev/null
@@ -1,86 +0,0 @@
-// 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 com.cloud.api.commands;
-
-import javax.inject.Inject;
-
-import org.apache.cloudstack.api.APICommand;
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.ApiErrorCode;
-import org.apache.cloudstack.api.BaseCmd;
-import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.response.HostResponse;
-import org.apache.cloudstack.api.response.SuccessResponse;
-import org.apache.log4j.Logger;
-
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.network.NetworkUsageManager;
-import com.cloud.user.Account;
-
-@APICommand(name = "deleteTrafficMonitor", description="Deletes an
traffic monitor host.", responseObject = SuccessResponse.class)
-public class DeleteTrafficMonitorCmd extends BaseCmd {
-    public static final Logger s_logger =
Logger.getLogger(DeleteTrafficMonitorCmd.class.getName());
-    private static final String s_name = "deletetrafficmonitorresponse";
-    @Inject NetworkUsageManager _networkUsageMgr;
-
-    /////////////////////////////////////////////////////
-    //////////////// API parameters /////////////////////
-    /////////////////////////////////////////////////////
-
-    @Parameter(name=ApiConstants.ID, type=CommandType.UUID,
entityType = HostResponse.class,
-            required = true, description="Id of the Traffic Monitor Host.")
-    private Long id;
-
-    ///////////////////////////////////////////////////
-    /////////////////// Accessors ///////////////////////
-    /////////////////////////////////////////////////////
-
-    public Long getId() {
-        return id;
-    }
-
-    /////////////////////////////////////////////////////
-    /////////////// API Implementation///////////////////
-    /////////////////////////////////////////////////////
-
-    @Override
-    public String getCommandName() {
-        return s_name;
-    }
-
-    @Override
-    public long getEntityOwnerId() {
-        return Account.ACCOUNT_ID_SYSTEM;
-    }
-
-    @Override
-    public void execute(){
-        try {
-            boolean result = _networkUsageMgr.deleteTrafficMonitor(this);
-            if (result) {
-                SuccessResponse response = new
SuccessResponse(getCommandName());
-                response.setResponseName(getCommandName());
-                this.setResponseObject(response);
-            } else {
-                               throw new
ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete
traffic monitor.");
-            }
-        } catch (InvalidParameterValueException e) {
-                       throw new
ServerApiException(ApiErrorCode.PARAM_ERROR, "Failed to delete traffic
monitor.");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
b/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
deleted file mode 100644
index 4206cf8..0000000
--- a/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
+++ /dev/null
@@ -1,91 +0,0 @@
-// 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 com.cloud.api.commands;
-
-import java.util.Date;
-
-import org.apache.cloudstack.api.*;
-import org.apache.cloudstack.api.response.DomainResponse;
-import org.apache.log4j.Logger;
-
-import org.apache.cloudstack.api.APICommand;
-import org.apache.cloudstack.api.response.SuccessResponse;
-import com.cloud.server.ManagementServerExt;
-import com.cloud.user.Account;
-
-@APICommand(name = "generateUsageRecords", description="Generates
usage records. This will generate records only if there any records to
be generated, i.e if the scheduled usage job was not run or failed",
responseObject=SuccessResponse.class)
-public class GenerateUsageRecordsCmd extends BaseCmd {
-    public static final Logger s_logger =
Logger.getLogger(GenerateUsageRecordsCmd.class.getName());
-
-    private static final String s_name = "generateusagerecordsresponse";
-
-    /////////////////////////////////////////////////////
-    //////////////// API parameters /////////////////////
-    /////////////////////////////////////////////////////
-
-    @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.UUID,
entityType = DomainResponse.class,
-            description="List events for the specified domain.")
-    private Long domainId;
-
-    @Parameter(name=ApiConstants.END_DATE, type=CommandType.DATE,
required=true, description="End date range for usage record query. Use
yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.")
-    private Date endDate;
-
-    @Parameter(name=ApiConstants.START_DATE, type=CommandType.DATE,
required=true, description="Start date range for usage record query.
Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.")
-    private Date startDate;
-
-    /////////////////////////////////////////////////////
-    /////////////////// Accessors ///////////////////////
-    /////////////////////////////////////////////////////
-
-    public Long getDomainId() {
-        return domainId;
-    }
-
-    public Date getEndDate() {
-        return endDate;
-    }
-
-    public Date getStartDate() {
-        return startDate;
-    }
-
-    /////////////////////////////////////////////////////
-    /////////////// API Implementation///////////////////
-    /////////////////////////////////////////////////////
-
-    @Override
-    public String getCommandName() {
-        return s_name;
-    }
-
-    @Override
-    public long getEntityOwnerId() {
-        return Account.ACCOUNT_ID_SYSTEM;
-    }
-
-    @Override
-    public void execute(){
-        ManagementServerExt _mgrExt = (ManagementServerExt)_mgr;
-        boolean result = _mgrExt.generateUsageRecords(this);
-        if (result) {
-            SuccessResponse response = new SuccessResponse(getCommandName());
-            this.setResponseObject(response);
-        } else {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
"Failed to generate usage records");
-        }
-    }
-}

Re: [2/2] git commit: refs/heads/4.1 - CLOUDSTACK-786, CLOUDSTACK-1014: Moved usage APIs to cloud-api. Removed ManagementServerExt. Usage API related implementation is added to UsageServiceImpl

Posted by Chip Childers <ch...@sungard.com>.
On Wed, Feb 06, 2013 at 06:16:27PM +0530, Kishan Kavala wrote:
> Chip,
>   There are no functionality changes in this commit. APIs moved from cloud-server to cloud-api and the implementation moved from ManagementSerevrExt to UsageService.
> There are no tests covering usage currently. I plan to add unit tests for usage in general not just APIs. All others existing tests passed.
> 

I understand that there were no new features, but a move like this
without some sort of testing is scary.  When the API refactoring work
happened, there was quite a bit of discussion about the marvin tests
being used to test for regressions.  I'm concerned about this change not
having had the same test focus.

What can / should we do to be comfortable with this change?

Are there QA regression tests that are planned already to cover off this
functionality?

-chip

> 
> > -----Original Message-----
> > From: Chip Childers [mailto:chip.childers@sungard.com]
> > Sent: Tuesday, 5 February 2013 9:20 PM
> > To: cloudstack-dev@incubator.apache.org
> > Subject: Re: [2/2] git commit: refs/heads/4.1 - CLOUDSTACK-786,
> > CLOUDSTACK-1014: Moved usage APIs to cloud-api. Removed
> > ManagementServerExt. Usage API related implementation is added to
> > UsageServiceImpl
> >
> > On Tue, Feb 5, 2013 at 10:48 AM, Kishan Kavala <Ki...@citrix.com>
> > wrote:
> > > Chip,
> > >   API refactoring moved all the APIs to cloud-api project. But somehow 6
> > APIs (all related to usage) remained in cloud-server. The cmd objects and
> > their implementations also were not inline with the rest of the APIs. This
> > commit moved the 6 Usage APIs and fixed the implementation.
> > >
> > > ~kishan
> >
> > Fair, thanks for explaining.
> >
> > Are there any test results from this commit?  We tested the API
> > refactoring prior to cutting 4.1, and I'm surprised that this was
> > missed.  Did you run a regression tests against the changes?
> >
> > > On 05-Feb-2013, at 8:49 PM, "Chip Childers" <ch...@sungard.com>
> > wrote:
> > >
> > >> Hey Kishan,
> > >>
> > >> Was this refactoring needed as part of 4.1?
> > >>
> > >>

RE: [2/2] git commit: refs/heads/4.1 - CLOUDSTACK-786, CLOUDSTACK-1014: Moved usage APIs to cloud-api. Removed ManagementServerExt. Usage API related implementation is added to UsageServiceImpl

Posted by Kishan Kavala <Ki...@citrix.com>.
Chip,
  There are no functionality changes in this commit. APIs moved from cloud-server to cloud-api and the implementation moved from ManagementSerevrExt to UsageService.
There are no tests covering usage currently. I plan to add unit tests for usage in general not just APIs. All others existing tests passed.


> -----Original Message-----
> From: Chip Childers [mailto:chip.childers@sungard.com]
> Sent: Tuesday, 5 February 2013 9:20 PM
> To: cloudstack-dev@incubator.apache.org
> Subject: Re: [2/2] git commit: refs/heads/4.1 - CLOUDSTACK-786,
> CLOUDSTACK-1014: Moved usage APIs to cloud-api. Removed
> ManagementServerExt. Usage API related implementation is added to
> UsageServiceImpl
>
> On Tue, Feb 5, 2013 at 10:48 AM, Kishan Kavala <Ki...@citrix.com>
> wrote:
> > Chip,
> >   API refactoring moved all the APIs to cloud-api project. But somehow 6
> APIs (all related to usage) remained in cloud-server. The cmd objects and
> their implementations also were not inline with the rest of the APIs. This
> commit moved the 6 Usage APIs and fixed the implementation.
> >
> > ~kishan
>
> Fair, thanks for explaining.
>
> Are there any test results from this commit?  We tested the API
> refactoring prior to cutting 4.1, and I'm surprised that this was
> missed.  Did you run a regression tests against the changes?
>
> > On 05-Feb-2013, at 8:49 PM, "Chip Childers" <ch...@sungard.com>
> wrote:
> >
> >> Hey Kishan,
> >>
> >> Was this refactoring needed as part of 4.1?
> >>
> >>
> >> ---------- Forwarded message ----------
> >> From:  <ki...@apache.org>
> >> Date: Tue, Feb 5, 2013 at 6:18 AM
> >> Subject: [2/2] git commit: refs/heads/4.1 - CLOUDSTACK-786,
> >> CLOUDSTACK-1014: Moved usage APIs to cloud-api. Removed
> >> ManagementServerExt. Usage API related implementation is added to
> >> UsageServiceImpl
> >> To: cloudstack-commits@incubator.apache.org
> >>
> >>
> >> Updated Branches:
> >>  refs/heads/4.1 2fd8b15d6 -> 7970384f6
> >>
> >>
> >> CLOUDSTACK-786, CLOUDSTACK-1014: Moved usage APIs to cloud-api.
> >> Removed ManagementServerExt. Usage API related implementation is
> added
> >> to UsageServiceImpl
> >>
> >>
> >> Project: http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/repo
> >> Commit: http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/commit/7970384f
> >> Tree: http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/tree/7970384f
> >> Diff: http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/diff/7970384f
> >>
> >> Branch: refs/heads/4.1
> >> Commit: 7970384f6e429b5c97f6d6e80f59cbab6ce90ede
> >> Parents: 2fd8b15
> >> Author: Kishan Kavala <ki...@cloud.com>
> >> Authored: Tue Feb 5 16:43:18 2013 +0530
> >> Committer: Kishan Kavala <ki...@cloud.com>
> >> Committed: Tue Feb 5 16:43:40 2013 +0530
> >>
> >> ----------------------------------------------------------------------
> >> api/src/com/cloud/dao/EntityManager.java           |   10 +
> >> api/src/com/cloud/network/NetworkUsageService.java |   37 ++
> >> api/src/org/apache/cloudstack/api/BaseCmd.java     |    4 +
> >> .../apache/cloudstack/api/ResponseGenerator.java   |    7 +
> >> .../command/admin/usage/AddTrafficMonitorCmd.java  |  107 +++++
> >> .../admin/usage/DeleteTrafficMonitorCmd.java       |   84 ++++
> >> .../admin/usage/GenerateUsageRecordsCmd.java       |   89 ++++
> >> .../command/admin/usage/GetUsageRecordsCmd.java    |  126 +++++
> >> .../admin/usage/ListTrafficMonitorsCmd.java        |   84 ++++
> >> .../api/command/admin/usage/ListUsageTypesCmd.java |   51 ++
> >> api/src/org/apache/cloudstack/usage/Usage.java     |   69 +++
> >> .../org/apache/cloudstack/usage/UsageService.java  |   64 +++
> >> .../org/apache/cloudstack/usage/UsageTypes.java    |   58 +++
> >> client/tomcatconf/componentContext.xml.in          |    2 +-
> >> .../server/ManagementServerSimulatorImpl.java      |    2 +-
> >> .../dns-notifier/resources/components-example.xml  |    2 +-
> >> server/src/com/cloud/api/ApiDBUtils.java           |   14 +-
> >> server/src/com/cloud/api/ApiResponseHelper.java    |  253 ++++++++++
> >> .../cloud/api/commands/AddTrafficMonitorCmd.java   |  109 -----
> >> .../api/commands/DeleteTrafficMonitorCmd.java      |   86 ----
> >> .../api/commands/GenerateUsageRecordsCmd.java      |   91 ----
> >> .../com/cloud/api/commands/GetUsageRecordsCmd.java |  370 -----------
> ----
> >> .../cloud/api/commands/ListTrafficMonitorsCmd.java |   86 ----
> >> .../com/cloud/api/commands/ListUsageTypesCmd.java  |   53 --
> >> server/src/com/cloud/dao/EntityManagerImpl.java    |    7 +-
> >> .../src/com/cloud/network/NetworkUsageManager.java |   14 -
> >> .../com/cloud/network/NetworkUsageManagerImpl.java |   20 +-
> >> .../src/com/cloud/server/ManagementServerExt.java  |   63 ---
> >> .../com/cloud/server/ManagementServerExtImpl.java  |  254 ----------
> >> server/src/com/cloud/usage/UsageServiceImpl.java   |  261 ++++++++++
> >> server/src/com/cloud/usage/UsageTypes.java         |   58 ---
> >> server/src/com/cloud/usage/UsageVO.java            |   23 +-
> >> usage/src/com/cloud/usage/UsageManagerImpl.java    |    1 +
> >> .../cloud/usage/parser/IPAddressUsageParser.java   |    2 +-
> >> .../usage/parser/LoadBalancerUsageParser.java      |    2 +-
> >> .../usage/parser/NetworkOfferingUsageParser.java   |    2 +-
> >> .../com/cloud/usage/parser/NetworkUsageParser.java |    2 +-
> >> .../usage/parser/PortForwardingUsageParser.java    |    2 +-
> >> .../usage/parser/SecurityGroupUsageParser.java     |    2 +-
> >> .../com/cloud/usage/parser/StorageUsageParser.java |    2 +-
> >> .../cloud/usage/parser/VMInstanceUsageParser.java  |    2 +-
> >> .../com/cloud/usage/parser/VPNUserUsageParser.java |    2 +-
> >> .../com/cloud/usage/parser/VolumeUsageParser.java  |    2 +-
> >> 43 files changed, 1358 insertions(+), 1221 deletions(-)
> >> ----------------------------------------------------------------------
> >>
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/api/src/com/cloud/dao/EntityManager.java
> >> ----------------------------------------------------------------------
> >> diff --git a/api/src/com/cloud/dao/EntityManager.java
> >> b/api/src/com/cloud/dao/EntityManager.java
> >> index b8fdaa7..8e6a438 100644
> >> --- a/api/src/com/cloud/dao/EntityManager.java
> >> +++ b/api/src/com/cloud/dao/EntityManager.java
> >> @@ -39,6 +39,16 @@ public interface EntityManager {
> >>     public <T, K extends Serializable> T findById(Class<T> entityType, K id);
> >>
> >>     /**
> >> +     * Finds an entity by its id including removed.
> >> +     * @param <T> class of the entity you're trying to find.
> >> +     * @param <K> class of the id that the entity uses.
> >> +     * @param entityType Type of the entity.
> >> +     * @param id id value
> >> +     * @return T if found; null if not.
> >> +     */
> >> +    public <T, K extends Serializable> T
> >> findByIdIncludingRemoved(Class<T> entityType, K id);
> >> +
> >> +    /**
> >>      * Finds a unique entity by uuid string
> >>      * @param <T> entity class
> >>      * @param entityType type of entity you're looking for.
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/api/src/com/cloud/network/NetworkUsageServic
> e.java
> >> ----------------------------------------------------------------------
> >> diff --git a/api/src/com/cloud/network/NetworkUsageService.java
> >> b/api/src/com/cloud/network/NetworkUsageService.java
> >> new file mode 100644
> >> index 0000000..1cfea24
> >> --- /dev/null
> >> +++ b/api/src/com/cloud/network/NetworkUsageService.java
> >> @@ -0,0 +1,37 @@
> >> +// 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 com.cloud.network;
> >> +
> >> +import java.util.List;
> >> +
> >> +import com.cloud.host.Host;
> >> +
> >> +import
> org.apache.cloudstack.api.command.admin.usage.AddTrafficMonitorCmd;
> >> +import
> org.apache.cloudstack.api.command.admin.usage.DeleteTrafficMonitorCmd;
> >> +import
> org.apache.cloudstack.api.command.admin.usage.ListTrafficMonitorsCmd;
> >> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
> >> +import com.cloud.utils.component.Manager;
> >> +
> >> +public interface NetworkUsageService extends Manager {
> >> +
> >> +    Host addTrafficMonitor(AddTrafficMonitorCmd cmd);
> >> +
> >> +    boolean deleteTrafficMonitor(DeleteTrafficMonitorCmd cmd);
> >> +
> >> +    List<? extends Host> listTrafficMonitors(ListTrafficMonitorsCmd cmd);
> >> +
> >> +}
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/BaseCmd.java
> >> ----------------------------------------------------------------------
> >> diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java
> >> b/api/src/org/apache/cloudstack/api/BaseCmd.java
> >> index d8e2bff..a9ac489 100644
> >> --- a/api/src/org/apache/cloudstack/api/BaseCmd.java
> >> +++ b/api/src/org/apache/cloudstack/api/BaseCmd.java
> >> @@ -29,6 +29,7 @@ import javax.inject.Inject;
> >>
> >> import org.apache.cloudstack.query.QueryService;
> >> import org.apache.cloudstack.region.RegionService;
> >> +import org.apache.cloudstack.usage.UsageService;
> >> import org.apache.log4j.Logger;
> >>
> >> import com.cloud.configuration.ConfigurationService;
> >> @@ -43,6 +44,7 @@ import
> com.cloud.exception.PermissionDeniedException;
> >> import com.cloud.exception.ResourceAllocationException;
> >> import com.cloud.exception.ResourceUnavailableException;
> >> import com.cloud.network.NetworkService;
> >> +import com.cloud.network.NetworkUsageService;
> >> import com.cloud.network.StorageNetworkService;
> >> import com.cloud.network.VpcVirtualNetworkApplianceService;
> >> import com.cloud.network.as.AutoScaleService;
> >> @@ -124,6 +126,8 @@ public abstract class BaseCmd {
> >>     @Inject public Site2SiteVpnService _s2sVpnService;
> >>
> >>     @Inject public QueryService _queryService;
> >> +    @Inject public UsageService _usageService;
> >> +    @Inject public NetworkUsageService _networkUsageService;
> >>
> >>     public abstract void execute() throws
> >> ResourceUnavailableException, InsufficientCapacityException,
> >> ServerApiException, ConcurrentOperationException,
> >> ResourceAllocationException, NetworkRuleConflictException;
> >>
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/ResponseGen
> erator.java
> >> ----------------------------------------------------------------------
> >> diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java
> >> b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
> >> index b95f182..0dc85de 100644
> >> --- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java
> >> +++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
> >> @@ -83,7 +83,9 @@ import
> >> org.apache.cloudstack.api.response.SystemVmInstanceResponse;
> >> import org.apache.cloudstack.api.response.SystemVmResponse;
> >> import
> org.apache.cloudstack.api.response.TemplatePermissionsResponse;
> >> import org.apache.cloudstack.api.response.TemplateResponse;
> >> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
> >> import org.apache.cloudstack.api.response.TrafficTypeResponse;
> >> +import org.apache.cloudstack.api.response.UsageRecordResponse;
> >> import org.apache.cloudstack.api.response.UserResponse;
> >> import org.apache.cloudstack.api.response.UserVmResponse;
> >> import
> org.apache.cloudstack.api.response.VirtualRouterProviderResponse;
> >> @@ -94,6 +96,7 @@ import
> org.apache.cloudstack.api.response.VpcResponse;
> >> import org.apache.cloudstack.api.response.VpnUsersResponse;
> >> import org.apache.cloudstack.api.response.ZoneResponse;
> >> import org.apache.cloudstack.region.Region;
> >> +import org.apache.cloudstack.usage.Usage;
> >>
> >> import com.cloud.async.AsyncJob;
> >> import com.cloud.capacity.Capacity;
> >> @@ -375,4 +378,8 @@ public interface ResponseGenerator {
> >>     GuestOSResponse createGuestOSResponse(GuestOS os);
> >>
> >>     SnapshotScheduleResponse
> >> createSnapshotScheduleResponse(SnapshotSchedule sched);
> >> +
> >> +    UsageRecordResponse createUsageResponse(Usage usageRecord);
> >> +
> >> +       TrafficMonitorResponse createTrafficMonitorResponse(Host
> >> trafficMonitor);
> >> }
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/ad
> min/usage/AddTrafficMonitorCmd.java
> >> ----------------------------------------------------------------------
> >> diff --git
> a/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMo
> nitorCmd.java
> >>
> b/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMo
> nitorCmd.java
> >> new file mode 100644
> >> index 0000000..48424fe
> >> --- /dev/null
> >> +++
> b/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMo
> nitorCmd.java
> >> @@ -0,0 +1,107 @@
> >> +// 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.apache.cloudstack.api.command.admin.usage;
> >> +
> >> +import javax.inject.Inject;
> >> +
> >> +import org.apache.cloudstack.api.APICommand;
> >> +import org.apache.cloudstack.api.ApiConstants;
> >> +import org.apache.cloudstack.api.ApiErrorCode;
> >> +import org.apache.cloudstack.api.BaseCmd;
> >> +import org.apache.cloudstack.api.Parameter;
> >> +import org.apache.cloudstack.api.ServerApiException;
> >> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
> >> +import org.apache.cloudstack.api.response.ZoneResponse;
> >> +import org.apache.log4j.Logger;
> >> +
> >> +import com.cloud.exception.InvalidParameterValueException;
> >> +import com.cloud.host.Host;
> >> +import com.cloud.user.Account;
> >> +import com.cloud.utils.exception.CloudRuntimeException;
> >> +
> >> +@APICommand(name = "addTrafficMonitor", description="Adds Traffic
> >> Monitor Host for Direct Network Usage", responseObject =
> >> TrafficMonitorResponse.class)
> >> +public class AddTrafficMonitorCmd extends BaseCmd {
> >> +    public static final Logger s_logger =
> >> Logger.getLogger(AddTrafficMonitorCmd.class.getName());
> >> +    private static final String s_name = "addtrafficmonitorresponse";
> >> +
> >> +    /////////////////////////////////////////////////////
> >> +    //////////////// API parameters /////////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    @Parameter(name=ApiConstants.ZONE_ID,
> type=CommandType.UUID,
> >> entityType = ZoneResponse.class,
> >> +            required = true, description="Zone in which to add the
> >> external firewall appliance.")
> >> +    private Long zoneId;
> >> +
> >> +    @Parameter(name=ApiConstants.URL, type=CommandType.STRING,
> >> required = true, description="URL of the traffic monitor Host")
> >> +    private String url;
> >> +
> >> +    @Parameter(name=ApiConstants.INCL_ZONES,
> type=CommandType.STRING,
> >> description="Traffic going into the listed zones will be metered")
> >> +    private String inclZones;
> >> +
> >> +    @Parameter(name=ApiConstants.EXCL_ZONES,
> type=CommandType.STRING,
> >> description="Traffic going into the listed zones will not be metered")
> >> +    private String exclZones;
> >> +
> >> +    ///////////////////////////////////////////////////
> >> +    /////////////////// Accessors ///////////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    public String getInclZones() {
> >> +        return inclZones;
> >> +    }
> >> +
> >> +    public String getExclZones() {
> >> +        return exclZones;
> >> +    }
> >> +
> >> +    public Long getZoneId() {
> >> +        return zoneId;
> >> +    }
> >> +
> >> +    public String getUrl() {
> >> +        return url;
> >> +    }
> >> +
> >> +    /////////////////////////////////////////////////////
> >> +    /////////////// API Implementation///////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    @Override
> >> +    public String getCommandName() {
> >> +        return s_name;
> >> +    }
> >> +
> >> +    @Override
> >> +    public long getEntityOwnerId() {
> >> +        return Account.ACCOUNT_ID_SYSTEM;
> >> +    }
> >> +
> >> +    @Override
> >> +    public void execute(){
> >> +        try {
> >> +            Host trafficMonitor =
> _networkUsageService.addTrafficMonitor(this);
> >> +            TrafficMonitorResponse response =
> >> _responseGenerator.createTrafficMonitorResponse(trafficMonitor);
> >> +            response.setObjectName("trafficmonitor");
> >> +            response.setResponseName(getCommandName());
> >> +            this.setResponseObject(response);
> >> +        } catch (InvalidParameterValueException ipve) {
> >> +                       throw new
> >> ServerApiException(ApiErrorCode.PARAM_ERROR, ipve.getMessage());
> >> +        } catch (CloudRuntimeException cre) {
> >> +                       throw new
> >> ServerApiException(ApiErrorCode.INTERNAL_ERROR, cre.getMessage());
> >> +        }
> >> +    }
> >> +}
> >> +
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/ad
> min/usage/DeleteTrafficMonitorCmd.java
> >> ----------------------------------------------------------------------
> >> diff --git
> a/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTraffic
> MonitorCmd.java
> >>
> b/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTraffic
> MonitorCmd.java
> >> new file mode 100644
> >> index 0000000..e3bb299
> >> --- /dev/null
> >> +++
> b/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTraffic
> MonitorCmd.java
> >> @@ -0,0 +1,84 @@
> >> +// 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.apache.cloudstack.api.command.admin.usage;
> >> +
> >> +import javax.inject.Inject;
> >> +
> >> +import org.apache.cloudstack.api.APICommand;
> >> +import org.apache.cloudstack.api.ApiConstants;
> >> +import org.apache.cloudstack.api.ApiErrorCode;
> >> +import org.apache.cloudstack.api.BaseCmd;
> >> +import org.apache.cloudstack.api.Parameter;
> >> +import org.apache.cloudstack.api.ServerApiException;
> >> +import org.apache.cloudstack.api.response.HostResponse;
> >> +import org.apache.cloudstack.api.response.SuccessResponse;
> >> +import org.apache.log4j.Logger;
> >> +
> >> +import com.cloud.exception.InvalidParameterValueException;
> >> +import com.cloud.user.Account;
> >> +
> >> +@APICommand(name = "deleteTrafficMonitor", description="Deletes
> an
> >> traffic monitor host.", responseObject = SuccessResponse.class)
> >> +public class DeleteTrafficMonitorCmd extends BaseCmd {
> >> +    public static final Logger s_logger =
> >> Logger.getLogger(DeleteTrafficMonitorCmd.class.getName());
> >> +    private static final String s_name = "deletetrafficmonitorresponse";
> >> +
> >> +    /////////////////////////////////////////////////////
> >> +    //////////////// API parameters /////////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    @Parameter(name=ApiConstants.ID, type=CommandType.UUID,
> >> entityType = HostResponse.class,
> >> +            required = true, description="Id of the Traffic Monitor Host.")
> >> +    private Long id;
> >> +
> >> +    ///////////////////////////////////////////////////
> >> +    /////////////////// Accessors ///////////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    public Long getId() {
> >> +        return id;
> >> +    }
> >> +
> >> +    /////////////////////////////////////////////////////
> >> +    /////////////// API Implementation///////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    @Override
> >> +    public String getCommandName() {
> >> +        return s_name;
> >> +    }
> >> +
> >> +    @Override
> >> +    public long getEntityOwnerId() {
> >> +        return Account.ACCOUNT_ID_SYSTEM;
> >> +    }
> >> +
> >> +    @Override
> >> +    public void execute(){
> >> +        try {
> >> +            boolean result =
> _networkUsageService.deleteTrafficMonitor(this);
> >> +            if (result) {
> >> +                SuccessResponse response = new
> >> SuccessResponse(getCommandName());
> >> +                response.setResponseName(getCommandName());
> >> +                this.setResponseObject(response);
> >> +            } else {
> >> +                               throw new
> >> ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete
> >> traffic monitor.");
> >> +            }
> >> +        } catch (InvalidParameterValueException e) {
> >> +                       throw new
> >> ServerApiException(ApiErrorCode.PARAM_ERROR, "Failed to delete
> traffic
> >> monitor.");
> >> +        }
> >> +    }
> >> +}
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/ad
> min/usage/GenerateUsageRecordsCmd.java
> >> ----------------------------------------------------------------------
> >> diff --git
> a/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsa
> geRecordsCmd.java
> >>
> b/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsa
> geRecordsCmd.java
> >> new file mode 100644
> >> index 0000000..13710f9
> >> --- /dev/null
> >> +++
> b/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsa
> geRecordsCmd.java
> >> @@ -0,0 +1,89 @@
> >> +// 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.apache.cloudstack.api.command.admin.usage;
> >> +
> >> +import java.util.Date;
> >> +
> >> +import org.apache.cloudstack.api.*;
> >> +import org.apache.cloudstack.api.response.DomainResponse;
> >> +import org.apache.log4j.Logger;
> >> +
> >> +import org.apache.cloudstack.api.APICommand;
> >> +import org.apache.cloudstack.api.response.SuccessResponse;
> >> +import com.cloud.user.Account;
> >> +
> >> +@APICommand(name = "generateUsageRecords",
> description="Generates
> >> usage records. This will generate records only if there any records to
> >> be generated, i.e if the scheduled usage job was not run or failed",
> >> responseObject=SuccessResponse.class)
> >> +public class GenerateUsageRecordsCmd extends BaseCmd {
> >> +    public static final Logger s_logger =
> >> Logger.getLogger(GenerateUsageRecordsCmd.class.getName());
> >> +
> >> +    private static final String s_name = "generateusagerecordsresponse";
> >> +
> >> +    /////////////////////////////////////////////////////
> >> +    //////////////// API parameters /////////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    @Parameter(name=ApiConstants.DOMAIN_ID,
> type=CommandType.UUID,
> >> entityType = DomainResponse.class,
> >> +            description="List events for the specified domain.")
> >> +    private Long domainId;
> >> +
> >> +    @Parameter(name=ApiConstants.END_DATE,
> type=CommandType.DATE,
> >> required=true, description="End date range for usage record query. Use
> >> yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.")
> >> +    private Date endDate;
> >> +
> >> +    @Parameter(name=ApiConstants.START_DATE,
> type=CommandType.DATE,
> >> required=true, description="Start date range for usage record query.
> >> Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.")
> >> +    private Date startDate;
> >> +
> >> +    /////////////////////////////////////////////////////
> >> +    /////////////////// Accessors ///////////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    public Long getDomainId() {
> >> +        return domainId;
> >> +    }
> >> +
> >> +    public Date getEndDate() {
> >> +        return endDate;
> >> +    }
> >> +
> >> +    public Date getStartDate() {
> >> +        return startDate;
> >> +    }
> >> +
> >> +    /////////////////////////////////////////////////////
> >> +    /////////////// API Implementation///////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    @Override
> >> +    public String getCommandName() {
> >> +        return s_name;
> >> +    }
> >> +
> >> +    @Override
> >> +    public long getEntityOwnerId() {
> >> +        return Account.ACCOUNT_ID_SYSTEM;
> >> +    }
> >> +
> >> +    @Override
> >> +    public void execute(){
> >> +        boolean result = _usageService.generateUsageRecords(this);
> >> +        if (result) {
> >> +            SuccessResponse response = new
> SuccessResponse(getCommandName());
> >> +            this.setResponseObject(response);
> >> +        } else {
> >> +            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
> >> "Failed to generate usage records");
> >> +        }
> >> +    }
> >> +}
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/ad
> min/usage/GetUsageRecordsCmd.java
> >> ----------------------------------------------------------------------
> >> diff --git
> a/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRec
> ordsCmd.java
> >>
> b/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRec
> ordsCmd.java
> >> new file mode 100644
> >> index 0000000..f4960dd
> >> --- /dev/null
> >> +++
> b/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRec
> ordsCmd.java
> >> @@ -0,0 +1,126 @@
> >> +// 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.apache.cloudstack.api.command.admin.usage;
> >> +
> >> +import java.util.ArrayList;
> >> +import java.util.Date;
> >> +import java.util.List;
> >> +import java.util.TimeZone;
> >> +
> >> +import org.apache.cloudstack.api.APICommand;
> >> +import org.apache.cloudstack.api.ApiConstants;
> >> +import org.apache.cloudstack.api.BaseListCmd;
> >> +import org.apache.cloudstack.api.Parameter;
> >> +import org.apache.cloudstack.api.response.AccountResponse;
> >> +import org.apache.cloudstack.api.response.DomainResponse;
> >> +import org.apache.cloudstack.api.response.ListResponse;
> >> +import org.apache.cloudstack.api.response.ProjectResponse;
> >> +import org.apache.cloudstack.api.response.UsageRecordResponse;
> >> +import org.apache.cloudstack.usage.Usage;
> >> +import org.apache.log4j.Logger;
> >> +
> >> +@APICommand(name = "listUsageRecords", description="Lists usage
> >> records for accounts", responseObject=UsageRecordResponse.class)
> >> +public class GetUsageRecordsCmd extends BaseListCmd {
> >> +    public static final Logger s_logger =
> >> Logger.getLogger(GetUsageRecordsCmd.class.getName());
> >> +
> >> +    private static final String s_name = "listusagerecordsresponse";
> >> +
> >> +    /////////////////////////////////////////////////////
> >> +    //////////////// API parameters /////////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    @Parameter(name=ApiConstants.ACCOUNT,
> type=CommandType.STRING,
> >> description="List usage records for the specified user.")
> >> +    private String accountName;
> >> +
> >> +    @Parameter(name=ApiConstants.DOMAIN_ID,
> type=CommandType.UUID,
> >> entityType = DomainResponse.class,
> >> +            description="List usage records for the specified domain.")
> >> +    private Long domainId;
> >> +
> >> +    @Parameter(name=ApiConstants.END_DATE,
> type=CommandType.DATE,
> >> required=true, description="End date range for usage record query. Use
> >> yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.")
> >> +    private Date endDate;
> >> +
> >> +    @Parameter(name=ApiConstants.START_DATE,
> type=CommandType.DATE,
> >> required=true, description="Start date range for usage record query.
> >> Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.")
> >> +    private Date startDate;
> >> +
> >> +    @Parameter(name=ApiConstants.ACCOUNT_ID,
> type=CommandType.UUID,
> >> entityType = AccountResponse.class,
> >> +            description="List usage records for the specified account")
> >> +    private Long accountId;
> >> +
> >> +    @Parameter(name=ApiConstants.PROJECT_ID,
> type=CommandType.UUID,
> >> entityType = ProjectResponse.class,
> >> +            description="List usage records for specified project")
> >> +    private Long projectId;
> >> +
> >> +    @Parameter(name=ApiConstants.TYPE, type=CommandType.LONG,
> >> description="List usage records for the specified usage type")
> >> +    private Long usageType;
> >> +
> >> +    /////////////////////////////////////////////////////
> >> +    /////////////////// Accessors ///////////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    public String getAccountName() {
> >> +        return accountName;
> >> +    }
> >> +
> >> +    public Long getDomainId() {
> >> +        return domainId;
> >> +    }
> >> +
> >> +    public Date getEndDate() {
> >> +        return endDate;
> >> +    }
> >> +
> >> +    public Date getStartDate() {
> >> +        return startDate;
> >> +    }
> >> +
> >> +    public Long getAccountId() {
> >> +        return accountId;
> >> +    }
> >> +
> >> +    public Long getUsageType() {
> >> +        return usageType;
> >> +    }
> >> +
> >> +    public Long getProjectId() {
> >> +        return projectId;
> >> +    }
> >> +
> >> +    /////////////////////////////////////////////////////
> >> +    /////////////// API Implementation///////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    @Override
> >> +    public String getCommandName() {
> >> +        return s_name;
> >> +    }
> >> +
> >> +    @Override
> >> +    public void execute(){
> >> +        List<? extends Usage> usageRecords =
> >> _usageService.getUsageRecords(this);
> >> +        ListResponse<UsageRecordResponse> response = new
> >> ListResponse<UsageRecordResponse>();
> >> +        List<UsageRecordResponse> usageResponses = new
> >> ArrayList<UsageRecordResponse>();
> >> +        for(Usage usageRecord: usageRecords){
> >> +               UsageRecordResponse usageResponse =
> >> _responseGenerator.createUsageResponse(usageRecord);
> >> +               usageResponse.setObjectName("usagerecord");
> >> +               usageResponses.add(usageResponse);
> >> +        }
> >> +
> >> +        response.setResponses(usageResponses);
> >> +        response.setResponseName(getCommandName());
> >> +        this.setResponseObject(response);
> >> +    }
> >> +}
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/ad
> min/usage/ListTrafficMonitorsCmd.java
> >> ----------------------------------------------------------------------
> >> diff --git
> a/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMon
> itorsCmd.java
> >>
> b/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMo
> nitorsCmd.java
> >> new file mode 100644
> >> index 0000000..e8e3b22
> >> --- /dev/null
> >> +++
> b/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMo
> nitorsCmd.java
> >> @@ -0,0 +1,84 @@
> >> +// 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.apache.cloudstack.api.command.admin.usage;
> >> +
> >> +import java.util.ArrayList;
> >> +import java.util.List;
> >> +
> >> +import javax.inject.Inject;
> >> +
> >> +import org.apache.cloudstack.api.APICommand;
> >> +import org.apache.cloudstack.api.ApiConstants;
> >> +import org.apache.cloudstack.api.BaseListCmd;
> >> +import org.apache.cloudstack.api.Parameter;
> >> +import
> org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd;
> >> +import org.apache.cloudstack.api.response.ListResponse;
> >> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
> >> +import org.apache.cloudstack.api.response.ZoneResponse;
> >> +import org.apache.log4j.Logger;
> >> +
> >> +import com.cloud.host.Host;
> >> +
> >> +
> >> +@APICommand(name = "listTrafficMonitors", description="List traffic
> >> monitor Hosts.", responseObject = TrafficMonitorResponse.class)
> >> +public class ListTrafficMonitorsCmd extends BaseListCmd {
> >> +    public static final Logger s_logger =
> >> Logger.getLogger(ListServiceOfferingsCmd.class.getName());
> >> +    private static final String s_name = "listtrafficmonitorsresponse";
> >> +
> >> +    /////////////////////////////////////////////////////
> >> +    //////////////// API parameters /////////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    @Parameter(name=ApiConstants.ZONE_ID,
> type=CommandType.UUID,
> >> entityType = ZoneResponse.class,
> >> +            required = true, description="zone Id")
> >> +    private long zoneId;
> >> +
> >> +    /////////////////////////////////////////////////////
> >> +    /////////////////// Accessors ///////////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    public long getZoneId() {
> >> +        return zoneId;
> >> +    }
> >> +
> >> +    /////////////////////////////////////////////////////
> >> +    /////////////// API Implementation///////////////////
> >> +    /////////////////////////////////////////////////////
> >> +
> >> +    @Override
> >> +    public String getCommandName() {
> >> +        return s_name;
> >> +    }
> >> +
> >> +    @Override
> >> +    public void execute(){
> >> +        List<? extends Host> trafficMonitors =
> >> _networkUsageService.listTrafficMonitors(this);
> >> +
> >> +        ListResponse<TrafficMonitorResponse> listResponse = new
> >> ListResponse<TrafficMonitorResponse>();
> >> +        List<TrafficMonitorResponse> responses = new
> >> ArrayList<TrafficMonitorResponse>();
> >> +        for (Host trafficMonitor : trafficMonitors) {
> >> +            TrafficMonitorResponse response =
> >> _responseGenerator.createTrafficMonitorResponse(trafficMonitor);
> >> +            response.setObjectName("trafficmonitor");
> >> +            response.setResponseName(getCommandName());
> >> +            responses.add(response);
> >> +        }
> >> +
> >> +        listResponse.setResponses(responses);
> >> +        listResponse.setResponseName(getCommandName());
> >> +        this.setResponseObject(listResponse);
> >> +    }
> >> +}
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/ad
> min/usage/ListUsageTypesCmd.java
> >> ----------------------------------------------------------------------
> >> diff --git
> a/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTyp
> esCmd.java
> >>
> b/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTyp
> esCmd.java
> >> new file mode 100644
> >> index 0000000..bc02911
> >> --- /dev/null
> >> +++
> b/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTyp
> esCmd.java
> >> @@ -0,0 +1,51 @@
> >> +// 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.apache.cloudstack.api.command.admin.usage;
> >> +
> >> +import java.util.List;
> >> +
> >> +import org.apache.cloudstack.api.APICommand;
> >> +import org.apache.log4j.Logger;
> >> +
> >> +import org.apache.cloudstack.api.BaseCmd;
> >> +import org.apache.cloudstack.api.response.ListResponse;
> >> +import org.apache.cloudstack.api.response.UsageTypeResponse;
> >> +import com.cloud.user.Account;
> >> +
> >> +@APICommand(name = "listUsageTypes", description = "List Usage
> >> Types", responseObject = UsageTypeResponse.class)
> >> +public class ListUsageTypesCmd extends BaseCmd {
> >> +    public static final Logger s_logger =
> >> Logger.getLogger(ListUsageTypesCmd.class.getName());
> >> +    private static final String s_name = "listusagetypesresponse";
> >> +
> >> +    @Override
> >> +    public String getCommandName() {
> >> +        return s_name;
> >> +    }
> >> +
> >> +    public long getEntityOwnerId() {
> >> +        return Account.ACCOUNT_ID_SYSTEM;
> >> +    }
> >> +
> >> +    @Override
> >> +    public void execute() {
> >> +        List<UsageTypeResponse> result = _usageService.listUsageTypes();
> >> +        ListResponse<UsageTypeResponse> response = new
> >> ListResponse<UsageTypeResponse>();
> >> +        response.setResponses(result);
> >> +        response.setResponseName(getCommandName());
> >> +        this.setResponseObject(response);
> >> +    }
> >> +}
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/api/src/org/apache/cloudstack/usage/Usage.java
> >> ----------------------------------------------------------------------
> >> diff --git a/api/src/org/apache/cloudstack/usage/Usage.java
> >> b/api/src/org/apache/cloudstack/usage/Usage.java
> >> new file mode 100644
> >> index 0000000..c74d3b7
> >> --- /dev/null
> >> +++ b/api/src/org/apache/cloudstack/usage/Usage.java
> >> @@ -0,0 +1,69 @@
> >> +// 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.apache.cloudstack.usage;
> >> +
> >> +import org.apache.cloudstack.api.InternalIdentity;
> >> +
> >> +import java.util.Date;
> >> +
> >> +import javax.persistence.Column;
> >> +import javax.persistence.Entity;
> >> +import javax.persistence.GeneratedValue;
> >> +import javax.persistence.GenerationType;
> >> +import javax.persistence.Id;
> >> +import javax.persistence.Table;
> >> +import javax.persistence.Temporal;
> >> +import javax.persistence.TemporalType;
> >> +
> >> +public interface Usage {
> >> +
> >> +       public long getId();
> >> +
> >> +       public Long getZoneId();
> >> +
> >> +       public Long getAccountId();
> >> +
> >> +    public Long getDomainId();
> >> +
> >> +       public String getDescription();
> >> +
> >> +       public String getUsageDisplay();
> >> +
> >> +       public int getUsageType();
> >> +
> >> +    public Double getRawUsage();
> >> +
> >> +    public Long getVmInstanceId();
> >> +
> >> +    public String getVmName();
> >> +
> >> +    public Long getOfferingId();
> >> +
> >> +    public Long getTemplateId();
> >> +
> >> +    public Long getUsageId();
> >> +
> >> +    public String getType();
> >> +
> >> +    public Long getNetworkId();
> >> +
> >> +    public Long getSize();
> >> +
> >> +       public Date getStartDate();
> >> +
> >> +       public Date getEndDate();
> >> +}
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/api/src/org/apache/cloudstack/usage/UsageServi
> ce.java
> >> ----------------------------------------------------------------------
> >> diff --git a/api/src/org/apache/cloudstack/usage/UsageService.java
> >> b/api/src/org/apache/cloudstack/usage/UsageService.java
> >> new file mode 100755
> >> index 0000000..3838225
> >> --- /dev/null
> >> +++ b/api/src/org/apache/cloudstack/usage/UsageService.java
> >> @@ -0,0 +1,64 @@
> >> +// 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.apache.cloudstack.usage;
> >> +
> >> +import java.util.List;
> >> +import java.util.TimeZone;
> >> +
> >> +import
> org.apache.cloudstack.api.command.admin.usage.GenerateUsageRecordsC
> md;
> >> +import
> org.apache.cloudstack.api.command.admin.usage.GetUsageRecordsCmd;
> >> +import org.apache.cloudstack.api.response.UsageTypeResponse;
> >> +
> >> +public interface UsageService {
> >> +    /**
> >> +     * Generate Billing Records from the last time it was generated to the
> >> +     * time specified.
> >> +     *
> >> +     * @param cmd the command wrapping the generate parameters
> >> +     *   - userId unique id of the user, pass in -1 to generate billing records
> >> +     *            for all users
> >> +     *   - startDate
> >> +     *   - endDate inclusive.  If date specified is greater than the
> >> current time, the
> >> +     *             system will use the current time.
> >> +     */
> >> +    boolean generateUsageRecords(GenerateUsageRecordsCmd cmd);
> >> +
> >> +    /**
> >> +     * Retrieves all Usage Records generated between the start and
> >> end date specified
> >> +     *
> >> +     * @param userId unique id of the user, pass in -1 to retrieve
> >> billing records
> >> +     *        for all users
> >> +     * @param startDate inclusive.
> >> +     * @param endDate inclusive.  If date specified is greater than
> >> the current time, the
> >> +     *                system will use the current time.
> >> +     * @param page The page of usage records to see (500 results are
> >> returned at a time, if
> >> +     *             more than 500 records exist then additional
> >> results can be retrieved by
> >> +     *             the appropriate page number)
> >> +     * @return a list of usage records
> >> +     */
> >> +    List<? extends Usage> getUsageRecords(GetUsageRecordsCmd cmd);
> >> +
> >> +    /**
> >> +     * Retrieves the timezone used for usage aggregation.  One day is
> >> represented as midnight to 11:59:59pm
> >> +     * in the given time zone
> >> +     * @return the timezone specified by the config value
> >> usage.aggregation.timezone, or GMT if null
> >> +     */
> >> +    TimeZone getUsageTimezone();
> >> +
> >> +       List<UsageTypeResponse> listUsageTypes();
> >> +
> >> +}
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/api/src/org/apache/cloudstack/usage/UsageType
> s.java
> >> ----------------------------------------------------------------------
> >> diff --git a/api/src/org/apache/cloudstack/usage/UsageTypes.java
> >> b/api/src/org/apache/cloudstack/usage/UsageTypes.java
> >> new file mode 100644
> >> index 0000000..2baa1d2
> >> --- /dev/null
> >> +++ b/api/src/org/apache/cloudstack/usage/UsageTypes.java
> >> @@ -0,0 +1,58 @@
> >> +// 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.apache.cloudstack.usage;
> >> +
> >> +import java.util.ArrayList;
> >> +import java.util.List;
> >> +
> >> +import org.apache.cloudstack.api.response.UsageTypeResponse;
> >> +
> >> +public class UsageTypes {
> >> +    public static final int RUNNING_VM = 1;
> >> +    public static final int ALLOCATED_VM = 2; // used for tracking
> >> how long storage has been allocated for a VM
> >> +    public static final int IP_ADDRESS = 3;
> >> +    public static final int NETWORK_BYTES_SENT = 4;
> >> +    public static final int NETWORK_BYTES_RECEIVED = 5;
> >> +    public static final int VOLUME = 6;
> >> +    public static final int TEMPLATE = 7;
> >> +    public static final int ISO = 8;
> >> +    public static final int SNAPSHOT = 9;
> >> +    public static final int SECURITY_GROUP = 10;
> >> +    public static final int LOAD_BALANCER_POLICY = 11;
> >> +    public static final int PORT_FORWARDING_RULE = 12;
> >> +    public static final int NETWORK_OFFERING = 13;
> >> +    public static final int VPN_USERS = 14;
> >> +
> >> +    public static List<UsageTypeResponse> listUsageTypes(){
> >> +       List<UsageTypeResponse> responseList = new
> >> ArrayList<UsageTypeResponse>();
> >> +       responseList.add(new UsageTypeResponse(RUNNING_VM,
> "Running Vm Usage"));
> >> +       responseList.add(new UsageTypeResponse(ALLOCATED_VM,
> >> "Allocated Vm Usage"));
> >> +       responseList.add(new UsageTypeResponse(IP_ADDRESS, "IP
> Address Usage"));
> >> +       responseList.add(new UsageTypeResponse(NETWORK_BYTES_SENT,
> >> "Network Usage (Bytes Sent)"));
> >> +       responseList.add(new
> UsageTypeResponse(NETWORK_BYTES_RECEIVED,
> >> "Network Usage (Bytes Received)"));
> >> +       responseList.add(new UsageTypeResponse(VOLUME, "Volume
> Usage"));
> >> +       responseList.add(new UsageTypeResponse(TEMPLATE, "Template
> Usage"));
> >> +       responseList.add(new UsageTypeResponse(ISO, "ISO Usage"));
> >> +       responseList.add(new UsageTypeResponse(SNAPSHOT, "Snapshot
> Usage"));
> >> +       responseList.add(new UsageTypeResponse(SECURITY_GROUP,
> >> "Security Group Usage"));
> >> +       responseList.add(new
> UsageTypeResponse(LOAD_BALANCER_POLICY,
> >> "Load Balancer Usage"));
> >> +       responseList.add(new
> UsageTypeResponse(PORT_FORWARDING_RULE,
> >> "Port Forwarding Usage"));
> >> +       responseList.add(new UsageTypeResponse(NETWORK_OFFERING,
> >> "Network Offering Usage"));
> >> +       responseList.add(new UsageTypeResponse(VPN_USERS, "VPN users
> usage"));
> >> +       return responseList;
> >> +    }
> >> +}
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/client/tomcatconf/componentContext.xml.in
> >> ----------------------------------------------------------------------
> >> diff --git a/client/tomcatconf/componentContext.xml.in
> >> b/client/tomcatconf/componentContext.xml.in
> >> index e3bf982..065188c 100644
> >> --- a/client/tomcatconf/componentContext.xml.in
> >> +++ b/client/tomcatconf/componentContext.xml.in
> >> @@ -36,7 +36,7 @@
> >>   -->
> >>   <bean id="databaseUpgradeChecker"
> >> class="com.cloud.upgrade.DatabaseUpgradeChecker" />
> >>
> >> -  <bean id="management-server" class
> >> ="com.cloud.server.ManagementServerExtImpl" />
> >> +  <bean id="management-server" class
> >> ="com.cloud.server.ManagementServerImpl" />
> >>   <bean id="configuration-server"
> >> class="com.cloud.server.ConfigurationServerImpl" />
> >>
> >>   <bean id="clusterManagerImpl"
> class="com.cloud.cluster.ClusterManagerImpl" />
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/plugins/hypervisors/simulator/src/com/cloud/ser
> ver/ManagementServerSimulatorImpl.java
> >> ----------------------------------------------------------------------
> >> diff --git
> a/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServer
> SimulatorImpl.java
> >>
> b/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServer
> SimulatorImpl.java
> >> index db4b619..728271c 100644
> >> ---
> a/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServer
> SimulatorImpl.java
> >> +++
> b/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServer
> SimulatorImpl.java
> >> @@ -21,7 +21,7 @@ import java.util.List;
> >>
> >> import com.cloud.api.commands.ConfigureSimulator;
> >>
> >> -public class ManagementServerSimulatorImpl extends
> ManagementServerExtImpl {
> >> +public class ManagementServerSimulatorImpl extends
> ManagementServerImpl {
> >>     @Override
> >>     public List<Class<?>> getCommands() {
> >>         List<Class<?>> cmdList = super.getCommands();
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/plugins/network-elements/dns-
> notifier/resources/components-example.xml
> >> ----------------------------------------------------------------------
> >> diff --git a/plugins/network-elements/dns-
> notifier/resources/components-example.xml
> >> b/plugins/network-elements/dns-notifier/resources/components-
> example.xml
> >> index 412da0e..36441bd 100755
> >> --- a/plugins/network-elements/dns-notifier/resources/components-
> example.xml
> >> +++ b/plugins/network-elements/dns-notifier/resources/components-
> example.xml
> >> @@ -29,7 +29,7 @@ under the License.
> >>     </system-integrity-checker>
> >>
> >>     <interceptor
> library="com.cloud.configuration.DefaultInterceptorLibrary"/>
> >> -    <management-server
> >> class="com.cloud.server.ManagementServerExtImpl"
> >> library="com.cloud.configuration.PremiumComponentLibrary">
> >> +    <management-server
> class="com.cloud.server.ManagementServerImpl"
> >> library="com.cloud.configuration.PremiumComponentLibrary">
> >>         <dao name="Configuration configuration server"
> >> class="com.cloud.configuration.dao.ConfigurationDaoImpl">
> >>              <param name="premium">true</param>
> >>         </dao>
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/server/src/com/cloud/api/ApiDBUtils.java
> >> ----------------------------------------------------------------------
> >> diff --git a/server/src/com/cloud/api/ApiDBUtils.java
> >> b/server/src/com/cloud/api/ApiDBUtils.java
> >> index 8e950ab..83132c6 100755
> >> --- a/server/src/com/cloud/api/ApiDBUtils.java
> >> +++ b/server/src/com/cloud/api/ApiDBUtils.java
> >> @@ -83,8 +83,6 @@ import com.cloud.api.query.vo.StoragePoolJoinVO;
> >> import com.cloud.api.query.vo.UserAccountJoinVO;
> >> import com.cloud.api.query.vo.UserVmJoinVO;
> >> import com.cloud.api.query.vo.VolumeJoinVO;
> >> -import com.cloud.api.query.dao.*;
> >> -import com.cloud.api.query.vo.*;
> >> import com.cloud.async.AsyncJob;
> >> import com.cloud.async.AsyncJobManager;
> >> import com.cloud.async.AsyncJobVO;
> >> @@ -108,6 +106,7 @@ import com.cloud.host.Host;
> >> import com.cloud.host.HostStats;
> >> import com.cloud.host.HostVO;
> >> import com.cloud.host.dao.HostDao;
> >> +import com.cloud.host.dao.HostDetailsDao;
> >> import com.cloud.hypervisor.Hypervisor.HypervisorType;
> >> import com.cloud.network.IpAddress;
> >> import com.cloud.network.Network;
> >> @@ -156,10 +155,6 @@ import
> com.cloud.network.dao.Site2SiteCustomerGatewayDao;
> >> import com.cloud.network.dao.Site2SiteCustomerGatewayVO;
> >> import com.cloud.network.dao.Site2SiteVpnGatewayDao;
> >> import com.cloud.network.dao.Site2SiteVpnGatewayVO;
> >> -import com.cloud.network.*;
> >> -import com.cloud.network.as.*;
> >> -import com.cloud.network.as.dao.*;
> >> -import com.cloud.network.dao.*;
> >> import com.cloud.network.router.VirtualRouter;
> >> import com.cloud.network.rules.FirewallRuleVO;
> >> import com.cloud.network.security.SecurityGroup;
> >> @@ -313,6 +308,7 @@ public class ApiDBUtils {
> >>     static VpcOfferingDao _vpcOfferingDao;
> >>     static SnapshotPolicyDao _snapshotPolicyDao;
> >>     static AsyncJobDao _asyncJobDao;
> >> +    static HostDetailsDao _hostDetailsDao;
> >>
> >>     @Inject private ManagementServer ms;
> >>     @Inject public AsyncJobManager asyncMgr;
> >> @@ -410,6 +406,7 @@ public class ApiDBUtils {
> >>     @Inject private VpcOfferingDao vpcOfferingDao;
> >>     @Inject private SnapshotPolicyDao snapshotPolicyDao;
> >>     @Inject private AsyncJobDao asyncJobDao;
> >> +    @Inject private HostDetailsDao hostDetailsDao;
> >>
> >>     @PostConstruct
> >>     void init() {
> >> @@ -507,6 +504,7 @@ public class ApiDBUtils {
> >>         _vpcOfferingDao = vpcOfferingDao;
> >>         _snapshotPolicyDao = snapshotPolicyDao;
> >>         _asyncJobDao = asyncJobDao;
> >> +        _hostDetailsDao = hostDetailsDao;
> >>
> >>         // Note: stats collector should already have been initialized
> >> by this time, otherwise a null instance is returned
> >>         _statsCollector = StatsCollector.getInstance();
> >> @@ -1493,4 +1491,8 @@ public class ApiDBUtils {
> >>    public static DataCenterJoinVO newDataCenterView(DataCenter dc){
> >>        return _dcJoinDao.newDataCenterView(dc);
> >>    }
> >> +
> >> +   public static Map<String, String> findHostDetailsById(long hostId){
> >> +          return _hostDetailsDao.findDetails(hostId);
> >> +   }
> >> }
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/server/src/com/cloud/api/ApiResponseHelper.jav
> a
> >> ----------------------------------------------------------------------
> >> diff --git a/server/src/com/cloud/api/ApiResponseHelper.java
> >> b/server/src/com/cloud/api/ApiResponseHelper.java
> >> index 411de94..8c97615 100755
> >> --- a/server/src/com/cloud/api/ApiResponseHelper.java
> >> +++ b/server/src/com/cloud/api/ApiResponseHelper.java
> >> @@ -81,7 +81,9 @@ import
> >> org.apache.cloudstack.api.response.SystemVmInstanceResponse;
> >> import org.apache.cloudstack.api.response.SystemVmResponse;
> >> import
> org.apache.cloudstack.api.response.TemplatePermissionsResponse;
> >> import org.apache.cloudstack.api.response.TemplateResponse;
> >> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
> >> import org.apache.cloudstack.api.response.TrafficTypeResponse;
> >> +import org.apache.cloudstack.api.response.UsageRecordResponse;
> >> import org.apache.cloudstack.api.response.UserResponse;
> >> import org.apache.cloudstack.api.response.UserVmResponse;
> >> import
> org.apache.cloudstack.api.response.VirtualRouterProviderResponse;
> >> @@ -103,6 +105,7 @@ import com.cloud.configuration.Configuration;
> >> import com.cloud.configuration.Resource.ResourceOwnerType;
> >> import com.cloud.configuration.ResourceCount;
> >> import com.cloud.configuration.ResourceLimit;
> >> +import com.cloud.dao.EntityManager;
> >> import com.cloud.dc.*;
> >> import com.cloud.dc.Vlan.VlanType;
> >> import com.cloud.domain.Domain;
> >> @@ -139,6 +142,7 @@ import
> com.cloud.network.dao.PhysicalNetworkVO;
> >> import com.cloud.network.router.VirtualRouter;
> >> import com.cloud.network.rules.*;
> >> import com.cloud.network.security.SecurityGroup;
> >> +import com.cloud.network.security.SecurityGroupVO;
> >> import com.cloud.network.security.SecurityRule;
> >> import com.cloud.network.security.SecurityRule.SecurityRuleType;
> >> import com.cloud.network.vpc.PrivateGateway;
> >> @@ -148,6 +152,7 @@ import com.cloud.network.vpc.VpcOffering;
> >> import com.cloud.offering.DiskOffering;
> >> import com.cloud.offering.NetworkOffering;
> >> import com.cloud.offering.ServiceOffering;
> >> +import com.cloud.offerings.NetworkOfferingVO;
> >> import com.cloud.org.Cluster;
> >> import com.cloud.projects.Project;
> >> import com.cloud.projects.ProjectAccount;
> >> @@ -155,6 +160,7 @@ import com.cloud.projects.ProjectInvitation;
> >> import com.cloud.server.Criteria;
> >> import com.cloud.server.ResourceTag;
> >> import com.cloud.server.ResourceTag.TaggedResourceType;
> >> +import com.cloud.service.ServiceOfferingVO;
> >> import com.cloud.storage.*;
> >> import com.cloud.storage.Storage.ImageFormat;
> >> import com.cloud.storage.Storage.StoragePoolType;
> >> @@ -174,6 +180,7 @@ import com.cloud.utils.net.NetUtils;
> >> import com.cloud.vm.ConsoleProxyVO;
> >> import com.cloud.vm.InstanceGroup;
> >> import com.cloud.vm.NicProfile;
> >> +import com.cloud.vm.VMInstanceVO;
> >> import com.cloud.vm.VirtualMachine;
> >> import com.cloud.vm.VirtualMachine.Type;
> >> import org.apache.cloudstack.acl.ControlledEntity;
> >> @@ -185,11 +192,16 @@ import
> org.apache.cloudstack.api.ResponseGenerator;
> >> import
> org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd;
> >> import org.apache.cloudstack.api.response.*;
> >> import org.apache.cloudstack.region.Region;
> >> +import org.apache.cloudstack.usage.Usage;
> >> +import org.apache.cloudstack.usage.UsageService;
> >> +import org.apache.cloudstack.usage.UsageTypes;
> >> import org.apache.log4j.Logger;
> >>
> >> import java.text.DecimalFormat;
> >> import java.util.*;
> >>
> >> +import javax.inject.Inject;
> >> +
> >> import static java.util.Collections.emptyList;
> >> import static java.util.Collections.singletonList;
> >>
> >> @@ -198,6 +210,8 @@ public class ApiResponseHelper implements
> >> ResponseGenerator {
> >>
> >>     public final Logger s_logger =
> Logger.getLogger(ApiResponseHelper.class);
> >>     private static final DecimalFormat s_percentFormat = new
> >> DecimalFormat("##.##");
> >> +    @Inject private EntityManager _entityMgr = null;
> >> +    @Inject private UsageService _usageSvc = null;
> >>
> >>     @Override
> >>     public UserResponse createUserResponse(User user) {
> >> @@ -3118,4 +3132,243 @@ public class ApiResponseHelper implements
> >> ResponseGenerator {
> >>         return response;
> >>     }
> >>
> >> +
> >> +
> >> +       @Override
> >> +       public UsageRecordResponse createUsageResponse(Usage
> usageRecord) {
> >> +               UsageRecordResponse usageRecResponse = new
> >> UsageRecordResponse();
> >> +
> >> +               Account account =
> >>
> ApiDBUtils.findAccountByIdIncludingRemoved(usageRecord.getAccountId());
> >> +               if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) {
> >> +                       //find the project
> >> +                       Project project =
> >>
> ApiDBUtils.findProjectByProjectAccountIdIncludingRemoved(account.getId()
> );
> >> +                       usageRecResponse.setProjectId(project.getUuid());
> >> +                       usageRecResponse.setProjectName(project.getName());
> >> +               } else {
> >> +                       usageRecResponse.setAccountId(account.getUuid());
> >> +
> >> usageRecResponse.setAccountName(account.getAccountName());
> >> +               }
> >> +
> >> +               Domain domain =
> >> ApiDBUtils.findDomainById(usageRecord.getDomainId());
> >> +               if (domain != null) {
> >> +                       usageRecResponse.setDomainId(domain.getUuid());
> >> +               }
> >> +
> >> +               if (usageRecord.getZoneId() != null) {
> >> +                       DataCenter zone =
> >> ApiDBUtils.findZoneById(usageRecord.getZoneId());
> >> +                       if (zone != null) {
> >> +                               usageRecResponse.setZoneId(zone.getUuid());
> >> +                       }
> >> +               }
> >> +
> usageRecResponse.setDescription(usageRecord.getDescription());
> >> +               usageRecResponse.setUsage(usageRecord.getUsageDisplay());
> >> +
> usageRecResponse.setUsageType(usageRecord.getUsageType());
> >> +               if (usageRecord.getVmInstanceId() != null) {
> >> +                       VMInstanceVO vm =
> >> _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class,
> >> usageRecord.getVmInstanceId());
> >> +                       usageRecResponse.setVirtualMachineId(vm.getUuid());
> >> +               }
> >> +               usageRecResponse.setVmName(usageRecord.getVmName());
> >> +               if (usageRecord.getTemplateId() != null) {
> >> +                       VMTemplateVO template =
> >> ApiDBUtils.findTemplateById(usageRecord.getTemplateId());
> >> +                       if (template != null) {
> >> +
> >> usageRecResponse.setTemplateId(template.getUuid());
> >> +                       }
> >> +               }
> >> +
> >> +               if(usageRecord.getUsageType() == UsageTypes.RUNNING_VM
> >> || usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM){
> >> +                       ServiceOfferingVO svcOffering =
> >> _entityMgr.findByIdIncludingRemoved(ServiceOfferingVO.class,
> >> usageRecord.getOfferingId().toString());
> >> +                       //Service Offering Id
> >> +                       usageRecResponse.setOfferingId(svcOffering.getUuid());
> >> +                       //VM Instance ID
> >> +                       VMInstanceVO vm =
> >> _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class,
> >> usageRecord.getUsageId().toString());
> >> +                       usageRecResponse.setUsageId(vm.getUuid());
> >> +                       //Hypervisor Type
> >> +                       usageRecResponse.setType(usageRecord.getType());
> >> +
> >> +               } else if(usageRecord.getUsageType() ==
> UsageTypes.IP_ADDRESS){
> >> +                       //isSourceNAT
> >> +
> >>
> usageRecResponse.setSourceNat((usageRecord.getType().equals("SourceN
> at"))?true:false);
> >> +                       //isSystem
> >> +
> >> usageRecResponse.setSystem((usageRecord.getSize() == 1)?true:false);
> >> +                       //IP Address ID
> >> +                       IPAddressVO ip =
> >> _entityMgr.findByIdIncludingRemoved(IPAddressVO.class,
> >> usageRecord.getUsageId().toString());
> >> +                       usageRecResponse.setUsageId(ip.getUuid());
> >> +
> >> +               } else if(usageRecord.getUsageType() ==
> >> UsageTypes.NETWORK_BYTES_SENT || usageRecord.getUsageType() ==
> >> UsageTypes.NETWORK_BYTES_RECEIVED){
> >> +                       //Device Type
> >> +                       usageRecResponse.setType(usageRecord.getType());
> >> +                       if(usageRecord.getType().equals("DomainRouter")){
> >> +                               //Domain Router Id
> >> +                               VMInstanceVO vm =
> >> _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class,
> >> usageRecord.getUsageId().toString());
> >> +                               usageRecResponse.setUsageId(vm.getUuid());
> >> +                       } else {
> >> +                               //External Device Host Id
> >> +                               HostVO host =
> >> _entityMgr.findByIdIncludingRemoved(HostVO.class,
> >> usageRecord.getUsageId().toString());
> >> +                               usageRecResponse.setUsageId(host.getUuid());
> >> +                       }
> >> +                       //Network ID
> >> +                       NetworkVO network =
> >> _entityMgr.findByIdIncludingRemoved(NetworkVO.class,
> >> usageRecord.getNetworkId().toString());
> >> +                       usageRecResponse.setNetworkId(network.getUuid());
> >> +
> >> +               } else if(usageRecord.getUsageType() == UsageTypes.VOLUME){
> >> +                       //Volume ID
> >> +                       VolumeVO volume =
> >> _entityMgr.findByIdIncludingRemoved(VolumeVO.class,
> >> usageRecord.getUsageId().toString());
> >> +                       usageRecResponse.setUsageId(volume.getUuid());
> >> +                       //Volume Size
> >> +                       usageRecResponse.setSize(usageRecord.getSize());
> >> +                       //Disk Offering Id
> >> +                       if(usageRecord.getOfferingId() != null){
> >> +                               DiskOfferingVO diskOff =
> >> _entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class,
> >> usageRecord.getOfferingId().toString());
> >> +
> >> usageRecResponse.setOfferingId(diskOff.getUuid());
> >> +                       }
> >> +
> >> +               } else if(usageRecord.getUsageType() ==
> >> UsageTypes.TEMPLATE || usageRecord.getUsageType() ==
> UsageTypes.ISO){
> >> +                       //Template/ISO ID
> >> +                       VMTemplateVO tmpl =
> >> _entityMgr.findByIdIncludingRemoved(VMTemplateVO.class,
> >> usageRecord.getUsageId().toString());
> >> +                       usageRecResponse.setUsageId(tmpl.getUuid());
> >> +                       //Template/ISO Size
> >> +                       usageRecResponse.setSize(usageRecord.getSize());
> >> +
> >> +               } else if(usageRecord.getUsageType() ==
> UsageTypes.SNAPSHOT){
> >> +                       //Snapshot ID
> >> +                       SnapshotVO snap =
> >> _entityMgr.findByIdIncludingRemoved(SnapshotVO.class,
> >> usageRecord.getUsageId().toString());
> >> +                       usageRecResponse.setUsageId(snap.getUuid());
> >> +                       //Snapshot Size
> >> +                       usageRecResponse.setSize(usageRecord.getSize());
> >> +
> >> +               } else if(usageRecord.getUsageType() ==
> >> UsageTypes.LOAD_BALANCER_POLICY){
> >> +                       //Load Balancer Policy ID
> >> +
> >> usageRecResponse.setUsageId(usageRecord.getUsageId().toString());
> >> +
> >> +               } else if(usageRecord.getUsageType() ==
> >> UsageTypes.PORT_FORWARDING_RULE){
> >> +                       //Port Forwarding Rule ID
> >> +
> >> usageRecResponse.setUsageId(usageRecord.getUsageId().toString());
> >> +
> >> +               } else if(usageRecord.getUsageType() ==
> >> UsageTypes.NETWORK_OFFERING){
> >> +                       //Network Offering Id
> >> +                       NetworkOfferingVO netOff =
> >> _entityMgr.findByIdIncludingRemoved(NetworkOfferingVO.class,
> >> usageRecord.getOfferingId().toString());
> >> +                       usageRecResponse.setOfferingId(netOff.getUuid());
> >> +                       //is Default
> >> +
> >> usageRecResponse.setDefault((usageRecord.getUsageId() == 1)?
> >> true:false);
> >> +
> >> +               } else if(usageRecord.getUsageType() ==
> UsageTypes.VPN_USERS){
> >> +                       //VPN User ID
> >> +
> >> usageRecResponse.setUsageId(usageRecord.getUsageId().toString());
> >> +
> >> +               } else if(usageRecord.getUsageType() ==
> >> UsageTypes.SECURITY_GROUP){
> >> +                       //Security Group Id
> >> +                       SecurityGroupVO sg =
> >> _entityMgr.findByIdIncludingRemoved(SecurityGroupVO.class,
> >> usageRecord.getUsageId().toString());
> >> +                       usageRecResponse.setUsageId(sg.getUuid());
> >> +               }
> >> +
> >> +               if (usageRecord.getRawUsage() != null) {
> >> +                       DecimalFormat decimalFormat = new
> >> DecimalFormat("###########.######");
> >> +
> >>
> usageRecResponse.setRawUsage(decimalFormat.format(usageRecord.getRa
> wUsage()));
> >> +               }
> >> +
> >> +               if (usageRecord.getStartDate() != null) {
> >> +
> >>
> usageRecResponse.setStartDate(getDateStringInternal(usageRecord.getStar
> tDate()));
> >> +               }
> >> +               if (usageRecord.getEndDate() != null) {
> >> +
> >>
> usageRecResponse.setEndDate(getDateStringInternal(usageRecord.getEndD
> ate()));
> >> +               }
> >> +
> >> +               return usageRecResponse;
> >> +       }
> >> +
> >> +
> >> +    public String getDateStringInternal(Date inputDate) {
> >> +        if (inputDate == null) return null;
> >> +
> >> +        TimeZone tz = _usageSvc.getUsageTimezone();
> >> +        Calendar cal = Calendar.getInstance(tz);
> >> +        cal.setTime(inputDate);
> >> +
> >> +        StringBuffer sb = new StringBuffer();
> >> +        sb.append(cal.get(Calendar.YEAR)+"-");
> >> +
> >> +        int month = cal.get(Calendar.MONTH) + 1;
> >> +        if (month < 10) {
> >> +            sb.append("0" + month + "-");
> >> +        } else {
> >> +            sb.append(month+"-");
> >> +        }
> >> +
> >> +        int day = cal.get(Calendar.DAY_OF_MONTH);
> >> +        if (day < 10) {
> >> +            sb.append("0" + day);
> >> +        } else {
> >> +            sb.append(""+day);
> >> +        }
> >> +
> >> +        sb.append("'T'");
> >> +
> >> +        int hour = cal.get(Calendar.HOUR_OF_DAY);
> >> +        if (hour < 10) {
> >> +            sb.append("0" + hour + ":");
> >> +        } else {
> >> +            sb.append(hour+":");
> >> +        }
> >> +
> >> +        int minute = cal.get(Calendar.MINUTE);
> >> +        if (minute < 10) {
> >> +            sb.append("0" + minute + ":");
> >> +        } else {
> >> +            sb.append(minute+":");
> >> +        }
> >> +
> >> +        int seconds = cal.get(Calendar.SECOND);
> >> +        if (seconds < 10) {
> >> +            sb.append("0" + seconds);
> >> +        } else {
> >> +            sb.append(""+seconds);
> >> +        }
> >> +
> >> +        double offset = cal.get(Calendar.ZONE_OFFSET);
> >> +        if (tz.inDaylightTime(inputDate)) {
> >> +            offset += (1.0*tz.getDSTSavings()); // add the timezone's
> >> DST value (typically 1 hour expressed in milliseconds)
> >> +        }
> >> +
> >> +        offset = offset / (1000d*60d*60d);
> >> +        int hourOffset = (int)offset;
> >> +        double decimalVal = Math.abs(offset) - Math.abs(hourOffset);
> >> +        int minuteOffset = (int)(decimalVal * 60);
> >> +
> >> +        if (hourOffset < 0) {
> >> +            if (hourOffset > -10) {
> >> +                sb.append("-0"+Math.abs(hourOffset));
> >> +            } else {
> >> +                sb.append("-"+Math.abs(hourOffset));
> >> +            }
> >> +        } else {
> >> +            if (hourOffset < 10) {
> >> +                sb.append("+0" + hourOffset);
> >> +            } else {
> >> +                sb.append("+" + hourOffset);
> >> +            }
> >> +        }
> >> +
> >> +        sb.append(":");
> >> +
> >> +        if (minuteOffset == 0) {
> >> +            sb.append("00");
> >> +        } else if (minuteOffset < 10) {
> >> +            sb.append("0" + minuteOffset);
> >> +        } else {
> >> +            sb.append("" + minuteOffset);
> >> +        }
> >> +
> >> +        return sb.toString();
> >> +    }
> >> +
> >> +    @Override
> >> +    public TrafficMonitorResponse createTrafficMonitorResponse(Host
> >> trafficMonitor) {
> >> +        Map<String, String> tmDetails =
> >> ApiDBUtils.findHostDetailsById(trafficMonitor.getId());
> >> +        TrafficMonitorResponse response = new TrafficMonitorResponse();
> >> +        response.setId(trafficMonitor.getUuid());
> >> +        response.setIpAddress(trafficMonitor.getPrivateIpAddress());
> >> +        response.setNumRetries(tmDetails.get("numRetries"));
> >> +        response.setTimeout(tmDetails.get("timeout"));
> >> +        return response;
> >> +    }
> >> }
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/server/src/com/cloud/api/commands/AddTraffic
> MonitorCmd.java
> >> ----------------------------------------------------------------------
> >> diff --git
> a/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
> >> b/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
> >> deleted file mode 100644
> >> index 8728959..0000000
> >> --- a/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
> >> +++ /dev/null
> >> @@ -1,109 +0,0 @@
> >> -// 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 com.cloud.api.commands;
> >> -
> >> -import javax.inject.Inject;
> >> -
> >> -import org.apache.cloudstack.api.APICommand;
> >> -import org.apache.cloudstack.api.ApiConstants;
> >> -import org.apache.cloudstack.api.ApiErrorCode;
> >> -import org.apache.cloudstack.api.BaseCmd;
> >> -import org.apache.cloudstack.api.Parameter;
> >> -import org.apache.cloudstack.api.ServerApiException;
> >> -import org.apache.cloudstack.api.response.TrafficMonitorResponse;
> >> -import org.apache.cloudstack.api.response.ZoneResponse;
> >> -import org.apache.log4j.Logger;
> >> -
> >> -import com.cloud.exception.InvalidParameterValueException;
> >> -import com.cloud.host.Host;
> >> -import com.cloud.network.NetworkUsageManager;
> >> -import com.cloud.user.Account;
> >> -import com.cloud.utils.exception.CloudRuntimeException;
> >> -
> >> -@APICommand(name = "addTrafficMonitor", description="Adds Traffic
> >> Monitor Host for Direct Network Usage", responseObject =
> >> TrafficMonitorResponse.class)
> >> -public class AddTrafficMonitorCmd extends BaseCmd {
> >> -    public static final Logger s_logger =
> >> Logger.getLogger(AddTrafficMonitorCmd.class.getName());
> >> -    private static final String s_name = "addtrafficmonitorresponse";
> >> -    @Inject NetworkUsageManager networkUsageMgr;
> >> -
> >> -    /////////////////////////////////////////////////////
> >> -    //////////////// API parameters /////////////////////
> >> -    /////////////////////////////////////////////////////
> >> -
> >> -    @Parameter(name=ApiConstants.ZONE_ID,
> type=CommandType.UUID,
> >> entityType = ZoneResponse.class,
> >> -            required = true, description="Zone in which to add the
> >> external firewall appliance.")
> >> -    private Long zoneId;
> >> -
> >> -    @Parameter(name=ApiConstants.URL, type=CommandType.STRING,
> >> required = true, description="URL of the traffic monitor Host")
> >> -    private String url;
> >> -
> >> -    @Parameter(name=ApiConstants.INCL_ZONES,
> type=CommandType.STRING,
> >> description="Traffic going into the listed zones will be metered")
> >> -    private String inclZones;
> >> -
> >> -    @Parameter(name=ApiConstants.EXCL_ZONES,
> type=CommandType.STRING,
> >> description="Traffic going into the listed zones will not be metered")
> >> -    private String exclZones;
> >> -
> >> -    ///////////////////////////////////////////////////
> >> -    /////////////////// Accessors ///////////////////////
> >> -    /////////////////////////////////////////////////////
> >> -
> >> -    public String getInclZones() {
> >> -        return inclZones;
> >> -    }
> >> -
> >> -    public String getExclZones() {
> >> -        return exclZones;
> >> -    }
> >> -
> >> -    public Long getZoneId() {
> >> -        return zoneId;
> >> -    }
> >> -
> >> -    public String getUrl() {
> >> -        return url;
> >> -    }
> >> -
> >> -    /////////////////////////////////////////////////////
> >> -    /////////////// API Implementation///////////////////
> >> -    /////////////////////////////////////////////////////
> >> -
> >> -    @Override
> >> -    public String getCommandName() {
> >> -        return s_name;
> >> -    }
> >> -
> >> -    @Override
> >> -    public long getEntityOwnerId() {
> >> -        return Account.ACCOUNT_ID_SYSTEM;
> >> -    }
> >> -
> >> -    @Override
> >> -    public void execute(){
> >> -        try {
> >> -            Host trafficMonitor = networkUsageMgr.addTrafficMonitor(this);
> >> -            TrafficMonitorResponse response =
> >> networkUsageMgr.getApiResponse(trafficMonitor);
> >> -            response.setObjectName("trafficmonitor");
> >> -            response.setResponseName(getCommandName());
> >> -            this.setResponseObject(response);
> >> -        } catch (InvalidParameterValueException ipve) {
> >> -                       throw new
> >> ServerApiException(ApiErrorCode.PARAM_ERROR, ipve.getMessage());
> >> -        } catch (CloudRuntimeException cre) {
> >> -                       throw new
> >> ServerApiException(ApiErrorCode.INTERNAL_ERROR, cre.getMessage());
> >> -        }
> >> -    }
> >> -}
> >> -
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/server/src/com/cloud/api/commands/DeleteTraff
> icMonitorCmd.java
> >> ----------------------------------------------------------------------
> >> diff --git
> a/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
> >> b/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
> >> deleted file mode 100644
> >> index 081d0be..0000000
> >> ---
> a/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
> >> +++ /dev/null
> >> @@ -1,86 +0,0 @@
> >> -// 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 com.cloud.api.commands;
> >> -
> >> -import javax.inject.Inject;
> >> -
> >> -import org.apache.cloudstack.api.APICommand;
> >> -import org.apache.cloudstack.api.ApiConstants;
> >> -import org.apache.cloudstack.api.ApiErrorCode;
> >> -import org.apache.cloudstack.api.BaseCmd;
> >> -import org.apache.cloudstack.api.Parameter;
> >> -import org.apache.cloudstack.api.ServerApiException;
> >> -import org.apache.cloudstack.api.response.HostResponse;
> >> -import org.apache.cloudstack.api.response.SuccessResponse;
> >> -import org.apache.log4j.Logger;
> >> -
> >> -import com.cloud.exception.InvalidParameterValueException;
> >> -import com.cloud.network.NetworkUsageManager;
> >> -import com.cloud.user.Account;
> >> -
> >> -@APICommand(name = "deleteTrafficMonitor", description="Deletes an
> >> traffic monitor host.", responseObject = SuccessResponse.class)
> >> -public class DeleteTrafficMonitorCmd extends BaseCmd {
> >> -    public static final Logger s_logger =
> >> Logger.getLogger(DeleteTrafficMonitorCmd.class.getName());
> >> -    private static final String s_name = "deletetrafficmonitorresponse";
> >> -    @Inject NetworkUsageManager _networkUsageMgr;
> >> -
> >> -    /////////////////////////////////////////////////////
> >> -    //////////////// API parameters /////////////////////
> >> -    /////////////////////////////////////////////////////
> >> -
> >> -    @Parameter(name=ApiConstants.ID, type=CommandType.UUID,
> >> entityType = HostResponse.class,
> >> -            required = true, description="Id of the Traffic Monitor Host.")
> >> -    private Long id;
> >> -
> >> -    ///////////////////////////////////////////////////
> >> -    /////////////////// Accessors ///////////////////////
> >> -    /////////////////////////////////////////////////////
> >> -
> >> -    public Long getId() {
> >> -        return id;
> >> -    }
> >> -
> >> -    /////////////////////////////////////////////////////
> >> -    /////////////// API Implementation///////////////////
> >> -    /////////////////////////////////////////////////////
> >> -
> >> -    @Override
> >> -    public String getCommandName() {
> >> -        return s_name;
> >> -    }
> >> -
> >> -    @Override
> >> -    public long getEntityOwnerId() {
> >> -        return Account.ACCOUNT_ID_SYSTEM;
> >> -    }
> >> -
> >> -    @Override
> >> -    public void execute(){
> >> -        try {
> >> -            boolean result = _networkUsageMgr.deleteTrafficMonitor(this);
> >> -            if (result) {
> >> -                SuccessResponse response = new
> >> SuccessResponse(getCommandName());
> >> -                response.setResponseName(getCommandName());
> >> -                this.setResponseObject(response);
> >> -            } else {
> >> -                               throw new
> >> ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete
> >> traffic monitor.");
> >> -            }
> >> -        } catch (InvalidParameterValueException e) {
> >> -                       throw new
> >> ServerApiException(ApiErrorCode.PARAM_ERROR, "Failed to delete
> traffic
> >> monitor.");
> >> -        }
> >> -    }
> >> -}
> >>
> >> http://git-wip-us.apache.org/repos/asf/incubator-
> cloudstack/blob/7970384f/server/src/com/cloud/api/commands/GenerateU
> sageRecordsCmd.java
> >> ----------------------------------------------------------------------
> >> diff --git
> a/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
> >>
> b/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
> >> deleted file mode 100644
> >> index 4206cf8..0000000
> >> ---
> a/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
> >> +++ /dev/null
> >> @@ -1,91 +0,0 @@
> >> -// 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 com.cloud.api.commands;
> >> -
> >> -import java.util.Date;
> >> -
> >> -import org.apache.cloudstack.api.*;
> >> -import org.apache.cloudstack.api.response.DomainResponse;
> >> -import org.apache.log4j.Logger;
> >> -
> >> -import org.apache.cloudstack.api.APICommand;
> >> -import org.apache.cloudstack.api.response.SuccessResponse;
> >> -import com.cloud.server.ManagementServerExt;
> >> -import com.cloud.user.Account;
> >> -
> >> -@APICommand(name = "generateUsageRecords",
> description="Generates
> >> usage records. This will generate records only if there any records to
> >> be generated, i.e if the scheduled usage job was not run or failed",
> >> responseObject=SuccessResponse.class)
> >> -public class GenerateUsageRecordsCmd extends BaseCmd {
> >> -    public static final Logger s_logger =
> >> Logger.getLogger(GenerateUsageRecordsCmd.class.getName());
> >> -
> >> -    private static final String s_name = "generateusagerecordsresponse";
> >> -
> >> -    /////////////////////////////////////////////////////
> >> -    //////////////// API parameters /////////////////////
> >> -    /////////////////////////////////////////////////////
> >> -
> >> -    @Parameter(name=ApiConstants.DOMAIN_ID,
> type=CommandType.UUID,
> >> entityType = DomainResponse.class,
> >> -            description="List events for the specified domain.")
> >> -    private Long domainId;
> >> -
> >> -    @Parameter(name=ApiConstants.END_DATE,
> type=CommandType.DATE,
> >> required=true, description="End date range for usage record query. Use
> >> yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.")
> >> -    private Date endDate;
> >> -
> >> -    @Parameter(name=ApiConstants.START_DATE,
> type=CommandType.DATE,
> >> required=true, description="Start date range for usage record query.
> >> Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.")
> >> -    private Date startDate;
> >> -
> >> -    /////////////////////////////////////////////////////
> >> -    /////////////////// Accessors ///////////////////////
> >> -    /////////////////////////////////////////////////////
> >> -
> >> -    public Long getDomainId() {
> >> -        return domainId;
> >> -    }
> >> -
> >> -    public Date getEndDate() {
> >> -        return endDate;
> >> -    }
> >> -
> >> -    public Date getStartDate() {
> >> -        return startDate;
> >> -    }
> >> -
> >> -    /////////////////////////////////////////////////////
> >> -    /////////////// API Implementation///////////////////
> >> -    /////////////////////////////////////////////////////
> >> -
> >> -    @Override
> >> -    public String getCommandName() {
> >> -        return s_name;
> >> -    }
> >> -
> >> -    @Override
> >> -    public long getEntityOwnerId() {
> >> -        return Account.ACCOUNT_ID_SYSTEM;
> >> -    }
> >> -
> >> -    @Override
> >> -    public void execute(){
> >> -        ManagementServerExt _mgrExt = (ManagementServerExt)_mgr;
> >> -        boolean result = _mgrExt.generateUsageRecords(this);
> >> -        if (result) {
> >> -            SuccessResponse response = new
> SuccessResponse(getCommandName());
> >> -            this.setResponseObject(response);
> >> -        } else {
> >> -            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
> >> "Failed to generate usage records");
> >> -        }
> >> -    }
> >> -}
> >

Re: [2/2] git commit: refs/heads/4.1 - CLOUDSTACK-786, CLOUDSTACK-1014: Moved usage APIs to cloud-api. Removed ManagementServerExt. Usage API related implementation is added to UsageServiceImpl

Posted by Chip Childers <ch...@sungard.com>.
On Tue, Feb 5, 2013 at 10:48 AM, Kishan Kavala <Ki...@citrix.com> wrote:
> Chip,
>   API refactoring moved all the APIs to cloud-api project. But somehow 6 APIs (all related to usage) remained in cloud-server. The cmd objects and their implementations also were not inline with the rest of the APIs. This commit moved the 6 Usage APIs and fixed the implementation.
>
> ~kishan

Fair, thanks for explaining.

Are there any test results from this commit?  We tested the API
refactoring prior to cutting 4.1, and I'm surprised that this was
missed.  Did you run a regression tests against the changes?

> On 05-Feb-2013, at 8:49 PM, "Chip Childers" <ch...@sungard.com> wrote:
>
>> Hey Kishan,
>>
>> Was this refactoring needed as part of 4.1?
>>
>>
>> ---------- Forwarded message ----------
>> From:  <ki...@apache.org>
>> Date: Tue, Feb 5, 2013 at 6:18 AM
>> Subject: [2/2] git commit: refs/heads/4.1 - CLOUDSTACK-786,
>> CLOUDSTACK-1014: Moved usage APIs to cloud-api. Removed
>> ManagementServerExt. Usage API related implementation is added to
>> UsageServiceImpl
>> To: cloudstack-commits@incubator.apache.org
>>
>>
>> Updated Branches:
>>  refs/heads/4.1 2fd8b15d6 -> 7970384f6
>>
>>
>> CLOUDSTACK-786, CLOUDSTACK-1014: Moved usage APIs to cloud-api.
>> Removed ManagementServerExt. Usage API related implementation is added
>> to UsageServiceImpl
>>
>>
>> Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
>> Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/7970384f
>> Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/7970384f
>> Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/7970384f
>>
>> Branch: refs/heads/4.1
>> Commit: 7970384f6e429b5c97f6d6e80f59cbab6ce90ede
>> Parents: 2fd8b15
>> Author: Kishan Kavala <ki...@cloud.com>
>> Authored: Tue Feb 5 16:43:18 2013 +0530
>> Committer: Kishan Kavala <ki...@cloud.com>
>> Committed: Tue Feb 5 16:43:40 2013 +0530
>>
>> ----------------------------------------------------------------------
>> api/src/com/cloud/dao/EntityManager.java           |   10 +
>> api/src/com/cloud/network/NetworkUsageService.java |   37 ++
>> api/src/org/apache/cloudstack/api/BaseCmd.java     |    4 +
>> .../apache/cloudstack/api/ResponseGenerator.java   |    7 +
>> .../command/admin/usage/AddTrafficMonitorCmd.java  |  107 +++++
>> .../admin/usage/DeleteTrafficMonitorCmd.java       |   84 ++++
>> .../admin/usage/GenerateUsageRecordsCmd.java       |   89 ++++
>> .../command/admin/usage/GetUsageRecordsCmd.java    |  126 +++++
>> .../admin/usage/ListTrafficMonitorsCmd.java        |   84 ++++
>> .../api/command/admin/usage/ListUsageTypesCmd.java |   51 ++
>> api/src/org/apache/cloudstack/usage/Usage.java     |   69 +++
>> .../org/apache/cloudstack/usage/UsageService.java  |   64 +++
>> .../org/apache/cloudstack/usage/UsageTypes.java    |   58 +++
>> client/tomcatconf/componentContext.xml.in          |    2 +-
>> .../server/ManagementServerSimulatorImpl.java      |    2 +-
>> .../dns-notifier/resources/components-example.xml  |    2 +-
>> server/src/com/cloud/api/ApiDBUtils.java           |   14 +-
>> server/src/com/cloud/api/ApiResponseHelper.java    |  253 ++++++++++
>> .../cloud/api/commands/AddTrafficMonitorCmd.java   |  109 -----
>> .../api/commands/DeleteTrafficMonitorCmd.java      |   86 ----
>> .../api/commands/GenerateUsageRecordsCmd.java      |   91 ----
>> .../com/cloud/api/commands/GetUsageRecordsCmd.java |  370 ---------------
>> .../cloud/api/commands/ListTrafficMonitorsCmd.java |   86 ----
>> .../com/cloud/api/commands/ListUsageTypesCmd.java  |   53 --
>> server/src/com/cloud/dao/EntityManagerImpl.java    |    7 +-
>> .../src/com/cloud/network/NetworkUsageManager.java |   14 -
>> .../com/cloud/network/NetworkUsageManagerImpl.java |   20 +-
>> .../src/com/cloud/server/ManagementServerExt.java  |   63 ---
>> .../com/cloud/server/ManagementServerExtImpl.java  |  254 ----------
>> server/src/com/cloud/usage/UsageServiceImpl.java   |  261 ++++++++++
>> server/src/com/cloud/usage/UsageTypes.java         |   58 ---
>> server/src/com/cloud/usage/UsageVO.java            |   23 +-
>> usage/src/com/cloud/usage/UsageManagerImpl.java    |    1 +
>> .../cloud/usage/parser/IPAddressUsageParser.java   |    2 +-
>> .../usage/parser/LoadBalancerUsageParser.java      |    2 +-
>> .../usage/parser/NetworkOfferingUsageParser.java   |    2 +-
>> .../com/cloud/usage/parser/NetworkUsageParser.java |    2 +-
>> .../usage/parser/PortForwardingUsageParser.java    |    2 +-
>> .../usage/parser/SecurityGroupUsageParser.java     |    2 +-
>> .../com/cloud/usage/parser/StorageUsageParser.java |    2 +-
>> .../cloud/usage/parser/VMInstanceUsageParser.java  |    2 +-
>> .../com/cloud/usage/parser/VPNUserUsageParser.java |    2 +-
>> .../com/cloud/usage/parser/VolumeUsageParser.java  |    2 +-
>> 43 files changed, 1358 insertions(+), 1221 deletions(-)
>> ----------------------------------------------------------------------
>>
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/com/cloud/dao/EntityManager.java
>> ----------------------------------------------------------------------
>> diff --git a/api/src/com/cloud/dao/EntityManager.java
>> b/api/src/com/cloud/dao/EntityManager.java
>> index b8fdaa7..8e6a438 100644
>> --- a/api/src/com/cloud/dao/EntityManager.java
>> +++ b/api/src/com/cloud/dao/EntityManager.java
>> @@ -39,6 +39,16 @@ public interface EntityManager {
>>     public <T, K extends Serializable> T findById(Class<T> entityType, K id);
>>
>>     /**
>> +     * Finds an entity by its id including removed.
>> +     * @param <T> class of the entity you're trying to find.
>> +     * @param <K> class of the id that the entity uses.
>> +     * @param entityType Type of the entity.
>> +     * @param id id value
>> +     * @return T if found; null if not.
>> +     */
>> +    public <T, K extends Serializable> T
>> findByIdIncludingRemoved(Class<T> entityType, K id);
>> +
>> +    /**
>>      * Finds a unique entity by uuid string
>>      * @param <T> entity class
>>      * @param entityType type of entity you're looking for.
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/com/cloud/network/NetworkUsageService.java
>> ----------------------------------------------------------------------
>> diff --git a/api/src/com/cloud/network/NetworkUsageService.java
>> b/api/src/com/cloud/network/NetworkUsageService.java
>> new file mode 100644
>> index 0000000..1cfea24
>> --- /dev/null
>> +++ b/api/src/com/cloud/network/NetworkUsageService.java
>> @@ -0,0 +1,37 @@
>> +// 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 com.cloud.network;
>> +
>> +import java.util.List;
>> +
>> +import com.cloud.host.Host;
>> +
>> +import org.apache.cloudstack.api.command.admin.usage.AddTrafficMonitorCmd;
>> +import org.apache.cloudstack.api.command.admin.usage.DeleteTrafficMonitorCmd;
>> +import org.apache.cloudstack.api.command.admin.usage.ListTrafficMonitorsCmd;
>> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
>> +import com.cloud.utils.component.Manager;
>> +
>> +public interface NetworkUsageService extends Manager {
>> +
>> +    Host addTrafficMonitor(AddTrafficMonitorCmd cmd);
>> +
>> +    boolean deleteTrafficMonitor(DeleteTrafficMonitorCmd cmd);
>> +
>> +    List<? extends Host> listTrafficMonitors(ListTrafficMonitorsCmd cmd);
>> +
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/BaseCmd.java
>> ----------------------------------------------------------------------
>> diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java
>> b/api/src/org/apache/cloudstack/api/BaseCmd.java
>> index d8e2bff..a9ac489 100644
>> --- a/api/src/org/apache/cloudstack/api/BaseCmd.java
>> +++ b/api/src/org/apache/cloudstack/api/BaseCmd.java
>> @@ -29,6 +29,7 @@ import javax.inject.Inject;
>>
>> import org.apache.cloudstack.query.QueryService;
>> import org.apache.cloudstack.region.RegionService;
>> +import org.apache.cloudstack.usage.UsageService;
>> import org.apache.log4j.Logger;
>>
>> import com.cloud.configuration.ConfigurationService;
>> @@ -43,6 +44,7 @@ import com.cloud.exception.PermissionDeniedException;
>> import com.cloud.exception.ResourceAllocationException;
>> import com.cloud.exception.ResourceUnavailableException;
>> import com.cloud.network.NetworkService;
>> +import com.cloud.network.NetworkUsageService;
>> import com.cloud.network.StorageNetworkService;
>> import com.cloud.network.VpcVirtualNetworkApplianceService;
>> import com.cloud.network.as.AutoScaleService;
>> @@ -124,6 +126,8 @@ public abstract class BaseCmd {
>>     @Inject public Site2SiteVpnService _s2sVpnService;
>>
>>     @Inject public QueryService _queryService;
>> +    @Inject public UsageService _usageService;
>> +    @Inject public NetworkUsageService _networkUsageService;
>>
>>     public abstract void execute() throws
>> ResourceUnavailableException, InsufficientCapacityException,
>> ServerApiException, ConcurrentOperationException,
>> ResourceAllocationException, NetworkRuleConflictException;
>>
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/ResponseGenerator.java
>> ----------------------------------------------------------------------
>> diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java
>> b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
>> index b95f182..0dc85de 100644
>> --- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java
>> +++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
>> @@ -83,7 +83,9 @@ import
>> org.apache.cloudstack.api.response.SystemVmInstanceResponse;
>> import org.apache.cloudstack.api.response.SystemVmResponse;
>> import org.apache.cloudstack.api.response.TemplatePermissionsResponse;
>> import org.apache.cloudstack.api.response.TemplateResponse;
>> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
>> import org.apache.cloudstack.api.response.TrafficTypeResponse;
>> +import org.apache.cloudstack.api.response.UsageRecordResponse;
>> import org.apache.cloudstack.api.response.UserResponse;
>> import org.apache.cloudstack.api.response.UserVmResponse;
>> import org.apache.cloudstack.api.response.VirtualRouterProviderResponse;
>> @@ -94,6 +96,7 @@ import org.apache.cloudstack.api.response.VpcResponse;
>> import org.apache.cloudstack.api.response.VpnUsersResponse;
>> import org.apache.cloudstack.api.response.ZoneResponse;
>> import org.apache.cloudstack.region.Region;
>> +import org.apache.cloudstack.usage.Usage;
>>
>> import com.cloud.async.AsyncJob;
>> import com.cloud.capacity.Capacity;
>> @@ -375,4 +378,8 @@ public interface ResponseGenerator {
>>     GuestOSResponse createGuestOSResponse(GuestOS os);
>>
>>     SnapshotScheduleResponse
>> createSnapshotScheduleResponse(SnapshotSchedule sched);
>> +
>> +    UsageRecordResponse createUsageResponse(Usage usageRecord);
>> +
>> +       TrafficMonitorResponse createTrafficMonitorResponse(Host
>> trafficMonitor);
>> }
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMonitorCmd.java
>> ----------------------------------------------------------------------
>> diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMonitorCmd.java
>> b/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMonitorCmd.java
>> new file mode 100644
>> index 0000000..48424fe
>> --- /dev/null
>> +++ b/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMonitorCmd.java
>> @@ -0,0 +1,107 @@
>> +// 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.apache.cloudstack.api.command.admin.usage;
>> +
>> +import javax.inject.Inject;
>> +
>> +import org.apache.cloudstack.api.APICommand;
>> +import org.apache.cloudstack.api.ApiConstants;
>> +import org.apache.cloudstack.api.ApiErrorCode;
>> +import org.apache.cloudstack.api.BaseCmd;
>> +import org.apache.cloudstack.api.Parameter;
>> +import org.apache.cloudstack.api.ServerApiException;
>> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
>> +import org.apache.cloudstack.api.response.ZoneResponse;
>> +import org.apache.log4j.Logger;
>> +
>> +import com.cloud.exception.InvalidParameterValueException;
>> +import com.cloud.host.Host;
>> +import com.cloud.user.Account;
>> +import com.cloud.utils.exception.CloudRuntimeException;
>> +
>> +@APICommand(name = "addTrafficMonitor", description="Adds Traffic
>> Monitor Host for Direct Network Usage", responseObject =
>> TrafficMonitorResponse.class)
>> +public class AddTrafficMonitorCmd extends BaseCmd {
>> +    public static final Logger s_logger =
>> Logger.getLogger(AddTrafficMonitorCmd.class.getName());
>> +    private static final String s_name = "addtrafficmonitorresponse";
>> +
>> +    /////////////////////////////////////////////////////
>> +    //////////////// API parameters /////////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID,
>> entityType = ZoneResponse.class,
>> +            required = true, description="Zone in which to add the
>> external firewall appliance.")
>> +    private Long zoneId;
>> +
>> +    @Parameter(name=ApiConstants.URL, type=CommandType.STRING,
>> required = true, description="URL of the traffic monitor Host")
>> +    private String url;
>> +
>> +    @Parameter(name=ApiConstants.INCL_ZONES, type=CommandType.STRING,
>> description="Traffic going into the listed zones will be metered")
>> +    private String inclZones;
>> +
>> +    @Parameter(name=ApiConstants.EXCL_ZONES, type=CommandType.STRING,
>> description="Traffic going into the listed zones will not be metered")
>> +    private String exclZones;
>> +
>> +    ///////////////////////////////////////////////////
>> +    /////////////////// Accessors ///////////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    public String getInclZones() {
>> +        return inclZones;
>> +    }
>> +
>> +    public String getExclZones() {
>> +        return exclZones;
>> +    }
>> +
>> +    public Long getZoneId() {
>> +        return zoneId;
>> +    }
>> +
>> +    public String getUrl() {
>> +        return url;
>> +    }
>> +
>> +    /////////////////////////////////////////////////////
>> +    /////////////// API Implementation///////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    @Override
>> +    public String getCommandName() {
>> +        return s_name;
>> +    }
>> +
>> +    @Override
>> +    public long getEntityOwnerId() {
>> +        return Account.ACCOUNT_ID_SYSTEM;
>> +    }
>> +
>> +    @Override
>> +    public void execute(){
>> +        try {
>> +            Host trafficMonitor = _networkUsageService.addTrafficMonitor(this);
>> +            TrafficMonitorResponse response =
>> _responseGenerator.createTrafficMonitorResponse(trafficMonitor);
>> +            response.setObjectName("trafficmonitor");
>> +            response.setResponseName(getCommandName());
>> +            this.setResponseObject(response);
>> +        } catch (InvalidParameterValueException ipve) {
>> +                       throw new
>> ServerApiException(ApiErrorCode.PARAM_ERROR, ipve.getMessage());
>> +        } catch (CloudRuntimeException cre) {
>> +                       throw new
>> ServerApiException(ApiErrorCode.INTERNAL_ERROR, cre.getMessage());
>> +        }
>> +    }
>> +}
>> +
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficMonitorCmd.java
>> ----------------------------------------------------------------------
>> diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficMonitorCmd.java
>> b/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficMonitorCmd.java
>> new file mode 100644
>> index 0000000..e3bb299
>> --- /dev/null
>> +++ b/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficMonitorCmd.java
>> @@ -0,0 +1,84 @@
>> +// 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.apache.cloudstack.api.command.admin.usage;
>> +
>> +import javax.inject.Inject;
>> +
>> +import org.apache.cloudstack.api.APICommand;
>> +import org.apache.cloudstack.api.ApiConstants;
>> +import org.apache.cloudstack.api.ApiErrorCode;
>> +import org.apache.cloudstack.api.BaseCmd;
>> +import org.apache.cloudstack.api.Parameter;
>> +import org.apache.cloudstack.api.ServerApiException;
>> +import org.apache.cloudstack.api.response.HostResponse;
>> +import org.apache.cloudstack.api.response.SuccessResponse;
>> +import org.apache.log4j.Logger;
>> +
>> +import com.cloud.exception.InvalidParameterValueException;
>> +import com.cloud.user.Account;
>> +
>> +@APICommand(name = "deleteTrafficMonitor", description="Deletes an
>> traffic monitor host.", responseObject = SuccessResponse.class)
>> +public class DeleteTrafficMonitorCmd extends BaseCmd {
>> +    public static final Logger s_logger =
>> Logger.getLogger(DeleteTrafficMonitorCmd.class.getName());
>> +    private static final String s_name = "deletetrafficmonitorresponse";
>> +
>> +    /////////////////////////////////////////////////////
>> +    //////////////// API parameters /////////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    @Parameter(name=ApiConstants.ID, type=CommandType.UUID,
>> entityType = HostResponse.class,
>> +            required = true, description="Id of the Traffic Monitor Host.")
>> +    private Long id;
>> +
>> +    ///////////////////////////////////////////////////
>> +    /////////////////// Accessors ///////////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    public Long getId() {
>> +        return id;
>> +    }
>> +
>> +    /////////////////////////////////////////////////////
>> +    /////////////// API Implementation///////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    @Override
>> +    public String getCommandName() {
>> +        return s_name;
>> +    }
>> +
>> +    @Override
>> +    public long getEntityOwnerId() {
>> +        return Account.ACCOUNT_ID_SYSTEM;
>> +    }
>> +
>> +    @Override
>> +    public void execute(){
>> +        try {
>> +            boolean result = _networkUsageService.deleteTrafficMonitor(this);
>> +            if (result) {
>> +                SuccessResponse response = new
>> SuccessResponse(getCommandName());
>> +                response.setResponseName(getCommandName());
>> +                this.setResponseObject(response);
>> +            } else {
>> +                               throw new
>> ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete
>> traffic monitor.");
>> +            }
>> +        } catch (InvalidParameterValueException e) {
>> +                       throw new
>> ServerApiException(ApiErrorCode.PARAM_ERROR, "Failed to delete traffic
>> monitor.");
>> +        }
>> +    }
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsageRecordsCmd.java
>> ----------------------------------------------------------------------
>> diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsageRecordsCmd.java
>> b/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsageRecordsCmd.java
>> new file mode 100644
>> index 0000000..13710f9
>> --- /dev/null
>> +++ b/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsageRecordsCmd.java
>> @@ -0,0 +1,89 @@
>> +// 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.apache.cloudstack.api.command.admin.usage;
>> +
>> +import java.util.Date;
>> +
>> +import org.apache.cloudstack.api.*;
>> +import org.apache.cloudstack.api.response.DomainResponse;
>> +import org.apache.log4j.Logger;
>> +
>> +import org.apache.cloudstack.api.APICommand;
>> +import org.apache.cloudstack.api.response.SuccessResponse;
>> +import com.cloud.user.Account;
>> +
>> +@APICommand(name = "generateUsageRecords", description="Generates
>> usage records. This will generate records only if there any records to
>> be generated, i.e if the scheduled usage job was not run or failed",
>> responseObject=SuccessResponse.class)
>> +public class GenerateUsageRecordsCmd extends BaseCmd {
>> +    public static final Logger s_logger =
>> Logger.getLogger(GenerateUsageRecordsCmd.class.getName());
>> +
>> +    private static final String s_name = "generateusagerecordsresponse";
>> +
>> +    /////////////////////////////////////////////////////
>> +    //////////////// API parameters /////////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.UUID,
>> entityType = DomainResponse.class,
>> +            description="List events for the specified domain.")
>> +    private Long domainId;
>> +
>> +    @Parameter(name=ApiConstants.END_DATE, type=CommandType.DATE,
>> required=true, description="End date range for usage record query. Use
>> yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.")
>> +    private Date endDate;
>> +
>> +    @Parameter(name=ApiConstants.START_DATE, type=CommandType.DATE,
>> required=true, description="Start date range for usage record query.
>> Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.")
>> +    private Date startDate;
>> +
>> +    /////////////////////////////////////////////////////
>> +    /////////////////// Accessors ///////////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    public Long getDomainId() {
>> +        return domainId;
>> +    }
>> +
>> +    public Date getEndDate() {
>> +        return endDate;
>> +    }
>> +
>> +    public Date getStartDate() {
>> +        return startDate;
>> +    }
>> +
>> +    /////////////////////////////////////////////////////
>> +    /////////////// API Implementation///////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    @Override
>> +    public String getCommandName() {
>> +        return s_name;
>> +    }
>> +
>> +    @Override
>> +    public long getEntityOwnerId() {
>> +        return Account.ACCOUNT_ID_SYSTEM;
>> +    }
>> +
>> +    @Override
>> +    public void execute(){
>> +        boolean result = _usageService.generateUsageRecords(this);
>> +        if (result) {
>> +            SuccessResponse response = new SuccessResponse(getCommandName());
>> +            this.setResponseObject(response);
>> +        } else {
>> +            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
>> "Failed to generate usage records");
>> +        }
>> +    }
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
>> ----------------------------------------------------------------------
>> diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
>> b/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
>> new file mode 100644
>> index 0000000..f4960dd
>> --- /dev/null
>> +++ b/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
>> @@ -0,0 +1,126 @@
>> +// 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.apache.cloudstack.api.command.admin.usage;
>> +
>> +import java.util.ArrayList;
>> +import java.util.Date;
>> +import java.util.List;
>> +import java.util.TimeZone;
>> +
>> +import org.apache.cloudstack.api.APICommand;
>> +import org.apache.cloudstack.api.ApiConstants;
>> +import org.apache.cloudstack.api.BaseListCmd;
>> +import org.apache.cloudstack.api.Parameter;
>> +import org.apache.cloudstack.api.response.AccountResponse;
>> +import org.apache.cloudstack.api.response.DomainResponse;
>> +import org.apache.cloudstack.api.response.ListResponse;
>> +import org.apache.cloudstack.api.response.ProjectResponse;
>> +import org.apache.cloudstack.api.response.UsageRecordResponse;
>> +import org.apache.cloudstack.usage.Usage;
>> +import org.apache.log4j.Logger;
>> +
>> +@APICommand(name = "listUsageRecords", description="Lists usage
>> records for accounts", responseObject=UsageRecordResponse.class)
>> +public class GetUsageRecordsCmd extends BaseListCmd {
>> +    public static final Logger s_logger =
>> Logger.getLogger(GetUsageRecordsCmd.class.getName());
>> +
>> +    private static final String s_name = "listusagerecordsresponse";
>> +
>> +    /////////////////////////////////////////////////////
>> +    //////////////// API parameters /////////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    @Parameter(name=ApiConstants.ACCOUNT, type=CommandType.STRING,
>> description="List usage records for the specified user.")
>> +    private String accountName;
>> +
>> +    @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.UUID,
>> entityType = DomainResponse.class,
>> +            description="List usage records for the specified domain.")
>> +    private Long domainId;
>> +
>> +    @Parameter(name=ApiConstants.END_DATE, type=CommandType.DATE,
>> required=true, description="End date range for usage record query. Use
>> yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.")
>> +    private Date endDate;
>> +
>> +    @Parameter(name=ApiConstants.START_DATE, type=CommandType.DATE,
>> required=true, description="Start date range for usage record query.
>> Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.")
>> +    private Date startDate;
>> +
>> +    @Parameter(name=ApiConstants.ACCOUNT_ID, type=CommandType.UUID,
>> entityType = AccountResponse.class,
>> +            description="List usage records for the specified account")
>> +    private Long accountId;
>> +
>> +    @Parameter(name=ApiConstants.PROJECT_ID, type=CommandType.UUID,
>> entityType = ProjectResponse.class,
>> +            description="List usage records for specified project")
>> +    private Long projectId;
>> +
>> +    @Parameter(name=ApiConstants.TYPE, type=CommandType.LONG,
>> description="List usage records for the specified usage type")
>> +    private Long usageType;
>> +
>> +    /////////////////////////////////////////////////////
>> +    /////////////////// Accessors ///////////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    public String getAccountName() {
>> +        return accountName;
>> +    }
>> +
>> +    public Long getDomainId() {
>> +        return domainId;
>> +    }
>> +
>> +    public Date getEndDate() {
>> +        return endDate;
>> +    }
>> +
>> +    public Date getStartDate() {
>> +        return startDate;
>> +    }
>> +
>> +    public Long getAccountId() {
>> +        return accountId;
>> +    }
>> +
>> +    public Long getUsageType() {
>> +        return usageType;
>> +    }
>> +
>> +    public Long getProjectId() {
>> +        return projectId;
>> +    }
>> +
>> +    /////////////////////////////////////////////////////
>> +    /////////////// API Implementation///////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    @Override
>> +    public String getCommandName() {
>> +        return s_name;
>> +    }
>> +
>> +    @Override
>> +    public void execute(){
>> +        List<? extends Usage> usageRecords =
>> _usageService.getUsageRecords(this);
>> +        ListResponse<UsageRecordResponse> response = new
>> ListResponse<UsageRecordResponse>();
>> +        List<UsageRecordResponse> usageResponses = new
>> ArrayList<UsageRecordResponse>();
>> +        for(Usage usageRecord: usageRecords){
>> +               UsageRecordResponse usageResponse =
>> _responseGenerator.createUsageResponse(usageRecord);
>> +               usageResponse.setObjectName("usagerecord");
>> +               usageResponses.add(usageResponse);
>> +        }
>> +
>> +        response.setResponses(usageResponses);
>> +        response.setResponseName(getCommandName());
>> +        this.setResponseObject(response);
>> +    }
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMonitorsCmd.java
>> ----------------------------------------------------------------------
>> diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMonitorsCmd.java
>> b/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMonitorsCmd.java
>> new file mode 100644
>> index 0000000..e8e3b22
>> --- /dev/null
>> +++ b/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMonitorsCmd.java
>> @@ -0,0 +1,84 @@
>> +// 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.apache.cloudstack.api.command.admin.usage;
>> +
>> +import java.util.ArrayList;
>> +import java.util.List;
>> +
>> +import javax.inject.Inject;
>> +
>> +import org.apache.cloudstack.api.APICommand;
>> +import org.apache.cloudstack.api.ApiConstants;
>> +import org.apache.cloudstack.api.BaseListCmd;
>> +import org.apache.cloudstack.api.Parameter;
>> +import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd;
>> +import org.apache.cloudstack.api.response.ListResponse;
>> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
>> +import org.apache.cloudstack.api.response.ZoneResponse;
>> +import org.apache.log4j.Logger;
>> +
>> +import com.cloud.host.Host;
>> +
>> +
>> +@APICommand(name = "listTrafficMonitors", description="List traffic
>> monitor Hosts.", responseObject = TrafficMonitorResponse.class)
>> +public class ListTrafficMonitorsCmd extends BaseListCmd {
>> +    public static final Logger s_logger =
>> Logger.getLogger(ListServiceOfferingsCmd.class.getName());
>> +    private static final String s_name = "listtrafficmonitorsresponse";
>> +
>> +    /////////////////////////////////////////////////////
>> +    //////////////// API parameters /////////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID,
>> entityType = ZoneResponse.class,
>> +            required = true, description="zone Id")
>> +    private long zoneId;
>> +
>> +    /////////////////////////////////////////////////////
>> +    /////////////////// Accessors ///////////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    public long getZoneId() {
>> +        return zoneId;
>> +    }
>> +
>> +    /////////////////////////////////////////////////////
>> +    /////////////// API Implementation///////////////////
>> +    /////////////////////////////////////////////////////
>> +
>> +    @Override
>> +    public String getCommandName() {
>> +        return s_name;
>> +    }
>> +
>> +    @Override
>> +    public void execute(){
>> +        List<? extends Host> trafficMonitors =
>> _networkUsageService.listTrafficMonitors(this);
>> +
>> +        ListResponse<TrafficMonitorResponse> listResponse = new
>> ListResponse<TrafficMonitorResponse>();
>> +        List<TrafficMonitorResponse> responses = new
>> ArrayList<TrafficMonitorResponse>();
>> +        for (Host trafficMonitor : trafficMonitors) {
>> +            TrafficMonitorResponse response =
>> _responseGenerator.createTrafficMonitorResponse(trafficMonitor);
>> +            response.setObjectName("trafficmonitor");
>> +            response.setResponseName(getCommandName());
>> +            responses.add(response);
>> +        }
>> +
>> +        listResponse.setResponses(responses);
>> +        listResponse.setResponseName(getCommandName());
>> +        this.setResponseObject(listResponse);
>> +    }
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTypesCmd.java
>> ----------------------------------------------------------------------
>> diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTypesCmd.java
>> b/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTypesCmd.java
>> new file mode 100644
>> index 0000000..bc02911
>> --- /dev/null
>> +++ b/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTypesCmd.java
>> @@ -0,0 +1,51 @@
>> +// 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.apache.cloudstack.api.command.admin.usage;
>> +
>> +import java.util.List;
>> +
>> +import org.apache.cloudstack.api.APICommand;
>> +import org.apache.log4j.Logger;
>> +
>> +import org.apache.cloudstack.api.BaseCmd;
>> +import org.apache.cloudstack.api.response.ListResponse;
>> +import org.apache.cloudstack.api.response.UsageTypeResponse;
>> +import com.cloud.user.Account;
>> +
>> +@APICommand(name = "listUsageTypes", description = "List Usage
>> Types", responseObject = UsageTypeResponse.class)
>> +public class ListUsageTypesCmd extends BaseCmd {
>> +    public static final Logger s_logger =
>> Logger.getLogger(ListUsageTypesCmd.class.getName());
>> +    private static final String s_name = "listusagetypesresponse";
>> +
>> +    @Override
>> +    public String getCommandName() {
>> +        return s_name;
>> +    }
>> +
>> +    public long getEntityOwnerId() {
>> +        return Account.ACCOUNT_ID_SYSTEM;
>> +    }
>> +
>> +    @Override
>> +    public void execute() {
>> +        List<UsageTypeResponse> result = _usageService.listUsageTypes();
>> +        ListResponse<UsageTypeResponse> response = new
>> ListResponse<UsageTypeResponse>();
>> +        response.setResponses(result);
>> +        response.setResponseName(getCommandName());
>> +        this.setResponseObject(response);
>> +    }
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/usage/Usage.java
>> ----------------------------------------------------------------------
>> diff --git a/api/src/org/apache/cloudstack/usage/Usage.java
>> b/api/src/org/apache/cloudstack/usage/Usage.java
>> new file mode 100644
>> index 0000000..c74d3b7
>> --- /dev/null
>> +++ b/api/src/org/apache/cloudstack/usage/Usage.java
>> @@ -0,0 +1,69 @@
>> +// 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.apache.cloudstack.usage;
>> +
>> +import org.apache.cloudstack.api.InternalIdentity;
>> +
>> +import java.util.Date;
>> +
>> +import javax.persistence.Column;
>> +import javax.persistence.Entity;
>> +import javax.persistence.GeneratedValue;
>> +import javax.persistence.GenerationType;
>> +import javax.persistence.Id;
>> +import javax.persistence.Table;
>> +import javax.persistence.Temporal;
>> +import javax.persistence.TemporalType;
>> +
>> +public interface Usage {
>> +
>> +       public long getId();
>> +
>> +       public Long getZoneId();
>> +
>> +       public Long getAccountId();
>> +
>> +    public Long getDomainId();
>> +
>> +       public String getDescription();
>> +
>> +       public String getUsageDisplay();
>> +
>> +       public int getUsageType();
>> +
>> +    public Double getRawUsage();
>> +
>> +    public Long getVmInstanceId();
>> +
>> +    public String getVmName();
>> +
>> +    public Long getOfferingId();
>> +
>> +    public Long getTemplateId();
>> +
>> +    public Long getUsageId();
>> +
>> +    public String getType();
>> +
>> +    public Long getNetworkId();
>> +
>> +    public Long getSize();
>> +
>> +       public Date getStartDate();
>> +
>> +       public Date getEndDate();
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/usage/UsageService.java
>> ----------------------------------------------------------------------
>> diff --git a/api/src/org/apache/cloudstack/usage/UsageService.java
>> b/api/src/org/apache/cloudstack/usage/UsageService.java
>> new file mode 100755
>> index 0000000..3838225
>> --- /dev/null
>> +++ b/api/src/org/apache/cloudstack/usage/UsageService.java
>> @@ -0,0 +1,64 @@
>> +// 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.apache.cloudstack.usage;
>> +
>> +import java.util.List;
>> +import java.util.TimeZone;
>> +
>> +import org.apache.cloudstack.api.command.admin.usage.GenerateUsageRecordsCmd;
>> +import org.apache.cloudstack.api.command.admin.usage.GetUsageRecordsCmd;
>> +import org.apache.cloudstack.api.response.UsageTypeResponse;
>> +
>> +public interface UsageService {
>> +    /**
>> +     * Generate Billing Records from the last time it was generated to the
>> +     * time specified.
>> +     *
>> +     * @param cmd the command wrapping the generate parameters
>> +     *   - userId unique id of the user, pass in -1 to generate billing records
>> +     *            for all users
>> +     *   - startDate
>> +     *   - endDate inclusive.  If date specified is greater than the
>> current time, the
>> +     *             system will use the current time.
>> +     */
>> +    boolean generateUsageRecords(GenerateUsageRecordsCmd cmd);
>> +
>> +    /**
>> +     * Retrieves all Usage Records generated between the start and
>> end date specified
>> +     *
>> +     * @param userId unique id of the user, pass in -1 to retrieve
>> billing records
>> +     *        for all users
>> +     * @param startDate inclusive.
>> +     * @param endDate inclusive.  If date specified is greater than
>> the current time, the
>> +     *                system will use the current time.
>> +     * @param page The page of usage records to see (500 results are
>> returned at a time, if
>> +     *             more than 500 records exist then additional
>> results can be retrieved by
>> +     *             the appropriate page number)
>> +     * @return a list of usage records
>> +     */
>> +    List<? extends Usage> getUsageRecords(GetUsageRecordsCmd cmd);
>> +
>> +    /**
>> +     * Retrieves the timezone used for usage aggregation.  One day is
>> represented as midnight to 11:59:59pm
>> +     * in the given time zone
>> +     * @return the timezone specified by the config value
>> usage.aggregation.timezone, or GMT if null
>> +     */
>> +    TimeZone getUsageTimezone();
>> +
>> +       List<UsageTypeResponse> listUsageTypes();
>> +
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/usage/UsageTypes.java
>> ----------------------------------------------------------------------
>> diff --git a/api/src/org/apache/cloudstack/usage/UsageTypes.java
>> b/api/src/org/apache/cloudstack/usage/UsageTypes.java
>> new file mode 100644
>> index 0000000..2baa1d2
>> --- /dev/null
>> +++ b/api/src/org/apache/cloudstack/usage/UsageTypes.java
>> @@ -0,0 +1,58 @@
>> +// 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.apache.cloudstack.usage;
>> +
>> +import java.util.ArrayList;
>> +import java.util.List;
>> +
>> +import org.apache.cloudstack.api.response.UsageTypeResponse;
>> +
>> +public class UsageTypes {
>> +    public static final int RUNNING_VM = 1;
>> +    public static final int ALLOCATED_VM = 2; // used for tracking
>> how long storage has been allocated for a VM
>> +    public static final int IP_ADDRESS = 3;
>> +    public static final int NETWORK_BYTES_SENT = 4;
>> +    public static final int NETWORK_BYTES_RECEIVED = 5;
>> +    public static final int VOLUME = 6;
>> +    public static final int TEMPLATE = 7;
>> +    public static final int ISO = 8;
>> +    public static final int SNAPSHOT = 9;
>> +    public static final int SECURITY_GROUP = 10;
>> +    public static final int LOAD_BALANCER_POLICY = 11;
>> +    public static final int PORT_FORWARDING_RULE = 12;
>> +    public static final int NETWORK_OFFERING = 13;
>> +    public static final int VPN_USERS = 14;
>> +
>> +    public static List<UsageTypeResponse> listUsageTypes(){
>> +       List<UsageTypeResponse> responseList = new
>> ArrayList<UsageTypeResponse>();
>> +       responseList.add(new UsageTypeResponse(RUNNING_VM, "Running Vm Usage"));
>> +       responseList.add(new UsageTypeResponse(ALLOCATED_VM,
>> "Allocated Vm Usage"));
>> +       responseList.add(new UsageTypeResponse(IP_ADDRESS, "IP Address Usage"));
>> +       responseList.add(new UsageTypeResponse(NETWORK_BYTES_SENT,
>> "Network Usage (Bytes Sent)"));
>> +       responseList.add(new UsageTypeResponse(NETWORK_BYTES_RECEIVED,
>> "Network Usage (Bytes Received)"));
>> +       responseList.add(new UsageTypeResponse(VOLUME, "Volume Usage"));
>> +       responseList.add(new UsageTypeResponse(TEMPLATE, "Template Usage"));
>> +       responseList.add(new UsageTypeResponse(ISO, "ISO Usage"));
>> +       responseList.add(new UsageTypeResponse(SNAPSHOT, "Snapshot Usage"));
>> +       responseList.add(new UsageTypeResponse(SECURITY_GROUP,
>> "Security Group Usage"));
>> +       responseList.add(new UsageTypeResponse(LOAD_BALANCER_POLICY,
>> "Load Balancer Usage"));
>> +       responseList.add(new UsageTypeResponse(PORT_FORWARDING_RULE,
>> "Port Forwarding Usage"));
>> +       responseList.add(new UsageTypeResponse(NETWORK_OFFERING,
>> "Network Offering Usage"));
>> +       responseList.add(new UsageTypeResponse(VPN_USERS, "VPN users usage"));
>> +       return responseList;
>> +    }
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/client/tomcatconf/componentContext.xml.in
>> ----------------------------------------------------------------------
>> diff --git a/client/tomcatconf/componentContext.xml.in
>> b/client/tomcatconf/componentContext.xml.in
>> index e3bf982..065188c 100644
>> --- a/client/tomcatconf/componentContext.xml.in
>> +++ b/client/tomcatconf/componentContext.xml.in
>> @@ -36,7 +36,7 @@
>>   -->
>>   <bean id="databaseUpgradeChecker"
>> class="com.cloud.upgrade.DatabaseUpgradeChecker" />
>>
>> -  <bean id="management-server" class
>> ="com.cloud.server.ManagementServerExtImpl" />
>> +  <bean id="management-server" class
>> ="com.cloud.server.ManagementServerImpl" />
>>   <bean id="configuration-server"
>> class="com.cloud.server.ConfigurationServerImpl" />
>>
>>   <bean id="clusterManagerImpl" class="com.cloud.cluster.ClusterManagerImpl" />
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
>> ----------------------------------------------------------------------
>> diff --git a/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
>> b/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
>> index db4b619..728271c 100644
>> --- a/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
>> +++ b/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
>> @@ -21,7 +21,7 @@ import java.util.List;
>>
>> import com.cloud.api.commands.ConfigureSimulator;
>>
>> -public class ManagementServerSimulatorImpl extends ManagementServerExtImpl {
>> +public class ManagementServerSimulatorImpl extends ManagementServerImpl {
>>     @Override
>>     public List<Class<?>> getCommands() {
>>         List<Class<?>> cmdList = super.getCommands();
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/plugins/network-elements/dns-notifier/resources/components-example.xml
>> ----------------------------------------------------------------------
>> diff --git a/plugins/network-elements/dns-notifier/resources/components-example.xml
>> b/plugins/network-elements/dns-notifier/resources/components-example.xml
>> index 412da0e..36441bd 100755
>> --- a/plugins/network-elements/dns-notifier/resources/components-example.xml
>> +++ b/plugins/network-elements/dns-notifier/resources/components-example.xml
>> @@ -29,7 +29,7 @@ under the License.
>>     </system-integrity-checker>
>>
>>     <interceptor library="com.cloud.configuration.DefaultInterceptorLibrary"/>
>> -    <management-server
>> class="com.cloud.server.ManagementServerExtImpl"
>> library="com.cloud.configuration.PremiumComponentLibrary">
>> +    <management-server class="com.cloud.server.ManagementServerImpl"
>> library="com.cloud.configuration.PremiumComponentLibrary">
>>         <dao name="Configuration configuration server"
>> class="com.cloud.configuration.dao.ConfigurationDaoImpl">
>>              <param name="premium">true</param>
>>         </dao>
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/ApiDBUtils.java
>> ----------------------------------------------------------------------
>> diff --git a/server/src/com/cloud/api/ApiDBUtils.java
>> b/server/src/com/cloud/api/ApiDBUtils.java
>> index 8e950ab..83132c6 100755
>> --- a/server/src/com/cloud/api/ApiDBUtils.java
>> +++ b/server/src/com/cloud/api/ApiDBUtils.java
>> @@ -83,8 +83,6 @@ import com.cloud.api.query.vo.StoragePoolJoinVO;
>> import com.cloud.api.query.vo.UserAccountJoinVO;
>> import com.cloud.api.query.vo.UserVmJoinVO;
>> import com.cloud.api.query.vo.VolumeJoinVO;
>> -import com.cloud.api.query.dao.*;
>> -import com.cloud.api.query.vo.*;
>> import com.cloud.async.AsyncJob;
>> import com.cloud.async.AsyncJobManager;
>> import com.cloud.async.AsyncJobVO;
>> @@ -108,6 +106,7 @@ import com.cloud.host.Host;
>> import com.cloud.host.HostStats;
>> import com.cloud.host.HostVO;
>> import com.cloud.host.dao.HostDao;
>> +import com.cloud.host.dao.HostDetailsDao;
>> import com.cloud.hypervisor.Hypervisor.HypervisorType;
>> import com.cloud.network.IpAddress;
>> import com.cloud.network.Network;
>> @@ -156,10 +155,6 @@ import com.cloud.network.dao.Site2SiteCustomerGatewayDao;
>> import com.cloud.network.dao.Site2SiteCustomerGatewayVO;
>> import com.cloud.network.dao.Site2SiteVpnGatewayDao;
>> import com.cloud.network.dao.Site2SiteVpnGatewayVO;
>> -import com.cloud.network.*;
>> -import com.cloud.network.as.*;
>> -import com.cloud.network.as.dao.*;
>> -import com.cloud.network.dao.*;
>> import com.cloud.network.router.VirtualRouter;
>> import com.cloud.network.rules.FirewallRuleVO;
>> import com.cloud.network.security.SecurityGroup;
>> @@ -313,6 +308,7 @@ public class ApiDBUtils {
>>     static VpcOfferingDao _vpcOfferingDao;
>>     static SnapshotPolicyDao _snapshotPolicyDao;
>>     static AsyncJobDao _asyncJobDao;
>> +    static HostDetailsDao _hostDetailsDao;
>>
>>     @Inject private ManagementServer ms;
>>     @Inject public AsyncJobManager asyncMgr;
>> @@ -410,6 +406,7 @@ public class ApiDBUtils {
>>     @Inject private VpcOfferingDao vpcOfferingDao;
>>     @Inject private SnapshotPolicyDao snapshotPolicyDao;
>>     @Inject private AsyncJobDao asyncJobDao;
>> +    @Inject private HostDetailsDao hostDetailsDao;
>>
>>     @PostConstruct
>>     void init() {
>> @@ -507,6 +504,7 @@ public class ApiDBUtils {
>>         _vpcOfferingDao = vpcOfferingDao;
>>         _snapshotPolicyDao = snapshotPolicyDao;
>>         _asyncJobDao = asyncJobDao;
>> +        _hostDetailsDao = hostDetailsDao;
>>
>>         // Note: stats collector should already have been initialized
>> by this time, otherwise a null instance is returned
>>         _statsCollector = StatsCollector.getInstance();
>> @@ -1493,4 +1491,8 @@ public class ApiDBUtils {
>>    public static DataCenterJoinVO newDataCenterView(DataCenter dc){
>>        return _dcJoinDao.newDataCenterView(dc);
>>    }
>> +
>> +   public static Map<String, String> findHostDetailsById(long hostId){
>> +          return _hostDetailsDao.findDetails(hostId);
>> +   }
>> }
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/ApiResponseHelper.java
>> ----------------------------------------------------------------------
>> diff --git a/server/src/com/cloud/api/ApiResponseHelper.java
>> b/server/src/com/cloud/api/ApiResponseHelper.java
>> index 411de94..8c97615 100755
>> --- a/server/src/com/cloud/api/ApiResponseHelper.java
>> +++ b/server/src/com/cloud/api/ApiResponseHelper.java
>> @@ -81,7 +81,9 @@ import
>> org.apache.cloudstack.api.response.SystemVmInstanceResponse;
>> import org.apache.cloudstack.api.response.SystemVmResponse;
>> import org.apache.cloudstack.api.response.TemplatePermissionsResponse;
>> import org.apache.cloudstack.api.response.TemplateResponse;
>> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
>> import org.apache.cloudstack.api.response.TrafficTypeResponse;
>> +import org.apache.cloudstack.api.response.UsageRecordResponse;
>> import org.apache.cloudstack.api.response.UserResponse;
>> import org.apache.cloudstack.api.response.UserVmResponse;
>> import org.apache.cloudstack.api.response.VirtualRouterProviderResponse;
>> @@ -103,6 +105,7 @@ import com.cloud.configuration.Configuration;
>> import com.cloud.configuration.Resource.ResourceOwnerType;
>> import com.cloud.configuration.ResourceCount;
>> import com.cloud.configuration.ResourceLimit;
>> +import com.cloud.dao.EntityManager;
>> import com.cloud.dc.*;
>> import com.cloud.dc.Vlan.VlanType;
>> import com.cloud.domain.Domain;
>> @@ -139,6 +142,7 @@ import com.cloud.network.dao.PhysicalNetworkVO;
>> import com.cloud.network.router.VirtualRouter;
>> import com.cloud.network.rules.*;
>> import com.cloud.network.security.SecurityGroup;
>> +import com.cloud.network.security.SecurityGroupVO;
>> import com.cloud.network.security.SecurityRule;
>> import com.cloud.network.security.SecurityRule.SecurityRuleType;
>> import com.cloud.network.vpc.PrivateGateway;
>> @@ -148,6 +152,7 @@ import com.cloud.network.vpc.VpcOffering;
>> import com.cloud.offering.DiskOffering;
>> import com.cloud.offering.NetworkOffering;
>> import com.cloud.offering.ServiceOffering;
>> +import com.cloud.offerings.NetworkOfferingVO;
>> import com.cloud.org.Cluster;
>> import com.cloud.projects.Project;
>> import com.cloud.projects.ProjectAccount;
>> @@ -155,6 +160,7 @@ import com.cloud.projects.ProjectInvitation;
>> import com.cloud.server.Criteria;
>> import com.cloud.server.ResourceTag;
>> import com.cloud.server.ResourceTag.TaggedResourceType;
>> +import com.cloud.service.ServiceOfferingVO;
>> import com.cloud.storage.*;
>> import com.cloud.storage.Storage.ImageFormat;
>> import com.cloud.storage.Storage.StoragePoolType;
>> @@ -174,6 +180,7 @@ import com.cloud.utils.net.NetUtils;
>> import com.cloud.vm.ConsoleProxyVO;
>> import com.cloud.vm.InstanceGroup;
>> import com.cloud.vm.NicProfile;
>> +import com.cloud.vm.VMInstanceVO;
>> import com.cloud.vm.VirtualMachine;
>> import com.cloud.vm.VirtualMachine.Type;
>> import org.apache.cloudstack.acl.ControlledEntity;
>> @@ -185,11 +192,16 @@ import org.apache.cloudstack.api.ResponseGenerator;
>> import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd;
>> import org.apache.cloudstack.api.response.*;
>> import org.apache.cloudstack.region.Region;
>> +import org.apache.cloudstack.usage.Usage;
>> +import org.apache.cloudstack.usage.UsageService;
>> +import org.apache.cloudstack.usage.UsageTypes;
>> import org.apache.log4j.Logger;
>>
>> import java.text.DecimalFormat;
>> import java.util.*;
>>
>> +import javax.inject.Inject;
>> +
>> import static java.util.Collections.emptyList;
>> import static java.util.Collections.singletonList;
>>
>> @@ -198,6 +210,8 @@ public class ApiResponseHelper implements
>> ResponseGenerator {
>>
>>     public final Logger s_logger = Logger.getLogger(ApiResponseHelper.class);
>>     private static final DecimalFormat s_percentFormat = new
>> DecimalFormat("##.##");
>> +    @Inject private EntityManager _entityMgr = null;
>> +    @Inject private UsageService _usageSvc = null;
>>
>>     @Override
>>     public UserResponse createUserResponse(User user) {
>> @@ -3118,4 +3132,243 @@ public class ApiResponseHelper implements
>> ResponseGenerator {
>>         return response;
>>     }
>>
>> +
>> +
>> +       @Override
>> +       public UsageRecordResponse createUsageResponse(Usage usageRecord) {
>> +               UsageRecordResponse usageRecResponse = new
>> UsageRecordResponse();
>> +
>> +               Account account =
>> ApiDBUtils.findAccountByIdIncludingRemoved(usageRecord.getAccountId());
>> +               if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) {
>> +                       //find the project
>> +                       Project project =
>> ApiDBUtils.findProjectByProjectAccountIdIncludingRemoved(account.getId());
>> +                       usageRecResponse.setProjectId(project.getUuid());
>> +                       usageRecResponse.setProjectName(project.getName());
>> +               } else {
>> +                       usageRecResponse.setAccountId(account.getUuid());
>> +
>> usageRecResponse.setAccountName(account.getAccountName());
>> +               }
>> +
>> +               Domain domain =
>> ApiDBUtils.findDomainById(usageRecord.getDomainId());
>> +               if (domain != null) {
>> +                       usageRecResponse.setDomainId(domain.getUuid());
>> +               }
>> +
>> +               if (usageRecord.getZoneId() != null) {
>> +                       DataCenter zone =
>> ApiDBUtils.findZoneById(usageRecord.getZoneId());
>> +                       if (zone != null) {
>> +                               usageRecResponse.setZoneId(zone.getUuid());
>> +                       }
>> +               }
>> +               usageRecResponse.setDescription(usageRecord.getDescription());
>> +               usageRecResponse.setUsage(usageRecord.getUsageDisplay());
>> +               usageRecResponse.setUsageType(usageRecord.getUsageType());
>> +               if (usageRecord.getVmInstanceId() != null) {
>> +                       VMInstanceVO vm =
>> _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class,
>> usageRecord.getVmInstanceId());
>> +                       usageRecResponse.setVirtualMachineId(vm.getUuid());
>> +               }
>> +               usageRecResponse.setVmName(usageRecord.getVmName());
>> +               if (usageRecord.getTemplateId() != null) {
>> +                       VMTemplateVO template =
>> ApiDBUtils.findTemplateById(usageRecord.getTemplateId());
>> +                       if (template != null) {
>> +
>> usageRecResponse.setTemplateId(template.getUuid());
>> +                       }
>> +               }
>> +
>> +               if(usageRecord.getUsageType() == UsageTypes.RUNNING_VM
>> || usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM){
>> +                       ServiceOfferingVO svcOffering =
>> _entityMgr.findByIdIncludingRemoved(ServiceOfferingVO.class,
>> usageRecord.getOfferingId().toString());
>> +                       //Service Offering Id
>> +                       usageRecResponse.setOfferingId(svcOffering.getUuid());
>> +                       //VM Instance ID
>> +                       VMInstanceVO vm =
>> _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class,
>> usageRecord.getUsageId().toString());
>> +                       usageRecResponse.setUsageId(vm.getUuid());
>> +                       //Hypervisor Type
>> +                       usageRecResponse.setType(usageRecord.getType());
>> +
>> +               } else if(usageRecord.getUsageType() == UsageTypes.IP_ADDRESS){
>> +                       //isSourceNAT
>> +
>> usageRecResponse.setSourceNat((usageRecord.getType().equals("SourceNat"))?true:false);
>> +                       //isSystem
>> +
>> usageRecResponse.setSystem((usageRecord.getSize() == 1)?true:false);
>> +                       //IP Address ID
>> +                       IPAddressVO ip =
>> _entityMgr.findByIdIncludingRemoved(IPAddressVO.class,
>> usageRecord.getUsageId().toString());
>> +                       usageRecResponse.setUsageId(ip.getUuid());
>> +
>> +               } else if(usageRecord.getUsageType() ==
>> UsageTypes.NETWORK_BYTES_SENT || usageRecord.getUsageType() ==
>> UsageTypes.NETWORK_BYTES_RECEIVED){
>> +                       //Device Type
>> +                       usageRecResponse.setType(usageRecord.getType());
>> +                       if(usageRecord.getType().equals("DomainRouter")){
>> +                               //Domain Router Id
>> +                               VMInstanceVO vm =
>> _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class,
>> usageRecord.getUsageId().toString());
>> +                               usageRecResponse.setUsageId(vm.getUuid());
>> +                       } else {
>> +                               //External Device Host Id
>> +                               HostVO host =
>> _entityMgr.findByIdIncludingRemoved(HostVO.class,
>> usageRecord.getUsageId().toString());
>> +                               usageRecResponse.setUsageId(host.getUuid());
>> +                       }
>> +                       //Network ID
>> +                       NetworkVO network =
>> _entityMgr.findByIdIncludingRemoved(NetworkVO.class,
>> usageRecord.getNetworkId().toString());
>> +                       usageRecResponse.setNetworkId(network.getUuid());
>> +
>> +               } else if(usageRecord.getUsageType() == UsageTypes.VOLUME){
>> +                       //Volume ID
>> +                       VolumeVO volume =
>> _entityMgr.findByIdIncludingRemoved(VolumeVO.class,
>> usageRecord.getUsageId().toString());
>> +                       usageRecResponse.setUsageId(volume.getUuid());
>> +                       //Volume Size
>> +                       usageRecResponse.setSize(usageRecord.getSize());
>> +                       //Disk Offering Id
>> +                       if(usageRecord.getOfferingId() != null){
>> +                               DiskOfferingVO diskOff =
>> _entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class,
>> usageRecord.getOfferingId().toString());
>> +
>> usageRecResponse.setOfferingId(diskOff.getUuid());
>> +                       }
>> +
>> +               } else if(usageRecord.getUsageType() ==
>> UsageTypes.TEMPLATE || usageRecord.getUsageType() == UsageTypes.ISO){
>> +                       //Template/ISO ID
>> +                       VMTemplateVO tmpl =
>> _entityMgr.findByIdIncludingRemoved(VMTemplateVO.class,
>> usageRecord.getUsageId().toString());
>> +                       usageRecResponse.setUsageId(tmpl.getUuid());
>> +                       //Template/ISO Size
>> +                       usageRecResponse.setSize(usageRecord.getSize());
>> +
>> +               } else if(usageRecord.getUsageType() == UsageTypes.SNAPSHOT){
>> +                       //Snapshot ID
>> +                       SnapshotVO snap =
>> _entityMgr.findByIdIncludingRemoved(SnapshotVO.class,
>> usageRecord.getUsageId().toString());
>> +                       usageRecResponse.setUsageId(snap.getUuid());
>> +                       //Snapshot Size
>> +                       usageRecResponse.setSize(usageRecord.getSize());
>> +
>> +               } else if(usageRecord.getUsageType() ==
>> UsageTypes.LOAD_BALANCER_POLICY){
>> +                       //Load Balancer Policy ID
>> +
>> usageRecResponse.setUsageId(usageRecord.getUsageId().toString());
>> +
>> +               } else if(usageRecord.getUsageType() ==
>> UsageTypes.PORT_FORWARDING_RULE){
>> +                       //Port Forwarding Rule ID
>> +
>> usageRecResponse.setUsageId(usageRecord.getUsageId().toString());
>> +
>> +               } else if(usageRecord.getUsageType() ==
>> UsageTypes.NETWORK_OFFERING){
>> +                       //Network Offering Id
>> +                       NetworkOfferingVO netOff =
>> _entityMgr.findByIdIncludingRemoved(NetworkOfferingVO.class,
>> usageRecord.getOfferingId().toString());
>> +                       usageRecResponse.setOfferingId(netOff.getUuid());
>> +                       //is Default
>> +
>> usageRecResponse.setDefault((usageRecord.getUsageId() == 1)?
>> true:false);
>> +
>> +               } else if(usageRecord.getUsageType() == UsageTypes.VPN_USERS){
>> +                       //VPN User ID
>> +
>> usageRecResponse.setUsageId(usageRecord.getUsageId().toString());
>> +
>> +               } else if(usageRecord.getUsageType() ==
>> UsageTypes.SECURITY_GROUP){
>> +                       //Security Group Id
>> +                       SecurityGroupVO sg =
>> _entityMgr.findByIdIncludingRemoved(SecurityGroupVO.class,
>> usageRecord.getUsageId().toString());
>> +                       usageRecResponse.setUsageId(sg.getUuid());
>> +               }
>> +
>> +               if (usageRecord.getRawUsage() != null) {
>> +                       DecimalFormat decimalFormat = new
>> DecimalFormat("###########.######");
>> +
>> usageRecResponse.setRawUsage(decimalFormat.format(usageRecord.getRawUsage()));
>> +               }
>> +
>> +               if (usageRecord.getStartDate() != null) {
>> +
>> usageRecResponse.setStartDate(getDateStringInternal(usageRecord.getStartDate()));
>> +               }
>> +               if (usageRecord.getEndDate() != null) {
>> +
>> usageRecResponse.setEndDate(getDateStringInternal(usageRecord.getEndDate()));
>> +               }
>> +
>> +               return usageRecResponse;
>> +       }
>> +
>> +
>> +    public String getDateStringInternal(Date inputDate) {
>> +        if (inputDate == null) return null;
>> +
>> +        TimeZone tz = _usageSvc.getUsageTimezone();
>> +        Calendar cal = Calendar.getInstance(tz);
>> +        cal.setTime(inputDate);
>> +
>> +        StringBuffer sb = new StringBuffer();
>> +        sb.append(cal.get(Calendar.YEAR)+"-");
>> +
>> +        int month = cal.get(Calendar.MONTH) + 1;
>> +        if (month < 10) {
>> +            sb.append("0" + month + "-");
>> +        } else {
>> +            sb.append(month+"-");
>> +        }
>> +
>> +        int day = cal.get(Calendar.DAY_OF_MONTH);
>> +        if (day < 10) {
>> +            sb.append("0" + day);
>> +        } else {
>> +            sb.append(""+day);
>> +        }
>> +
>> +        sb.append("'T'");
>> +
>> +        int hour = cal.get(Calendar.HOUR_OF_DAY);
>> +        if (hour < 10) {
>> +            sb.append("0" + hour + ":");
>> +        } else {
>> +            sb.append(hour+":");
>> +        }
>> +
>> +        int minute = cal.get(Calendar.MINUTE);
>> +        if (minute < 10) {
>> +            sb.append("0" + minute + ":");
>> +        } else {
>> +            sb.append(minute+":");
>> +        }
>> +
>> +        int seconds = cal.get(Calendar.SECOND);
>> +        if (seconds < 10) {
>> +            sb.append("0" + seconds);
>> +        } else {
>> +            sb.append(""+seconds);
>> +        }
>> +
>> +        double offset = cal.get(Calendar.ZONE_OFFSET);
>> +        if (tz.inDaylightTime(inputDate)) {
>> +            offset += (1.0*tz.getDSTSavings()); // add the timezone's
>> DST value (typically 1 hour expressed in milliseconds)
>> +        }
>> +
>> +        offset = offset / (1000d*60d*60d);
>> +        int hourOffset = (int)offset;
>> +        double decimalVal = Math.abs(offset) - Math.abs(hourOffset);
>> +        int minuteOffset = (int)(decimalVal * 60);
>> +
>> +        if (hourOffset < 0) {
>> +            if (hourOffset > -10) {
>> +                sb.append("-0"+Math.abs(hourOffset));
>> +            } else {
>> +                sb.append("-"+Math.abs(hourOffset));
>> +            }
>> +        } else {
>> +            if (hourOffset < 10) {
>> +                sb.append("+0" + hourOffset);
>> +            } else {
>> +                sb.append("+" + hourOffset);
>> +            }
>> +        }
>> +
>> +        sb.append(":");
>> +
>> +        if (minuteOffset == 0) {
>> +            sb.append("00");
>> +        } else if (minuteOffset < 10) {
>> +            sb.append("0" + minuteOffset);
>> +        } else {
>> +            sb.append("" + minuteOffset);
>> +        }
>> +
>> +        return sb.toString();
>> +    }
>> +
>> +    @Override
>> +    public TrafficMonitorResponse createTrafficMonitorResponse(Host
>> trafficMonitor) {
>> +        Map<String, String> tmDetails =
>> ApiDBUtils.findHostDetailsById(trafficMonitor.getId());
>> +        TrafficMonitorResponse response = new TrafficMonitorResponse();
>> +        response.setId(trafficMonitor.getUuid());
>> +        response.setIpAddress(trafficMonitor.getPrivateIpAddress());
>> +        response.setNumRetries(tmDetails.get("numRetries"));
>> +        response.setTimeout(tmDetails.get("timeout"));
>> +        return response;
>> +    }
>> }
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
>> ----------------------------------------------------------------------
>> diff --git a/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
>> b/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
>> deleted file mode 100644
>> index 8728959..0000000
>> --- a/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
>> +++ /dev/null
>> @@ -1,109 +0,0 @@
>> -// 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 com.cloud.api.commands;
>> -
>> -import javax.inject.Inject;
>> -
>> -import org.apache.cloudstack.api.APICommand;
>> -import org.apache.cloudstack.api.ApiConstants;
>> -import org.apache.cloudstack.api.ApiErrorCode;
>> -import org.apache.cloudstack.api.BaseCmd;
>> -import org.apache.cloudstack.api.Parameter;
>> -import org.apache.cloudstack.api.ServerApiException;
>> -import org.apache.cloudstack.api.response.TrafficMonitorResponse;
>> -import org.apache.cloudstack.api.response.ZoneResponse;
>> -import org.apache.log4j.Logger;
>> -
>> -import com.cloud.exception.InvalidParameterValueException;
>> -import com.cloud.host.Host;
>> -import com.cloud.network.NetworkUsageManager;
>> -import com.cloud.user.Account;
>> -import com.cloud.utils.exception.CloudRuntimeException;
>> -
>> -@APICommand(name = "addTrafficMonitor", description="Adds Traffic
>> Monitor Host for Direct Network Usage", responseObject =
>> TrafficMonitorResponse.class)
>> -public class AddTrafficMonitorCmd extends BaseCmd {
>> -    public static final Logger s_logger =
>> Logger.getLogger(AddTrafficMonitorCmd.class.getName());
>> -    private static final String s_name = "addtrafficmonitorresponse";
>> -    @Inject NetworkUsageManager networkUsageMgr;
>> -
>> -    /////////////////////////////////////////////////////
>> -    //////////////// API parameters /////////////////////
>> -    /////////////////////////////////////////////////////
>> -
>> -    @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID,
>> entityType = ZoneResponse.class,
>> -            required = true, description="Zone in which to add the
>> external firewall appliance.")
>> -    private Long zoneId;
>> -
>> -    @Parameter(name=ApiConstants.URL, type=CommandType.STRING,
>> required = true, description="URL of the traffic monitor Host")
>> -    private String url;
>> -
>> -    @Parameter(name=ApiConstants.INCL_ZONES, type=CommandType.STRING,
>> description="Traffic going into the listed zones will be metered")
>> -    private String inclZones;
>> -
>> -    @Parameter(name=ApiConstants.EXCL_ZONES, type=CommandType.STRING,
>> description="Traffic going into the listed zones will not be metered")
>> -    private String exclZones;
>> -
>> -    ///////////////////////////////////////////////////
>> -    /////////////////// Accessors ///////////////////////
>> -    /////////////////////////////////////////////////////
>> -
>> -    public String getInclZones() {
>> -        return inclZones;
>> -    }
>> -
>> -    public String getExclZones() {
>> -        return exclZones;
>> -    }
>> -
>> -    public Long getZoneId() {
>> -        return zoneId;
>> -    }
>> -
>> -    public String getUrl() {
>> -        return url;
>> -    }
>> -
>> -    /////////////////////////////////////////////////////
>> -    /////////////// API Implementation///////////////////
>> -    /////////////////////////////////////////////////////
>> -
>> -    @Override
>> -    public String getCommandName() {
>> -        return s_name;
>> -    }
>> -
>> -    @Override
>> -    public long getEntityOwnerId() {
>> -        return Account.ACCOUNT_ID_SYSTEM;
>> -    }
>> -
>> -    @Override
>> -    public void execute(){
>> -        try {
>> -            Host trafficMonitor = networkUsageMgr.addTrafficMonitor(this);
>> -            TrafficMonitorResponse response =
>> networkUsageMgr.getApiResponse(trafficMonitor);
>> -            response.setObjectName("trafficmonitor");
>> -            response.setResponseName(getCommandName());
>> -            this.setResponseObject(response);
>> -        } catch (InvalidParameterValueException ipve) {
>> -                       throw new
>> ServerApiException(ApiErrorCode.PARAM_ERROR, ipve.getMessage());
>> -        } catch (CloudRuntimeException cre) {
>> -                       throw new
>> ServerApiException(ApiErrorCode.INTERNAL_ERROR, cre.getMessage());
>> -        }
>> -    }
>> -}
>> -
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
>> ----------------------------------------------------------------------
>> diff --git a/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
>> b/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
>> deleted file mode 100644
>> index 081d0be..0000000
>> --- a/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
>> +++ /dev/null
>> @@ -1,86 +0,0 @@
>> -// 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 com.cloud.api.commands;
>> -
>> -import javax.inject.Inject;
>> -
>> -import org.apache.cloudstack.api.APICommand;
>> -import org.apache.cloudstack.api.ApiConstants;
>> -import org.apache.cloudstack.api.ApiErrorCode;
>> -import org.apache.cloudstack.api.BaseCmd;
>> -import org.apache.cloudstack.api.Parameter;
>> -import org.apache.cloudstack.api.ServerApiException;
>> -import org.apache.cloudstack.api.response.HostResponse;
>> -import org.apache.cloudstack.api.response.SuccessResponse;
>> -import org.apache.log4j.Logger;
>> -
>> -import com.cloud.exception.InvalidParameterValueException;
>> -import com.cloud.network.NetworkUsageManager;
>> -import com.cloud.user.Account;
>> -
>> -@APICommand(name = "deleteTrafficMonitor", description="Deletes an
>> traffic monitor host.", responseObject = SuccessResponse.class)
>> -public class DeleteTrafficMonitorCmd extends BaseCmd {
>> -    public static final Logger s_logger =
>> Logger.getLogger(DeleteTrafficMonitorCmd.class.getName());
>> -    private static final String s_name = "deletetrafficmonitorresponse";
>> -    @Inject NetworkUsageManager _networkUsageMgr;
>> -
>> -    /////////////////////////////////////////////////////
>> -    //////////////// API parameters /////////////////////
>> -    /////////////////////////////////////////////////////
>> -
>> -    @Parameter(name=ApiConstants.ID, type=CommandType.UUID,
>> entityType = HostResponse.class,
>> -            required = true, description="Id of the Traffic Monitor Host.")
>> -    private Long id;
>> -
>> -    ///////////////////////////////////////////////////
>> -    /////////////////// Accessors ///////////////////////
>> -    /////////////////////////////////////////////////////
>> -
>> -    public Long getId() {
>> -        return id;
>> -    }
>> -
>> -    /////////////////////////////////////////////////////
>> -    /////////////// API Implementation///////////////////
>> -    /////////////////////////////////////////////////////
>> -
>> -    @Override
>> -    public String getCommandName() {
>> -        return s_name;
>> -    }
>> -
>> -    @Override
>> -    public long getEntityOwnerId() {
>> -        return Account.ACCOUNT_ID_SYSTEM;
>> -    }
>> -
>> -    @Override
>> -    public void execute(){
>> -        try {
>> -            boolean result = _networkUsageMgr.deleteTrafficMonitor(this);
>> -            if (result) {
>> -                SuccessResponse response = new
>> SuccessResponse(getCommandName());
>> -                response.setResponseName(getCommandName());
>> -                this.setResponseObject(response);
>> -            } else {
>> -                               throw new
>> ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete
>> traffic monitor.");
>> -            }
>> -        } catch (InvalidParameterValueException e) {
>> -                       throw new
>> ServerApiException(ApiErrorCode.PARAM_ERROR, "Failed to delete traffic
>> monitor.");
>> -        }
>> -    }
>> -}
>>
>> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
>> ----------------------------------------------------------------------
>> diff --git a/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
>> b/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
>> deleted file mode 100644
>> index 4206cf8..0000000
>> --- a/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
>> +++ /dev/null
>> @@ -1,91 +0,0 @@
>> -// 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 com.cloud.api.commands;
>> -
>> -import java.util.Date;
>> -
>> -import org.apache.cloudstack.api.*;
>> -import org.apache.cloudstack.api.response.DomainResponse;
>> -import org.apache.log4j.Logger;
>> -
>> -import org.apache.cloudstack.api.APICommand;
>> -import org.apache.cloudstack.api.response.SuccessResponse;
>> -import com.cloud.server.ManagementServerExt;
>> -import com.cloud.user.Account;
>> -
>> -@APICommand(name = "generateUsageRecords", description="Generates
>> usage records. This will generate records only if there any records to
>> be generated, i.e if the scheduled usage job was not run or failed",
>> responseObject=SuccessResponse.class)
>> -public class GenerateUsageRecordsCmd extends BaseCmd {
>> -    public static final Logger s_logger =
>> Logger.getLogger(GenerateUsageRecordsCmd.class.getName());
>> -
>> -    private static final String s_name = "generateusagerecordsresponse";
>> -
>> -    /////////////////////////////////////////////////////
>> -    //////////////// API parameters /////////////////////
>> -    /////////////////////////////////////////////////////
>> -
>> -    @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.UUID,
>> entityType = DomainResponse.class,
>> -            description="List events for the specified domain.")
>> -    private Long domainId;
>> -
>> -    @Parameter(name=ApiConstants.END_DATE, type=CommandType.DATE,
>> required=true, description="End date range for usage record query. Use
>> yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.")
>> -    private Date endDate;
>> -
>> -    @Parameter(name=ApiConstants.START_DATE, type=CommandType.DATE,
>> required=true, description="Start date range for usage record query.
>> Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.")
>> -    private Date startDate;
>> -
>> -    /////////////////////////////////////////////////////
>> -    /////////////////// Accessors ///////////////////////
>> -    /////////////////////////////////////////////////////
>> -
>> -    public Long getDomainId() {
>> -        return domainId;
>> -    }
>> -
>> -    public Date getEndDate() {
>> -        return endDate;
>> -    }
>> -
>> -    public Date getStartDate() {
>> -        return startDate;
>> -    }
>> -
>> -    /////////////////////////////////////////////////////
>> -    /////////////// API Implementation///////////////////
>> -    /////////////////////////////////////////////////////
>> -
>> -    @Override
>> -    public String getCommandName() {
>> -        return s_name;
>> -    }
>> -
>> -    @Override
>> -    public long getEntityOwnerId() {
>> -        return Account.ACCOUNT_ID_SYSTEM;
>> -    }
>> -
>> -    @Override
>> -    public void execute(){
>> -        ManagementServerExt _mgrExt = (ManagementServerExt)_mgr;
>> -        boolean result = _mgrExt.generateUsageRecords(this);
>> -        if (result) {
>> -            SuccessResponse response = new SuccessResponse(getCommandName());
>> -            this.setResponseObject(response);
>> -        } else {
>> -            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
>> "Failed to generate usage records");
>> -        }
>> -    }
>> -}
>

Re: [2/2] git commit: refs/heads/4.1 - CLOUDSTACK-786, CLOUDSTACK-1014: Moved usage APIs to cloud-api. Removed ManagementServerExt. Usage API related implementation is added to UsageServiceImpl

Posted by Kishan Kavala <Ki...@citrix.com>.
Chip,
  API refactoring moved all the APIs to cloud-api project. But somehow 6 APIs (all related to usage) remained in cloud-server. The cmd objects and their implementations also were not inline with the rest of the APIs. This commit moved the 6 Usage APIs and fixed the implementation.

~kishan

On 05-Feb-2013, at 8:49 PM, "Chip Childers" <ch...@sungard.com> wrote:

> Hey Kishan,
>
> Was this refactoring needed as part of 4.1?
>
>
> ---------- Forwarded message ----------
> From:  <ki...@apache.org>
> Date: Tue, Feb 5, 2013 at 6:18 AM
> Subject: [2/2] git commit: refs/heads/4.1 - CLOUDSTACK-786,
> CLOUDSTACK-1014: Moved usage APIs to cloud-api. Removed
> ManagementServerExt. Usage API related implementation is added to
> UsageServiceImpl
> To: cloudstack-commits@incubator.apache.org
>
>
> Updated Branches:
>  refs/heads/4.1 2fd8b15d6 -> 7970384f6
>
>
> CLOUDSTACK-786, CLOUDSTACK-1014: Moved usage APIs to cloud-api.
> Removed ManagementServerExt. Usage API related implementation is added
> to UsageServiceImpl
>
>
> Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
> Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/7970384f
> Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/7970384f
> Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/7970384f
>
> Branch: refs/heads/4.1
> Commit: 7970384f6e429b5c97f6d6e80f59cbab6ce90ede
> Parents: 2fd8b15
> Author: Kishan Kavala <ki...@cloud.com>
> Authored: Tue Feb 5 16:43:18 2013 +0530
> Committer: Kishan Kavala <ki...@cloud.com>
> Committed: Tue Feb 5 16:43:40 2013 +0530
>
> ----------------------------------------------------------------------
> api/src/com/cloud/dao/EntityManager.java           |   10 +
> api/src/com/cloud/network/NetworkUsageService.java |   37 ++
> api/src/org/apache/cloudstack/api/BaseCmd.java     |    4 +
> .../apache/cloudstack/api/ResponseGenerator.java   |    7 +
> .../command/admin/usage/AddTrafficMonitorCmd.java  |  107 +++++
> .../admin/usage/DeleteTrafficMonitorCmd.java       |   84 ++++
> .../admin/usage/GenerateUsageRecordsCmd.java       |   89 ++++
> .../command/admin/usage/GetUsageRecordsCmd.java    |  126 +++++
> .../admin/usage/ListTrafficMonitorsCmd.java        |   84 ++++
> .../api/command/admin/usage/ListUsageTypesCmd.java |   51 ++
> api/src/org/apache/cloudstack/usage/Usage.java     |   69 +++
> .../org/apache/cloudstack/usage/UsageService.java  |   64 +++
> .../org/apache/cloudstack/usage/UsageTypes.java    |   58 +++
> client/tomcatconf/componentContext.xml.in          |    2 +-
> .../server/ManagementServerSimulatorImpl.java      |    2 +-
> .../dns-notifier/resources/components-example.xml  |    2 +-
> server/src/com/cloud/api/ApiDBUtils.java           |   14 +-
> server/src/com/cloud/api/ApiResponseHelper.java    |  253 ++++++++++
> .../cloud/api/commands/AddTrafficMonitorCmd.java   |  109 -----
> .../api/commands/DeleteTrafficMonitorCmd.java      |   86 ----
> .../api/commands/GenerateUsageRecordsCmd.java      |   91 ----
> .../com/cloud/api/commands/GetUsageRecordsCmd.java |  370 ---------------
> .../cloud/api/commands/ListTrafficMonitorsCmd.java |   86 ----
> .../com/cloud/api/commands/ListUsageTypesCmd.java  |   53 --
> server/src/com/cloud/dao/EntityManagerImpl.java    |    7 +-
> .../src/com/cloud/network/NetworkUsageManager.java |   14 -
> .../com/cloud/network/NetworkUsageManagerImpl.java |   20 +-
> .../src/com/cloud/server/ManagementServerExt.java  |   63 ---
> .../com/cloud/server/ManagementServerExtImpl.java  |  254 ----------
> server/src/com/cloud/usage/UsageServiceImpl.java   |  261 ++++++++++
> server/src/com/cloud/usage/UsageTypes.java         |   58 ---
> server/src/com/cloud/usage/UsageVO.java            |   23 +-
> usage/src/com/cloud/usage/UsageManagerImpl.java    |    1 +
> .../cloud/usage/parser/IPAddressUsageParser.java   |    2 +-
> .../usage/parser/LoadBalancerUsageParser.java      |    2 +-
> .../usage/parser/NetworkOfferingUsageParser.java   |    2 +-
> .../com/cloud/usage/parser/NetworkUsageParser.java |    2 +-
> .../usage/parser/PortForwardingUsageParser.java    |    2 +-
> .../usage/parser/SecurityGroupUsageParser.java     |    2 +-
> .../com/cloud/usage/parser/StorageUsageParser.java |    2 +-
> .../cloud/usage/parser/VMInstanceUsageParser.java  |    2 +-
> .../com/cloud/usage/parser/VPNUserUsageParser.java |    2 +-
> .../com/cloud/usage/parser/VolumeUsageParser.java  |    2 +-
> 43 files changed, 1358 insertions(+), 1221 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/com/cloud/dao/EntityManager.java
> ----------------------------------------------------------------------
> diff --git a/api/src/com/cloud/dao/EntityManager.java
> b/api/src/com/cloud/dao/EntityManager.java
> index b8fdaa7..8e6a438 100644
> --- a/api/src/com/cloud/dao/EntityManager.java
> +++ b/api/src/com/cloud/dao/EntityManager.java
> @@ -39,6 +39,16 @@ public interface EntityManager {
>     public <T, K extends Serializable> T findById(Class<T> entityType, K id);
>
>     /**
> +     * Finds an entity by its id including removed.
> +     * @param <T> class of the entity you're trying to find.
> +     * @param <K> class of the id that the entity uses.
> +     * @param entityType Type of the entity.
> +     * @param id id value
> +     * @return T if found; null if not.
> +     */
> +    public <T, K extends Serializable> T
> findByIdIncludingRemoved(Class<T> entityType, K id);
> +
> +    /**
>      * Finds a unique entity by uuid string
>      * @param <T> entity class
>      * @param entityType type of entity you're looking for.
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/com/cloud/network/NetworkUsageService.java
> ----------------------------------------------------------------------
> diff --git a/api/src/com/cloud/network/NetworkUsageService.java
> b/api/src/com/cloud/network/NetworkUsageService.java
> new file mode 100644
> index 0000000..1cfea24
> --- /dev/null
> +++ b/api/src/com/cloud/network/NetworkUsageService.java
> @@ -0,0 +1,37 @@
> +// 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 com.cloud.network;
> +
> +import java.util.List;
> +
> +import com.cloud.host.Host;
> +
> +import org.apache.cloudstack.api.command.admin.usage.AddTrafficMonitorCmd;
> +import org.apache.cloudstack.api.command.admin.usage.DeleteTrafficMonitorCmd;
> +import org.apache.cloudstack.api.command.admin.usage.ListTrafficMonitorsCmd;
> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
> +import com.cloud.utils.component.Manager;
> +
> +public interface NetworkUsageService extends Manager {
> +
> +    Host addTrafficMonitor(AddTrafficMonitorCmd cmd);
> +
> +    boolean deleteTrafficMonitor(DeleteTrafficMonitorCmd cmd);
> +
> +    List<? extends Host> listTrafficMonitors(ListTrafficMonitorsCmd cmd);
> +
> +}
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/BaseCmd.java
> ----------------------------------------------------------------------
> diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java
> b/api/src/org/apache/cloudstack/api/BaseCmd.java
> index d8e2bff..a9ac489 100644
> --- a/api/src/org/apache/cloudstack/api/BaseCmd.java
> +++ b/api/src/org/apache/cloudstack/api/BaseCmd.java
> @@ -29,6 +29,7 @@ import javax.inject.Inject;
>
> import org.apache.cloudstack.query.QueryService;
> import org.apache.cloudstack.region.RegionService;
> +import org.apache.cloudstack.usage.UsageService;
> import org.apache.log4j.Logger;
>
> import com.cloud.configuration.ConfigurationService;
> @@ -43,6 +44,7 @@ import com.cloud.exception.PermissionDeniedException;
> import com.cloud.exception.ResourceAllocationException;
> import com.cloud.exception.ResourceUnavailableException;
> import com.cloud.network.NetworkService;
> +import com.cloud.network.NetworkUsageService;
> import com.cloud.network.StorageNetworkService;
> import com.cloud.network.VpcVirtualNetworkApplianceService;
> import com.cloud.network.as.AutoScaleService;
> @@ -124,6 +126,8 @@ public abstract class BaseCmd {
>     @Inject public Site2SiteVpnService _s2sVpnService;
>
>     @Inject public QueryService _queryService;
> +    @Inject public UsageService _usageService;
> +    @Inject public NetworkUsageService _networkUsageService;
>
>     public abstract void execute() throws
> ResourceUnavailableException, InsufficientCapacityException,
> ServerApiException, ConcurrentOperationException,
> ResourceAllocationException, NetworkRuleConflictException;
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/ResponseGenerator.java
> ----------------------------------------------------------------------
> diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java
> b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
> index b95f182..0dc85de 100644
> --- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java
> +++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
> @@ -83,7 +83,9 @@ import
> org.apache.cloudstack.api.response.SystemVmInstanceResponse;
> import org.apache.cloudstack.api.response.SystemVmResponse;
> import org.apache.cloudstack.api.response.TemplatePermissionsResponse;
> import org.apache.cloudstack.api.response.TemplateResponse;
> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
> import org.apache.cloudstack.api.response.TrafficTypeResponse;
> +import org.apache.cloudstack.api.response.UsageRecordResponse;
> import org.apache.cloudstack.api.response.UserResponse;
> import org.apache.cloudstack.api.response.UserVmResponse;
> import org.apache.cloudstack.api.response.VirtualRouterProviderResponse;
> @@ -94,6 +96,7 @@ import org.apache.cloudstack.api.response.VpcResponse;
> import org.apache.cloudstack.api.response.VpnUsersResponse;
> import org.apache.cloudstack.api.response.ZoneResponse;
> import org.apache.cloudstack.region.Region;
> +import org.apache.cloudstack.usage.Usage;
>
> import com.cloud.async.AsyncJob;
> import com.cloud.capacity.Capacity;
> @@ -375,4 +378,8 @@ public interface ResponseGenerator {
>     GuestOSResponse createGuestOSResponse(GuestOS os);
>
>     SnapshotScheduleResponse
> createSnapshotScheduleResponse(SnapshotSchedule sched);
> +
> +    UsageRecordResponse createUsageResponse(Usage usageRecord);
> +
> +       TrafficMonitorResponse createTrafficMonitorResponse(Host
> trafficMonitor);
> }
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMonitorCmd.java
> ----------------------------------------------------------------------
> diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMonitorCmd.java
> b/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMonitorCmd.java
> new file mode 100644
> index 0000000..48424fe
> --- /dev/null
> +++ b/api/src/org/apache/cloudstack/api/command/admin/usage/AddTrafficMonitorCmd.java
> @@ -0,0 +1,107 @@
> +// 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.apache.cloudstack.api.command.admin.usage;
> +
> +import javax.inject.Inject;
> +
> +import org.apache.cloudstack.api.APICommand;
> +import org.apache.cloudstack.api.ApiConstants;
> +import org.apache.cloudstack.api.ApiErrorCode;
> +import org.apache.cloudstack.api.BaseCmd;
> +import org.apache.cloudstack.api.Parameter;
> +import org.apache.cloudstack.api.ServerApiException;
> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
> +import org.apache.cloudstack.api.response.ZoneResponse;
> +import org.apache.log4j.Logger;
> +
> +import com.cloud.exception.InvalidParameterValueException;
> +import com.cloud.host.Host;
> +import com.cloud.user.Account;
> +import com.cloud.utils.exception.CloudRuntimeException;
> +
> +@APICommand(name = "addTrafficMonitor", description="Adds Traffic
> Monitor Host for Direct Network Usage", responseObject =
> TrafficMonitorResponse.class)
> +public class AddTrafficMonitorCmd extends BaseCmd {
> +    public static final Logger s_logger =
> Logger.getLogger(AddTrafficMonitorCmd.class.getName());
> +    private static final String s_name = "addtrafficmonitorresponse";
> +
> +    /////////////////////////////////////////////////////
> +    //////////////// API parameters /////////////////////
> +    /////////////////////////////////////////////////////
> +
> +    @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID,
> entityType = ZoneResponse.class,
> +            required = true, description="Zone in which to add the
> external firewall appliance.")
> +    private Long zoneId;
> +
> +    @Parameter(name=ApiConstants.URL, type=CommandType.STRING,
> required = true, description="URL of the traffic monitor Host")
> +    private String url;
> +
> +    @Parameter(name=ApiConstants.INCL_ZONES, type=CommandType.STRING,
> description="Traffic going into the listed zones will be metered")
> +    private String inclZones;
> +
> +    @Parameter(name=ApiConstants.EXCL_ZONES, type=CommandType.STRING,
> description="Traffic going into the listed zones will not be metered")
> +    private String exclZones;
> +
> +    ///////////////////////////////////////////////////
> +    /////////////////// Accessors ///////////////////////
> +    /////////////////////////////////////////////////////
> +
> +    public String getInclZones() {
> +        return inclZones;
> +    }
> +
> +    public String getExclZones() {
> +        return exclZones;
> +    }
> +
> +    public Long getZoneId() {
> +        return zoneId;
> +    }
> +
> +    public String getUrl() {
> +        return url;
> +    }
> +
> +    /////////////////////////////////////////////////////
> +    /////////////// API Implementation///////////////////
> +    /////////////////////////////////////////////////////
> +
> +    @Override
> +    public String getCommandName() {
> +        return s_name;
> +    }
> +
> +    @Override
> +    public long getEntityOwnerId() {
> +        return Account.ACCOUNT_ID_SYSTEM;
> +    }
> +
> +    @Override
> +    public void execute(){
> +        try {
> +            Host trafficMonitor = _networkUsageService.addTrafficMonitor(this);
> +            TrafficMonitorResponse response =
> _responseGenerator.createTrafficMonitorResponse(trafficMonitor);
> +            response.setObjectName("trafficmonitor");
> +            response.setResponseName(getCommandName());
> +            this.setResponseObject(response);
> +        } catch (InvalidParameterValueException ipve) {
> +                       throw new
> ServerApiException(ApiErrorCode.PARAM_ERROR, ipve.getMessage());
> +        } catch (CloudRuntimeException cre) {
> +                       throw new
> ServerApiException(ApiErrorCode.INTERNAL_ERROR, cre.getMessage());
> +        }
> +    }
> +}
> +
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficMonitorCmd.java
> ----------------------------------------------------------------------
> diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficMonitorCmd.java
> b/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficMonitorCmd.java
> new file mode 100644
> index 0000000..e3bb299
> --- /dev/null
> +++ b/api/src/org/apache/cloudstack/api/command/admin/usage/DeleteTrafficMonitorCmd.java
> @@ -0,0 +1,84 @@
> +// 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.apache.cloudstack.api.command.admin.usage;
> +
> +import javax.inject.Inject;
> +
> +import org.apache.cloudstack.api.APICommand;
> +import org.apache.cloudstack.api.ApiConstants;
> +import org.apache.cloudstack.api.ApiErrorCode;
> +import org.apache.cloudstack.api.BaseCmd;
> +import org.apache.cloudstack.api.Parameter;
> +import org.apache.cloudstack.api.ServerApiException;
> +import org.apache.cloudstack.api.response.HostResponse;
> +import org.apache.cloudstack.api.response.SuccessResponse;
> +import org.apache.log4j.Logger;
> +
> +import com.cloud.exception.InvalidParameterValueException;
> +import com.cloud.user.Account;
> +
> +@APICommand(name = "deleteTrafficMonitor", description="Deletes an
> traffic monitor host.", responseObject = SuccessResponse.class)
> +public class DeleteTrafficMonitorCmd extends BaseCmd {
> +    public static final Logger s_logger =
> Logger.getLogger(DeleteTrafficMonitorCmd.class.getName());
> +    private static final String s_name = "deletetrafficmonitorresponse";
> +
> +    /////////////////////////////////////////////////////
> +    //////////////// API parameters /////////////////////
> +    /////////////////////////////////////////////////////
> +
> +    @Parameter(name=ApiConstants.ID, type=CommandType.UUID,
> entityType = HostResponse.class,
> +            required = true, description="Id of the Traffic Monitor Host.")
> +    private Long id;
> +
> +    ///////////////////////////////////////////////////
> +    /////////////////// Accessors ///////////////////////
> +    /////////////////////////////////////////////////////
> +
> +    public Long getId() {
> +        return id;
> +    }
> +
> +    /////////////////////////////////////////////////////
> +    /////////////// API Implementation///////////////////
> +    /////////////////////////////////////////////////////
> +
> +    @Override
> +    public String getCommandName() {
> +        return s_name;
> +    }
> +
> +    @Override
> +    public long getEntityOwnerId() {
> +        return Account.ACCOUNT_ID_SYSTEM;
> +    }
> +
> +    @Override
> +    public void execute(){
> +        try {
> +            boolean result = _networkUsageService.deleteTrafficMonitor(this);
> +            if (result) {
> +                SuccessResponse response = new
> SuccessResponse(getCommandName());
> +                response.setResponseName(getCommandName());
> +                this.setResponseObject(response);
> +            } else {
> +                               throw new
> ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete
> traffic monitor.");
> +            }
> +        } catch (InvalidParameterValueException e) {
> +                       throw new
> ServerApiException(ApiErrorCode.PARAM_ERROR, "Failed to delete traffic
> monitor.");
> +        }
> +    }
> +}
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsageRecordsCmd.java
> ----------------------------------------------------------------------
> diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsageRecordsCmd.java
> b/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsageRecordsCmd.java
> new file mode 100644
> index 0000000..13710f9
> --- /dev/null
> +++ b/api/src/org/apache/cloudstack/api/command/admin/usage/GenerateUsageRecordsCmd.java
> @@ -0,0 +1,89 @@
> +// 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.apache.cloudstack.api.command.admin.usage;
> +
> +import java.util.Date;
> +
> +import org.apache.cloudstack.api.*;
> +import org.apache.cloudstack.api.response.DomainResponse;
> +import org.apache.log4j.Logger;
> +
> +import org.apache.cloudstack.api.APICommand;
> +import org.apache.cloudstack.api.response.SuccessResponse;
> +import com.cloud.user.Account;
> +
> +@APICommand(name = "generateUsageRecords", description="Generates
> usage records. This will generate records only if there any records to
> be generated, i.e if the scheduled usage job was not run or failed",
> responseObject=SuccessResponse.class)
> +public class GenerateUsageRecordsCmd extends BaseCmd {
> +    public static final Logger s_logger =
> Logger.getLogger(GenerateUsageRecordsCmd.class.getName());
> +
> +    private static final String s_name = "generateusagerecordsresponse";
> +
> +    /////////////////////////////////////////////////////
> +    //////////////// API parameters /////////////////////
> +    /////////////////////////////////////////////////////
> +
> +    @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.UUID,
> entityType = DomainResponse.class,
> +            description="List events for the specified domain.")
> +    private Long domainId;
> +
> +    @Parameter(name=ApiConstants.END_DATE, type=CommandType.DATE,
> required=true, description="End date range for usage record query. Use
> yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.")
> +    private Date endDate;
> +
> +    @Parameter(name=ApiConstants.START_DATE, type=CommandType.DATE,
> required=true, description="Start date range for usage record query.
> Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.")
> +    private Date startDate;
> +
> +    /////////////////////////////////////////////////////
> +    /////////////////// Accessors ///////////////////////
> +    /////////////////////////////////////////////////////
> +
> +    public Long getDomainId() {
> +        return domainId;
> +    }
> +
> +    public Date getEndDate() {
> +        return endDate;
> +    }
> +
> +    public Date getStartDate() {
> +        return startDate;
> +    }
> +
> +    /////////////////////////////////////////////////////
> +    /////////////// API Implementation///////////////////
> +    /////////////////////////////////////////////////////
> +
> +    @Override
> +    public String getCommandName() {
> +        return s_name;
> +    }
> +
> +    @Override
> +    public long getEntityOwnerId() {
> +        return Account.ACCOUNT_ID_SYSTEM;
> +    }
> +
> +    @Override
> +    public void execute(){
> +        boolean result = _usageService.generateUsageRecords(this);
> +        if (result) {
> +            SuccessResponse response = new SuccessResponse(getCommandName());
> +            this.setResponseObject(response);
> +        } else {
> +            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
> "Failed to generate usage records");
> +        }
> +    }
> +}
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
> ----------------------------------------------------------------------
> diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
> b/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
> new file mode 100644
> index 0000000..f4960dd
> --- /dev/null
> +++ b/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
> @@ -0,0 +1,126 @@
> +// 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.apache.cloudstack.api.command.admin.usage;
> +
> +import java.util.ArrayList;
> +import java.util.Date;
> +import java.util.List;
> +import java.util.TimeZone;
> +
> +import org.apache.cloudstack.api.APICommand;
> +import org.apache.cloudstack.api.ApiConstants;
> +import org.apache.cloudstack.api.BaseListCmd;
> +import org.apache.cloudstack.api.Parameter;
> +import org.apache.cloudstack.api.response.AccountResponse;
> +import org.apache.cloudstack.api.response.DomainResponse;
> +import org.apache.cloudstack.api.response.ListResponse;
> +import org.apache.cloudstack.api.response.ProjectResponse;
> +import org.apache.cloudstack.api.response.UsageRecordResponse;
> +import org.apache.cloudstack.usage.Usage;
> +import org.apache.log4j.Logger;
> +
> +@APICommand(name = "listUsageRecords", description="Lists usage
> records for accounts", responseObject=UsageRecordResponse.class)
> +public class GetUsageRecordsCmd extends BaseListCmd {
> +    public static final Logger s_logger =
> Logger.getLogger(GetUsageRecordsCmd.class.getName());
> +
> +    private static final String s_name = "listusagerecordsresponse";
> +
> +    /////////////////////////////////////////////////////
> +    //////////////// API parameters /////////////////////
> +    /////////////////////////////////////////////////////
> +
> +    @Parameter(name=ApiConstants.ACCOUNT, type=CommandType.STRING,
> description="List usage records for the specified user.")
> +    private String accountName;
> +
> +    @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.UUID,
> entityType = DomainResponse.class,
> +            description="List usage records for the specified domain.")
> +    private Long domainId;
> +
> +    @Parameter(name=ApiConstants.END_DATE, type=CommandType.DATE,
> required=true, description="End date range for usage record query. Use
> yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.")
> +    private Date endDate;
> +
> +    @Parameter(name=ApiConstants.START_DATE, type=CommandType.DATE,
> required=true, description="Start date range for usage record query.
> Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.")
> +    private Date startDate;
> +
> +    @Parameter(name=ApiConstants.ACCOUNT_ID, type=CommandType.UUID,
> entityType = AccountResponse.class,
> +            description="List usage records for the specified account")
> +    private Long accountId;
> +
> +    @Parameter(name=ApiConstants.PROJECT_ID, type=CommandType.UUID,
> entityType = ProjectResponse.class,
> +            description="List usage records for specified project")
> +    private Long projectId;
> +
> +    @Parameter(name=ApiConstants.TYPE, type=CommandType.LONG,
> description="List usage records for the specified usage type")
> +    private Long usageType;
> +
> +    /////////////////////////////////////////////////////
> +    /////////////////// Accessors ///////////////////////
> +    /////////////////////////////////////////////////////
> +
> +    public String getAccountName() {
> +        return accountName;
> +    }
> +
> +    public Long getDomainId() {
> +        return domainId;
> +    }
> +
> +    public Date getEndDate() {
> +        return endDate;
> +    }
> +
> +    public Date getStartDate() {
> +        return startDate;
> +    }
> +
> +    public Long getAccountId() {
> +        return accountId;
> +    }
> +
> +    public Long getUsageType() {
> +        return usageType;
> +    }
> +
> +    public Long getProjectId() {
> +        return projectId;
> +    }
> +
> +    /////////////////////////////////////////////////////
> +    /////////////// API Implementation///////////////////
> +    /////////////////////////////////////////////////////
> +
> +    @Override
> +    public String getCommandName() {
> +        return s_name;
> +    }
> +
> +    @Override
> +    public void execute(){
> +        List<? extends Usage> usageRecords =
> _usageService.getUsageRecords(this);
> +        ListResponse<UsageRecordResponse> response = new
> ListResponse<UsageRecordResponse>();
> +        List<UsageRecordResponse> usageResponses = new
> ArrayList<UsageRecordResponse>();
> +        for(Usage usageRecord: usageRecords){
> +               UsageRecordResponse usageResponse =
> _responseGenerator.createUsageResponse(usageRecord);
> +               usageResponse.setObjectName("usagerecord");
> +               usageResponses.add(usageResponse);
> +        }
> +
> +        response.setResponses(usageResponses);
> +        response.setResponseName(getCommandName());
> +        this.setResponseObject(response);
> +    }
> +}
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMonitorsCmd.java
> ----------------------------------------------------------------------
> diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMonitorsCmd.java
> b/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMonitorsCmd.java
> new file mode 100644
> index 0000000..e8e3b22
> --- /dev/null
> +++ b/api/src/org/apache/cloudstack/api/command/admin/usage/ListTrafficMonitorsCmd.java
> @@ -0,0 +1,84 @@
> +// 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.apache.cloudstack.api.command.admin.usage;
> +
> +import java.util.ArrayList;
> +import java.util.List;
> +
> +import javax.inject.Inject;
> +
> +import org.apache.cloudstack.api.APICommand;
> +import org.apache.cloudstack.api.ApiConstants;
> +import org.apache.cloudstack.api.BaseListCmd;
> +import org.apache.cloudstack.api.Parameter;
> +import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd;
> +import org.apache.cloudstack.api.response.ListResponse;
> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
> +import org.apache.cloudstack.api.response.ZoneResponse;
> +import org.apache.log4j.Logger;
> +
> +import com.cloud.host.Host;
> +
> +
> +@APICommand(name = "listTrafficMonitors", description="List traffic
> monitor Hosts.", responseObject = TrafficMonitorResponse.class)
> +public class ListTrafficMonitorsCmd extends BaseListCmd {
> +    public static final Logger s_logger =
> Logger.getLogger(ListServiceOfferingsCmd.class.getName());
> +    private static final String s_name = "listtrafficmonitorsresponse";
> +
> +    /////////////////////////////////////////////////////
> +    //////////////// API parameters /////////////////////
> +    /////////////////////////////////////////////////////
> +
> +    @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID,
> entityType = ZoneResponse.class,
> +            required = true, description="zone Id")
> +    private long zoneId;
> +
> +    /////////////////////////////////////////////////////
> +    /////////////////// Accessors ///////////////////////
> +    /////////////////////////////////////////////////////
> +
> +    public long getZoneId() {
> +        return zoneId;
> +    }
> +
> +    /////////////////////////////////////////////////////
> +    /////////////// API Implementation///////////////////
> +    /////////////////////////////////////////////////////
> +
> +    @Override
> +    public String getCommandName() {
> +        return s_name;
> +    }
> +
> +    @Override
> +    public void execute(){
> +        List<? extends Host> trafficMonitors =
> _networkUsageService.listTrafficMonitors(this);
> +
> +        ListResponse<TrafficMonitorResponse> listResponse = new
> ListResponse<TrafficMonitorResponse>();
> +        List<TrafficMonitorResponse> responses = new
> ArrayList<TrafficMonitorResponse>();
> +        for (Host trafficMonitor : trafficMonitors) {
> +            TrafficMonitorResponse response =
> _responseGenerator.createTrafficMonitorResponse(trafficMonitor);
> +            response.setObjectName("trafficmonitor");
> +            response.setResponseName(getCommandName());
> +            responses.add(response);
> +        }
> +
> +        listResponse.setResponses(responses);
> +        listResponse.setResponseName(getCommandName());
> +        this.setResponseObject(listResponse);
> +    }
> +}
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTypesCmd.java
> ----------------------------------------------------------------------
> diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTypesCmd.java
> b/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTypesCmd.java
> new file mode 100644
> index 0000000..bc02911
> --- /dev/null
> +++ b/api/src/org/apache/cloudstack/api/command/admin/usage/ListUsageTypesCmd.java
> @@ -0,0 +1,51 @@
> +// 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.apache.cloudstack.api.command.admin.usage;
> +
> +import java.util.List;
> +
> +import org.apache.cloudstack.api.APICommand;
> +import org.apache.log4j.Logger;
> +
> +import org.apache.cloudstack.api.BaseCmd;
> +import org.apache.cloudstack.api.response.ListResponse;
> +import org.apache.cloudstack.api.response.UsageTypeResponse;
> +import com.cloud.user.Account;
> +
> +@APICommand(name = "listUsageTypes", description = "List Usage
> Types", responseObject = UsageTypeResponse.class)
> +public class ListUsageTypesCmd extends BaseCmd {
> +    public static final Logger s_logger =
> Logger.getLogger(ListUsageTypesCmd.class.getName());
> +    private static final String s_name = "listusagetypesresponse";
> +
> +    @Override
> +    public String getCommandName() {
> +        return s_name;
> +    }
> +
> +    public long getEntityOwnerId() {
> +        return Account.ACCOUNT_ID_SYSTEM;
> +    }
> +
> +    @Override
> +    public void execute() {
> +        List<UsageTypeResponse> result = _usageService.listUsageTypes();
> +        ListResponse<UsageTypeResponse> response = new
> ListResponse<UsageTypeResponse>();
> +        response.setResponses(result);
> +        response.setResponseName(getCommandName());
> +        this.setResponseObject(response);
> +    }
> +}
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/usage/Usage.java
> ----------------------------------------------------------------------
> diff --git a/api/src/org/apache/cloudstack/usage/Usage.java
> b/api/src/org/apache/cloudstack/usage/Usage.java
> new file mode 100644
> index 0000000..c74d3b7
> --- /dev/null
> +++ b/api/src/org/apache/cloudstack/usage/Usage.java
> @@ -0,0 +1,69 @@
> +// 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.apache.cloudstack.usage;
> +
> +import org.apache.cloudstack.api.InternalIdentity;
> +
> +import java.util.Date;
> +
> +import javax.persistence.Column;
> +import javax.persistence.Entity;
> +import javax.persistence.GeneratedValue;
> +import javax.persistence.GenerationType;
> +import javax.persistence.Id;
> +import javax.persistence.Table;
> +import javax.persistence.Temporal;
> +import javax.persistence.TemporalType;
> +
> +public interface Usage {
> +
> +       public long getId();
> +
> +       public Long getZoneId();
> +
> +       public Long getAccountId();
> +
> +    public Long getDomainId();
> +
> +       public String getDescription();
> +
> +       public String getUsageDisplay();
> +
> +       public int getUsageType();
> +
> +    public Double getRawUsage();
> +
> +    public Long getVmInstanceId();
> +
> +    public String getVmName();
> +
> +    public Long getOfferingId();
> +
> +    public Long getTemplateId();
> +
> +    public Long getUsageId();
> +
> +    public String getType();
> +
> +    public Long getNetworkId();
> +
> +    public Long getSize();
> +
> +       public Date getStartDate();
> +
> +       public Date getEndDate();
> +}
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/usage/UsageService.java
> ----------------------------------------------------------------------
> diff --git a/api/src/org/apache/cloudstack/usage/UsageService.java
> b/api/src/org/apache/cloudstack/usage/UsageService.java
> new file mode 100755
> index 0000000..3838225
> --- /dev/null
> +++ b/api/src/org/apache/cloudstack/usage/UsageService.java
> @@ -0,0 +1,64 @@
> +// 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.apache.cloudstack.usage;
> +
> +import java.util.List;
> +import java.util.TimeZone;
> +
> +import org.apache.cloudstack.api.command.admin.usage.GenerateUsageRecordsCmd;
> +import org.apache.cloudstack.api.command.admin.usage.GetUsageRecordsCmd;
> +import org.apache.cloudstack.api.response.UsageTypeResponse;
> +
> +public interface UsageService {
> +    /**
> +     * Generate Billing Records from the last time it was generated to the
> +     * time specified.
> +     *
> +     * @param cmd the command wrapping the generate parameters
> +     *   - userId unique id of the user, pass in -1 to generate billing records
> +     *            for all users
> +     *   - startDate
> +     *   - endDate inclusive.  If date specified is greater than the
> current time, the
> +     *             system will use the current time.
> +     */
> +    boolean generateUsageRecords(GenerateUsageRecordsCmd cmd);
> +
> +    /**
> +     * Retrieves all Usage Records generated between the start and
> end date specified
> +     *
> +     * @param userId unique id of the user, pass in -1 to retrieve
> billing records
> +     *        for all users
> +     * @param startDate inclusive.
> +     * @param endDate inclusive.  If date specified is greater than
> the current time, the
> +     *                system will use the current time.
> +     * @param page The page of usage records to see (500 results are
> returned at a time, if
> +     *             more than 500 records exist then additional
> results can be retrieved by
> +     *             the appropriate page number)
> +     * @return a list of usage records
> +     */
> +    List<? extends Usage> getUsageRecords(GetUsageRecordsCmd cmd);
> +
> +    /**
> +     * Retrieves the timezone used for usage aggregation.  One day is
> represented as midnight to 11:59:59pm
> +     * in the given time zone
> +     * @return the timezone specified by the config value
> usage.aggregation.timezone, or GMT if null
> +     */
> +    TimeZone getUsageTimezone();
> +
> +       List<UsageTypeResponse> listUsageTypes();
> +
> +}
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/api/src/org/apache/cloudstack/usage/UsageTypes.java
> ----------------------------------------------------------------------
> diff --git a/api/src/org/apache/cloudstack/usage/UsageTypes.java
> b/api/src/org/apache/cloudstack/usage/UsageTypes.java
> new file mode 100644
> index 0000000..2baa1d2
> --- /dev/null
> +++ b/api/src/org/apache/cloudstack/usage/UsageTypes.java
> @@ -0,0 +1,58 @@
> +// 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.apache.cloudstack.usage;
> +
> +import java.util.ArrayList;
> +import java.util.List;
> +
> +import org.apache.cloudstack.api.response.UsageTypeResponse;
> +
> +public class UsageTypes {
> +    public static final int RUNNING_VM = 1;
> +    public static final int ALLOCATED_VM = 2; // used for tracking
> how long storage has been allocated for a VM
> +    public static final int IP_ADDRESS = 3;
> +    public static final int NETWORK_BYTES_SENT = 4;
> +    public static final int NETWORK_BYTES_RECEIVED = 5;
> +    public static final int VOLUME = 6;
> +    public static final int TEMPLATE = 7;
> +    public static final int ISO = 8;
> +    public static final int SNAPSHOT = 9;
> +    public static final int SECURITY_GROUP = 10;
> +    public static final int LOAD_BALANCER_POLICY = 11;
> +    public static final int PORT_FORWARDING_RULE = 12;
> +    public static final int NETWORK_OFFERING = 13;
> +    public static final int VPN_USERS = 14;
> +
> +    public static List<UsageTypeResponse> listUsageTypes(){
> +       List<UsageTypeResponse> responseList = new
> ArrayList<UsageTypeResponse>();
> +       responseList.add(new UsageTypeResponse(RUNNING_VM, "Running Vm Usage"));
> +       responseList.add(new UsageTypeResponse(ALLOCATED_VM,
> "Allocated Vm Usage"));
> +       responseList.add(new UsageTypeResponse(IP_ADDRESS, "IP Address Usage"));
> +       responseList.add(new UsageTypeResponse(NETWORK_BYTES_SENT,
> "Network Usage (Bytes Sent)"));
> +       responseList.add(new UsageTypeResponse(NETWORK_BYTES_RECEIVED,
> "Network Usage (Bytes Received)"));
> +       responseList.add(new UsageTypeResponse(VOLUME, "Volume Usage"));
> +       responseList.add(new UsageTypeResponse(TEMPLATE, "Template Usage"));
> +       responseList.add(new UsageTypeResponse(ISO, "ISO Usage"));
> +       responseList.add(new UsageTypeResponse(SNAPSHOT, "Snapshot Usage"));
> +       responseList.add(new UsageTypeResponse(SECURITY_GROUP,
> "Security Group Usage"));
> +       responseList.add(new UsageTypeResponse(LOAD_BALANCER_POLICY,
> "Load Balancer Usage"));
> +       responseList.add(new UsageTypeResponse(PORT_FORWARDING_RULE,
> "Port Forwarding Usage"));
> +       responseList.add(new UsageTypeResponse(NETWORK_OFFERING,
> "Network Offering Usage"));
> +       responseList.add(new UsageTypeResponse(VPN_USERS, "VPN users usage"));
> +       return responseList;
> +    }
> +}
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/client/tomcatconf/componentContext.xml.in
> ----------------------------------------------------------------------
> diff --git a/client/tomcatconf/componentContext.xml.in
> b/client/tomcatconf/componentContext.xml.in
> index e3bf982..065188c 100644
> --- a/client/tomcatconf/componentContext.xml.in
> +++ b/client/tomcatconf/componentContext.xml.in
> @@ -36,7 +36,7 @@
>   -->
>   <bean id="databaseUpgradeChecker"
> class="com.cloud.upgrade.DatabaseUpgradeChecker" />
>
> -  <bean id="management-server" class
> ="com.cloud.server.ManagementServerExtImpl" />
> +  <bean id="management-server" class
> ="com.cloud.server.ManagementServerImpl" />
>   <bean id="configuration-server"
> class="com.cloud.server.ConfigurationServerImpl" />
>
>   <bean id="clusterManagerImpl" class="com.cloud.cluster.ClusterManagerImpl" />
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
> ----------------------------------------------------------------------
> diff --git a/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
> b/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
> index db4b619..728271c 100644
> --- a/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
> +++ b/plugins/hypervisors/simulator/src/com/cloud/server/ManagementServerSimulatorImpl.java
> @@ -21,7 +21,7 @@ import java.util.List;
>
> import com.cloud.api.commands.ConfigureSimulator;
>
> -public class ManagementServerSimulatorImpl extends ManagementServerExtImpl {
> +public class ManagementServerSimulatorImpl extends ManagementServerImpl {
>     @Override
>     public List<Class<?>> getCommands() {
>         List<Class<?>> cmdList = super.getCommands();
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/plugins/network-elements/dns-notifier/resources/components-example.xml
> ----------------------------------------------------------------------
> diff --git a/plugins/network-elements/dns-notifier/resources/components-example.xml
> b/plugins/network-elements/dns-notifier/resources/components-example.xml
> index 412da0e..36441bd 100755
> --- a/plugins/network-elements/dns-notifier/resources/components-example.xml
> +++ b/plugins/network-elements/dns-notifier/resources/components-example.xml
> @@ -29,7 +29,7 @@ under the License.
>     </system-integrity-checker>
>
>     <interceptor library="com.cloud.configuration.DefaultInterceptorLibrary"/>
> -    <management-server
> class="com.cloud.server.ManagementServerExtImpl"
> library="com.cloud.configuration.PremiumComponentLibrary">
> +    <management-server class="com.cloud.server.ManagementServerImpl"
> library="com.cloud.configuration.PremiumComponentLibrary">
>         <dao name="Configuration configuration server"
> class="com.cloud.configuration.dao.ConfigurationDaoImpl">
>              <param name="premium">true</param>
>         </dao>
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/ApiDBUtils.java
> ----------------------------------------------------------------------
> diff --git a/server/src/com/cloud/api/ApiDBUtils.java
> b/server/src/com/cloud/api/ApiDBUtils.java
> index 8e950ab..83132c6 100755
> --- a/server/src/com/cloud/api/ApiDBUtils.java
> +++ b/server/src/com/cloud/api/ApiDBUtils.java
> @@ -83,8 +83,6 @@ import com.cloud.api.query.vo.StoragePoolJoinVO;
> import com.cloud.api.query.vo.UserAccountJoinVO;
> import com.cloud.api.query.vo.UserVmJoinVO;
> import com.cloud.api.query.vo.VolumeJoinVO;
> -import com.cloud.api.query.dao.*;
> -import com.cloud.api.query.vo.*;
> import com.cloud.async.AsyncJob;
> import com.cloud.async.AsyncJobManager;
> import com.cloud.async.AsyncJobVO;
> @@ -108,6 +106,7 @@ import com.cloud.host.Host;
> import com.cloud.host.HostStats;
> import com.cloud.host.HostVO;
> import com.cloud.host.dao.HostDao;
> +import com.cloud.host.dao.HostDetailsDao;
> import com.cloud.hypervisor.Hypervisor.HypervisorType;
> import com.cloud.network.IpAddress;
> import com.cloud.network.Network;
> @@ -156,10 +155,6 @@ import com.cloud.network.dao.Site2SiteCustomerGatewayDao;
> import com.cloud.network.dao.Site2SiteCustomerGatewayVO;
> import com.cloud.network.dao.Site2SiteVpnGatewayDao;
> import com.cloud.network.dao.Site2SiteVpnGatewayVO;
> -import com.cloud.network.*;
> -import com.cloud.network.as.*;
> -import com.cloud.network.as.dao.*;
> -import com.cloud.network.dao.*;
> import com.cloud.network.router.VirtualRouter;
> import com.cloud.network.rules.FirewallRuleVO;
> import com.cloud.network.security.SecurityGroup;
> @@ -313,6 +308,7 @@ public class ApiDBUtils {
>     static VpcOfferingDao _vpcOfferingDao;
>     static SnapshotPolicyDao _snapshotPolicyDao;
>     static AsyncJobDao _asyncJobDao;
> +    static HostDetailsDao _hostDetailsDao;
>
>     @Inject private ManagementServer ms;
>     @Inject public AsyncJobManager asyncMgr;
> @@ -410,6 +406,7 @@ public class ApiDBUtils {
>     @Inject private VpcOfferingDao vpcOfferingDao;
>     @Inject private SnapshotPolicyDao snapshotPolicyDao;
>     @Inject private AsyncJobDao asyncJobDao;
> +    @Inject private HostDetailsDao hostDetailsDao;
>
>     @PostConstruct
>     void init() {
> @@ -507,6 +504,7 @@ public class ApiDBUtils {
>         _vpcOfferingDao = vpcOfferingDao;
>         _snapshotPolicyDao = snapshotPolicyDao;
>         _asyncJobDao = asyncJobDao;
> +        _hostDetailsDao = hostDetailsDao;
>
>         // Note: stats collector should already have been initialized
> by this time, otherwise a null instance is returned
>         _statsCollector = StatsCollector.getInstance();
> @@ -1493,4 +1491,8 @@ public class ApiDBUtils {
>    public static DataCenterJoinVO newDataCenterView(DataCenter dc){
>        return _dcJoinDao.newDataCenterView(dc);
>    }
> +
> +   public static Map<String, String> findHostDetailsById(long hostId){
> +          return _hostDetailsDao.findDetails(hostId);
> +   }
> }
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/ApiResponseHelper.java
> ----------------------------------------------------------------------
> diff --git a/server/src/com/cloud/api/ApiResponseHelper.java
> b/server/src/com/cloud/api/ApiResponseHelper.java
> index 411de94..8c97615 100755
> --- a/server/src/com/cloud/api/ApiResponseHelper.java
> +++ b/server/src/com/cloud/api/ApiResponseHelper.java
> @@ -81,7 +81,9 @@ import
> org.apache.cloudstack.api.response.SystemVmInstanceResponse;
> import org.apache.cloudstack.api.response.SystemVmResponse;
> import org.apache.cloudstack.api.response.TemplatePermissionsResponse;
> import org.apache.cloudstack.api.response.TemplateResponse;
> +import org.apache.cloudstack.api.response.TrafficMonitorResponse;
> import org.apache.cloudstack.api.response.TrafficTypeResponse;
> +import org.apache.cloudstack.api.response.UsageRecordResponse;
> import org.apache.cloudstack.api.response.UserResponse;
> import org.apache.cloudstack.api.response.UserVmResponse;
> import org.apache.cloudstack.api.response.VirtualRouterProviderResponse;
> @@ -103,6 +105,7 @@ import com.cloud.configuration.Configuration;
> import com.cloud.configuration.Resource.ResourceOwnerType;
> import com.cloud.configuration.ResourceCount;
> import com.cloud.configuration.ResourceLimit;
> +import com.cloud.dao.EntityManager;
> import com.cloud.dc.*;
> import com.cloud.dc.Vlan.VlanType;
> import com.cloud.domain.Domain;
> @@ -139,6 +142,7 @@ import com.cloud.network.dao.PhysicalNetworkVO;
> import com.cloud.network.router.VirtualRouter;
> import com.cloud.network.rules.*;
> import com.cloud.network.security.SecurityGroup;
> +import com.cloud.network.security.SecurityGroupVO;
> import com.cloud.network.security.SecurityRule;
> import com.cloud.network.security.SecurityRule.SecurityRuleType;
> import com.cloud.network.vpc.PrivateGateway;
> @@ -148,6 +152,7 @@ import com.cloud.network.vpc.VpcOffering;
> import com.cloud.offering.DiskOffering;
> import com.cloud.offering.NetworkOffering;
> import com.cloud.offering.ServiceOffering;
> +import com.cloud.offerings.NetworkOfferingVO;
> import com.cloud.org.Cluster;
> import com.cloud.projects.Project;
> import com.cloud.projects.ProjectAccount;
> @@ -155,6 +160,7 @@ import com.cloud.projects.ProjectInvitation;
> import com.cloud.server.Criteria;
> import com.cloud.server.ResourceTag;
> import com.cloud.server.ResourceTag.TaggedResourceType;
> +import com.cloud.service.ServiceOfferingVO;
> import com.cloud.storage.*;
> import com.cloud.storage.Storage.ImageFormat;
> import com.cloud.storage.Storage.StoragePoolType;
> @@ -174,6 +180,7 @@ import com.cloud.utils.net.NetUtils;
> import com.cloud.vm.ConsoleProxyVO;
> import com.cloud.vm.InstanceGroup;
> import com.cloud.vm.NicProfile;
> +import com.cloud.vm.VMInstanceVO;
> import com.cloud.vm.VirtualMachine;
> import com.cloud.vm.VirtualMachine.Type;
> import org.apache.cloudstack.acl.ControlledEntity;
> @@ -185,11 +192,16 @@ import org.apache.cloudstack.api.ResponseGenerator;
> import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd;
> import org.apache.cloudstack.api.response.*;
> import org.apache.cloudstack.region.Region;
> +import org.apache.cloudstack.usage.Usage;
> +import org.apache.cloudstack.usage.UsageService;
> +import org.apache.cloudstack.usage.UsageTypes;
> import org.apache.log4j.Logger;
>
> import java.text.DecimalFormat;
> import java.util.*;
>
> +import javax.inject.Inject;
> +
> import static java.util.Collections.emptyList;
> import static java.util.Collections.singletonList;
>
> @@ -198,6 +210,8 @@ public class ApiResponseHelper implements
> ResponseGenerator {
>
>     public final Logger s_logger = Logger.getLogger(ApiResponseHelper.class);
>     private static final DecimalFormat s_percentFormat = new
> DecimalFormat("##.##");
> +    @Inject private EntityManager _entityMgr = null;
> +    @Inject private UsageService _usageSvc = null;
>
>     @Override
>     public UserResponse createUserResponse(User user) {
> @@ -3118,4 +3132,243 @@ public class ApiResponseHelper implements
> ResponseGenerator {
>         return response;
>     }
>
> +
> +
> +       @Override
> +       public UsageRecordResponse createUsageResponse(Usage usageRecord) {
> +               UsageRecordResponse usageRecResponse = new
> UsageRecordResponse();
> +
> +               Account account =
> ApiDBUtils.findAccountByIdIncludingRemoved(usageRecord.getAccountId());
> +               if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) {
> +                       //find the project
> +                       Project project =
> ApiDBUtils.findProjectByProjectAccountIdIncludingRemoved(account.getId());
> +                       usageRecResponse.setProjectId(project.getUuid());
> +                       usageRecResponse.setProjectName(project.getName());
> +               } else {
> +                       usageRecResponse.setAccountId(account.getUuid());
> +
> usageRecResponse.setAccountName(account.getAccountName());
> +               }
> +
> +               Domain domain =
> ApiDBUtils.findDomainById(usageRecord.getDomainId());
> +               if (domain != null) {
> +                       usageRecResponse.setDomainId(domain.getUuid());
> +               }
> +
> +               if (usageRecord.getZoneId() != null) {
> +                       DataCenter zone =
> ApiDBUtils.findZoneById(usageRecord.getZoneId());
> +                       if (zone != null) {
> +                               usageRecResponse.setZoneId(zone.getUuid());
> +                       }
> +               }
> +               usageRecResponse.setDescription(usageRecord.getDescription());
> +               usageRecResponse.setUsage(usageRecord.getUsageDisplay());
> +               usageRecResponse.setUsageType(usageRecord.getUsageType());
> +               if (usageRecord.getVmInstanceId() != null) {
> +                       VMInstanceVO vm =
> _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class,
> usageRecord.getVmInstanceId());
> +                       usageRecResponse.setVirtualMachineId(vm.getUuid());
> +               }
> +               usageRecResponse.setVmName(usageRecord.getVmName());
> +               if (usageRecord.getTemplateId() != null) {
> +                       VMTemplateVO template =
> ApiDBUtils.findTemplateById(usageRecord.getTemplateId());
> +                       if (template != null) {
> +
> usageRecResponse.setTemplateId(template.getUuid());
> +                       }
> +               }
> +
> +               if(usageRecord.getUsageType() == UsageTypes.RUNNING_VM
> || usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM){
> +                       ServiceOfferingVO svcOffering =
> _entityMgr.findByIdIncludingRemoved(ServiceOfferingVO.class,
> usageRecord.getOfferingId().toString());
> +                       //Service Offering Id
> +                       usageRecResponse.setOfferingId(svcOffering.getUuid());
> +                       //VM Instance ID
> +                       VMInstanceVO vm =
> _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class,
> usageRecord.getUsageId().toString());
> +                       usageRecResponse.setUsageId(vm.getUuid());
> +                       //Hypervisor Type
> +                       usageRecResponse.setType(usageRecord.getType());
> +
> +               } else if(usageRecord.getUsageType() == UsageTypes.IP_ADDRESS){
> +                       //isSourceNAT
> +
> usageRecResponse.setSourceNat((usageRecord.getType().equals("SourceNat"))?true:false);
> +                       //isSystem
> +
> usageRecResponse.setSystem((usageRecord.getSize() == 1)?true:false);
> +                       //IP Address ID
> +                       IPAddressVO ip =
> _entityMgr.findByIdIncludingRemoved(IPAddressVO.class,
> usageRecord.getUsageId().toString());
> +                       usageRecResponse.setUsageId(ip.getUuid());
> +
> +               } else if(usageRecord.getUsageType() ==
> UsageTypes.NETWORK_BYTES_SENT || usageRecord.getUsageType() ==
> UsageTypes.NETWORK_BYTES_RECEIVED){
> +                       //Device Type
> +                       usageRecResponse.setType(usageRecord.getType());
> +                       if(usageRecord.getType().equals("DomainRouter")){
> +                               //Domain Router Id
> +                               VMInstanceVO vm =
> _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class,
> usageRecord.getUsageId().toString());
> +                               usageRecResponse.setUsageId(vm.getUuid());
> +                       } else {
> +                               //External Device Host Id
> +                               HostVO host =
> _entityMgr.findByIdIncludingRemoved(HostVO.class,
> usageRecord.getUsageId().toString());
> +                               usageRecResponse.setUsageId(host.getUuid());
> +                       }
> +                       //Network ID
> +                       NetworkVO network =
> _entityMgr.findByIdIncludingRemoved(NetworkVO.class,
> usageRecord.getNetworkId().toString());
> +                       usageRecResponse.setNetworkId(network.getUuid());
> +
> +               } else if(usageRecord.getUsageType() == UsageTypes.VOLUME){
> +                       //Volume ID
> +                       VolumeVO volume =
> _entityMgr.findByIdIncludingRemoved(VolumeVO.class,
> usageRecord.getUsageId().toString());
> +                       usageRecResponse.setUsageId(volume.getUuid());
> +                       //Volume Size
> +                       usageRecResponse.setSize(usageRecord.getSize());
> +                       //Disk Offering Id
> +                       if(usageRecord.getOfferingId() != null){
> +                               DiskOfferingVO diskOff =
> _entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class,
> usageRecord.getOfferingId().toString());
> +
> usageRecResponse.setOfferingId(diskOff.getUuid());
> +                       }
> +
> +               } else if(usageRecord.getUsageType() ==
> UsageTypes.TEMPLATE || usageRecord.getUsageType() == UsageTypes.ISO){
> +                       //Template/ISO ID
> +                       VMTemplateVO tmpl =
> _entityMgr.findByIdIncludingRemoved(VMTemplateVO.class,
> usageRecord.getUsageId().toString());
> +                       usageRecResponse.setUsageId(tmpl.getUuid());
> +                       //Template/ISO Size
> +                       usageRecResponse.setSize(usageRecord.getSize());
> +
> +               } else if(usageRecord.getUsageType() == UsageTypes.SNAPSHOT){
> +                       //Snapshot ID
> +                       SnapshotVO snap =
> _entityMgr.findByIdIncludingRemoved(SnapshotVO.class,
> usageRecord.getUsageId().toString());
> +                       usageRecResponse.setUsageId(snap.getUuid());
> +                       //Snapshot Size
> +                       usageRecResponse.setSize(usageRecord.getSize());
> +
> +               } else if(usageRecord.getUsageType() ==
> UsageTypes.LOAD_BALANCER_POLICY){
> +                       //Load Balancer Policy ID
> +
> usageRecResponse.setUsageId(usageRecord.getUsageId().toString());
> +
> +               } else if(usageRecord.getUsageType() ==
> UsageTypes.PORT_FORWARDING_RULE){
> +                       //Port Forwarding Rule ID
> +
> usageRecResponse.setUsageId(usageRecord.getUsageId().toString());
> +
> +               } else if(usageRecord.getUsageType() ==
> UsageTypes.NETWORK_OFFERING){
> +                       //Network Offering Id
> +                       NetworkOfferingVO netOff =
> _entityMgr.findByIdIncludingRemoved(NetworkOfferingVO.class,
> usageRecord.getOfferingId().toString());
> +                       usageRecResponse.setOfferingId(netOff.getUuid());
> +                       //is Default
> +
> usageRecResponse.setDefault((usageRecord.getUsageId() == 1)?
> true:false);
> +
> +               } else if(usageRecord.getUsageType() == UsageTypes.VPN_USERS){
> +                       //VPN User ID
> +
> usageRecResponse.setUsageId(usageRecord.getUsageId().toString());
> +
> +               } else if(usageRecord.getUsageType() ==
> UsageTypes.SECURITY_GROUP){
> +                       //Security Group Id
> +                       SecurityGroupVO sg =
> _entityMgr.findByIdIncludingRemoved(SecurityGroupVO.class,
> usageRecord.getUsageId().toString());
> +                       usageRecResponse.setUsageId(sg.getUuid());
> +               }
> +
> +               if (usageRecord.getRawUsage() != null) {
> +                       DecimalFormat decimalFormat = new
> DecimalFormat("###########.######");
> +
> usageRecResponse.setRawUsage(decimalFormat.format(usageRecord.getRawUsage()));
> +               }
> +
> +               if (usageRecord.getStartDate() != null) {
> +
> usageRecResponse.setStartDate(getDateStringInternal(usageRecord.getStartDate()));
> +               }
> +               if (usageRecord.getEndDate() != null) {
> +
> usageRecResponse.setEndDate(getDateStringInternal(usageRecord.getEndDate()));
> +               }
> +
> +               return usageRecResponse;
> +       }
> +
> +
> +    public String getDateStringInternal(Date inputDate) {
> +        if (inputDate == null) return null;
> +
> +        TimeZone tz = _usageSvc.getUsageTimezone();
> +        Calendar cal = Calendar.getInstance(tz);
> +        cal.setTime(inputDate);
> +
> +        StringBuffer sb = new StringBuffer();
> +        sb.append(cal.get(Calendar.YEAR)+"-");
> +
> +        int month = cal.get(Calendar.MONTH) + 1;
> +        if (month < 10) {
> +            sb.append("0" + month + "-");
> +        } else {
> +            sb.append(month+"-");
> +        }
> +
> +        int day = cal.get(Calendar.DAY_OF_MONTH);
> +        if (day < 10) {
> +            sb.append("0" + day);
> +        } else {
> +            sb.append(""+day);
> +        }
> +
> +        sb.append("'T'");
> +
> +        int hour = cal.get(Calendar.HOUR_OF_DAY);
> +        if (hour < 10) {
> +            sb.append("0" + hour + ":");
> +        } else {
> +            sb.append(hour+":");
> +        }
> +
> +        int minute = cal.get(Calendar.MINUTE);
> +        if (minute < 10) {
> +            sb.append("0" + minute + ":");
> +        } else {
> +            sb.append(minute+":");
> +        }
> +
> +        int seconds = cal.get(Calendar.SECOND);
> +        if (seconds < 10) {
> +            sb.append("0" + seconds);
> +        } else {
> +            sb.append(""+seconds);
> +        }
> +
> +        double offset = cal.get(Calendar.ZONE_OFFSET);
> +        if (tz.inDaylightTime(inputDate)) {
> +            offset += (1.0*tz.getDSTSavings()); // add the timezone's
> DST value (typically 1 hour expressed in milliseconds)
> +        }
> +
> +        offset = offset / (1000d*60d*60d);
> +        int hourOffset = (int)offset;
> +        double decimalVal = Math.abs(offset) - Math.abs(hourOffset);
> +        int minuteOffset = (int)(decimalVal * 60);
> +
> +        if (hourOffset < 0) {
> +            if (hourOffset > -10) {
> +                sb.append("-0"+Math.abs(hourOffset));
> +            } else {
> +                sb.append("-"+Math.abs(hourOffset));
> +            }
> +        } else {
> +            if (hourOffset < 10) {
> +                sb.append("+0" + hourOffset);
> +            } else {
> +                sb.append("+" + hourOffset);
> +            }
> +        }
> +
> +        sb.append(":");
> +
> +        if (minuteOffset == 0) {
> +            sb.append("00");
> +        } else if (minuteOffset < 10) {
> +            sb.append("0" + minuteOffset);
> +        } else {
> +            sb.append("" + minuteOffset);
> +        }
> +
> +        return sb.toString();
> +    }
> +
> +    @Override
> +    public TrafficMonitorResponse createTrafficMonitorResponse(Host
> trafficMonitor) {
> +        Map<String, String> tmDetails =
> ApiDBUtils.findHostDetailsById(trafficMonitor.getId());
> +        TrafficMonitorResponse response = new TrafficMonitorResponse();
> +        response.setId(trafficMonitor.getUuid());
> +        response.setIpAddress(trafficMonitor.getPrivateIpAddress());
> +        response.setNumRetries(tmDetails.get("numRetries"));
> +        response.setTimeout(tmDetails.get("timeout"));
> +        return response;
> +    }
> }
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
> ----------------------------------------------------------------------
> diff --git a/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
> b/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
> deleted file mode 100644
> index 8728959..0000000
> --- a/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java
> +++ /dev/null
> @@ -1,109 +0,0 @@
> -// 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 com.cloud.api.commands;
> -
> -import javax.inject.Inject;
> -
> -import org.apache.cloudstack.api.APICommand;
> -import org.apache.cloudstack.api.ApiConstants;
> -import org.apache.cloudstack.api.ApiErrorCode;
> -import org.apache.cloudstack.api.BaseCmd;
> -import org.apache.cloudstack.api.Parameter;
> -import org.apache.cloudstack.api.ServerApiException;
> -import org.apache.cloudstack.api.response.TrafficMonitorResponse;
> -import org.apache.cloudstack.api.response.ZoneResponse;
> -import org.apache.log4j.Logger;
> -
> -import com.cloud.exception.InvalidParameterValueException;
> -import com.cloud.host.Host;
> -import com.cloud.network.NetworkUsageManager;
> -import com.cloud.user.Account;
> -import com.cloud.utils.exception.CloudRuntimeException;
> -
> -@APICommand(name = "addTrafficMonitor", description="Adds Traffic
> Monitor Host for Direct Network Usage", responseObject =
> TrafficMonitorResponse.class)
> -public class AddTrafficMonitorCmd extends BaseCmd {
> -    public static final Logger s_logger =
> Logger.getLogger(AddTrafficMonitorCmd.class.getName());
> -    private static final String s_name = "addtrafficmonitorresponse";
> -    @Inject NetworkUsageManager networkUsageMgr;
> -
> -    /////////////////////////////////////////////////////
> -    //////////////// API parameters /////////////////////
> -    /////////////////////////////////////////////////////
> -
> -    @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID,
> entityType = ZoneResponse.class,
> -            required = true, description="Zone in which to add the
> external firewall appliance.")
> -    private Long zoneId;
> -
> -    @Parameter(name=ApiConstants.URL, type=CommandType.STRING,
> required = true, description="URL of the traffic monitor Host")
> -    private String url;
> -
> -    @Parameter(name=ApiConstants.INCL_ZONES, type=CommandType.STRING,
> description="Traffic going into the listed zones will be metered")
> -    private String inclZones;
> -
> -    @Parameter(name=ApiConstants.EXCL_ZONES, type=CommandType.STRING,
> description="Traffic going into the listed zones will not be metered")
> -    private String exclZones;
> -
> -    ///////////////////////////////////////////////////
> -    /////////////////// Accessors ///////////////////////
> -    /////////////////////////////////////////////////////
> -
> -    public String getInclZones() {
> -        return inclZones;
> -    }
> -
> -    public String getExclZones() {
> -        return exclZones;
> -    }
> -
> -    public Long getZoneId() {
> -        return zoneId;
> -    }
> -
> -    public String getUrl() {
> -        return url;
> -    }
> -
> -    /////////////////////////////////////////////////////
> -    /////////////// API Implementation///////////////////
> -    /////////////////////////////////////////////////////
> -
> -    @Override
> -    public String getCommandName() {
> -        return s_name;
> -    }
> -
> -    @Override
> -    public long getEntityOwnerId() {
> -        return Account.ACCOUNT_ID_SYSTEM;
> -    }
> -
> -    @Override
> -    public void execute(){
> -        try {
> -            Host trafficMonitor = networkUsageMgr.addTrafficMonitor(this);
> -            TrafficMonitorResponse response =
> networkUsageMgr.getApiResponse(trafficMonitor);
> -            response.setObjectName("trafficmonitor");
> -            response.setResponseName(getCommandName());
> -            this.setResponseObject(response);
> -        } catch (InvalidParameterValueException ipve) {
> -                       throw new
> ServerApiException(ApiErrorCode.PARAM_ERROR, ipve.getMessage());
> -        } catch (CloudRuntimeException cre) {
> -                       throw new
> ServerApiException(ApiErrorCode.INTERNAL_ERROR, cre.getMessage());
> -        }
> -    }
> -}
> -
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
> ----------------------------------------------------------------------
> diff --git a/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
> b/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
> deleted file mode 100644
> index 081d0be..0000000
> --- a/server/src/com/cloud/api/commands/DeleteTrafficMonitorCmd.java
> +++ /dev/null
> @@ -1,86 +0,0 @@
> -// 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 com.cloud.api.commands;
> -
> -import javax.inject.Inject;
> -
> -import org.apache.cloudstack.api.APICommand;
> -import org.apache.cloudstack.api.ApiConstants;
> -import org.apache.cloudstack.api.ApiErrorCode;
> -import org.apache.cloudstack.api.BaseCmd;
> -import org.apache.cloudstack.api.Parameter;
> -import org.apache.cloudstack.api.ServerApiException;
> -import org.apache.cloudstack.api.response.HostResponse;
> -import org.apache.cloudstack.api.response.SuccessResponse;
> -import org.apache.log4j.Logger;
> -
> -import com.cloud.exception.InvalidParameterValueException;
> -import com.cloud.network.NetworkUsageManager;
> -import com.cloud.user.Account;
> -
> -@APICommand(name = "deleteTrafficMonitor", description="Deletes an
> traffic monitor host.", responseObject = SuccessResponse.class)
> -public class DeleteTrafficMonitorCmd extends BaseCmd {
> -    public static final Logger s_logger =
> Logger.getLogger(DeleteTrafficMonitorCmd.class.getName());
> -    private static final String s_name = "deletetrafficmonitorresponse";
> -    @Inject NetworkUsageManager _networkUsageMgr;
> -
> -    /////////////////////////////////////////////////////
> -    //////////////// API parameters /////////////////////
> -    /////////////////////////////////////////////////////
> -
> -    @Parameter(name=ApiConstants.ID, type=CommandType.UUID,
> entityType = HostResponse.class,
> -            required = true, description="Id of the Traffic Monitor Host.")
> -    private Long id;
> -
> -    ///////////////////////////////////////////////////
> -    /////////////////// Accessors ///////////////////////
> -    /////////////////////////////////////////////////////
> -
> -    public Long getId() {
> -        return id;
> -    }
> -
> -    /////////////////////////////////////////////////////
> -    /////////////// API Implementation///////////////////
> -    /////////////////////////////////////////////////////
> -
> -    @Override
> -    public String getCommandName() {
> -        return s_name;
> -    }
> -
> -    @Override
> -    public long getEntityOwnerId() {
> -        return Account.ACCOUNT_ID_SYSTEM;
> -    }
> -
> -    @Override
> -    public void execute(){
> -        try {
> -            boolean result = _networkUsageMgr.deleteTrafficMonitor(this);
> -            if (result) {
> -                SuccessResponse response = new
> SuccessResponse(getCommandName());
> -                response.setResponseName(getCommandName());
> -                this.setResponseObject(response);
> -            } else {
> -                               throw new
> ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete
> traffic monitor.");
> -            }
> -        } catch (InvalidParameterValueException e) {
> -                       throw new
> ServerApiException(ApiErrorCode.PARAM_ERROR, "Failed to delete traffic
> monitor.");
> -        }
> -    }
> -}
>
> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7970384f/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
> ----------------------------------------------------------------------
> diff --git a/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
> b/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
> deleted file mode 100644
> index 4206cf8..0000000
> --- a/server/src/com/cloud/api/commands/GenerateUsageRecordsCmd.java
> +++ /dev/null
> @@ -1,91 +0,0 @@
> -// 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 com.cloud.api.commands;
> -
> -import java.util.Date;
> -
> -import org.apache.cloudstack.api.*;
> -import org.apache.cloudstack.api.response.DomainResponse;
> -import org.apache.log4j.Logger;
> -
> -import org.apache.cloudstack.api.APICommand;
> -import org.apache.cloudstack.api.response.SuccessResponse;
> -import com.cloud.server.ManagementServerExt;
> -import com.cloud.user.Account;
> -
> -@APICommand(name = "generateUsageRecords", description="Generates
> usage records. This will generate records only if there any records to
> be generated, i.e if the scheduled usage job was not run or failed",
> responseObject=SuccessResponse.class)
> -public class GenerateUsageRecordsCmd extends BaseCmd {
> -    public static final Logger s_logger =
> Logger.getLogger(GenerateUsageRecordsCmd.class.getName());
> -
> -    private static final String s_name = "generateusagerecordsresponse";
> -
> -    /////////////////////////////////////////////////////
> -    //////////////// API parameters /////////////////////
> -    /////////////////////////////////////////////////////
> -
> -    @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.UUID,
> entityType = DomainResponse.class,
> -            description="List events for the specified domain.")
> -    private Long domainId;
> -
> -    @Parameter(name=ApiConstants.END_DATE, type=CommandType.DATE,
> required=true, description="End date range for usage record query. Use
> yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.")
> -    private Date endDate;
> -
> -    @Parameter(name=ApiConstants.START_DATE, type=CommandType.DATE,
> required=true, description="Start date range for usage record query.
> Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.")
> -    private Date startDate;
> -
> -    /////////////////////////////////////////////////////
> -    /////////////////// Accessors ///////////////////////
> -    /////////////////////////////////////////////////////
> -
> -    public Long getDomainId() {
> -        return domainId;
> -    }
> -
> -    public Date getEndDate() {
> -        return endDate;
> -    }
> -
> -    public Date getStartDate() {
> -        return startDate;
> -    }
> -
> -    /////////////////////////////////////////////////////
> -    /////////////// API Implementation///////////////////
> -    /////////////////////////////////////////////////////
> -
> -    @Override
> -    public String getCommandName() {
> -        return s_name;
> -    }
> -
> -    @Override
> -    public long getEntityOwnerId() {
> -        return Account.ACCOUNT_ID_SYSTEM;
> -    }
> -
> -    @Override
> -    public void execute(){
> -        ManagementServerExt _mgrExt = (ManagementServerExt)_mgr;
> -        boolean result = _mgrExt.generateUsageRecords(this);
> -        if (result) {
> -            SuccessResponse response = new SuccessResponse(getCommandName());
> -            this.setResponseObject(response);
> -        } else {
> -            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
> "Failed to generate usage records");
> -        }
> -    }
> -}