cloudstack-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Kishan Kavala <Kishan.Kav...@citrix.com>
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
Date Wed, 06 Feb 2013 12:46:27 GMT
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 <Kishan.Kavala@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" <chip.childers@sungard.com>
> wrote:
> >
> >> Hey Kishan,
> >>
> >> Was this refactoring needed as part of 4.1?
> >>
> >>
> >> ---------- Forwarded message ----------
> >> From:  <kishan@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 <kishan@cloud.com>
> >> Authored: Tue Feb 5 16:43:18 2013 +0530
> >> Committer: Kishan Kavala <kishan@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");
> >> -        }
> >> -    }
> >> -}
> >

Mime
View raw message