package org.ourgrid.worker.business.requester;
import java.util.ArrayList;
import java.util.List;
import org.ourgrid.common.interfaces.to.GridProcessErrorTypes;
import org.ourgrid.common.interfaces.to.WorkAccounting;
import org.ourgrid.common.internal.IResponseTO;
import org.ourgrid.common.internal.RequesterIF;
import org.ourgrid.common.internal.response.LoggerResponseTO;
import org.ourgrid.common.util.StringUtil;
import org.ourgrid.worker.business.controller.EnvironmentController;
import org.ourgrid.worker.business.controller.GridProcessError;
import org.ourgrid.worker.business.controller.WorkerController;
import org.ourgrid.worker.business.dao.WorkerDAOFactory;
import org.ourgrid.worker.business.dao.WorkerStatusDAO;
import org.ourgrid.worker.business.exception.UnableToCreatePlaypenException;
import org.ourgrid.worker.business.exception.UnableToCreateStorageException;
import org.ourgrid.worker.business.exception.VOMSAuthorizationException;
import org.ourgrid.worker.business.messages.WorkerControllerMessages;
import org.ourgrid.worker.request.StartWorkRequestTO;
import org.ourgrid.worker.response.ErrorOcurredMessageHandleResponseTO;
import org.ourgrid.worker.response.WorkerIsReadyMessageHandleResponseTO;
import sun.security.provider.certpath.X509CertPath;
import br.edu.ufcg.lsd.commune.network.certification.CertificationUtils;
public class StartWorkRequester implements RequesterIF<StartWorkRequestTO> {
public List<IResponseTO> execute(StartWorkRequestTO request) {
String brokerAddress = StringUtil.deploymentIDToAddress(request.getClientDeploymentID());
String brokerPubKey = request.getBrokerPublicKey();
String senderPubKey = request.getSenderPublicKey();
X509CertPath senderCerthPath = request.getSenderCerthPath();
List<IResponseTO> responses = new ArrayList<IResponseTO>();
WorkerStatusDAO workerStatusDAO = WorkerDAOFactory.getInstance().getWorkerStatusDAO();
if (!senderPubKey.equals(workerStatusDAO.getConsumerPublicKey()) ||
!senderPubKey.equals(brokerPubKey)) {
responses.add(new LoggerResponseTO(WorkerControllerMessages.getUnknownClientSendsStartWorkMessage(brokerAddress, brokerPubKey), LoggerResponseTO.WARN));
return responses;
}
//Worker is broker-authorized
if (workerStatusDAO.isAuthorisedForBroker()) {
if (!CertificationUtils.isCertificateValid(senderCerthPath)) {
responses.add(new LoggerResponseTO(WorkerControllerMessages.getInvalidCertPathMessage(brokerAddress), LoggerResponseTO.WARN));
responses.add(new ErrorOcurredMessageHandleResponseTO(new GridProcessError(
new VOMSAuthorizationException(CertificationUtils.getCertSubjectDN(senderCerthPath)),
GridProcessErrorTypes.BROKER_ERROR), brokerAddress));
return responses;
}
if(!workerStatusDAO.getUsersDN().isEmpty() && !workerStatusDAO.containsUsersDN(CertificationUtils.getCertSubjectDN(senderCerthPath))) {
responses.add(new LoggerResponseTO(WorkerControllerMessages.getBrokerIsNotOnVomsListMessage(brokerAddress), LoggerResponseTO.WARN));
responses.add(new ErrorOcurredMessageHandleResponseTO(new GridProcessError(
new VOMSAuthorizationException(CertificationUtils.getCertSubjectDN(senderCerthPath)),
GridProcessErrorTypes.BROKER_ERROR), brokerAddress));
return responses;
}
if(!CertificationUtils.isCertPathIssuedByCA(senderCerthPath,
workerStatusDAO.getCaCertificates())) {
responses.add(new LoggerResponseTO(WorkerControllerMessages.getNonIssuedCertPathMessage(brokerAddress), LoggerResponseTO.WARN));
responses.add(new ErrorOcurredMessageHandleResponseTO(new GridProcessError(
new VOMSAuthorizationException(CertificationUtils.getCertSubjectDN(senderCerthPath)),
GridProcessErrorTypes.BROKER_ERROR), brokerAddress));
return responses;
}
}
if (workerStatusDAO.isAllocated()) {
WorkerController.getInstance().cleanWorker(responses);
}
try {
EnvironmentController.getInstance().mountPlaypen(request.getPlaypenRoot());
} catch (UnableToCreatePlaypenException e) {
responses.add(new LoggerResponseTO(WorkerControllerMessages.getPlaypenCreationErrorMessage(brokerAddress, e.getPlaypenPath()), LoggerResponseTO.ERROR));
responses.add(new ErrorOcurredMessageHandleResponseTO(new GridProcessError(e, GridProcessErrorTypes.IO_ERROR), brokerAddress));
WorkerDAOFactory.getInstance().getEnvironmentDAO().resetEnvVariables();
return responses;
}
try {
EnvironmentController.getInstance().mountStorage(
workerStatusDAO.getConsumerPublicKey(), request.getStorageRoot());
} catch (UnableToCreateStorageException e) {
responses.add(new LoggerResponseTO(WorkerControllerMessages.getStorageCreationErrorMessage(brokerAddress, e.getStoragePath()), LoggerResponseTO.ERROR));
responses.add(new ErrorOcurredMessageHandleResponseTO(new GridProcessError(e, GridProcessErrorTypes.IO_ERROR), brokerAddress));
WorkerDAOFactory.getInstance().getEnvironmentDAO().resetEnvVariables();
return responses;
}
if (workerStatusDAO.isAllocatedForRemotePeer()) {
WorkerDAOFactory.getInstance().getWorkAccountingDAO().setCurrentWorkAccounting(
new WorkAccounting(workerStatusDAO.getRemotePeerDN()));
}
workerStatusDAO.setConsumerAddress(brokerAddress);
workerStatusDAO.setConsumerDeploymentID(request.getClientDeploymentID());
workerStatusDAO.setWorkingState(true);
responses.add(new LoggerResponseTO(WorkerControllerMessages.getSuccessfulStartWorkMessage(brokerAddress), LoggerResponseTO.INFO));
responses.add(new WorkerIsReadyMessageHandleResponseTO(workerStatusDAO.getConsumerAddress()));
return responses;
}
}