package org.ovirt.engine.api.restapi.resource;
import static org.ovirt.engine.api.restapi.util.LinkHelper.addLinks;
import javax.ws.rs.core.Response;
import org.ovirt.engine.api.model.BaseResource;
import org.ovirt.engine.api.model.ExternalVmImport;
import org.ovirt.engine.api.model.Host;
import org.ovirt.engine.api.model.StorageDomain;
import org.ovirt.engine.api.model.Vm;
import org.ovirt.engine.api.resource.ExternalVmImportsResource;
import org.ovirt.engine.api.restapi.types.VmMapper;
import org.ovirt.engine.core.common.action.ImportVmFromExternalUrlParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.OriginType;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatic;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.storage.VolumeType;
import org.ovirt.engine.core.common.queries.NameQueryParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
public class BackendExternalVmImportsResource extends BackendResource implements ExternalVmImportsResource {
@Override
public Response add(ExternalVmImport externalVmImport) {
validateParameters(externalVmImport,
"provider",
"url",
"name",
"sparse",
"cluster.id|name",
"storageDomain.id|name");
ImportVmFromExternalUrlParameters parameters = buildImportParameters(externalVmImport);
VM createdVm = performAction(VdcActionType.ImportVmFromExternalUrl, parameters, VM.class);
// Postprocess output entity to clear sensitive data and resolve links.
externalVmImport.setPassword(null);
externalVmImport.setVm(withIdLink(new Vm(), createdVm.getId()));
externalVmImport.setCluster(withIdLink(new org.ovirt.engine.api.model.Cluster(), parameters.getClusterId()));
externalVmImport.setStorageDomain(withIdLink(new StorageDomain(), parameters.getStorageDomainId()));
if (externalVmImport.isSetHost()) {
externalVmImport.setHost(withIdLink(new Host(), parameters.getProxyHostId()));
}
return Response.ok(externalVmImport).status(Response.Status.CREATED).build();
}
private static <R extends BaseResource> R withIdLink(R resource, Guid id) {
resource.setId(id.toString());
addLinks(resource, null, false);
return resource;
}
private ImportVmFromExternalUrlParameters buildImportParameters(ExternalVmImport vmImport) {
ImportVmFromExternalUrlParameters parameters = new ImportVmFromExternalUrlParameters();
parameters.setUrl(vmImport.getUrl());
parameters.setOriginType(getOriginType(vmImport));
parameters.setExternalName(vmImport.getName());
parameters.setNewVmName(vmImport.getVm() != null ? vmImport.getVm().getName() : null);
parameters.setVolumeType(getVolumeType(vmImport));
parameters.setProxyHostId(getProxyHostId(vmImport));
parameters.setVirtioIsoName(getVirtioIsoName(vmImport));
parameters.setStorageDomainId(getStorageDomainId(vmImport));
parameters.setClusterId(getClusterId(vmImport));
parameters.setQuotaId(getQuotaId(vmImport));
parameters.setCpuProfileId(getCpuProfileId(vmImport));
parameters.setUsername(vmImport.getUsername());
parameters.setPassword(vmImport.getPassword());
return parameters;
}
private OriginType getOriginType(ExternalVmImport vmImport) {
return VmMapper.mapExternalVmProviderToOrigin(vmImport.getProvider());
}
private Guid getProxyHostId(ExternalVmImport vmImport) {
if (vmImport.isSetHost()) {
if (vmImport.getHost().isSetId()) {
return asGuid(vmImport.getHost().getId());
} else if (vmImport.getHost().isSetName()) {
String hostName = vmImport.getHost().getName();
VDS vds = getEntity(VDS.class,
VdcQueryType.GetVdsByName,
new NameQueryParameters(vmImport.getHost().getName()),
hostName,
true);
return vds.getId();
}
}
return null;
}
private static String getVirtioIsoName(ExternalVmImport vmImport) {
return vmImport.isSetDriversIso() && vmImport.getDriversIso().isSetId()
? vmImport.getDriversIso().getId() : null;
}
private static VolumeType getVolumeType(ExternalVmImport vmImport) {
return Boolean.TRUE.equals(vmImport.isSparse()) ? VolumeType.Sparse : VolumeType.Preallocated;
}
private Guid getClusterId(ExternalVmImport vmImport) {
if (vmImport.getCluster().isSetId()) {
return asGuid(vmImport.getCluster().getId());
} else /* if (vmImport.getCluster().isSetName()) */ {
String clusterName = vmImport.getCluster().getName();
Cluster cluster = getEntity(Cluster.class,
VdcQueryType.GetClusterByName,
new NameQueryParameters(clusterName),
clusterName,
true);
return cluster.getId();
}
}
private Guid getStorageDomainId(ExternalVmImport vmImport) {
if (vmImport.getStorageDomain().isSetId()) {
return asGuid(vmImport.getStorageDomain().getId());
} else /* if (vmImport.getStorageDomain().isSetName()) */ {
String storageDomainName = vmImport.getStorageDomain().getName();
StorageDomainStatic storageDomain = getEntity(StorageDomainStatic.class,
VdcQueryType.GetStorageDomainByName,
new NameQueryParameters(storageDomainName),
storageDomainName,
true);
return storageDomain.getId();
}
}
private Guid getQuotaId(ExternalVmImport vmImport) {
if (vmImport.isSetQuota() && vmImport.getQuota().isSetId()) {
return asGuid(vmImport.getQuota().getId());
} else {
return null;
}
}
private Guid getCpuProfileId(ExternalVmImport vmImport) {
if (vmImport.isSetCpuProfile() && vmImport.getCpuProfile().isSetId()) {
return asGuid(vmImport.getCpuProfile().getId());
} else {
return null;
}
}
}