changeset 46:f8700bed1e17 draft

Uploaded
author fubar
date Tue, 18 Aug 2020 08:25:43 -0400
parents 668c37cc8962
children e95d9fe5ab50
files toolfactory/docker/Dockerfile toolfactory/docker/postinstall.py toolfactory/docker/tfwelcome.html toolfactory/rgToolFactory2.py toolfactory/rgToolFactory2.xml
diffstat 5 files changed, 143 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/toolfactory/docker/Dockerfile	Sun Aug 16 20:05:19 2020 -0400
+++ b/toolfactory/docker/Dockerfile	Tue Aug 18 08:25:43 2020 -0400
@@ -3,44 +3,50 @@
 # VERSION       0.2
 # patches startup so the below will install a workflow dropped into $GALAXY_ROOT/workflows
 # use docker run -p 8080:80  -d -e GALAXY_AUTO_UPDATE_WORKFLOWS=/galaxy-central/workflows/TF_sample_wf.ga -v /home/ubuntu/galaxy_storage/:/export/  toolfactory
-FROM bgruening/galaxy-stable
+FROM quay.io/bgruening/galaxy:20.05
 MAINTAINER Ross Lazarus ross.lazarus@gmail.com
 
 ENV GALAXY_CONFIG_BRAND=ToolFactory
 ENV GALAXY_LOGGING="full"
-
-# RUN apt-get update -y && apt-get install -y build-essential gcc apt-utils
-# needed for planemo build
-
-RUN /galaxy_venv/bin/python -m pip install --upgrade pip
-# RUN /galaxy_venv/bin/python -m pip install planemo
-
+ADD tfwelcome.html /export/welcome.html
 # RUN add-tool-shed --url 'http://testtoolshed.g2.bx.psu.edu/' --name 'Test Tool Shed'
-ADD my_tool_list.yml $GALAXY_ROOT/config/toolfactory_tools.yaml
-ENV GALAXY_AUTO_UPDATE_TOOLS=$GALAXY_ROOT/config/toolfactory_tools.yaml
+RUN mkdir -p /tftools \
+  && mkdir -p /tftools/toolfactory \
+  && mkdir -p /tftools/planemo_test
+
+ADD ./tftools/toolfactory /tftools/toolfactory
+ADD ./tftools/tf_tool_conf.xml /tftools/tf_tool_conf.xml
+ADD ./tftools/planemo_test /tftools/planemo_test
+ADD TF_example_wf.ga /tftools/TF_example_wf.ga
 
+ADD my_tool_list.yml /tftools/toolfactory_tools.yaml
+
+ENV GALAXY_AUTO_UPDATE_TOOLS=/tftools/toolfactory_tools.yaml
+# NOTE above does work but takes 1-2 minutes
+
+# ENV GALAXY_CONFIG_TOOL_CONFIG_FILE=config/tool_conf.xml.sample,config/tf_tool_conf.xml,config/shed_tool_conf.xml.sample
+#ENV GALAXY_CONFIG_TOOL_CONFIG_FILE=/tftools/tf_tool_conf.xml,config/tool_conf.xml.sample
+# works but does not install dependencies
 # Add workflows to the Docker image
-RUN mkdir -p $GALAXY_ROOT/workflows
-ADD TF_example_wf.ga $GALAXY_ROOT/workflows/TF_example_wf.ga
+
+ENV $GALAXY_DEFAULT_ADMIN_USER="admin"
+# ensure triggering post-start-actions.sh
+
+ADD tftools/datatypes_conf.xml $GALAXY_ROOT/conf/datatypes_conf.xml.sample
 ADD post-start-actions.sh /export/post-start-actions.sh
+ADD post-start-actions.sh $GALAXY_ROOT/config/post-start-actions.sh
+
 RUN chmod a+xr /export/post-start-actions.sh \
- && chmod a+xr $GALAXY_ROOT/workflows/TF_example_wf.ga 
-
+ && chmod a+xr /tftools/TF_example_wf.ga \
+ && chmod a+xr $GALAXY_ROOT/config/post-start-actions.sh
 # Add Galaxy interactive tours
 # ADD ./rna-workbench-tours/* $GALAXY_ROOT/config/plugins/tours/
 # Add data library definition file
 # ADD library_data.yaml $GALAXY_ROOT/library_data.yaml
