/*
* 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.peer.communication.receiver;
import java.util.ArrayList;
import java.util.List;
import org.ourgrid.common.interfaces.control.PeerControlClient;
import org.ourgrid.common.interfaces.management.PeerManager;
import org.ourgrid.common.interfaces.status.PeerStatusProviderClient;
import org.ourgrid.common.internal.OurGridControlReceiver;
import org.ourgrid.common.internal.OurGridRequestControl;
import org.ourgrid.common.internal.RequestControlIF;
import org.ourgrid.common.internal.request.QueryRequestTO;
import org.ourgrid.common.specification.worker.WorkerSpecification;
import org.ourgrid.peer.PeerConfiguration;
import org.ourgrid.peer.business.controller.messages.PeerControlMessages;
import org.ourgrid.peer.business.requester.PeerRequestControl;
import org.ourgrid.peer.request.AddAnnotationsWorkersRequestTO;
import org.ourgrid.peer.request.AddUserRequestTO;
import org.ourgrid.peer.request.AddWorkerRequestTO;
import org.ourgrid.peer.request.GetCompleteHistoryStatusRequestTO;
import org.ourgrid.peer.request.GetCompleteStatusRequestTO;
import org.ourgrid.peer.request.GetLocalConsumersStatusRequestTO;
import org.ourgrid.peer.request.GetLocalWorkersStatusRequestTO;
import org.ourgrid.peer.request.GetNetworkOfFavorsStatusRequestTO;
import org.ourgrid.peer.request.GetRemoteConsumersStatusRequestTO;
import org.ourgrid.peer.request.GetRemoteWorkersStatusRequestTO;
import org.ourgrid.peer.request.GetTrustStatusRequestTO;
import org.ourgrid.peer.request.GetUserStatusRequestTO;
import org.ourgrid.peer.request.RemoveUserRequestTO;
import org.ourgrid.peer.request.RemoveWorkerRequestTO;
import org.ourgrid.peer.request.SetWorkersRequestTO;
import org.ourgrid.peer.request.StartPeerRequestTO;
import org.ourgrid.peer.request.StopPeerRequestTO;
import org.ourgrid.peer.request.UpdatePeerUpTimeRequestTO;
import org.ourgrid.reqtrace.Req;
import br.edu.ufcg.lsd.commune.Module;
import br.edu.ufcg.lsd.commune.ModuleProperties;
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.ModuleControlClient;
import br.edu.ufcg.lsd.commune.container.servicemanager.dao.ContainerDAO;
import br.edu.ufcg.lsd.commune.context.ContainerContextUtils;
import br.edu.ufcg.lsd.commune.context.ModuleContext;
import br.edu.ufcg.lsd.commune.identification.ServiceID;
import br.edu.ufcg.lsd.commune.network.certification.CertificationUtils;
/**
* Perform the Peer component control actions.
*/
@Req("REQ010")
public class PeerComponentReceiver extends OurGridControlReceiver implements PeerManager {
@Override
public String getComponentName() {
return "Peer";
}
@Override
protected void startComponent() throws Exception {
StartPeerRequestTO to = new StartPeerRequestTO();
to.setShouldJoinCommunity(shouldJoinCommunity());
ModuleContext containerContext = getServiceManager().getContainerContext();
to.setNetworkStr(containerContext.getProperty(PeerConfiguration.PROP_DS_NETWORK));
List<ServiceID> dsServiceIDs = PeerConfiguration.parseNetwork(getServiceManager());
List<String> dsAddress = new ArrayList<String>();
for (ServiceID id : dsServiceIDs) {
dsAddress.add(id.toString());
}
to.setProperties(getServiceManager().getContainerContext().getProperties());
to.setDsAddress(dsAddress);
to.setMyUserAtServer(getServiceManager().getMyDeploymentID().getContainerID().getUserAtServer());
to.setFilePath(containerContext.getProperty(PeerConfiguration.PROP_RANKINGFILE));
to.setDescription(containerContext.getProperty(PeerConfiguration.PROP_DESCRIPTION));
to.setEmail(containerContext.getProperty(PeerConfiguration.PROP_EMAIL));
to.setLabel(containerContext.getProperty(PeerConfiguration.PROP_LABEL));
to.setLatitude(containerContext.getProperty(PeerConfiguration.PROP_LATITUDE));
to.setLongitude(containerContext.getProperty(PeerConfiguration.PROP_LONGITUDE));
to.setMyCertSubjectDN(CertificationUtils.getCertSubjectDN(getServiceManager().getMyCertPath()));
to.setReceivingCACertificatePath(ContainerContextUtils.normalizeFilePath(getServiceManager().getContainerContext(),
getServiceManager().getContainerContext().getProperty(PeerConfiguration.PROP_RECEIVING_CACERTIFICATE_PATH)));
to.setRequestingCACertificatePath(ContainerContextUtils.normalizeFilePath(getServiceManager().getContainerContext(),
getServiceManager().getContainerContext().getProperty(PeerConfiguration.PROP_REQUESTING_CACERTIFICATE_PATH)));
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
/**
* @param propJoinCommunity
* @return
*/
private boolean shouldJoinCommunity() {
return getServiceManager().getContainerContext().isEnabled(PeerConfiguration.PROP_JOIN_COMMUNITY);
}
@Override
public void stop(boolean callExit, boolean force,
@MonitoredBy(Module.CONTROL_OBJECT_NAME) ModuleControlClient client) {
StopPeerRequestTO to = new StopPeerRequestTO();
ContainerDAO dao = getServiceManager().getContainerDAO();
to.setDAOStarted(dao.isStarted());
to.setShouldJoinCommunity(shouldJoinCommunity());
to.setCanStatusBeUsed(canStatusBeUsed());
to.setMyUserAtServer(getServiceManager().getMyDeploymentID().getContainerID().getUserAtServer());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
super.stop(callExit, force, client);
}
@Override
protected boolean validateStartSenderPublicKey(ModuleControlClient client, String senderPublicKey) {
if(!getServiceManager().isThisMyPublicKey(senderPublicKey)) {
getServiceManager().getLog().warn(PeerControlMessages.getUnknownSenderStartingPeerMessage(senderPublicKey));
return false;
}
return true;
}
@Override
protected boolean validateStopSenderPublicKey(ModuleControlClient client, String senderPublicKey) {
if(!getServiceManager().isThisMyPublicKey(senderPublicKey)) {
getServiceManager().getLog().warn(PeerControlMessages.getUnknownSenderStoppingPeerMessage(senderPublicKey));
return false;
}
return true;
}
/**
* Set the local Workers specification for this Peer.
*
* <ul>
* <li> Check if the Peer can have his local worker set;
* <li> Shutdown Peer modules;
* <li> Discard old workers;
* <li> Register new workers;
* <li> Send operation result messsage to client.
* </ul>
*
* @param controlClient Client that will receive the operation result message
* @param newWorkers Collection of local workers specification
*/
@Req({"REQ010", "REQ043"})
public void setWorkers(
@MonitoredBy(Module.CONTROL_OBJECT_NAME) PeerControlClient controlClient,
List<WorkerSpecification> newWorkers) {
SetWorkersRequestTO to = new SetWorkersRequestTO();
to.setCanComponentBeUsed(canComponentBeUsed(controlClient));
to.setClientAddress(getServiceManager().getSenderServiceID().toString());
to.setMyUserAtServer(getServiceManager().getMyDeploymentID().getContainerID().getUserAtServer());
to.setNewWorkers(newWorkers);
String senderPublicKey = getServiceManager().getSenderPublicKey();
to.setSenderPubKey(senderPublicKey);
to.setThisMyPublicKey(getServiceManager().isThisMyPublicKey(senderPublicKey));
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
/**
* Add a new user for this peer.
*
* @param controlClient Client that will receive the operation result message
* @param login User login (user@server)
*/
public void addUser(@MonitoredBy(Module.CONTROL_OBJECT_NAME) PeerControlClient peerControlClient, String login) {
AddUserRequestTO to = new AddUserRequestTO();
ModuleContext containerContext = getServiceManager().getContainerContext();
to.setLogin(login);
to.setMyUserAtServer(getServiceManager().getMyDeploymentID().getContainerID().getUserAtServer());
to.setEmail(containerContext.getProperty(PeerConfiguration.PROP_EMAIL));
to.setLabel(containerContext.getProperty(PeerConfiguration.PROP_LABEL));
to.setLatitude(containerContext.getProperty(PeerConfiguration.PROP_LATITUDE));
to.setLongitude(containerContext.getProperty(PeerConfiguration.PROP_LONGITUDE));
to.setDescription(containerContext.getProperty(PeerConfiguration.PROP_DESCRIPTION));
to.setMyCertSubjectDN(CertificationUtils.getCertSubjectDN(getServiceManager().getMyCertPath()));
to.setClientAddress(getServiceManager().getStubDeploymentID(peerControlClient).getServiceID().toString());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
/**
* Remove a user for this peer.
*
* @param controlClient Client that will receive the operation result message
* @param login User login
*/
public void removeUser(@MonitoredBy(Module.CONTROL_OBJECT_NAME) PeerControlClient peerControlClient, String login) {
RemoveUserRequestTO to = new RemoveUserRequestTO();
to.setLogin(login);
to.setClientAddress(getServiceManager().getStubDeploymentID(
peerControlClient).getServiceID().toString());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
/* Status */
/**
* Retrieves to the callback client info on the this Peer's Local Workers
* @param client The client that requested info
* @param peerStatusProviderServiceID The entityID of this Peer's status provider
*/
@Req("REQ036")
public void getLocalWorkersStatus(@MonitoredBy(Module.CONTROL_OBJECT_NAME) PeerStatusProviderClient client) {
GetLocalWorkersStatusRequestTO to = new GetLocalWorkersStatusRequestTO();
String clientAddress = getServiceManager().getStubDeploymentID(
client).getServiceID().toString();
to.setClientAddress(clientAddress);
String statusProviderServiceID = getServiceManager().getMyDeploymentID().getServiceID().toString();
to.setStatusProviderServiceID(statusProviderServiceID);
String peerUserAtServer = getServiceManager().getMyDeploymentID().getServiceID().getContainerID().getUserAtServer();
to.setPeerUserAtServer(peerUserAtServer);
to.setCanStatusBeUsed(canStatusBeUsed());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
/**
* Retrieves to the callback client info on this Peer's Users
* @param client The client that requested info
* @param entityID The entityID of this Peer's status provider
*/
@Req("REQ106")
public void getUsersStatus(@MonitoredBy(Module.CONTROL_OBJECT_NAME) PeerStatusProviderClient client) {
GetUserStatusRequestTO to = new GetUserStatusRequestTO();
String clientAddress = getServiceManager().getStubDeploymentID(
client).getServiceID().toString();
to.setClientAddress(clientAddress);
String peerAddress = getServiceManager().getMyDeploymentID().getServiceID().toString();
to.setPeerAdress(peerAddress);
to.setCanStatusBeUsed(canStatusBeUsed());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
/**
* Retrieves to the callback client info on the this Peer's Remote Workers
* @param client The client that requested info
* @param pspServiceID The entityID of this Peer's status provider
*/
@Req("REQ037")
public void getRemoteWorkersStatus(@MonitoredBy(Module.CONTROL_OBJECT_NAME) PeerStatusProviderClient client) {
GetRemoteWorkersStatusRequestTO to = new GetRemoteWorkersStatusRequestTO();
to.setCanStatusBeUsed(canStatusBeUsed());
to.setClientAddress(getServiceManager().getStubDeploymentID(
client).getServiceID().toString());
to.setPeerAddress(getServiceManager().getMyDeploymentID().getServiceID().toString());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
/**
* Retrieves to the callback client complete info on this Peer
* @param client The client that requested info
* @param entityID The entityID of this Peer's status provider
*/
@Req("REQ038a")
public void getCompleteStatus(@MonitoredBy(Module.CONTROL_OBJECT_NAME) PeerStatusProviderClient client) {
GetCompleteStatusRequestTO to = new GetCompleteStatusRequestTO();
to.setCanStatusBeUsed(canStatusBeUsed());
to.setClientAddress(getServiceManager().getStubDeploymentID(client).getServiceID().toString());
to.setPeerAddress(getServiceManager().getMyDeploymentID().getServiceID().toString());
to.setUpTime(getServiceManager().getContainerDAO().getUpTime());
to.setMyCertSubjectDN(CertificationUtils.getCertSubjectDN(getServiceManager().getMyCertPath()));
ModuleContext containerContext = getServiceManager().getContainerContext();
to.setLabel(containerContext.getProperty( PeerConfiguration.PROP_LABEL));
to.setPropConfDir(containerContext.getProperty(ModuleProperties.PROP_CONFDIR));
to.setContextString(containerContext.toString());
to.setPropLabel(containerContext.getProperty( PeerConfiguration.PROP_LABEL));
to.setPropJoinCommunity(containerContext.getProperty( PeerConfiguration.PROP_JOIN_COMMUNITY));
to.setJoinCommunityEnabled(containerContext.isEnabled(PeerConfiguration.PROP_JOIN_COMMUNITY));
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
public void getCompleteHistoryStatus(@MonitoredBy(Module.CONTROL_OBJECT_NAME) PeerStatusProviderClient client, long time) {
GetCompleteHistoryStatusRequestTO to = new GetCompleteHistoryStatusRequestTO();
to.setCanStatusBeUsed(canStatusBeUsed());
to.setClientAddress(getServiceManager().getStubDeploymentID(client).getServiceID().toString());
to.setPeerAddress(getServiceManager().getMyDeploymentID().getServiceID().toString());
to.setTime(time);
to.setUpTime(getServiceManager().getContainerDAO().getUpTime());
ModuleContext containerContext = getServiceManager().getContainerContext();
to.setLabel(containerContext.getProperty( PeerConfiguration.PROP_LABEL));
to.setPropConfDir(containerContext.getProperty(ModuleProperties.PROP_CONFDIR));
to.setContextString(containerContext.toString());
to.setPropLabel(containerContext.getProperty( PeerConfiguration.PROP_LABEL));
to.setPropJoinCommunity(containerContext.getProperty( PeerConfiguration.PROP_JOIN_COMMUNITY));
to.setJoinCommunityEnabled(containerContext.isEnabled(PeerConfiguration.PROP_JOIN_COMMUNITY));
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
/**
* @param client
* @param entityID
*/
@Req("REQ035")
public void getNetworkOfFavorsStatus(@MonitoredBy(Module.CONTROL_OBJECT_NAME) PeerStatusProviderClient client) {
GetNetworkOfFavorsStatusRequestTO to = new GetNetworkOfFavorsStatusRequestTO();
to.setCanStatusBeUsed(canStatusBeUsed());
to.setClientAddress(getServiceManager().getStubDeploymentID(client).getServiceID().toString());
to.setPeerAdress(getServiceManager().getMyDeploymentID().getServiceID().toString());
to.setPeerDNData(CertificationUtils.getCertSubjectDN(getServiceManager().getMyCertPath()));
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
@Req("REQ110")
public void getTrustStatus(@MonitoredBy(Module.CONTROL_OBJECT_NAME) PeerStatusProviderClient client) {
if (canStatusBeUsed()) {
GetTrustStatusRequestTO to = new GetTrustStatusRequestTO();
String clientAddress = getServiceManager().getStubDeploymentID(
client).getServiceID().toString();
to.setClientAddress(clientAddress);
String statusProviderServiceID = getServiceManager().getMyDeploymentID().getServiceID().toString();
to.setStatusProviderServiceID(statusProviderServiceID);
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
}
/**
* Retrieves to the callback client the complete status of remote consumers.
* That is, information about workers, consumers, users, etc.
* @param client The client that requested info
* @param entityID The entityID of this Peer's status provider
*/
@Req("REQ034")
public void getRemoteConsumersStatus(@MonitoredBy(Module.CONTROL_OBJECT_NAME) PeerStatusProviderClient client) {
GetRemoteConsumersStatusRequestTO to = new GetRemoteConsumersStatusRequestTO();
to.setCanStatusBeUsed(canStatusBeUsed());
to.setClientAddress(getServiceManager().getStubDeploymentID(
client).getServiceID().toString());
to.setPeerAddress(getServiceManager().getMyDeploymentID().getServiceID().toString());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
public void getLocalConsumersStatus(@MonitoredBy(Module.CONTROL_OBJECT_NAME) PeerStatusProviderClient client) {
GetLocalConsumersStatusRequestTO to = new GetLocalConsumersStatusRequestTO();
to.setCanStatusBeUsed(canStatusBeUsed());
to.setClientAddress(getServiceManager().getStubDeploymentID(
client).getServiceID().toString());
to.setPeerAddress(getServiceManager().getMyDeploymentID().getServiceID().toString());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
public void registerAsListener(@MonitoredBy(Module.CONTROL_OBJECT_NAME) PeerStatusProviderClient client) {
// TODO Auto-generated method stub
}
@RecoveryNotification
public void controlClientIsUp(PeerControlClient client) {
}
@FailureNotification
public void controlClientIsDown(PeerControlClient client) {
}
@RecoveryNotification
public void statusProviderClientIsUp(PeerStatusProviderClient statusProviderClient) {
}
@FailureNotification
public void statusProviderClientIsDown(PeerStatusProviderClient statusProviderClient) {
}
public void addWorker(@MonitoredBy(Module.CONTROL_OBJECT_NAME)PeerControlClient peerControlClient,
WorkerSpecification workerSpec) {
AddWorkerRequestTO to = new AddWorkerRequestTO();
String senderPubKey = getServiceManager().getSenderPublicKey();
to.setSenderPubKey(senderPubKey);
to.setCanComponentBeUsed(canComponentBeUsed(peerControlClient));
to.setIsThisMyPublicKey(getServiceManager().isThisMyPublicKey(senderPubKey));
to.setWorkerSpec(workerSpec);
to.setClientAddress(getServiceManager().getSenderServiceID().toString());
to.setMyUserAtServer(getServiceManager().getMyDeploymentID().getContainerID().getUserAtServer());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
public void removeWorker(@MonitoredBy(Module.CONTROL_OBJECT_NAME)PeerControlClient peerControlClient,
WorkerSpecification workerSpec) {
RemoveWorkerRequestTO to = new RemoveWorkerRequestTO();
to.setCanComponentBeUsed(canComponentBeUsed(peerControlClient));
to.setClientAddress(getServiceManager().getSenderServiceID().toString());
String senderPublicKey = getServiceManager().getSenderPublicKey();
to.setSenderPubKey(senderPublicKey);
to.setThisMyPublicKey(getServiceManager().isThisMyPublicKey(senderPublicKey));
to.setWorkerUserAtServer(workerSpec.getServiceID().getContainerID().getUserAtServer());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
/**
* Set the local Workers specification for this Peer.
* <ul>
* <li>Check if the Peer can have his local worker set;
* <li>Shutdown Peer modules;
* <li>Discard old workers;
* <li>Register new workers;
* <li>Send operation result message to client.
* </ul>
*
* @param controlClient Client that will receive the operation result
* message
* @param newWorkers Collection of local workers specification
*/
// TODO @Req({"REQXX", "REQYY"})
public void addAnnotationsWorkers( @MonitoredBy( Module.CONTROL_OBJECT_NAME ) PeerControlClient controlClient,
List< WorkerSpecification > newWorkersAnnotations ) {
AddAnnotationsWorkersRequestTO to = new AddAnnotationsWorkersRequestTO();
String senderPubKey = getServiceManager().getSenderPublicKey();
to.setSenderPubKey(senderPubKey);
to.setCanComponentBeUsed(canComponentBeUsed(controlClient));
to.setNewWorkersAnnotations(newWorkersAnnotations);
to.setClientAddress(getServiceManager().getSenderServiceID().toString());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
@Override
protected RequestControlIF createRequestControl() {
return new PeerRequestControl();
}
public void updatePeerUpTime() {
UpdatePeerUpTimeRequestTO to = new UpdatePeerUpTimeRequestTO();
to.setMyUserAtServer(getServiceManager().getMyDeploymentID().getContainerID().getUserAtServer());
String senderPublicKey = getServiceManager().getSenderPublicKey();
to.setSenderPublicKey(senderPublicKey);
to.setThisMyPublicKey(getServiceManager().isThisMyPublicKey(senderPublicKey));
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
public void query(@MonitoredBy(Module.CONTROL_OBJECT_NAME) PeerControlClient peerControlClient, String query) {
QueryRequestTO to = new QueryRequestTO();
to.setQuery(query);
to.setClientAddress(getServiceManager().getStubDeploymentID(
peerControlClient).getServiceID().toString());
OurGridRequestControl.getInstance().execute(to, getServiceManager());
}
}