Search in sources :

Example 26 with SnapshotVO

use of com.cloud.storage.SnapshotVO in project cloudstack by apache.

the class StorageSystemSnapshotStrategy method takeSnapshot.

@Override
@DB
public SnapshotInfo takeSnapshot(SnapshotInfo snapshotInfo) {
    VolumeInfo volumeInfo = snapshotInfo.getBaseVolume();
    verifyFormat(volumeInfo);
    verifyLocationType(snapshotInfo);
    final boolean canStorageSystemCreateVolumeFromSnapshot = canStorageSystemCreateVolumeFromSnapshot(volumeInfo.getPoolId());
    final boolean computeClusterSupportsVolumeClone;
    // only XenServer, VMware and KVM are currently supported
    if (volumeInfo.getFormat() == ImageFormat.VHD) {
        HostVO hostVO = getHost(volumeInfo.getId());
        computeClusterSupportsVolumeClone = clusterDao.getSupportsResigning(hostVO.getClusterId());
    } else if (volumeInfo.getFormat() == ImageFormat.OVA || volumeInfo.getFormat() == ImageFormat.QCOW2 || volumeInfo.getFormat() == ImageFormat.RAW) {
        computeClusterSupportsVolumeClone = true;
    } else {
        throw new CloudRuntimeException("Unsupported format");
    }
    SnapshotVO snapshotVO = snapshotDao.acquireInLockTable(snapshotInfo.getId());
    if (snapshotVO == null) {
        throw new CloudRuntimeException("Failed to acquire lock on the following snapshot: " + snapshotInfo.getId());
    }
    VMSnapshot vmSnapshot = null;
    if (ImageFormat.OVA.equals(volumeInfo.getFormat())) {
        setVmdk(snapshotInfo, volumeInfo);
        vmSnapshot = takeHypervisorSnapshot(volumeInfo);
    }
    SnapshotResult result = null;
    SnapshotInfo snapshotOnPrimary;
    try {
        volumeInfo.stateTransit(Volume.Event.SnapshotRequested);
        if (canStorageSystemCreateVolumeFromSnapshot && computeClusterSupportsVolumeClone) {
            SnapshotDetailsVO snapshotDetail = new SnapshotDetailsVO(snapshotInfo.getId(), "takeSnapshot", Boolean.TRUE.toString(), false);
            snapshotDetailsDao.persist(snapshotDetail);
        }
        result = snapshotSvr.takeSnapshot(snapshotInfo);
        if (result.isFailed()) {
            s_logger.debug("Failed to take a snapshot: " + result.getResult());
            throw new CloudRuntimeException(result.getResult());
        }
        if (!canStorageSystemCreateVolumeFromSnapshot || !computeClusterSupportsVolumeClone) {
            performSnapshotAndCopyOnHostSide(volumeInfo, snapshotInfo);
        }
        snapshotOnPrimary = result.getSnapshot();
    } finally {
        if (result != null && result.isSuccess()) {
            volumeInfo.stateTransit(Volume.Event.OperationSucceeded);
        } else {
            volumeInfo.stateTransit(Volume.Event.OperationFailed);
        }
        if (ImageFormat.OVA.equals(volumeInfo.getFormat())) {
            if (vmSnapshot != null) {
                deleteHypervisorSnapshot(vmSnapshot);
            }
        }
    }
    snapshotDao.releaseFromLockTable(snapshotInfo.getId());
    return snapshotOnPrimary;
}
Also used : SnapshotInfo(org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo) VMSnapshotVO(com.cloud.vm.snapshot.VMSnapshotVO) SnapshotVO(com.cloud.storage.SnapshotVO) SnapshotResult(org.apache.cloudstack.engine.subsystem.api.storage.SnapshotResult) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) VolumeInfo(org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo) SnapshotDetailsVO(com.cloud.storage.dao.SnapshotDetailsVO) VMSnapshot(com.cloud.vm.snapshot.VMSnapshot) HostVO(com.cloud.host.HostVO) DB(com.cloud.utils.db.DB)

Example 27 with SnapshotVO

use of com.cloud.storage.SnapshotVO in project cloudstack by apache.

the class DefaultSnapshotStrategy method deleteSnapshot.

