package org.ovirt.engine.core.bll.attestationbroker;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.ovirt.engine.core.bll.Backend;
import org.ovirt.engine.core.bll.job.ExecutionHandler;
import org.ovirt.engine.core.common.action.SetNonOperationalVdsParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.AttestationResultEnum;
import org.ovirt.engine.core.common.businessentities.NonOperationalReason;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.vdsbroker.attestation.AttestationService;
import org.ovirt.engine.core.vdsbroker.attestation.AttestationValue;
public class AttestThread extends Thread {
private List<String> trustedHostsNames;
private final int FIRST_STAGE_QUERY_SIZE = Config.<Integer> getValue(ConfigValues.AttestationFirstStageSize);
private final int SECOND_STAGE_QUERY_SIZE = Config.<Integer> getValue(ConfigValues.AttestationSecondStageSize);
private static final Set<Guid> trustedVdses = Collections.newSetFromMap(new ConcurrentHashMap<>());
public AttestThread(List<String> trustedHostsNames) {
this.trustedHostsNames = trustedHostsNames;
}
@Override
public void run() {
List<AttestationValue> values;
if (trustedHostsNames.size() > FIRST_STAGE_QUERY_SIZE) {
values = AttestationService.getInstance().attestHosts(trustedHostsNames.subList(0, FIRST_STAGE_QUERY_SIZE));
handleValues(values);
for (int from = FIRST_STAGE_QUERY_SIZE; from < trustedHostsNames.size(); from+= SECOND_STAGE_QUERY_SIZE) {
int to = (from + SECOND_STAGE_QUERY_SIZE < trustedHostsNames.size()) ?
from + SECOND_STAGE_QUERY_SIZE : trustedHostsNames.size();
values = AttestationService.getInstance(). attestHosts(trustedHostsNames.subList(from, to));
handleValues(values);
}
} else {
values = AttestationService.getInstance().attestHosts(trustedHostsNames);
handleValues(values);
}
}
private void handleValues(List<AttestationValue> values) {
for (AttestationValue value : values) {
List<VDS> vdses = DbFacade.getInstance().getVdsDao().getAllForHostname(value.getHostName());
if (vdses != null && vdses.size() > 0) {
VDS vds = vdses.get(0);
if (value.getTrustLevel().equals(AttestationResultEnum.TRUSTED)) {
moveVdsToUp(vds);
} else {
setNonOperational(NonOperationalReason.UNTRUSTED, vds, null);
}
}
}
}
private void setNonOperational(NonOperationalReason reason, VDS vds, Map<String, String> customLogValues) {
SetNonOperationalVdsParameters tempVar =
new SetNonOperationalVdsParameters(vds.getId(), reason, customLogValues);
Backend.getInstance().runInternalAction(VdcActionType.SetNonOperationalVds, tempVar,
ExecutionHandler.createInternalJobContext());
}
private void moveVdsToUp(VDS vds) {
trustedVdses.add(vds.getId());
vds.setStatus(VDSStatus.Up);
DbFacade.getInstance().getVdsDynamicDao().update(vds.getDynamicData());
}
public static boolean isTrustedVds(Guid vdsId) {
return trustedVdses.remove(vdsId);
}
}