cloudstack-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Chip Childers <chip.child...@sungard.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 Tue, 05 Feb 2013 15:50:22 GMT
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/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");
>> -        }
>> -    }
>> -}
>

Mime
View raw message