@Override
public boolean deleteSnapshot(Long snapshotId) {
    SnapshotVO snapshotVO = snapshotDao.findById(snapshotId);
    if (snapshotVO.getState() == Snapshot.State.Allocated) {
        snapshotDao.remove(snapshotId);
        return true;
    }
    if (snapshotVO.getState() == Snapshot.State.Destroyed) {
        return true;
    }
    if (Snapshot.State.Error.equals(snapshotVO.getState())) {
        List<SnapshotDataStoreVO> storeRefs = snapshotStoreDao.findBySnapshotId(snapshotId);
        for (SnapshotDataStoreVO ref : storeRefs) {
            snapshotStoreDao.expunge(ref.getId());
        }
        snapshotDao.remove(snapshotId);
        return true;
    }
    if (snapshotVO.getState() == Snapshot.State.CreatedOnPrimary) {
        snapshotVO.setState(Snapshot.State.Destroyed);
        snapshotDao.update(snapshotId, snapshotVO);
        return true;
    }
    if (!Snapshot.State.BackedUp.equals(snapshotVO.getState()) && !Snapshot.State.Destroying.equals(snapshotVO.getState())) {
        throw new InvalidParameterValueException("Can't delete snapshotshot " + snapshotId + " due to it is in " + snapshotVO.getState() + " Status");
    }
    Boolean deletedOnSecondary = deleteOnSecondaryIfNeeded(snapshotId);
    boolean deletedOnPrimary = deleteOnPrimaryIfNeeded(snapshotId);
    if (deletedOnPrimary) {
        s_logger.debug(String.format("Successfully deleted snapshot (id: %d) on primary storage.", snapshotId));
    } else {
        s_logger.debug(String.format("The snapshot (id: %d) could not be found/deleted on primary storage.", snapshotId));
    }
    if (null != deletedOnSecondary && deletedOnSecondary) {
        s_logger.debug(String.format("Successfully deleted snapshot (id: %d) on secondary storage.", snapshotId));
    }
    return (deletedOnSecondary != null) && deletedOnSecondary || deletedOnPrimary;
}
Also used : SnapshotVO(com.cloud.storage.SnapshotVO) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) SnapshotDataStoreVO(org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO)

Example 28 with SnapshotVO

use of com.cloud.storage.SnapshotVO in project cloudstack by apache.

the class DefaultSnapshotStrategy method revertSnapshot.

@Override
public boolean revertSnapshot(SnapshotInfo snapshot) {
    if (canHandle(snapshot, SnapshotOperation.REVERT) == StrategyPriority.CANT_HANDLE) {
        throw new CloudRuntimeException("Reverting not supported. Create a template or volume based on the snapshot instead.");
    }
    SnapshotVO snapshotVO = snapshotDao.acquireInLockTable(snapshot.getId());
    if (snapshotVO == null) {
        throw new CloudRuntimeException("Failed to get lock on snapshot:" + snapshot.getId());
    }
    try {
        VolumeInfo volumeInfo = snapshot.getBaseVolume();
        StoragePool store = (StoragePool) volumeInfo.getDataStore();
        if (store != null && store.getStatus() != StoragePoolStatus.Up) {
            snapshot.processEvent(Event.OperationFailed);
            throw new CloudRuntimeException("store is not in up state");
        }
        volumeInfo.stateTransit(Volume.Event.RevertSnapshotRequested);
        boolean result = false;
        try {
            result = snapshotSvr.revertSnapshot(snapshot);
            if (!result) {
                s_logger.debug("Failed to revert snapshot: " + snapshot.getId());
                throw new CloudRuntimeException("Failed to revert snapshot: " + snapshot.getId());
            }
        } finally {
            if (result) {
                volumeInfo.stateTransit(Volume.Event.OperationSucceeded);
            } else {
                volumeInfo.stateTransit(Volume.Event.OperationFailed);
            }
        }
        return result;
    } finally {
        if (snapshotVO != null) {
            snapshotDao.releaseFromLockTable(snapshot.getId());
        }
    }
}
Also used : SnapshotVO(com.cloud.storage.SnapshotVO) StoragePool(com.cloud.storage.StoragePool) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) VolumeInfo(org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo)

Example 29 with SnapshotVO

use of com.cloud.storage.SnapshotVO in project cloudstack by apache.

the class SnapshotTest method createSnapshot.

