package org.ovirt.engine.core.bll; import java.util.List; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.SetNonOperationalVdsParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdsActionParameters; import org.ovirt.engine.core.common.action.VdsGroupOperationParameters; import org.ovirt.engine.core.common.businessentities.NonOperationalReason; import org.ovirt.engine.core.common.businessentities.ServerCpu; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.compat.LogCompat; import org.ovirt.engine.core.compat.LogFactoryCompat; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.core.compat.TransactionScopeOption; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase; public class HandleVdsCpuFlagsOrClusterChangedCommand<T extends VdsActionParameters> extends VdsCommand<T> { public HandleVdsCpuFlagsOrClusterChangedCommand(T parameters) { super(parameters); } @Override protected boolean canDoAction() { boolean result = true; if (getVds() == null) { addCanDoActionMessage(VdcBllMessages.VDS_INVALID_SERVER_ID); result = false; } return result; } private boolean _hasFlags = true; @Override protected void executeCommand() { String vdsGroupCpuName = getVds().getvds_group_cpu_name(); boolean foundCPU = true; // if cluster doesnt have cpu then get the cpu from the vds if (StringHelper.isNullOrEmpty(vdsGroupCpuName)) { ServerCpu sc = CpuFlagsManagerHandler.FindMaxServerCpuByFlags(getVds().getcpu_flags(), getVds() .getvds_group_compatibility_version()); if (sc == null) { // if there are flags and no cpu found, mark to be non // operational if (!StringHelper.isNullOrEmpty(getVds().getcpu_flags())) { foundCPU = false; } else { _hasFlags = false; } log.errorFormat("Could not find server cpu for server {0}:{1}, flags: {2}", getVdsId(), getVds() .getvds_name(), getVds().getcpu_flags()); } else { // update group with the cpu name VDSGroup grp = DbFacade.getInstance().getVdsGroupDAO().get(getVds().getvds_group_id()); grp.setcpu_name(sc.getCpuName()); // use suppress in order to update group even if action fails // (out of the transaction) VdsGroupOperationParameters tempVar = new VdsGroupOperationParameters(grp); tempVar.setTransactionScopeOption(TransactionScopeOption.Suppress); tempVar.setIsInternalCommand(true); Backend.getInstance().runInternalAction(VdcActionType.UpdateVdsGroup, tempVar); vdsGroupCpuName = sc.getCpuName(); } } List<String> missingFlags = CpuFlagsManagerHandler.missingServerCpuFlags(vdsGroupCpuName, getVds() .getcpu_flags(), getVds().getvds_group_compatibility_version()); if (!StringHelper.isNullOrEmpty(getVds().getcpu_flags()) && (!foundCPU || missingFlags != null)) { if (missingFlags != null) { AddCustomValue("CpuFlags", StringUtils.join(missingFlags, ", ")); if (missingFlags.contains("nx")) { AuditLogableBase logable = new AuditLogableBase(getVds().getvds_id()); AuditLogDirector.log(logable, AuditLogType.CPU_FLAGS_NX_IS_MISSING); } } SetNonOperationalVdsParameters tempVar2 = new SetNonOperationalVdsParameters(getVdsId(), NonOperationalReason.CPU_TYPE_INCOMPATIBLE_WITH_CLUSTER); tempVar2.setSaveToDb(true); Backend.getInstance().runInternalAction(VdcActionType.SetNonOperationalVds, tempVar2); } else { // if no need to change to non operational then dont log the command setCommandShouldBeLogged(false); } setSucceeded(true); } @Override public AuditLogType getAuditLogTypeValue() { // check first if no flags and then if succeeded return (!_hasFlags) ? AuditLogType.VDS_CPU_RETRIEVE_FAILED : AuditLogType.VDS_CPU_LOWER_THAN_CLUSTER; } private static LogCompat log = LogFactoryCompat.getLog(HandleVdsCpuFlagsOrClusterChangedCommand.class); }