You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mc...@apache.org on 2013/02/06 06:45:20 UTC

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

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/server/src/com/cloud/api/commands/GetUsageRecordsCmd.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/commands/GetUsageRecordsCmd.java b/server/src/com/cloud/api/commands/GetUsageRecordsCmd.java
deleted file mode 100644
index 7f96b0c..0000000
--- a/server/src/com/cloud/api/commands/GetUsageRecordsCmd.java
+++ /dev/null
@@ -1,370 +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.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.TimeZone;
-
-import org.apache.cloudstack.api.response.AccountResponse;
-import org.apache.cloudstack.api.response.DomainResponse;
-import org.apache.cloudstack.api.response.ProjectResponse;
-import org.apache.log4j.Logger;
-
-import org.apache.cloudstack.api.ApiConstants;
-import com.cloud.api.ApiDBUtils;
-import com.cloud.dc.DataCenter;
-import com.cloud.domain.Domain;
-
-import org.apache.cloudstack.api.BaseListCmd;
-import org.apache.cloudstack.api.APICommand;
-import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.response.ListResponse;
-import com.cloud.projects.Project;
-import com.cloud.server.ManagementServerExt;
-import org.apache.cloudstack.api.response.UsageRecordResponse;
-import com.cloud.storage.VMTemplateVO;
-import com.cloud.usage.UsageTypes;
-import com.cloud.usage.UsageVO;
-import com.cloud.user.Account;
-import com.cloud.uuididentity.dao.IdentityDao;
-import com.cloud.uuididentity.dao.IdentityDaoImpl;
-import com.cloud.vm.VMInstanceVO;
-
-@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;
-    }
-
-    /////////////////////////////////////////////////////
-    ///////////////  Misc parameters  ///////////////////
-    /////////////////////////////////////////////////////
-
-    private TimeZone usageTimezone;
-
-    public TimeZone getUsageTimezone() {
-        return usageTimezone;
-    }
-
-    public void setUsageTimezone(TimeZone tz) {
-        this.usageTimezone = tz;
-    }
-
-    /////////////////////////////////////////////////////
-    /////////////// API Implementation///////////////////
-    /////////////////////////////////////////////////////
-
-    @Override
-    public String getCommandName() {
-        return s_name;
-    }
-
-    public String getDateStringInternal(Date inputDate) {
-        if (inputDate == null) return null;
-
-        TimeZone tz = 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 void execute(){
-        ManagementServerExt _mgrExt = (ManagementServerExt)_mgr;
-        List<UsageVO> usageRecords = _mgrExt.getUsageRecords(this);
-        IdentityDao identityDao = new IdentityDaoImpl();
-        ListResponse<UsageRecordResponse> response = new ListResponse<UsageRecordResponse>();
-        List<UsageRecordResponse> usageResponses = new ArrayList<UsageRecordResponse>();
-        for (Object usageRecordGeneric : usageRecords) {
-            UsageRecordResponse usageRecResponse = new UsageRecordResponse();
-            if (usageRecordGeneric instanceof UsageVO) {
-                UsageVO usageRecord = (UsageVO)usageRecordGeneric;
-
-                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 = ApiDBUtils.findVMInstanceById(usageRecord.getVmInstanceId());
-                    if (vm != null) {
-                        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){
-                	//Service Offering Id
-                	usageRecResponse.setOfferingId(identityDao.getIdentityUuid("disk_offering", usageRecord.getOfferingId().toString()));
-                	//VM Instance ID
-                	usageRecResponse.setUsageId(identityDao.getIdentityUuid("vm_instance", usageRecord.getUsageId().toString()));
-                	//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
-                    usageRecResponse.setUsageId(identityDao.getIdentityUuid("user_ip_address", usageRecord.getUsageId().toString()));
-
-                } 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
-                        usageRecResponse.setUsageId(identityDao.getIdentityUuid("vm_instance", usageRecord.getUsageId().toString()));
-                	} else {
-                		//External Device Host Id
-                		usageRecResponse.setUsageId(identityDao.getIdentityUuid("host", usageRecord.getUsageId().toString()));
-                	}
-                    //Network ID
-                    usageRecResponse.setNetworkId(identityDao.getIdentityUuid("networks", usageRecord.getNetworkId().toString()));
-
-                } else if(usageRecord.getUsageType() == UsageTypes.VOLUME){
-                    //Volume ID
-                    usageRecResponse.setUsageId(identityDao.getIdentityUuid("volumes", usageRecord.getUsageId().toString()));
-                    //Volume Size
-                    usageRecResponse.setSize(usageRecord.getSize());
-                	//Disk Offering Id
-                    if(usageRecord.getOfferingId() != null){
-                    	usageRecResponse.setOfferingId(identityDao.getIdentityUuid("disk_offering", usageRecord.getOfferingId().toString()));
-                    }
-
-                } else if(usageRecord.getUsageType() == UsageTypes.TEMPLATE || usageRecord.getUsageType() == UsageTypes.ISO){
-                    //Template/ISO ID
-                    usageRecResponse.setUsageId(identityDao.getIdentityUuid("vm_template", usageRecord.getUsageId().toString()));
-                    //Template/ISO Size
-                    usageRecResponse.setSize(usageRecord.getSize());
-
-                } else if(usageRecord.getUsageType() == UsageTypes.SNAPSHOT){
-                    //Snapshot ID
-                    usageRecResponse.setUsageId(identityDao.getIdentityUuid("snapshots", usageRecord.getUsageId().toString()));
-                    //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
-                	usageRecResponse.setOfferingId(identityDao.getIdentityUuid("network_offerings", usageRecord.getOfferingId().toString()));
-                	//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
-                	usageRecResponse.setUsageId(identityDao.getIdentityUuid("security_group", usageRecord.getUsageId().toString()));
-                }
-
-                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()));
-                }
-            }
-
-            usageRecResponse.setObjectName("usagerecord");
-            usageResponses.add(usageRecResponse);
-        }
-
-        response.setResponses(usageResponses);
-        response.setResponseName(getCommandName());
-        this.setResponseObject(response);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/server/src/com/cloud/api/commands/ListTrafficMonitorsCmd.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/commands/ListTrafficMonitorsCmd.java b/server/src/com/cloud/api/commands/ListTrafficMonitorsCmd.java
deleted file mode 100644
index 645bf3b..0000000
--- a/server/src/com/cloud/api/commands/ListTrafficMonitorsCmd.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 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;
-import com.cloud.network.NetworkUsageManager;
-
-
-@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";
-
-    @Inject NetworkUsageManager networkUsageMgr;
-    /////////////////////////////////////////////////////
-    //////////////// 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 = networkUsageMgr.listTrafficMonitors(this);
-
-        ListResponse<TrafficMonitorResponse> listResponse = new ListResponse<TrafficMonitorResponse>();
-        List<TrafficMonitorResponse> responses = new ArrayList<TrafficMonitorResponse>();
-        for (Host trafficMonitor : trafficMonitors) {
-            TrafficMonitorResponse response = networkUsageMgr.getApiResponse(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/fc0bf21a/server/src/com/cloud/api/commands/ListUsageTypesCmd.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/commands/ListUsageTypesCmd.java b/server/src/com/cloud/api/commands/ListUsageTypesCmd.java
deleted file mode 100644
index dfa5dc1..0000000
--- a/server/src/com/cloud/api/commands/ListUsageTypesCmd.java
+++ /dev/null
@@ -1,53 +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.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 com.cloud.server.ManagementServerExt;
-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() {
-    	ManagementServerExt _mgrExt = (ManagementServerExt)_mgr;
-        List<UsageTypeResponse> result = _mgrExt.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/fc0bf21a/server/src/com/cloud/dao/EntityManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/dao/EntityManagerImpl.java b/server/src/com/cloud/dao/EntityManagerImpl.java
index a768588..a3ab5b3 100644
--- a/server/src/com/cloud/dao/EntityManagerImpl.java
+++ b/server/src/com/cloud/dao/EntityManagerImpl.java
@@ -27,7 +27,6 @@ import org.springframework.stereotype.Component;
 
 import net.sf.ehcache.Cache;
 
-import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.db.GenericDaoBase;
@@ -47,6 +46,12 @@ public class EntityManagerImpl extends ManagerBase implements EntityManager {
         GenericDao<? extends T, K> dao = (GenericDao<? extends T, K>)GenericDaoBase.getDao(entityType);
         return dao.findById(id);
     }
+    
+    @Override
+    public <T, K extends Serializable> T findByIdIncludingRemoved(Class<T> entityType, K id) {
+        GenericDao<? extends T, K> dao = (GenericDao<? extends T, K>)GenericDaoBase.getDao(entityType);
+        return dao.findByIdIncludingRemoved(id);
+    }
 
     @Override
     public <T> T findByUuid(Class<T> entityType, String uuid) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/server/src/com/cloud/network/NetworkUsageManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkUsageManager.java b/server/src/com/cloud/network/NetworkUsageManager.java
index 1f0638b..86bec55 100644
--- a/server/src/com/cloud/network/NetworkUsageManager.java
+++ b/server/src/com/cloud/network/NetworkUsageManager.java
@@ -18,26 +18,12 @@ package com.cloud.network;
 
 import java.util.List;
 
-import com.cloud.api.commands.AddTrafficMonitorCmd;
-import com.cloud.api.commands.DeleteTrafficMonitorCmd;
-import com.cloud.api.commands.ListTrafficMonitorsCmd;
-import com.cloud.host.Host;
-import com.cloud.host.HostVO;
 import com.cloud.network.dao.IPAddressVO;
 
-import org.apache.cloudstack.api.response.TrafficMonitorResponse;
 import com.cloud.utils.component.Manager;
 
 public interface NetworkUsageManager extends Manager {
 
-    Host addTrafficMonitor(AddTrafficMonitorCmd cmd);
-
-    TrafficMonitorResponse getApiResponse(Host trafficMonitor);
-
-    boolean deleteTrafficMonitor(DeleteTrafficMonitorCmd cmd);
-
-    List<HostVO> listTrafficMonitors(ListTrafficMonitorsCmd cmd);
-
     List<IPAddressVO> listAllocatedDirectIps(long zoneId);
 		
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/server/src/com/cloud/network/NetworkUsageManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkUsageManagerImpl.java b/server/src/com/cloud/network/NetworkUsageManagerImpl.java
index e148e2c..80f898b 100755
--- a/server/src/com/cloud/network/NetworkUsageManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkUsageManagerImpl.java
@@ -44,9 +44,6 @@ import com.cloud.agent.api.RecurringNetworkUsageCommand;
 import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.StartupTrafficMonitorCommand;
 import com.cloud.agent.manager.Commands;
-import com.cloud.api.commands.AddTrafficMonitorCmd;
-import com.cloud.api.commands.DeleteTrafficMonitorCmd;
-import com.cloud.api.commands.ListTrafficMonitorsCmd;
 import com.cloud.configuration.Config;
 import com.cloud.configuration.dao.ConfigurationDao;
 import com.cloud.dc.DataCenterVO;
@@ -71,6 +68,10 @@ import com.cloud.resource.ResourceManager;
 import com.cloud.resource.ResourceStateAdapter;
 import com.cloud.resource.ServerResource;
 import com.cloud.resource.UnableDeleteHostException;
+
+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.usage.UsageIPAddressVO;
 import com.cloud.user.AccountManager;
@@ -93,7 +94,7 @@ import com.cloud.utils.net.MacAddress;
 
 @Component
 @Local(value = {NetworkUsageManager.class})
-public class NetworkUsageManagerImpl extends ManagerBase implements NetworkUsageManager, ResourceStateAdapter {
+public class NetworkUsageManagerImpl extends ManagerBase implements NetworkUsageService, NetworkUsageManager, ResourceStateAdapter {
     public enum NetworkUsageResourceName {
         TrafficSentinel;
     }
@@ -212,17 +213,6 @@ public class NetworkUsageManagerImpl extends ManagerBase implements NetworkUsage
     }
 
     @Override
-    public TrafficMonitorResponse getApiResponse(Host trafficMonitor) {
-        Map<String, String> tmDetails = _detailsDao.findDetails(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;
-    }
-
-    @Override
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
         AllocatedIpSearch = _ipAddressDao.createSearchBuilder();
         AllocatedIpSearch.and("allocated", AllocatedIpSearch.entity().getAllocatedTime(), Op.NNULL);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/server/src/com/cloud/server/ManagementServerExt.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerExt.java b/server/src/com/cloud/server/ManagementServerExt.java
deleted file mode 100644
index 4e506a3..0000000
--- a/server/src/com/cloud/server/ManagementServerExt.java
+++ /dev/null
@@ -1,63 +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.server;
-
-import java.util.List;
-import java.util.TimeZone;
-
-import com.cloud.api.commands.GenerateUsageRecordsCmd;
-import com.cloud.api.commands.GetUsageRecordsCmd;
-import org.apache.cloudstack.api.response.UsageTypeResponse;
-import com.cloud.usage.UsageVO;
-public interface ManagementServerExt extends ManagementServer {
-    /**
-     * 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<UsageVO> 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/fc0bf21a/server/src/com/cloud/server/ManagementServerExtImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerExtImpl.java b/server/src/com/cloud/server/ManagementServerExtImpl.java
deleted file mode 100644
index 52ad3df..0000000
--- a/server/src/com/cloud/server/ManagementServerExtImpl.java
+++ /dev/null
@@ -1,254 +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.server;
-
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-
-import com.cloud.api.commands.GenerateUsageRecordsCmd;
-import com.cloud.api.commands.GetUsageRecordsCmd;
-import com.cloud.domain.dao.DomainDao;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.exception.PermissionDeniedException;
-import com.cloud.projects.Project;
-import org.apache.cloudstack.api.response.UsageTypeResponse;
-
-import com.cloud.usage.UsageJobVO;
-import com.cloud.usage.UsageTypes;
-import com.cloud.usage.UsageVO;
-import com.cloud.usage.dao.UsageDao;
-import com.cloud.usage.dao.UsageJobDao;
-import com.cloud.user.Account;
-import com.cloud.user.AccountVO;
-import com.cloud.user.UserContext;
-import com.cloud.user.dao.AccountDao;
-import com.cloud.utils.db.Filter;
-import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
-
-public class ManagementServerExtImpl extends ManagementServerImpl implements ManagementServerExt {
-    @Inject private AccountDao _accountDao;
-    @Inject private DomainDao _domainDao;
-    @Inject private UsageDao _usageDao;
-    @Inject private UsageJobDao _usageJobDao;
-    private TimeZone _usageTimezone;
-
-    public ManagementServerExtImpl() {
-    }
-    
-    @Override
-    public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
-    	super.configure(name,  params);
-        Map<String, String> configs = getConfigs();
-        String timeZoneStr = configs.get("usage.aggregation.timezone");
-        if (timeZoneStr == null) {
-           timeZoneStr = "GMT";
-        }
-        _usageTimezone = TimeZone.getTimeZone(timeZoneStr);
-        return true;
-    }
-
-    @Override
-    public boolean generateUsageRecords(GenerateUsageRecordsCmd cmd) {
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
-        try {
-            UsageJobVO immediateJob = _usageJobDao.getNextImmediateJob();
-            if (immediateJob == null) {
-                UsageJobVO job = _usageJobDao.getLastJob();
-
-                String host = null;
-                int pid = 0;
-                if (job != null) {
-                    host = job.getHost();
-                    pid = ((job.getPid() == null) ? 0 : job.getPid().intValue());
-                }
-                _usageJobDao.createNewJob(host, pid, UsageJobVO.JOB_TYPE_SINGLE);
-            }
-        } finally {
-            txn.close();
-
-            // switch back to VMOPS_DB
-            Transaction swap = Transaction.open(Transaction.CLOUD_DB);
-            swap.close();
-        }
-        return true;
-    }
-
-    @Override
-    public List<UsageVO> getUsageRecords(GetUsageRecordsCmd cmd) {
-        Long accountId = cmd.getAccountId();
-        Long domainId = cmd.getDomainId();
-        String accountName = cmd.getAccountName();
-        Account userAccount = null;
-        Account caller = (Account)UserContext.current().getCaller();
-        Long usageType = cmd.getUsageType();
-        Long projectId = cmd.getProjectId();
-        
-        if (projectId != null) {
-            if (accountId != null) {
-                throw new InvalidParameterValueException("Projectid and accountId can't be specified together");
-            }
-            Project project = _projectMgr.getProject(projectId);
-            if (project == null) {
-                throw new InvalidParameterValueException("Unable to find project by id " + projectId);
-            }
-            accountId = project.getProjectAccountId();
-        }
-        
-        //if accountId is not specified, use accountName and domainId
-        if ((accountId == null) && (accountName != null) && (domainId != null)) {
-            if (_domainDao.isChildDomain(caller.getDomainId(), domainId)) {
-                Filter filter = new Filter(AccountVO.class, "id", Boolean.FALSE, null, null);
-                List<AccountVO> accounts = _accountDao.listAccounts(accountName, domainId, filter); 
-                if(accounts.size() > 0){
-                    userAccount = accounts.get(0);
-                }
-                if (userAccount != null) {
-                    accountId = userAccount.getId();
-                } else {
-                    throw new InvalidParameterValueException("Unable to find account " + accountName + " in domain " + domainId);
-                }
-            } else {
-                throw new PermissionDeniedException("Invalid Domain Id or Account");
-            }
-        } 
-
-        boolean isAdmin = false;
-        
-        //If accountId couldn't be found using accountName and domainId, get it from userContext
-        if(accountId == null){
-            accountId = caller.getId();
-            //List records for all the accounts if the caller account is of type admin. 
-            //If account_id or account_name is explicitly mentioned, list records for the specified account only even if the caller is of type admin
-            if(caller.getType() == Account.ACCOUNT_TYPE_ADMIN){
-                isAdmin = true;
-            }
-            s_logger.debug("Account details not available. Using userContext accountId: " + accountId);
-        }
-
-        Date startDate = cmd.getStartDate();
-        Date endDate = cmd.getEndDate();
-        if(startDate.after(endDate)){
-        	throw new InvalidParameterValueException("Incorrect Date Range. Start date: "+startDate+" is after end date:"+endDate);
-        }
-        TimeZone usageTZ = getUsageTimezone();
-        Date adjustedStartDate = computeAdjustedTime(startDate, usageTZ, true);
-        Date adjustedEndDate = computeAdjustedTime(endDate, usageTZ, false);
-
-        if (s_logger.isDebugEnabled()) {
-            s_logger.debug("getting usage records for account: " + accountId + ", domainId: " + domainId + ", between " + startDate + " and " + endDate + ", using pageSize: " + cmd.getPageSizeVal() + " and startIndex: " + cmd.getStartIndex());
-        }
-
-        Filter usageFilter = new Filter(UsageVO.class, "startDate", false, cmd.getStartIndex(), cmd.getPageSizeVal());
-        
-        SearchCriteria<UsageVO> sc = _usageDao.createSearchCriteria();
-
-        if (accountId != -1 && accountId != Account.ACCOUNT_ID_SYSTEM && !isAdmin) {
-            sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId);
-        }
-
-        if (domainId != null) {
-            sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId);
-        }
-        
-        if (usageType != null) {
-            sc.addAnd("usageType", SearchCriteria.Op.EQ, usageType);
-        }
-
-        if ((adjustedStartDate != null) && (adjustedEndDate != null) && adjustedStartDate.before(adjustedEndDate)) {
-            sc.addAnd("startDate", SearchCriteria.Op.BETWEEN, adjustedStartDate, adjustedEndDate);
-            sc.addAnd("endDate", SearchCriteria.Op.BETWEEN, adjustedStartDate, adjustedEndDate);
-        } else {
-            return new ArrayList<UsageVO>(); // return an empty list if we fail to validate the dates
-        }
-
-        List<UsageVO> usageRecords = null;
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
-        try {
-            usageRecords = _usageDao.searchAllRecords(sc, usageFilter);
-        } finally {
-            txn.close();
-
-            // switch back to VMOPS_DB
-            Transaction swap = Transaction.open(Transaction.CLOUD_DB);
-            swap.close();
-        }
-
-        // now that we are done with the records, update the command with the correct timezone so it can write the proper response
-        cmd.setUsageTimezone(getUsageTimezone());
-
-        return usageRecords;
-    }
-
-    @Override
-    public TimeZone getUsageTimezone() {
-        return _usageTimezone;
-    }
-
-    @Override
-    public List<Class<?>> getCommands() {
-        //TODO: Add api cmd classes
-        return null;
-    }
-
-    private Date computeAdjustedTime(Date initialDate, TimeZone targetTZ, boolean adjustToDayStart) {
-        Calendar cal = Calendar.getInstance();
-        cal.setTime(initialDate);
-        TimeZone localTZ = cal.getTimeZone();
-        int timezoneOffset = cal.get(Calendar.ZONE_OFFSET);
-        if (localTZ.inDaylightTime(initialDate)) {
-            timezoneOffset += (60 * 60 * 1000);
-        }
-        cal.add(Calendar.MILLISECOND, timezoneOffset);
-
-        Date newTime = cal.getTime();
-
-        Calendar calTS = Calendar.getInstance(targetTZ);
-        calTS.setTime(newTime);
-        timezoneOffset = calTS.get(Calendar.ZONE_OFFSET);
-        if (targetTZ.inDaylightTime(initialDate)) {
-            timezoneOffset += (60 * 60 * 1000);
-        }
-
-        calTS.add(Calendar.MILLISECOND, -1*timezoneOffset);
-        if (adjustToDayStart) {
-            calTS.set(Calendar.HOUR_OF_DAY, 0);
-            calTS.set(Calendar.MINUTE, 0);
-            calTS.set(Calendar.SECOND, 0);
-            calTS.set(Calendar.MILLISECOND, 0);
-        } else {
-            calTS.set(Calendar.HOUR_OF_DAY, 23);
-            calTS.set(Calendar.MINUTE, 59);
-            calTS.set(Calendar.SECOND, 59);
-            calTS.set(Calendar.MILLISECOND, 999);
-        }
-
-        return calTS.getTime();
-    }
-
-	@Override
-	public List<UsageTypeResponse> listUsageTypes() {
-		return UsageTypes.listUsageTypes();
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/server/src/com/cloud/usage/UsageServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/usage/UsageServiceImpl.java b/server/src/com/cloud/usage/UsageServiceImpl.java
new file mode 100755
index 0000000..ae0a585
--- /dev/null
+++ b/server/src/com/cloud/usage/UsageServiceImpl.java
@@ -0,0 +1,261 @@
+// 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.usage;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+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;
+import org.apache.cloudstack.usage.UsageService;
+import org.apache.cloudstack.usage.UsageTypes;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import com.cloud.configuration.Config;
+import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.domain.dao.DomainDao;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.projects.Project;
+import com.cloud.projects.ProjectManager;
+import com.cloud.usage.dao.UsageDao;
+import com.cloud.usage.dao.UsageJobDao;
+import com.cloud.user.Account;
+import com.cloud.user.AccountVO;
+import com.cloud.user.UserContext;
+import com.cloud.user.dao.AccountDao;
+import com.cloud.utils.component.Manager;
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.utils.db.Filter;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.Transaction;
+
+@Component
+@Local(value = { UsageService.class })
+public class UsageServiceImpl extends ManagerBase implements UsageService, Manager {
+    public static final Logger s_logger = Logger.getLogger(UsageServiceImpl.class);
+    
+    //ToDo: Move implementation to ManagaerImpl
+    
+    @Inject private AccountDao _accountDao;
+    @Inject private DomainDao _domainDao;
+    @Inject private UsageDao _usageDao;
+    @Inject private UsageJobDao _usageJobDao;
+    @Inject private ConfigurationDao _configDao;
+    @Inject private ProjectManager _projectMgr;
+    private TimeZone _usageTimezone;
+
+    public UsageServiceImpl() {
+    }
+    
+    @Override
+    public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+    	super.configure(name,  params);
+        String timeZoneStr = _configDao.getValue(Config.UsageAggregationTimezone.toString());
+        if (timeZoneStr == null) {
+           timeZoneStr = "GMT";
+        }
+        _usageTimezone = TimeZone.getTimeZone(timeZoneStr);
+        return true;
+    }
+
+    @Override
+    public boolean generateUsageRecords(GenerateUsageRecordsCmd cmd) {
+        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        try {
+            UsageJobVO immediateJob = _usageJobDao.getNextImmediateJob();
+            if (immediateJob == null) {
+                UsageJobVO job = _usageJobDao.getLastJob();
+
+                String host = null;
+                int pid = 0;
+                if (job != null) {
+                    host = job.getHost();
+                    pid = ((job.getPid() == null) ? 0 : job.getPid().intValue());
+                }
+                _usageJobDao.createNewJob(host, pid, UsageJobVO.JOB_TYPE_SINGLE);
+            }
+        } finally {
+            txn.close();
+
+            // switch back to VMOPS_DB
+            Transaction swap = Transaction.open(Transaction.CLOUD_DB);
+            swap.close();
+        }
+        return true;
+    }
+
+    @Override
+    public List<UsageVO> getUsageRecords(GetUsageRecordsCmd cmd) {
+        Long accountId = cmd.getAccountId();
+        Long domainId = cmd.getDomainId();
+        String accountName = cmd.getAccountName();
+        Account userAccount = null;
+        Account caller = (Account)UserContext.current().getCaller();
+        Long usageType = cmd.getUsageType();
+        Long projectId = cmd.getProjectId();
+        
+        if (projectId != null) {
+            if (accountId != null) {
+                throw new InvalidParameterValueException("Projectid and accountId can't be specified together");
+            }
+            Project project = _projectMgr.getProject(projectId);
+            if (project == null) {
+                throw new InvalidParameterValueException("Unable to find project by id " + projectId);
+            }
+            accountId = project.getProjectAccountId();
+        }
+        
+        //if accountId is not specified, use accountName and domainId
+        if ((accountId == null) && (accountName != null) && (domainId != null)) {
+            if (_domainDao.isChildDomain(caller.getDomainId(), domainId)) {
+                Filter filter = new Filter(AccountVO.class, "id", Boolean.FALSE, null, null);
+                List<AccountVO> accounts = _accountDao.listAccounts(accountName, domainId, filter); 
+                if(accounts.size() > 0){
+                    userAccount = accounts.get(0);
+                }
+                if (userAccount != null) {
+                    accountId = userAccount.getId();
+                } else {
+                    throw new InvalidParameterValueException("Unable to find account " + accountName + " in domain " + domainId);
+                }
+            } else {
+                throw new PermissionDeniedException("Invalid Domain Id or Account");
+            }
+        } 
+
+        boolean isAdmin = false;
+        
+        //If accountId couldn't be found using accountName and domainId, get it from userContext
+        if(accountId == null){
+            accountId = caller.getId();
+            //List records for all the accounts if the caller account is of type admin. 
+            //If account_id or account_name is explicitly mentioned, list records for the specified account only even if the caller is of type admin
+            if(caller.getType() == Account.ACCOUNT_TYPE_ADMIN){
+                isAdmin = true;
+            }
+            s_logger.debug("Account details not available. Using userContext accountId: " + accountId);
+        }
+
+        Date startDate = cmd.getStartDate();
+        Date endDate = cmd.getEndDate();
+        if(startDate.after(endDate)){
+        	throw new InvalidParameterValueException("Incorrect Date Range. Start date: "+startDate+" is after end date:"+endDate);
+        }
+        TimeZone usageTZ = getUsageTimezone();
+        Date adjustedStartDate = computeAdjustedTime(startDate, usageTZ, true);
+        Date adjustedEndDate = computeAdjustedTime(endDate, usageTZ, false);
+
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("getting usage records for account: " + accountId + ", domainId: " + domainId + ", between " + startDate + " and " + endDate + ", using pageSize: " + cmd.getPageSizeVal() + " and startIndex: " + cmd.getStartIndex());
+        }
+
+        Filter usageFilter = new Filter(UsageVO.class, "startDate", false, cmd.getStartIndex(), cmd.getPageSizeVal());
+        
+        SearchCriteria<UsageVO> sc = _usageDao.createSearchCriteria();
+
+        if (accountId != -1 && accountId != Account.ACCOUNT_ID_SYSTEM && !isAdmin) {
+            sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId);
+        }
+
+        if (domainId != null) {
+            sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId);
+        }
+        
+        if (usageType != null) {
+            sc.addAnd("usageType", SearchCriteria.Op.EQ, usageType);
+        }
+
+        if ((adjustedStartDate != null) && (adjustedEndDate != null) && adjustedStartDate.before(adjustedEndDate)) {
+            sc.addAnd("startDate", SearchCriteria.Op.BETWEEN, adjustedStartDate, adjustedEndDate);
+            sc.addAnd("endDate", SearchCriteria.Op.BETWEEN, adjustedStartDate, adjustedEndDate);
+        } else {
+            return new ArrayList<UsageVO>(); // return an empty list if we fail to validate the dates
+        }
+
+        List<UsageVO> usageRecords = null;
+        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        try {
+            usageRecords = _usageDao.searchAllRecords(sc, usageFilter);
+        } finally {
+            txn.close();
+
+            // switch back to VMOPS_DB
+            Transaction swap = Transaction.open(Transaction.CLOUD_DB);
+            swap.close();
+        }
+
+        return usageRecords;
+    }
+
+    @Override
+    public TimeZone getUsageTimezone() {
+        return _usageTimezone;
+    }
+
+    private Date computeAdjustedTime(Date initialDate, TimeZone targetTZ, boolean adjustToDayStart) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(initialDate);
+        TimeZone localTZ = cal.getTimeZone();
+        int timezoneOffset = cal.get(Calendar.ZONE_OFFSET);
+        if (localTZ.inDaylightTime(initialDate)) {
+            timezoneOffset += (60 * 60 * 1000);
+        }
+        cal.add(Calendar.MILLISECOND, timezoneOffset);
+
+        Date newTime = cal.getTime();
+
+        Calendar calTS = Calendar.getInstance(targetTZ);
+        calTS.setTime(newTime);
+        timezoneOffset = calTS.get(Calendar.ZONE_OFFSET);
+        if (targetTZ.inDaylightTime(initialDate)) {
+            timezoneOffset += (60 * 60 * 1000);
+        }
+
+        calTS.add(Calendar.MILLISECOND, -1*timezoneOffset);
+        if (adjustToDayStart) {
+            calTS.set(Calendar.HOUR_OF_DAY, 0);
+            calTS.set(Calendar.MINUTE, 0);
+            calTS.set(Calendar.SECOND, 0);
+            calTS.set(Calendar.MILLISECOND, 0);
+        } else {
+            calTS.set(Calendar.HOUR_OF_DAY, 23);
+            calTS.set(Calendar.MINUTE, 59);
+            calTS.set(Calendar.SECOND, 59);
+            calTS.set(Calendar.MILLISECOND, 999);
+        }
+
+        return calTS.getTime();
+    }
+
+	@Override
+	public List<UsageTypeResponse> listUsageTypes() {
+		return UsageTypes.listUsageTypes();
+	}
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/server/src/com/cloud/usage/UsageTypes.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/usage/UsageTypes.java b/server/src/com/cloud/usage/UsageTypes.java
deleted file mode 100644
index e5a48d5..0000000
--- a/server/src/com/cloud/usage/UsageTypes.java
+++ /dev/null
@@ -1,58 +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.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/fc0bf21a/server/src/com/cloud/usage/UsageVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/usage/UsageVO.java b/server/src/com/cloud/usage/UsageVO.java
index bcb9c2d..18a3a6b 100644
--- a/server/src/com/cloud/usage/UsageVO.java
+++ b/server/src/com/cloud/usage/UsageVO.java
@@ -17,6 +17,7 @@
 package com.cloud.usage;
 
 import org.apache.cloudstack.api.InternalIdentity;
+import org.apache.cloudstack.usage.Usage;
 
 import java.util.Date;
 
@@ -31,7 +32,7 @@ import javax.persistence.TemporalType;
 
 @Entity
 @Table(name="cloud_usage")
-public class UsageVO implements InternalIdentity {
+public class UsageVO implements Usage, InternalIdentity {
 	@Id
     @GeneratedValue(strategy=GenerationType.IDENTITY)
     @Column(name="id")
@@ -167,74 +168,92 @@ public class UsageVO implements InternalIdentity {
 	    this.endDate = endDate;
 	}
 	
+	@Override
 	public long getId() {
 		return id;
 	}
 
+	@Override
 	public Long getZoneId() {
 	    return zoneId;
 	}
 
+	@Override
 	public Long getAccountId() {
 		return accountId;
 	}
 
+	@Override
     public Long getDomainId() {
         return domainId;
     }
 
+	@Override
 	public String getDescription() {
 		return description;
 	}
-
+	
+	@Override
 	public String getUsageDisplay() {
 		return usageDisplay;
 	}
 
+	@Override
 	public int getUsageType() {
 	    return usageType;
 	}
 
+	@Override
     public Double getRawUsage() {
         return rawUsage;
     }
 
+	@Override
     public Long getVmInstanceId() {
         return vmInstanceId;
     }
 
+	@Override
     public String getVmName() {
         return vmName;
     }
 
+	@Override
     public Long getOfferingId() {
         return offeringId;
     }
 
+	@Override
     public Long getTemplateId() {
         return templateId;
     }
 
+	@Override
     public Long getUsageId() {
         return usageId;
     }
     
+	@Override
     public String getType() {
         return type;
     }
     
+	@Override
     public Long getNetworkId() {
         return networkId;
     }
 
+	@Override
     public Long getSize() {
         return size;
     }
     
+	@Override
 	public Date getStartDate() {
 		return startDate;
 	}
 
+	@Override
 	public Date getEndDate() {
         return endDate;
     }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/usage/src/com/cloud/usage/UsageManagerImpl.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/UsageManagerImpl.java b/usage/src/com/cloud/usage/UsageManagerImpl.java
index 3e143b1..1ebe892 100644
--- a/usage/src/com/cloud/usage/UsageManagerImpl.java
+++ b/usage/src/com/cloud/usage/UsageManagerImpl.java
@@ -34,6 +34,7 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
+import org.apache.cloudstack.usage.UsageTypes;
 
 import com.cloud.alert.AlertManager;
 import com.cloud.configuration.dao.ConfigurationDao;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/usage/src/com/cloud/usage/parser/IPAddressUsageParser.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/parser/IPAddressUsageParser.java b/usage/src/com/cloud/usage/parser/IPAddressUsageParser.java
index a5a40c0..0889203 100644
--- a/usage/src/com/cloud/usage/parser/IPAddressUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/IPAddressUsageParser.java
@@ -26,11 +26,11 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
+import org.apache.cloudstack.usage.UsageTypes;
 import org.springframework.stereotype.Component;
 
 import com.cloud.usage.UsageIPAddressVO;
 import com.cloud.usage.UsageServer;
-import com.cloud.usage.UsageTypes;
 import com.cloud.usage.UsageVO;
 import com.cloud.usage.dao.UsageDao;
 import com.cloud.usage.dao.UsageIPAddressDao;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/usage/src/com/cloud/usage/parser/LoadBalancerUsageParser.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/parser/LoadBalancerUsageParser.java b/usage/src/com/cloud/usage/parser/LoadBalancerUsageParser.java
index edea320..84d0b32 100644
--- a/usage/src/com/cloud/usage/parser/LoadBalancerUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/LoadBalancerUsageParser.java
@@ -26,11 +26,11 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
+import org.apache.cloudstack.usage.UsageTypes;
 import org.springframework.stereotype.Component;
 
 import com.cloud.usage.UsageLoadBalancerPolicyVO;
 import com.cloud.usage.UsageServer;
-import com.cloud.usage.UsageTypes;
 import com.cloud.usage.UsageVO;
 import com.cloud.usage.dao.UsageDao;
 import com.cloud.usage.dao.UsageLoadBalancerPolicyDao;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/usage/src/com/cloud/usage/parser/NetworkOfferingUsageParser.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/parser/NetworkOfferingUsageParser.java b/usage/src/com/cloud/usage/parser/NetworkOfferingUsageParser.java
index f6ddf9f..d026b76 100644
--- a/usage/src/com/cloud/usage/parser/NetworkOfferingUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/NetworkOfferingUsageParser.java
@@ -26,10 +26,10 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
+import org.apache.cloudstack.usage.UsageTypes;
 
 import com.cloud.usage.UsageNetworkOfferingVO;
 import com.cloud.usage.UsageServer;
-import com.cloud.usage.UsageTypes;
 import com.cloud.usage.UsageVO;
 import com.cloud.usage.dao.UsageDao;
 import com.cloud.usage.dao.UsageNetworkOfferingDao;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/usage/src/com/cloud/usage/parser/NetworkUsageParser.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/parser/NetworkUsageParser.java b/usage/src/com/cloud/usage/parser/NetworkUsageParser.java
index fb673d7..a891fdd 100644
--- a/usage/src/com/cloud/usage/parser/NetworkUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/NetworkUsageParser.java
@@ -25,9 +25,9 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
+import org.apache.cloudstack.usage.UsageTypes;
 
 import com.cloud.usage.UsageNetworkVO;
-import com.cloud.usage.UsageTypes;
 import com.cloud.usage.UsageVO;
 import com.cloud.usage.dao.UsageDao;
 import com.cloud.usage.dao.UsageNetworkDao;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/usage/src/com/cloud/usage/parser/PortForwardingUsageParser.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/parser/PortForwardingUsageParser.java b/usage/src/com/cloud/usage/parser/PortForwardingUsageParser.java
index 1692180..4780d14 100644
--- a/usage/src/com/cloud/usage/parser/PortForwardingUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/PortForwardingUsageParser.java
@@ -26,10 +26,10 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
+import org.apache.cloudstack.usage.UsageTypes;
 
 import com.cloud.usage.UsagePortForwardingRuleVO;
 import com.cloud.usage.UsageServer;
-import com.cloud.usage.UsageTypes;
 import com.cloud.usage.UsageVO;
 import com.cloud.usage.dao.UsageDao;
 import com.cloud.usage.dao.UsagePortForwardingRuleDao;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/usage/src/com/cloud/usage/parser/SecurityGroupUsageParser.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/parser/SecurityGroupUsageParser.java b/usage/src/com/cloud/usage/parser/SecurityGroupUsageParser.java
index ed7acf3..df859b8 100644
--- a/usage/src/com/cloud/usage/parser/SecurityGroupUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/SecurityGroupUsageParser.java
@@ -26,10 +26,10 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
+import org.apache.cloudstack.usage.UsageTypes;
 
 import com.cloud.usage.UsageSecurityGroupVO;
 import com.cloud.usage.UsageServer;
-import com.cloud.usage.UsageTypes;
 import com.cloud.usage.UsageVO;
 import com.cloud.usage.dao.UsageDao;
 import com.cloud.usage.dao.UsageSecurityGroupDao;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/usage/src/com/cloud/usage/parser/StorageUsageParser.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/parser/StorageUsageParser.java b/usage/src/com/cloud/usage/parser/StorageUsageParser.java
index 7542063..4e3817e 100644
--- a/usage/src/com/cloud/usage/parser/StorageUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/StorageUsageParser.java
@@ -26,11 +26,11 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
+import org.apache.cloudstack.usage.UsageTypes;
 
 import com.cloud.usage.StorageTypes;
 import com.cloud.usage.UsageServer;
 import com.cloud.usage.UsageStorageVO;
-import com.cloud.usage.UsageTypes;
 import com.cloud.usage.UsageVO;
 import com.cloud.usage.dao.UsageDao;
 import com.cloud.usage.dao.UsageStorageDao;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/usage/src/com/cloud/usage/parser/VMInstanceUsageParser.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/parser/VMInstanceUsageParser.java b/usage/src/com/cloud/usage/parser/VMInstanceUsageParser.java
index 8d2e465..2e7ee59 100644
--- a/usage/src/com/cloud/usage/parser/VMInstanceUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/VMInstanceUsageParser.java
@@ -26,9 +26,9 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
+import org.apache.cloudstack.usage.UsageTypes;
 
 import com.cloud.usage.UsageServer;
-import com.cloud.usage.UsageTypes;
 import com.cloud.usage.UsageVMInstanceVO;
 import com.cloud.usage.UsageVO;
 import com.cloud.usage.dao.UsageDao;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/usage/src/com/cloud/usage/parser/VPNUserUsageParser.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/parser/VPNUserUsageParser.java b/usage/src/com/cloud/usage/parser/VPNUserUsageParser.java
index c9a863b..c76de28 100644
--- a/usage/src/com/cloud/usage/parser/VPNUserUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/VPNUserUsageParser.java
@@ -26,10 +26,10 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
+import org.apache.cloudstack.usage.UsageTypes;
 
 import com.cloud.usage.UsageVPNUserVO;
 import com.cloud.usage.UsageServer;
-import com.cloud.usage.UsageTypes;
 import com.cloud.usage.UsageVO;
 import com.cloud.usage.dao.UsageDao;
 import com.cloud.usage.dao.UsageVPNUserDao;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/fc0bf21a/usage/src/com/cloud/usage/parser/VolumeUsageParser.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/parser/VolumeUsageParser.java b/usage/src/com/cloud/usage/parser/VolumeUsageParser.java
index e797f1c..6d9fe5d 100644
--- a/usage/src/com/cloud/usage/parser/VolumeUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/VolumeUsageParser.java
@@ -26,9 +26,9 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
+import org.apache.cloudstack.usage.UsageTypes;
 
 import com.cloud.usage.UsageServer;
-import com.cloud.usage.UsageTypes;
 import com.cloud.usage.UsageVO;
 import com.cloud.usage.UsageVolumeVO;
 import com.cloud.usage.dao.UsageDao;