/*
* 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.peer;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.ourgrid.acceptance.util.PeerAcceptanceUtil;
import org.ourgrid.common.specification.OurGridSpecificationConstants;
import org.ourgrid.common.specification.exception.JobSpecificationException;
import org.ourgrid.common.specification.exception.TaskSpecificationException;
import org.ourgrid.common.specification.job.IOBlock;
import org.ourgrid.common.specification.job.JobSpecification;
import org.ourgrid.common.specification.job.TaskSpecification;
import org.ourgrid.common.specification.main.CompilerException;
import org.ourgrid.common.specification.main.JDLCompiler;
import org.ourgrid.common.specification.main.CommonCompiler.FileType;
import org.ourgrid.common.specification.worker.WorkerSpecification;
import org.ourgrid.peer.PeerComponent;
import org.ourgrid.peer.PeerComponentContextFactory;
import org.ourgrid.peer.PeerConfiguration;
import org.ourgrid.worker.WorkerConstants;
import br.edu.ufcg.lsd.commune.Module;
import br.edu.ufcg.lsd.commune.container.ObjectDeployment;
import br.edu.ufcg.lsd.commune.context.PropertiesFileParser;
import br.edu.ufcg.lsd.commune.identification.ContainerID;
import br.edu.ufcg.lsd.commune.identification.DeploymentID;
import br.edu.ufcg.lsd.commune.network.xmpp.XMPPProperties;
import br.edu.ufcg.lsd.commune.testinfra.AcceptanceTestCase;
import br.edu.ufcg.lsd.commune.testinfra.util.TestContext;
public class PeerAcceptanceTestCase extends AcceptanceTestCase {
public static final String SEP = File.separator;
public static final String ACCEPTANCE_TEST_DIR = "test" + SEP + "acceptance" + SEP;
public static final String PEER_TEST_DIR = ACCEPTANCE_TEST_DIR + "peer";
private static final String COMM_FILE_PATH = "test"+File.separator+"acceptance"+File.separator+"req_011";
public static final String PEER_PROP_FILEPATH = PEER_TEST_DIR + SEP + "peer.properties";
public static final String MACHINE1 = ACCEPTANCE_TEST_DIR.concat( "file1.classad" );
public static final String MACHINE2 = ACCEPTANCE_TEST_DIR.concat( "file2.classad" );
public static final String MACHINE3 = ACCEPTANCE_TEST_DIR.concat( "file3.classad" );
public static final String MACHINE4 = ACCEPTANCE_TEST_DIR.concat( "file4.classad" );
public static final String buildRequirements(String memOperator, Integer memValue, String osOperator, String osValue){
StringBuilder requirements = new StringBuilder("[Requirements = ");
if(memOperator != null || memValue != null){
requirements.append( "other.MainMemory " );
requirements.append( memOperator );
requirements.append( " " );
requirements.append( memValue );
if(osValue != null){
requirements.append( " && " );
}else{
requirements.append( ";" );
}
}
if(osValue != null){
requirements.append( "other.OS ");
requirements.append( osOperator );
requirements.append( " \"" );
requirements.append( osValue );
requirements.append( "\";");
}
if(memOperator == null && memValue == null && osValue == null){
requirements.append( "TRUE;");
}
requirements.append( "Rank=0]");
return requirements.toString();
}
public static final String buildRequirements(String expression){
StringBuilder requirements = new StringBuilder("[Requirements = ");
if(expression != null){
requirements.append( expression );
}else{
requirements.append( "TRUE");
}
requirements.append( ";Rank=0]");
return requirements.toString();
}
public static final String buildRequirementsAndRank(String reqExpression, String rankExpression){
StringBuilder expression = new StringBuilder("[Requirements = ");
if(reqExpression != null){
expression.append( reqExpression );
}else{
expression.append("TRUE");
}
expression.append(";Rank=");
if(rankExpression != null){
expression.append( rankExpression );
}else{
expression.append( "0");
}
expression.append( "]");
return expression.toString();
}
protected PeerAcceptanceUtil peerAcceptanceUtil = new PeerAcceptanceUtil(getComponentContext());
@BeforeClass
public static void recreateSchema() {
//PeerAcceptanceUtil.recreateSchema();
}
@Before
public void setUp() throws Exception {
PeerAcceptanceUtil.setUp();
super.setUp();
}
public ObjectDeployment getPeerControlDeployment(PeerComponent component) {
return component.getObject(Module.CONTROL_OBJECT_NAME);
}
@After
public void tearDown() throws Exception {
PeerAcceptanceUtil.tearDown();
}
/**
* Assumes that PeerConfiguration.PROP_DS_NETWORK contains a single address
* @return DiscoveryService component user name
*/
protected String getDSUserName() {
return getComponentContext().getProperty(PeerConfiguration.PROP_DS_NETWORK).split("@")[0];
}
/**
* Assumes that PeerConfiguration.PROP_DS_NETWORK contains a single address
* @return DiscoveryService component server name
*/
protected String getDSServerName() {
return getComponentContext().getProperty(PeerConfiguration.PROP_DS_NETWORK).split("@")[1];
}
protected void copyTrustFile(String fileName) throws IOException {
File origFile = new File(getRootForTrustFile()+File.separator+fileName);
FileUtils.copyFile(origFile,
new File(PeerConfiguration.TRUSTY_COMMUNITIES_FILENAME));
}
protected String getRootForTrustFile() {
return COMM_FILE_PATH;
}
@Override
protected TestContext createComponentContext() {
return new TestContext(
new PeerComponentContextFactory(
new PropertiesFileParser(PEER_PROP_FILEPATH
)).createContext());
}
public DeploymentID createWorkerDeploymentID(WorkerSpecification workerSpec, String publicKey) {
String user = workerSpec.getAttribute(OurGridSpecificationConstants.ATT_USERNAME);
String server = workerSpec.getAttribute(OurGridSpecificationConstants.ATT_SERVERNAME);
DeploymentID workerDeploymentID = new DeploymentID(new ContainerID(user, server, WorkerConstants.MODULE_NAME, publicKey),
WorkerConstants.WORKER);
return workerDeploymentID;
}
protected JobSpecification createJobSpec(String label) throws TaskSpecificationException,
JobSpecificationException {
return createJobSpec(label, 1);
}
protected JobSpecification createJobSpec(String label, int numOfTasks) throws TaskSpecificationException,
JobSpecificationException {
JobSpecification jobSpec = new JobSpecification(label);
List<TaskSpecification> taskList = new ArrayList<TaskSpecification>();
for (int i = 0; i < numOfTasks; i++) {
taskList.add(new TaskSpecification(new IOBlock(), "echo test", new IOBlock(), null));
}
jobSpec.setTaskSpecs(taskList);
return jobSpec;
}
protected JobSpecification createJobSpecJDL(String jobPath, int numOfTasks) throws TaskSpecificationException,
JobSpecificationException, CompilerException {
JDLCompiler jdlCompiler = new JDLCompiler();
jdlCompiler.compile(jobPath, FileType.JDL);
JobSpecification jobSpec = (JobSpecification) jdlCompiler.getResult().get(0);
List<TaskSpecification> taskList = new ArrayList<TaskSpecification>(jobSpec.getTaskSpecs());
for (int i = 0; i < numOfTasks - jobSpec.getTaskSpecs().size(); i++) {
taskList.add(new TaskSpecification(new IOBlock(), "echo test", new IOBlock(), null));
}
jobSpec.setTaskSpecs(taskList);
return jobSpec;
}
protected JobSpecification createJobSpecJDL(String jobPath) throws TaskSpecificationException,
JobSpecificationException, CompilerException {
return createJobSpecJDL(jobPath, 0);
}
protected JobSpecification createJobSpec(String label, String requirements) throws TaskSpecificationException,
JobSpecificationException {
JobSpecification createdJobSpec = createJobSpec(label);
createdJobSpec.setRequirements(requirements);
return createdJobSpec;
}
protected String getPeerAddress() {
String user = getComponentContext().getProperty(XMPPProperties.PROP_USERNAME);
String server = getComponentContext().getProperty(XMPPProperties.PROP_XMPP_SERVERNAME);
return user + "@" + server;
}
}