/*
* Copyright (C) 2008 Universidade Federal de Campina Grande
*
* This file is part of OurGrid.
*
* OurGrid is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.ourgrid.worker.communication.receiver;
import org.ourgrid.common.interfaces.control.WorkerControlClient;
import org.ourgrid.common.interfaces.management.WorkerManager;
import org.ourgrid.common.internal.OurGridControlReceiver;
import org.ourgrid.common.internal.OurGridRequestControl;
import org.ourgrid.common.internal.RequestControlIF;
import org.ourgrid.peer.PeerConstants;
import org.ourgrid.reqtrace.Req;
import org.ourgrid.worker.WorkerConfiguration;
import org.ourgrid.worker.WorkerConstants;
import org.ourgrid.worker.business.messages.ControlMessages;
import org.ourgrid.worker.business.requester.WorkerRequestControl;
import org.ourgrid.worker.request.GetMasterPeerRequestTO;
import org.ourgrid.worker.request.GetStatusRequestTO;
import org.ourgrid.worker.request.GetWorkerCompleteStatusRequestTO;
import org.ourgrid.worker.request.PauseWorkerRequestTO;
import org.ourgrid.worker.request.ResumeWorkerRequestTO;
import org.ourgrid.worker.request.StartWorkerRequestTO;
import org.ourgrid.worker.request.StopWorkerRequestTO;
import br.edu.ufcg.lsd.commune.Module;
import br.edu.ufcg.lsd.commune.api.FailureNotification;
import br.edu.ufcg.lsd.commune.api.MonitoredBy;
import br.edu.ufcg.lsd.commune.api.RecoveryNotification;
import br.edu.ufcg.lsd.commune.container.control.ControlOperationResult;
import br.edu.ufcg.lsd.commune.container.control.ModuleControlClient;
import br.edu.ufcg.lsd.commune.container.control.ModuleNotStartedException;
import br.edu.ufcg.lsd.commune.container.control.ModuleStoppedException;
import br.edu.ufcg.lsd.commune.container.servicemanager.dao.ContainerDAO;
import br.edu.ufcg.lsd.commune.context.ModuleContext;
import br.edu.ufcg.lsd.commune.identification.ContainerID;
import br.edu.ufcg.lsd.commune.identification.DeploymentID;
import br.edu.ufcg.lsd.commune.identification.ServiceID;
/**
* Perform the Worker component control actions.
*/
@Req("REQ010")
public class WorkerComponentReceiver extends OurGridControlReceiver implements WorkerManager {
public String getComponentName() {
return "Worker";
}
protected void startComponent() throws Exception {
StartWorkerRequestTO to = new StartWorkerRequestTO();
to.setPropertiesCollectorOn(isPropertiesCollectorOn());
to.setIdlenessSchedule(useIdlenessSchedule());
to.setIdlenessScheduleTime(
getServiceManager().getContainerContext().getProperty(
WorkerConfiguration.PROP_IDLENESS_SCHEDULE_TIME));
to.setExecutionClientDeployed(isExecutionClientDeployed());
boolean idlenessDetectorOn = isIdlenessDetectorOn();
to.setIdlenessDetectorOn(idlenessDetectorOn);
if (idlenessDetectorOn) {
to.setIdlenessTime(
getServiceManager().getContainerContext().parseLongProperty(WorkerConfiguration.PROP_IDLENESS_TIME)*1000);
}
String masterPeerUserAtServer = getServiceManager().getContainerContext().getProperty(
WorkerConfiguration.PROP_PEER_ADDRESS);
int userAtServerSeparator = masterPeerUserAtServer.indexOf("@");
String user = masterPeerUserAtServer.substring(0, userAtServerSeparator);
String server = masterPeerUserAtServer.substring(userAtServerSeparator + 1);
ContainerID masterPeerContainerID = new ContainerID(user, server, PeerConstants.MODULE_NAME);
ServiceID masterPeerServiceID = new ServiceID(masterPeerContainerID,
PeerConstants.WORKER_MANAGEMENT_CLIENT_OBJECT_NAME);
to.setMasterPeerAddress(masterPeerServiceID.toString());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
public void stop(boolean callExit, boolean force,
@MonitoredBy(Module.CONTROL_OBJECT_NAME) ModuleControlClient client) {
String senderPublicKey = getServiceManager().getSenderPublicKey();
StopWorkerRequestTO stopWorkerRequestTO = new StopWorkerRequestTO();
stopWorkerRequestTO.setComponentBeUsed(getComponentBeUsedError((client)) == null);
stopWorkerRequestTO.setStopSenderPublicKeyValid(validateStopSenderPublicKey(client, senderPublicKey));
stopWorkerRequestTO.setStopSenderPublicKey(senderPublicKey);
OurGridRequestControl.getInstance().execute(stopWorkerRequestTO, getServiceManager());
super.stop(callExit, force, client);
}
@Req("REQ087")
public void pause(@MonitoredBy(Module.CONTROL_OBJECT_NAME) WorkerControlClient client) {
PauseWorkerRequestTO to = new PauseWorkerRequestTO();
Exception componentBeUsedError = getComponentBeUsedError((client));
to.setComponentBeUsed(componentBeUsedError==null);
to.setErrorCause(componentBeUsedError);
String senderPublicKey = getServiceManager().getSenderPublicKey();
to.setSenderPublicKey(senderPublicKey);
String clientAddress = null;
DeploymentID clientDeploymentID = getServiceManager().getStubDeploymentID(client);
if (clientDeploymentID != null) {
clientAddress = clientDeploymentID.getServiceID().toString();
} else {
clientAddress = getServiceManager().getLocalDeploymentID(client).getServiceID().toString();
to.setRemoteClient(false);
}
to.setClientAddress(clientAddress);
to.setThisMyPublicKey(getServiceManager().isThisMyPublicKey(senderPublicKey));
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
@Req("REQ088")
public void resume(@MonitoredBy(Module.CONTROL_OBJECT_NAME) WorkerControlClient client) {
ResumeWorkerRequestTO to = new ResumeWorkerRequestTO();
Exception componentBeUsedError = getComponentBeUsedError((client));
to.setComponentBeUsed(componentBeUsedError==null);
to.setErrorCause(componentBeUsedError);
String senderPublicKey = getServiceManager().getSenderPublicKey();
to.setSenderPublicKey(senderPublicKey);
String clientAddress = null;
DeploymentID clientDeploymentID = getServiceManager().getStubDeploymentID(client);
if (clientDeploymentID != null) {
clientAddress = clientDeploymentID.getServiceID().toString();
} else {
clientAddress = getServiceManager().getLocalDeploymentID(client).getServiceID().toString();
to.setRemoteClient(false);
}
to.setClientAddress(clientAddress);
to.setThisMyPublicKey(getServiceManager().isThisMyPublicKey(senderPublicKey));
to.setExecutionClientDeployed(isExecutionClientDeployed());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
@Override
protected boolean validateStartSenderPublicKey(ModuleControlClient client, String senderPublicKey) {
if(!getServiceManager().isThisMyPublicKey(senderPublicKey)) {
getServiceManager().getLog().warn(ControlMessages.getUnknownEntityTryingToStartWorkerMessage(senderPublicKey));
return false;
}
return true;
}
@Override
protected boolean validateStopSenderPublicKey(ModuleControlClient client, String senderPublicKey) {
if(!getServiceManager().isThisMyPublicKey(senderPublicKey)) {
return false;
}
return true;
}
/**
* Retrieves to the callback client complete info on this worker
* @param client The client that requested info
*/
@Req("REQ095")
public void getCompleteStatus(@MonitoredBy(Module.CONTROL_OBJECT_NAME) WorkerControlClient client) {
GetWorkerCompleteStatusRequestTO to = new GetWorkerCompleteStatusRequestTO();
to.setCanStatusBeUsed(canStatusBeUsed());
to.setUptime(getServiceManager().getContainerDAO().getUpTime());
to.setClientAddress(getServiceManager().getStubDeploymentID(client).getServiceID().toString());
ModuleContext context = getServiceManager().getContainerContext();
to.setConfiguration(WorkerConfiguration.toString(context));
to.setContextPlaypenDir(context.getProperty(WorkerConfiguration.PROP_PLAYPEN_ROOT));
to.setContextStorageDir(context.getProperty(WorkerConfiguration.PROP_STORAGE_DIR));
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
@Req("REQ094")
public void getStatus(@MonitoredBy(Module.CONTROL_OBJECT_NAME) WorkerControlClient client) {
GetStatusRequestTO to = new GetStatusRequestTO();
to.setCanStatusBeUsed(canStatusBeUsed());
to.setClientAddress(getServiceManager().getStubDeploymentID(client).getServiceID().toString());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
@Req("REQ093")
public void getMasterPeer(@MonitoredBy(Module.CONTROL_OBJECT_NAME) WorkerControlClient client) {
GetMasterPeerRequestTO to = new GetMasterPeerRequestTO();
to.setCanStatusBeUsed(canStatusBeUsed());
to.setClientAddress(getServiceManager().getStubDeploymentID(client).getServiceID().toString());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
private boolean isIdlenessDetectorOn() {
String propIdlenessDetector =
(String) getServiceManager().getContainerContext().getProperty(WorkerConfiguration.PROP_IDLENESS_DETECTOR);
return (propIdlenessDetector == null) ?
false :
!propIdlenessDetector.equals(WorkerConfiguration.DEF_PROP_IDLENESS_DETECTOR);
}
private boolean useIdlenessSchedule() {
String propUseIdlenessSchedule =
(String) getServiceManager().getContainerContext().getProperty(WorkerConfiguration.PROP_USE_IDLENESS_SCHEDULE);
return (propUseIdlenessSchedule == null) ?
false :
!propUseIdlenessSchedule.equals(WorkerConfiguration.DEF_PROP_USE_IDLENESS_SCHEDULE);
}
private boolean isPropertiesCollectorOn() {
String propCollector =
(String) getServiceManager().getContainerContext().getProperty(WorkerConfiguration.PROP_WORKER_SPEC_REPORT);
return (propCollector == null) ? false:
!propCollector.equals(WorkerConfiguration.DEF_WORKER_SPEC_REPORT);
}
@RecoveryNotification
public void controlClientIsUp(WorkerControlClient client) {}
@FailureNotification
public void controlClientIsDown(WorkerControlClient client) {}
public Exception getComponentBeUsedError(ModuleControlClient client) {
ContainerDAO dao = getServiceManager().getContainerDAO();
ControlOperationResult result = null;
if(dao.isStopped()){
result = new ControlOperationResult(new ModuleStoppedException(getComponentName() + " is stopped"));
}
else if (!dao.isStarted()) {
result = new ControlOperationResult(new ModuleNotStartedException(getComponentName()));
}
return (result != null) ? result.getErrorCause() : null;
}
private boolean isExecutionClientDeployed() {
return getServiceManager().getObjectDeployment(WorkerConstants.WORKER_EXECUTION_CLIENT) != null;
}
@Override
protected RequestControlIF createRequestControl() {
return new WorkerRequestControl();
}
}