@Test
public void createSnapshot() throws InterruptedException, ExecutionException {
    VolumeInfo vol = createCopyBaseImage();
    SnapshotVO snapshotVO = createSnapshotInDb(vol);
    SnapshotInfo snapshot = this.snapshotFactory.getSnapshot(snapshotVO.getId(), vol.getDataStore());
    SnapshotInfo newSnapshot = null;
    SnapshotStrategy snapshotStrategy = storageStrategyFactory.getSnapshotStrategy(snapshot, SnapshotOperation.TAKE);
    if (snapshotStrategy != null) {
        newSnapshot = snapshotStrategy.takeSnapshot(snapshot);
    }
    AssertJUnit.assertNotNull(newSnapshot);
    LocalHostEndpoint ep = new MockLocalHostEndPoint();
    ep.setResource(new MockLocalNfsSecondaryStorageResource());
    Mockito.when(epSelector.select(Matchers.any(DataStore.class))).thenReturn(ep);
    try {
        for (SnapshotStrategy strategy : this.snapshotStrategies) {
            if (strategy.canHandle(snapshot, SnapshotOperation.DELETE) != StrategyPriority.CANT_HANDLE) {
                boolean res = strategy.deleteSnapshot(newSnapshot.getId());
                Assert.assertTrue(res);
            }
        }
    } finally {
        Mockito.when(epSelector.select(Matchers.any(DataStore.class))).thenReturn(remoteEp);
    }
}
Also used : LocalHostEndpoint(org.apache.cloudstack.storage.LocalHostEndpoint) SnapshotInfo(org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo) SnapshotVO(com.cloud.storage.SnapshotVO) DataStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore) MockLocalNfsSecondaryStorageResource(org.apache.cloudstack.storage.MockLocalNfsSecondaryStorageResource) VolumeInfo(org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo) SnapshotStrategy(org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy) Test(org.testng.annotations.Test)

Example 30 with SnapshotVO

use of com.cloud.storage.SnapshotVO in project cloudstack by apache.

the class ApiResponseHelper method createUsageResponse.

