mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-11-04 00:02:37 +01:00 
			
		
		
		
	Merge remote-tracking branch 'origin/4.13'
This commit is contained in:
		
						commit
						424f10cc77
					
				@ -1052,6 +1052,10 @@ public class TemplateServiceImpl implements TemplateService {
 | 
			
		||||
        DataObject templateOnStore = destStore.create(tmplForCopy);
 | 
			
		||||
        templateOnStore.processEvent(Event.CreateOnlyRequested);
 | 
			
		||||
 | 
			
		||||
        if (templateOnStore instanceof TemplateObject) {
 | 
			
		||||
            ((TemplateObject)templateOnStore).getImage().setChecksum(null);
 | 
			
		||||
        } // else we don't know what to do.
 | 
			
		||||
 | 
			
		||||
        if (s_logger.isDebugEnabled()) {
 | 
			
		||||
            s_logger.debug("Invoke datastore driver createAsync to create template on destination store");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -53,29 +53,21 @@ import com.cloud.configuration.Config;
 | 
			
		||||
import com.cloud.storage.RegisterVolumePayload;
 | 
			
		||||
import com.cloud.storage.Storage.ImageFormat;
 | 
			
		||||
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
 | 
			
		||||
import com.cloud.storage.Volume;
 | 
			
		||||
import com.cloud.storage.dao.VMTemplateDao;
 | 
			
		||||
import com.cloud.storage.dao.VolumeDao;
 | 
			
		||||
import com.cloud.storage.template.TemplateConstants;
 | 
			
		||||
import com.cloud.storage.upload.UploadListener;
 | 
			
		||||
import com.cloud.template.VirtualMachineTemplate;
 | 
			
		||||
import com.cloud.utils.component.ComponentContext;
 | 
			
		||||
import com.cloud.utils.component.ManagerBase;
 | 
			
		||||
import com.cloud.utils.exception.CloudRuntimeException;
 | 
			
		||||
 | 
			
		||||
@Component
 | 
			
		||||
public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor {
 | 
			
		||||
    static final Logger s_logger = Logger.getLogger(DownloadMonitorImpl.class);
 | 
			
		||||
    static final Logger LOGGER = Logger.getLogger(DownloadMonitorImpl.class);
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
    private TemplateDataStoreDao _vmTemplateStoreDao;
 | 
			
		||||
    @Inject
 | 
			
		||||
    private VolumeDao _volumeDao;
 | 
			
		||||
    @Inject
 | 
			
		||||
    private VolumeDataStoreDao _volumeStoreDao;
 | 
			
		||||
    @Inject
 | 
			
		||||
    private final VMTemplateDao _templateDao = null;
 | 
			
		||||
    @Inject
 | 
			
		||||
    private AgentManager _agentMgr;
 | 
			
		||||
    @Inject
 | 
			
		||||
    private ConfigurationDao _configDao;
 | 
			
		||||
@ -94,7 +86,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
 | 
			
		||||
 | 
			
		||||
        String cert = configs.get("secstorage.ssl.cert.domain");
 | 
			
		||||
        if (!"realhostip.com".equalsIgnoreCase(cert)) {
 | 
			
		||||
            s_logger.warn("Only realhostip.com ssl cert is supported, ignoring self-signed and other certs");
 | 
			
		||||
            LOGGER.warn("Only realhostip.com ssl cert is supported, ignoring self-signed and other certs");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        _copyAuthPasswd = configs.get("secstorage.copy.password");
 | 
			
		||||
@ -125,7 +117,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
 | 
			
		||||
 | 
			
		||||
    private void initiateTemplateDownload(DataObject template, AsyncCompletionCallback<DownloadAnswer> callback) {
 | 
			
		||||
        boolean downloadJobExists = false;
 | 
			
		||||
        TemplateDataStoreVO vmTemplateStore = null;
 | 
			
		||||
        TemplateDataStoreVO vmTemplateStore;
 | 
			
		||||
        DataStore store = template.getDataStore();
 | 
			
		||||
 | 
			
		||||
        vmTemplateStore = _vmTemplateStoreDao.findByStoreTemplate(store.getId(), template.getId());
 | 
			
		||||
@ -141,7 +133,6 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
 | 
			
		||||
        Long maxTemplateSizeInBytes = getMaxTemplateSizeInBytes();
 | 
			
		||||
        if (vmTemplateStore != null) {
 | 
			
		||||
            start();
 | 
			
		||||
            VirtualMachineTemplate tmpl = _templateDao.findById(template.getId());
 | 
			
		||||
            DownloadCommand dcmd = new DownloadCommand((TemplateObjectTO)(template.getTO()), maxTemplateSizeInBytes);
 | 
			
		||||
            dcmd.setProxy(getHttpProxy());
 | 
			
		||||
            if (downloadJobExists) {
 | 
			
		||||
@ -153,7 +144,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
 | 
			
		||||
            EndPoint ep = _epSelector.select(template);
 | 
			
		||||
            if (ep == null) {
 | 
			
		||||
                String errMsg = "There is no secondary storage VM for downloading template to image store " + store.getName();
 | 
			
		||||
                s_logger.warn(errMsg);
 | 
			
		||||
                LOGGER.warn(errMsg);
 | 
			
		||||
                throw new CloudRuntimeException(errMsg);
 | 
			
		||||
            }
 | 
			
		||||
            DownloadListener dl = new DownloadListener(ep, store, template, _timer, this, dcmd, callback);
 | 
			
		||||
@ -164,14 +155,14 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
 | 
			
		||||
                // DownloadListener to use
 | 
			
		||||
                // new ObjectInDataStore.State transition. TODO: fix this later
 | 
			
		||||
                // to be able to remove downloadState from template_store_ref.
 | 
			
		||||
                s_logger.info("found existing download job");
 | 
			
		||||
                LOGGER.info("found existing download job");
 | 
			
		||||
                dl.setCurrState(vmTemplateStore.getDownloadState());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            try {
 | 
			
		||||
                ep.sendMessageAsync(dcmd, new UploadListener.Callback(ep.getId(), dl));
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                s_logger.warn("Unable to start /resume download of template " + template.getId() + " to " + store.getName(), e);
 | 
			
		||||
                LOGGER.warn("Unable to start /resume download of template " + template.getId() + " to " + store.getName(), e);
 | 
			
		||||
                dl.setDisconnected();
 | 
			
		||||
                dl.scheduleStatusCheck(RequestType.GET_OR_RESTART);
 | 
			
		||||
            }
 | 
			
		||||
@ -187,12 +178,12 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
 | 
			
		||||
                if (template.getUri() != null) {
 | 
			
		||||
                    initiateTemplateDownload(template, callback);
 | 
			
		||||
                } else {
 | 
			
		||||
                    s_logger.info("Template url is null, cannot download");
 | 
			
		||||
                    LOGGER.info("Template url is null, cannot download");
 | 
			
		||||
                    DownloadAnswer ans = new DownloadAnswer("Template url is null", Status.UNKNOWN);
 | 
			
		||||
                    callback.complete(ans);
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                s_logger.info("Template download is already in progress or already downloaded");
 | 
			
		||||
                LOGGER.info("Template download is already in progress or already downloaded");
 | 
			
		||||
                DownloadAnswer ans =
 | 
			
		||||
                        new DownloadAnswer("Template download is already in progress or already downloaded", Status.UNKNOWN);
 | 
			
		||||
                callback.complete(ans);
 | 
			
		||||
@ -203,7 +194,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
 | 
			
		||||
    @Override
 | 
			
		||||
    public void downloadVolumeToStorage(DataObject volume, AsyncCompletionCallback<DownloadAnswer> callback) {
 | 
			
		||||
        boolean downloadJobExists = false;
 | 
			
		||||
        VolumeDataStoreVO volumeHost = null;
 | 
			
		||||
        VolumeDataStoreVO volumeHost;
 | 
			
		||||
        DataStore store = volume.getDataStore();
 | 
			
		||||
        VolumeInfo volInfo = (VolumeInfo)volume;
 | 
			
		||||
        RegisterVolumePayload payload = (RegisterVolumePayload)volInfo.getpayload();
 | 
			
		||||
@ -214,7 +205,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
 | 
			
		||||
        volumeHost = _volumeStoreDao.findByStoreVolume(store.getId(), volume.getId());
 | 
			
		||||
        if (volumeHost == null) {
 | 
			
		||||
            volumeHost = new VolumeDataStoreVO(store.getId(), volume.getId(), new Date(), 0, Status.NOT_DOWNLOADED, null, null, "jobid0000", null, url, checkSum);
 | 
			
		||||
            _volumeStoreDao.persist(volumeHost);
 | 
			
		||||
            volumeHost = _volumeStoreDao.persist(volumeHost);
 | 
			
		||||
        } else if ((volumeHost.getJobId() != null) && (volumeHost.getJobId().length() > 2)) {
 | 
			
		||||
            downloadJobExists = true;
 | 
			
		||||
        } else {
 | 
			
		||||
@ -225,35 +216,32 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Long maxVolumeSizeInBytes = getMaxVolumeSizeInBytes();
 | 
			
		||||
        if (volumeHost != null) {
 | 
			
		||||
            start();
 | 
			
		||||
            Volume vol = _volumeDao.findById(volume.getId());
 | 
			
		||||
            DownloadCommand dcmd = new DownloadCommand((VolumeObjectTO)(volume.getTO()), maxVolumeSizeInBytes, checkSum, url, format);
 | 
			
		||||
            dcmd.setProxy(getHttpProxy());
 | 
			
		||||
            if (downloadJobExists) {
 | 
			
		||||
                dcmd = new DownloadProgressCommand(dcmd, volumeHost.getJobId(), RequestType.GET_OR_RESTART);
 | 
			
		||||
                dcmd.setResourceType(ResourceType.VOLUME);
 | 
			
		||||
            }
 | 
			
		||||
        start();
 | 
			
		||||
        DownloadCommand dcmd = new DownloadCommand((VolumeObjectTO)(volume.getTO()), maxVolumeSizeInBytes, checkSum, url, format);
 | 
			
		||||
        dcmd.setProxy(getHttpProxy());
 | 
			
		||||
        if (downloadJobExists) {
 | 
			
		||||
            dcmd = new DownloadProgressCommand(dcmd, volumeHost.getJobId(), RequestType.GET_OR_RESTART);
 | 
			
		||||
            dcmd.setResourceType(ResourceType.VOLUME);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
            EndPoint ep = _epSelector.select(volume);
 | 
			
		||||
            if (ep == null) {
 | 
			
		||||
                s_logger.warn("There is no secondary storage VM for image store " + store.getName());
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            DownloadListener dl = new DownloadListener(ep, store, volume, _timer, this, dcmd, callback);
 | 
			
		||||
            ComponentContext.inject(dl); // auto-wired those injected fields in DownloadListener
 | 
			
		||||
        EndPoint ep = _epSelector.select(volume);
 | 
			
		||||
        if (ep == null) {
 | 
			
		||||
            LOGGER.warn("There is no secondary storage VM for image store " + store.getName());
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        DownloadListener dl = new DownloadListener(ep, store, volume, _timer, this, dcmd, callback);
 | 
			
		||||
        ComponentContext.inject(dl); // auto-wired those injected fields in DownloadListener
 | 
			
		||||
 | 
			
		||||
            if (downloadJobExists) {
 | 
			
		||||
                dl.setCurrState(volumeHost.getDownloadState());
 | 
			
		||||
            }
 | 
			
		||||
        if (downloadJobExists) {
 | 
			
		||||
            dl.setCurrState(volumeHost.getDownloadState());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
            try {
 | 
			
		||||
                ep.sendMessageAsync(dcmd, new UploadListener.Callback(ep.getId(), dl));
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                s_logger.warn("Unable to start /resume download of volume " + volume.getId() + " to " + store.getName(), e);
 | 
			
		||||
                dl.setDisconnected();
 | 
			
		||||
                dl.scheduleStatusCheck(RequestType.GET_OR_RESTART);
 | 
			
		||||
            }
 | 
			
		||||
        try {
 | 
			
		||||
            ep.sendMessageAsync(dcmd, new UploadListener.Callback(ep.getId(), dl));
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            LOGGER.warn("Unable to start /resume download of volume " + volume.getId() + " to " + store.getName(), e);
 | 
			
		||||
            dl.setDisconnected();
 | 
			
		||||
            dl.scheduleStatusCheck(RequestType.GET_OR_RESTART);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -279,8 +267,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
 | 
			
		||||
        }
 | 
			
		||||
        try {
 | 
			
		||||
            URI uri = new URI(_proxy);
 | 
			
		||||
            Proxy prx = new Proxy(uri);
 | 
			
		||||
            return prx;
 | 
			
		||||
            return new Proxy(uri);
 | 
			
		||||
        } catch (URISyntaxException e) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -927,8 +927,6 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ((destZoneIds != null) && (destZoneIds.size() > failedZones.size())){
 | 
			
		||||
 | 
			
		||||
@ -231,7 +231,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static final Logger s_logger = Logger.getLogger(DownloadManagerImpl.class);
 | 
			
		||||
    public static final Logger LOGGER = Logger.getLogger(DownloadManagerImpl.class);
 | 
			
		||||
    private String _templateDir;
 | 
			
		||||
    private String _volumeDir;
 | 
			
		||||
    private String createTmpltScr;
 | 
			
		||||
@ -264,12 +264,12 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
    public void setDownloadStatus(String jobId, Status status) {
 | 
			
		||||
        DownloadJob dj = jobs.get(jobId);
 | 
			
		||||
        if (dj == null) {
 | 
			
		||||
            s_logger.warn("setDownloadStatus for jobId: " + jobId + ", status=" + status + " no job found");
 | 
			
		||||
            LOGGER.warn("setDownloadStatus for jobId: " + jobId + ", status=" + status + " no job found");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        TemplateDownloader td = dj.getTemplateDownloader();
 | 
			
		||||
        s_logger.info("Download Completion for jobId: " + jobId + ", status=" + status);
 | 
			
		||||
        s_logger.info("local: " + td.getDownloadLocalPath() + ", bytes=" + td.getDownloadedBytes() + ", error=" + td.getDownloadError() + ", pct=" +
 | 
			
		||||
        LOGGER.info("Download Completion for jobId: " + jobId + ", status=" + status);
 | 
			
		||||
        LOGGER.info("local: " + td.getDownloadLocalPath() + ", bytes=" + td.getDownloadedBytes() + ", error=" + td.getDownloadError() + ", pct=" +
 | 
			
		||||
                td.getDownloadPercent());
 | 
			
		||||
 | 
			
		||||
        switch (status) {
 | 
			
		||||
@ -282,7 +282,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
        case UNKNOWN:
 | 
			
		||||
            return;
 | 
			
		||||
        case IN_PROGRESS:
 | 
			
		||||
            s_logger.info("Resuming jobId: " + jobId + ", status=" + status);
 | 
			
		||||
            LOGGER.info("Resuming jobId: " + jobId + ", status=" + status);
 | 
			
		||||
            td.setResume(true);
 | 
			
		||||
            threadPool.execute(td);
 | 
			
		||||
            break;
 | 
			
		||||
@ -297,7 +297,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
                td.setDownloadError("Download success, starting install ");
 | 
			
		||||
                String result = postRemoteDownload(jobId);
 | 
			
		||||
                if (result != null) {
 | 
			
		||||
                    s_logger.error("Failed post download install: " + result);
 | 
			
		||||
                    LOGGER.error("Failed post download install: " + result);
 | 
			
		||||
                    td.setStatus(Status.UNRECOVERABLE_ERROR);
 | 
			
		||||
                    td.setDownloadError("Failed post download install: " + result);
 | 
			
		||||
                    ((S3TemplateDownloader) td).cleanupAfterError();
 | 
			
		||||
@ -312,7 +312,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
                td.setDownloadError("Download success, starting install ");
 | 
			
		||||
                String result = postLocalDownload(jobId);
 | 
			
		||||
                if (result != null) {
 | 
			
		||||
                    s_logger.error("Failed post download script: " + result);
 | 
			
		||||
                    LOGGER.error("Failed post download script: " + result);
 | 
			
		||||
                    td.setStatus(Status.UNRECOVERABLE_ERROR);
 | 
			
		||||
                    td.setDownloadError("Failed post download script: " + result);
 | 
			
		||||
                } else {
 | 
			
		||||
@ -371,6 +371,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
     * Post local download activity (install and cleanup). Executed in context of
 | 
			
		||||
     * downloader thread
 | 
			
		||||
     *
 | 
			
		||||
     * @return an error message describing why download failed or {code}null{code} on success
 | 
			
		||||
     * @throws IOException
 | 
			
		||||
     */
 | 
			
		||||
    private String postLocalDownload(String jobId) {
 | 
			
		||||
@ -384,29 +385,58 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
        ResourceType resourceType = dnld.getResourceType();
 | 
			
		||||
 | 
			
		||||
        File originalTemplate = new File(td.getDownloadLocalPath());
 | 
			
		||||
        ChecksumValue oldValue = new ChecksumValue(dnld.getChecksum());
 | 
			
		||||
        ChecksumValue newValue = null;
 | 
			
		||||
        if(StringUtils.isBlank(dnld.getChecksum())) {
 | 
			
		||||
            if (LOGGER.isInfoEnabled()) {
 | 
			
		||||
                LOGGER.info(String.format("No checksum available for '%s'", originalTemplate.getName()));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // check or create checksum
 | 
			
		||||
        String checksumErrorMessage = checkOrCreateTheChecksum(dnld, originalTemplate);
 | 
			
		||||
        if (checksumErrorMessage != null) {
 | 
			
		||||
            return checksumErrorMessage;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        String result;
 | 
			
		||||
        String extension = dnld.getFormat().getFileExtension();
 | 
			
		||||
        String templateName = makeTemplatename(jobId, extension);
 | 
			
		||||
        String templateFilename = templateName + "." + extension;
 | 
			
		||||
 | 
			
		||||
        result = executeCreateScript(dnld, td, resourcePath, finalResourcePath, resourceType, templateFilename);
 | 
			
		||||
        if (result != null) {
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Set permissions for the downloaded template
 | 
			
		||||
        File downloadedTemplate = new File(resourcePath + "/" + templateFilename);
 | 
			
		||||
 | 
			
		||||
        _storage.setWorldReadableAndWriteable(downloadedTemplate);
 | 
			
		||||
        setPermissionsForTheDownloadedTemplate(dnld, resourcePath, resourceType);
 | 
			
		||||
 | 
			
		||||
        TemplateLocation loc = new TemplateLocation(_storage, resourcePath);
 | 
			
		||||
        try {
 | 
			
		||||
            newValue = computeCheckSum(oldValue.getAlgorithm(), originalTemplate);
 | 
			
		||||
        } catch (NoSuchAlgorithmException e) {
 | 
			
		||||
            return "checksum algorithm not recognised: " + oldValue.getAlgorithm();
 | 
			
		||||
        }
 | 
			
		||||
        if(StringUtils.isNotBlank(dnld.getChecksum()) && ! oldValue.equals(newValue)) {
 | 
			
		||||
            return "checksum \"" + newValue +"\" didn't match the given value, \"" + oldValue + "\"";
 | 
			
		||||
        }
 | 
			
		||||
        String checksum = newValue.getChecksum();
 | 
			
		||||
        if (checksum == null) {
 | 
			
		||||
            s_logger.warn("Something wrong happened when try to calculate the checksum of downloaded template!");
 | 
			
		||||
            loc.create(dnld.getId(), true, dnld.getTmpltName());
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            LOGGER.warn("Something is wrong with template location " + resourcePath, e);
 | 
			
		||||
            loc.purge();
 | 
			
		||||
            return "Unable to download due to " + e.getMessage();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        dnld.setCheckSum(checksum);
 | 
			
		||||
        result =  postProcessAfterDownloadComplete(dnld, resourcePath, templateName, loc);
 | 
			
		||||
        if (result != null) {
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String executeCreateScript(DownloadJob dnld, TemplateDownloader td, String resourcePath, String finalResourcePath, ResourceType resourceType, String templateFilename) {
 | 
			
		||||
        String result;
 | 
			
		||||
        int imgSizeGigs = (int)Math.ceil(_storage.getSize(td.getDownloadLocalPath()) * 1.0d / (1024 * 1024 * 1024));
 | 
			
		||||
        imgSizeGigs++; // add one just in case
 | 
			
		||||
        long timeout = (long)imgSizeGigs * installTimeoutPerGig;
 | 
			
		||||
        Script scr = null;
 | 
			
		||||
        String script = resourceType == ResourceType.TEMPLATE ? createTmpltScr : createVolScr;
 | 
			
		||||
        scr = new Script(script, timeout, s_logger);
 | 
			
		||||
        scr = new Script(script, timeout, LOGGER);
 | 
			
		||||
        scr.add("-s", Integer.toString(imgSizeGigs));
 | 
			
		||||
        scr.add("-S", Long.toString(td.getMaxTemplateSizeInBytes()));
 | 
			
		||||
        if (dnld.getDescription() != null && dnld.getDescription().length() > 1) {
 | 
			
		||||
@ -416,35 +446,30 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
            scr.add("-h");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // add options common to ISO and template
 | 
			
		||||
        String extension = dnld.getFormat().getFileExtension();
 | 
			
		||||
        String templateName = "";
 | 
			
		||||
        if (extension.equals("iso")) {
 | 
			
		||||
            templateName = jobs.get(jobId).getTmpltName().trim().replace(" ", "_");
 | 
			
		||||
        } else {
 | 
			
		||||
            templateName = java.util.UUID.nameUUIDFromBytes((jobs.get(jobId).getTmpltName() + System.currentTimeMillis()).getBytes(StringUtils.getPreferredCharset())).toString();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // run script to mv the temporary template file to the final template
 | 
			
		||||
        // file
 | 
			
		||||
        String templateFilename = templateName + "." + extension;
 | 
			
		||||
        dnld.setTmpltPath(finalResourcePath + "/" + templateFilename);
 | 
			
		||||
        scr.add("-n", templateFilename);
 | 
			
		||||
 | 
			
		||||
        scr.add("-t", resourcePath);
 | 
			
		||||
        scr.add("-f", td.getDownloadLocalPath()); // this is the temporary template file downloaded
 | 
			
		||||
        scr.add("-u"); // cleanup
 | 
			
		||||
        String result;
 | 
			
		||||
        result = scr.execute();
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        if (result != null) {
 | 
			
		||||
            return result;
 | 
			
		||||
    private String makeTemplatename(String jobId, String extension) {
 | 
			
		||||
        // add options common to ISO and template
 | 
			
		||||
        String templateName = "";
 | 
			
		||||
        if (extension.equals("iso")) {
 | 
			
		||||
            templateName = jobs.get(jobId).getTmpltName().trim().replace(" ", "_");
 | 
			
		||||
        } else {
 | 
			
		||||
            templateName = UUID.nameUUIDFromBytes((jobs.get(jobId).getTmpltName() + System.currentTimeMillis()).getBytes(StringUtils.getPreferredCharset())).toString();
 | 
			
		||||
        }
 | 
			
		||||
        return templateName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        // Set permissions for the downloaded template
 | 
			
		||||
        File downloadedTemplate = new File(resourcePath + "/" + templateFilename);
 | 
			
		||||
        _storage.setWorldReadableAndWriteable(downloadedTemplate);
 | 
			
		||||
 | 
			
		||||
    private void setPermissionsForTheDownloadedTemplate(DownloadJob dnld, String resourcePath, ResourceType resourceType) {
 | 
			
		||||
        // Set permissions for template/volume.properties
 | 
			
		||||
        String propertiesFile = resourcePath;
 | 
			
		||||
        if (resourceType == ResourceType.TEMPLATE) {
 | 
			
		||||
@ -454,16 +479,31 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
        }
 | 
			
		||||
        File templateProperties = new File(propertiesFile);
 | 
			
		||||
        _storage.setWorldReadableAndWriteable(templateProperties);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        TemplateLocation loc = new TemplateLocation(_storage, resourcePath);
 | 
			
		||||
    private String checkOrCreateTheChecksum(DownloadJob dnld, File targetFile) {
 | 
			
		||||
        ChecksumValue oldValue = new ChecksumValue(dnld.getChecksum());
 | 
			
		||||
        ChecksumValue newValue = null;
 | 
			
		||||
        try {
 | 
			
		||||
            loc.create(dnld.getId(), true, dnld.getTmpltName());
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            s_logger.warn("Something is wrong with template location " + resourcePath, e);
 | 
			
		||||
            loc.purge();
 | 
			
		||||
            return "Unable to download due to " + e.getMessage();
 | 
			
		||||
            newValue = computeCheckSum(oldValue.getAlgorithm(), targetFile);
 | 
			
		||||
            if (LOGGER.isDebugEnabled()) {
 | 
			
		||||
                LOGGER.debug(String.format("computed checksum: %s", newValue));
 | 
			
		||||
            }
 | 
			
		||||
        } catch (NoSuchAlgorithmException e) {
 | 
			
		||||
            return "checksum algorithm not recognised: " + oldValue.getAlgorithm();
 | 
			
		||||
        }
 | 
			
		||||
        if (StringUtils.isNotBlank(dnld.getChecksum()) && !oldValue.equals(newValue)) {
 | 
			
		||||
            return "checksum \"" + newValue + "\" didn't match the given value, \"" + oldValue + "\"";
 | 
			
		||||
        }
 | 
			
		||||
        String checksum = newValue.toString();
 | 
			
		||||
        if (checksum == null) {
 | 
			
		||||
            LOGGER.warn("Something wrong happened when try to calculate the checksum of downloaded template!");
 | 
			
		||||
        }
 | 
			
		||||
        dnld.setCheckSum(checksum);
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String postProcessAfterDownloadComplete(DownloadJob dnld, String resourcePath, String templateName, TemplateLocation loc) {
 | 
			
		||||
        Iterator<Processor> en = _processors.values().iterator();
 | 
			
		||||
        while (en.hasNext()) {
 | 
			
		||||
            Processor processor = en.next();
 | 
			
		||||
@ -472,7 +512,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
            try {
 | 
			
		||||
                info = processor.process(resourcePath, null, templateName, this._processTimeout);
 | 
			
		||||
            } catch (InternalErrorException e) {
 | 
			
		||||
                s_logger.error("Template process exception ", e);
 | 
			
		||||
                LOGGER.error("Template process exception ", e);
 | 
			
		||||
                return e.toString();
 | 
			
		||||
            }
 | 
			
		||||
            if (info != null) {
 | 
			
		||||
@ -490,7 +530,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!loc.save()) {
 | 
			
		||||
            s_logger.warn("Cleaning up because we're unable to save the formats");
 | 
			
		||||
            LOGGER.warn("Cleaning up because we're unable to save the formats");
 | 
			
		||||
            loc.purge();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -549,7 +589,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
        try {
 | 
			
		||||
 | 
			
		||||
            if (!_storage.mkdirs(tmpDir)) {
 | 
			
		||||
                s_logger.warn("Unable to create " + tmpDir);
 | 
			
		||||
                LOGGER.warn("Unable to create " + tmpDir);
 | 
			
		||||
                return "Unable to create " + tmpDir;
 | 
			
		||||
            }
 | 
			
		||||
            // TO DO - define constant for volume properties.
 | 
			
		||||
@ -558,12 +598,12 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
                            "volume.properties");
 | 
			
		||||
                    if (file.exists()) {
 | 
			
		||||
                        if(! file.delete()) {
 | 
			
		||||
                            s_logger.warn("Deletion of file '" + file.getAbsolutePath() + "' failed.");
 | 
			
		||||
                            LOGGER.warn("Deletion of file '" + file.getAbsolutePath() + "' failed.");
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (!file.createNewFile()) {
 | 
			
		||||
                        s_logger.warn("Unable to create new file: " + file.getAbsolutePath());
 | 
			
		||||
                        LOGGER.warn("Unable to create new file: " + file.getAbsolutePath());
 | 
			
		||||
                        return "Unable to create new file: " + file.getAbsolutePath();
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@ -605,7 +645,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
 | 
			
		||||
                    return jobId;
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            s_logger.warn("Unable to download to " + tmpDir, e);
 | 
			
		||||
            LOGGER.warn("Unable to download to " + tmpDir, e);
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -808,24 +848,24 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
    private List<String> listVolumes(String rootdir) {
 | 
			
		||||
        List<String> result = new ArrayList<String>();
 | 
			
		||||
 | 
			
		||||
        Script script = new Script(listVolScr, s_logger);
 | 
			
		||||
        Script script = new Script(listVolScr, LOGGER);
 | 
			
		||||
        script.add("-r", rootdir);
 | 
			
		||||
        ZfsPathParser zpp = new ZfsPathParser(rootdir);
 | 
			
		||||
        script.execute(zpp);
 | 
			
		||||
        result.addAll(zpp.getPaths());
 | 
			
		||||
        s_logger.info("found " + zpp.getPaths().size() + " volumes" + zpp.getPaths());
 | 
			
		||||
        LOGGER.info("found " + zpp.getPaths().size() + " volumes" + zpp.getPaths());
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private List<String> listTemplates(String rootdir) {
 | 
			
		||||
        List<String> result = new ArrayList<String>();
 | 
			
		||||
 | 
			
		||||
        Script script = new Script(listTmpltScr, s_logger);
 | 
			
		||||
        Script script = new Script(listTmpltScr, LOGGER);
 | 
			
		||||
        script.add("-r", rootdir);
 | 
			
		||||
        ZfsPathParser zpp = new ZfsPathParser(rootdir);
 | 
			
		||||
        script.execute(zpp);
 | 
			
		||||
        result.addAll(zpp.getPaths());
 | 
			
		||||
        s_logger.info("found " + zpp.getPaths().size() + " templates" + zpp.getPaths());
 | 
			
		||||
        LOGGER.info("found " + zpp.getPaths().size() + " templates" + zpp.getPaths());
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -844,13 +884,13 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
            TemplateLocation loc = new TemplateLocation(_storage, path);
 | 
			
		||||
            try {
 | 
			
		||||
                if (!loc.load()) {
 | 
			
		||||
                    s_logger.warn("Post download installation was not completed for " + path);
 | 
			
		||||
                    LOGGER.warn("Post download installation was not completed for " + path);
 | 
			
		||||
                    // loc.purge();
 | 
			
		||||
                    _storage.cleanup(path, templateDir);
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
                s_logger.warn("Unable to load template location " + path, e);
 | 
			
		||||
                LOGGER.warn("Unable to load template location " + path, e);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -865,12 +905,12 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
                    loc.updateVirtualSize(vSize);
 | 
			
		||||
                    loc.save();
 | 
			
		||||
                } catch (Exception e) {
 | 
			
		||||
                    s_logger.error("Unable to get the virtual size of the template: " + tInfo.getInstallPath() + " due to " + e.getMessage());
 | 
			
		||||
                    LOGGER.error("Unable to get the virtual size of the template: " + tInfo.getInstallPath() + " due to " + e.getMessage());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            result.put(tInfo.getTemplateName(), tInfo);
 | 
			
		||||
            s_logger.debug("Added template name: " + tInfo.getTemplateName() + ", path: " + tmplt);
 | 
			
		||||
            LOGGER.debug("Added template name: " + tInfo.getTemplateName() + ", path: " + tmplt);
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
@ -890,13 +930,13 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
            TemplateLocation loc = new TemplateLocation(_storage, path);
 | 
			
		||||
            try {
 | 
			
		||||
                if (!loc.load()) {
 | 
			
		||||
                    s_logger.warn("Post download installation was not completed for " + path);
 | 
			
		||||
                    LOGGER.warn("Post download installation was not completed for " + path);
 | 
			
		||||
                    // loc.purge();
 | 
			
		||||
                    _storage.cleanup(path, volumeDir);
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
                s_logger.warn("Unable to load volume location " + path, e);
 | 
			
		||||
                LOGGER.warn("Unable to load volume location " + path, e);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -911,12 +951,12 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
                    loc.updateVirtualSize(vSize);
 | 
			
		||||
                    loc.save();
 | 
			
		||||
                } catch (Exception e) {
 | 
			
		||||
                    s_logger.error("Unable to get the virtual size of the volume: " + vInfo.getInstallPath() + " due to " + e.getMessage());
 | 
			
		||||
                    LOGGER.error("Unable to get the virtual size of the volume: " + vInfo.getInstallPath() + " due to " + e.getMessage());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            result.put(vInfo.getId(), vInfo);
 | 
			
		||||
            s_logger.debug("Added volume name: " + vInfo.getTemplateName() + ", path: " + vol);
 | 
			
		||||
            LOGGER.debug("Added volume name: " + vInfo.getTemplateName() + ", path: " + vol);
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
@ -980,7 +1020,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
 | 
			
		||||
        String inSystemVM = (String)params.get("secondary.storage.vm");
 | 
			
		||||
        if (inSystemVM != null && "true".equalsIgnoreCase(inSystemVM)) {
 | 
			
		||||
            s_logger.info("DownloadManager: starting additional services since we are inside system vm");
 | 
			
		||||
            LOGGER.info("DownloadManager: starting additional services since we are inside system vm");
 | 
			
		||||
            _nfsVersion = NfsSecondaryStorageResource.retrieveNfsVersionFromParams(params);
 | 
			
		||||
            startAdditionalServices();
 | 
			
		||||
            blockOutgoingOnPrivate();
 | 
			
		||||
@ -1001,25 +1041,25 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
        if (listTmpltScr == null) {
 | 
			
		||||
            throw new ConfigurationException("Unable to find the listvmtmplt.sh");
 | 
			
		||||
        }
 | 
			
		||||
        s_logger.info("listvmtmplt.sh found in " + listTmpltScr);
 | 
			
		||||
        LOGGER.info("listvmtmplt.sh found in " + listTmpltScr);
 | 
			
		||||
 | 
			
		||||
        createTmpltScr = Script.findScript(scriptsDir, "createtmplt.sh");
 | 
			
		||||
        if (createTmpltScr == null) {
 | 
			
		||||
            throw new ConfigurationException("Unable to find createtmplt.sh");
 | 
			
		||||
        }
 | 
			
		||||
        s_logger.info("createtmplt.sh found in " + createTmpltScr);
 | 
			
		||||
        LOGGER.info("createtmplt.sh found in " + createTmpltScr);
 | 
			
		||||
 | 
			
		||||
        listVolScr = Script.findScript(scriptsDir, "listvolume.sh");
 | 
			
		||||
        if (listVolScr == null) {
 | 
			
		||||
            throw new ConfigurationException("Unable to find the listvolume.sh");
 | 
			
		||||
        }
 | 
			
		||||
        s_logger.info("listvolume.sh found in " + listVolScr);
 | 
			
		||||
        LOGGER.info("listvolume.sh found in " + listVolScr);
 | 
			
		||||
 | 
			
		||||
        createVolScr = Script.findScript(scriptsDir, "createvolume.sh");
 | 
			
		||||
        if (createVolScr == null) {
 | 
			
		||||
            throw new ConfigurationException("Unable to find createvolume.sh");
 | 
			
		||||
        }
 | 
			
		||||
        s_logger.info("createvolume.sh found in " + createVolScr);
 | 
			
		||||
        LOGGER.info("createvolume.sh found in " + createVolScr);
 | 
			
		||||
 | 
			
		||||
        _processors = new HashMap<String, Processor>();
 | 
			
		||||
 | 
			
		||||
@ -1063,7 +1103,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void blockOutgoingOnPrivate() {
 | 
			
		||||
        Script command = new Script("/bin/bash", s_logger);
 | 
			
		||||
        Script command = new Script("/bin/bash", LOGGER);
 | 
			
		||||
        String intf = "eth1";
 | 
			
		||||
        command.add("-c");
 | 
			
		||||
        command.add("iptables -A OUTPUT -o " + intf + " -p tcp -m state --state NEW -m tcp --dport " + "80" + " -j REJECT;" + "iptables -A OUTPUT -o " + intf +
 | 
			
		||||
@ -1071,7 +1111,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
 | 
			
		||||
        String result = command.execute();
 | 
			
		||||
        if (result != null) {
 | 
			
		||||
            s_logger.warn("Error in blocking outgoing to port 80/443 err=" + result);
 | 
			
		||||
            LOGGER.warn("Error in blocking outgoing to port 80/443 err=" + result);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -1092,37 +1132,37 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void startAdditionalServices() {
 | 
			
		||||
        Script command = new Script("/bin/systemctl", s_logger);
 | 
			
		||||
        Script command = new Script("/bin/systemctl", LOGGER);
 | 
			
		||||
        command.add("stop");
 | 
			
		||||
        command.add("apache2");
 | 
			
		||||
        String result = command.execute();
 | 
			
		||||
        if (result != null) {
 | 
			
		||||
            s_logger.warn("Error in stopping httpd service err=" + result);
 | 
			
		||||
            LOGGER.warn("Error in stopping httpd service err=" + result);
 | 
			
		||||
        }
 | 
			
		||||
        String port = Integer.toString(TemplateConstants.DEFAULT_TMPLT_COPY_PORT);
 | 
			
		||||
        String intf = TemplateConstants.DEFAULT_TMPLT_COPY_INTF;
 | 
			
		||||
 | 
			
		||||
        command = new Script("/bin/bash", s_logger);
 | 
			
		||||
        command = new Script("/bin/bash", LOGGER);
 | 
			
		||||
        command.add("-c");
 | 
			
		||||
        command.add("iptables -I INPUT -i " + intf + " -p tcp -m state --state NEW -m tcp --dport " + port + " -j ACCEPT;" + "iptables -I INPUT -i " + intf +
 | 
			
		||||
                " -p tcp -m state --state NEW -m tcp --dport " + "443" + " -j ACCEPT;");
 | 
			
		||||
 | 
			
		||||
        result = command.execute();
 | 
			
		||||
        if (result != null) {
 | 
			
		||||
            s_logger.warn("Error in opening up apache2 port err=" + result);
 | 
			
		||||
            LOGGER.warn("Error in opening up apache2 port err=" + result);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        command = new Script("/bin/systemctl", s_logger);
 | 
			
		||||
        command = new Script("/bin/systemctl", LOGGER);
 | 
			
		||||
        command.add("start");
 | 
			
		||||
        command.add("apache2");
 | 
			
		||||
        result = command.execute();
 | 
			
		||||
        if (result != null) {
 | 
			
		||||
            s_logger.warn("Error in starting apache2 service err=" + result);
 | 
			
		||||
            LOGGER.warn("Error in starting apache2 service err=" + result);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        command = new Script("/bin/su", s_logger);
 | 
			
		||||
        command = new Script("/bin/su", LOGGER);
 | 
			
		||||
        command.add("-s");
 | 
			
		||||
        command.add("/bin/bash");
 | 
			
		||||
        command.add("-c");
 | 
			
		||||
@ -1130,7 +1170,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
 | 
			
		||||
        command.add("www-data");
 | 
			
		||||
        result = command.execute();
 | 
			
		||||
        if (result != null) {
 | 
			
		||||
            s_logger.warn("Error in creating directory =" + result);
 | 
			
		||||
            LOGGER.warn("Error in creating directory =" + result);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -80,7 +80,8 @@ public class ChecksumValue {
 | 
			
		||||
            if (s == 0 && e > s+1) { // we have an algorithm name of at least 1 char
 | 
			
		||||
                return digest.substring(s+1,e);
 | 
			
		||||
            } // else if no algoritm
 | 
			
		||||
            return "MD5";
 | 
			
		||||
        } // or if no digest at all
 | 
			
		||||
        return "MD5";
 | 
			
		||||
        return "SHA-512";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user