You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by hu...@apache.org on 2013/01/23 08:15:57 UTC

[24/45] git commit: CLOUDSTACK-355: Create DB view to fix count issue for listDiskOfferingsCmd.

CLOUDSTACK-355: Create DB view to fix count issue for
listDiskOfferingsCmd.


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

Branch: refs/heads/cloud-agent-with-openvswitch
Commit: 6db719d58b996034773a0f10dcb4945d85adb719
Parents: 04d93ef
Author: Min Chen <mi...@citrix.com>
Authored: Mon Jan 21 10:48:03 2013 -0800
Committer: Min Chen <mi...@citrix.com>
Committed: Mon Jan 21 10:50:10 2013 -0800

----------------------------------------------------------------------
 api/src/com/cloud/server/ManagementService.java    |   11 +-
 .../user/offering/ListDiskOfferingsCmd.java        |   13 +-
 .../org/apache/cloudstack/query/QueryService.java  |    4 +
 server/src/com/cloud/api/ApiDBUtils.java           |   14 +
 server/src/com/cloud/api/ApiResponseHelper.java    |   21 +--
 server/src/com/cloud/api/ApiServer.java            |    2 +
 .../src/com/cloud/api/query/QueryManagerImpl.java  |  177 +++++++++++-
 .../com/cloud/api/query/ViewResponseHelper.java    |   10 +
 .../cloud/api/query/dao/DiskOfferingJoinDao.java   |   29 ++
 .../api/query/dao/DiskOfferingJoinDaoImpl.java     |  101 +++++++
 .../com/cloud/api/query/vo/DiskOfferingJoinVO.java |  233 +++++++++++++++
 .../configuration/DefaultComponentLibrary.java     |    2 +
 .../src/com/cloud/server/ManagementServerImpl.java |  195 +------------
 setup/db/create-schema-view.sql                    |   25 ++-
 setup/db/db/schema-40to410.sql                     |   24 ++
 15 files changed, 628 insertions(+), 233 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/api/src/com/cloud/server/ManagementService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/server/ManagementService.java b/api/src/com/cloud/server/ManagementService.java
