Example usage for java.net InetAddress isMulticastAddress

List of usage examples for java.net InetAddress isMulticastAddress

Introduction

In this page you can find the example usage for java.net InetAddress isMulticastAddress.

Prototype

public boolean isMulticastAddress() 

Source Link

Document

Utility routine to check if the InetAddress is an IP multicast address.

Usage

From source file:com.cloud.server.ManagementServerImpl.java

@Override
@ActionEvent(eventType = EventTypes.EVENT_VOLUME_EXTRACT, eventDescription = "extracting volume", async = true)
public Long extractVolume(ExtractVolumeCmd cmd) throws URISyntaxException {
    Long volumeId = cmd.getId();/*from   w ww  . ja  v a 2s . com*/
    String url = cmd.getUrl();
    Long zoneId = cmd.getZoneId();
    AsyncJobVO job = null; // FIXME: cmd.getJob();
    String mode = cmd.getMode();
    Account account = UserContext.current().getCaller();

    if (!_accountMgr.isRootAdmin(account.getType()) && ApiDBUtils.isExtractionDisabled()) {
        throw new PermissionDeniedException("Extraction has been disabled by admin");
    }

    VolumeVO volume = _volumeDao.findById(volumeId);
    if (volume == null) {
        InvalidParameterValueException ex = new InvalidParameterValueException(
                "Unable to find volume with specified volumeId");
        ex.addProxyObject(volume, volumeId, "volumeId");
        throw ex;
    }

    // perform permission check
    _accountMgr.checkAccess(account, null, true, volume);

    if (_dcDao.findById(zoneId) == null) {
        throw new InvalidParameterValueException("Please specify a valid zone.");
    }
    if (volume.getPoolId() == null) {
        throw new InvalidParameterValueException(
                "The volume doesnt belong to a storage pool so cant extract it");
    }
    // Extract activity only for detached volumes or for volumes whose instance is stopped
    if (volume.getInstanceId() != null
            && ApiDBUtils.findVMInstanceById(volume.getInstanceId()).getState() != State.Stopped) {
        s_logger.debug("Invalid state of the volume with ID: " + volumeId
                + ". It should be either detached or the VM should be in stopped state.");
        PermissionDeniedException ex = new PermissionDeniedException(
                "Invalid state of the volume with specified ID. It should be either detached or the VM should be in stopped state.");
        ex.addProxyObject(volume, volumeId, "volumeId");
        throw ex;
    }

    if (volume.getVolumeType() != Volume.Type.DATADISK) { // Datadisk dont have any template dependence.

        VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId());
        if (template != null) { // For ISO based volumes template = null and we allow extraction of all ISO based volumes
            boolean isExtractable = template.isExtractable()
                    && template.getTemplateType() != Storage.TemplateType.SYSTEM;
            if (!isExtractable && account != null && account.getType() != Account.ACCOUNT_TYPE_ADMIN) { // Global
                // admins are always allowed to extract
                PermissionDeniedException ex = new PermissionDeniedException(
                        "The volume with specified volumeId is not allowed to be extracted");
                ex.addProxyObject(volume, volumeId, "volumeId");
                throw ex;
            }
        }
    }

    Upload.Mode extractMode;
    if (mode == null || (!mode.equals(Upload.Mode.FTP_UPLOAD.toString())
            && !mode.equals(Upload.Mode.HTTP_DOWNLOAD.toString()))) {
        throw new InvalidParameterValueException("Please specify a valid extract Mode ");
    } else {
        extractMode = mode.equals(Upload.Mode.FTP_UPLOAD.toString()) ? Upload.Mode.FTP_UPLOAD
                : Upload.Mode.HTTP_DOWNLOAD;
    }

    // If mode is upload perform extra checks on url and also see if there is an ongoing upload on the same.
    if (extractMode == Upload.Mode.FTP_UPLOAD) {
        URI uri = new URI(url);
        if ((uri.getScheme() == null) || (!uri.getScheme().equalsIgnoreCase("ftp"))) {
            throw new IllegalArgumentException("Unsupported scheme for url: " + url);
        }

        String host = uri.getHost();
        try {
            InetAddress hostAddr = InetAddress.getByName(host);
            if (hostAddr.isAnyLocalAddress() || hostAddr.isLinkLocalAddress() || hostAddr.isLoopbackAddress()
                    || hostAddr.isMulticastAddress()) {
                throw new IllegalArgumentException("Illegal host specified in url");
            }
            if (hostAddr instanceof Inet6Address) {
                throw new IllegalArgumentException(
                        "IPV6 addresses not supported (" + hostAddr.getHostAddress() + ")");
            }
        } catch (UnknownHostException uhe) {
            throw new IllegalArgumentException("Unable to resolve " + host);
        }

        if (_uploadMonitor.isTypeUploadInProgress(volumeId, Upload.Type.VOLUME)) {
            throw new IllegalArgumentException(volume.getName()
                    + " upload is in progress. Please wait for some time to schedule another upload for the same");
        }
    }

    long accountId = volume.getAccountId();
    StoragePoolVO srcPool = _poolDao.findById(volume.getPoolId());
    HostVO sserver = _storageMgr.getSecondaryStorageHost(zoneId);
    String secondaryStorageURL = sserver.getStorageUrl();

    List<UploadVO> extractURLList = _uploadDao.listByTypeUploadStatus(volumeId, Upload.Type.VOLUME,
            UploadVO.Status.DOWNLOAD_URL_CREATED);

    if (extractMode == Upload.Mode.HTTP_DOWNLOAD && extractURLList.size() > 0) {
        return extractURLList.get(0).getId(); // If download url already exists then return
    } else {
        UploadVO uploadJob = _uploadMonitor.createNewUploadEntry(sserver.getId(), volumeId,
                UploadVO.Status.COPY_IN_PROGRESS, Upload.Type.VOLUME, url, extractMode);
        s_logger.debug("Extract Mode - " + uploadJob.getMode());
        uploadJob = _uploadDao.createForUpdate(uploadJob.getId());

        // Update the async Job
        ExtractResponse resultObj = new ExtractResponse(volumeId, volume.getName(), accountId,
                UploadVO.Status.COPY_IN_PROGRESS.toString(), uploadJob.getId());
        resultObj.setResponseName(cmd.getCommandName());
        AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor();
        if (asyncExecutor != null) {
            job = asyncExecutor.getJob();
            _asyncMgr.updateAsyncJobAttachment(job.getId(), Upload.Type.VOLUME.toString(), volumeId);
            _asyncMgr.updateAsyncJobStatus(job.getId(), AsyncJobResult.STATUS_IN_PROGRESS, resultObj);
        }
        String value = _configs.get(Config.CopyVolumeWait.toString());
        int copyvolumewait = NumbersUtil.parseInt(value,
                Integer.parseInt(Config.CopyVolumeWait.getDefaultValue()));
        // Copy the volume from the source storage pool to secondary storage
        CopyVolumeCommand cvCmd = new CopyVolumeCommand(volume.getId(), volume.getPath(), srcPool,
                secondaryStorageURL, true, copyvolumewait);
        CopyVolumeAnswer cvAnswer = null;
        try {
            cvAnswer = (CopyVolumeAnswer) _storageMgr.sendToPool(srcPool, cvCmd);
        } catch (StorageUnavailableException e) {
            s_logger.debug("Storage unavailable");
        }

        // Check if you got a valid answer.
        if (cvAnswer == null || !cvAnswer.getResult()) {
            String errorString = "Failed to copy the volume from the source primary storage pool to secondary storage.";

            // Update the async job.
            resultObj.setResultString(errorString);
            resultObj.setUploadStatus(UploadVO.Status.COPY_ERROR.toString());
            if (asyncExecutor != null) {
                _asyncMgr.completeAsyncJob(job.getId(), AsyncJobResult.STATUS_FAILED, 0, resultObj);
            }

            // Update the DB that volume couldn't be copied
            uploadJob.setUploadState(UploadVO.Status.COPY_ERROR);
            uploadJob.setErrorString(errorString);
            uploadJob.setLastUpdated(new Date());
            _uploadDao.update(uploadJob.getId(), uploadJob);

            throw new CloudRuntimeException(errorString);
        }

        String volumeLocalPath = "volumes/" + volume.getId() + "/" + cvAnswer.getVolumePath() + "."
                + getFormatForPool(srcPool);
        // Update the DB that volume is copied and volumePath
        uploadJob.setUploadState(UploadVO.Status.COPY_COMPLETE);
        uploadJob.setLastUpdated(new Date());
        uploadJob.setInstallPath(volumeLocalPath);
        _uploadDao.update(uploadJob.getId(), uploadJob);

        if (extractMode == Mode.FTP_UPLOAD) { // Now that the volume is copied perform the actual uploading
            _uploadMonitor.extractVolume(uploadJob, sserver, volume, url, zoneId, volumeLocalPath,
                    cmd.getStartEventId(), job.getId(), _asyncMgr);
            return uploadJob.getId();
        } else { // Volume is copied now make it visible under apache and create a URL.
            _uploadMonitor.createVolumeDownloadURL(volumeId, volumeLocalPath, Upload.Type.VOLUME, zoneId,
                    uploadJob.getId());
            return uploadJob.getId();
        }
    }
}