-# cleanup dance
-RUN apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && rm -rf ~/.cache/ \
-    && find $GALAXY_ROOT/ -name '*.pyc' -delete | true \
-    && find /usr/lib/ -name '*.pyc' -delete | true \
-    && find /var/log/ -name '*.log' -delete | true \
-    && find $GALAXY_VIRTUAL_ENV -name '*.pyc' -delete | true \
-    && rm -rf /tmp/* /root/.cache/ /var/cache/* $GALAXY_ROOT/client/node_modules/ $GALAXY_VIRTUAL_ENV/src/ /home/galaxy/.cache/ /home/galaxy/.npm
-ENV GALAXY_DEFAULT_ADMIN_USER=''
-VOLUME ["/export/"]
+
+VOLUME ["/export/", "/data/", "/var/lib/docker"]
 EXPOSE :80
 EXPOSE :21
 EXPOSE :8800
+
 CMD ["/usr/bin/startup"]
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolfactory/docker/postinstall.py	Tue Aug 18 08:25:43 2020 -0400
@@ -0,0 +1,6 @@
+from bioblend import galaxy
+
+gi = galaxy.GalaxyInstance(url='http://127.0.0.1:8080', key='fbdd3c2eecd191e88939fffc02eeeaf8')
+
+hl = gi.histories.get_histories()
+h = get_most_recently_used_history()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolfactory/docker/tfwelcome.html	Tue Aug 18 08:25:43 2020 -0400
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <link rel="stylesheet" href="/static/style/base.css" type="text/css" />
+</head>
+<body style="margin: 0">
+
+    <div class="jumbotron">
+        <div class="container">
+            <table><tr><td>
+            <h2>Hello, your <strong>Galaxy ToolFactory Docker</strong> container is running!</h2>
+            <strong>If you have not already done so, </strong>
+            From a handy linux console, please use <br>
+            <code>docker ps</code><br>
+            to find this container's name then use<br>
+            <code>docker exec [container name] config/post-start-actions.sh</code>
+            <br>
+            to load the sample tool generators to fully populate this container.
+            until the Dockerfile for this container figures out how to load a workflow during the build correctly.<br>
+            To run the workflow you need two small datasets until I get them loaded<br>
+            phiX.fasta from the Galaxy test-sample directory, and any smallish text file you want such as a readme or script.<br>
+            When you run the workflow, feed the fasta where it says, and the text file where you see rgToolFactory.py<br>
+            Send it to the same history and let it run.<br>
+            With any luck, you will have a history of examples to play with - use the rerun button to repopulate the ToolFactory form to illustrate<br>
+            positional and argparse style parameter passing for python, a simple bash script using STDIN/STDOUT and the perl (ugh) example from planemo<br>
+            <a target="_blank" href="https://wiki.galaxyproject.org/Admin/Config" class="btn btn-primary btn-lg">Configuring Galaxy »</a>
+            <a target="_blank" href="https://wiki.galaxyproject.org/Admin/Tools/AddToolFromToolShedTutorial" class="btn btn-primary btn-lg">Installing Tools »</a>
+            <a target="_parent" href="/tours/core.galaxy_ui" class="btn btn-primary btn-lg">Guided Tour »</a>
+            </td><td>
+                <div align=center>
+                    <img src="./welcome_image.png" width="90%" height="90%" />
+                </div>
+
+        </td></tr></table>
+        </div>
+    </div>
+
+    <div class="container">
+
+        <p class="lead">
+            <a target="_blank" class="reference" href="http://galaxyproject.org/">
+            Galaxy</a> is an open platform for supporting data intensive
+            research. Galaxy is developed by <a target="_blank" class="reference" href="http://wiki.galaxyproject.org/GalaxyTeam">The Galaxy Team</a>
+            with the support of  <a target="_blank" class="reference" href="https://github.com/galaxyproject/galaxy/blob/dev/CONTRIBUTORS.md">many contributors</a>.
+            The Galaxy Docker project is supported by the University of Freiburg, part of de.NBI.
+        </p>
+
+        <footer>
+            The <a target="_blank" class="reference" href="http://galaxyproject.org/">Galaxy Project</a>
+            is supported in part by <a target="_blank" class="reference" href="http://www.genome.gov">NHGRI</a>,
+            <a target="_blank" class="reference" href="http://www.nsf.gov">NSF</a>,
+            <a target="_blank" class="reference" href="http://www.huck.psu.edu">The Huck Institutes of the Life Sciences</a>,
+            <a target="_blank" class="reference" href="http://www.ics.psu.edu">The Institute for CyberScience at Penn State</a>,
+            and <a target="_blank" class="reference" href="http://www.jhu.edu/">Johns Hopkins University</a>.
+        </footer>
+
+    </div>
+
+</body>
+</html>
--- a/toolfactory/rgToolFactory2.py	Sun Aug 16 20:05:19 2020 -0400
+++ b/toolfactory/rgToolFactory2.py	Tue Aug 18 08:25:43 2020 -0400
@@ -173,10 +173,17 @@
         self.testparam = []
         if (
             self.args.runmode == "Executable" or self.args.runmode == "system"
-        ):  # binary - no need
-            aCL(self.args.exe_package)  # this little CL will just run
+        ): 
+            if len(self.args.cl_override) > 0:
+                for x in self.args.cl_override.split(' '):
+                    aCL(x)
+            else:
+                aCL(self.args.exe_package)  # this little CL will just run
         else:
             self.prepScript()
+            aCL(self.args.interpreter_name)
+            aCL(self.sfile)
+
         self.elog = "%s_error_log.txt" % self.tool_name
         self.tlog = "%s_runner_log.txt" % self.tool_name
 
@@ -231,7 +238,6 @@
                 self.clargparse()
 
     def prepScript(self):
-        aCL = self.cl.append
         rx = open(self.args.script_path, "r").readlines()
         rx = [x.rstrip() for x in rx]
         rxcheck = [x.strip() for x in rx if x.strip() > ""]
@@ -255,9 +261,9 @@
             artifact.write(bytes("#!/usr/bin/env python\n", "utf8"))
         artifact.write(bytes(self.script, "utf8"))
         artifact.close()
-        aCL(self.args.interpreter_name)
-        aCL(self.sfile)
-
+        
+        
+        
     def cleanuppar(self):
         """ positional parameters are complicated by their numeric ordinal"""
         for i, p in enumerate(self.infiles):
@@ -482,7 +488,10 @@
         Uses galaxyhtml
         Hmmm. How to get the command line into correct order...
         """
-        self.tool.command_line_override = self.xmlcl
+        if self.args.cl_override:
+            self.tool.command_line_override = self.args.cl_override.split(' ') + self.xmlcl
+        else:
+            self.tool.command_line_override = self.xmlcl
         if self.args.interpreter_name:
             self.tool.interpreter = self.args.interpreter_name
         if self.args.help_text:
@@ -499,6 +508,13 @@
         requirements = gxtp.Requirements()
 
         if self.args.interpreter_name:
+            if self.args.dependencies:
+                for d in self.args.dependencies.split(','):
+                    requirements.append(
+                        gxtp.Requirement(
+                         "package", d, ""
+                        )
+                    )
             if self.args.interpreter_name == "python":
                 requirements.append(
                     gxtp.Requirement(
@@ -691,6 +707,8 @@
     parser = argparse.ArgumentParser()
     a = parser.add_argument
     a("--script_path", default="")
+    a("--dependencies", default="")
+    a("--cl_override", default="")
     a("--tool_name", default=None)
     a("--interpreter_name", default=None)
     a("--interpreter_version", default=None)
--- a/toolfactory/rgToolFactory2.xml	Sun Aug 16 20:05:19 2020 -0400
+++ b/toolfactory/rgToolFactory2.xml	Tue Aug 18 08:25:43 2020 -0400
@@ -92,10 +92,11 @@
         </repeat>
      </xml>
      <xml name="builtin_dynpar">
-          <param name="interpreter_version" type="text" value=""
-          label="Specific interpreter version to match dependency (Conda) repositories - e.g. for python '3.8.5' Latest if empty"/>
-            <param name="exe_package_version" type="text" value=""
-              label="Executable package version to match dependency (Conda) repositories - e.g. for bwa='0.7.17'. Latest if empty"/>
+            <param name="exe_package" type="hidden" value="" />
+            <param name="exe_package_version" type="hidden" value="" />
+            <param name="cl_override" type="hidden" value="" />
+            <param name="interpreter_version" type="hidden" value=""/>
+            <param name="dependencies" type="hidden" value="" />
           <param name="dynScript" label="Cut and paste the script to be executed here" type="text" value="Script goes here" area="True"
               help="If there are parameters, either positional or argparse style, the script must parse and use them appropriately">
               <sanitizer>
@@ -106,10 +107,12 @@
           </param>
     </xml>
     <xml name="dynpar">
+            <param name="exe_package" type="hidden" value="" />
+            <param name="exe_package_version" type="hidden" value="" />
+            <param name="cl_override" type="hidden" value="" />
+            <param name="dependencies" type="text" value="" label="List additional dependencies - e.g. 'planemo, ephemeris'" help="These will be managed by Conda" />
           <param name="interpreter_version" type="text" value=""
           label="Specific interpreter version to match dependency (Conda) repositories - e.g. for python '3.8.5' Latest if empty"/>
-            <param name="exe_package_version" type="text" value=""
-              label="Executable package version to match dependency (Conda) repositories - e.g. for bwa='0.7.17'. Latest if empty"/>
           <param name="dynScript" label="Cut and paste the script to be executed here" type="text" value="Script goes here" area="True"
               help="If there are parameters, either positional or argparse style, the script must parse and use them appropriately">
               <sanitizer>
@@ -131,10 +134,14 @@
 $__tool_directory__/rgToolFactory2.py --bad_user $__user_email__
  #else:
 $__tool_directory__/rgToolFactory2.py
+--dependencies "$interexe.dependencies"
 --runmode "$interexe.interpreter"
+   #if len(str($interexe.cl_override)) > 0:
+--cl_override "$interexe.cl_override"
+   #end if
    #if str($interexe.interpreter)=="Executable" or str($interexe.interpreter)=="system":
 --exe_package="$interexe.exe_package"
-    #if str($interexe.exe_package_version) != 'None' :
+    #if $interexe.exe_package_version:
 --exe_package_version="$interexe.exe_package_version"
     #end if
    #else:
@@ -159,12 +166,9 @@
 --additional_parameters="$apar.param_name~~~$apar.param_value~~~$apar.param_label~~~$apar.param_help~~~$apar.param_type~~~$apar.param_CL~~~$apar.param_CLprefixed"
      #end for
    #end if
-
      #for $intab in $ppass.history_inputs:
 --input_files="$intab.input_files~~~$intab.input_CL~~~$intab.input_formats~~~$intab.input_label~~~$intab.input_help"
      #end for
-
-
      #for $otab in $ppass.history_outputs:
 --output_files "$otab.history_name~~~$otab.history_format~~~$otab.history_CL"
      #end for
@@ -220,16 +224,19 @@
             <option value="bash">bash</option>
             <option value="sh">sh</option>
             <option value="system" >A system executable found on the path such as awk/sed</option>
-            <option value="specialtestcaseinterpreterpython" >for testing only - do not use me please</option>
         </param>
         <when value="Executable">
             <param name="exe_package" type="text" value="" label="Executable package name in dependency (Conda) repositories - e.g. 'bwa'" optional="false"/>
             <param name="exe_package_version" type="text" value="" label="Executable package version to match dependency (Conda) repositories - e.g. for bwa='0.7.17'. Latest if empty" />
+            <param name="cl_override" type="text" value="" label="Command line override prefix - e.g. for ephemeris prepend the specific function such as 'workflow_install'" 
+             help="Some packages like ephemerisand planemo require a sub-command - eg planemo test - before parameters are passed. Supply that here"/>
+            <param name="dependencies" type="hidden" value="" />
         </when>
         <when value="system">
-            <param name="exe_package" type="text" value="" label="System executable to run"  optional="false"/>
-            <param name="exe_package_version" type="text" value=""
-              label="Executable package version to match dependency (Conda) repositories - e.g. for bwa='0.7.17'. Latest if empty"/>
+            <param name="dependencies" type="hidden" value="" />
+            <param name="exe_package" type="text" value="" label="System executable to run - e.g. awk"/>
+            <param name="exe_package_version" type="hidden" value="" />
+            <param name="cl_override" type="hidden" value="" />
         </when>
         <when value = "python">
            <expand macro="dynpar" />
@@ -246,9 +253,6 @@
         <when value = "sh">
            <expand macro="builtin_dynpar" />
         </when>
-         <when value = "specialtestcaseinterpreterpython">
-           <expand macro="builtin_dynpar" />
-        </when>
     </conditional>
     <conditional name = "ppass">