package org.ovirt.engine.core.bll;
import java.util.List;
import javax.inject.Inject;
import org.apache.commons.lang.StringUtils;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.utils.PermissionSubject;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.AddExternalEventParameters;
import org.ovirt.engine.core.common.businessentities.ActionGroup;
import org.ovirt.engine.core.common.businessentities.AuditLog;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase;
import org.ovirt.engine.core.dao.AuditLogDao;
import org.ovirt.engine.core.dao.StorageDomainDynamicDao;
import org.ovirt.engine.core.dao.VdsDynamicDao;
import org.ovirt.engine.core.di.Injector;
public class AddExternalEventCommand<T extends AddExternalEventParameters> extends ExternalEventCommandBase<T> {
@Inject
private AuditLogDao auditLogDao;
@Inject
private VdsDynamicDao vdsDynamicDao;
@Inject
private StorageDomainDynamicDao storageDomainDynamicDao;
public AddExternalEventCommand(T parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
}
@Override
protected boolean validate() {
if (getEvent() == null
|| AuditLog.OVIRT_ORIGIN.equalsIgnoreCase(getEvent().getOrigin())) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_EXTERNAL_EVENT_ILLEGAL_ORIGIN);
}
return true;
}
@Override
protected void setActionMessageParameters() {
addValidationMessage(EngineMessage.VAR__ACTION__ADD);
addValidationMessage(EngineMessage.VAR__TYPE__EXTERNAL_EVENT);
}
@Override
protected void executeCommand() {
AuditLogableBase event = Injector.injectMembers(new AuditLogableBase(getParameters().getEvent()));
event.setExternal(true);
String message =
StringUtils.abbreviate(getEvent().getMessage(), Config.getValue(ConfigValues.MaxAuditLogMessageLength));
switch (getEvent().getSeverity()){
case NORMAL:
auditLogDirector.log(event, AuditLogType.EXTERNAL_EVENT_NORMAL, message);
break;
case WARNING:
auditLogDirector.log(event, AuditLogType.EXTERNAL_EVENT_WARNING, message);
break;
case ERROR:
auditLogDirector.log(event, AuditLogType.EXTERNAL_EVENT_ERROR, message);
break;
case ALERT:
auditLogDirector.log(event, AuditLogType.EXTERNAL_ALERT, message);
break;
}
AuditLog auditLog =
auditLogDao.getByOriginAndCustomEventId(getEvent().getOrigin(), getEvent().getCustomEventId());
if (auditLog != null) {
setActionReturnValue(auditLog.getAuditLogId());
setSucceeded(true);
}
// Update host external status if set
if (hasHostExternalStatus()) {
vdsDynamicDao.updateExternalStatus(getEvent().getVdsId(), getParameters().getExternalStatus());
}
// update storage domain external status if set
if (hasStorageDomainExternalStatus()) {
storageDomainDynamicDao.updateExternalStatus(getEvent().getStorageDomainId(),
getParameters().getExternalStatus());
}
}
@Override
public List<PermissionSubject> getPermissionCheckSubjects() {
List<PermissionSubject> permissionList = getPermissionList(getEvent());
// check for external host status modification
if (hasHostExternalStatus()) {
permissionList.add(new PermissionSubject(getEvent().getVdsId(),
VdcObjectType.VDS, ActionGroup.EDIT_HOST_CONFIGURATION));
}
// check for external storage domain status modification
if (hasStorageDomainExternalStatus()) {
permissionList.add(new PermissionSubject(getEvent().getStorageDomainId(),
VdcObjectType.Storage, ActionGroup.EDIT_STORAGE_DOMAIN_CONFIGURATION));
}
return permissionList;
}
private boolean hasHostExternalStatus() {
return getEvent().getVdsId() != null && getParameters().getExternalStatus() != null;
}
private boolean hasStorageDomainExternalStatus() {
return getEvent().getStorageDomainId() != null && getParameters().getExternalStatus() != null;
}
private AuditLog getEvent() {
return getParameters().getEvent();
}
}