/* * 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.acceptance.util.peer; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import org.easymock.classextension.EasyMock; import org.ourgrid.acceptance.util.PeerAcceptanceUtil; import org.ourgrid.common.interfaces.DiscoveryService; import org.ourgrid.common.interfaces.LocalWorkerProviderClient; import org.ourgrid.common.interfaces.RemoteWorkerProviderClient; import org.ourgrid.common.interfaces.Worker; import org.ourgrid.common.interfaces.management.RemoteWorkerManagement; import org.ourgrid.common.interfaces.management.RemoteWorkerManagementClient; import org.ourgrid.common.interfaces.management.WorkerManagement; import org.ourgrid.common.interfaces.management.WorkerManagementClient; import org.ourgrid.common.interfaces.to.RequestSpecification; import org.ourgrid.common.interfaces.to.WorkerStatus; import org.ourgrid.common.specification.worker.WorkerSpecification; import org.ourgrid.peer.PeerComponent; import org.ourgrid.worker.WorkerConstants; import br.edu.ufcg.lsd.commune.container.ObjectDeployment; import br.edu.ufcg.lsd.commune.container.logging.CommuneLogger; import br.edu.ufcg.lsd.commune.context.ModuleContext; import br.edu.ufcg.lsd.commune.identification.DeploymentID; import br.edu.ufcg.lsd.commune.identification.ServiceID; import br.edu.ufcg.lsd.commune.testinfra.AcceptanceTestUtil; import br.edu.ufcg.lsd.commune.testinfra.util.TestStub; public class Req_025_Util extends PeerAcceptanceUtil { public Req_025_Util(ModuleContext context) { super(context); } /** * Changes a local worker's status to allocated for broker * @param peerComponent The peer component * @param lwpcID The objectID of the consumer's LocalWorkerProviderClient interface * @param wmOID The objectID of the worker's WorkerManagement interface * @param workerSpecA The WorkerSpec containing the worker's attributes * @param requestSpec The RequestSpec containing request info * @return The Worker mock created */ public TestStub changeWorkerStatusToAllocatedForBroker(PeerComponent peerComponent, DeploymentID lwpcID, DeploymentID wmOID, WorkerSpecification workerSpecA, RequestSpecification requestSpec) { LocalWorkerProviderClient lwpc = (LocalWorkerProviderClient) AcceptanceTestUtil.getBoundObject(lwpcID); CommuneLogger oldLogger = peerComponent.getLogger(); CommuneLogger newLogger = EasyMock.createMock(CommuneLogger.class); peerComponent.setLogger(newLogger); Worker worker = EasyMock.createMock(Worker.class); DeploymentID workerDID = new DeploymentID("a@b/d", "e"); workerDID.setPublicKey(wmOID.getPublicKey()); newLogger.info("Worker <" + wmOID.getContainerID() + "> is now IN_USE"); newLogger.info("Giving Worker <" + wmOID.getContainerID() + "> to <" + lwpcID.getContainerID() + ">"); EasyMock.reset(lwpc); AcceptanceTestUtil.publishTestObject(application, workerDID, worker, Worker.class); lwpc.hereIsWorker(workerDID.getServiceID(), workerSpecA, requestSpec); EasyMock.replay(lwpc); EasyMock.replay(newLogger); EasyMock.replay(worker); changeWorkerStatusToAllocatedForBroker(peerComponent, workerDID.getServiceID(), lwpcID.getPublicKey(), wmOID, (WorkerManagement) AcceptanceTestUtil.getBoundObject(wmOID)); EasyMock.verify(lwpc); EasyMock.verify(newLogger); EasyMock.verify(worker); peerComponent.setLogger(oldLogger); return new TestStub(workerDID, worker); } /** * Changes a worker's status to allocated for broker, without verifying logger, * mainly used for input validation. * @param remoteWorker The Worker interface of the worker * @param workerPublicKey The worker public key */ public void changeWorkerStatusToAllocatedForBroker(PeerComponent peerComponent, ServiceID workerServiceID, String brokerPublicKey, DeploymentID wmOID, WorkerManagement workerManagement) { WorkerManagementClient wmc = getWorkerManagementClient(); AcceptanceTestUtil.publishTestObject(peerComponent, wmOID, workerManagement, WorkerManagement.class); AcceptanceTestUtil.setExecutionContext(peerComponent, getWorkerManagementClientDeployment(), wmOID); wmc.statusChangedAllocatedForBroker(workerServiceID, brokerPublicKey); } /** * Changes a worker's status to allocated for broker, without verifying logger, * mainly used for input validation. * @param remoteWorker The Worker interface of the worker * @param workerPublicKey The worker public key */ public void changeWorkerStatusToAllocatedForBroker(PeerComponent peerComponent, String workerPublicKey) { WorkerManagementClient wmc = getWorkerManagementClient(); AcceptanceTestUtil.setExecutionContext(peerComponent, getWorkerManagementClientDeployment(), workerPublicKey); wmc.statusChangedAllocatedForBroker(null, null); } public void changeWorkerStatusToAllocatedForBroker(PeerComponent peerComponent, ServiceID workerServiceID, DeploymentID wmOID, RemoteWorkerManagement workerManagement) { RemoteWorkerManagementClient rwmc = getRemoteWorkerManagementClient(); AcceptanceTestUtil.setExecutionContext(peerComponent, getRemoteWorkerManagementClientDeployment(), wmOID); rwmc.statusChangedAllocatedForBroker(workerServiceID); } /** * Changes a remote worker's status to allocated for broker * @param peerComponent The peer component * @param lwpc The LocalWorkerProviderClient interface of the consumer * @param rwmc The RemoteWorkerManagementClient interface of the peer * @param rwmOID The objectID of the worker's RemoteWorkerManagement interface * @param workerSpecA The WorkerSpec containing the worker's attributes * @param requestSpec The RequestSpec containing request info * @return The Worker mock created */ public TestStub changeWorkerStatusToAllocatedForBroker(PeerComponent peerComponent, ObjectDeployment lwpc, ObjectDeployment rwmc, DeploymentID rwmOID, WorkerSpecification workerSpecA, RequestSpecification requestSpec) { CommuneLogger oldLogger = peerComponent.getLogger(); CommuneLogger newLogger = EasyMock.createMock(CommuneLogger.class); peerComponent.setLogger(newLogger); Worker worker = EasyMock.createMock(Worker.class); DeploymentID workerOID = new DeploymentID("a@b/d", "e"); workerOID.setPublicKey(rwmOID.getPublicKey()); DeploymentID lwpcOID = lwpc.getDeploymentID(); newLogger.debug("Giving the remote worker [" + rwmOID.getContainerID() + "] to [" + lwpcOID.getContainerID() + "]."); AcceptanceTestUtil.publishTestObject(application, workerOID, worker, Worker.class); EasyMock.reset(lwpc.getObject()); ((LocalWorkerProviderClient)lwpc.getObject()).hereIsWorker(workerOID.getServiceID(), workerSpecA, requestSpec); EasyMock.replay(lwpc.getObject()); EasyMock.replay(newLogger); EasyMock.replay(worker); AcceptanceTestUtil.setExecutionContext(peerComponent, rwmc, rwmOID); ((RemoteWorkerManagementClient)rwmc.getObject()).statusChangedAllocatedForBroker(workerOID.getServiceID()); EasyMock.verify(lwpc.getObject()); EasyMock.verify(newLogger); EasyMock.verify(worker); peerComponent.setLogger(oldLogger); return new TestStub(workerOID, worker); } /** * Change a worker's status to OWNER * @param workerID The public key of the worker */ public void changeWorkerStatusToOwner(PeerComponent peerComponent, DeploymentID workerID) { changeStatus(peerComponent, WorkerStatus.OWNER, workerID); } /** * Changes a worker's status to allocated for peer * @param peerComponent The peer component * @param rwpc The RemoteWorkerProviderClient interface of the peer * @param workerManagementDID The objectID of the WorkerManagament interface of the worker * @param workerSpecA The WorkerSpec of the worker containing its attributes * @return The RemoteWorkerManagement mock created */ public RemoteWorkerManagement changeWorkerStatusToAllocatedForPeer(PeerComponent peerComponent, RemoteWorkerProviderClient rwpc, DeploymentID workerManagementDID, WorkerSpecification workerSpecA, DeploymentID consumerID) { CommuneLogger newLogger = EasyMock.createMock(CommuneLogger.class); peerComponent.setLogger(newLogger); RemoteWorkerManagement remoteWorkerManagement = EasyMock.createMock(RemoteWorkerManagement.class); DeploymentID rwmDeploymentID = new DeploymentID(workerManagementDID.getContainerID(), WorkerConstants.REMOTE_WORKER_MANAGEMENT); AcceptanceTestUtil.publishTestObject(peerComponent, rwmDeploymentID, remoteWorkerManagement, RemoteWorkerManagement.class); AcceptanceTestUtil.publishTestObject(peerComponent, consumerID, rwpc, RemoteWorkerProviderClient.class); EasyMock.reset(rwpc); newLogger.info("Worker <" + workerManagementDID.getContainerID() + "> is now DONATED"); newLogger.info("Donating Worker <" + workerManagementDID.getContainerID() + "> to <" + consumerID.getContainerID() + ">"); rwpc.hereIsWorker(getRemoteWorkerProvider(), rwmDeploymentID.getServiceID(), workerSpecA); EasyMock.replay(rwpc); EasyMock.replay(newLogger); EasyMock.replay(remoteWorkerManagement); changeStatusAllocatedForPeer(rwmDeploymentID, consumerID.getPublicKey(), peerComponent); EasyMock.verify(newLogger); EasyMock.verify(rwpc); EasyMock.reset(newLogger); return remoteWorkerManagement; } /** * Changes a worker's status to allocated for peer, without verifying logger, * mainly used for input validation. * @param remoteWorker The RemoteWorkerManagement interface of the worker * @param workerPublicKey The worker public key */ public void changeStatusAllocatedForPeer(String remotePeerPubKey, PeerComponent peerComponent) { //Get bound object WorkerManagementClient workerManagementClient = getWorkerManagementClient(); //Change status of worker AcceptanceTestUtil.setExecutionContext(peerComponent, getWorkerManagementClientDeployment(), remotePeerPubKey); workerManagementClient.statusChangedAllocatedForPeer(null, remotePeerPubKey); } /** * Changes a worker's status to allocated for peer, without verifying logger, * mainly used for input validation. * @param remoteWorker The RemoteWorkerManagement interface of the worker * @param workerPublicKey The worker public key */ public void changeStatusAllocatedForPeer(DeploymentID remoteWorkerID, String remotePeerPubKey, PeerComponent peerComponent) { //Get bound object WorkerManagementClient workerManagementClient = getWorkerManagementClient(); //Change status of worker AcceptanceTestUtil.setExecutionContext(peerComponent, getWorkerManagementClientDeployment(), remoteWorkerID); workerManagementClient.statusChangedAllocatedForPeer(remoteWorkerID == null ? null : remoteWorkerID.getServiceID(), remotePeerPubKey); } public void changeStatusAllocatedForPeer(DeploymentID senderId, ServiceID workerID, String remotePeerPubKey, PeerComponent peerComponent) { //Get bound object WorkerManagementClient workerManagementClient = getWorkerManagementClient(); //Change status of worker AcceptanceTestUtil.setExecutionContext(peerComponent, getWorkerManagementClientDeployment(), senderId); workerManagementClient.statusChangedAllocatedForPeer(workerID, remotePeerPubKey); } /** * Change worker status to IDLE and schedules a Worker advert * @param peerComponent The peer component * @param workerSpec The WorkerSpec containing worker attributes * @param workerOID The worker's object ID * @param dsOID The nodeWiz object ID * @return The scheduled future */ public void changeWorkerStatusToIdleWithAdvert(PeerComponent peerComponent, WorkerSpecification workerSpec, DeploymentID workerOID, DeploymentID dsOID) { //Changes temporarily the timer mock ScheduledExecutorService oldTimer = peerComponent.getTimer(); ScheduledExecutorService newTimer = EasyMock.createMock(ScheduledExecutorService.class); peerComponent.setTimer(newTimer); //Records mock behavior DiscoveryService discoveryService = (DiscoveryService) AcceptanceTestUtil.getBoundObject(dsOID); EasyMock.reset(discoveryService); EasyMock.replay(discoveryService); EasyMock.replay(newTimer); //Change worker status changeWorkerStatusToIdle(peerComponent, workerOID); //Verify mocks EasyMock.verify(newTimer); EasyMock.verify(discoveryService); EasyMock.reset(discoveryService); //Set oldTimer back in peer component peerComponent.setTimer(oldTimer); } /** * Changes a worker's status to IDLE, verifying if another * consumes the worker after it becomes IDLE. * @param workerOID The objectID for the interface WorkerManagement * @param lwpcID The objectID for LocalWorkerProviderClient * which consumer will receive the worker */ public void changeWorkerStatusToIdleWorkingForBroker(DeploymentID workerOID, DeploymentID lwpcID, PeerComponent component) { changeWorkerStatusToIdleWorkingForBroker(workerOID, lwpcID, null, component); } /** * Changes a worker's status to IDLE, verifying if another * consumes the worker after it becomes IDLE. * @param workerOID The objectID for the interface WorkerManagement * @param lwpcID The objectID for LocalWorkerProviderClient * which consumer will receive the worker * @param future The request future to be canceled */ public void changeWorkerStatusToIdleWorkingForBroker(DeploymentID workerOID, DeploymentID lwpcID, ScheduledFuture<?> future, PeerComponent component) { WorkerManagement workerManagement = (WorkerManagement) AcceptanceTestUtil.getBoundObject(workerOID); EasyMock.reset(workerManagement); workerManagement.workForBroker(lwpcID); EasyMock.replay(workerManagement); if (future != null) { EasyMock.reset(future); EasyMock.expect(future.cancel(true)).andReturn(true); EasyMock.replay(future); } changeStatus(component, WorkerStatus.IDLE, workerOID); EasyMock.verify(workerManagement); if (future != null) { EasyMock.verify(future); } } /** * Changes a worker's status to IDLE * @param peerComponent The peer component * @param workerDeploymentID The DeploymentID for the interface WorkerManagement */ public void changeWorkerStatusToIdle(PeerComponent peerComponent, DeploymentID workerDeploymentID) { CommuneLogger oldLogger = peerComponent.getLogger(); CommuneLogger newLogger = EasyMock.createMock(CommuneLogger.class); peerComponent.setLogger(newLogger); newLogger.debug("Worker <"+workerDeploymentID.getContainerID()+"> is now IDLE"); EasyMock.replay(newLogger); changeStatus(peerComponent, WorkerStatus.IDLE, workerDeploymentID); EasyMock.verify(newLogger); peerComponent.setLogger(oldLogger); } /** * Changes a worker's status, without verifying logger, * mainly used for input validation. * @param status The new status of the worker * @param workerID The worker public key */ public void changeStatus(PeerComponent peerComponent, WorkerStatus status, DeploymentID workerID) { //Get bound object WorkerManagementClient workerManagementClient = getWorkerManagementClient(); //Change status of worker AcceptanceTestUtil.setExecutionContext(peerComponent, getWorkerManagementClientDeployment(), workerID); workerManagementClient.statusChanged(status); } public void changeUnknowWorkerStatusToIdle(PeerComponent peerComponent, DeploymentID workerID, String workerPublicKey) { CommuneLogger oldLogger = peerComponent.getLogger(); CommuneLogger newLogger = EasyMock.createMock(CommuneLogger.class); peerComponent.setLogger(newLogger); newLogger.warn("Unknown worker changed status: "+ workerPublicKey +"/IDLE"); EasyMock.replay(newLogger); //Get bound object WorkerManagementClient workerManagementClient = getWorkerManagementClient(); //Change status of worker AcceptanceTestUtil.setExecutionContext(peerComponent, getWorkerManagementClientDeployment(), workerID); workerManagementClient.statusChanged(WorkerStatus.IDLE); EasyMock.verify(newLogger); peerComponent.setLogger(oldLogger); } }