@Override
public UsageRecordResponse createUsageResponse(Usage usageRecord, Map<String, Set<ResourceTagResponse>> resourceTagResponseMap, boolean oldFormat) {
    UsageRecordResponse usageRecResponse = new UsageRecordResponse();
    Account account = ApiDBUtils.findAccountById(usageRecord.getAccountId());
    if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) {
        // find the project
        Project project = ApiDBUtils.findProjectByProjectAccountIdIncludingRemoved(account.getId());
        if (project != null) {
            usageRecResponse.setProjectId(project.getUuid());
            usageRecResponse.setProjectName(project.getName());
        }
    } else {
        usageRecResponse.setAccountId(account.getUuid());
        usageRecResponse.setAccountName(account.getAccountName());
    }
    Domain domain = ApiDBUtils.findDomainById(usageRecord.getDomainId());
    if (domain != null) {
        usageRecResponse.setDomainId(domain.getUuid());
        usageRecResponse.setDomainName(domain.getName());
    }
    if (usageRecord.getZoneId() != null) {
        DataCenter zone = ApiDBUtils.findZoneById(usageRecord.getZoneId());
        if (zone != null) {
            usageRecResponse.setZoneId(zone.getUuid());
        }
    }
    usageRecResponse.setDescription(usageRecord.getDescription());
    usageRecResponse.setUsage(usageRecord.getUsageDisplay());
    usageRecResponse.setUsageType(usageRecord.getUsageType());
    VMInstanceVO vmInstance = null;
    if (usageRecord.getVmInstanceId() != null) {
        vmInstance = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getVmInstanceId());
        if (vmInstance != null) {
            usageRecResponse.setVirtualMachineId(vmInstance.getUuid());
        }
    }
    usageRecResponse.setResourceName(usageRecord.getVmName());
    VMTemplateVO template = null;
    if (usageRecord.getTemplateId() != null) {
        template = ApiDBUtils.findTemplateById(usageRecord.getTemplateId());
        if (template != null) {
            usageRecResponse.setTemplateId(template.getUuid());
        }
    }
    ResourceTag.ResourceObjectType resourceType = null;
    Long resourceId = null;
    if (usageRecord.getUsageType() == UsageTypes.RUNNING_VM || usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM) {
        ServiceOfferingVO svcOffering = _entityMgr.findByIdIncludingRemoved(ServiceOfferingVO.class, usageRecord.getOfferingId().toString());
        // Service Offering Id
        if (svcOffering != null) {
            usageRecResponse.setOfferingId(svcOffering.getUuid());
        }
        // VM Instance ID
        VMInstanceVO vm = null;
        if (usageRecord.getUsageId() != null && usageRecord.getUsageId().equals(usageRecord.getVmInstanceId())) {
            vm = vmInstance;
        } else {
            vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString());
        }
        if (vm != null) {
            resourceType = ResourceTag.ResourceObjectType.UserVm;
            usageRecResponse.setUsageId(vm.getUuid());
            resourceId = vm.getId();
            final GuestOS guestOS = _guestOsDao.findById(vm.getGuestOSId());
            if (guestOS != null) {
                usageRecResponse.setOsTypeId(guestOS.getUuid());
                usageRecResponse.setOsDisplayName(guestOS.getDisplayName());
                final GuestOsCategory guestOsCategory = _guestOsCategoryDao.findById(guestOS.getCategoryId());
                if (guestOsCategory != null) {
                    usageRecResponse.setOsCategoryId(guestOsCategory.getUuid());
                    usageRecResponse.setOsCategoryName(guestOsCategory.getName());
                }
            }
        }
        // Hypervisor Type
        usageRecResponse.setType(usageRecord.getType());
        // Dynamic compute offerings details
        if (usageRecord.getCpuCores() != null) {
            usageRecResponse.setCpuNumber(usageRecord.getCpuCores());
        } else if (svcOffering.getCpu() != null) {
            usageRecResponse.setCpuNumber(svcOffering.getCpu().longValue());
        }
        if (usageRecord.getCpuSpeed() != null) {
            usageRecResponse.setCpuSpeed(usageRecord.getCpuSpeed());
        } else if (svcOffering.getSpeed() != null) {
            usageRecResponse.setCpuSpeed(svcOffering.getSpeed().longValue());
        }
        if (usageRecord.getMemory() != null) {
            usageRecResponse.setMemory(usageRecord.getMemory());
        } else if (svcOffering.getRamSize() != null) {
            usageRecResponse.setMemory(svcOffering.getRamSize().longValue());
        }
        if (!oldFormat) {
            final StringBuilder builder = new StringBuilder();
            if (usageRecord.getUsageType() == UsageTypes.RUNNING_VM) {
                builder.append("Running VM usage ");
            } else if (usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM) {
                builder.append("Allocated VM usage ");
            }
            if (vm != null) {
                builder.append("for ").append(vm.getHostName()).append(" (").append(vm.getInstanceName()).append(") (").append(vm.getUuid()).append(") ");
            }
            if (svcOffering != null) {
                builder.append("using service offering ").append(svcOffering.getName()).append(" (").append(svcOffering.getUuid()).append(") ");
            }
            if (template != null) {
                builder.append("and template ").append(template.getName()).append(" (").append(template.getUuid()).append(")");
            }
            usageRecResponse.setDescription(builder.toString());
        }
    } else if (usageRecord.getUsageType() == UsageTypes.IP_ADDRESS) {
        // IP Address ID
        IPAddressVO ip = _entityMgr.findByIdIncludingRemoved(IPAddressVO.class, usageRecord.getUsageId().toString());
        if (ip != null) {
            Long networkId = ip.getAssociatedWithNetworkId();
            if (networkId == null) {
                networkId = ip.getSourceNetworkId();
            }
            resourceType = ResourceObjectType.PublicIpAddress;
            resourceId = ip.getId();
            usageRecResponse.setUsageId(ip.getUuid());
        }
        // isSourceNAT
        usageRecResponse.setSourceNat((usageRecord.getType().equals("SourceNat")) ? true : false);
        // isSystem
        usageRecResponse.setSystem((usageRecord.getSize() == 1) ? true : false);
    } else if (usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_SENT || usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_RECEIVED) {
        // Device Type
        resourceType = ResourceObjectType.UserVm;
        usageRecResponse.setType(usageRecord.getType());
        VMInstanceVO vm = null;
        HostVO host = null;
        if (usageRecord.getType().equals("DomainRouter") || usageRecord.getType().equals("UserVm")) {
            // Domain Router Id
            vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString());
            if (vm != null) {
                resourceId = vm.getId();
                usageRecResponse.setUsageId(vm.getUuid());
            }
        } else {
            // External Device Host Id
            host = _entityMgr.findByIdIncludingRemoved(HostVO.class, usageRecord.getUsageId().toString());
            if (host != null) {
                usageRecResponse.setUsageId(host.getUuid());
            }
        }
        // Network ID
        NetworkVO network = null;
        if ((usageRecord.getNetworkId() != null) && (usageRecord.getNetworkId() != 0)) {
            network = _entityMgr.findByIdIncludingRemoved(NetworkVO.class, usageRecord.getNetworkId().toString());
            if (network != null) {
                resourceType = ResourceObjectType.Network;
                if (network.getTrafficType() == TrafficType.Public) {
                    VirtualRouter router = ApiDBUtils.findDomainRouterById(usageRecord.getUsageId());
                    Vpc vpc = ApiDBUtils.findVpcByIdIncludingRemoved(router.getVpcId());
                    usageRecResponse.setVpcId(vpc.getUuid());
                    resourceId = vpc.getId();
                } else {
                    usageRecResponse.setNetworkId(network.getUuid());
                    resourceId = network.getId();
                }
                usageRecResponse.setResourceName(network.getName());
            }
        }
        if (!oldFormat) {
            final StringBuilder builder = new StringBuilder();
            if (usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_SENT) {
                builder.append("Bytes sent by network ");
            } else if (usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_RECEIVED) {
                builder.append("Bytes received by network ");
            }
            if (network != null) {
                if (network.getName() != null) {
                    builder.append(network.getName());
                }
                if (network.getUuid() != null) {
                    builder.append(" (").append(network.getUuid()).append(") ");
                }
                builder.append(" " + toHumanReadableSize(usageRecord.getRawUsage().longValue()) + " ");
            }
            if (vm != null) {
                builder.append("using router ").append(vm.getInstanceName()).append(" (").append(vm.getUuid()).append(")");
            } else if (host != null) {
                builder.append("using host ").append(host.getName()).append(" (").append(host.getUuid()).append(")");
            }
            usageRecResponse.setDescription(builder.toString());
        }
    } else if (usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_READ || usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_WRITE || usageRecord.getUsageType() == UsageTypes.VM_DISK_BYTES_READ || usageRecord.getUsageType() == UsageTypes.VM_DISK_BYTES_WRITE) {
        // Device Type
        usageRecResponse.setType(usageRecord.getType());
        resourceType = ResourceObjectType.Volume;
        // Volume ID
        VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString());
        if (volume != null) {
            usageRecResponse.setUsageId(volume.getUuid());
            resourceId = volume.getId();
        }
        if (!oldFormat) {
            final StringBuilder builder = new StringBuilder();
            if (usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_READ) {
                builder.append("Disk I/O read requests");
            } else if (usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_WRITE) {
                builder.append("Disk I/O write requests");
            } else if (usageRecord.getUsageType() == UsageTypes.VM_DISK_BYTES_READ) {
                builder.append("Disk I/O read bytes");
            } else if (usageRecord.getUsageType() == UsageTypes.VM_DISK_BYTES_WRITE) {
                builder.append("Disk I/O write bytes");
            }
            if (vmInstance != null) {
                builder.append(" for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(")");
            }
            if (volume != null) {
                builder.append(" and volume ").append(volume.getName()).append(" (").append(volume.getUuid()).append(")");
            }
            if (usageRecord.getRawUsage() != null) {
                builder.append(" " + toHumanReadableSize(usageRecord.getRawUsage().longValue()));
            }
            usageRecResponse.setDescription(builder.toString());
        }
    } else if (usageRecord.getUsageType() == UsageTypes.VOLUME) {
        // Volume ID
        VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString());
        resourceType = ResourceObjectType.Volume;
        if (volume != null) {
            usageRecResponse.setUsageId(volume.getUuid());
            resourceId = volume.getId();
        }
        // Volume Size
        usageRecResponse.setSize(usageRecord.getSize());
        // Disk Offering Id
        DiskOfferingVO diskOff = null;
        if (usageRecord.getOfferingId() != null) {
            diskOff = _entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class, usageRecord.getOfferingId().toString());
            usageRecResponse.setOfferingId(diskOff.getUuid());
        }
        if (!oldFormat) {
            final StringBuilder builder = new StringBuilder();
            builder.append("Volume usage ");
            if (volume != null) {
                builder.append("for ").append(volume.getName()).append(" (").append(volume.getUuid()).append(")");
            }
            if (diskOff != null) {
                builder.append(" with disk offering ").append(diskOff.getName()).append(" (").append(diskOff.getUuid()).append(")");
            }
            if (template != null) {
                builder.append(" and template ").append(template.getName()).append(" (").append(template.getUuid()).append(")");
            }
            if (usageRecord.getSize() != null) {
                builder.append(" and size " + toHumanReadableSize(usageRecord.getSize()));
            }
            usageRecResponse.setDescription(builder.toString());
        }
    } else if (usageRecord.getUsageType() == UsageTypes.TEMPLATE || usageRecord.getUsageType() == UsageTypes.ISO) {
        // Template/ISO ID
        VMTemplateVO tmpl = _entityMgr.findByIdIncludingRemoved(VMTemplateVO.class, usageRecord.getUsageId().toString());
        if (tmpl != null) {
            usageRecResponse.setUsageId(tmpl.getUuid());
            resourceId = tmpl.getId();
        }
        // Template/ISO Size
        usageRecResponse.setSize(usageRecord.getSize());
        if (usageRecord.getUsageType() == UsageTypes.ISO) {
            usageRecResponse.setVirtualSize(usageRecord.getSize());
            resourceType = ResourceObjectType.ISO;
        } else {
            usageRecResponse.setVirtualSize(usageRecord.getVirtualSize());
            resourceType = ResourceObjectType.Template;
        }
        if (!oldFormat) {
            final StringBuilder builder = new StringBuilder();
            if (usageRecord.getUsageType() == UsageTypes.TEMPLATE) {
                builder.append("Template usage");
            } else if (usageRecord.getUsageType() == UsageTypes.ISO) {
                builder.append("ISO usage");
            }
            if (tmpl != null) {
                builder.append(" for ").append(tmpl.getName()).append(" (").append(tmpl.getUuid()).append(") ").append("with size ").append(toHumanReadableSize(usageRecord.getSize())).append(" and virtual size ").append(toHumanReadableSize(usageRecord.getVirtualSize()));
            }
            usageRecResponse.setDescription(builder.toString());
        }
    } else if (usageRecord.getUsageType() == UsageTypes.SNAPSHOT) {
        // Snapshot ID
        SnapshotVO snap = _entityMgr.findByIdIncludingRemoved(SnapshotVO.class, usageRecord.getUsageId().toString());
        resourceType = ResourceObjectType.Snapshot;
        if (snap != null) {
            usageRecResponse.setUsageId(snap.getUuid());
            resourceId = snap.getId();
        }
        // Snapshot Size
        usageRecResponse.setSize(usageRecord.getSize());
        if (!oldFormat) {
            final StringBuilder builder = new StringBuilder();
            builder.append("Snapshot usage ");
            if (snap != null) {
                builder.append("for ").append(snap.getName()).append(" (").append(snap.getUuid()).append(") ").append("with size ").append(toHumanReadableSize(usageRecord.getSize()));
            }
            usageRecResponse.setDescription(builder.toString());
        }
    } else if (usageRecord.getUsageType() == UsageTypes.LOAD_BALANCER_POLICY) {
        // Load Balancer Policy ID
        LoadBalancerVO lb = _entityMgr.findByIdIncludingRemoved(LoadBalancerVO.class, usageRecord.getUsageId().toString());
        resourceType = ResourceObjectType.LoadBalancer;
        if (lb != null) {
            usageRecResponse.setUsageId(lb.getUuid());
            resourceId = lb.getId();
        }
        if (!oldFormat) {
            final StringBuilder builder = new StringBuilder();
            builder.append("Loadbalancer policy usage ");
            if (lb != null) {
                builder.append(lb.getName()).append(" (").append(lb.getUuid()).append(")");
            }
            usageRecResponse.setDescription(builder.toString());
        }
    } else if (usageRecord.getUsageType() == UsageTypes.PORT_FORWARDING_RULE) {
        // Port Forwarding Rule ID
        PortForwardingRuleVO pf = _entityMgr.findByIdIncludingRemoved(PortForwardingRuleVO.class, usageRecord.getUsageId().toString());
        resourceType = ResourceObjectType.PortForwardingRule;
        if (pf != null) {
            usageRecResponse.setUsageId(pf.getUuid());
            resourceId = pf.getId();
        }
        if (!oldFormat) {
            final StringBuilder builder = new StringBuilder();
            builder.append("Port forwarding rule usage");
            if (pf != null) {
                builder.append(" (").append(pf.getUuid()).append(")");
            }
            usageRecResponse.setDescription(builder.toString());
        }
    } else if (usageRecord.getUsageType() == UsageTypes.NETWORK_OFFERING) {
        // Network Offering Id
        NetworkOfferingVO netOff = _entityMgr.findByIdIncludingRemoved(NetworkOfferingVO.class, usageRecord.getOfferingId().toString());
        usageRecResponse.setOfferingId(netOff.getUuid());
        // is Default
        usageRecResponse.setDefault(usageRecord.getUsageId() == 1);
        if (!oldFormat) {
            final StringBuilder builder = new StringBuilder();
            builder.append("Network offering ");
            if (netOff != null) {
                builder.append(netOff.getName()).append(" (").append(netOff.getUuid()).append(") usage ");
            }
            if (vmInstance != null) {
                builder.append("for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(") ");
            }
            usageRecResponse.setDescription(builder.toString());
        }
    } else if (usageRecord.getUsageType() == UsageTypes.VPN_USERS) {
        // VPN User ID
        VpnUserVO vpnUser = _entityMgr.findByIdIncludingRemoved(VpnUserVO.class, usageRecord.getUsageId().toString());
        if (vpnUser != null) {
            usageRecResponse.setUsageId(vpnUser.getUuid());
        }
        if (!oldFormat) {
            final StringBuilder builder = new StringBuilder();
            builder.append("VPN usage ");
            if (vpnUser != null) {
                builder.append("for user ").append(vpnUser.getUsername()).append(" (").append(vpnUser.getUuid()).append(")");
            }
            usageRecResponse.setDescription(builder.toString());
        }
    } else if (usageRecord.getUsageType() == UsageTypes.SECURITY_GROUP) {
        // Security Group Id
        SecurityGroupVO sg = _entityMgr.findByIdIncludingRemoved(SecurityGroupVO.class, usageRecord.getUsageId().toString());
        resourceType = ResourceObjectType.SecurityGroup;
        if (sg != null) {
            resourceId = sg.getId();
            usageRecResponse.setUsageId(sg.getUuid());
        }
        if (!oldFormat) {
            final StringBuilder builder = new StringBuilder();
            builder.append("Security group");
            if (sg != null) {
                builder.append(" ").append(sg.getName()).append(" (").append(sg.getUuid()).append(") usage");
            }
            if (vmInstance != null) {
                builder.append(" for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(")");
            }
            usageRecResponse.setDescription(builder.toString());
        }
    } else if (usageRecord.getUsageType() == UsageTypes.BACKUP) {
        resourceType = ResourceObjectType.Backup;
        final StringBuilder builder = new StringBuilder();
        builder.append("Backup usage of size ").append(usageRecord.getUsageDisplay());
        if (vmInstance != null) {
            resourceId = vmInstance.getId();
            usageRecResponse.setResourceName(vmInstance.getInstanceName());
            usageRecResponse.setUsageId(vmInstance.getUuid());
            builder.append(" for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(")");
            final BackupOffering backupOffering = backupOfferingDao.findByIdIncludingRemoved(usageRecord.getOfferingId());
            if (backupOffering != null) {
                builder.append(" and backup offering ").append(backupOffering.getName()).append(" (").append(backupOffering.getUuid()).append(", user ad-hoc/scheduled backup allowed: ").append(backupOffering.isUserDrivenBackupAllowed()).append(")");
            }
        }
        usageRecResponse.setDescription(builder.toString());
    } else if (usageRecord.getUsageType() == UsageTypes.VM_SNAPSHOT) {
        resourceType = ResourceObjectType.VMSnapshot;
        VMSnapshotVO vmSnapshotVO = null;
        if (usageRecord.getUsageId() != null) {
            vmSnapshotVO = vmSnapshotDao.findByIdIncludingRemoved(usageRecord.getUsageId());
            if (vmSnapshotVO != null) {
                resourceId = vmSnapshotVO.getId();
                usageRecResponse.setResourceName(vmSnapshotVO.getDisplayName());
                usageRecResponse.setUsageId(vmSnapshotVO.getUuid());
            }
        }
        usageRecResponse.setSize(usageRecord.getSize());
        if (usageRecord.getVirtualSize() != null) {
            usageRecResponse.setVirtualSize(usageRecord.getVirtualSize());
        }
        if (usageRecord.getOfferingId() != null) {
            usageRecResponse.setOfferingId(usageRecord.getOfferingId().toString());
        }
        if (!oldFormat) {
            VolumeVO volume = null;
            if (vmSnapshotVO == null && usageRecord.getUsageId() != null) {
                volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString());
            }
            DiskOfferingVO diskOff = null;
            if (usageRecord.getOfferingId() != null) {
                diskOff = _entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class, usageRecord.getOfferingId());
            }
            final StringBuilder builder = new StringBuilder();
            builder.append("VMSnapshot usage");
            if (vmSnapshotVO != null) {
                builder.append(" Id: ").append(vmSnapshotVO.getUuid());
            }
            if (vmInstance != null) {
                builder.append(" for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(")");
            }
            if (volume != null) {
                builder.append(" with volume ").append(volume.getName()).append(" (").append(volume.getUuid()).append(")");
            }
            if (diskOff != null) {
                builder.append(" using disk offering ").append(diskOff.getName()).append(" (").append(diskOff.getUuid()).append(")");
            }
            if (usageRecord.getSize() != null) {
                builder.append(" and size " + toHumanReadableSize(usageRecord.getSize()));
            }
            usageRecResponse.setDescription(builder.toString());
        }
    } else if (usageRecord.getUsageType() == UsageTypes.VOLUME_SECONDARY) {
        VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString());
        if (!oldFormat) {
            final StringBuilder builder = new StringBuilder();
            builder.append("Volume on secondary storage usage");
            if (volume != null) {
                builder.append(" for ").append(volume.getName()).append(" (").append(volume.getUuid()).append(") ").append("with size ").append(toHumanReadableSize(usageRecord.getSize()));
            }
            usageRecResponse.setDescription(builder.toString());
        }
    } else if (usageRecord.getUsageType() == UsageTypes.VM_SNAPSHOT_ON_PRIMARY) {
        resourceType = ResourceObjectType.VMSnapshot;
        VMSnapshotVO vmSnapshotVO = null;
        if (usageRecord.getUsageId() != null) {
            vmSnapshotVO = vmSnapshotDao.findByIdIncludingRemoved(usageRecord.getUsageId());
            if (vmSnapshotVO != null) {
                resourceId = vmSnapshotVO.getId();
                usageRecResponse.setResourceName(vmSnapshotVO.getDisplayName());
                usageRecResponse.setUsageId(vmSnapshotVO.getUuid());
            }
        }
        usageRecResponse.setSize(usageRecord.getVirtualSize());
        if (!oldFormat) {
            final StringBuilder builder = new StringBuilder();
            builder.append("VMSnapshot on primary storage usage");
            if (vmSnapshotVO != null) {
                builder.append(" Id: ").append(vmSnapshotVO.getUuid());
            }
            if (vmInstance != null) {
                builder.append(" for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(") ").append("with size ").append(toHumanReadableSize(usageRecord.getVirtualSize()));
            }
            usageRecResponse.setDescription(builder.toString());
        }
    }
    if (resourceTagResponseMap != null && resourceTagResponseMap.get(resourceId + ":" + resourceType) != null) {
        usageRecResponse.setTags(resourceTagResponseMap.get(resourceId + ":" + resourceType));
    }
    if (usageRecord.getRawUsage() != null) {
        DecimalFormat decimalFormat = new DecimalFormat("###########.######");
        usageRecResponse.setRawUsage(decimalFormat.format(usageRecord.getRawUsage()));
    }
    if (usageRecord.getStartDate() != null) {
        usageRecResponse.setStartDate(getDateStringInternal(usageRecord.getStartDate()));
    }
    if (usageRecord.getEndDate() != null) {
        usageRecResponse.setEndDate(getDateStringInternal(usageRecord.getEndDate()));
    }
    return usageRecResponse;
}
Also used : UsageRecordResponse(org.apache.cloudstack.api.response.UsageRecordResponse) ProjectAccount(com.cloud.projects.ProjectAccount) UserAccount(com.cloud.user.UserAccount) Account(com.cloud.user.Account) GuestOsCategory(com.cloud.storage.GuestOsCategory) VpnUserVO(com.cloud.network.VpnUserVO) DecimalFormat(java.text.DecimalFormat) VMTemplateVO(com.cloud.storage.VMTemplateVO) Vpc(com.cloud.network.vpc.Vpc) LoadBalancerVO(com.cloud.network.dao.LoadBalancerVO) ServiceOfferingVO(com.cloud.service.ServiceOfferingVO) VolumeVO(com.cloud.storage.VolumeVO) DiskOfferingVO(com.cloud.storage.DiskOfferingVO) GuestOS(com.cloud.storage.GuestOS) BackupOffering(org.apache.cloudstack.backup.BackupOffering) PhysicalNetworkVO(com.cloud.network.dao.PhysicalNetworkVO) NetworkVO(com.cloud.network.dao.NetworkVO) PortForwardingRuleVO(com.cloud.network.rules.PortForwardingRuleVO) SecurityGroupVO(com.cloud.network.security.SecurityGroupVO) VMInstanceVO(com.cloud.vm.VMInstanceVO) ResourceObjectType(com.cloud.server.ResourceTag.ResourceObjectType) HostVO(com.cloud.host.HostVO) VirtualRouter(com.cloud.network.router.VirtualRouter) Project(com.cloud.projects.Project) VMSnapshotVO(com.cloud.vm.snapshot.VMSnapshotVO) DataCenter(com.cloud.dc.DataCenter) ResourceTag(com.cloud.server.ResourceTag) VMSnapshotVO(com.cloud.vm.snapshot.VMSnapshotVO) SnapshotVO(com.cloud.storage.SnapshotVO) NetworkOfferingVO(com.cloud.offerings.NetworkOfferingVO) IPAddressVO(com.cloud.network.dao.IPAddressVO) Domain(com.cloud.domain.Domain)

Aggregations

SnapshotVO (com.cloud.storage.SnapshotVO)105 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)46 VMSnapshotVO (com.cloud.vm.snapshot.VMSnapshotVO)29 VolumeVO (com.cloud.storage.VolumeVO)28 Account (com.cloud.user.Account)22 SnapshotInfo (org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo)22 InvalidParameterValueException (com.cloud.exception.InvalidParameterValueException)18 ArrayList (java.util.ArrayList)17 DataStore (org.apache.cloudstack.engine.subsystem.api.storage.DataStore)16 VolumeInfo (org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo)16 SnapshotDataStoreVO (org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO)16 HostVO (com.cloud.host.HostVO)15 VMTemplateVO (com.cloud.storage.VMTemplateVO)15 DB (com.cloud.utils.db.DB)14 ResourceAllocationException (com.cloud.exception.ResourceAllocationException)12 ConfigurationException (javax.naming.ConfigurationException)12 InvalidParameterValueException (com.cloud.utils.exception.InvalidParameterValueException)11 UserVmVO (com.cloud.vm.UserVmVO)10 VMInstanceVO (com.cloud.vm.VMInstanceVO)10 ActionEvent (com.cloud.event.ActionEvent)9