uk.ac.sanger.cgp.wwdocker.callable.Docker.java Source code

Java tutorial

Introduction

Here is the source code for uk.ac.sanger.cgp.wwdocker.callable.Docker.java

Source

/**
 * Copyright (c) 2015 Genome Research Ltd.
 *
 * Author: Cancer Genome Project cgpit@sanger.ac.uk
 *
 * This file is part of WwDocker.
 *
 * WwDocker is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero 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 Affero General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 * 1. The usage of a range of years within a copyright statement contained
 * within this distribution should be interpreted as being equivalent to a list
 * of years including the first and last year specified and all consecutive
 * years between them. For example, a copyright statement that reads 'Copyright
 * (c) 2005, 2007- 2009, 2011-2012' should be interpreted as being identical to
 * a statement that reads 'Copyright (c) 2005, 2007, 2008, 2009, 2011, 2012' and
 * a copyright statement that reads "Copyright (c) 2005-2012' should be
 * interpreted as being identical to a statement that reads 'Copyright (c) 2005,
 * 2006, 2007, 2008, 2009, 2010, 2011, 2012'."
 */
package uk.ac.sanger.cgp.wwdocker.callable;

import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Map;
import java.util.concurrent.Callable;
import org.apache.commons.configuration.BaseConfiguration;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import uk.ac.sanger.cgp.wwdocker.actions.Local;
import uk.ac.sanger.cgp.wwdocker.beans.WorkflowIni;
import uk.ac.sanger.cgp.wwdocker.factories.WorkflowFactory;
import uk.ac.sanger.cgp.wwdocker.interfaces.Workflow;

/**
 *
 * @author kr2
 */
public class Docker implements Callable<Integer> {
    private static final Logger logger = LogManager.getLogger();
    private Thread t;
    private String threadName;
    private WorkflowIni iniFile;
    private File remoteIni;
    private BaseConfiguration config;
    File logArchive = null;
    private Workflow workManager = null;

    public Docker(WorkflowIni iniFile, BaseConfiguration config) {
        this.config = config;
        this.threadName = iniFile.getIniFile().getName();
        this.iniFile = iniFile;
        remoteIni = Paths.get(config.getString("datastoreDir"), threadName).toFile();
        workManager = new WorkflowFactory().getWorkflow(config);
    }

    public Integer call() {
        Integer result = new Integer(-1);
        logger.info("Running " + threadName);
        try {
            FileUtils.writeStringToFile(remoteIni, iniFile.getIniContent(), null);

            result = workManager.runDocker(config, remoteIni);
            if (result != 0) {
                // first check the log output for 'Setting workflow-run status to completed for'
                String grepStarted = "'grep -nF \"Created workflow run with SWID: \" /tmp/WwDocker-logs/WwDocker-info.log | tail -n 1 | cut -f 1 -d \";\"'";
                Map<String, String> startedRes = Local.execCapture(grepStarted, null, true);

                String grepCompleted = "'grep -nF \"Setting workflow-run status to completed for\" /tmp/WwDocker-logs/WwDocker-info.log | tail -n 1 | cut -f 1 -d \":\"";
                Map<String, String> completeRes = Local.execCapture(grepStarted, null, true);

                if (completeRes.get("stdout").length() > 0 && startedRes.get("stdout").length() > 0) {
                    int startedLine = Integer.parseInt(startedRes.get("stdout"));
                    int completeLine = Integer.parseInt(completeRes.get("stdout"));
                    if (completeLine > startedLine) {
                        result = 0;
                    }
                }
                // we should package the results as defined by the config of this workflow type
                logArchive = packageLogs();
            }

        } catch (IOException e) {
            throw new RuntimeException(e.getMessage(), e);
        }

        logger.trace("Thread " + threadName + " exiting.");
        logger.trace("Result: " + result);
        return result;
    }

    public File getLogArchive() {
        return logArchive;
    }

    public File packageLogs() {
        String datastore = config.getString("datastoreDir");
        String includeFile = datastore.concat("/toInclude.lst");
        File logTar = Paths.get(datastore, "logs.tar.gz").toFile();
        if (logTar.exists()) {
            logTar.delete();
        }
        String command = "cd ".concat(datastore).concat("; find *.ini -type f > ") // grab the ini file
                .concat(includeFile).concat("; find oozie-*/generated-scripts/ -type f >> ").concat(includeFile)
                .concat("; find /tmp/WwDocker-logs/ -type f >> ") // will break if log4j output moved
                .concat(includeFile);

        for (String c : iniFile.getLogSearchCmds()) {
            command = command.concat(";").concat(c).concat(">>").concat(includeFile);
        }
        command = command.concat(";tar -C ").concat(datastore).concat(" -czf ").concat(logTar.getAbsolutePath())
                .concat(" -T ").concat(includeFile);
        Local.execCommand(config, command, true);
        return logTar;
    }
}