index 5302daa..9935565 100755
--- a/api/src/com/cloud/server/ManagementService.java
+++ b/api/src/com/cloud/server/ManagementService.java
@@ -144,7 +144,7 @@ public interface ManagementService {
     /**
      * Searches for servers by the specified search criteria Can search by: "name", "type", "state", "dataCenterId",
      * "podId"
-     * 
+     *
      * @param cmd
      * @return List of Hosts
      */
@@ -243,15 +243,6 @@ public interface ManagementService {
      */
     Set<Pair<Long, Long>> listTemplates(ListTemplatesCmd cmd);
 
-    /**
-     * Search for disk offerings based on search criteria
-     *
-     * @param cmd
-     *            the command containing the criteria to use for searching for disk offerings
-     * @return a list of disk offerings that match the given criteria
-     */
-    List<? extends DiskOffering> searchForDiskOfferings(ListDiskOfferingsCmd cmd);
-
 
     /**
      * List system VMs by the given search criteria

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/api/src/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java b/api/src/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java
index 7209429..1fc7978 100644
--- a/api/src/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/offering/ListDiskOfferingsCmd.java
@@ -25,6 +25,7 @@ import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseListCmd;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.response.AsyncJobResponse;
 import org.apache.cloudstack.api.response.DiskOfferingResponse;
 import org.apache.cloudstack.api.response.DomainResponse;
 import org.apache.cloudstack.api.response.ListResponse;
@@ -78,16 +79,8 @@ public class ListDiskOfferingsCmd extends BaseListCmd {
 
     @Override
     public void execute(){
-        List<? extends DiskOffering> result = _mgr.searchForDiskOfferings(this);
-        ListResponse<DiskOfferingResponse> response = new ListResponse<DiskOfferingResponse>();
-        List<DiskOfferingResponse> diskOfferingResponses = new ArrayList<DiskOfferingResponse>();
-        for (DiskOffering offering : result) {
-            DiskOfferingResponse diskOffResp = _responseGenerator.createDiskOfferingResponse(offering);
-            diskOffResp.setObjectName("diskoffering");
-            diskOfferingResponses.add(diskOffResp);
-        }
-
-        response.setResponses(diskOfferingResponses);
+
+        ListResponse<DiskOfferingResponse> response = _queryService.searchForDiskOfferings(this);
         response.setResponseName(getCommandName());
         this.setResponseObject(response);
     }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/api/src/org/apache/cloudstack/query/QueryService.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/query/QueryService.java b/api/src/org/apache/cloudstack/query/QueryService.java
index b03a7fc..f2b0d32 100644
--- a/api/src/org/apache/cloudstack/query/QueryService.java
+++ b/api/src/org/apache/cloudstack/query/QueryService.java
@@ -26,6 +26,7 @@ import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
 import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd;
 import org.apache.cloudstack.api.command.user.event.ListEventsCmd;
 import org.apache.cloudstack.api.command.user.job.ListAsyncJobsCmd;
+import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd;
 import org.apache.cloudstack.api.command.user.project.ListProjectInvitationsCmd;
 import org.apache.cloudstack.api.command.user.project.ListProjectsCmd;
 import org.apache.cloudstack.api.command.user.securitygroup.ListSecurityGroupsCmd;
@@ -35,6 +36,7 @@ import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd;
 import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd;
 import org.apache.cloudstack.api.response.AccountResponse;
 import org.apache.cloudstack.api.response.AsyncJobResponse;
+import org.apache.cloudstack.api.response.DiskOfferingResponse;
 import org.apache.cloudstack.api.response.DomainRouterResponse;
 import org.apache.cloudstack.api.response.EventResponse;
 import org.apache.cloudstack.api.response.HostResponse;
@@ -92,4 +94,6 @@ public interface QueryService {
     public ListResponse<AccountResponse> searchForAccounts(ListAccountsCmd cmd);
 
     public ListResponse<AsyncJobResponse>  searchForAsyncJobs(ListAsyncJobsCmd cmd);
+
+    public ListResponse<DiskOfferingResponse>  searchForDiskOfferings(ListDiskOfferingsCmd cmd);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/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 dfdeb9c..3f2f0bb 100755
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@ -26,6 +26,7 @@ import org.apache.cloudstack.api.ApiConstants.HostDetails;
 import org.apache.cloudstack.api.ApiConstants.VMDetails;
 import org.apache.cloudstack.api.response.AccountResponse;
 import org.apache.cloudstack.api.response.AsyncJobResponse;
+import org.apache.cloudstack.api.response.DiskOfferingResponse;
 import org.apache.cloudstack.api.response.DomainRouterResponse;
 import org.apache.cloudstack.api.response.EventResponse;
 import org.apache.cloudstack.api.response.HostResponse;
@@ -42,6 +43,7 @@ import org.apache.cloudstack.api.response.VolumeResponse;
 
 import com.cloud.api.query.dao.AccountJoinDao;
 import com.cloud.api.query.dao.AsyncJobJoinDao;
+import com.cloud.api.query.dao.DiskOfferingJoinDao;
 import com.cloud.api.query.dao.DomainRouterJoinDao;
 import com.cloud.api.query.dao.HostJoinDao;
 import com.cloud.api.query.dao.InstanceGroupJoinDao;
@@ -56,6 +58,7 @@ import com.cloud.api.query.dao.UserVmJoinDao;
 import com.cloud.api.query.dao.VolumeJoinDao;
 import com.cloud.api.query.vo.AccountJoinVO;
 import com.cloud.api.query.vo.AsyncJobJoinVO;
+import com.cloud.api.query.vo.DiskOfferingJoinVO;
 import com.cloud.api.query.vo.DomainRouterJoinVO;
 import com.cloud.api.query.vo.EventJoinVO;
 import com.cloud.api.query.vo.HostJoinVO;
@@ -163,6 +166,7 @@ import com.cloud.network.vpc.VpcVO;
 import com.cloud.network.vpc.dao.StaticRouteDao;
 import com.cloud.network.vpc.dao.VpcGatewayDao;
 import com.cloud.network.vpc.dao.VpcOfferingDao;
+import com.cloud.offering.DiskOffering;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offering.ServiceOffering;
 import com.cloud.offerings.NetworkOfferingVO;
@@ -333,6 +337,7 @@ public class ApiDBUtils {
     private static StoragePoolJoinDao _poolJoinDao;
     private static AccountJoinDao _accountJoinDao;
     private static AsyncJobJoinDao _jobJoinDao;
+    private static DiskOfferingJoinDao _diskOfferingJoinDao;
 
     private static PhysicalNetworkTrafficTypeDao _physicalNetworkTrafficTypeDao;
     private static PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao;
@@ -437,6 +442,7 @@ public class ApiDBUtils {
         _vpcOfferingDao = locator.getDao(VpcOfferingDao.class);
         _snapshotPolicyDao = locator.getDao(SnapshotPolicyDao.class);
         _asyncJobDao = locator.getDao(AsyncJobDao.class);
+        _diskOfferingJoinDao = locator.getDao(DiskOfferingJoinDao.class);
 
         // Note: stats collector should already have been initialized by this time, otherwise a null instance is returned
         _statsCollector = StatsCollector.getInstance();
@@ -1399,4 +1405,12 @@ public class ApiDBUtils {
    public static AsyncJobJoinVO newAsyncJobView(AsyncJob e){
        return _jobJoinDao.newAsyncJobView(e);
    }
+
+   public static DiskOfferingResponse newDiskOfferingResponse(DiskOfferingJoinVO offering) {
+       return _diskOfferingJoinDao.newDiskOfferingResponse(offering);
+   }
+
+   public static DiskOfferingJoinVO newDiskOfferingView(DiskOffering offering){
+       return _diskOfferingJoinDao.newDiskOfferingView(offering);
+   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/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 c346a6b..07646d8 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -44,6 +44,7 @@ import com.cloud.api.query.ViewResponseHelper;
 import com.cloud.api.query.vo.AccountJoinVO;
 import com.cloud.api.query.vo.AsyncJobJoinVO;
 import com.cloud.api.query.vo.ControlledViewEntity;
+import com.cloud.api.query.vo.DiskOfferingJoinVO;
 import com.cloud.api.query.vo.DomainRouterJoinVO;
 import com.cloud.api.query.vo.EventJoinVO;
 import com.cloud.api.query.vo.HostJoinVO;
@@ -298,24 +299,8 @@ public class ApiResponseHelper implements ResponseGenerator {
 
     @Override
     public DiskOfferingResponse createDiskOfferingResponse(DiskOffering offering) {
-        DiskOfferingResponse diskOfferingResponse = new DiskOfferingResponse();
-        diskOfferingResponse.setId(offering.getUuid());
-        diskOfferingResponse.setName(offering.getName());
-        diskOfferingResponse.setDisplayText(offering.getDisplayText());
-        diskOfferingResponse.setCreated(offering.getCreated());
-        diskOfferingResponse.setDiskSize(offering.getDiskSize() / (1024 * 1024 * 1024));
-        if (offering.getDomainId() != null) {
-            Domain domain = ApiDBUtils.findDomainById(offering.getDomainId());
-            if (domain != null) {
-                diskOfferingResponse.setDomain(domain.getName());
-                diskOfferingResponse.setDomainId(domain.getUuid());
-            }
-        }
-        diskOfferingResponse.setTags(offering.getTags());
-        diskOfferingResponse.setCustomized(offering.isCustomized());
-        diskOfferingResponse.setStorageType(offering.getUseLocalStorage() ? ServiceOffering.StorageType.local.toString() : ServiceOffering.StorageType.shared.toString());
-        diskOfferingResponse.setObjectName("diskoffering");
-        return diskOfferingResponse;
+        DiskOfferingJoinVO vOffering = ApiDBUtils.newDiskOfferingView(offering);
+        return ApiDBUtils.newDiskOfferingResponse(vOffering);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/server/src/com/cloud/api/ApiServer.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java
index ac1ba0a..19c8851 100755
--- a/server/src/com/cloud/api/ApiServer.java
+++ b/server/src/com/cloud/api/ApiServer.java
@@ -95,6 +95,7 @@ import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
 import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
 import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
 import org.apache.cloudstack.api.command.admin.user.ListUsersCmd;
+import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd;
 import org.apache.cloudstack.api.command.user.project.ListProjectInvitationsCmd;
 import org.apache.cloudstack.api.command.user.project.ListProjectsCmd;
 import org.apache.cloudstack.api.command.user.securitygroup.ListSecurityGroupsCmd;
@@ -514,6 +515,7 @@ public class ApiServer implements HttpRequestHandler {
                     && !(cmdObj instanceof ListUsersCmd)
                     && !(cmdObj instanceof ListAccountsCmd)
                     && !(cmdObj instanceof ListStoragePoolsCmd)
+                    && !(cmdObj instanceof ListDiskOfferingsCmd)
                     ) {
                 buildAsyncListResponse((BaseListCmd) cmdObj, caller);
             }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java
index b61f10a..c38603f 100644
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@ -32,6 +32,7 @@ import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
 import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd;
 import org.apache.cloudstack.api.command.user.event.ListEventsCmd;
 import org.apache.cloudstack.api.command.user.job.ListAsyncJobsCmd;
+import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd;
 import org.apache.cloudstack.api.command.user.project.ListProjectInvitationsCmd;
 import org.apache.cloudstack.api.command.user.project.ListProjectsCmd;
 import org.apache.cloudstack.api.command.user.securitygroup.ListSecurityGroupsCmd;
@@ -41,6 +42,7 @@ import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd;
 import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd;
 import org.apache.cloudstack.api.response.AccountResponse;
 import org.apache.cloudstack.api.response.AsyncJobResponse;
+import org.apache.cloudstack.api.response.DiskOfferingResponse;
 import org.apache.cloudstack.api.response.DomainRouterResponse;
 import org.apache.cloudstack.api.response.EventResponse;
 import org.apache.cloudstack.api.response.HostResponse;
@@ -60,6 +62,7 @@ import org.apache.log4j.Logger;
 
 import com.cloud.api.query.dao.AccountJoinDao;
 import com.cloud.api.query.dao.AsyncJobJoinDao;
+import com.cloud.api.query.dao.DiskOfferingJoinDao;
 import com.cloud.api.query.dao.DomainRouterJoinDao;
 import com.cloud.api.query.dao.HostJoinDao;
 import com.cloud.api.query.dao.InstanceGroupJoinDao;
@@ -74,6 +77,7 @@ import com.cloud.api.query.dao.UserVmJoinDao;
 import com.cloud.api.query.dao.VolumeJoinDao;
 import com.cloud.api.query.vo.AccountJoinVO;
 import com.cloud.api.query.vo.AsyncJobJoinVO;
+import com.cloud.api.query.vo.DiskOfferingJoinVO;
 import com.cloud.api.query.vo.DomainRouterJoinVO;
 import com.cloud.api.query.vo.EventJoinVO;
 import com.cloud.api.query.vo.HostJoinVO;
@@ -87,10 +91,12 @@ 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.configuration.dao.ConfigurationDao;
 import com.cloud.domain.Domain;
 import com.cloud.domain.DomainVO;
 import com.cloud.domain.dao.DomainDao;
 import com.cloud.event.dao.EventJoinDao;
+import com.cloud.exception.CloudAuthenticationException;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.PermissionDeniedException;
 import com.cloud.ha.HighAvailabilityManager;
@@ -104,6 +110,7 @@ import com.cloud.projects.ProjectManager;
 import com.cloud.projects.dao.ProjectAccountDao;
 import com.cloud.projects.dao.ProjectDao;
 import com.cloud.server.Criteria;
+import com.cloud.storage.DiskOfferingVO;
 import com.cloud.storage.StoragePool;
 import com.cloud.storage.StoragePoolVO;
 import com.cloud.storage.Volume;
@@ -200,6 +207,9 @@ public class QueryManagerImpl implements QueryService, Manager {
     private AccountDao _accountDao;
 
     @Inject
+    private ConfigurationDao _configDao;
+
+    @Inject
     private AccountJoinDao _accountJoinDao;
 
     @Inject
@@ -209,6 +219,9 @@ public class QueryManagerImpl implements QueryService, Manager {
     private StoragePoolJoinDao _poolJoinDao;
 
     @Inject
+    private DiskOfferingJoinDao _diskOfferingJoinDao;
+
+    @Inject
     private HighAvailabilityManager _haMgr;
 
     @Override
@@ -1603,7 +1616,7 @@ public class QueryManagerImpl implements QueryService, Manager {
     }
 
 
-    public Pair<List<AccountJoinVO>, Integer> searchForAccountsInternal(ListAccountsCmd cmd) {
+    private Pair<List<AccountJoinVO>, Integer> searchForAccountsInternal(ListAccountsCmd cmd) {
         Account caller = UserContext.current().getCaller();
         Long domainId = cmd.getDomainId();
         Long accountId = cmd.getId();
@@ -1729,7 +1742,7 @@ public class QueryManagerImpl implements QueryService, Manager {
     }
 
 
-    public Pair<List<AsyncJobJoinVO>, Integer> searchForAsyncJobsInternal(ListAsyncJobsCmd cmd) {
+    private Pair<List<AsyncJobJoinVO>, Integer> searchForAsyncJobsInternal(ListAsyncJobsCmd cmd) {
 
         Account caller = UserContext.current().getCaller();
 
@@ -1808,7 +1821,7 @@ public class QueryManagerImpl implements QueryService, Manager {
         return response;
     }
 
-    public Pair<List<StoragePoolJoinVO>, Integer> searchForStoragePoolsInternal(ListStoragePoolsCmd cmd) {
+    private Pair<List<StoragePoolJoinVO>, Integer> searchForStoragePoolsInternal(ListStoragePoolsCmd cmd) {
 
         Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), cmd.getZoneId());
         Object id = cmd.getId();
@@ -1888,5 +1901,163 @@ public class QueryManagerImpl implements QueryService, Manager {
 
     }
 
+    @Override
+    public ListResponse<DiskOfferingResponse> searchForDiskOfferings(ListDiskOfferingsCmd cmd) {
+        Pair<List<DiskOfferingJoinVO>, Integer> result = searchForDiskOfferingsInternal(cmd);
+        ListResponse<DiskOfferingResponse> response = new ListResponse<DiskOfferingResponse>();
+        List<DiskOfferingResponse> offeringResponses = ViewResponseHelper.createDiskOfferingResponse(result.first().toArray(new DiskOfferingJoinVO[result.first().size()]));
+        response.setResponses(offeringResponses, result.second());
+        return response;
+    }
+
+    private Pair<List<DiskOfferingJoinVO>, Integer> searchForDiskOfferingsInternal(ListDiskOfferingsCmd cmd) {
+        // Note
+        // The list method for offerings is being modified in accordance with
+        // discussion with Will/Kevin
+        // For now, we will be listing the following based on the usertype
+        // 1. For root, we will list all offerings
+        // 2. For domainAdmin and regular users, we will list everything in
+        // their domains+parent domains ... all the way
+        // till
+        // root
+
+        Boolean isAscending = Boolean.parseBoolean(_configDao.getValue("sortkey.algorithm"));
+        isAscending = (isAscending == null ? true : isAscending);
+        Filter searchFilter = new Filter(DiskOfferingJoinVO.class, "sortKey", isAscending, cmd.getStartIndex(), cmd.getPageSizeVal());
+        SearchBuilder<DiskOfferingJoinVO> sb = _diskOfferingJoinDao.createSearchBuilder();
+
+
+        Account account = UserContext.current().getCaller();
+        Object name = cmd.getDiskOfferingName();
+        Object id = cmd.getId();
+        Object keyword = cmd.getKeyword();
+        Long domainId = cmd.getDomainId();
+        // Keeping this logic consistent with domain specific zones
+        // if a domainId is provided, we just return the disk offering
+        // associated with this domain
+        if (domainId != null) {
+            if (account.getType() == Account.ACCOUNT_TYPE_ADMIN || isPermissible(account.getDomainId(), domainId) ) {
+                // check if the user's domain == do's domain || user's domain is
+                // a child of so's domain for non-root users
+                sb.and("domainId", sb.entity().getDomainId(), SearchCriteria.Op.EQ);
+                SearchCriteria<DiskOfferingJoinVO> sc = sb.create();
+                sc.setParameters("domainId", domainId);
+                return _diskOfferingJoinDao.searchAndCount(sc, searchFilter);
+            } else {
+                    throw new PermissionDeniedException("The account:" + account.getAccountName()
+                            + " does not fall in the same domain hierarchy as the disk offering");
+            }
+        }
+
+        sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
+        sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
+
+
+        boolean includePublicOfferings = false;
+        List<Long> domainIds = null;
+        // For non-root users, only return all offerings for the user's domain, and everything above till root
+        if ((account.getType() == Account.ACCOUNT_TYPE_NORMAL || account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN)
+                || account.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
+            // find all domain Id up to root domain for this account
+            domainIds = new ArrayList<Long>();
+            DomainVO domainRecord = _domainDao.findById(account.getDomainId());
+            if ( domainRecord == null ){
+                s_logger.error("Could not find the domainId for account:" + account.getAccountName());
+                throw new CloudAuthenticationException("Could not find the domainId for account:" + account.getAccountName());
+            }
+            domainIds.add(domainRecord.getId());
+            while (domainRecord.getParent() != null ){
+                domainRecord = _domainDao.findById(domainRecord.getParent());
+                domainIds.add(domainRecord.getId());
+            }
+            sb.and("domainIdIn", sb.entity().getDomainId(), SearchCriteria.Op.IN);
+
+            // include also public offering if no keyword, name and id specified
+            if ( keyword == null && name == null && id == null ){
+                includePublicOfferings = true;
+            }
+        }
+
+        SearchCriteria<DiskOfferingJoinVO> sc = sb.create();
+        if (keyword != null) {
+            SearchCriteria<DiskOfferingJoinVO> ssc = _diskOfferingJoinDao.createSearchCriteria();
+            ssc.addOr("displayText", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+            ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+
+            sc.addAnd("name", SearchCriteria.Op.SC, ssc);
+        }
+
+        if (name != null) {
+            sc.setParameters("name", "%" + name + "%");
+        }
+
+        if (id != null) {
+            sc.setParameters("id", id);
+        }
+
+        if (domainIds != null ){
+            sc.setParameters("domainIdIn", domainIds);
+        }
+
+        if (includePublicOfferings){
+            SearchCriteria<DiskOfferingJoinVO> spc = _diskOfferingJoinDao.createSearchCriteria();
+            spc.addAnd("domainId", SearchCriteria.Op.NULL);
+            spc.addAnd("systemUse", SearchCriteria.Op.EQ, false);
+
+            sc.addOr("systemUse", SearchCriteria.Op.SC, spc);
+        }
+
+        // FIXME: disk offerings should search back up the hierarchy for
+        // available disk offerings...
+        /*
+         * sb.addAnd("domainId", sb.entity().getDomainId(),
+         * SearchCriteria.Op.EQ); if (domainId != null) {
+         * SearchBuilder<DomainVO> domainSearch =
+         * _domainDao.createSearchBuilder(); domainSearch.addAnd("path",
+         * domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
+         * sb.join("domainSearch", domainSearch, sb.entity().getDomainId(),
+         * domainSearch.entity().getId()); }
+         */
+
+        // FIXME: disk offerings should search back up the hierarchy for
+        // available disk offerings...
+        /*
+         * if (domainId != null) { sc.setParameters("domainId", domainId); //
+         * //DomainVO domain = _domainDao.findById((Long)domainId); // // I want
+         * to join on user_vm.domain_id = domain.id where domain.path like
+         * 'foo%' //sc.setJoinParameters("domainSearch", "path",
+         * domain.getPath() + "%"); // }
+         */
+
+        return _diskOfferingJoinDao.searchAndCount(sc, searchFilter);
+    }
+
+
+    // This method is used for permissions check for both disk and service
+    // offerings
+    private boolean isPermissible(Long accountDomainId, Long offeringDomainId) {
+
+        if (accountDomainId == offeringDomainId) {
+            return true; // account and service offering in same domain
+        }
+
+        DomainVO domainRecord = _domainDao.findById(accountDomainId);
 
+        if (domainRecord != null) {
+            while (true) {
+                if (domainRecord.getId() == offeringDomainId) {
+                    return true;
+                }
+
+                // try and move on to the next domain
+                if (domainRecord.getParent() != null) {
+                    domainRecord = _domainDao.findById(domainRecord.getParent());
+                } else {
+                    break;
+                }
+            }
+        }
+
+        return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/server/src/com/cloud/api/query/ViewResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/ViewResponseHelper.java b/server/src/com/cloud/api/query/ViewResponseHelper.java
index 39c108e..9c761d4 100644
--- a/server/src/com/cloud/api/query/ViewResponseHelper.java
+++ b/server/src/com/cloud/api/query/ViewResponseHelper.java
@@ -25,6 +25,7 @@ import org.apache.cloudstack.api.ApiConstants.HostDetails;
 import org.apache.cloudstack.api.ApiConstants.VMDetails;
 import org.apache.cloudstack.api.response.AccountResponse;
 import org.apache.cloudstack.api.response.AsyncJobResponse;
+import org.apache.cloudstack.api.response.DiskOfferingResponse;
 import org.apache.cloudstack.api.response.DomainRouterResponse;
 import org.apache.cloudstack.api.response.EventResponse;
 import org.apache.cloudstack.api.response.HostResponse;
@@ -43,6 +44,7 @@ import org.apache.log4j.Logger;
 import com.cloud.api.ApiDBUtils;
 import com.cloud.api.query.vo.AccountJoinVO;
 import com.cloud.api.query.vo.AsyncJobJoinVO;
+import com.cloud.api.query.vo.DiskOfferingJoinVO;
 import com.cloud.api.query.vo.DomainRouterJoinVO;
 import com.cloud.api.query.vo.EventJoinVO;
 import com.cloud.api.query.vo.HostJoinVO;
@@ -274,4 +276,12 @@ public class ViewResponseHelper {
         }
         return respList;
     }
+
+    public static List<DiskOfferingResponse> createDiskOfferingResponse(DiskOfferingJoinVO... offerings) {
+        List<DiskOfferingResponse> respList = new ArrayList<DiskOfferingResponse>();
+        for (DiskOfferingJoinVO vt : offerings){
+            respList.add(ApiDBUtils.newDiskOfferingResponse(vt));
+        }
+        return respList;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/server/src/com/cloud/api/query/dao/DiskOfferingJoinDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/dao/DiskOfferingJoinDao.java b/server/src/com/cloud/api/query/dao/DiskOfferingJoinDao.java
new file mode 100644
index 0000000..30758d1
--- /dev/null
+++ b/server/src/com/cloud/api/query/dao/DiskOfferingJoinDao.java
@@ -0,0 +1,29 @@
+// 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.query.dao;
+
+import org.apache.cloudstack.api.response.DiskOfferingResponse;
+import com.cloud.api.query.vo.DiskOfferingJoinVO;
+import com.cloud.offering.DiskOffering;
+import com.cloud.utils.db.GenericDao;
+
+public interface DiskOfferingJoinDao extends GenericDao<DiskOfferingJoinVO, Long> {
+
+    DiskOfferingResponse newDiskOfferingResponse(DiskOfferingJoinVO dof);
+
+    DiskOfferingJoinVO newDiskOfferingView(DiskOffering dof);
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/server/src/com/cloud/api/query/dao/DiskOfferingJoinDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/dao/DiskOfferingJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/DiskOfferingJoinDaoImpl.java
new file mode 100644
index 0000000..d877381
--- /dev/null
+++ b/server/src/com/cloud/api/query/dao/DiskOfferingJoinDaoImpl.java
@@ -0,0 +1,101 @@
+// 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.query.dao;
+
+import java.util.List;
+
+import javax.ejb.Local;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.query.vo.DiskOfferingJoinVO;
+import org.apache.cloudstack.api.response.DiskOfferingResponse;
+import com.cloud.offering.DiskOffering;
+import com.cloud.offering.ServiceOffering;
+import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.DiskOfferingVO.Type;
+import com.cloud.utils.db.Attribute;
+import com.cloud.utils.db.Filter;
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.SearchCriteria.Op;
+
+
+@Local(value={DiskOfferingJoinDao.class})
+public class DiskOfferingJoinDaoImpl extends GenericDaoBase<DiskOfferingJoinVO, Long> implements DiskOfferingJoinDao {
+    public static final Logger s_logger = Logger.getLogger(DiskOfferingJoinDaoImpl.class);
+
+
+    private SearchBuilder<DiskOfferingJoinVO> dofIdSearch;
+    private final Attribute _typeAttr;
+
+     protected DiskOfferingJoinDaoImpl() {
+
+        dofIdSearch = createSearchBuilder();
+        dofIdSearch.and("id", dofIdSearch.entity().getId(), SearchCriteria.Op.EQ);
+        dofIdSearch.done();
+
+        _typeAttr = _allAttributes.get("type");
+
+        this._count = "select count(distinct id) from disk_offering_view WHERE ";
+    }
+
+
+
+    @Override
+    public DiskOfferingResponse newDiskOfferingResponse(DiskOfferingJoinVO offering) {
+
+        DiskOfferingResponse diskOfferingResponse = new DiskOfferingResponse();
+        diskOfferingResponse.setId(offering.getUuid());
+        diskOfferingResponse.setName(offering.getName());
+        diskOfferingResponse.setDisplayText(offering.getDisplayText());
+        diskOfferingResponse.setCreated(offering.getCreated());
+        diskOfferingResponse.setDiskSize(offering.getDiskSize() / (1024 * 1024 * 1024));
+
+                diskOfferingResponse.setDomain(offering.getDomainName());
+                diskOfferingResponse.setDomainId(offering.getDomainUuid());
+
+        diskOfferingResponse.setTags(offering.getTags());
+        diskOfferingResponse.setCustomized(offering.isCustomized());
+        diskOfferingResponse.setStorageType(offering.isUseLocalStorage() ? ServiceOffering.StorageType.local.toString() : ServiceOffering.StorageType.shared.toString());
+        diskOfferingResponse.setObjectName("diskoffering");
+        return diskOfferingResponse;
+    }
+
+
+    @Override
+    public DiskOfferingJoinVO newDiskOfferingView(DiskOffering offering) {
+        SearchCriteria<DiskOfferingJoinVO> sc = dofIdSearch.create();
+        sc.setParameters("id", offering.getId());
+        List<DiskOfferingJoinVO> offerings = searchIncludingRemoved(sc, null, null, false);
+        assert offerings != null && offerings.size() == 1 : "No disk offering found for offering id " + offering.getId();
+        return offerings.get(0);
+    }
+
+    @Override
+    public List<DiskOfferingJoinVO> searchIncludingRemoved(SearchCriteria<DiskOfferingJoinVO> sc, final Filter filter, final Boolean lock, final boolean cache) {
+        sc.addAnd(_typeAttr, Op.EQ, Type.Disk);
+        return super.searchIncludingRemoved(sc, filter, lock, cache);
+    }
+
+    @Override
+    public <K> List<K> customSearchIncludingRemoved(SearchCriteria<K> sc, final Filter filter) {
+        sc.addAnd(_typeAttr, Op.EQ, Type.Disk);
+        return super.customSearchIncludingRemoved(sc, filter);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/server/src/com/cloud/api/query/vo/DiskOfferingJoinVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/vo/DiskOfferingJoinVO.java b/server/src/com/cloud/api/query/vo/DiskOfferingJoinVO.java
new file mode 100644
index 0000000..7785bee
--- /dev/null
+++ b/server/src/com/cloud/api/query/vo/DiskOfferingJoinVO.java
@@ -0,0 +1,233 @@
+// 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.query.vo;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import com.cloud.storage.DiskOfferingVO.Type;
+import com.cloud.utils.db.GenericDao;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+@Entity
+@Table(name="disk_offering_view")
+public class DiskOfferingJoinVO extends BaseViewVO implements InternalIdentity, Identity {
+
+    @Id
+    @Column(name="id", updatable=false, nullable = false)
+    private long id;
+
+    @Column(name="uuid")
+    private String uuid;
+
+    @Column(name="name")
+    private String name;
+
+    @Column(name="display_text")
+    private String displayText;
+
+    @Column(name="disk_size")
+    long diskSize;
+
+    @Column(name="tags", length=4096)
+    String tags;
+
+    @Column(name="use_local_storage")
+    private boolean useLocalStorage;
+
+    @Column(name="system_use")
+    private boolean systemUse;
+
+    @Column(name="customized")
+    private boolean customized;
+
+    @Column(name="sort_key")
+    int sortKey;
+
+    @Column(name="type")
+    Type type;
+
+    @Column(name=GenericDao.CREATED_COLUMN)
+    private Date created;
+
+    @Column(name=GenericDao.REMOVED_COLUMN)
+    private Date removed;
+
+    @Column(name="domain_id")
+    private long domainId;
+
+    @Column(name="domain_uuid")
+    private String domainUuid;
+
+    @Column(name="domain_name")
+    private String domainName = null;
+
+    @Column(name="domain_path")
+    private String domainPath = null;
+
+
+    public DiskOfferingJoinVO() {
+    }
+
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDisplayText() {
+        return displayText;
+    }
+
+    public void setDisplayText(String displayText) {
+        this.displayText = displayText;
+    }
+
+    public long getDiskSize() {
+        return diskSize;
+    }
+
+    public void setDiskSize(long diskSize) {
+        this.diskSize = diskSize;
+    }
+
+    public String getTags() {
+        return tags;
+    }
+
+    public void setTags(String tags) {
+        this.tags = tags;
+    }
+
+    public boolean isUseLocalStorage() {
+        return useLocalStorage;
+    }
+
+    public void setUseLocalStorage(boolean useLocalStorage) {
+        this.useLocalStorage = useLocalStorage;
+    }
+
+    public boolean isSystemUse() {
+        return systemUse;
+    }
+
+    public void setSystemUse(boolean systemUse) {
+        this.systemUse = systemUse;
+    }
+
+    public boolean isCustomized() {
+        return customized;
+    }
+
+    public void setCustomized(boolean customized) {
+        this.customized = customized;
+    }
+
+    public Date getCreated() {
+        return created;
+    }
+
+    public void setCreated(Date created) {
+        this.created = created;
+    }
+
+    public Date getRemoved() {
+        return removed;
+    }
+
+    public void setRemoved(Date removed) {
+        this.removed = removed;
+    }
+
+    public long getDomainId() {
+        return domainId;
+    }
+
+    public void setDomainId(long domainId) {
+        this.domainId = domainId;
+    }
+
+    public String getDomainUuid() {
+        return domainUuid;
+    }
+
+    public void setDomainUuid(String domainUuid) {
+        this.domainUuid = domainUuid;
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+
+    public void setDomainName(String domainName) {
+        this.domainName = domainName;
+    }
+
+    public String getDomainPath() {
+        return domainPath;
+    }
+
+    public void setDomainPath(String domainPath) {
+        this.domainPath = domainPath;
+    }
+
+    public int getSortKey() {
+        return sortKey;
+    }
+
+    public void setSortKey(int sortKey) {
+        this.sortKey = sortKey;
+    }
+
+    public Type getType() {
+        return type;
+    }
+
+    public void setType(Type type) {
+        this.type = type;
+    }
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/server/src/com/cloud/configuration/DefaultComponentLibrary.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java
index e98946b..5a1b002 100755
--- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java
+++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java
@@ -27,6 +27,7 @@ import com.cloud.alert.dao.AlertDaoImpl;
 import com.cloud.api.query.QueryManagerImpl;
 import com.cloud.api.query.dao.AccountJoinDaoImpl;
 import com.cloud.api.query.dao.AsyncJobJoinDaoImpl;
+import com.cloud.api.query.dao.DiskOfferingJoinDaoImpl;
 import com.cloud.api.query.dao.DomainRouterJoinDaoImpl;
 import com.cloud.api.query.dao.InstanceGroupJoinDaoImpl;
 import com.cloud.api.query.dao.ProjectAccountJoinDaoImpl;
@@ -392,6 +393,7 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com
         addDao("AccountJoinDao", AccountJoinDaoImpl.class);
         addDao("AsyncJobJoinDao", AsyncJobJoinDaoImpl.class);
         addDao("StoragePoolJoinDao", StoragePoolJoinDaoImpl.class);
+        addDao("DiskOfferingJoinDao", DiskOfferingJoinDaoImpl.class);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index bad834d..0684440 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -46,7 +46,6 @@ import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoCmd;
 import org.apache.cloudstack.api.command.admin.cluster.ListClustersCmd;
 import org.apache.cloudstack.api.command.admin.config.ListCfgsByCmd;
 import org.apache.cloudstack.api.command.admin.resource.ListAlertsCmd;
-import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
 import org.apache.cloudstack.api.command.admin.systemvm.DestroySystemVmCmd;
 import org.apache.cloudstack.api.command.admin.systemvm.UpgradeSystemVMCmd;
 import org.apache.cloudstack.api.command.user.address.ListPublicIpAddressesCmd;
@@ -55,7 +54,6 @@ import org.apache.cloudstack.api.command.user.guest.ListGuestOsCategoriesCmd;
 import org.apache.cloudstack.api.command.user.guest.ListGuestOsCmd;
 import org.apache.cloudstack.api.command.user.iso.ListIsosCmd;
 import org.apache.cloudstack.api.command.user.iso.UpdateIsoCmd;
-import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd;
 import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd;
 import org.apache.cloudstack.api.command.user.ssh.ListSSHKeyPairsCmd;
 import org.apache.cloudstack.api.command.user.ssh.DeleteSSHKeyPairCmd;
@@ -91,9 +89,6 @@ import org.apache.cloudstack.api.command.admin.systemvm.StopSystemVmCmd;
 import org.apache.cloudstack.api.command.admin.domain.UpdateDomainCmd;
 import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
 import org.apache.cloudstack.api.command.admin.host.UpdateHostPasswordCmd;
-import com.cloud.api.query.dao.DomainRouterJoinDao;
-import com.cloud.api.query.dao.InstanceGroupJoinDao;
-
 import org.apache.cloudstack.api.command.user.vmgroup.UpdateVMGroupCmd;
 import org.apache.cloudstack.api.command.admin.resource.UploadCustomCertificateCmd;
 import org.apache.cloudstack.api.response.ExtractResponse;
@@ -103,13 +98,11 @@ import com.cloud.async.AsyncJobManager;
 import com.cloud.async.AsyncJobResult;
 import com.cloud.async.AsyncJobVO;
 import com.cloud.async.BaseAsyncJobExecutor;
-import com.cloud.async.dao.AsyncJobDao;
 import com.cloud.capacity.Capacity;
 import com.cloud.capacity.CapacityVO;
 import com.cloud.capacity.dao.CapacityDao;
 import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity;
 import com.cloud.configuration.Config;
-import com.cloud.configuration.ConfigurationManager;
 import com.cloud.configuration.Configuration;
 import com.cloud.configuration.ConfigurationVO;
 import com.cloud.configuration.dao.ConfigurationDao;
@@ -139,7 +132,6 @@ import com.cloud.event.EventTypes;
 import com.cloud.event.EventUtils;
 import com.cloud.event.EventVO;
 import com.cloud.event.dao.EventDao;
-import com.cloud.event.dao.EventJoinDao;
 import com.cloud.exception.CloudAuthenticationException;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InvalidParameterValueException;
@@ -179,7 +171,6 @@ import com.cloud.server.ResourceTag.TaggedResourceType;
 import com.cloud.server.auth.UserAuthenticator;
 import com.cloud.service.ServiceOfferingVO;
 import com.cloud.service.dao.ServiceOfferingDao;
-import com.cloud.storage.DiskOfferingVO;
 import com.cloud.storage.GuestOS;
 import com.cloud.storage.GuestOSCategoryVO;
 import com.cloud.storage.GuestOSVO;
@@ -187,7 +178,6 @@ import com.cloud.storage.GuestOsCategory;
 import com.cloud.storage.Storage;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.StorageManager;
-import com.cloud.storage.StoragePool;
 import com.cloud.storage.StoragePoolVO;
 import com.cloud.storage.Upload;
 import com.cloud.storage.Upload.Mode;
@@ -195,7 +185,6 @@ import com.cloud.storage.UploadVO;
 import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.Volume;
 import com.cloud.storage.VolumeVO;
-import com.cloud.storage.dao.DiskOfferingDao;
 import com.cloud.storage.dao.GuestOSCategoryDao;
 import com.cloud.storage.dao.GuestOSDao;
 import com.cloud.storage.dao.StoragePoolDao;
@@ -220,12 +209,10 @@ import com.cloud.user.UserVO;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.user.dao.SSHKeyPairDao;
 import com.cloud.user.dao.UserDao;
-import com.cloud.uservm.UserVm;
 import com.cloud.utils.EnumUtils;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.PasswordGenerator;
-import com.cloud.utils.PropertiesUtil;
 import com.cloud.utils.Ternary;
 import com.cloud.utils.component.Adapters;
 import com.cloud.utils.component.ComponentLocator;
@@ -258,7 +245,6 @@ import com.cloud.vm.VirtualMachineProfileImpl;
 import com.cloud.vm.dao.ConsoleProxyDao;
 import com.cloud.vm.dao.DomainRouterDao;
 import com.cloud.vm.dao.InstanceGroupDao;
-import com.cloud.vm.dao.NicDao;
 import com.cloud.vm.dao.SecondaryStorageVmDao;
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
@@ -274,12 +260,10 @@ public class ManagementServerImpl implements ManagementServer {
     private final AlertManager _alertMgr;
     private final IPAddressDao _publicIpAddressDao;
     private final DomainRouterDao _routerDao;
-    private final DomainRouterJoinDao _routerJoinDao;
     private final ConsoleProxyDao _consoleProxyDao;
     private final ClusterDao _clusterDao;
     private final SecondaryStorageVmDao _secStorageVmDao;
     private final EventDao _eventDao;
-    private final EventJoinDao _eventJoinDao;
     private final DataCenterDao _dcDao;
     private final VlanDao _vlanDao;
     private final AccountVlanMapDao _accountVlanMapDao;
@@ -294,7 +278,6 @@ public class ManagementServerImpl implements ManagementServer {
     private final SwiftManager _swiftMgr;
     private final S3Manager _s3Mgr;
     private final ServiceOfferingDao _offeringsDao;
-    private final DiskOfferingDao _diskOfferingDao;
     private final VMTemplateDao _templateDao;
     private final DomainDao _domainDao;
     private final AccountDao _accountDao;
@@ -303,25 +286,21 @@ public class ManagementServerImpl implements ManagementServer {
     private final GuestOSDao _guestOSDao;
     private final GuestOSCategoryDao _guestOSCategoryDao;
     private final StoragePoolDao _poolDao;
-    private final NicDao _nicDao;
     private final NetworkDao _networkDao;
     private final StorageManager _storageMgr;
     private final VirtualMachineManager _itMgr;
     private final HostPodDao _hostPodDao;
     private final VMInstanceDao _vmInstanceDao;
     private final VolumeDao _volumeDao;
-    private final AsyncJobDao _jobDao;
     private final AsyncJobManager _asyncMgr;
     private final int _purgeDelay;
     private final InstanceGroupDao _vmGroupDao;
-    private final InstanceGroupJoinDao _vmGroupJoinDao;
     private final UploadMonitor _uploadMonitor;
     private final UploadDao _uploadDao;
     private final SSHKeyPairDao _sshKeyPairDao;
     private final LoadBalancerDao _loadbalancerDao;
     private final HypervisorCapabilitiesDao _hypervisorCapabilitiesDao;
     private final Adapters<HostAllocator> _hostAllocators;
-    private final ConfigurationManager _configMgr;
     private final ResourceTagDao _resourceTagDao;
 
     @Inject
@@ -340,6 +319,8 @@ public class ManagementServerImpl implements ManagementServer {
 
     private final Map<String, String> _configs;
 
+    // even though this _statsCollector is never used here, but we create the singleton here to avoid null pointer exception in other places
+    // like ApiDbUtils to reference StatsCollector instance.
     private final StatsCollector _statsCollector;
 
     private final Map<String, Boolean> _availableIdsMap;
@@ -352,9 +333,7 @@ public class ManagementServerImpl implements ManagementServer {
         ComponentLocator locator = ComponentLocator.getLocator(Name);
         _configDao = locator.getDao(ConfigurationDao.class);
         _routerDao = locator.getDao(DomainRouterDao.class);
-        _routerJoinDao = locator.getDao(DomainRouterJoinDao.class);
         _eventDao = locator.getDao(EventDao.class);
-        _eventJoinDao = locator.getDao(EventJoinDao.class);
         _dcDao = locator.getDao(DataCenterDao.class);
         _vlanDao = locator.getDao(VlanDao.class);
         _accountVlanMapDao = locator.getDao(AccountVlanMapDao.class);
@@ -362,9 +341,7 @@ public class ManagementServerImpl implements ManagementServer {
         _hostDao = locator.getDao(HostDao.class);
         _detailsDao = locator.getDao(HostDetailsDao.class);
         _hostPodDao = locator.getDao(HostPodDao.class);
-        _jobDao = locator.getDao(AsyncJobDao.class);
         _clusterDao = locator.getDao(ClusterDao.class);
-        _nicDao = locator.getDao(NicDao.class);
         _networkDao = locator.getDao(NetworkDao.class);
         _loadbalancerDao = locator.getDao(LoadBalancerDao.class);
 
@@ -382,7 +359,6 @@ public class ManagementServerImpl implements ManagementServer {
         _userDao = locator.getDao(UserDao.class);
         _userVmDao = locator.getDao(UserVmDao.class);
         _offeringsDao = locator.getDao(ServiceOfferingDao.class);
-        _diskOfferingDao = locator.getDao(DiskOfferingDao.class);
         _templateDao = locator.getDao(VMTemplateDao.class);
         _domainDao = locator.getDao(DomainDao.class);
         _accountDao = locator.getDao(AccountDao.class);
@@ -392,7 +368,6 @@ public class ManagementServerImpl implements ManagementServer {
         _guestOSCategoryDao = locator.getDao(GuestOSCategoryDao.class);
         _poolDao = locator.getDao(StoragePoolDao.class);
         _vmGroupDao = locator.getDao(InstanceGroupDao.class);
-        _vmGroupJoinDao = locator.getDao(InstanceGroupJoinDao.class);
         _uploadDao = locator.getDao(UploadDao.class);
         _configs = _configDao.getConfiguration();
         _vmInstanceDao = locator.getDao(VMInstanceDao.class);
@@ -403,7 +378,6 @@ public class ManagementServerImpl implements ManagementServer {
         _itMgr = locator.getManager(VirtualMachineManager.class);
         _ksMgr = locator.getManager(KeystoreManager.class);
         _resourceMgr = locator.getManager(ResourceManager.class);
-        _configMgr = locator.getManager(ConfigurationManager.class);
         _resourceTagDao = locator.getDao(ResourceTagDao.class);
 
         _hypervisorCapabilitiesDao = locator.getDao(HypervisorCapabilitiesDao.class);
@@ -997,7 +971,7 @@ public class ManagementServerImpl implements ManagementServer {
 
         Pair<List<HostVO>, Integer> allHostsInClusterPair = searchForServers(startIndex, pageSize, null, hostType, null, null, null, cluster, null, null, null, null);
 
-        // filter out the current host        
+        // filter out the current host
         List<HostVO> allHostsInCluster = allHostsInClusterPair.first();
         allHostsInCluster.remove(srcHost);
         Pair<List<? extends Host>, Integer> otherHostsInCluster = new Pair<List <? extends Host>, Integer>(allHostsInCluster, new Integer(allHostsInClusterPair.second().intValue()-1));
@@ -2153,169 +2127,7 @@ public class ManagementServerImpl implements ManagementServer {
                 || (accountType == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) || (accountType == Account.ACCOUNT_TYPE_READ_ONLY_ADMIN));
     }
 
-    private List<DiskOfferingVO> searchDiskOfferingsInternal(Account account, Object name, Object id, Object keyword, Filter searchFilter) {
-        // it was decided to return all offerings for the user's domain, and
-        // everything above till root (for normal user
-        // or
-        // domain admin)
-        // list all offerings belonging to this domain, and all of its parents
-        // check the parent, if not null, add offerings for that parent to list
-        List<DiskOfferingVO> dol = new ArrayList<DiskOfferingVO>();
-        DomainVO domainRecord = _domainDao.findById(account.getDomainId());
-        boolean includePublicOfferings = true;
-        if (domainRecord != null) {
-            while (true) {
-                SearchBuilder<DiskOfferingVO> sb = _diskOfferingDao.createSearchBuilder();
-
-                sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
-                sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
-                sb.and("removed", sb.entity().getRemoved(), SearchCriteria.Op.NULL);
-
-                SearchCriteria<DiskOfferingVO> sc = sb.create();
-                if (keyword != null) {
-                    includePublicOfferings = false;
-                    SearchCriteria<DiskOfferingVO> ssc = _diskOfferingDao.createSearchCriteria();
-                    ssc.addOr("displayText", SearchCriteria.Op.LIKE, "%" + keyword + "%");
-                    ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
-
-                    sc.addAnd("name", SearchCriteria.Op.SC, ssc);
-                }
-
-                if (name != null) {
-                    includePublicOfferings = false;
-                    sc.setParameters("name", "%" + name + "%");
-                }
-
-                if (id != null) {
-                    includePublicOfferings = false;
-                    sc.setParameters("id", id);
-                }
-
-                // for this domain
-                sc.addAnd("domainId", SearchCriteria.Op.EQ, domainRecord.getId());
-
-                // search and add for this domain
-                dol.addAll(_diskOfferingDao.search(sc, searchFilter));
-
-                // try and move on to the next domain
-                if (domainRecord.getParent() != null) {
-                    domainRecord = _domainDao.findById(domainRecord.getParent());
-                } else {
-                    break;// now we got all the offerings for this user/dom adm
-                }
-            }
-        } else {
-            s_logger.error("Could not find the domainId for account:" + account.getAccountName());
-            throw new CloudAuthenticationException("Could not find the domainId for account:" + account.getAccountName());
-        }
-
-        // add all the public offerings to the sol list before returning
-        if (includePublicOfferings) {
-            dol.addAll(_diskOfferingDao.findPublicDiskOfferings());
-        }
-
-        return dol;
-
-    }
-
-    @Override
-    public List<DiskOfferingVO> searchForDiskOfferings(ListDiskOfferingsCmd cmd) {
-        // Note
-        // The list method for offerings is being modified in accordance with
-        // discussion with Will/Kevin
-        // For now, we will be listing the following based on the usertype
-        // 1. For root, we will list all offerings
-        // 2. For domainAdmin and regular users, we will list everything in
-        // their domains+parent domains ... all the way
-        // till
-        // root
 
-        Boolean isAscending = Boolean.parseBoolean(_configDao.getValue("sortkey.algorithm"));
-        isAscending = (isAscending == null ? true : isAscending);
-        Filter searchFilter = new Filter(DiskOfferingVO.class, "sortKey", isAscending, cmd.getStartIndex(), cmd.getPageSizeVal());
-        SearchBuilder<DiskOfferingVO> sb = _diskOfferingDao.createSearchBuilder();
-
-        // SearchBuilder and SearchCriteria are now flexible so that the search
-        // builder can be built with all possible
-        // search terms and only those with criteria can be set. The proper SQL
-        // should be generated as a result.
-        Account account = UserContext.current().getCaller();
-        Object name = cmd.getDiskOfferingName();
-        Object id = cmd.getId();
-        Object keyword = cmd.getKeyword();
-        Long domainId = cmd.getDomainId();
-        // Keeping this logic consistent with domain specific zones
-        // if a domainId is provided, we just return the disk offering
-        // associated with this domain
-        if (domainId != null) {
-            if (account.getType() == Account.ACCOUNT_TYPE_ADMIN) {
-                return _diskOfferingDao.listByDomainId(domainId);// no perm
-                                                                 // check
-            } else {
-                // check if the user's domain == do's domain || user's domain is
-                // a child of so's domain
-                if (isPermissible(account.getDomainId(), domainId)) {
-                    // perm check succeeded
-                    return _diskOfferingDao.listByDomainId(domainId);
-                } else {
-                    throw new PermissionDeniedException("The account:" + account.getAccountName()
-                            + " does not fall in the same domain hierarchy as the disk offering");
-                }
-            }
-        }
-
-        // For non-root users
-        if ((account.getType() == Account.ACCOUNT_TYPE_NORMAL || account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN)
-                || account.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
-            return searchDiskOfferingsInternal(account, name, id, keyword, searchFilter);
-        }
-
-        // For root users, preserving existing flow
-        sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
-        sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
-        sb.and("removed", sb.entity().getRemoved(), SearchCriteria.Op.NULL);
-
-        // FIXME: disk offerings should search back up the hierarchy for
-        // available disk offerings...
-        /*
-         * sb.addAnd("domainId", sb.entity().getDomainId(),
-         * SearchCriteria.Op.EQ); if (domainId != null) {
-         * SearchBuilder<DomainVO> domainSearch =
-         * _domainDao.createSearchBuilder(); domainSearch.addAnd("path",
-         * domainSearch.entity().getPath(), SearchCriteria.Op.LIKE);
-         * sb.join("domainSearch", domainSearch, sb.entity().getDomainId(),
-         * domainSearch.entity().getId()); }
-         */
-
-        SearchCriteria<DiskOfferingVO> sc = sb.create();
-        if (keyword != null) {
-            SearchCriteria<DiskOfferingVO> ssc = _diskOfferingDao.createSearchCriteria();
-            ssc.addOr("displayText", SearchCriteria.Op.LIKE, "%" + keyword + "%");
-            ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
-
-            sc.addAnd("name", SearchCriteria.Op.SC, ssc);
-        }
-
-        if (name != null) {
-            sc.setParameters("name", "%" + name + "%");
-        }
-
-        if (id != null) {
-            sc.setParameters("id", id);
-        }
-
-        // FIXME: disk offerings should search back up the hierarchy for
-        // available disk offerings...
-        /*
-         * if (domainId != null) { sc.setParameters("domainId", domainId); //
-         * //DomainVO domain = _domainDao.findById((Long)domainId); // // I want
-         * to join on user_vm.domain_id = domain.id where domain.path like
-         * 'foo%' //sc.setJoinParameters("domainSearch", "path",
-         * domain.getPath() + "%"); // }
-         */
-
-        return _diskOfferingDao.search(sc, searchFilter);
-    }
 
     @Override
     public List<Class<?>> getCommands() {
@@ -3321,6 +3133,7 @@ public class ManagementServerImpl implements ManagementServer {
 
     }
 
+    @Override
     public void enableAdminUser(String password) {
         String encodedPassword = null;
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/setup/db/create-schema-view.sql
----------------------------------------------------------------------
diff --git a/setup/db/create-schema-view.sql b/setup/db/create-schema-view.sql
index bf04c1c..63f5998 100644
--- a/setup/db/create-schema-view.sql
+++ b/setup/db/create-schema-view.sql
@@ -818,4 +818,27 @@ left join data_center on storage_pool.data_center_id = data_center.id
 left join host_pod_ref on storage_pool.pod_id = host_pod_ref.id
 left join storage_pool_details on storage_pool_details.pool_id = storage_pool.id and storage_pool_details.value = 'true'
 left join op_host_capacity on storage_pool.id = op_host_capacity.host_id and op_host_capacity.capacity_type = 3
-left join async_job on async_job.instance_id = storage_pool.id and async_job.instance_type = "StoragePool" and async_job.job_status = 0;
\ No newline at end of file
+left join async_job on async_job.instance_id = storage_pool.id and async_job.instance_type = "StoragePool" and async_job.job_status = 0;
+
+DROP VIEW IF EXISTS `cloud`.`disk_offering_view`;
+CREATE VIEW disk_offering_view AS
+select 
+disk_offering.id,
+disk_offering.uuid,
+disk_offering.name,
+disk_offering.display_text,
+disk_offering.disk_size,
+disk_offering.created,
+disk_offering.tags,
+disk_offering.customized,
+disk_offering.removed,
+disk_offering.use_local_storage,
+disk_offering.system_use,
+disk_offering.sort_key,
+disk_offering.type,
+domain.id domain_id, 
+domain.uuid domain_uuid,
+domain.name domain_name, 
+domain.path domain_path
+from disk_offering 
+left join domain on disk_offering.domain_id=domain.id;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/6db719d5/setup/db/db/schema-40to410.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-40to410.sql b/setup/db/db/schema-40to410.sql
index a9d168d..9513b20 100644
--- a/setup/db/db/schema-40to410.sql
+++ b/setup/db/db/schema-40to410.sql
@@ -945,4 +945,28 @@ left join storage_pool_details on storage_pool_details.pool_id = storage_pool.id
 left join op_host_capacity on storage_pool.id = op_host_capacity.host_id and op_host_capacity.capacity_type = 3
 left join async_job on async_job.instance_id = storage_pool.id and async_job.instance_type = "StoragePool" and async_job.job_status = 0;
 
+DROP VIEW IF EXISTS `cloud`.`disk_offering_view`;
+CREATE VIEW disk_offering_view AS
+select 
+disk_offering.id,
+disk_offering.uuid,
+disk_offering.name,
+disk_offering.display_text,
+disk_offering.disk_size,
+disk_offering.created,
+disk_offering.tags,
+disk_offering.customized,
+disk_offering.removed,
+disk_offering.use_local_storage,
+disk_offering.system_use,
+disk_offering.sort_key,
+disk_offering.type,
+domain.id domain_id, 
+domain.uuid domain_uuid,
+domain.name domain_name, 
+domain.path domain_path
+from disk_offering 
+left join domain on disk_offering.domain_id=domain.id;
+
+
 INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'direct.agent.pool.size', '500', 'Default size for DirectAgentPool');