package org.ovirt.engine.api.restapi.resource; import java.util.Collection; import java.util.Map; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.Action; import org.ovirt.engine.api.model.Disk; import org.ovirt.engine.api.model.DiskAttachment; import org.ovirt.engine.api.model.Vm; import org.ovirt.engine.api.model.Vms; import org.ovirt.engine.api.model.VnicProfileMapping; import org.ovirt.engine.api.resource.ActionResource; import org.ovirt.engine.api.resource.StorageDomainContentDisksResource; import org.ovirt.engine.api.resource.StorageDomainVmDiskAttachmentsResource; import org.ovirt.engine.api.resource.StorageDomainVmResource; import org.ovirt.engine.api.restapi.types.DiskMapper; import org.ovirt.engine.api.restapi.types.ExternalVnicProfileMappingMapper; import org.ovirt.engine.api.restapi.util.ParametersHelper; import org.ovirt.engine.core.common.action.ImportVmParameters; import org.ovirt.engine.core.common.action.RemoveVmFromImportExportParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.network.ExternalVnicProfileMapping; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.VolumeFormat; import org.ovirt.engine.core.common.businessentities.storage.VolumeType; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; public class BackendStorageDomainVmResource extends AbstractBackendStorageDomainContentResource<Vms, Vm, org.ovirt.engine.core.common.businessentities.VM> implements StorageDomainVmResource { public static final String COLLAPSE_SNAPSHOTS = "collapse_snapshots"; org.ovirt.engine.core.common.businessentities.VM vm; public BackendStorageDomainVmResource(BackendStorageDomainVmsResource parent, String vmId) { super(vmId, parent, Vm.class, org.ovirt.engine.core.common.businessentities.VM.class); } @Override public Vm get() { switch (parent.getStorageDomainType()) { case Data: case Master: return getFromDataDomain(); case ImportExport: return getFromExportDomain(); default: return null; } } private Vm getFromDataDomain() { return performGet(VdcQueryType.GetVmByVmId, new IdQueryParameters(guid)); } private Vm getFromExportDomain() { org.ovirt.engine.core.common.businessentities.VM entity = getEntity(); return addLinks(populate(map(entity, null), entity), null, new String[0]); } @Override public Response register(Action action) { validateParameters(action, "cluster.id|name"); validateVnicMappings(action); ImportVmParameters params = new ImportVmParameters(getVnicProfileMappings(action), getReassignBadMacs(action)); params.setContainerId(guid); params.setStorageDomainId(parent.getStorageDomainId()); params.setClusterId(getClusterId(action)); params.setImagesExistOnTargetStorageDomain(true); if (action.isSetClone()) { params.setImportAsNewEntity(action.isClone()); if (action.isSetVm() && action.getVm().isSetName()) { params.getVm().setName(action.getVm().getName()); } } if (action.isSetAllowPartialImport()) { params.setAllowPartialImport(action.isAllowPartialImport()); } return doAction(VdcActionType.ImportVmFromConfiguration, params, action); } @Override public Response doImport(Action action) { validateParameters(action, "cluster.id|name", "storageDomain.id|name"); Guid destStorageDomainId = getDestStorageDomainId(action); ImportVmParameters params = new ImportVmParameters(getEntity(), parent.getStorageDomainId(), destStorageDomainId, parent.getDataCenterId(destStorageDomainId), getClusterId(action)); params.setImageToDestinationDomainMap(getDiskToDestinationMap(action)); params.setForceOverride(action.isSetExclusive() ? action.isExclusive() : false); boolean collapseSnapshots = ParametersHelper.getBooleanParameter(httpHeaders, uriInfo, COLLAPSE_SNAPSHOTS, true, false); if (collapseSnapshots) { params.setCopyCollapse(collapseSnapshots); } setVolumesTypeFormat(action); if (action.isSetClone()) { params.setImportAsNewEntity(action.isClone()); if (action.isSetVm() && action.getVm().isSetName()) { params.getVm().setName(action.getVm().getName()); } } return doAction(VdcActionType.ImportVm, params, action); } private void validateVnicMappings(Action action) { if (action.isSetVnicProfileMappings() && action.getVnicProfileMappings().isSetVnicProfileMappings()) { action.getVnicProfileMappings().getVnicProfileMappings().forEach(this::validateVnicProfileMapping); } } private void validateVnicProfileMapping(VnicProfileMapping mapping) { if (!mapping.isSetSourceNetworkName()) { badRequest("vNic profile mapping is missing source network name."); } if (!mapping.isSetSourceNetworkProfileName()) { badRequest("vNic profile mapping is missing source network profile name."); } if (mapping.isSetTargetVnicProfile() && mapping.getTargetVnicProfile().isSetId()) { asGuid(mapping.getTargetVnicProfile().getId()); } } private boolean getReassignBadMacs(Action action) { return action.isSetReassignBadMacs() && action.isReassignBadMacs(); } private Collection<ExternalVnicProfileMapping> getVnicProfileMappings(Action action) { return ExternalVnicProfileMappingMapper.mapFromModel(action.getVnicProfileMappings()); } private void setVolumesTypeFormat(Action action) { if (action.isSetVm()) { Vm modelVm = action.getVm(); if (!modelVm.isSetDiskAttachments()) { return; } Map<Guid, org.ovirt.engine.core.common.businessentities.storage.Disk> entityDisks = getDiskMap(); for (DiskAttachment modelDiskAttachment : modelVm.getDiskAttachments().getDiskAttachments()) { Disk modelDisk = modelDiskAttachment.getDisk(); if (modelDisk != null) { validateParameters(modelDisk, "id"); Guid modelDiskId = Guid.createGuidFromString(modelDisk.getId()); DiskImage entityDisk = (DiskImage) entityDisks.get(modelDiskId); if (entityDisk == null) { continue; } if (modelDisk.isSetFormat()) { VolumeFormat entityDiskFormat = DiskMapper.map(modelDisk.getFormat(), null); entityDisk.setVolumeFormat(entityDiskFormat); } if (modelDisk.isSetSparse()) { entityDisk.setVolumeType(modelDisk.isSparse() ? VolumeType.Sparse : VolumeType.Preallocated); } } } } } @Override public ActionResource getActionResource(String action, String ids) { return inject(new BackendActionResource(action, ids)); } @Override public StorageDomainContentDisksResource getDisksResource() { return inject(new BackendExportDomainDisksResource(this)); } @Override public StorageDomainVmDiskAttachmentsResource getDiskAttachmentsResource() { return inject(new BackendExportDomainDiskAttachmentsResource(this)); } @Override protected Vm addParents(Vm vm) { vm.setStorageDomain(parent.getStorageDomainModel()); return vm; } protected org.ovirt.engine.core.common.businessentities.VM getEntity() { if (vm != null) { return vm; } for (org.ovirt.engine.core.common.businessentities.VM entity : parent.getEntitiesFromExportDomain()) { if (guid.equals(entity.getId())) { vm = entity; return entity; } } return entityNotFound(); } @Override public Map<Guid, org.ovirt.engine.core.common.businessentities.storage.Disk> getDiskMap() { return getEntity().getDiskMap(); } @Override public Response remove() { get(); RemoveVmFromImportExportParameters params = new RemoveVmFromImportExportParameters( guid, parent.storageDomainId, getDataCenterId(parent.storageDomainId)); return performAction(VdcActionType.RemoveVmFromImportExport, params); } }