package org.ovirt.engine.api.restapi.resource;
import org.ovirt.engine.api.model.Domain;
import org.ovirt.engine.api.model.Session;
import org.ovirt.engine.api.model.Sessions;
import org.ovirt.engine.api.model.User;
import org.ovirt.engine.api.resource.VmSessionResource;
import org.ovirt.engine.api.resource.VmSessionsResource;
import org.ovirt.engine.api.resource.aaa.UserResource;
import org.ovirt.engine.api.restapi.resource.aaa.BackendUserResource;
import org.ovirt.engine.api.restapi.resource.aaa.BackendUsersResource;
import org.ovirt.engine.api.restapi.types.VmMapper;
import org.ovirt.engine.api.restapi.utils.GuidUtils;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.aaa.DbUser;
import org.ovirt.engine.core.common.queries.GetDbUserByUserNameAndDomainQueryParameters;
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 BackendVmSessionsResource extends AbstractBackendCollectionResource<Session, Object> implements VmSessionsResource {
private Guid vmId;
private BackendUserResource userResource;
public BackendVmSessionsResource(Guid vmId) {
super(Session.class, Object.class);
this.vmId = vmId;
}
@Override
public Sessions list() {
Object obj = getEntity(entityType, VdcQueryType.GetVmByVmId, new IdQueryParameters(vmId), vmId.toString(), true);
VM vm = (VM)obj;
Sessions sessions = VmMapper.map(vm, new Sessions());
org.ovirt.engine.api.model.Vm vmModel = new org.ovirt.engine.api.model.Vm();
vmModel.setId(vm.getId().toString());
if (sessions.isSetSessions()) {
for (Session session : sessions.getSessions()) {
setSessionId(session);
setSessionVmId(vmModel, session);
// only console user assumed to be an ovirt user, and only an ovirt-user has an ID & href
if (session.isSetConsoleUser() && session.isConsoleUser()) {
addLinksIncludingUser(session);
} else {
addLinks(session, org.ovirt.engine.api.model.Vm.class);
}
}
}
return sessions;
}
/**
* Special handling of adding links to the user and domain of the session.
*/
private void addLinksIncludingUser(Session session) {
String domainName = session.getUser().getDomain().getName();
addLinks(session, org.ovirt.engine.api.model.Vm.class);
session.getUser().setDomain(new Domain());
session.getUser().getDomain().setName(domainName);
setSessionUser(session);
}
private void setSessionVmId(org.ovirt.engine.api.model.Vm vmModel, Session session) {
session.setVm(vmModel);
}
/**
* A session is not a business-entity in the engine and does not have an ID. This method generates an ID for the
* session object, based on its attributes.
*/
private void setSessionId(Session session) {
String idString = session.getUser().getName();
if (session.isSetIp() && session.getIp().isSetAddress()) {
idString += session.getIp().getAddress();
}
if (session.isSetProtocol()) {
idString += session.getProtocol();
}
session.setId(GuidUtils.generateGuidUsingMd5(idString).toString());
}
/**
* The console user, if exists, is a real ovirt-user. Use its name to get ID and href information, and set them
* inside the user object, inside the session. If user is not found in database, those information won't be set.
*/
private void setSessionUser(Session session) {
// Get the user entity and don't fail if user is not found in database:
DbUser entity = getEntity(
DbUser.class,
VdcQueryType.GetDbUserByUserNameAndDomain,
new GetDbUserByUserNameAndDomainQueryParameters(
session.getUser().getUserName(),
session.getUser().getDomain().getName()
),
"",
false,
false
);
// Map the database user to model user:
if (entity != null) {
User user = BackendApiResource.getInstance()
.getUsersResource()
.getUserResource(entity.getId().toString())
.get();
/**
* TODO: It's enough to set user ID and href, we don't have to set also domain, please consider this
* when moving to API version 5.
*/
if (user != null) {
session.getUser().setId(user.getId());
session.getUser().setHref(user.getHref());
session.getUser().getDomain().setId(user.getDomain().getId());
session.getUser().getDomain().setHref(user.getDomain().getHref());
}
}
}
private BackendUserResource getUserResource() {
if (this.userResource == null) {
BackendUsersResource usersResource = new BackendUsersResource();
inject(usersResource);
UserResource userResource = usersResource.getUserResource("");
this.userResource = (BackendUserResource) userResource;
}
return this.userResource;
}
@Override
public VmSessionResource getSessionResource(String id) {
return inject(new BackendVmSessionResource(this, id));
}
public void setUserResource(BackendUserResource userResource) {
this.userResource = userResource;
}
}