http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/storage/StorageManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/StorageManagerImpl.java
index 6289a7a,96f299c..78c2469
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@@ -42,11 -42,12 +42,14 @@@ import java.util.concurrent.ScheduledEx
  import java.util.concurrent.TimeUnit;
  
  import javax.ejb.Local;
 +import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
+ import org.apache.cloudstack.api.command.admin.storage.*;
+ import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
+ import org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd;
  import org.apache.log4j.Logger;
 +import org.springframework.stereotype.Component;
  
  import com.cloud.agent.AgentManager;
  import com.cloud.agent.api.Answer;
@@@ -836,11 -834,23 +835,23 @@@ public class StorageManagerImpl impleme
  
              for (int i = 0; i < 2; i++) {
                  if (volume.getVolumeType() == Type.ROOT && 
Storage.ImageFormat.ISO != template.getFormat()) {
+                     if (pool.getPoolType() == StoragePoolType.CLVM) {
+                         //prepareISOForCreate does what we need, which is to 
tell us where the template is
+                         VMTemplateHostVO tmpltHostOn = 
_tmpltMgr.prepareISOForCreate(template, pool);
+                         if (tmpltHostOn == null) {
+                             continue;
+                         }
+                         HostVO secondaryStorageHost = 
_hostDao.findById(tmpltHostOn.getHostId());
+                         String tmpltHostUrl = 
secondaryStorageHost.getStorageUrl();
+                         String fullTmpltUrl = tmpltHostUrl + "/" + 
tmpltHostOn.getInstallPath();
+                         cmd = new CreateCommand(dskCh, fullTmpltUrl, new 
StorageFilerTO(pool));
+                     } else {
 -                        tmpltStoredOn = 
_tmpltMgr.prepareTemplateForCreate(template, pool);
 -                        if (tmpltStoredOn == null) {
 -                            continue;
 -                        }
 -                        cmd = new CreateCommand(dskCh, 
tmpltStoredOn.getLocalDownloadPath(), new StorageFilerTO(pool));
 +                    tmpltStoredOn = 
_tmpltMgr.prepareTemplateForCreate(template, pool);
 +                    if (tmpltStoredOn == null) {
 +                        continue;
 +                    }
 +                    cmd = new CreateCommand(dskCh, 
tmpltStoredOn.getLocalDownloadPath(), new StorageFilerTO(pool));
+                     }
                  } else {
                      if (volume.getVolumeType() == Type.ROOT && 
Storage.ImageFormat.ISO == template.getFormat()) {
                          VMTemplateHostVO tmpltHostOn = 
_tmpltMgr.prepareISOForCreate(template, pool);
@@@ -3439,12 -3459,25 +3459,25 @@@
  
              for (int i = 0; i < 2; i++) {
                  if (template != null && template.getFormat() != 
Storage.ImageFormat.ISO) {
+                     if (pool.getPoolType() == StoragePoolType.CLVM) {
+                         //prepareISOForCreate does what we need, which is to 
tell us where the template is
+                         VMTemplateHostVO tmpltHostOn = 
_tmpltMgr.prepareISOForCreate(template, pool);
+                         if (tmpltHostOn == null) {
+                             s_logger.debug("cannot find template " + 
template.getId() + " " + template.getName());
+                             return null;
+                         }
+                         HostVO secondaryStorageHost = 
_hostDao.findById(tmpltHostOn.getHostId());
+                         String tmpltHostUrl = 
secondaryStorageHost.getStorageUrl();
+                         String fullTmpltUrl = tmpltHostUrl + "/" + 
tmpltHostOn.getInstallPath();
+                         cmd = new CreateCommand(diskProfile, fullTmpltUrl, 
new StorageFilerTO(pool));
+                     } else {
 -                        tmpltStoredOn = 
_tmpltMgr.prepareTemplateForCreate(template, pool);
 -                        if (tmpltStoredOn == null) {
 -                            s_logger.debug("Cannot use this pool " + pool + " 
because we can't propagate template " + template);
 -                            return null;
 -                        }
 -                        cmd = new CreateCommand(diskProfile, 
tmpltStoredOn.getLocalDownloadPath(), new StorageFilerTO(pool));
 +                    tmpltStoredOn = 
_tmpltMgr.prepareTemplateForCreate(template, pool);
 +                    if (tmpltStoredOn == null) {
 +                        s_logger.debug("Cannot use this pool " + pool + " 
because we can't propagate template " + template);
 +                        return null;
 +                    }
 +                    cmd = new CreateCommand(diskProfile, 
tmpltStoredOn.getLocalDownloadPath(), new StorageFilerTO(pool));
+                     }
                  } else {
                      if (template != null && Storage.ImageFormat.ISO == 
template.getFormat()) {
                          VMTemplateHostVO tmpltHostOn = 
_tmpltMgr.prepareISOForCreate(template, pool);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
index cd597bc,02db43b..8093fd5
--- a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
+++ b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
@@@ -32,9 -34,8 +35,9 @@@ import javax.inject.Inject
  import javax.naming.ConfigurationException;
  
  import org.apache.log4j.Logger;
 +import org.springframework.stereotype.Component;
  
- import com.cloud.api.BaseCmd;
+ import org.apache.cloudstack.api.BaseCmd;
  import com.cloud.configuration.dao.ConfigurationDao;
  import com.cloud.dc.dao.DataCenterDao;
  import com.cloud.domain.DomainVO;
@@@ -919,5 -931,144 +933,144 @@@ public class VMTemplateDaoImpl extends 
                    (accountType == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) ||
                    (accountType == Account.ACCOUNT_TYPE_READ_ONLY_ADMIN));
        }
 -
 +    
+     @Override
+     public List<VMTemplateVO> findTemplatesToSyncToS3() {
+         return executeList(SELECT_S3_CANDIDATE_TEMPLATES, new Object[] {});
+     }
+ 
+     @Override
+     public Set<Pair<Long, Long>> searchS3Templates(final String name,
+             final String keyword, final TemplateFilter templateFilter,
+             final boolean isIso, final List<HypervisorType> hypers,
+             final Boolean bootable, final DomainVO domain, final Long 
pageSize,
+             final Long startIndex, final Long zoneId,
+             final HypervisorType hyperType, final boolean onlyReady,
+             final boolean showDomr, final List<Account> permittedAccounts,
+             final Account caller, final Map<String, String> tags) {
+ 
+         final String permittedAccountsStr = join(",", permittedAccounts);
+ 
+         final Transaction txn = Transaction.currentTxn();
+         txn.start();
+ 
+         Set<Pair<Long, Long>> templateZonePairList = new HashSet<Pair<Long, 
Long>>();
+         PreparedStatement pstmt = null;
+         ResultSet rs = null;
+         try {
+ 
+             final StringBuilder joinClause = new StringBuilder();
+             final StringBuilder whereClause = new StringBuilder(" WHERE 
t.removed IS NULL");
+ 
+             if (isIso) {
+                 whereClause.append(" AND t.format = 'ISO'");
+                 if (!hyperType.equals(HypervisorType.None)) {
+                     joinClause.append(" INNER JOIN guest_os guestOS on 
(guestOS.id = t.guest_os_id) INNER JOIN guest_os_hypervisor goh on ( 
goh.guest_os_id = guestOS.id) ");
+                     whereClause.append(" AND goh.hypervisor_type = '");
+                     whereClause.append(hyperType);
+                     whereClause.append("'");
+                 }
+             } else {
+                 whereClause.append(" AND t.format <> 'ISO'");
+                 if (hypers.isEmpty()) {
+                     return templateZonePairList;
+                 } else {
+                     final StringBuilder relatedHypers = new StringBuilder();
+                     for (HypervisorType hyper : hypers) {
+                         relatedHypers.append("'");
+                         relatedHypers.append(hyper.toString());
+                         relatedHypers.append("'");
+                         relatedHypers.append(",");
+                     }
+                     relatedHypers.setLength(relatedHypers.length() - 1);
+                     whereClause.append(" AND t.hypervisor_type IN (");
+                     whereClause.append(relatedHypers);
+                     whereClause.append(")");
+                 }
+             }
+ 
+             joinClause.append(" INNER JOIN  template_s3_ref tsr on (t.id = 
tsr.template_id)");
+ 
+             whereClause.append("AND t.name LIKE \"%");
+             whereClause.append(keyword == null ? keyword : name);
+             whereClause.append("%\"");
+ 
+             if (bootable != null) {
+                 whereClause.append(" AND t.bootable = ");
+                 whereClause.append(bootable);
+             }
+ 
+             if (!showDomr) {
+                 whereClause.append(" AND t.type != '");
+                 whereClause.append(Storage.TemplateType.SYSTEM);
+                 whereClause.append("'");
+             }
+ 
+             if (templateFilter == TemplateFilter.featured) {
+                 whereClause.append(" AND t.public = 1 AND t.featured = 1");
+             } else if ((templateFilter == TemplateFilter.self || 
templateFilter == TemplateFilter.selfexecutable)
+                     && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) {
+                 if (caller.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN
+                         || caller.getType() == 
Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
+                     joinClause.append(" INNER JOIN account a on (t.account_id 
= a.id) INNER JOIN domain d on (a.domain_id = d.id)");
+                     whereClause.append("  AND d.path LIKE '");
+                     whereClause.append(domain.getPath());
+                     whereClause.append("%'");
+                 } else {
+                     whereClause.append(" AND t.account_id IN (");
+                     whereClause.append(permittedAccountsStr);
+                     whereClause.append(")");
+                 }
+             } else if (templateFilter == TemplateFilter.sharedexecutable
+                     && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) {
+                 if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) {
+                     joinClause.append(" LEFT JOIN launch_permission lp ON 
t.id = lp.template_id WHERE (t.account_id IN (");
+                     joinClause.append(permittedAccountsStr);
+                     joinClause.append(") OR lp.account_id IN (");
+                     joinClause.append(permittedAccountsStr); 
+                     joinClause.append("))");
+                 } else {
+                     joinClause.append(" INNER JOIN account a on (t.account_id 
= a.id) ");
+                 }
+             } else if (templateFilter == TemplateFilter.executable
+                     && !permittedAccounts.isEmpty()) {
+                 whereClause.append(" AND (t.public = 1 OR t.account_id IN (");
+                 whereClause.append(permittedAccountsStr);
+                 whereClause.append("))");
+             } else if (templateFilter == TemplateFilter.community) {
+                 whereClause.append(" AND t.public = 1 AND t.featured = 0");
+             } else if (templateFilter == TemplateFilter.all
+                     && caller.getType() == Account.ACCOUNT_TYPE_ADMIN) {
+             } else if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN) {
+                 return templateZonePairList;
+             }
+ 
+             final StringBuilder sql = new 
StringBuilder(SELECT_TEMPLATE_S3_REF);
+             sql.append(joinClause);
+             sql.append(whereClause);
+             sql.append(getOrderByLimit(pageSize, startIndex));
+ 
+             pstmt = txn.prepareStatement(sql.toString());
+             rs = pstmt.executeQuery();
+             while (rs.next()) {
+                 final Pair<Long, Long> templateZonePair = new Pair<Long, 
Long>(
+                         rs.getLong(1), -1L);
+                 templateZonePairList.add(templateZonePair);
+             }
+             txn.commit();
+         } catch (Exception e) {
+             s_logger.warn("Error listing S3 templates", e);
+             if (txn != null) {
+                 txn.rollback();
+             }
+         } finally {
+             closeResources(pstmt, rs);
+             if (txn != null) {
+                 txn.close();
+             }
+         }
+ 
+         return templateZonePairList;
+     }
+ 
  }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/storage/dao/VolumeHostDaoImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
index b8b530a,6a0f71d..c4029ea
--- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
+++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
@@@ -23,11 -24,11 +24,13 @@@ 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.user.snapshot.CreateSnapshotPolicyCmd;
+ import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotsCmd;
  import org.apache.log4j.Logger;
 +import org.springframework.stereotype.Component;
  
  import com.cloud.agent.AgentManager;
  import com.cloud.agent.api.Answer;
@@@ -173,7 -175,9 +177,9 @@@ public class SnapshotManagerImpl implem
      private ResourceLimitService _resourceLimitMgr;
      @Inject
      private SwiftManager _swiftMgr;
 -    @Inject
 +    @Inject 
+     private S3Manager _s3Mgr;
+     @Inject 
      private SecondaryStorageVmManager _ssvmMgr;
      @Inject
      private ResourceManager _resourceMgr;
@@@ -197,15 -201,13 +203,13 @@@
      
      protected Answer sendToPool(Volume vol, Command cmd) {
          StoragePool pool = _storagePoolDao.findById(vol.getPoolId());
-         VMInstanceVO vm = _vmDao.findById(vol.getInstanceId());
 -        
 +
          long[] hostIdsToTryFirst = null;
-         if (vm != null) {
-             if(vm.getHostId() != null) {
-                 hostIdsToTryFirst = new long[] { vm.getHostId() };
-             } else if(vm.getLastHostId() != null) {
-                 hostIdsToTryFirst = new long[] { vm.getLastHostId() };
-             }
+         
+         Long vmHostId = getHostIdForSnapshotOperation(vol);
+                 
+         if (vmHostId != null) {
+             hostIdsToTryFirst = new long[] { vmHostId };
          }
  
          List<Long> hostIdsToAvoid = new ArrayList<Long>();
@@@ -590,8 -670,10 +672,10 @@@
  
              if ( swift != null ) {
                  backupSnapshotCommand.setSwift(swift);
+             } else if (s3 != null) {
+                 backupSnapshotCommand.setS3(s3);
              }
 -
 +            
              String backedUpSnapshotUuid = null;
              // By default, assume failed.
              boolean backedUp = false;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
index bea077d,d7deb6f..c6fc530
--- a/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
+++ b/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
@@@ -24,15 -24,14 +24,16 @@@ import java.util.Timer
  import java.util.TimerTask;
  
  import javax.ejb.Local;
 +import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
+ import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotCmd;
  import org.apache.log4j.Logger;
 +import org.springframework.stereotype.Component;
  
+ import org.apache.cloudstack.api.ApiConstants;
  import com.cloud.api.ApiDispatcher;
  import com.cloud.api.ApiGsonHelper;
- import com.cloud.api.commands.CreateSnapshotCmd;
  import com.cloud.user.Account;
  import com.cloud.async.AsyncJobManager;
  import com.cloud.async.AsyncJobResult;
@@@ -248,15 -247,10 +249,10 @@@ public class SnapshotSchedulerImpl impl
                  params.put("id", ""+cmd.getEntityId());
                  params.put("ctxStartEventId", "1");
  
-                 AsyncJobVO job = new AsyncJobVO();
-                 job.setUserId(userId);
-                 // Just have SYSTEM own the job for now.  Users won't be able 
to see this job, but
-                 // it's an internal job so probably not a huge deal.
-                 job.setAccountId(1L);
-                 job.setCmd(CreateSnapshotCmd.class.getName());
-                 job.setInstanceId(cmd.getEntityId());
-                 
job.setCmdInfo(ApiGsonHelper.getBuilder().create().toJson(params));
+                 AsyncJobVO job = new AsyncJobVO(User.UID_SYSTEM, 
volume.getAccountId(), CreateSnapshotCmd.class.getName(),
+                         ApiGsonHelper.getBuilder().create().toJson(params), 
cmd.getEntityId(),
+                         cmd.getInstanceType());
 -                
 +
                  long jobId = _asyncMgr.submitAsyncJob(job);
  
                  tmpSnapshotScheduleVO.setAsyncJobId(jobId);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/storage/swift/SwiftManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/swift/SwiftManagerImpl.java
index d7e7067,dab16ce..ef3deed
--- a/server/src/com/cloud/storage/swift/SwiftManagerImpl.java
+++ b/server/src/com/cloud/storage/swift/SwiftManagerImpl.java
@@@ -23,11 -23,12 +23,14 @@@ import java.util.List
  import java.util.Map;
  
  import javax.ejb.Local;
 +import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
+ import org.apache.cloudstack.api.command.admin.swift.ListSwiftsCmd;
+ import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd;
+ import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd;
  import org.apache.log4j.Logger;
 +import org.springframework.stereotype.Component;
  
  import com.cloud.agent.AgentManager;
  import com.cloud.agent.api.Answer;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/tags/TaggedResourceManagerImpl.java
index 020b163,42d3c83..a5fb8a0
--- a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
+++ b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
@@@ -22,13 -22,14 +22,16 @@@ import java.util.List
  import java.util.Map;
  
  import javax.ejb.Local;
 +import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
+ import org.apache.cloudstack.api.command.user.tag.ListTagsCmd;
  import org.apache.log4j.Logger;
 +import org.springframework.stereotype.Component;
  
- import com.cloud.api.commands.ListTagsCmd;
+ 
+ import com.cloud.api.query.dao.ResourceTagJoinDao;
+ import com.cloud.api.query.vo.ResourceTagJoinVO;
  import com.cloud.domain.Domain;
  import com.cloud.event.ActionEvent;
  import com.cloud.event.EventTypes;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/template/HyervisorTemplateAdapter.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/template/HyervisorTemplateAdapter.java
index 8cb6bd1,c80d1de..732b153
--- a/server/src/com/cloud/template/HyervisorTemplateAdapter.java
+++ b/server/src/com/cloud/template/HyervisorTemplateAdapter.java
@@@ -24,10 -24,10 +24,12 @@@ import java.net.UnknownHostException
  import java.util.List;
  
  import javax.ejb.Local;
 +import javax.inject.Inject;
  
+ import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd;
+ import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd;
  import org.apache.log4j.Logger;
 +import org.springframework.stereotype.Component;
  
  import com.cloud.agent.AgentManager;
  import com.cloud.agent.api.Answer;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/template/TemplateAdapter.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/template/TemplateAdapter.java
index 0a1293b,a5eb42d..19cfef0
--- a/server/src/com/cloud/template/TemplateAdapter.java
+++ b/server/src/com/cloud/template/TemplateAdapter.java
@@@ -18,13 -18,12 +18,13 @@@ package com.cloud.template
  
  import java.util.Map;
  
- import com.cloud.api.commands.DeleteIsoCmd;
- import com.cloud.api.commands.DeleteTemplateCmd;
- import com.cloud.api.commands.RegisterIsoCmd;
- import com.cloud.api.commands.RegisterTemplateCmd;
+ import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd;
+ import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd;
+ import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd;
+ import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
  import com.cloud.exception.ResourceAllocationException;
  import com.cloud.hypervisor.Hypervisor.HypervisorType;
 +import com.cloud.storage.TemplateProfile;
  import com.cloud.storage.VMTemplateVO;
  import com.cloud.user.Account;
  import com.cloud.utils.component.Adapter;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/template/TemplateAdapterBase.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/template/TemplateAdapterBase.java
index 781e0c0,c938daa..d0a0ec2
--- a/server/src/com/cloud/template/TemplateAdapterBase.java
+++ b/server/src/com/cloud/template/TemplateAdapterBase.java
@@@ -19,17 -19,16 +19,17 @@@ package com.cloud.template
  import java.util.List;
  import java.util.Map;
  
 +import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
+ import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd;
+ import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd;
+ import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
  import org.apache.log4j.Logger;
  
- import com.cloud.api.ApiConstants;
+ import org.apache.cloudstack.api.ApiConstants;
  import com.cloud.api.ApiDBUtils;
- import com.cloud.api.commands.DeleteIsoCmd;
- import com.cloud.api.commands.DeleteTemplateCmd;
- import com.cloud.api.commands.RegisterIsoCmd;
- import com.cloud.api.commands.RegisterTemplateCmd;
+ import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd;
  import com.cloud.configuration.Resource.ResourceType;
  import com.cloud.configuration.dao.ConfigurationDao;
  import com.cloud.dc.DataCenterVO;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/template/TemplateManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/template/TemplateManagerImpl.java
index 289bcf9,1372111..7cce9a7
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@@ -32,13 -32,15 +32,17 @@@ import java.util.concurrent.ScheduledEx
  import java.util.concurrent.TimeUnit;
  
  import javax.ejb.Local;
 +import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
+ import org.apache.cloudstack.api.BaseListTemplateOrIsoPermissionsCmd;
+ import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoPermissionsCmd;
+ import org.apache.cloudstack.api.command.user.iso.*;
+ import org.apache.cloudstack.api.command.user.template.*;
  import org.apache.log4j.Logger;
 +import org.springframework.stereotype.Component;
  
- import com.cloud.acl.SecurityChecker.AccessType;
+ import org.apache.cloudstack.acl.SecurityChecker.AccessType;
  import com.cloud.agent.AgentManager;
  import com.cloud.agent.api.Answer;
  import com.cloud.agent.api.downloadTemplateFromSwiftToSecondaryStorageCommand;
@@@ -209,9 -206,10 +208,10 @@@ public class TemplateManagerImpl implem
      ExecutorService _preloadExecutor;
      ScheduledExecutorService _swiftTemplateSyncExecutor;
      
+     private ScheduledExecutorService _s3TemplateSyncExecutor = null;
  
 -    @Inject (adapter=TemplateAdapter.class)
 -    protected Adapters<TemplateAdapter> _adapters;
 +    @Inject
 +    protected List<TemplateAdapter> _adapters;
      
      private TemplateAdapter getAdapter(HypervisorType type) {
        TemplateAdapter adapter = null;
@@@ -1043,7 -1089,16 +1091,16 @@@
          _storagePoolMaxWaitSeconds = 
NumbersUtil.parseInt(_configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()),
 3600);
          _preloadExecutor = Executors.newFixedThreadPool(8, new 
NamedThreadFactory("Template-Preloader"));
          _swiftTemplateSyncExecutor = Executors.newScheduledThreadPool(1, new 
NamedThreadFactory("swift-template-sync-Executor"));
+ 
+         if (_s3Mgr.isS3Enabled()) {
+             _s3TemplateSyncExecutor = Executors
+                     .newSingleThreadScheduledExecutor(new NamedThreadFactory(
+                             "s3-template-sync"));
+         } else {
+             s_logger.info("S3 secondary storage synchronization is 
disabled.");
+         }
+ 
 -      return false;
 +        return false;
      }
      
      protected TemplateManagerImpl() {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/test/DatabaseConfig.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/user/AccountManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/user/AccountManagerImpl.java
index d0ae748,c6a7d51..47b4747
--- a/server/src/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/com/cloud/user/AccountManagerImpl.java
@@@ -34,23 -34,23 +34,25 @@@ import javax.crypto.Mac
  import javax.crypto.SecretKey;
  import javax.crypto.spec.SecretKeySpec;
  import javax.ejb.Local;
 +import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
+ import org.apache.cloudstack.acl.ControlledEntity;
+ import org.apache.cloudstack.acl.SecurityChecker;
+ import org.apache.cloudstack.api.command.admin.account.UpdateAccountCmd;
+ import org.apache.cloudstack.api.command.admin.user.RegisterCmd;
  import org.apache.commons.codec.binary.Base64;
  import org.apache.log4j.Logger;
 +import org.springframework.stereotype.Component;
  
- import com.cloud.acl.ControlledEntity;
- import com.cloud.acl.SecurityChecker;
- import com.cloud.acl.SecurityChecker.AccessType;
+ import org.apache.cloudstack.acl.SecurityChecker.AccessType;
  import com.cloud.api.ApiDBUtils;
- import com.cloud.api.commands.DeleteUserCmd;
- import com.cloud.api.commands.ListAccountsCmd;
- import com.cloud.api.commands.ListUsersCmd;
- import com.cloud.api.commands.RegisterCmd;
- import com.cloud.api.commands.UpdateAccountCmd;
- import com.cloud.api.commands.UpdateUserCmd;
+ import com.cloud.api.query.dao.UserAccountJoinDao;
+ import com.cloud.api.query.vo.ControlledViewEntity;
+ 
+ 
+ import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd;
+ import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd;
  import com.cloud.configuration.Config;
  import com.cloud.configuration.ConfigurationManager;
  import com.cloud.configuration.ResourceLimit;
@@@ -221,9 -218,10 +220,11 @@@ public class AccountManagerImpl impleme
      private DomainRouterDao _routerDao;
      @Inject
      Site2SiteVpnManager _vpnMgr;
+     @Inject
+     private AutoScaleManager _autoscaleMgr;
  
 -    private Adapters<UserAuthenticator> _userAuthenticators;
 +    @Inject
 +    private List<UserAuthenticator> _userAuthenticators;
  
      private final ScheduledExecutorService _executor = 
Executors.newScheduledThreadPool(1, new NamedThreadFactory("AccountChecker"));
  
@@@ -918,9 -934,20 +933,20 @@@
  
              user.setUsername(userName);
          }
 -
 +        
          if (password != null) {
-             user.setPassword(password);
+             String encodedPassword = null;
+             for (Enumeration<UserAuthenticator> en = 
_userAuthenticators.enumeration(); en.hasMoreElements();) {
+                 UserAuthenticator authenticator = en.nextElement();
+                 encodedPassword = authenticator.encode(password);
+                 if (encodedPassword != null) {
+                     break;
+                 }
+             }
+             if (encodedPassword == null) {
+               throw new CloudRuntimeException("Failed to encode password");
+             }
+             user.setPassword(encodedPassword);
          }
          if (email != null) {
              user.setEmail(email);
@@@ -2327,8 -2168,51 +2166,51 @@@
          }
      }
  
 -    @Override
 +      @Override
+     public void buildACLViewSearchBuilder(SearchBuilder<? extends 
ControlledViewEntity> sb, Long domainId,
+             boolean isRecursive, List<Long> permittedAccounts, 
ListProjectResourcesCriteria listProjectResourcesCriteria) {
+ 
+         sb.and("accountIdIN", sb.entity().getAccountId(), 
SearchCriteria.Op.IN);
+         sb.and("domainId", sb.entity().getDomainId(), SearchCriteria.Op.EQ);
+ 
+         if (((permittedAccounts.isEmpty()) && (domainId != null) && 
isRecursive)) {
+             // if accountId isn't specified, we can do a domain match for the
+             // admin case if isRecursive is true
+             sb.and("domainPath", sb.entity().getDomainPath(), 
SearchCriteria.Op.LIKE);
+         }
+ 
+         if (listProjectResourcesCriteria != null) {
+             if (listProjectResourcesCriteria == 
Project.ListProjectResourcesCriteria.ListProjectResourcesOnly) {
+                 sb.and("accountType", sb.entity().getAccountType(), 
SearchCriteria.Op.EQ);
+             } else if (listProjectResourcesCriteria == 
Project.ListProjectResourcesCriteria.SkipProjectResources) {
+                 sb.and("accountType", sb.entity().getAccountType(), 
SearchCriteria.Op.NEQ);
+             }
+         }
+ 
+     }
+ 
+     @Override
+     public void buildACLViewSearchCriteria(SearchCriteria<? extends 
ControlledViewEntity> sc,
+             Long domainId, boolean isRecursive, List<Long> permittedAccounts, 
ListProjectResourcesCriteria listProjectResourcesCriteria) {
+ 
+         if (listProjectResourcesCriteria != null) {
+             sc.setParameters("accountType", Account.ACCOUNT_TYPE_PROJECT);
+         }
+ 
+         if (!permittedAccounts.isEmpty()) {
+             sc.setParameters("accountIdIN", permittedAccounts.toArray());
+         } else if (domainId != null) {
+             DomainVO domain = _domainDao.findById(domainId);
+             if (isRecursive) {
+                 sc.setParameters("domainPath", domain.getPath() + "%");
+             } else {
+                 sc.setParameters("domainId", domainId);
+             }
+         }
+     }
+ 
+     @Override
 -    public UserAccount getUserByApiKey(String apiKey) {
 -        return _userAccountDao.getUserByApiKey(apiKey);
 -    }
 +      public UserAccount getUserByApiKey(String apiKey) {
 +              return _userAccountDao.getUserByApiKey(apiKey);
 +      }
  }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/user/DomainManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/user/DomainManagerImpl.java
index 8f69c22,123b895..15b8a11
--- a/server/src/com/cloud/user/DomainManagerImpl.java
+++ b/server/src/com/cloud/user/DomainManagerImpl.java
@@@ -22,14 -22,12 +22,14 @@@ import java.util.Map
  import java.util.Set;
  
  import javax.ejb.Local;
 +import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
+ import org.apache.cloudstack.api.command.admin.domain.ListDomainChildrenCmd;
+ import org.apache.cloudstack.api.command.admin.domain.ListDomainsCmd;
  import org.apache.log4j.Logger;
 +import org.springframework.stereotype.Component;
  
- import com.cloud.api.commands.ListDomainChildrenCmd;
- import com.cloud.api.commands.ListDomainsCmd;
  import com.cloud.configuration.ResourceLimit;
  import com.cloud.configuration.dao.ResourceCountDao;
  import com.cloud.domain.Domain;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/uuididentity/IdentityServiceImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/uuididentity/IdentityServiceImpl.java
index 9cde212,3cd2bc9..a6edda2
--- a/server/src/com/cloud/uuididentity/IdentityServiceImpl.java
+++ b/server/src/com/cloud/uuididentity/IdentityServiceImpl.java
@@@ -19,13 -19,10 +19,11 @@@ package com.cloud.uuididentity
  import java.util.Map;
  
  import javax.ejb.Local;
 +import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
- import org.springframework.stereotype.Component;
- 
- import com.cloud.api.IdentityMapper;
- import com.cloud.api.IdentityService;
+ import org.apache.cloudstack.api.IdentityService;
+ import com.cloud.utils.component.Inject;
  import com.cloud.utils.component.Manager;
  import com.cloud.uuididentity.dao.IdentityDao;
  

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/30f2565d/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
index f35b57c,49d2fa7..7be63ba
--- a/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
+++ b/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
@@@ -26,9 -26,7 +26,8 @@@ import java.util.UUID
  import javax.ejb.Local;
  
  import org.apache.log4j.Logger;
 +import org.springframework.stereotype.Component;
  
- import com.cloud.api.IdentityMapper;
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.server.ResourceTag.TaggedResourceType;
  import com.cloud.utils.Pair;

Reply via email to