From d4dd22223ffc90b4028d605c08a797e7ecdf006a Mon Sep 17 00:00:00 2001 From: Mason Date: Tue, 18 Jun 2019 08:14:49 -0700 Subject: [PATCH 001/853] Added trigger to dataset table to update history.update_time --- .../versions/0155_add_content_update_time.py | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 lib/galaxy/model/migrate/versions/0155_add_content_update_time.py diff --git a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py new file mode 100644 index 000000000000..6bc0a4df21df --- /dev/null +++ b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py @@ -0,0 +1,95 @@ +""" +Adds trigger to dataset table to update history.update_time when +contents are changed. +""" + +import logging +from sqlalchemy import DDL, MetaData + +log = logging.getLogger(__name__) +metadata = MetaData() + + +def upgrade(migrate_engine): + print(__doc__) + metadata.bind = migrate_engine + metadata.reflect() + drop_update_trigger(migrate_engine) + install_update_trigger(migrate_engine) + + +def downgrade(migrate_engine): + metadata.bind = migrate_engine + metadata.reflect() + drop_update_trigger(migrate_engine) + + +def not_pg(self, target, bind, state, **kw): + return bind.engine.name != 'postgresql' + + +def install_update_trigger(migrate_engine): + """Installs trigger on database table to update history table + when contents have changed. Installs a function and a trigger + for postgres, other sql variants only require the trigger def + """ + + pg_create_function = DDL(""" + CREATE FUNCTION update_history_content_update_time() + RETURNS trigger + LANGUAGE 'plpgsql' + AS $BODY$ + begin + update history h + set update_time = current_timestamp + from history_dataset_association hda + where h.id = hda.history_id + and hda.dataset_id = NEW.id; + return NEW; + end; + $BODY$; + """).execute_if(dialect='postgresql') + + pg_create_trigger = DDL(""" + CREATE TRIGGER update_history_update_time + BEFORE INSERT OR DELETE OR UPDATE + ON dataset + FOR EACH ROW + EXECUTE PROCEDURE update_history_content_update_time(); + """).execute_if(dialect='postgresql') + + trigger = DDL(""" + CREATE TRIGGER dataset_history_update_time + BEFORE INSERT OR DELETE OR UPDATE + ON dataset + FOR EACH ROW + BEGIN + update history h + set update_time = now() + from history_dataset_association hda + where h.id = hda.history_id + and hda.dataset_id = NEW.id; + END; + """).execute_if(callable_=not_pg) + + pg_create_function.execute(bind=migrate_engine) + pg_create_trigger.execute(bind=migrate_engine) + trigger.execute(bind=migrate_engine) + + +def drop_update_trigger(migrate_engine): + """Drops trigger on dataset table. Also removes associated function + for postgres sql variants. + """ + + pg_drop_trigger = DDL(""" + DROP TRIGGER IF EXISTS update_history_update_time ON dataset; + DROP FUNCTION IF EXISTS update_history_content_update_time(); + """).execute_if(dialect='postgresql') + + drop_trigger = DDL(""" + DROP TRIGGER IF EXISTS dataset_history_update_time; + """).execute_if(callable_=not_pg) + + pg_drop_trigger.execute(bind=migrate_engine) + drop_trigger.execute(bind=migrate_engine) From 6b925d7a7a230179a516545da50a4a74ba696f4c Mon Sep 17 00:00:00 2001 From: Mason Date: Tue, 18 Jun 2019 16:46:57 -0700 Subject: [PATCH 002/853] Updated sql for finicky sqlite --- .../versions/0155_add_content_update_time.py | 74 +++++++++++-------- 1 file changed, 43 insertions(+), 31 deletions(-) diff --git a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py index 6bc0a4df21df..2b95c46a94b8 100644 --- a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py +++ b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py @@ -1,9 +1,12 @@ """ -Adds trigger to dataset table to update history.update_time when +Adds trigger to dataset table to update history.update_time when contents are changed. """ +from __future__ import print_function +import datetime import logging + from sqlalchemy import DDL, MetaData log = logging.getLogger(__name__) @@ -34,12 +37,12 @@ def install_update_trigger(migrate_engine): for postgres, other sql variants only require the trigger def """ - pg_create_function = DDL(""" + pg_create_trigger = DDL(""" CREATE FUNCTION update_history_content_update_time() RETURNS trigger LANGUAGE 'plpgsql' AS $BODY$ - begin + begin update history h set update_time = current_timestamp from history_dataset_association hda @@ -48,48 +51,57 @@ def install_update_trigger(migrate_engine): return NEW; end; $BODY$; - """).execute_if(dialect='postgresql') - - pg_create_trigger = DDL(""" CREATE TRIGGER update_history_update_time - BEFORE INSERT OR DELETE OR UPDATE + BEFORE INSERT OR DELETE OR UPDATE ON dataset FOR EACH ROW EXECUTE PROCEDURE update_history_content_update_time(); """).execute_if(dialect='postgresql') - trigger = DDL(""" - CREATE TRIGGER dataset_history_update_time - BEFORE INSERT OR DELETE OR UPDATE - ON dataset - FOR EACH ROW - BEGIN - update history h - set update_time = now() - from history_dataset_association hda - where h.id = hda.history_id - and hda.dataset_id = NEW.id; - END; - """).execute_if(callable_=not_pg) - - pg_create_function.execute(bind=migrate_engine) pg_create_trigger.execute(bind=migrate_engine) - trigger.execute(bind=migrate_engine) + + # Looks like sqlite doesn't like multiple actions in some + # variants, so we build 3 triggers + build_trigger('INSERT').execute(bind=migrate_engine) + build_trigger('UPDATE').execute(bind=migrate_engine) + build_trigger('DELETE').execute(bind=migrate_engine) def drop_update_trigger(migrate_engine): - """Drops trigger on dataset table. Also removes associated function - for postgres sql variants. - """ + """Drops trigger on dataset table.""" pg_drop_trigger = DDL(""" DROP TRIGGER IF EXISTS update_history_update_time ON dataset; DROP FUNCTION IF EXISTS update_history_content_update_time(); """).execute_if(dialect='postgresql') - drop_trigger = DDL(""" - DROP TRIGGER IF EXISTS dataset_history_update_time; - """).execute_if(callable_=not_pg) - pg_drop_trigger.execute(bind=migrate_engine) - drop_trigger.execute(bind=migrate_engine) + build_drop_trigger("INSERT").execute(bind=migrate_engine) + build_drop_trigger("UPDATE").execute(bind=migrate_engine) + build_drop_trigger("DELETE").execute(bind=migrate_engine) + + +def build_trigger(op): + create_trigger_template = """ + CREATE TRIGGER BEFORE_{operation}_DATASET + BEFORE {operation} ON dataset + BEGIN + update history + set update_time = current_timestamp + where id in ( + select hda.history_id + from history_dataset_association as hda + where hda.dataset_id = {rowset}.id + ); + END; + """ + rs = 'OLD' if op == 'DELETE' else 'NEW' + sql = create_trigger_template.format(operation=op,rowset=rs) + return DDL(sql).execute_if(callable_=not_pg) + + +def build_drop_trigger(op): + trigger_template = """DROP TRIGGER IF EXISTS BEFORE_{operation}_DATASET;""" + sql = trigger_template.format(operation=op) + return DDL(sql).execute_if(callable_=not_pg) + From 7a52c274e40e7128e9fb6f503e6c162c0c98f600 Mon Sep 17 00:00:00 2001 From: Mason Date: Tue, 18 Jun 2019 16:52:53 -0700 Subject: [PATCH 003/853] Slave to the linting overlords --- .../model/migrate/versions/0155_add_content_update_time.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py index 2b95c46a94b8..97a277d7a2f6 100644 --- a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py +++ b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py @@ -4,7 +4,6 @@ """ from __future__ import print_function -import datetime import logging from sqlalchemy import DDL, MetaData @@ -96,7 +95,7 @@ def build_trigger(op): END; """ rs = 'OLD' if op == 'DELETE' else 'NEW' - sql = create_trigger_template.format(operation=op,rowset=rs) + sql = create_trigger_template.format(operation=op, rowset=rs) return DDL(sql).execute_if(callable_=not_pg) @@ -104,4 +103,3 @@ def build_drop_trigger(op): trigger_template = """DROP TRIGGER IF EXISTS BEFORE_{operation}_DATASET;""" sql = trigger_template.format(operation=op) return DDL(sql).execute_if(callable_=not_pg) - From c80ac74de7262558f07226fd38b0428a0f0eb004 Mon Sep 17 00:00:00 2001 From: Mason Date: Tue, 18 Jun 2019 21:29:35 -0700 Subject: [PATCH 004/853] added linting and formatting suggestions to trigger generation sql --- .../versions/0155_add_content_update_time.py | 101 +++++++++--------- 1 file changed, 49 insertions(+), 52 deletions(-) diff --git a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py index 97a277d7a2f6..1f822152b27b 100644 --- a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py +++ b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py @@ -26,80 +26,77 @@ def downgrade(migrate_engine): drop_update_trigger(migrate_engine) -def not_pg(self, target, bind, state, **kw): - return bind.engine.name != 'postgresql' - - def install_update_trigger(migrate_engine): """Installs trigger on database table to update history table when contents have changed. Installs a function and a trigger for postgres, other sql variants only require the trigger def """ - pg_create_trigger = DDL(""" - CREATE FUNCTION update_history_content_update_time() - RETURNS trigger - LANGUAGE 'plpgsql' - AS $BODY$ - begin - update history h - set update_time = current_timestamp - from history_dataset_association hda - where h.id = hda.history_id - and hda.dataset_id = NEW.id; - return NEW; - end; - $BODY$; - CREATE TRIGGER update_history_update_time - BEFORE INSERT OR DELETE OR UPDATE - ON dataset - FOR EACH ROW - EXECUTE PROCEDURE update_history_content_update_time(); - """).execute_if(dialect='postgresql') - - pg_create_trigger.execute(bind=migrate_engine) - - # Looks like sqlite doesn't like multiple actions in some - # variants, so we build 3 triggers - build_trigger('INSERT').execute(bind=migrate_engine) - build_trigger('UPDATE').execute(bind=migrate_engine) - build_trigger('DELETE').execute(bind=migrate_engine) + if migrate_engine.name in ['postgres', 'postgresql']: + pg_create_trigger = DDL(""" + CREATE FUNCTION update_history_content_update_time() + RETURNS trigger + LANGUAGE 'plpgsql' + AS $BODY$ + BEGIN + UPDATE history h + SET update_time = current_timestamp + FROM history_dataset_association hda + WHERE h.id = hda.history_id + AND hda.dataset_id = NEW.id; + RETURN NEW; + END; + $BODY$; + CREATE TRIGGER update_history_update_time + AFTER INSERT OR DELETE OR UPDATE + ON dataset + FOR EACH ROW + EXECUTE PROCEDURE update_history_content_update_time(); + """) + pg_create_trigger.execute(bind=migrate_engine) + else: + # Looks like sqlite doesn't like multiple actions in some + # variants, so we build 3 triggers + build_trigger('INSERT').execute(bind=migrate_engine) + build_trigger('UPDATE').execute(bind=migrate_engine) + build_trigger('DELETE').execute(bind=migrate_engine) def drop_update_trigger(migrate_engine): """Drops trigger on dataset table.""" - pg_drop_trigger = DDL(""" - DROP TRIGGER IF EXISTS update_history_update_time ON dataset; - DROP FUNCTION IF EXISTS update_history_content_update_time(); - """).execute_if(dialect='postgresql') - - pg_drop_trigger.execute(bind=migrate_engine) - build_drop_trigger("INSERT").execute(bind=migrate_engine) - build_drop_trigger("UPDATE").execute(bind=migrate_engine) - build_drop_trigger("DELETE").execute(bind=migrate_engine) + if migrate_engine.name in ['postgres', 'postgresql']: + pg_drop_trigger = DDL(""" + DROP TRIGGER IF EXISTS update_history_update_time ON dataset; + DROP FUNCTION IF EXISTS update_history_content_update_time; + """) + pg_drop_trigger.execute(bind=migrate_engine) + else: + build_drop_trigger('INSERT').execute(bind=migrate_engine) + build_drop_trigger('UPDATE').execute(bind=migrate_engine) + build_drop_trigger('DELETE').execute(bind=migrate_engine) def build_trigger(op): create_trigger_template = """ - CREATE TRIGGER BEFORE_{operation}_DATASET - BEFORE {operation} ON dataset + CREATE TRIGGER AFTER_{operation}_DATASET + AFTER {operation} ON dataset BEGIN - update history - set update_time = current_timestamp - where id in ( - select hda.history_id - from history_dataset_association as hda - where hda.dataset_id = {rowset}.id + UPDATE history + SET update_time = current_timestamp + WHERE id IN ( + SELECT hda.history_id + FROM history_dataset_association AS hda + WHERE hda.dataset_id = {rowset}.id ); END; """ rs = 'OLD' if op == 'DELETE' else 'NEW' sql = create_trigger_template.format(operation=op, rowset=rs) - return DDL(sql).execute_if(callable_=not_pg) + return DDL(sql) def build_drop_trigger(op): - trigger_template = """DROP TRIGGER IF EXISTS BEFORE_{operation}_DATASET;""" + trigger_template = 'DROP TRIGGER IF EXISTS AFTER_{operation}_DATASET;' sql = trigger_template.format(operation=op) - return DDL(sql).execute_if(callable_=not_pg) + return DDL(sql) From cbcb71fb2f6105522cfd5a9fd15a4d04a5b6d55d Mon Sep 17 00:00:00 2001 From: Mason Date: Tue, 18 Jun 2019 22:19:15 -0700 Subject: [PATCH 005/853] fix sql syntax error in drop statement --- .../model/migrate/versions/0155_add_content_update_time.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py index 1f822152b27b..3f7b16d025b3 100644 --- a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py +++ b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py @@ -68,7 +68,7 @@ def drop_update_trigger(migrate_engine): if migrate_engine.name in ['postgres', 'postgresql']: pg_drop_trigger = DDL(""" DROP TRIGGER IF EXISTS update_history_update_time ON dataset; - DROP FUNCTION IF EXISTS update_history_content_update_time; + DROP FUNCTION IF EXISTS update_history_content_update_time(); """) pg_drop_trigger.execute(bind=migrate_engine) else: From 7eb3a833ca478901c4a24a4a1c406221901e4255 Mon Sep 17 00:00:00 2001 From: Mason Date: Wed, 19 Jun 2019 08:53:31 -0700 Subject: [PATCH 006/853] Update lib/galaxy/model/migrate/versions/0155_add_content_update_time.py Co-Authored-By: Nicola Soranzo --- .../model/migrate/versions/0155_add_content_update_time.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py index 3f7b16d025b3..f3c876468d42 100644 --- a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py +++ b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py @@ -80,7 +80,9 @@ def drop_update_trigger(migrate_engine): def build_trigger(op): create_trigger_template = """ CREATE TRIGGER AFTER_{operation}_DATASET - AFTER {operation} ON dataset + AFTER {operation} + ON dataset + FOR EACH ROW BEGIN UPDATE history SET update_time = current_timestamp From 2ca059b9ad14fabc70450ce6723020991552a738 Mon Sep 17 00:00:00 2001 From: Mason Date: Wed, 19 Jun 2019 09:37:21 -0700 Subject: [PATCH 007/853] Modified trigger names to conform to requested format --- .../versions/0155_add_content_update_time.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py index f3c876468d42..5c78b30b2c76 100644 --- a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py +++ b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py @@ -34,7 +34,7 @@ def install_update_trigger(migrate_engine): if migrate_engine.name in ['postgres', 'postgresql']: pg_create_trigger = DDL(""" - CREATE FUNCTION update_history_content_update_time() + CREATE FUNCTION update_history_update_time() RETURNS trigger LANGUAGE 'plpgsql' AS $BODY$ @@ -47,11 +47,11 @@ def install_update_trigger(migrate_engine): RETURN NEW; END; $BODY$; - CREATE TRIGGER update_history_update_time + CREATE TRIGGER trigger_dataset_aidur AFTER INSERT OR DELETE OR UPDATE ON dataset FOR EACH ROW - EXECUTE PROCEDURE update_history_content_update_time(); + EXECUTE PROCEDURE update_history_update_time(); """) pg_create_trigger.execute(bind=migrate_engine) else: @@ -67,8 +67,8 @@ def drop_update_trigger(migrate_engine): if migrate_engine.name in ['postgres', 'postgresql']: pg_drop_trigger = DDL(""" - DROP TRIGGER IF EXISTS update_history_update_time ON dataset; - DROP FUNCTION IF EXISTS update_history_content_update_time(); + DROP TRIGGER IF EXISTS trigger_dataset_aidur ON dataset; + DROP FUNCTION IF EXISTS update_history_update_time(); """) pg_drop_trigger.execute(bind=migrate_engine) else: @@ -79,7 +79,7 @@ def drop_update_trigger(migrate_engine): def build_trigger(op): create_trigger_template = """ - CREATE TRIGGER AFTER_{operation}_DATASET + CREATE TRIGGER trigger_dataset_a{op_initial}r AFTER {operation} ON dataset FOR EACH ROW @@ -94,11 +94,11 @@ def build_trigger(op): END; """ rs = 'OLD' if op == 'DELETE' else 'NEW' - sql = create_trigger_template.format(operation=op, rowset=rs) + sql = create_trigger_template.format(operation=op, rowset=rs, op_initial=op.lower()[0]) return DDL(sql) def build_drop_trigger(op): - trigger_template = 'DROP TRIGGER IF EXISTS AFTER_{operation}_DATASET;' - sql = trigger_template.format(operation=op) + drop_template = 'DROP TRIGGER IF EXISTS trigger_dataset_a{op_initial}r;' + sql = drop_template.format(op_initial=op.lower()[0]) return DDL(sql) From 9400f26eeffb54e25456966fb4d9df5468d89712 Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Fri, 6 Sep 2019 22:55:03 +0200 Subject: [PATCH 008/853] move ITs to tools/interactive (cherry picked from commit 1c5bc4f55a781e48e4fd6017e4e49a52db8c4657) --- interactivetool_askomics.xml | 59 ++++++++++++++++ interactivetool_bam_iobio.xml | 44 ++++++++++++ interactivetool_cellxgene.xml | 29 ++++++++ interactivetool_ethercalc.xml | 63 +++++++++++++++++ interactivetool_hicbrowser.xml | 33 +++++++++ interactivetool_jupyter_notebook.xml | 100 +++++++++++++++++++++++++++ interactivetool_neo4j.xml | 41 +++++++++++ interactivetool_phinch.xml | 37 ++++++++++ 8 files changed, 406 insertions(+) create mode 100644 interactivetool_askomics.xml create mode 100644 interactivetool_bam_iobio.xml create mode 100644 interactivetool_cellxgene.xml create mode 100644 interactivetool_ethercalc.xml create mode 100644 interactivetool_hicbrowser.xml create mode 100644 interactivetool_jupyter_notebook.xml create mode 100644 interactivetool_neo4j.xml create mode 100644 interactivetool_phinch.xml diff --git a/interactivetool_askomics.xml b/interactivetool_askomics.xml new file mode 100644 index 000000000000..71c3fe9a437f --- /dev/null +++ b/interactivetool_askomics.xml @@ -0,0 +1,59 @@ + + AskOmics, a visual SPARQL query builder + + quay.io/askomics/askomics-ie:17.12_g19.09 + + + + 6543 + /login_api_gie?key=abcd + + + + ${__app__.config.galaxy_infrastructure_url} + + #if $__user__: + #for $api_key in $__user__.api_keys: + ${api_key.key} + #break + #end for + #end if + + + + + + + + + + + + + + AskOmics is a visual SPARQL query interface supporting both intuitive data integration and + querying while shielding the user from most of the technical difficulties underlying RDF and SPARQL. + + diff --git a/interactivetool_bam_iobio.xml b/interactivetool_bam_iobio.xml new file mode 100644 index 000000000000..2f1c531861ca --- /dev/null +++ b/interactivetool_bam_iobio.xml @@ -0,0 +1,44 @@ + + + qiaoy/iobio-bundle.bam-iobio:1.0-ondemand + + + + 80 + + + + /tmp/app.conf && + mv /tmp/app.conf /etc/supervisor.d/app.conf && + + /usr/bin/supervisord -c /etc/supervisord.conf + ]]> + + + + + + + + + + + BAM iobio visualisation. + + diff --git a/interactivetool_cellxgene.xml b/interactivetool_cellxgene.xml new file mode 100644 index 000000000000..546bd7ab58fe --- /dev/null +++ b/interactivetool_cellxgene.xml @@ -0,0 +1,29 @@ + + + quay.io/galaxy/cellxgene-galaxy-ie:ie2 + + + + 80 + + + + + + + + + + + + + + Interactive tool for visualising AnnData. + + diff --git a/interactivetool_ethercalc.xml b/interactivetool_ethercalc.xml new file mode 100644 index 000000000000..88676c1e997d --- /dev/null +++ b/interactivetool_ethercalc.xml @@ -0,0 +1,63 @@ + + + shiltemann/ethercalc-galaxy-ie:17.05 + + + + 8000 + + + loading.txt + && + curl --include --request PUT --header "Content-Type: text/csv" --data-binary @loading.txt http://localhost:8000/_/galaxy + && + + ## remove dump file so this doesnt appear in audit trail + rm /dump.json + && + + ## load dataset into worksheet + curl --include --request PUT --header "Content-Type: text/csv" --data-binary @$infile http://localhost:8000/_/galaxy + && + + tail -f /etc/hosts + + ]]> + + + +&1) +while [[ \${STATUS} =~ "refused" ]] +do + echo "waiting for ethercalc: \$STATUS \n" + STATUS=\$(curl --include 'http://localhost:8000/_/galaxy' 2>&1) + sleep 2 +done + ]]> + + + + + + + + + + + + EtherCalc is a web spreadsheet. + https://ethercalc.net + + diff --git a/interactivetool_hicbrowser.xml b/interactivetool_hicbrowser.xml new file mode 100644 index 000000000000..7aaa8a3e8e7b --- /dev/null +++ b/interactivetool_hicbrowser.xml @@ -0,0 +1,33 @@ + + + bgruening/hicbrowser + + + + 80 + + + + + + + + + + + + + + Visualising HiC data with HiCBrowser. + + diff --git a/interactivetool_jupyter_notebook.xml b/interactivetool_jupyter_notebook.xml new file mode 100644 index 000000000000..9dd3e36d3ee4 --- /dev/null +++ b/interactivetool_jupyter_notebook.xml @@ -0,0 +1,100 @@ + + + quay.io/bgruening/docker-jupyter-notebook:ie2 + + + + 8888 + ipython/tree + + + + ${__app__.security.encode_id($jupyter_notebook.history_id)} + ${__app__.config.galaxy_infrastructure_url} + 8080 + ${__app__.config.galaxy_infrastructure_url} + + #if $__user__: + #for $api_key in $__user__.api_keys: + ${api_key.key} + #break + #end for + #end if + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The Jupyter Notebook is an open-source web application that allows you to create and share documents that contain live code, equations, + visualizations and narrative text. Uses include: data cleaning and transformation, numerical simulation, statistical modeling, data visualization, + machine learning, and much more. + + Galaxy offers you to use Jupyter Notebooks directly in Galaxy accessing and interacting with Galaxy datasets as you like. A very common use-case is to + do the heavy lifting and data reduction steps in Galaxy and the plotting and more `interactive` part on smaller datasets in Jupyter. + + You can start with a new Jupyter notebook from scratch or load an already existing one, e.g. from your collegue and execute it on your dataset. + If you have a defined input dataset you can even execute a Jupyter notebook in a workflow, given that the notebook is writing the output back to the history. + + You can import data into the notebook via a predefined `get()` function and write results back to Galaxy with a `put()` function. + + diff --git a/interactivetool_neo4j.xml b/interactivetool_neo4j.xml new file mode 100644 index 000000000000..0b31a8b303e0 --- /dev/null +++ b/interactivetool_neo4j.xml @@ -0,0 +1,41 @@ + + + quay.io/sanbi-sa/neo_ie:3.1.9 + + + + 80 + + + + + 2345 + 2345 + false + + + + + + + + + + + + + Neo4j is a highly scalable, robust native graph database. + + diff --git a/interactivetool_phinch.xml b/interactivetool_phinch.xml new file mode 100644 index 000000000000..d77c9274ad35 --- /dev/null +++ b/interactivetool_phinch.xml @@ -0,0 +1,37 @@ + + + shiltemann/docker-phinch-galaxy:16.04 + + + + 80 + + + &1 > /var/log/phinch.log + + ]]> + + + + + + + + + + + Interactive tool for visualising Biom data. + + From 2f67bb0f4d539b6f768edc635f01c207a5046947 Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Fri, 6 Sep 2019 23:05:01 +0200 Subject: [PATCH 009/853] move default notebook as well (cherry picked from commit 6d8848e399446fdc3cb1e0c81b1e88c80b03c515) --- default_notebook.ipynb | 53 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 default_notebook.ipynb diff --git a/default_notebook.ipynb b/default_notebook.ipynb new file mode 100644 index 000000000000..e95737524789 --- /dev/null +++ b/default_notebook.ipynb @@ -0,0 +1,53 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Welcome to the interactive Galaxy IPython Notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can access your data via the dataset number. Using a Python kernel, you can access dataset number 42 with ``handle = open(get(42), 'r')``.\n", + "To save data, write your data to a file, and then call ``put('filename.txt')``. The dataset will then be available in your galaxy history.\n
", + "When using a non-Python kernel, ``get`` and ``put`` are available as command-line tools, which can be accessed using system calls in R, Julia, and Ruby. For example, to read dataset number 42 into R, you can write ```handle <- file(system('get -i 42', intern = TRUE))```.\n", + "To save data in R, write the data to a file and then call ``system('put -p filename.txt')``.\n", + "Notebooks can be saved to Galaxy by clicking the large green button at the top right of the IPython interface.
\n", + "More help and informations can be found on the project [website](https://github.com/bgruening/docker-jupyter-notebook)." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From 58a00bef9c035495f46a1a92ac73dbe7fe66751e Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Fri, 6 Sep 2019 23:07:39 +0200 Subject: [PATCH 010/853] improve description of Askomics (cherry picked from commit 1d4dc27e509a4084857fec63c20698d69979c8eb) --- interactivetool_askomics.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interactivetool_askomics.xml b/interactivetool_askomics.xml index 71c3fe9a437f..c1ce9d3bd115 100644 --- a/interactivetool_askomics.xml +++ b/interactivetool_askomics.xml @@ -1,5 +1,5 @@ - AskOmics, a visual SPARQL query builder + a visual SPARQL query builder quay.io/askomics/askomics-ie:17.12_g19.09 From 06bbc492e2faf0d7c7d53d0ac207f34ca3224e21 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Thu, 3 Oct 2019 13:40:33 +0200 Subject: [PATCH 011/853] move to right dir --- interactivetool_paraview.xml | 50 ++++++++++++++++++++++++++ interactivetool_rstudio.xml | 69 ++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 interactivetool_paraview.xml create mode 100644 interactivetool_rstudio.xml diff --git a/interactivetool_paraview.xml b/interactivetool_paraview.xml new file mode 100644 index 000000000000..c801600ef0e4 --- /dev/null +++ b/interactivetool_paraview.xml @@ -0,0 +1,50 @@ + + + + bmcv/galaxy-paraviewweb:latest + + + + 8777 + + + + + localhost:8080 + wss + -dr,--mesa-swr + + + + + + + + + + + + + ParaView is an open-source, multi-platform application designed to visualize data sets of varying sizes from small to very large. + + diff --git a/interactivetool_rstudio.xml b/interactivetool_rstudio.xml new file mode 100644 index 000000000000..30b55db7f118 --- /dev/null +++ b/interactivetool_rstudio.xml @@ -0,0 +1,69 @@ + + + quay.io/erasche/docker-rstudio-notebook:19.05 + + + + 80 + rstudio/ + + + + ${__app__.security.encode_id($jupyter_notebook.history_id)} + ${__app__.config.galaxy_infrastructure_url} + 8080 + ${__app__.config.galaxy_infrastructure_url} + + #if $__user__: + #for $api_key in $__user__.api_keys: + ${api_key.key} + #break + #end for + #end if + + + + + + + + + + + + + + + + + + + + This familiar R analysis software suite will let you explore your + datasets in depth. Comes with ggplot2, RODBC, maps, shinyapps, knitr, + LaTeX, bioconductor, cummeRbund, and many more pre-installed packages. + + Galaxy offers you to use RStudio directly in Galaxy accessing and interacting with Galaxy datasets as you like. A very common use-case is to + do the heavy lifting and data reduction steps in Galaxy and the plotting and more `interactive` part on smaller datasets in RStudio. + + The convenience functions gx_put() and gx_get() are available to you to interact with your current Galaxy history. You can save your workspace with gx_save(). + + For example, gx_get(42) will fetch dataset 42 from your history and return the file location + + From 6b0b5edbbfa092e9e51732d8e9ae931b22e197e2 Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Sat, 5 Oct 2019 23:58:46 +0200 Subject: [PATCH 012/853] add wilson --- interactivetool_wilson.xml | 51 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 interactivetool_wilson.xml diff --git a/interactivetool_wilson.xml b/interactivetool_wilson.xml new file mode 100644 index 000000000000..5ce1b73272f3 --- /dev/null +++ b/interactivetool_wilson.xml @@ -0,0 +1,51 @@ + + Webbased Interactive Omics visualization + + loosolab/wilson:2.1.0 + + + + 3838 + + + &1 + ]]> + + + + + + + + + + +`_ + +.. class:: infomark + +Wilson uses the CLARION file format, which is a generic file format for quantitative comparisons of high throughput screens. + +CLARION is a data format specially developed to be used with Wilson, which relies on a tab-delimited table with +a metadata header to describe the following columns. It is based on the Summarized Experiment format and supports +all types of data which can be reduced to features and their annotation (e.g. genes, transcripts, proteins, probes) +with assigned numerical values (e.g. count, score, log2foldchange, z-score, p-value). Most result tables derived from RNA-Seq, +ChIP/ATAC-Seq, Proteomics, Microarrays, and many other analyses can thus be easily reformatted to become compatible +without having to modify the code of Wilson for each specific experiment. + +Please check the following link for details considering the `CLARION format `_. + + + +]]> + + + 10.1093/bioinformatics/bty711 + + From 5df22293ef936aabe9d4b4c14e1afb88e2f77662 Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Sun, 6 Oct 2019 00:01:57 +0200 Subject: [PATCH 013/853] deactivate monitor script --- interactivetool_rstudio.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interactivetool_rstudio.xml b/interactivetool_rstudio.xml index 30b55db7f118..7454c973b857 100644 --- a/interactivetool_rstudio.xml +++ b/interactivetool_rstudio.xml @@ -36,6 +36,8 @@ ## change into the directory where the notebooks are located cd ./rstudio/ && + sed -i 's|/monitor.*||g' /etc/services.d/nginx/run && + /init ]]> From 73dd265703a1fa7b7c65be73aae22138f9fd2512 Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Sun, 6 Oct 2019 00:48:50 +0200 Subject: [PATCH 014/853] fix tool id --- interactivetool_wilson.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interactivetool_wilson.xml b/interactivetool_wilson.xml index 5ce1b73272f3..9d724a0fbe59 100644 --- a/interactivetool_wilson.xml +++ b/interactivetool_wilson.xml @@ -1,4 +1,4 @@ - + Webbased Interactive Omics visualization loosolab/wilson:2.1.0 From c7f5136c8f7942312b2f83075b25e5ff847f9b82 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 8 Oct 2019 14:51:38 +0200 Subject: [PATCH 015/853] temporarily disable all input data --- interactivetool_rstudio.xml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/interactivetool_rstudio.xml b/interactivetool_rstudio.xml index 7454c973b857..9f39f2273480 100644 --- a/interactivetool_rstudio.xml +++ b/interactivetool_rstudio.xml @@ -28,11 +28,6 @@ mkdir -p ./rstudio/outputs/ && mkdir -p ./rstudio/data && - #if $input: - #set $cleaned_name = re.sub('[^\w\-\.]', '_', str($input.element_identifier)) - ln -sf '$input' './rstudio/data/${cleaned_name}' && - #end if - ## change into the directory where the notebooks are located cd ./rstudio/ && @@ -43,7 +38,7 @@ ]]> - + @@ -60,12 +55,12 @@ This familiar R analysis software suite will let you explore your datasets in depth. Comes with ggplot2, RODBC, maps, shinyapps, knitr, LaTeX, bioconductor, cummeRbund, and many more pre-installed packages. - + Galaxy offers you to use RStudio directly in Galaxy accessing and interacting with Galaxy datasets as you like. A very common use-case is to do the heavy lifting and data reduction steps in Galaxy and the plotting and more `interactive` part on smaller datasets in RStudio. - The convenience functions gx_put() and gx_get() are available to you to interact with your current Galaxy history. You can save your workspace with gx_save(). + The convenience functions gx_put() and gx_get() are available to you to interact with your current Galaxy history. You can save your workspace with gx_save(). - For example, gx_get(42) will fetch dataset 42 from your history and return the file location + For example, gx_get(42) will fetch dataset 42 from your history and return the file location From ae38c98f5adf246d4516ffe9248413099ef893aa Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 8 Oct 2019 14:52:54 +0200 Subject: [PATCH 016/853] add two more --- interactivetool_rstudio.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interactivetool_rstudio.xml b/interactivetool_rstudio.xml index 9f39f2273480..8338497f70c9 100644 --- a/interactivetool_rstudio.xml +++ b/interactivetool_rstudio.xml @@ -13,6 +13,8 @@ ${__app__.config.galaxy_infrastructure_url} 8080 ${__app__.config.galaxy_infrastructure_url} + true + true #if $__user__: #for $api_key in $__user__.api_keys: From b92f4720273172cda4b64f96e0ce7e36e797893d Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 8 Oct 2019 14:53:31 +0200 Subject: [PATCH 017/853] also from prod --- interactivetool_jupyter_notebook.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/interactivetool_jupyter_notebook.xml b/interactivetool_jupyter_notebook.xml index 9dd3e36d3ee4..60cdc00253f5 100644 --- a/interactivetool_jupyter_notebook.xml +++ b/interactivetool_jupyter_notebook.xml @@ -39,7 +39,7 @@ ## copy default notebook cp '$__tool_directory__/default_notebook.ipynb' ./ipython_galaxy_notebook.ipynb && jupyter trust ./ipython_galaxy_notebook.ipynb && - jupyter lab --no-browser --NotebookApp.shutdown_button=True && + jupyter lab --allow-root --no-browser --NotebookApp.shutdown_button=True && cp ./ipython_galaxy_notebook.ipynb '$jupyter_notebook' #else: @@ -50,7 +50,7 @@ #if $mode.run_it: jupyter nbconvert --to notebook --execute --output ./ipython_galaxy_notebook.ipynb --allow-errors ./*.ipynb && #else: - jupyter lab --no-browser --NotebookApp.shutdown_button=True && + jupyter lab --allow-root --no-browser --NotebookApp.shutdown_button=True && #end if cp ./ipython_galaxy_notebook.ipynb '$jupyter_notebook' #end if @@ -88,13 +88,13 @@ The Jupyter Notebook is an open-source web application that allows you to create and share documents that contain live code, equations, visualizations and narrative text. Uses include: data cleaning and transformation, numerical simulation, statistical modeling, data visualization, machine learning, and much more. - + Galaxy offers you to use Jupyter Notebooks directly in Galaxy accessing and interacting with Galaxy datasets as you like. A very common use-case is to do the heavy lifting and data reduction steps in Galaxy and the plotting and more `interactive` part on smaller datasets in Jupyter. - + You can start with a new Jupyter notebook from scratch or load an already existing one, e.g. from your collegue and execute it on your dataset. If you have a defined input dataset you can even execute a Jupyter notebook in a workflow, given that the notebook is writing the output back to the history. - + You can import data into the notebook via a predefined `get()` function and write results back to Galaxy with a `put()` function. From 0bd3376068fe8d9059628b8ac127f4473d16eaf0 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 8 Oct 2019 14:59:38 +0200 Subject: [PATCH 018/853] switch version --- interactivetool_rstudio.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interactivetool_rstudio.xml b/interactivetool_rstudio.xml index 8338497f70c9..d0b11257a3f3 100644 --- a/interactivetool_rstudio.xml +++ b/interactivetool_rstudio.xml @@ -1,6 +1,6 @@ - quay.io/erasche/docker-rstudio-notebook:19.05 + quay.io/erasche/docker-rstudio-notebook:19.09 From 8b5d5bf5c5812f101ae00a7e82b9f3c537ae32bf Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 8 Oct 2019 16:38:15 +0200 Subject: [PATCH 019/853] chown, hacks --- interactivetool_rstudio.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/interactivetool_rstudio.xml b/interactivetool_rstudio.xml index d0b11257a3f3..8f5d8792bf49 100644 --- a/interactivetool_rstudio.xml +++ b/interactivetool_rstudio.xml @@ -35,7 +35,11 @@ sed -i 's|/monitor.*||g' /etc/services.d/nginx/run && - /init + ##/init + rstudio-server start && + /etc/init.d/syslog-ng start && + chmod 777 /tmp -R && + tail -f /var/log/rstudio-server/rserver.log ]]> From ca0624a341464c4c9b4d9409d509ce3b8cf64ea3 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 8 Oct 2019 16:48:42 +0200 Subject: [PATCH 020/853] fix pot --- interactivetool_rstudio.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interactivetool_rstudio.xml b/interactivetool_rstudio.xml index 8f5d8792bf49..f15e9047cf40 100644 --- a/interactivetool_rstudio.xml +++ b/interactivetool_rstudio.xml @@ -4,7 +4,7 @@ - 80 + 8787 rstudio/ From 48b5cb7bc803031832114c49ab4f2c899fb11c2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gr=C3=BCning?= Date: Tue, 8 Oct 2019 20:09:27 +0200 Subject: [PATCH 021/853] latest RStudio changes --- interactivetool_rstudio.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/interactivetool_rstudio.xml b/interactivetool_rstudio.xml index f15e9047cf40..e6ee98af1544 100644 --- a/interactivetool_rstudio.xml +++ b/interactivetool_rstudio.xml @@ -4,7 +4,7 @@ - 8787 + 80 rstudio/ @@ -35,9 +35,10 @@ sed -i 's|/monitor.*||g' /etc/services.d/nginx/run && - ##/init - rstudio-server start && /etc/init.d/syslog-ng start && + /init & + ##rstudio-server start && + sleep 5 && chmod 777 /tmp -R && tail -f /var/log/rstudio-server/rserver.log From d4403bc344cf2d4723bbdf9eefdef115141e56f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gr=C3=BCning?= Date: Tue, 8 Oct 2019 20:09:53 +0200 Subject: [PATCH 022/853] use lab entrypoint --- interactivetool_jupyter_notebook.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interactivetool_jupyter_notebook.xml b/interactivetool_jupyter_notebook.xml index 60cdc00253f5..787d7fa64fa7 100644 --- a/interactivetool_jupyter_notebook.xml +++ b/interactivetool_jupyter_notebook.xml @@ -5,7 +5,7 @@ 8888 - ipython/tree + ipython/lab From 4a558dba1ac0432b57b4bbd62b85adf8c5576a7d Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 8 Oct 2019 20:32:58 +0200 Subject: [PATCH 023/853] more reverts --- interactivetool_rstudio.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/interactivetool_rstudio.xml b/interactivetool_rstudio.xml index e6ee98af1544..63e0eb3adb05 100644 --- a/interactivetool_rstudio.xml +++ b/interactivetool_rstudio.xml @@ -39,6 +39,7 @@ /init & ##rstudio-server start && sleep 5 && + chmod 777 /tmp -R && tail -f /var/log/rstudio-server/rserver.log From b050d84dbdeb31a95a35f0ab1ac84885daeb2718 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 9 Oct 2019 16:02:24 +0200 Subject: [PATCH 024/853] include env --- interactivetool_wilson.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interactivetool_wilson.xml b/interactivetool_wilson.xml index 9d724a0fbe59..94abe38311df 100644 --- a/interactivetool_wilson.xml +++ b/interactivetool_wilson.xml @@ -8,10 +8,12 @@ 3838 + + feature_selection + &1 ]]> From 0dbfa7ce3282e003bc3158e622ee8e22815febe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gr=C3=BCning?= Date: Wed, 9 Oct 2019 23:35:41 +0200 Subject: [PATCH 025/853] use own container --- interactivetool_wilson.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interactivetool_wilson.xml b/interactivetool_wilson.xml index 94abe38311df..302ff3b0e4a2 100644 --- a/interactivetool_wilson.xml +++ b/interactivetool_wilson.xml @@ -1,7 +1,7 @@ Webbased Interactive Omics visualization - loosolab/wilson:2.1.0 + quay.io/bgruening/wilson-app From 88e3f31dea523ed69ebfc4fe64a5075dc7096f48 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 12 Oct 2019 00:37:59 +0200 Subject: [PATCH 026/853] fix phinch IE --- interactivetool_phinch.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/interactivetool_phinch.xml b/interactivetool_phinch.xml index d77c9274ad35..382cf32f0a9f 100644 --- a/interactivetool_phinch.xml +++ b/interactivetool_phinch.xml @@ -1,4 +1,4 @@ - + shiltemann/docker-phinch-galaxy:16.04 @@ -11,12 +11,14 @@ ## ToDo nginx, proxy.conf etc can be removed from the container #import os - #set $name = os.path.splitext(str($infile.display_name))[0] + #set $name = os.path.splitext(str($infile.display_name).replace(' ', '_'))[0] ## in case someone names the data testdata. rm /home/Phinch/data/testdata.biom | true && - ln -s '$infile' /home/Phinch/data/${name}.biom && + ln -s '$infile' '/home/Phinch/data/${name}.biom' && cd /home/Phinch/data && sed -i "s/'REPLACE_ME'/'${name}.biom'/g" /home/Phinch/scripts/readFile.js && + sed -i "s/http/https/g" /home/Phinch/scripts/readFile.js && + ## keep it running cd /home/Phinch && php -S 0.0.0.0:80 2>&1 > /var/log/phinch.log From edd4da31e3a8077424cc3524bc4e988c74a17ddc Mon Sep 17 00:00:00 2001 From: root Date: Sat, 12 Oct 2019 12:16:45 +0200 Subject: [PATCH 027/853] Update Askomics. --- interactivetool_askomics.xml | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/interactivetool_askomics.xml b/interactivetool_askomics.xml index c1ce9d3bd115..b4cb6bff0d18 100644 --- a/interactivetool_askomics.xml +++ b/interactivetool_askomics.xml @@ -1,17 +1,17 @@ - a visual SPARQL query builder + AskOmics, a visual SPARQL query builder - quay.io/askomics/askomics-ie:17.12_g19.09 + askomics/askomics-ie:19.01.3 6543 - /login_api_gie?key=abcd + /login_api_gie?key=${__user_name__} ${__app__.config.galaxy_infrastructure_url} - + #if $__user__: #for $api_key in $__user__.api_keys: ${api_key.key} @@ -19,15 +19,26 @@ #end for #end if + ${__user_name__} + ${__user_email__} + ${__user_name__} + From 30424102deb606e69b8e29505d722bdee298d821 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 12 Oct 2019 16:35:42 +0200 Subject: [PATCH 028/853] make bam.io.bio work --- interactivetool_bam_iobio.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interactivetool_bam_iobio.xml b/interactivetool_bam_iobio.xml index 2f1c531861ca..6c78eaa335b6 100644 --- a/interactivetool_bam_iobio.xml +++ b/interactivetool_bam_iobio.xml @@ -21,6 +21,9 @@ sed -i "s@\"wss://services.iobio.io/bamstatsalive/\"@((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + \"/bamstatsalive/\"@" js/bam.iobio.js/bam.iobio.js && sed -i "s@\"wss://services.iobio.io/samheader/\"@((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + \"/samheader/\"@" js/bam.iobio.js/bam.iobio.js && + + sed -i 's/deny all;//g' /etc/nginx/nginx.conf && + cp '${infile}' /input/bamfile.bam && cp '${infile.metadata.bam_index}' /input/bamfile.bam.bai && mkdir /var/log/supervisor/ && From fec1801d07540dccb0af8d20c71833f659b97961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Preu=C3=9Fner?= Date: Mon, 14 Oct 2019 14:43:40 +0200 Subject: [PATCH 029/853] Handle env vars; updated container to latest tag --- interactivetool_wilson.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/interactivetool_wilson.xml b/interactivetool_wilson.xml index 302ff3b0e4a2..c362a758c4ea 100644 --- a/interactivetool_wilson.xml +++ b/interactivetool_wilson.xml @@ -1,7 +1,7 @@ Webbased Interactive Omics visualization - quay.io/bgruening/wilson-app + loosolab/wilson:2.1.1 @@ -10,9 +10,12 @@ feature_selection + true /home/shiny/.Renviron && + echo $WILSON_BLACKLIST_EXAMPLES >> /home/shiny/.Renviron && ln -s ${infile} /srv/shiny-server/external_data/input.clarion && exec shiny-server 2>&1 ]]> From a4f9346b67fbf35fef2c8211d323a5bfb5ba3d3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Preu=C3=9Fner?= Date: Wed, 16 Oct 2019 09:39:31 +0200 Subject: [PATCH 030/853] Fixed bug in command for .Renviron construction --- interactivetool_wilson.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interactivetool_wilson.xml b/interactivetool_wilson.xml index c362a758c4ea..7f575c43a636 100644 --- a/interactivetool_wilson.xml +++ b/interactivetool_wilson.xml @@ -14,8 +14,8 @@ /home/shiny/.Renviron && - echo $WILSON_BLACKLIST_EXAMPLES >> /home/shiny/.Renviron && + echo "WILSON_LANDING_PAGE=\$WILSON_LANDING_PAGE" > /home/shiny/.Renviron && + echo "WILSON_BLACKLIST_EXAMPLES=\$WILSON_BLACKLIST_EXAMPLES" >> /home/shiny/.Renviron && ln -s ${infile} /srv/shiny-server/external_data/input.clarion && exec shiny-server 2>&1 ]]> From c136c13c5b4bc947ff9dad803c1fd60d818f958f Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Wed, 16 Oct 2019 14:26:04 +0200 Subject: [PATCH 031/853] add wallace IT --- interactivetool_wallace.xml | 53 +++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 interactivetool_wallace.xml diff --git a/interactivetool_wallace.xml b/interactivetool_wallace.xml new file mode 100644 index 000000000000..83d70d19f0ca --- /dev/null +++ b/interactivetool_wallace.xml @@ -0,0 +1,53 @@ + + Webbased Interactive modeling of species niches and distributions + + quay.io/bgruening/wilson-app + + + + 3838 + /sample-apps/SIG/wallace/shiny/ + + + + ${__app__.security.encode_id($jupyter_notebook.history_id)} + ${__app__.config.galaxy_infrastructure_url} + 8080 + ${__app__.config.galaxy_infrastructure_url} + + #if $__user__: + #for $api_key in $__user__.api_keys: + ${api_key.key} + #break + #end for + #end if + + + + + + + + + + + + + +`_ is a modular platform for reproducible modeling of species niches and distributions. + +.. class:: infomark + + + +]]> + + + 10.1111/2041-210X.12945 + + From fae69abcf39a1833dfda755114627c35b2d6dffa Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Wed, 16 Oct 2019 14:39:58 +0200 Subject: [PATCH 032/853] some updates --- interactivetool_wallace.xml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/interactivetool_wallace.xml b/interactivetool_wallace.xml index 83d70d19f0ca..6a36204caaff 100644 --- a/interactivetool_wallace.xml +++ b/interactivetool_wallace.xml @@ -1,7 +1,7 @@ Webbased Interactive modeling of species niches and distributions - quay.io/bgruening/wilson-app + ylebras/wallace-docker @@ -32,18 +32,30 @@ - + `_ is a modular platform for reproducible modeling of species niches and distributions. .. class:: infomark +Example input file (TAB separated):: + "name" "longitude" "latitude" "countryCode" + Accipiter striatus Vieillot, 1808 -60.291838 46.328137 CA + Accipiter striatus Vieillot, 1808 -114.58927 35.022485 US + Accipiter striatus Vieillot, 1808 -93.37406 30.00586 US + Accipiter striatus Vieillot, 1808 -79.336288 43.682218 CA + Accipiter striatus Vieillot, 1808 -109.156024 31.904185 US + Accipiter striatus Vieillot, 1808 -71.098031 42.297408 US + Accipiter striatus Vieillot, 1808 -110.927215 32.18203 US ]]> From 0d6bc47d2ea2b55eab60f8487978e55635e4f85e Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Wed, 16 Oct 2019 16:34:10 +0200 Subject: [PATCH 033/853] Update interactivetool_wallace.xml --- interactivetool_wallace.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interactivetool_wallace.xml b/interactivetool_wallace.xml index 6a36204caaff..66001ee97b9f 100644 --- a/interactivetool_wallace.xml +++ b/interactivetool_wallace.xml @@ -29,10 +29,10 @@ ]]> - + - + @@ -42,7 +42,7 @@ -`Wallace `_ is a modular platform for reproducible modeling of species niches and distributions. +`Wallace `_ is a flexible platform for reproducible modeling of species niches and distributions. .. class:: infomark From b6f4fbb1a54657b6d5be4d350f7364652a992c1b Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Wed, 16 Oct 2019 17:05:44 +0200 Subject: [PATCH 034/853] update container input dataset folder After verification --- interactivetool_wallace.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interactivetool_wallace.xml b/interactivetool_wallace.xml index 66001ee97b9f..5dbf29dfd30b 100644 --- a/interactivetool_wallace.xml +++ b/interactivetool_wallace.xml @@ -24,7 +24,7 @@ From b831ce30d1753081d0f95b1bea86cabaa6a86038 Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Wed, 16 Oct 2019 17:35:00 +0200 Subject: [PATCH 035/853] only consider csv occurence file as input for now --- interactivetool_wallace.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interactivetool_wallace.xml b/interactivetool_wallace.xml index 5dbf29dfd30b..b860dd012679 100644 --- a/interactivetool_wallace.xml +++ b/interactivetool_wallace.xml @@ -29,10 +29,10 @@ ]]> - + - + From f91eb0679ffb88bbe448daa6de4ee5c6c63b2a92 Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Wed, 16 Oct 2019 17:46:12 +0200 Subject: [PATCH 036/853] As we will use Galaxy_helper no need to import data on the fly --- interactivetool_wallace.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/interactivetool_wallace.xml b/interactivetool_wallace.xml index b860dd012679..cd958ee3d6cc 100644 --- a/interactivetool_wallace.xml +++ b/interactivetool_wallace.xml @@ -24,7 +24,6 @@ From 7a75856cd19c83ef5eecf15fce9f7f3af0e5d40c Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Wed, 16 Oct 2019 17:57:14 +0200 Subject: [PATCH 037/853] comment input and output --- interactivetool_wallace.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interactivetool_wallace.xml b/interactivetool_wallace.xml index cd958ee3d6cc..14b03ac3d3df 100644 --- a/interactivetool_wallace.xml +++ b/interactivetool_wallace.xml @@ -28,10 +28,10 @@ ]]> - + - + From 7bdf4c9c0901924d30effc784c53aa748dd5b78a Mon Sep 17 00:00:00 2001 From: root Date: Wed, 16 Oct 2019 19:29:53 +0200 Subject: [PATCH 038/853] wallace changes --- interactivetool_wallace.xml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/interactivetool_wallace.xml b/interactivetool_wallace.xml index 14b03ac3d3df..4d8e2c5353b0 100644 --- a/interactivetool_wallace.xml +++ b/interactivetool_wallace.xml @@ -4,13 +4,14 @@ ylebras/wallace-docker - + 3838 /sample-apps/SIG/wallace/shiny/ - ${__app__.security.encode_id($jupyter_notebook.history_id)} + + ${__app__.security.encode_id($outfile.history_id)} ${__app__.config.galaxy_infrastructure_url} 8080 ${__app__.config.galaxy_infrastructure_url} @@ -24,14 +25,16 @@ - + From 4dd4f0bbe25ac9674e8318f3f5cab7d4e4df7a68 Mon Sep 17 00:00:00 2001 From: Mason Date: Mon, 21 Oct 2019 21:32:14 -0700 Subject: [PATCH 039/853] Added update_time trigger functions and timestamp fields --- lib/galaxy/model/mapping.py | 3 +- .../versions/0155_add_content_update_time.py | 104 ---------- .../versions/0160_add_content_update_time.py | 188 ++++++++++++++++++ 3 files changed, 190 insertions(+), 105 deletions(-) delete mode 100644 lib/galaxy/model/migrate/versions/0155_add_content_update_time.py create mode 100644 lib/galaxy/model/migrate/versions/0160_add_content_update_time.py diff --git a/lib/galaxy/model/mapping.py b/lib/galaxy/model/mapping.py index 4d60b062b6e5..fc7260ddee2a 100644 --- a/lib/galaxy/model/mapping.py +++ b/lib/galaxy/model/mapping.py @@ -906,7 +906,8 @@ Column("implicit_output_name", Unicode(255), nullable=True), Column("job_id", ForeignKey("job.id"), index=True, nullable=True), Column("implicit_collection_jobs_id", ForeignKey("implicit_collection_jobs.id"), index=True, nullable=True), -) + Column("create_time", DateTime, default=now), + Column("update_time", DateTime, default=now, onupdate=now)) model.LibraryDatasetCollectionAssociation.table = Table( "library_dataset_collection_association", metadata, diff --git a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py deleted file mode 100644 index 5c78b30b2c76..000000000000 --- a/lib/galaxy/model/migrate/versions/0155_add_content_update_time.py +++ /dev/null @@ -1,104 +0,0 @@ -""" -Adds trigger to dataset table to update history.update_time when -contents are changed. -""" -from __future__ import print_function - -import logging - -from sqlalchemy import DDL, MetaData - -log = logging.getLogger(__name__) -metadata = MetaData() - - -def upgrade(migrate_engine): - print(__doc__) - metadata.bind = migrate_engine - metadata.reflect() - drop_update_trigger(migrate_engine) - install_update_trigger(migrate_engine) - - -def downgrade(migrate_engine): - metadata.bind = migrate_engine - metadata.reflect() - drop_update_trigger(migrate_engine) - - -def install_update_trigger(migrate_engine): - """Installs trigger on database table to update history table - when contents have changed. Installs a function and a trigger - for postgres, other sql variants only require the trigger def - """ - - if migrate_engine.name in ['postgres', 'postgresql']: - pg_create_trigger = DDL(""" - CREATE FUNCTION update_history_update_time() - RETURNS trigger - LANGUAGE 'plpgsql' - AS $BODY$ - BEGIN - UPDATE history h - SET update_time = current_timestamp - FROM history_dataset_association hda - WHERE h.id = hda.history_id - AND hda.dataset_id = NEW.id; - RETURN NEW; - END; - $BODY$; - CREATE TRIGGER trigger_dataset_aidur - AFTER INSERT OR DELETE OR UPDATE - ON dataset - FOR EACH ROW - EXECUTE PROCEDURE update_history_update_time(); - """) - pg_create_trigger.execute(bind=migrate_engine) - else: - # Looks like sqlite doesn't like multiple actions in some - # variants, so we build 3 triggers - build_trigger('INSERT').execute(bind=migrate_engine) - build_trigger('UPDATE').execute(bind=migrate_engine) - build_trigger('DELETE').execute(bind=migrate_engine) - - -def drop_update_trigger(migrate_engine): - """Drops trigger on dataset table.""" - - if migrate_engine.name in ['postgres', 'postgresql']: - pg_drop_trigger = DDL(""" - DROP TRIGGER IF EXISTS trigger_dataset_aidur ON dataset; - DROP FUNCTION IF EXISTS update_history_update_time(); - """) - pg_drop_trigger.execute(bind=migrate_engine) - else: - build_drop_trigger('INSERT').execute(bind=migrate_engine) - build_drop_trigger('UPDATE').execute(bind=migrate_engine) - build_drop_trigger('DELETE').execute(bind=migrate_engine) - - -def build_trigger(op): - create_trigger_template = """ - CREATE TRIGGER trigger_dataset_a{op_initial}r - AFTER {operation} - ON dataset - FOR EACH ROW - BEGIN - UPDATE history - SET update_time = current_timestamp - WHERE id IN ( - SELECT hda.history_id - FROM history_dataset_association AS hda - WHERE hda.dataset_id = {rowset}.id - ); - END; - """ - rs = 'OLD' if op == 'DELETE' else 'NEW' - sql = create_trigger_template.format(operation=op, rowset=rs, op_initial=op.lower()[0]) - return DDL(sql) - - -def build_drop_trigger(op): - drop_template = 'DROP TRIGGER IF EXISTS trigger_dataset_a{op_initial}r;' - sql = drop_template.format(op_initial=op.lower()[0]) - return DDL(sql) diff --git a/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py new file mode 100644 index 000000000000..72fb1597c3a3 --- /dev/null +++ b/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py @@ -0,0 +1,188 @@ +""" +Adds timestamps to hdac table. Adds triggers to dataset, hda, hdac tables +to update history.update_time when contents are changed. +""" +from __future__ import print_function + +import datetime +import logging + +from sqlalchemy import Column, DateTime, DDL, MetaData, Table + +from galaxy.model.migrate.versions.util import add_column, drop_column + +log = logging.getLogger(__name__) +metadata = MetaData() + + +def upgrade(migrate_engine): + print(__doc__) + metadata.bind = migrate_engine + metadata.reflect() + create_timestamps(metadata, "history_dataset_collection_association") + drop_update_trigger(migrate_engine) + install_update_trigger(migrate_engine) + + +def downgrade(migrate_engine): + metadata.bind = migrate_engine + metadata.reflect() + drop_update_trigger(migrate_engine) + drop_timestamps(metadata, "history_dataset_collection_association") + + +def install_update_trigger(migrate_engine): + """Installs trigger on dataset table to update history table + when contents have changed. Installs a function and a trigger + for postgres, other sql variants only require the trigger def + """ + + if migrate_engine.name in ['postgres', 'postgresql']: + pg_create_trigger = DDL(""" + CREATE FUNCTION update_hda_update_time() + RETURNS trigger + LANGUAGE 'plpgsql' + AS $BODY$ + BEGIN + UPDATE history_dataset_association hda + SET update_time = (now() at time zone 'utc') + WHERE hda.dataset_id = NEW.id; + RETURN NEW; + END; + $BODY$; + + CREATE FUNCTION update_history_update_time() + RETURNS trigger + LANGUAGE 'plpgsql' + AS $BODY$ + BEGIN + UPDATE history h + SET update_time = (now() at time zone 'utc') + WHERE h.id = NEW.history_id; + RETURN NEW; + END; + $BODY$; + + CREATE TRIGGER trigger_dataset_aidur + AFTER INSERT OR DELETE OR UPDATE + ON dataset + FOR EACH ROW + EXECUTE PROCEDURE update_hda_update_time(); + + CREATE TRIGGER trigger_hda_aidur + AFTER INSERT OR DELETE OR UPDATE + ON history_dataset_association + FOR EACH ROW + EXECUTE PROCEDURE update_history_update_time(); + + CREATE TRIGGER trigger_hdca_aidur + AFTER INSERT OR DELETE OR UPDATE + ON history_dataset_collection_association + FOR EACH ROW + EXECUTE PROCEDURE update_history_update_time(); + """) + pg_create_trigger.execute(bind=migrate_engine) + else: + install_trigger('INSERT', migrate_engine) + install_trigger('UPDATE', migrate_engine) + install_trigger('DELETE', migrate_engine) + + +def drop_update_trigger(migrate_engine): + """Drops trigger on dataset table.""" + + if migrate_engine.name in ['postgres', 'postgresql']: + drop_trigger_stmt = """ + DROP TRIGGER IF EXISTS trigger_hdca_aidur ON history_dataset_collection_association; + DROP TRIGGER IF EXISTS trigger_hda_aidur ON history_dataset_association; + DROP TRIGGER IF EXISTS trigger_dataset_aidur ON dataset; + DROP FUNCTION IF EXISTS update_hda_update_time(); + DROP FUNCTION IF EXISTS update_history_update_time(); + """ + pg_drop_trigger = DDL(drop_trigger_stmt) + pg_drop_trigger.execute(bind=migrate_engine) + else: + build_drop_trigger('INSERT', migrate_engine) + build_drop_trigger('UPDATE', migrate_engine) + build_drop_trigger('DELETE', migrate_engine) + + +def install_trigger(op, migrate_engine): + """Installs a single trigger""" + + dataset_trigger = """ + CREATE TRIGGER trigger_dataset_a{op_initial}r + AFTER {operation} + ON dataset + FOR EACH ROW + BEGIN + UPDATE history_dataset_association + SET update_time = current_timestamp + WHERE dataset_id = {rowset}.id; + END; + """ + + hda_trigger = """ + CREATE TRIGGER trigger_hda_a{op_initial}r + AFTER {operation} + ON history_dataset_association + FOR EACH ROW + BEGIN + UPDATE history + SET update_time = current_timestamp + WHERE id = {rowset}.history_id; + END; + """ + + hdca_trigger = """ + CREATE TRIGGER trigger_hdca_a{op_initial}r + AFTER {operation} + ON history_dataset_collection_association + FOR EACH ROW + BEGIN + UPDATE history + SET update_time = current_timestamp + WHERE id = {rowset}.history_id; + END; + """ + + statements = [ + dataset_trigger, + hda_trigger, + hdca_trigger + ] + + rs = 'OLD' if op == 'DELETE' else 'NEW' + + for statement in statements: + sql = statement.format(operation=op, rowset=rs, op_initial=op.lower()[0]) + create_trigger = DDL(sql) + create_trigger.execute(bind=migrate_engine) + + +def build_drop_trigger(op, migrate_engine): + statements = [ + "DROP TRIGGER IF EXISTS trigger_dataset_a{op_initial}r;", + "DROP TRIGGER IF EXISTS trigger_hdca_a{op_initial}r;", + "DROP TRIGGER IF EXISTS trigger_hda_a{op_initial}r;" + ] + + for statement in statements: + sql = statement.format(op_initial=op.lower()[0]) + drop_trigger = DDL(sql) + drop_trigger.execute(bind=migrate_engine) + + +def create_timestamps(metadata, table_name): + now = datetime.datetime.utcnow + create_time_column = Column("create_time", DateTime, default=now) + update_time_column = Column("update_time", DateTime, default=now, onupdate=now) + target_table = Table(table_name, metadata, autoload=True) + add_column(create_time_column, target_table, metadata) + add_column(update_time_column, target_table, metadata) + + +def drop_timestamps(metadata, table_name): + target_table = Table(table_name, metadata, autoload=True) + drop_column("create_time", target_table) + drop_column("update_time", target_table) From cdc31f6ceed82b5db9c69e898e88da010b26b800 Mon Sep 17 00:00:00 2001 From: Mason Date: Mon, 21 Oct 2019 22:55:40 -0700 Subject: [PATCH 040/853] added timestamp filters to api --- lib/galaxy/managers/base.py | 4 ++-- lib/galaxy/managers/hdas.py | 8 +++++++- lib/galaxy/managers/histories.py | 5 +++++ lib/galaxy/managers/history_contents.py | 8 ++++++-- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/galaxy/managers/base.py b/lib/galaxy/managers/base.py index 26b0fe2e01bd..fb25e4e1ddaa 100644 --- a/lib/galaxy/managers/base.py +++ b/lib/galaxy/managers/base.py @@ -935,8 +935,8 @@ def _add_parsers(self): 'encoded_id' : {'column' : 'id', 'op': ('in'), 'val': self.parse_id_list}, # dates can be directly passed through the orm into a filter (no need to parse into datetime object) 'extension' : {'op': ('eq', 'like', 'in')}, - 'create_time' : {'op': ('le', 'ge'), 'val': self.parse_date}, - 'update_time' : {'op': ('le', 'ge'), 'val': self.parse_date}, + 'create_time' : {'op': ('le', 'ge', 'lt', 'gt'), 'val': self.parse_date}, + 'update_time' : {'op': ('le', 'ge', 'lt', 'gt'), 'val': self.parse_date}, }) def parse_filters(self, filter_tuple_list): diff --git a/lib/galaxy/managers/hdas.py b/lib/galaxy/managers/hdas.py index 2673ef53059b..d5c12ec18702 100644 --- a/lib/galaxy/managers/hdas.py +++ b/lib/galaxy/managers/hdas.py @@ -293,7 +293,8 @@ def __init__(self, app): 'display_apps', 'display_types', - 'visualizations', + # 'visualizations', + 'viz_count', 'validated_state', 'validated_state_message', @@ -340,6 +341,7 @@ def add_serializers(self): 'display_apps' : self.serialize_display_apps, 'display_types' : self.serialize_old_display_applications, 'visualizations': self.serialize_visualization_links, + 'viz_count' : self.visualization_links_count, # 'url' : url_for( 'history_content_typed', history_id=encoded_history_id, id=encoded_id, type="dataset" ), # TODO: this intermittently causes a routes.GenerationException - temp use the legacy route to prevent this @@ -417,6 +419,10 @@ def serialize_old_display_applications(self, hda, key, trans=None, **context): return display_apps + def visualization_links_count(self, hda, key, trans=None, **context): + links = self.serialize_visualization_links(hda, key, trans) + return len(links) + def serialize_visualization_links(self, hda, key, trans=None, **context): """ Return a list of dictionaries with links to visualization pages diff --git a/lib/galaxy/managers/histories.py b/lib/galaxy/managers/histories.py index 31fbaf86c0e0..acbab61c6bd4 100644 --- a/lib/galaxy/managers/histories.py +++ b/lib/galaxy/managers/histories.py @@ -221,7 +221,9 @@ def __init__(self, app, **kwargs): #: ..note: this is a custom view for newer (2016/3) UI and should be considered volatile self.add_view('dev-detailed', [ 'contents_url', + 'empty', 'size', + 'nice_size', 'user_id', 'create_time', 'update_time', @@ -232,6 +234,7 @@ def __init__(self, app, **kwargs): # 'contents_states', 'contents_active', 'hid_counter', + 'non_ready_jobs' ], include_keys_from='summary') # assumes: outgoing to json.dumps and sanitized @@ -393,4 +396,6 @@ def _add_parsers(self): # history specific 'name' : {'op': ('eq', 'contains', 'like')}, 'genome_build' : {'op': ('eq', 'contains', 'like')}, + 'create_time' : {'op': ('le', 'ge', 'gt', 'lt'), 'val': self.parse_date}, + 'update_time' : {'op': ('le', 'ge', 'gt', 'lt'), 'val': self.parse_date}, }) diff --git a/lib/galaxy/managers/history_contents.py b/lib/galaxy/managers/history_contents.py index 2b51ea99647d..3280edcddfe8 100644 --- a/lib/galaxy/managers/history_contents.py +++ b/lib/galaxy/managers/history_contents.py @@ -492,6 +492,10 @@ def get_filter(attr, op, val): return sql.column(attr) >= self.parse_date(val) if op == 'le': return sql.column(attr) <= self.parse_date(val) + if op == 'gt': + return sql.column(attr) > self.parse_date(val) + if op == 'lt': + return sql.column(attr) < self.parse_date(val) self.raise_filter_err(attr, op, val, 'bad op in filter') if attr == 'state': @@ -539,6 +543,6 @@ def _add_parsers(self): 'name' : {'op': ('eq', 'contains', 'like')}, 'state' : {'op': ('eq', 'in')}, 'visible' : {'op': ('eq'), 'val': self.parse_bool}, - 'create_time' : {'op': ('le', 'ge'), 'val': self.parse_date}, - 'update_time' : {'op': ('le', 'ge'), 'val': self.parse_date}, + 'create_time' : {'op': ('le', 'ge', 'lt', 'gt'), 'val': self.parse_date}, + 'update_time' : {'op': ('le', 'ge', 'lt', 'gt'), 'val': self.parse_date}, }) From 018e2202c89e96c30161ec4e0d75ef8fbf62b25a Mon Sep 17 00:00:00 2001 From: Mason Date: Tue, 22 Oct 2019 09:08:29 -0700 Subject: [PATCH 041/853] removed features accidentally copied from another working branch --- lib/galaxy/managers/hdas.py | 8 +------- lib/galaxy/managers/histories.py | 3 --- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/lib/galaxy/managers/hdas.py b/lib/galaxy/managers/hdas.py index d5c12ec18702..2673ef53059b 100644 --- a/lib/galaxy/managers/hdas.py +++ b/lib/galaxy/managers/hdas.py @@ -293,8 +293,7 @@ def __init__(self, app): 'display_apps', 'display_types', - # 'visualizations', - 'viz_count', + 'visualizations', 'validated_state', 'validated_state_message', @@ -341,7 +340,6 @@ def add_serializers(self): 'display_apps' : self.serialize_display_apps, 'display_types' : self.serialize_old_display_applications, 'visualizations': self.serialize_visualization_links, - 'viz_count' : self.visualization_links_count, # 'url' : url_for( 'history_content_typed', history_id=encoded_history_id, id=encoded_id, type="dataset" ), # TODO: this intermittently causes a routes.GenerationException - temp use the legacy route to prevent this @@ -419,10 +417,6 @@ def serialize_old_display_applications(self, hda, key, trans=None, **context): return display_apps - def visualization_links_count(self, hda, key, trans=None, **context): - links = self.serialize_visualization_links(hda, key, trans) - return len(links) - def serialize_visualization_links(self, hda, key, trans=None, **context): """ Return a list of dictionaries with links to visualization pages diff --git a/lib/galaxy/managers/histories.py b/lib/galaxy/managers/histories.py index acbab61c6bd4..7c231537c345 100644 --- a/lib/galaxy/managers/histories.py +++ b/lib/galaxy/managers/histories.py @@ -221,9 +221,7 @@ def __init__(self, app, **kwargs): #: ..note: this is a custom view for newer (2016/3) UI and should be considered volatile self.add_view('dev-detailed', [ 'contents_url', - 'empty', 'size', - 'nice_size', 'user_id', 'create_time', 'update_time', @@ -234,7 +232,6 @@ def __init__(self, app, **kwargs): # 'contents_states', 'contents_active', 'hid_counter', - 'non_ready_jobs' ], include_keys_from='summary') # assumes: outgoing to json.dumps and sanitized From 335499fc5449dfd7ff38104ac84f5e522220425c Mon Sep 17 00:00:00 2001 From: Mason Date: Wed, 23 Oct 2019 10:25:01 -0700 Subject: [PATCH 042/853] changed triggers to before update, added conditional column adds --- .../versions/0160_add_content_update_time.py | 80 ++++++++++--------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py index 72fb1597c3a3..02f2291f89b9 100644 --- a/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py +++ b/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py @@ -28,7 +28,7 @@ def downgrade(migrate_engine): metadata.bind = migrate_engine metadata.reflect() drop_update_trigger(migrate_engine) - drop_timestamps(metadata, "history_dataset_collection_association") + # drop_timestamps(metadata, "history_dataset_collection_association") def install_update_trigger(migrate_engine): @@ -39,44 +39,46 @@ def install_update_trigger(migrate_engine): if migrate_engine.name in ['postgres', 'postgresql']: pg_create_trigger = DDL(""" - CREATE FUNCTION update_hda_update_time() + CREATE OR REPLACE FUNCTION update_hda_update_time() RETURNS trigger LANGUAGE 'plpgsql' AS $BODY$ BEGIN UPDATE history_dataset_association hda SET update_time = (now() at time zone 'utc') - WHERE hda.dataset_id = NEW.id; + WHERE hda.dataset_id = NEW.id + AND hda.update_time < (now() at time zone 'utc'); RETURN NEW; END; $BODY$; - CREATE FUNCTION update_history_update_time() + CREATE OR REPLACE FUNCTION update_history_update_time() RETURNS trigger LANGUAGE 'plpgsql' AS $BODY$ BEGIN UPDATE history h SET update_time = (now() at time zone 'utc') - WHERE h.id = NEW.history_id; + WHERE h.id = NEW.history_id + AND h.update_time < (now() at time zone 'utc'); RETURN NEW; END; $BODY$; - CREATE TRIGGER trigger_dataset_aidur - AFTER INSERT OR DELETE OR UPDATE + CREATE TRIGGER trigger_dataset_bidur + BEFORE INSERT OR DELETE OR UPDATE ON dataset FOR EACH ROW EXECUTE PROCEDURE update_hda_update_time(); - CREATE TRIGGER trigger_hda_aidur - AFTER INSERT OR DELETE OR UPDATE + CREATE TRIGGER trigger_hda_bidur + BEFORE INSERT OR DELETE OR UPDATE ON history_dataset_association FOR EACH ROW EXECUTE PROCEDURE update_history_update_time(); - CREATE TRIGGER trigger_hdca_aidur - AFTER INSERT OR DELETE OR UPDATE + CREATE TRIGGER trigger_hdca_bidur + BEFORE INSERT OR DELETE OR UPDATE ON history_dataset_collection_association FOR EACH ROW EXECUTE PROCEDURE update_history_update_time(); @@ -93,11 +95,8 @@ def drop_update_trigger(migrate_engine): if migrate_engine.name in ['postgres', 'postgresql']: drop_trigger_stmt = """ - DROP TRIGGER IF EXISTS trigger_hdca_aidur ON history_dataset_collection_association; - DROP TRIGGER IF EXISTS trigger_hda_aidur ON history_dataset_association; - DROP TRIGGER IF EXISTS trigger_dataset_aidur ON dataset; - DROP FUNCTION IF EXISTS update_hda_update_time(); - DROP FUNCTION IF EXISTS update_history_update_time(); + DROP FUNCTION IF EXISTS update_hda_update_time() CASCADE; + DROP FUNCTION IF EXISTS update_history_update_time() CASCADE; """ pg_drop_trigger = DDL(drop_trigger_stmt) pg_drop_trigger.execute(bind=migrate_engine) @@ -111,38 +110,41 @@ def install_trigger(op, migrate_engine): """Installs a single trigger""" dataset_trigger = """ - CREATE TRIGGER trigger_dataset_a{op_initial}r - AFTER {operation} + CREATE TRIGGER trigger_dataset_b{op_initial}r + BEFORE {operation} ON dataset FOR EACH ROW BEGIN UPDATE history_dataset_association SET update_time = current_timestamp - WHERE dataset_id = {rowset}.id; + WHERE dataset_id = {rowset}.id + AND update_time < current_timestamp; END; """ hda_trigger = """ - CREATE TRIGGER trigger_hda_a{op_initial}r - AFTER {operation} + CREATE TRIGGER trigger_hda_b{op_initial}r + BEFORE {operation} ON history_dataset_association FOR EACH ROW BEGIN UPDATE history SET update_time = current_timestamp - WHERE id = {rowset}.history_id; + WHERE id = {rowset}.history_id + AND update_time < current_timestamp; END; """ hdca_trigger = """ - CREATE TRIGGER trigger_hdca_a{op_initial}r - AFTER {operation} + CREATE TRIGGER trigger_hdca_b{op_initial}r + BEFORE {operation} ON history_dataset_collection_association FOR EACH ROW BEGIN UPDATE history SET update_time = current_timestamp - WHERE id = {rowset}.history_id; + WHERE id = {rowset}.history_id + AND update_time < current_timestamp; END; """ @@ -162,9 +164,9 @@ def install_trigger(op, migrate_engine): def build_drop_trigger(op, migrate_engine): statements = [ - "DROP TRIGGER IF EXISTS trigger_dataset_a{op_initial}r;", - "DROP TRIGGER IF EXISTS trigger_hdca_a{op_initial}r;", - "DROP TRIGGER IF EXISTS trigger_hda_a{op_initial}r;" + "DROP TRIGGER IF EXISTS trigger_dataset_b{op_initial}r;", + "DROP TRIGGER IF EXISTS trigger_hdca_b{op_initial}r;", + "DROP TRIGGER IF EXISTS trigger_hda_b{op_initial}r;" ] for statement in statements: @@ -175,14 +177,16 @@ def build_drop_trigger(op, migrate_engine): def create_timestamps(metadata, table_name): now = datetime.datetime.utcnow - create_time_column = Column("create_time", DateTime, default=now) - update_time_column = Column("update_time", DateTime, default=now, onupdate=now) target_table = Table(table_name, metadata, autoload=True) - add_column(create_time_column, target_table, metadata) - add_column(update_time_column, target_table, metadata) - - -def drop_timestamps(metadata, table_name): - target_table = Table(table_name, metadata, autoload=True) - drop_column("create_time", target_table) - drop_column("update_time", target_table) + if 'create_time' not in target_table.c: + create_time_column = Column("create_time", DateTime, default=now) + add_column(create_time_column, target_table, metadata) + if 'update_time' not in target_table.c: + update_time_column = Column("update_time", DateTime, default=now, onupdate=now) + add_column(update_time_column, target_table, metadata) + + +# def drop_timestamps(metadata, table_name): +# target_table = Table(table_name, metadata, autoload=True) +# drop_column("create_time", target_table) +# drop_column("update_time", target_table) From 4599cabec1100eab48286e6caa66d065061d9572 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 23 Oct 2019 19:43:04 +0200 Subject: [PATCH 043/853] update askomics to version 1.0 --- interactivetool_askomics.xml | 56 ++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/interactivetool_askomics.xml b/interactivetool_askomics.xml index b4cb6bff0d18..2dd06fe28ba2 100644 --- a/interactivetool_askomics.xml +++ b/interactivetool_askomics.xml @@ -1,16 +1,25 @@ - - AskOmics, a visual SPARQL query builder + + a visual SPARQL query builder - askomics/askomics-ie:19.01.3 + askomics/flaskomics-with-dependencies:3.1.1 - 6543 - /login_api_gie?key=${__user_name__} + 5000 + /loginapikey/${__user_name__} + + true + ${__user_name__} + Galaxy + ${__user_name__} + ${__user_email__} + ${__user_name__} + ${__app__.config.galaxy_infrastructure_url} + #if $__user__: #for $api_key in $__user__.api_keys: @@ -19,27 +28,26 @@ #end for #end if - ${__user_name__} - ${__user_email__} - ${__user_name__} + + prod + 1 + Galaxy + AskOmics Interactive Tool for Galaxy + /tmp/askomics-it + /tmp/askomics-it/database.db + http://localhost:5000 + + true + + 85000 + 65000 - + From 691b7f039781a3052706b5eb82ae1a53b5984d8b Mon Sep 17 00:00:00 2001 From: Mason Date: Wed, 23 Oct 2019 10:48:33 -0700 Subject: [PATCH 044/853] removed drop column because it was requested that update_time go in the initial db mappings --- .../model/migrate/versions/0160_add_content_update_time.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py index 02f2291f89b9..512c97c13cba 100644 --- a/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py +++ b/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py @@ -9,7 +9,7 @@ from sqlalchemy import Column, DateTime, DDL, MetaData, Table -from galaxy.model.migrate.versions.util import add_column, drop_column +from galaxy.model.migrate.versions.util import add_column log = logging.getLogger(__name__) metadata = MetaData() From 2ffb21c87b5e1da4315df67368755dc64a6127a0 Mon Sep 17 00:00:00 2001 From: Mason Date: Wed, 23 Oct 2019 11:58:18 -0700 Subject: [PATCH 045/853] restored drop-timestamps because this migration only operates on existing databases --- .../migrate/versions/0160_add_content_update_time.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py index 512c97c13cba..dbf8c84598ce 100644 --- a/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py +++ b/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py @@ -9,7 +9,7 @@ from sqlalchemy import Column, DateTime, DDL, MetaData, Table -from galaxy.model.migrate.versions.util import add_column +from galaxy.model.migrate.versions.util import add_column, drop_column log = logging.getLogger(__name__) metadata = MetaData() @@ -28,7 +28,7 @@ def downgrade(migrate_engine): metadata.bind = migrate_engine metadata.reflect() drop_update_trigger(migrate_engine) - # drop_timestamps(metadata, "history_dataset_collection_association") + drop_timestamps(metadata, "history_dataset_collection_association") def install_update_trigger(migrate_engine): @@ -186,7 +186,7 @@ def create_timestamps(metadata, table_name): add_column(update_time_column, target_table, metadata) -# def drop_timestamps(metadata, table_name): -# target_table = Table(table_name, metadata, autoload=True) -# drop_column("create_time", target_table) -# drop_column("update_time", target_table) +def drop_timestamps(metadata, table_name): + target_table = Table(table_name, metadata, autoload=True) + drop_column("create_time", target_table) + drop_column("update_time", target_table) From 954e54170f3fe416536de2eb5a1ecb5fcd48ace1 Mon Sep 17 00:00:00 2001 From: Mason Date: Thu, 24 Oct 2019 01:38:40 -0700 Subject: [PATCH 046/853] Referenced galaxy aliased orm.now --- .../model/migrate/versions/0160_add_content_update_time.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py index dbf8c84598ce..41efe6cbc670 100644 --- a/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py +++ b/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py @@ -4,13 +4,14 @@ """ from __future__ import print_function -import datetime import logging from sqlalchemy import Column, DateTime, DDL, MetaData, Table from galaxy.model.migrate.versions.util import add_column, drop_column +from galaxy.model.orm.now import now + log = logging.getLogger(__name__) metadata = MetaData() @@ -176,7 +177,6 @@ def build_drop_trigger(op, migrate_engine): def create_timestamps(metadata, table_name): - now = datetime.datetime.utcnow target_table = Table(table_name, metadata, autoload=True) if 'create_time' not in target_table.c: create_time_column = Column("create_time", DateTime, default=now) From 8bbc6f69feda269e8b04208cf9577c4381721954 Mon Sep 17 00:00:00 2001 From: Nate Coraor Date: Thu, 24 Oct 2019 17:12:21 -0400 Subject: [PATCH 047/853] Galaxy InteractiveTools cluster fixes from EU --- interactivetool_jupyter_notebook.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/interactivetool_jupyter_notebook.xml b/interactivetool_jupyter_notebook.xml index 9dd3e36d3ee4..60cdc00253f5 100644 --- a/interactivetool_jupyter_notebook.xml +++ b/interactivetool_jupyter_notebook.xml @@ -39,7 +39,7 @@ ## copy default notebook cp '$__tool_directory__/default_notebook.ipynb' ./ipython_galaxy_notebook.ipynb && jupyter trust ./ipython_galaxy_notebook.ipynb && - jupyter lab --no-browser --NotebookApp.shutdown_button=True && + jupyter lab --allow-root --no-browser --NotebookApp.shutdown_button=True && cp ./ipython_galaxy_notebook.ipynb '$jupyter_notebook' #else: @@ -50,7 +50,7 @@ #if $mode.run_it: jupyter nbconvert --to notebook --execute --output ./ipython_galaxy_notebook.ipynb --allow-errors ./*.ipynb && #else: - jupyter lab --no-browser --NotebookApp.shutdown_button=True && + jupyter lab --allow-root --no-browser --NotebookApp.shutdown_button=True && #end if cp ./ipython_galaxy_notebook.ipynb '$jupyter_notebook' #end if @@ -88,13 +88,13 @@ The Jupyter Notebook is an open-source web application that allows you to create and share documents that contain live code, equations, visualizations and narrative text. Uses include: data cleaning and transformation, numerical simulation, statistical modeling, data visualization, machine learning, and much more. - + Galaxy offers you to use Jupyter Notebooks directly in Galaxy accessing and interacting with Galaxy datasets as you like. A very common use-case is to do the heavy lifting and data reduction steps in Galaxy and the plotting and more `interactive` part on smaller datasets in Jupyter. - + You can start with a new Jupyter notebook from scratch or load an already existing one, e.g. from your collegue and execute it on your dataset. If you have a defined input dataset you can even execute a Jupyter notebook in a workflow, given that the notebook is writing the output back to the history. - + You can import data into the notebook via a predefined `get()` function and write results back to Galaxy with a `put()` function. From a408f3e479f4a17cf53756ddf106fbde009791ad Mon Sep 17 00:00:00 2001 From: John Chilton Date: Mon, 28 Oct 2019 15:58:40 -0400 Subject: [PATCH 048/853] Structured access to Galaxy internals for ITs. --- interactivetool_askomics.xml | 11 ++--------- interactivetool_jupyter_notebook.xml | 15 ++++----------- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/interactivetool_askomics.xml b/interactivetool_askomics.xml index c1ce9d3bd115..7f997b54e632 100644 --- a/interactivetool_askomics.xml +++ b/interactivetool_askomics.xml @@ -10,15 +10,8 @@ - ${__app__.config.galaxy_infrastructure_url} - - #if $__user__: - #for $api_key in $__user__.api_keys: - ${api_key.key} - #break - #end for - #end if - + $__galaxy_url + - ${__app__.security.encode_id($jupyter_notebook.history_id)} - ${__app__.config.galaxy_infrastructure_url} + $__history_id + $__galaxy_url 8080 - ${__app__.config.galaxy_infrastructure_url} - - #if $__user__: - #for $api_key in $__user__.api_keys: - ${api_key.key} - #break - #end for - #end if - + $__galaxy_url + Date: Tue, 29 Oct 2019 08:29:02 -0400 Subject: [PATCH 049/853] Cleanup structured IT internals access commit. - Unit test fixes and added tests. - Change __history_id to __history_id__ per comment from @bgruening --- interactivetool_askomics.xml | 2 +- interactivetool_jupyter_notebook.xml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/interactivetool_askomics.xml b/interactivetool_askomics.xml index 7f997b54e632..b5f0b4d56a4a 100644 --- a/interactivetool_askomics.xml +++ b/interactivetool_askomics.xml @@ -10,7 +10,7 @@ - $__galaxy_url + $__galaxy_url__ - $__history_id - $__galaxy_url + $__history_id__ + $__galaxy_url__ 8080 - $__galaxy_url + $__galaxy_url__ Date: Tue, 12 Nov 2019 00:59:32 +0100 Subject: [PATCH 050/853] add pyiron tool --- interactivetool_pyiron.xml | 96 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 interactivetool_pyiron.xml diff --git a/interactivetool_pyiron.xml b/interactivetool_pyiron.xml new file mode 100644 index 000000000000..d56abbb3b666 --- /dev/null +++ b/interactivetool_pyiron.xml @@ -0,0 +1,96 @@ + + + quay.io/bgruening/docker-jupyter-notebook:pyiron + + + + 8888 + ipython/lab + + + + $__history_id__ + $__galaxy_url__ + 8080 + $__galaxy_url__ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pyiron - an integrated development environment (IDE) for computational materials science. It combines several tools in a common platform: + + The Jupyter Notebook is an open-source web application that allows you to create and share documents that contain live code, equations, + visualizations and narrative text. Uses include: data cleaning and transformation, numerical simulation, statistical modeling, data visualization, + machine learning, and much more. + + Galaxy offers you to use Jupyter Notebooks directly in Galaxy accessing and interacting with Galaxy datasets as you like. A very common use-case is to + do the heavy lifting and data reduction steps in Galaxy and the plotting and more `interactive` part on smaller datasets in Jupyter. + + You can start with a new Jupyter notebook from scratch or load an already existing one, e.g. from your collegue and execute it on your dataset. + If you have a defined input dataset you can even execute a Jupyter notebook in a workflow, given that the notebook is writing the output back to the history. + + You can import data into the notebook via a predefined `get()` function and write results back to Galaxy with a `put()` function. + + From 9eabec14dffb25a8a69bf8d186d26f710fd7db76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gr=C3=BCning?= Date: Tue, 12 Nov 2019 09:37:05 +0100 Subject: [PATCH 051/853] add new envs to pyiron --- interactivetool_pyiron.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interactivetool_pyiron.xml b/interactivetool_pyiron.xml index d56abbb3b666..0f5ac65a00f1 100644 --- a/interactivetool_pyiron.xml +++ b/interactivetool_pyiron.xml @@ -14,10 +14,13 @@ 8080 $__galaxy_url__ + /home/jovyan/resources Date: Tue, 12 Nov 2019 10:48:13 +0100 Subject: [PATCH 052/853] small edits to pyiron --- interactivetool_pyiron.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interactivetool_pyiron.xml b/interactivetool_pyiron.xml index 0f5ac65a00f1..9657bc87c3bd 100644 --- a/interactivetool_pyiron.xml +++ b/interactivetool_pyiron.xml @@ -3,7 +3,7 @@ quay.io/bgruening/docker-jupyter-notebook:pyiron - + 8888 ipython/lab @@ -70,7 +70,7 @@ - + From 8c752d470358d1fc561764299aa7a40092ba2ca9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gr=C3=BCning?= Date: Tue, 12 Nov 2019 10:55:57 +0100 Subject: [PATCH 053/853] use proper PWD --- interactivetool_pyiron.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interactivetool_pyiron.xml b/interactivetool_pyiron.xml index 9657bc87c3bd..68d590407278 100644 --- a/interactivetool_pyiron.xml +++ b/interactivetool_pyiron.xml @@ -18,8 +18,8 @@ Date: Tue, 12 Nov 2019 13:54:09 +0100 Subject: [PATCH 054/853] Update interactivetool_pyiron.xml --- interactivetool_pyiron.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/interactivetool_pyiron.xml b/interactivetool_pyiron.xml index 68d590407278..69caecdf71b7 100644 --- a/interactivetool_pyiron.xml +++ b/interactivetool_pyiron.xml @@ -29,6 +29,7 @@ ## change into the directory where the notebooks are located cd ./jupyter/ && + cp \${HOME}/examples/* ./ && export PATH=/home/jovyan/.local/bin:\$PATH && #if $mode.mode_select == 'scratch': From f953b39beacb6f628a08a6c5fba236891e0c214f Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Wed, 13 Nov 2019 16:29:48 +0100 Subject: [PATCH 055/853] add guacamole_desktop --- interactivetool_guacamole_desktop.xml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 interactivetool_guacamole_desktop.xml diff --git a/interactivetool_guacamole_desktop.xml b/interactivetool_guacamole_desktop.xml new file mode 100644 index 000000000000..a63ce1089911 --- /dev/null +++ b/interactivetool_guacamole_desktop.xml @@ -0,0 +1,26 @@ + + + cyverse/ubuntu18-xfce-desktop + + + + 8000 + + + + + + + + + + + + + Simple Ubuntu XFCE all-in-one desktop. + Username: "user" + Password: "password" + + From cbf5cd49c42164b7d1643029affe5145d159b543 Mon Sep 17 00:00:00 2001 From: Mason Date: Wed, 13 Nov 2019 15:13:17 -0800 Subject: [PATCH 056/853] Moved triggers into main model init re:8300 --- lib/galaxy/model/mapping.py | 2 + .../versions/0160_add_content_update_time.py | 192 ------------------ .../versions/0161_add_content_update_time.py | 47 +++++ lib/galaxy/model/triggers.py | 155 ++++++++++++++ 4 files changed, 204 insertions(+), 192 deletions(-) delete mode 100644 lib/galaxy/model/migrate/versions/0160_add_content_update_time.py create mode 100644 lib/galaxy/model/migrate/versions/0161_add_content_update_time.py create mode 100644 lib/galaxy/model/triggers.py diff --git a/lib/galaxy/model/mapping.py b/lib/galaxy/model/mapping.py index fb4b4a53a4b5..85b57324a65a 100644 --- a/lib/galaxy/model/mapping.py +++ b/lib/galaxy/model/mapping.py @@ -42,6 +42,7 @@ from galaxy.model.orm.engine_factory import build_engine from galaxy.model.orm.now import now from galaxy.model.security import GalaxyRBACAgent +from galaxy.model.triggers import install_timestamp_triggers log = logging.getLogger(__name__) @@ -2855,6 +2856,7 @@ def init(file_path, url, engine_options=None, create_tables=False, map_install_m # Create tables if needed if create_tables: metadata.create_all() + install_timestamp_triggers(engine) # metadata.engine.commit() result.create_tables = create_tables diff --git a/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py deleted file mode 100644 index 41efe6cbc670..000000000000 --- a/lib/galaxy/model/migrate/versions/0160_add_content_update_time.py +++ /dev/null @@ -1,192 +0,0 @@ -""" -Adds timestamps to hdac table. Adds triggers to dataset, hda, hdac tables -to update history.update_time when contents are changed. -""" -from __future__ import print_function - -import logging - -from sqlalchemy import Column, DateTime, DDL, MetaData, Table - -from galaxy.model.migrate.versions.util import add_column, drop_column - -from galaxy.model.orm.now import now - -log = logging.getLogger(__name__) -metadata = MetaData() - - -def upgrade(migrate_engine): - print(__doc__) - metadata.bind = migrate_engine - metadata.reflect() - create_timestamps(metadata, "history_dataset_collection_association") - drop_update_trigger(migrate_engine) - install_update_trigger(migrate_engine) - - -def downgrade(migrate_engine): - metadata.bind = migrate_engine - metadata.reflect() - drop_update_trigger(migrate_engine) - drop_timestamps(metadata, "history_dataset_collection_association") - - -def install_update_trigger(migrate_engine): - """Installs trigger on dataset table to update history table - when contents have changed. Installs a function and a trigger - for postgres, other sql variants only require the trigger def - """ - - if migrate_engine.name in ['postgres', 'postgresql']: - pg_create_trigger = DDL(""" - CREATE OR REPLACE FUNCTION update_hda_update_time() - RETURNS trigger - LANGUAGE 'plpgsql' - AS $BODY$ - BEGIN - UPDATE history_dataset_association hda - SET update_time = (now() at time zone 'utc') - WHERE hda.dataset_id = NEW.id - AND hda.update_time < (now() at time zone 'utc'); - RETURN NEW; - END; - $BODY$; - - CREATE OR REPLACE FUNCTION update_history_update_time() - RETURNS trigger - LANGUAGE 'plpgsql' - AS $BODY$ - BEGIN - UPDATE history h - SET update_time = (now() at time zone 'utc') - WHERE h.id = NEW.history_id - AND h.update_time < (now() at time zone 'utc'); - RETURN NEW; - END; - $BODY$; - - CREATE TRIGGER trigger_dataset_bidur - BEFORE INSERT OR DELETE OR UPDATE - ON dataset - FOR EACH ROW - EXECUTE PROCEDURE update_hda_update_time(); - - CREATE TRIGGER trigger_hda_bidur - BEFORE INSERT OR DELETE OR UPDATE - ON history_dataset_association - FOR EACH ROW - EXECUTE PROCEDURE update_history_update_time(); - - CREATE TRIGGER trigger_hdca_bidur - BEFORE INSERT OR DELETE OR UPDATE - ON history_dataset_collection_association - FOR EACH ROW - EXECUTE PROCEDURE update_history_update_time(); - """) - pg_create_trigger.execute(bind=migrate_engine) - else: - install_trigger('INSERT', migrate_engine) - install_trigger('UPDATE', migrate_engine) - install_trigger('DELETE', migrate_engine) - - -def drop_update_trigger(migrate_engine): - """Drops trigger on dataset table.""" - - if migrate_engine.name in ['postgres', 'postgresql']: - drop_trigger_stmt = """ - DROP FUNCTION IF EXISTS update_hda_update_time() CASCADE; - DROP FUNCTION IF EXISTS update_history_update_time() CASCADE; - """ - pg_drop_trigger = DDL(drop_trigger_stmt) - pg_drop_trigger.execute(bind=migrate_engine) - else: - build_drop_trigger('INSERT', migrate_engine) - build_drop_trigger('UPDATE', migrate_engine) - build_drop_trigger('DELETE', migrate_engine) - - -def install_trigger(op, migrate_engine): - """Installs a single trigger""" - - dataset_trigger = """ - CREATE TRIGGER trigger_dataset_b{op_initial}r - BEFORE {operation} - ON dataset - FOR EACH ROW - BEGIN - UPDATE history_dataset_association - SET update_time = current_timestamp - WHERE dataset_id = {rowset}.id - AND update_time < current_timestamp; - END; - """ - - hda_trigger = """ - CREATE TRIGGER trigger_hda_b{op_initial}r - BEFORE {operation} - ON history_dataset_association - FOR EACH ROW - BEGIN - UPDATE history - SET update_time = current_timestamp - WHERE id = {rowset}.history_id - AND update_time < current_timestamp; - END; - """ - - hdca_trigger = """ - CREATE TRIGGER trigger_hdca_b{op_initial}r - BEFORE {operation} - ON history_dataset_collection_association - FOR EACH ROW - BEGIN - UPDATE history - SET update_time = current_timestamp - WHERE id = {rowset}.history_id - AND update_time < current_timestamp; - END; - """ - - statements = [ - dataset_trigger, - hda_trigger, - hdca_trigger - ] - - rs = 'OLD' if op == 'DELETE' else 'NEW' - - for statement in statements: - sql = statement.format(operation=op, rowset=rs, op_initial=op.lower()[0]) - create_trigger = DDL(sql) - create_trigger.execute(bind=migrate_engine) - - -def build_drop_trigger(op, migrate_engine): - statements = [ - "DROP TRIGGER IF EXISTS trigger_dataset_b{op_initial}r;", - "DROP TRIGGER IF EXISTS trigger_hdca_b{op_initial}r;", - "DROP TRIGGER IF EXISTS trigger_hda_b{op_initial}r;" - ] - - for statement in statements: - sql = statement.format(op_initial=op.lower()[0]) - drop_trigger = DDL(sql) - drop_trigger.execute(bind=migrate_engine) - - -def create_timestamps(metadata, table_name): - target_table = Table(table_name, metadata, autoload=True) - if 'create_time' not in target_table.c: - create_time_column = Column("create_time", DateTime, default=now) - add_column(create_time_column, target_table, metadata) - if 'update_time' not in target_table.c: - update_time_column = Column("update_time", DateTime, default=now, onupdate=now) - add_column(update_time_column, target_table, metadata) - - -def drop_timestamps(metadata, table_name): - target_table = Table(table_name, metadata, autoload=True) - drop_column("create_time", target_table) - drop_column("update_time", target_table) diff --git a/lib/galaxy/model/migrate/versions/0161_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0161_add_content_update_time.py new file mode 100644 index 000000000000..7b85a4f68867 --- /dev/null +++ b/lib/galaxy/model/migrate/versions/0161_add_content_update_time.py @@ -0,0 +1,47 @@ +""" +Adds timestamps to hdac table. Adds triggers to dataset, hda, hdac tables +to update history.update_time when contents are changed. +""" +from __future__ import print_function + +import logging + +from sqlalchemy import Column, DateTime, MetaData, Table + +from galaxy.model.migrate.versions.util import add_column, drop_column +from galaxy.model.orm.now import now +from galaxy.model.triggers import drop_timestamp_triggers, install_timestamp_triggers + +log = logging.getLogger(__name__) +metadata = MetaData() + + +def upgrade(migrate_engine): + print(__doc__) + metadata.bind = migrate_engine + metadata.reflect() + create_timestamps(metadata, "history_dataset_collection_association") + install_timestamp_triggers(migrate_engine) + + +def downgrade(migrate_engine): + metadata.bind = migrate_engine + metadata.reflect() + drop_timestamp_triggers(migrate_engine) + drop_timestamps(metadata, "history_dataset_collection_association") + + +def create_timestamps(metadata, table_name): + target_table = Table(table_name, metadata, autoload=True) + if 'create_time' not in target_table.c: + create_time_column = Column("create_time", DateTime, default=now) + add_column(create_time_column, target_table, metadata) + if 'update_time' not in target_table.c: + update_time_column = Column("update_time", DateTime, default=now, onupdate=now) + add_column(update_time_column, target_table, metadata) + + +def drop_timestamps(metadata, table_name): + target_table = Table(table_name, metadata, autoload=True) + drop_column("create_time", target_table) + drop_column("update_time", target_table) diff --git a/lib/galaxy/model/triggers.py b/lib/galaxy/model/triggers.py new file mode 100644 index 000000000000..c855f5bbc823 --- /dev/null +++ b/lib/galaxy/model/triggers.py @@ -0,0 +1,155 @@ +""" +Database trigger installation and removal +""" + +from sqlalchemy import DDL + + +def install_timestamp_triggers(engine): + """Install update_time propagation triggers for history data tables""" + sql = get_install_trigger_sql(engine.name) + execute_statements(engine, sql) + + +def drop_timestamp_triggers(engine): + """Remove update_time propagation triggers for historydata tables""" + sql = get_drop_trigger_sql(engine.name) + execute_statements(engine, sql) + + +def execute_statements(engine, statements): + for statement in statements: + cmd = DDL(statement) + cmd.execute(bind=engine) + + +def get_install_trigger_sql(variant): + """Build statements to install timestamp triggers""" + + sql = [] + + if variant in ['postgres', 'postgresql']: + """Postgres has a separate function definition and a trigger + assignment. The first two statements the functions, and + the later assign those functions to triggers on tables""" + + # function: history trigger function + sql.append(build_pg_timestamp_func('update_history_update_time', 'history', new_key='history_id')) + + # function: hda trigger function + sql.append(build_pg_timestamp_func('update_hda_update_time', 'history_dataset_association', local_key='dataset_id')) + + # trigger: changes to datasets -> update hda + sql.append(build_pg_trigger('trigger_dataset_bidur', 'dataset', 'update_hda_update_time')) + + # trigger: changes to hda -> update history + sql.append(build_pg_trigger('trigger_hda_bidur', 'history_dataset_association', 'update_history_update_time')) + + # trigger: change hdca -> update history + sql.append(build_pg_trigger('trigger_hdca_bidur', 'history_dataset_collection_association', 'update_history_update_time')) + + else: + """Other database variants are more granular. Requiring separate + statements for INSERT/UPDATE/DELETE, and the body of the trigger + is not necessarily reusable with a function""" + + for operation in ['INSERT', 'UPDATE', 'DELETE']: + + # change dataset -> update hda + sql.append(build_timestamp_trigger( + operation, 'dataset', 'history_dataset_association', + target_key='dataset_id')) + + # change hda -> update history + sql.append(build_timestamp_trigger( + operation, 'history_dataset_association', 'history', + source_key='history_id')) + + # change hdca -> update history + sql.append(build_timestamp_trigger( + operation, 'history_dataset_collection_association', 'history', + source_key='history_id')) + + return sql + + +def build_pg_timestamp_func(fn_name, table_name, local_key='id', new_key='id', stamp='update_time'): + """creates a postgres timestamp trigger function""" + + tmpl = """ + CREATE OR REPLACE FUNCTION {fn_name}() + RETURNS trigger + LANGUAGE 'plpgsql' + AS $BODY$ + BEGIN + UPDATE {table_name} + SET {stamp} = (now() at time zone 'utc') + WHERE {local_key} = NEW.{new_key} + AND {stamp} < (now() at time zone 'utc'); + RETURN NEW; + END; + $BODY$; + """ + + return tmpl.format(**locals()) + + +def build_pg_trigger(trigger_name, table_name, fn_name, when='BEFORE'): + """creates a postgres trigger""" + + tmpl = """ + CREATE TRIGGER {trigger_name} + {when} INSERT OR DELETE OR UPDATE + ON {table_name} + FOR EACH ROW + EXECUTE PROCEDURE {fn_name}(); + """ + + return tmpl.format(**locals()) + + +def build_timestamp_trigger(operation, source_table, target_table, source_key='id', target_key='id', when='BEFORE'): + """creates a non-postgres update_time trigger""" + + op_initial = operation.lower()[0] + when_initial = when.lower()[0] + rowset = 'OLD' if operation == 'DELETE' else 'NEW' + + tmpl = """ + CREATE TRIGGER trigger_{source_table}_{when_initial}{op_initial}r + {when} {operation} + ON {source_table} + FOR EACH ROW + BEGIN + UPDATE {target_table} + SET update_time = current_timestamp + WHERE {target_key} = {rowset}.{source_key}; + END; + """ + + return tmpl.format(**locals()) + + +def get_drop_trigger_sql(variant): + """For use in migrations, creates drop statements when uninstalling triggers""" + + sql = [] + + if variant in ['postgres', 'postgresql']: + sql.append("DROP FUNCTION IF EXISTS update_hda_update_time() CASCADE;") + sql.append("DROP FUNCTION IF EXISTS update_history_update_time() CASCADE;") + else: + for operation in ['INSERT', 'UPDATE', 'DELETE']: + sql.append(build_drop_trigger(operation, "dataset")) + sql.append(build_drop_trigger(operation, "history_dataset_association")) + sql.append(build_drop_trigger(operation, "history_dataset_collection_association")) + + return sql + + +def build_drop_trigger(operation, source_table, when='BEFORE'): + """drops a non-postgres trigger by name""" + op_initial = operation.lower()[0] + when_initial = when.lower()[0] + tmpl = "DROP TRIGGER IF EXISTS trigger_{source_table}_{when_initial}{op_initial}r" + return tmpl.format(**locals()) From 99da6e95b01f1051f5393bbb14fc5bb383183a8f Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Thu, 14 Nov 2019 02:16:18 +0100 Subject: [PATCH 057/853] several enhancements and fixes --- interactivetool_guacamole_desktop.xml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/interactivetool_guacamole_desktop.xml b/interactivetool_guacamole_desktop.xml index a63ce1089911..665f4d33eb81 100644 --- a/interactivetool_guacamole_desktop.xml +++ b/interactivetool_guacamole_desktop.xml @@ -1,13 +1,15 @@ - cyverse/ubuntu18-xfce-desktop + quay.io/bgruening/guacamole-desktop - 8000 + 8080 + - @@ -19,8 +21,7 @@ - Simple Ubuntu XFCE all-in-one desktop. - Username: "user" - Password: "password" + Simple Ubuntu XFCE all-in-one desktop. The Username is "user" and the Password is "password". + This image is based on the awesome work from CyVerse. From 8cc60b2fedbec558f454ea23fabd427d3889f8ba Mon Sep 17 00:00:00 2001 From: Mason Date: Thu, 14 Nov 2019 08:01:32 -0800 Subject: [PATCH 058/853] removed unnecessary criteria in updatetime trigger --- .../model/migrate/versions/0161_add_content_update_time.py | 1 + lib/galaxy/model/triggers.py | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/galaxy/model/migrate/versions/0161_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0161_add_content_update_time.py index 7b85a4f68867..a9879b23f723 100644 --- a/lib/galaxy/model/migrate/versions/0161_add_content_update_time.py +++ b/lib/galaxy/model/migrate/versions/0161_add_content_update_time.py @@ -21,6 +21,7 @@ def upgrade(migrate_engine): metadata.bind = migrate_engine metadata.reflect() create_timestamps(metadata, "history_dataset_collection_association") + drop_timestamp_triggers(migrate_engine) install_timestamp_triggers(migrate_engine) diff --git a/lib/galaxy/model/triggers.py b/lib/galaxy/model/triggers.py index c855f5bbc823..a4afa91c20d2 100644 --- a/lib/galaxy/model/triggers.py +++ b/lib/galaxy/model/triggers.py @@ -73,7 +73,7 @@ def get_install_trigger_sql(variant): return sql -def build_pg_timestamp_func(fn_name, table_name, local_key='id', new_key='id', stamp='update_time'): +def build_pg_timestamp_func(fn_name, table_name, local_key='id', new_key='id'): """creates a postgres timestamp trigger function""" tmpl = """ @@ -83,9 +83,9 @@ def build_pg_timestamp_func(fn_name, table_name, local_key='id', new_key='id', s AS $BODY$ BEGIN UPDATE {table_name} - SET {stamp} = (now() at time zone 'utc') + SET update_time = (now() at time zone 'utc') WHERE {local_key} = NEW.{new_key} - AND {stamp} < (now() at time zone 'utc'); + AND update_time < (now() at time zone 'utc'); RETURN NEW; END; $BODY$; From 1b16e10c4f0e52bbb108504c8f6536dd3838ce45 Mon Sep 17 00:00:00 2001 From: Mason Date: Thu, 14 Nov 2019 10:00:36 -0800 Subject: [PATCH 059/853] added check to drop existing triggers upon installation, appears to affect unit tests --- .../model/migrate/versions/0161_add_content_update_time.py | 1 - lib/galaxy/model/triggers.py | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/model/migrate/versions/0161_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0161_add_content_update_time.py index a9879b23f723..7b85a4f68867 100644 --- a/lib/galaxy/model/migrate/versions/0161_add_content_update_time.py +++ b/lib/galaxy/model/migrate/versions/0161_add_content_update_time.py @@ -21,7 +21,6 @@ def upgrade(migrate_engine): metadata.bind = migrate_engine metadata.reflect() create_timestamps(metadata, "history_dataset_collection_association") - drop_timestamp_triggers(migrate_engine) install_timestamp_triggers(migrate_engine) diff --git a/lib/galaxy/model/triggers.py b/lib/galaxy/model/triggers.py index a4afa91c20d2..415d66f43245 100644 --- a/lib/galaxy/model/triggers.py +++ b/lib/galaxy/model/triggers.py @@ -8,6 +8,7 @@ def install_timestamp_triggers(engine): """Install update_time propagation triggers for history data tables""" sql = get_install_trigger_sql(engine.name) + drop_timestamp_triggers(engine) execute_statements(engine, sql) From c2a0fe3a552dd8033a0d2dcf61c36a736e13b689 Mon Sep 17 00:00:00 2001 From: Mason Date: Fri, 15 Nov 2019 12:11:12 -0800 Subject: [PATCH 060/853] fixed trigger return values, simplified pg triggers --- lib/galaxy/model/triggers.py | 155 ++++++++++++++++++----------------- 1 file changed, 80 insertions(+), 75 deletions(-) diff --git a/lib/galaxy/model/triggers.py b/lib/galaxy/model/triggers.py index 415d66f43245..526922aa3d7a 100644 --- a/lib/galaxy/model/triggers.py +++ b/lib/galaxy/model/triggers.py @@ -7,60 +7,44 @@ def install_timestamp_triggers(engine): """Install update_time propagation triggers for history data tables""" - sql = get_install_trigger_sql(engine.name) - drop_timestamp_triggers(engine) - execute_statements(engine, sql) + statements = get_timestamp_install_sql(engine.name) + execute_statements(engine, statements) def drop_timestamp_triggers(engine): """Remove update_time propagation triggers for historydata tables""" - sql = get_drop_trigger_sql(engine.name) - execute_statements(engine, sql) + statements = get_timestamp_drop_sql(engine.name) + execute_statements(engine, statements) def execute_statements(engine, statements): - for statement in statements: - cmd = DDL(statement) + for sql in statements: + cmd = DDL(sql) cmd.execute(bind=engine) -def get_install_trigger_sql(variant): - """Build statements to install timestamp triggers""" +def get_timestamp_install_sql(variant): + """Generate a list of sql statements for insalllation of timetamp triggers""" - sql = [] - - if variant in ['postgres', 'postgresql']: - """Postgres has a separate function definition and a trigger - assignment. The first two statements the functions, and - the later assign those functions to triggers on tables""" - - # function: history trigger function - sql.append(build_pg_timestamp_func('update_history_update_time', 'history', new_key='history_id')) - - # function: hda trigger function - sql.append(build_pg_timestamp_func('update_hda_update_time', 'history_dataset_association', local_key='dataset_id')) - - # trigger: changes to datasets -> update hda - sql.append(build_pg_trigger('trigger_dataset_bidur', 'dataset', 'update_hda_update_time')) + sql = get_timestamp_drop_sql(variant) - # trigger: changes to hda -> update history - sql.append(build_pg_trigger('trigger_hda_bidur', 'history_dataset_association', 'update_history_update_time')) + if 'postgres' in variant: + # Postgres has a separate function definition and a trigger + # assignment. The first two statements the functions, and + # the later assign those functions to triggers on tables - # trigger: change hdca -> update history - sql.append(build_pg_trigger('trigger_hdca_bidur', 'history_dataset_collection_association', 'update_history_update_time')) + fn_name = 'update_history_update_time' + sql.append(build_pg_timestamp_fn(fn_name, 'history', source_key='history_id')) + sql.append(build_pg_trigger('history_dataset_association', fn_name)) + sql.append(build_pg_trigger('history_dataset_collection_association', fn_name)) else: - """Other database variants are more granular. Requiring separate - statements for INSERT/UPDATE/DELETE, and the body of the trigger - is not necessarily reusable with a function""" + # Other database variants are more granular. Requiring separate + # statements for INSERT/UPDATE/DELETE, and the body of the trigger + # is not necessarily reusable with a function for operation in ['INSERT', 'UPDATE', 'DELETE']: - # change dataset -> update hda - sql.append(build_timestamp_trigger( - operation, 'dataset', 'history_dataset_association', - target_key='dataset_id')) - # change hda -> update history sql.append(build_timestamp_trigger( operation, 'history_dataset_association', 'history', @@ -74,83 +58,104 @@ def get_install_trigger_sql(variant): return sql -def build_pg_timestamp_func(fn_name, table_name, local_key='id', new_key='id'): - """creates a postgres timestamp trigger function""" +def get_timestamp_drop_sql(variant): + """generate a list of statements to drop the timestammp update triggers""" - tmpl = """ + sql = [] + + if 'postgres' in variant: + sql.append("DROP FUNCTION IF EXISTS update_history_update_time() CASCADE;") + else: + for operation in ['INSERT', 'UPDATE', 'DELETE']: + sql.append(build_drop_trigger(operation, 'history_dataset_association')) + sql.append(build_drop_trigger(operation, 'history_dataset_collection_association')) + + return sql + + +def build_pg_timestamp_fn(fn_name, table_name, local_key='id', source_key='id', stamp_column='update_time'): + """Generates a postgres history update timestamp function""" + + sql = """ CREATE OR REPLACE FUNCTION {fn_name}() RETURNS trigger LANGUAGE 'plpgsql' AS $BODY$ BEGIN - UPDATE {table_name} - SET update_time = (now() at time zone 'utc') - WHERE {local_key} = NEW.{new_key} - AND update_time < (now() at time zone 'utc'); - RETURN NEW; + IF (TG_OP = 'DELETE') THEN + UPDATE {table_name} + SET {stamp_column} = (now() at time zone 'utc') + WHERE {local_key} = OLD.{source_key}; + RETURN OLD; + ELSEIF (TG_OP = 'UPDATE') THEN + UPDATE {table_name} + SET {stamp_column} = (now() at time zone 'utc') + WHERE {local_key} = NEW.{source_key} OR {local_key} = OLD.{source_key}; + RETURN NEW; + ELSIF (TG_OP = 'INSERT') THEN + UPDATE {table_name} + SET {stamp_column} = (now() at time zone 'utc') + WHERE {local_key} = NEW.{source_key}; + RETURN NEW; + END IF; END; $BODY$; """ - - return tmpl.format(**locals()) + return sql.format(**locals()) -def build_pg_trigger(trigger_name, table_name, fn_name, when='BEFORE'): - """creates a postgres trigger""" +def build_pg_trigger(table_name, fn_name): + """assigns a postgres trigger to indicated table, calling user-defined function""" + trigger_name = "trigger_{table_name}_biudr".format(**locals()) tmpl = """ CREATE TRIGGER {trigger_name} - {when} INSERT OR DELETE OR UPDATE + BEFORE INSERT OR DELETE OR UPDATE ON {table_name} FOR EACH ROW EXECUTE PROCEDURE {fn_name}(); """ - return tmpl.format(**locals()) def build_timestamp_trigger(operation, source_table, target_table, source_key='id', target_key='id', when='BEFORE'): """creates a non-postgres update_time trigger""" - op_initial = operation.lower()[0] - when_initial = when.lower()[0] - rowset = 'OLD' if operation == 'DELETE' else 'NEW' + trigger_name = get_trigger_name(operation, source_table, when) + + # three different update clauses depending on update/insert/delete + clause = "" + if operation == "DELETE": + clause = "{target_key} = OLD.{source_key}" + elif operation == "UPDATE": + clause = "{target_key} = NEW.{source_key} OR {target_key} = OLD.{source_key}" + else: + clause = "{target_key} = NEW.{source_key}" + clause = clause.format(**locals()) tmpl = """ - CREATE TRIGGER trigger_{source_table}_{when_initial}{op_initial}r + CREATE TRIGGER {trigger_name} {when} {operation} ON {source_table} FOR EACH ROW BEGIN UPDATE {target_table} SET update_time = current_timestamp - WHERE {target_key} = {rowset}.{source_key}; + WHERE {clause}; END; """ - return tmpl.format(**locals()) -def get_drop_trigger_sql(variant): - """For use in migrations, creates drop statements when uninstalling triggers""" - - sql = [] - - if variant in ['postgres', 'postgresql']: - sql.append("DROP FUNCTION IF EXISTS update_hda_update_time() CASCADE;") - sql.append("DROP FUNCTION IF EXISTS update_history_update_time() CASCADE;") - else: - for operation in ['INSERT', 'UPDATE', 'DELETE']: - sql.append(build_drop_trigger(operation, "dataset")) - sql.append(build_drop_trigger(operation, "history_dataset_association")) - sql.append(build_drop_trigger(operation, "history_dataset_collection_association")) - - return sql - - def build_drop_trigger(operation, source_table, when='BEFORE'): """drops a non-postgres trigger by name""" + trigger_name = get_trigger_name(operation, source_table, when) + return "DROP TRIGGER IF EXISTS {trigger_name}".format(**locals()) + + +def get_trigger_name(operation, source_table, when='BEFORE'): + """non-postgres trigger name""" op_initial = operation.lower()[0] when_initial = when.lower()[0] - tmpl = "DROP TRIGGER IF EXISTS trigger_{source_table}_{when_initial}{op_initial}r" - return tmpl.format(**locals()) + trigger_name = "trigger_{source_table}_{when_initial}{op_initial}r".format(**locals()) + return trigger_name From ac05f6a880be57a371f6d06a642db8536c792865 Mon Sep 17 00:00:00 2001 From: Mason Date: Wed, 20 Nov 2019 10:24:33 -0800 Subject: [PATCH 061/853] update_time migration version number bump to fit dev --- ...add_content_update_time.py => 0162_add_content_update_time.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/galaxy/model/migrate/versions/{0161_add_content_update_time.py => 0162_add_content_update_time.py} (100%) diff --git a/lib/galaxy/model/migrate/versions/0161_add_content_update_time.py b/lib/galaxy/model/migrate/versions/0162_add_content_update_time.py similarity index 100% rename from lib/galaxy/model/migrate/versions/0161_add_content_update_time.py rename to lib/galaxy/model/migrate/versions/0162_add_content_update_time.py From ce872ac1ae789a8770ddf037fc75170a73e35816 Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Mon, 25 Nov 2019 22:16:04 +0100 Subject: [PATCH 062/853] add new interactive VCF tool --- interactivetool_vcf_iobio.xml | 54 +++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 interactivetool_vcf_iobio.xml diff --git a/interactivetool_vcf_iobio.xml b/interactivetool_vcf_iobio.xml new file mode 100644 index 000000000000..898a34f74442 --- /dev/null +++ b/interactivetool_vcf_iobio.xml @@ -0,0 +1,54 @@ + + + qiaoy/iobio-bundle.vcf-iobio:dev-ondemand + + + + 80 + + + + /tmp/app.conf && + mv /tmp/app.conf /etc/supervisor.d/app.conf && + + /usr/bin/supervisord -c /etc/supervisord.conf + ]]> + + + + + + + + + + + VCF iobio visualisation. + + From 5ff93313a59871f6cb620924403caae8e6e0afba Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Tue, 26 Nov 2019 09:27:22 +0100 Subject: [PATCH 063/853] add climate notebook --- interactivetool_climate_notebook.xml | 95 ++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 interactivetool_climate_notebook.xml diff --git a/interactivetool_climate_notebook.xml b/interactivetool_climate_notebook.xml new file mode 100644 index 000000000000..1d12e46316e4 --- /dev/null +++ b/interactivetool_climate_notebook.xml @@ -0,0 +1,95 @@ + + + nordicesmhub/docker-climate-notebook:1.0 + + + + 8888 + ipython/lab + + + + $__history_id__ + $__galaxy_url__ + 8080 + $__galaxy_url__ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The Climate Notebook is based on Jupyter an open-source web application that allows you to create and share documents that contain live code, equations, + visualizations and narrative text. Uses include: data cleaning and transformation, numerical simulation, statistical modeling, data visualization, + machine learning, and much more. + + Galaxy offers you to use Jupyter Notebooks directly in Galaxy accessing and interacting with Galaxy datasets as you like. A very common use-case is to + do the heavy lifting and data reduction steps in Galaxy and the plotting and more `interactive` part on smaller datasets in Jupyter. + + You can start with a new Jupyter notebook from scratch or load an already existing one, e.g. from your collegue and execute it on your dataset. + If you have a defined input dataset you can even execute a Jupyter notebook in a workflow, given that the notebook is writing the output back to the history. + + You can import data into the notebook via a predefined `get()` function and write results back to Galaxy with a `put()` function. + + The Climate version of the Jupyter Notebook offers a lot of preinstalled tools for climate science. + + From 03dc5828f9a402ce23675a9de841d921b147afe5 Mon Sep 17 00:00:00 2001 From: Anne Fouilloux Date: Tue, 26 Nov 2019 13:30:13 +0100 Subject: [PATCH 064/853] complement help for interactive climate notebook by adding the list of available packages and a link to pangeo --- interactivetool_climate_notebook.xml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/interactivetool_climate_notebook.xml b/interactivetool_climate_notebook.xml index 1d12e46316e4..aa1692ada80c 100644 --- a/interactivetool_climate_notebook.xml +++ b/interactivetool_climate_notebook.xml @@ -90,6 +90,22 @@ You can import data into the notebook via a predefined `get()` function and write results back to Galaxy with a `put()` function. - The Climate version of the Jupyter Notebook offers a lot of preinstalled tools for climate science. + The Climate version of the Jupyter Notebook offers a lot of preinstalled tools for climate science. The list of packages is based on what is available + on the [Pangeo](http://pangeo.io/) platform and [Pangeo stacks](https://pangeo-data.github.io/pangeo-stacks/). + + - **Core scipy packages**: numpy, scipy, matplotlib, pandas, xarray, sparse and sympy + - **Data science**: scikit-image, scikit-learn, dask-ml, tensorflow, keras, pytorch-cpu, dask_labextension + - **Visualization**: holoviews, panel, geoviews, hvplot, geoviews, datashader, seaborn, altair, descartes, folium, vega, + vega_datasets, palettable, cmocean,plotly, psy-maps, psy-reg, psyplot, psyplot-gui, psy-maps, psy-reg, + geopy, branca + - **Geospatial**: iris, cartopy, basemap, basemap-data-hires, geopandas, rasterio, netcdf4, erddapy, pydap, h5py, h5netcdf, regionmask and rio-cogeo + - **Geoscience related**: climlab, metpy, satpy, gsw, eofs, esmpy, xesmf, windspharm, rasterstats, geojsoncontour + - **Climate related**: pyaerocom, cdo, cdsapi, cfgrib, cis. esmvaltool, nc-time-axis, nco + - **Intake related**: intake, intake-xarray, intake-esm, fsspec and intake-stac + - **zarr related**: zarr, numcodecs, python-blosc, lz4, gcsfs, s3fs, tiledb-py + - **jupyter related**: ipyleaflet, papermill, jupytext, ipydatawidgets, sidecar + - **xarray related**: xgcm, xrft, xhistogram, xlrd, xrviz, climpred, pytide, pyinterp + - **misc**: python-wget, prefect, requests, pillow, pip, nbgitpuller, pysplit, biopython, bioblend and galaxy-ie-helpers + From 91d2eea4ae54ef5f3f03000757dddef135d76290 Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Tue, 26 Nov 2019 17:13:14 +0100 Subject: [PATCH 065/853] add some VCF fixes --- interactivetool_vcf_iobio.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/interactivetool_vcf_iobio.xml b/interactivetool_vcf_iobio.xml index 898a34f74442..4bb1d4eeec9d 100644 --- a/interactivetool_vcf_iobio.xml +++ b/interactivetool_vcf_iobio.xml @@ -16,12 +16,12 @@ #set $PUB_HTTP_PORT = '80' cd /var/www/html && - ##sed -i "s@\"wss://services.iobio.io/samtools/\"@((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + \"/samtools/\"@" js/bam.iobio.js/bam.iobio.js && - ##sed -i "s@\"wss://services.iobio.io/bamreaddepther/\"@((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + \"/bamreaddepther/\"@" js/bam.iobio.js/bam.iobio.js && - sed -i "s@\"wss://services.iobio.io/vcfreaddepther/\"@((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + \"/vcfreaddepther/\"@" js/vcf.iobio.js/vcf.iobio.js && - sed -i "s@\"wss://services.iobio.io/vcfstatsalive/\"@((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + \"/vcfstatsalive/\"@" js/vcf.iobio.js/vcf.iobio.js && - ##sed -i "s@\"wss://services.iobio.io/bamstatsalive/\"@((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + \"/bamstatsalive/\"@" js/bam.iobio.js/bam.iobio.js && - sed -i "s@\"wss://services.iobio.io/tabix/\"@((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + \"/tabix/\"@" js/vcf.iobio.js/vcf.iobio.js && + ##sed -i "s@\"wss://services.iobio.io/samtools/\"@((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + \"/samtools/\"@" app/bam.iobio.js && + ##sed -i "s@\"wss://services.iobio.io/bamreaddepther/\"@((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + \"/bamreaddepther/\"@" app/bam.iobio.js && + sed -i "s@\"wss://services.iobio.io/vcfdepther/\"@((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + \"/vcfdepther/\"@" app/vcf.iobio.js && + sed -i "s@\"wss://services.iobio.io/vcfstatsalive/\"@((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + \"/vcfstatsalive/\"@" app/vcf.iobio.js && + ##sed -i "s@\"wss://services.iobio.io/bamstatsalive/\"@((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + \"/bamstatsalive/\"@" app/bam.iobio.js && + sed -i "s@\"wss://services.iobio.io/tabix/\"@((window.location.protocol === \"https:\") ? \"wss://\" : \"ws://\") + window.location.host + \"/tabix/\"@" app/vcf.iobio.js && ##s@ws://tabix.iobio.io@ws://" + window.location.hostname + ":8000@ From da4d1a043c47f38c4228e397b9847c55c62fb20c Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Tue, 26 Nov 2019 19:58:33 +0100 Subject: [PATCH 066/853] update vcf IE --- interactivetool_vcf_iobio.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interactivetool_vcf_iobio.xml b/interactivetool_vcf_iobio.xml index 4bb1d4eeec9d..dc585d8818c6 100644 --- a/interactivetool_vcf_iobio.xml +++ b/interactivetool_vcf_iobio.xml @@ -5,7 +5,7 @@ 80 - + /tmp/app.conf && mv /tmp/app.conf /etc/supervisor.d/app.conf && From eb84e6743d81ad1fc602085f5c10b8500ad82486 Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Wed, 27 Nov 2019 13:14:19 +0100 Subject: [PATCH 067/853] add latest VCF changes --- interactivetool_vcf_iobio.xml | 39 ++++++++++++++++------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/interactivetool_vcf_iobio.xml b/interactivetool_vcf_iobio.xml index dc585d8818c6..3be0266c5931 100644 --- a/interactivetool_vcf_iobio.xml +++ b/interactivetool_vcf_iobio.xml @@ -5,49 +5,46 @@ 80 - + /tmp/app.conf && + mv /tmp/app.conf /etc/supervisor.d/app.conf && + /usr/bin/supervisord -c /etc/supervisord.conf - cp '${infile}' /input/vcffile.vcf && - ##cp '${infile.metadata.bam_index}' /input/vcffile.bam.bai && - head -n -2 /etc/supervisor.d/app.conf > /tmp/app.conf && - mv /tmp/app.conf /etc/supervisor.d/app.conf && - - /usr/bin/supervisord -c /etc/supervisord.conf ]]> - + - - VCF iobio visualisation. + `_. + +This visualization is using Galaxy Interactive Tool and utilizes an all-in-one Docker container from http://iobio.io. + +Make sure your VCF file is compressed to the vcf_bgzip datatype to load it into the Visualization. + ]]> + From a6ed2d61ba622850748963327b6f63c4ffbfa72a Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Sat, 30 Nov 2019 22:46:10 +0100 Subject: [PATCH 068/853] A first try of openrefine GIE -> interactivetool --- interactivetool_openrefine.xml | 64 ++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 interactivetool_openrefine.xml diff --git a/interactivetool_openrefine.xml b/interactivetool_openrefine.xml new file mode 100644 index 000000000000..17680fb6d0ee --- /dev/null +++ b/interactivetool_openrefine.xml @@ -0,0 +1,64 @@ + + Working with messy data: cleaning it; transforming it from one format into another; and extending it with web services and external data. + + ylebras/openrefine-docker + + + + 80 + + + + + + ${__app__.security.encode_id($outfile.history_id)} + ${__app__.config.galaxy_infrastructure_url} + 8080 + ${__app__.config.galaxy_infrastructure_url} + + #if $__user__: + #for $api_key in $__user__.api_keys: + ${api_key.key} + #break + #end for + #end if + + + + + + + + + + + + + +`_ (previously Google Refine) is a powerful tool for working with messy data: cleaning it; transforming it from one format into another; and extending it with web services and external data. + +.. class:: infomark + +Example input file (TAB separated):: + + "name" "longitude" "latitude" "countryCode" + Accipiter striatus Vieillot, 1808 -60.291838 46.328137 CA + Accipiter striatus Vieillot, 1808 -114.58927 35.022485 US + Accipiter striatus Vieillot, 1808 -93.37406 30.00586 US + Accipiter striatus Vieillot, 1808 -79.336288 43.682218 CA + Accipiter striatus Vieillot, 1808 -109.156024 31.904185 US + Accipiter striatus Vieillot, 1808 -71.098031 42.297408 US + Accipiter striatus Vieillot, 1808 -110.927215 32.18203 US + +]]> + + From a97099d7cced23d10f4833a2c2f9ff7ce331924f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gr=C3=BCning?= Date: Sun, 1 Dec 2019 14:17:01 +0100 Subject: [PATCH 069/853] so this should work, I hope --- interactivetool_openrefine.xml | 63 ++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/interactivetool_openrefine.xml b/interactivetool_openrefine.xml index 17680fb6d0ee..956073db48a3 100644 --- a/interactivetool_openrefine.xml +++ b/interactivetool_openrefine.xml @@ -1,32 +1,46 @@ - - Working with messy data: cleaning it; transforming it from one format into another; and extending it with web services and external data. + + Working with messy data ylebras/openrefine-docker - 80 - + 3333 - - ${__app__.security.encode_id($outfile.history_id)} - ${__app__.config.galaxy_infrastructure_url} + $__history_id__ + $__galaxy_url__ 8080 - ${__app__.config.galaxy_infrastructure_url} - - #if $__user__: - #for $api_key in $__user__.api_keys: - ${api_key.key} - #break - #end for - #end if - + $__galaxy_url__ + - + \&1) +while [[ \${STATUS} =~ "refused" ]] +do + echo "Waiting for openrefine: \$STATUS \n" + STATUS=\$(curl --include 'http://127.0.0.1:3333' 2>\&1) + sleep 4 +done +]]> + + + @@ -34,17 +48,16 @@ - + + + - -`_ (previously Google Refine) is a powerful tool for working with messy data: cleaning it; transforming it from one format into another; and extending it with web services and external data. +`Openrefine `_ (previously Google Refine) is a powerful tool for working with messy data: +cleaning it; transforming it from one format into another; and extending it with web services and external data. .. class:: infomark From 466d8d38ab48a829205e17a37d38f581aa90db6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gr=C3=BCning?= Date: Sun, 1 Dec 2019 14:34:43 +0100 Subject: [PATCH 070/853] small fix --- interactivetool_openrefine.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interactivetool_openrefine.xml b/interactivetool_openrefine.xml index 956073db48a3..11a0b01ffc3c 100644 --- a/interactivetool_openrefine.xml +++ b/interactivetool_openrefine.xml @@ -20,11 +20,11 @@ exec /OpenRefine/refine -i 0.0.0.0 -m \$GALAXY_MEMORY_MB & ##Check if openrefine is up to work -STATUS=\$(curl --include 'http://127.0.0.1:3333' 2>\&1) +STATUS=\$(curl --include 'http://127.0.0.1:3333' 2>&1) while [[ \${STATUS} =~ "refused" ]] do echo "Waiting for openrefine: \$STATUS \n" - STATUS=\$(curl --include 'http://127.0.0.1:3333' 2>\&1) + STATUS=\$(curl --include 'http://127.0.0.1:3333' 2>&1) sleep 4 done ]]> From 7fcbf9c6dd142d91c6f5cabd6d067f3be4e81c76 Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Mon, 2 Dec 2019 11:34:43 +0100 Subject: [PATCH 071/853] Create interactivetool_radiant.xml First try --- interactivetool_radiant.xml | 75 +++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 interactivetool_radiant.xml diff --git a/interactivetool_radiant.xml b/interactivetool_radiant.xml new file mode 100644 index 000000000000..d48cd9cf1260 --- /dev/null +++ b/interactivetool_radiant.xml @@ -0,0 +1,75 @@ + + Data analytics using Radiant R Shiny app + + ylebras/radiant-docker + + + + 3838 + /sample-apps/STAT/ + + + + + ${__app__.security.encode_id($outfile.history_id)} + ${__app__.config.galaxy_infrastructure_url} + 8080 + ${__app__.config.galaxy_infrastructure_url} + + #if $__user__: + #for $api_key in $__user__.api_keys: + ${api_key.key} + #break + #end for + #end if + + + + + + + + + + + + + +`_ is an open-source platform-independent browser-based interface for business analytics in R. The application is based on the Shiny package and can be run locally or on a server. Radiant was developed by Vincent Nijs. Please use the issue tracker on GitHub to suggest enhancements or report problems: https://github.com/radiant-rstats/radiant/issues. For other questions and comments please use radiant@rady.ucsd.edu. +Key features + +- Explore: Quickly and easily summarize, visualize, and analyze your data +- Cross-platform: It runs in a browser on Windows, Mac, and Linux +- Reproducible: Recreate results and share work with others as a state file or an Rmarkdown report +- Programming: Integrate Radiant’s analysis functions with your own R-code +- Context: Data and examples focus on business applications + + +.. class:: infomark + +Example input file (TAB separated):: + + "name" "longitude" "latitude" "countryCode" + Accipiter striatus Vieillot, 1808 -60.291838 46.328137 CA + Accipiter striatus Vieillot, 1808 -114.58927 35.022485 US + Accipiter striatus Vieillot, 1808 -93.37406 30.00586 US + Accipiter striatus Vieillot, 1808 -79.336288 43.682218 CA + Accipiter striatus Vieillot, 1808 -109.156024 31.904185 US + Accipiter striatus Vieillot, 1808 -71.098031 42.297408 US + Accipiter striatus Vieillot, 1808 -110.927215 32.18203 US + +]]> + + + + + From b9df1d6eb01024381abbf0d5f7b87646829e1bca Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Mon, 2 Dec 2019 11:47:00 +0100 Subject: [PATCH 072/853] Create interactivetool_geoexplorer.xml --- interactivetool_geoexplorer.xml | 69 +++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 interactivetool_geoexplorer.xml diff --git a/interactivetool_geoexplorer.xml b/interactivetool_geoexplorer.xml new file mode 100644 index 000000000000..ba51c7c70edd --- /dev/null +++ b/interactivetool_geoexplorer.xml @@ -0,0 +1,69 @@ + + An interactive spatial analysis platform using ggvis and Leaflet + + ylebras/geoexplorer-docker + + + + 3838 + /sample-apps/SIG/ + + + + + ${__app__.security.encode_id($outfile.history_id)} + ${__app__.config.galaxy_infrastructure_url} + 8080 + ${__app__.config.galaxy_infrastructure_url} + + #if $__user__: + #for $api_key in $__user__.api_keys: + ${api_key.key} + #break + #end for + #end if + + + + + + + + + + + + + +`_ is An interactive spatial analysis platform using ggvis and Leaflet. + +Author: David Stephens + +App: http://www.davesteps.com/geoExploreR/ + +.. class:: infomark + +Example input file (TAB separated):: + + "name" "longitude" "latitude" "countryCode" + Accipiter striatus Vieillot, 1808 -60.291838 46.328137 CA + Accipiter striatus Vieillot, 1808 -114.58927 35.022485 US + Accipiter striatus Vieillot, 1808 -93.37406 30.00586 US + Accipiter striatus Vieillot, 1808 -79.336288 43.682218 CA + Accipiter striatus Vieillot, 1808 -109.156024 31.904185 US + Accipiter striatus Vieillot, 1808 -71.098031 42.297408 US + Accipiter striatus Vieillot, 1808 -110.927215 32.18203 US + +]]> + + + + + From ea43b3c5b5a5b62a12b820d50712a93006231df5 Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Mon, 2 Dec 2019 13:56:23 +0100 Subject: [PATCH 073/853] correct Galaxy environment variables --- interactivetool_geoexplorer.xml | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/interactivetool_geoexplorer.xml b/interactivetool_geoexplorer.xml index ba51c7c70edd..0667c42d5d7f 100644 --- a/interactivetool_geoexplorer.xml +++ b/interactivetool_geoexplorer.xml @@ -10,19 +10,12 @@ - - ${__app__.security.encode_id($outfile.history_id)} - ${__app__.config.galaxy_infrastructure_url} + $__history_id__ + $__galaxy_url__ 8080 - ${__app__.config.galaxy_infrastructure_url} - - #if $__user__: - #for $api_key in $__user__.api_keys: - ${api_key.key} - #break - #end for - #end if - + $__galaxy_url__ + + Date: Mon, 2 Dec 2019 13:57:32 +0100 Subject: [PATCH 074/853] correct env variables --- interactivetool_radiant.xml | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/interactivetool_radiant.xml b/interactivetool_radiant.xml index d48cd9cf1260..7b87bfe3eade 100644 --- a/interactivetool_radiant.xml +++ b/interactivetool_radiant.xml @@ -10,19 +10,12 @@ - - ${__app__.security.encode_id($outfile.history_id)} - ${__app__.config.galaxy_infrastructure_url} + $__history_id__ + $__galaxy_url__ 8080 - ${__app__.config.galaxy_infrastructure_url} - - #if $__user__: - #for $api_key in $__user__.api_keys: - ${api_key.key} - #break - #end for - #end if - + $__galaxy_url__ + + Date: Mon, 2 Dec 2019 14:10:39 +0100 Subject: [PATCH 075/853] update citation --- interactivetool_geoexplorer.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/interactivetool_geoexplorer.xml b/interactivetool_geoexplorer.xml index 0667c42d5d7f..894dd590c23c 100644 --- a/interactivetool_geoexplorer.xml +++ b/interactivetool_geoexplorer.xml @@ -57,6 +57,12 @@ Example input file (TAB separated):: ]]> - + @misc{githubsurvey2018, + author = {davesteps}, + title = {{dashboard to visualise geographic data}}, + publisher = {Github}, + url = {https://github.com/davesteps/geoExploreR} + } + } From 980b7344a1d3019e22ff64b438383da654dab4fd Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Mon, 2 Dec 2019 14:12:40 +0100 Subject: [PATCH 076/853] update citation --- interactivetool_radiant.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/interactivetool_radiant.xml b/interactivetool_radiant.xml index 7b87bfe3eade..ef7165b9897b 100644 --- a/interactivetool_radiant.xml +++ b/interactivetool_radiant.xml @@ -63,6 +63,12 @@ Example input file (TAB separated):: ]]> - + @misc{githubsurvey2018, + author = {vnijs}, + title = {{Radiant - Business analytics using R and Shiny}}, + publisher = {Github}, + url = {https://github.com/vnijs/radiant} + } + } From c4b5f3ff41e958b3f06897dd4e4c22897b8b7d6a Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Mon, 2 Dec 2019 14:15:14 +0100 Subject: [PATCH 077/853] remove empty lines --- interactivetool_radiant.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/interactivetool_radiant.xml b/interactivetool_radiant.xml index ef7165b9897b..40615e71a0af 100644 --- a/interactivetool_radiant.xml +++ b/interactivetool_radiant.xml @@ -18,9 +18,7 @@ @@ -33,10 +31,6 @@ `_ is an open-source platform-independent browser-based interface for business analytics in R. The application is based on the Shiny package and can be run locally or on a server. Radiant was developed by Vincent Nijs. Please use the issue tracker on GitHub to suggest enhancements or report problems: https://github.com/radiant-rstats/radiant/issues. For other questions and comments please use radiant@rady.ucsd.edu. Key features @@ -46,7 +40,6 @@ Key features - Programming: Integrate Radiant’s analysis functions with your own R-code - Context: Data and examples focus on business applications - .. class:: infomark Example input file (TAB separated):: From b4bc34122677563dcd6f8c328b584fef3890ec27 Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Mon, 2 Dec 2019 17:30:55 +0100 Subject: [PATCH 078/853] modify url --- interactivetool_radiant.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interactivetool_radiant.xml b/interactivetool_radiant.xml index 40615e71a0af..691a6ec1ae93 100644 --- a/interactivetool_radiant.xml +++ b/interactivetool_radiant.xml @@ -6,7 +6,7 @@ 3838 - /sample-apps/STAT/ + /sample-apps/STAT/inst/app From b5bcaead979c8cc04d24bb77a95cc30c1bb19597 Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Mon, 2 Dec 2019 20:15:58 +0100 Subject: [PATCH 079/853] small changes to new ITs --- interactivetool_geoexplorer.xml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/interactivetool_geoexplorer.xml b/interactivetool_geoexplorer.xml index 894dd590c23c..d709f0c0360f 100644 --- a/interactivetool_geoexplorer.xml +++ b/interactivetool_geoexplorer.xml @@ -15,19 +15,23 @@ 8080 $__galaxy_url__ - > /var/log/shiny-server.log 2>&1 ]]> - + - + From 53bc67882fef3797bfacc9608d6a953098fe98ad Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Mon, 2 Dec 2019 20:16:03 +0100 Subject: [PATCH 080/853] small changes to new ITs --- interactivetool_radiant.xml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/interactivetool_radiant.xml b/interactivetool_radiant.xml index 40615e71a0af..ba84b9f43722 100644 --- a/interactivetool_radiant.xml +++ b/interactivetool_radiant.xml @@ -15,17 +15,21 @@ 8080 $__galaxy_url__ - > /var/log/shiny-server.log 2>&1 ]]> - + From 70d84c7d933a062ea0049394b24cf40b54315806 Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Tue, 3 Dec 2019 09:09:42 +0100 Subject: [PATCH 081/853] add input file mandatory format --- interactivetool_geoexplorer.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interactivetool_geoexplorer.xml b/interactivetool_geoexplorer.xml index 894dd590c23c..c5420332887a 100644 --- a/interactivetool_geoexplorer.xml +++ b/interactivetool_geoexplorer.xml @@ -43,9 +43,11 @@ App: http://www.davesteps.com/geoExploreR/ .. class:: infomark +**Input data file MUST have as longitude column clomun 2, and as latitude column, column 3** + Example input file (TAB separated):: - "name" "longitude" "latitude" "countryCode" + "name" "x" "y" "countryCode" Accipiter striatus Vieillot, 1808 -60.291838 46.328137 CA Accipiter striatus Vieillot, 1808 -114.58927 35.022485 US Accipiter striatus Vieillot, 1808 -93.37406 30.00586 US From 63c7d543b0c9cc187dc9bfde09172c8fa8e474fb Mon Sep 17 00:00:00 2001 From: Anthony Bretaudeau Date: Fri, 13 Dec 2019 09:49:19 +0100 Subject: [PATCH 082/853] Fix env var name + update --- interactivetool_askomics.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interactivetool_askomics.xml b/interactivetool_askomics.xml index 095d27f9f2b6..94cf111a2f35 100644 --- a/interactivetool_askomics.xml +++ b/interactivetool_askomics.xml @@ -1,7 +1,7 @@ a visual SPARQL query builder - askomics/flaskomics-with-dependencies:3.1.1 + askomics/flaskomics-with-dependencies:3.2.0 @@ -19,7 +19,7 @@ ${__user_name__} $__galaxy_url__ - + prod 1 From 1d78a090d8ea0ca2ecbd94f759534698b9c83cdf Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Fri, 13 Dec 2019 17:39:57 +0100 Subject: [PATCH 083/853] add data import (#43) I was frogetting the data import part apparently :) --- interactivetool_radiant.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/interactivetool_radiant.xml b/interactivetool_radiant.xml index 769dc90f5cc9..67c0205cc0e0 100644 --- a/interactivetool_radiant.xml +++ b/interactivetool_radiant.xml @@ -17,6 +17,10 @@ Date: Fri, 13 Dec 2019 19:14:33 +0100 Subject: [PATCH 084/853] Copy inputdata instead of ln -s + help section update (#44) * Copy inputdata instead of ln -s * Copy inputdata instead of ln -s * Modify input datatype in help --- interactivetool_geoexplorer.xml | 18 +++++++++--------- interactivetool_radiant.xml | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/interactivetool_geoexplorer.xml b/interactivetool_geoexplorer.xml index 77375fd5725a..7256cb402c28 100644 --- a/interactivetool_geoexplorer.xml +++ b/interactivetool_geoexplorer.xml @@ -19,7 +19,7 @@ diff --git a/interactivetool_radiant.xml b/interactivetool_radiant.xml index 67c0205cc0e0..05b623d0ffc3 100644 --- a/interactivetool_radiant.xml +++ b/interactivetool_radiant.xml @@ -19,7 +19,7 @@ Date: Tue, 17 Dec 2019 00:01:25 +0100 Subject: [PATCH 085/853] Update interactivetool_jupyter_notebook.xml --- interactivetool_jupyter_notebook.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interactivetool_jupyter_notebook.xml b/interactivetool_jupyter_notebook.xml index 4665d48a3c3a..8ecafd6f75a6 100644 --- a/interactivetool_jupyter_notebook.xml +++ b/interactivetool_jupyter_notebook.xml @@ -22,7 +22,7 @@ mkdir -p ./jupyter/data && #set $cleaned_name = re.sub('[^\w\-\.]', '_', str($input.element_identifier)) - ln -sf '$input' './jupyter/data/${cleaned_name}' && + cp '$input' './jupyter/data/${cleaned_name}' && ## change into the directory where the notebooks are located cd ./jupyter/ && From bcf600696722b41a79db12cd9aed8edbffdc036a Mon Sep 17 00:00:00 2001 From: Yvan Le Bras Date: Fri, 20 Dec 2019 19:38:16 +0100 Subject: [PATCH 086/853] Update help and input data file type (#45) --- interactivetool_geoexplorer.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/interactivetool_geoexplorer.xml b/interactivetool_geoexplorer.xml index 7256cb402c28..3c8e1f5a5367 100644 --- a/interactivetool_geoexplorer.xml +++ b/interactivetool_geoexplorer.xml @@ -47,18 +47,18 @@ App: http://www.davesteps.com/geoExploreR/ .. class:: infomark -**Input data file MUST have as longitude column clomun 2, and as latitude column, column 3** +**Input data file MUST have as a uniq ID per row on first column, longitude column on column 2, latitude column on column 3 and quantitative values on 4th column ** Example input file (csv):: - "name" "x" "y" "countryCode" - "Accipiter striatus Vieillot, 1808" -60.291838 46.328137 CA - "Accipiter striatus Vieillot, 1808" -114.58927 35.022485 US - "Accipiter striatus Vieillot, 1808" -93.37406 30.00586 US - "Accipiter striatus Vieillot, 1808" -79.336288 43.682218 CA - "Accipiter striatus Vieillot, 1808" -109.156024 31.904185 US - "Accipiter striatus Vieillot, 1808" -71.098031 42.297408 US - "Accipiter striatus Vieillot, 1808" -110.927215 32.18203 US +"ID" "x" "y" "test" +01 -60.291838 46.328137 2 +02 -114.58927 35.022485 3 +03 -93.37406 30.00586 4 +04 -79.336288 43.682218 5 +05 -109.156024 31.904185 2 +06 -71.098031 42.297408 9 +07 -110.927215 32.18203 12 ]]> From 4d461a5e91d24bf8d4c28aeaa95a166d765138d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gr=C3=BCning?= Date: Thu, 16 Jan 2020 19:28:56 +0100 Subject: [PATCH 087/853] fix jupyter --- interactivetool_jupyter_notebook.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/interactivetool_jupyter_notebook.xml b/interactivetool_jupyter_notebook.xml index 8ecafd6f75a6..c86717460df0 100644 --- a/interactivetool_jupyter_notebook.xml +++ b/interactivetool_jupyter_notebook.xml @@ -21,9 +21,10 @@ mkdir -p ./jupyter/outputs/ && mkdir -p ./jupyter/data && - #set $cleaned_name = re.sub('[^\w\-\.]', '_', str($input.element_identifier)) - cp '$input' './jupyter/data/${cleaned_name}' && - + #if $input: + #set $cleaned_name = re.sub('[^\w\-\.]', '_', str($input.element_identifier)) + cp '$input' './jupyter/data/${cleaned_name}' && + #end if ## change into the directory where the notebooks are located cd ./jupyter/ && export PATH=/home/jovyan/.local/bin:\$PATH && From 944ee259d07b060513928c131d6f94481e44cbc4 Mon Sep 17 00:00:00 2001 From: Joachim Wolff Date: Thu, 16 Jan 2020 20:58:36 +0100 Subject: [PATCH 088/853] Release 19.09 europe (#47) * Interactive tool for higlass * Changes as requested --- interactivetool_higlass.xml | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 interactivetool_higlass.xml diff --git a/interactivetool_higlass.xml b/interactivetool_higlass.xml new file mode 100644 index 000000000000..8f3231e28c41 --- /dev/null +++ b/interactivetool_higlass.xml @@ -0,0 +1,38 @@ + + an interactive Hi-C data visualizer + + higlass/higlass-docker + + + + 80 + + + + + + + + + + + + + + Interactive tool for visualising Hi-C data, works only for multi-cooler files which store multiple resolutions. + For a detailed documentaition please visit https://docs.higlass.io/. + + + + 10.1186/s13059-018-1486-1 + + + From 40640440185384998a915b7059059f3b3779ada6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gr=C3=BCning?= Date: Thu, 16 Jan 2020 21:44:08 +0100 Subject: [PATCH 089/853] restrict tool to mcool file --- interactivetool_higlass.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interactivetool_higlass.xml b/interactivetool_higlass.xml index 8f3231e28c41..1571b811a3a1 100644 --- a/interactivetool_higlass.xml +++ b/interactivetool_higlass.xml @@ -19,7 +19,7 @@ ]]> - + From 4229b1783ebee7d2228770edd30ba0d131dab0bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gr=C3=BCning?= Date: Wed, 22 Jan 2020 09:22:08 +0100 Subject: [PATCH 090/853] Update interactivetool_cellxgene.xml --- interactivetool_cellxgene.xml | 95 +++++++++++++++++++++++++++++++++-- 1 file changed, 90 insertions(+), 5 deletions(-) diff --git a/interactivetool_cellxgene.xml b/interactivetool_cellxgene.xml index 546bd7ab58fe..3c99f3a393b5 100644 --- a/interactivetool_cellxgene.xml +++ b/interactivetool_cellxgene.xml @@ -3,27 +3,112 @@ quay.io/galaxy/cellxgene-galaxy-ie:ie2 - + 80 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + experimental_annotations['experimental_annotations_select'] == 'enable' + - Interactive tool for visualising AnnData. + An interactive explorer for single-cell transcriptomics (AnnData formatted) data + + cellxgene (pronounced "cell-by-gene") is an interactive data explorer for single-cell transcriptomics datasets, such as those coming from the Human Cell Atlas. Leveraging modern web development techniques to enable fast visualizations of at least 1 million cells, we hope to enable biologists and computational researchers to explore their data. + + Whether you need to visualize one thousand cells or one million, cellxgene helps you gain insight into your single-cell data. + https://github.com/chanzuckerberg/cellxgene + + 10.5281/zenodo.3554576 + From 7dc87aed78de749e2226049a503627c36d644d7c Mon Sep 17 00:00:00 2001 From: M Bernt Date: Fri, 31 Jan 2020 13:38:36 +0100 Subject: [PATCH 091/853] data_column use_header_names test and docs - add a test (also as example) - clarify in the docs --- lib/galaxy/tool_util/xsd/galaxy.xsd | 8 +++++--- test/functional/tools/column_param.xml | 10 ++++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/galaxy/tool_util/xsd/galaxy.xsd b/lib/galaxy/tool_util/xsd/galaxy.xsd index 6ae0e3e102cd..f994bc85272e 100644 --- a/lib/galaxy/tool_util/xsd/galaxy.xsd +++ b/lib/galaxy/tool_util/xsd/galaxy.xsd @@ -2563,8 +2563,10 @@ Set to ``false`` to not force user to select an option in the list.Used only if the ``type`` attribute value is ``data_column``, if ``true`` Galaxy assumes first row of ``data_ref`` is a header and builds the select list with these values rather than the more -generic ``c1`` ... ``cN``. - +generic ``c1`` ... ``cN`` (i.e. it will be ``c1: head1`` ... ``cN: headN``). +Note that the content of the Cheetah variable is still +the column index. + @@ -4830,7 +4832,7 @@ write out a JSON representation of the tool parameters. *Example* -The following will create a cheetah variable that can be evaluated as ``$inputs`` that +The following will create a Cheetah variable that can be evaluated as ``$inputs`` that will contain the tool parameter inputs. ```xml diff --git a/test/functional/tools/column_param.xml b/test/functional/tools/column_param.xml index 92b979210e7a..f89979179dfc 100644 --- a/test/functional/tools/column_param.xml +++ b/test/functional/tools/column_param.xml @@ -1,10 +1,13 @@ - + '$output1' - + ]]> + @@ -13,8 +16,11 @@ + + + From b5b4f0955627408205509eeded6ff818f1db602b Mon Sep 17 00:00:00 2001 From: M Bernt Date: Fri, 31 Jan 2020 13:41:49 +0100 Subject: [PATCH 092/853] fix potential bug empty columns must not be stripped --- lib/galaxy/tools/parameters/basic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/tools/parameters/basic.py b/lib/galaxy/tools/parameters/basic.py index 5fc67474e97d..b6cecb959f55 100644 --- a/lib/galaxy/tools/parameters/basic.py +++ b/lib/galaxy/tools/parameters/basic.py @@ -1271,7 +1271,7 @@ def get_options(self, trans, other_values): try: with open(dataset.get_file_name(), 'r') as f: head = f.readline() - cnames = head.rstrip().split('\t') + cnames = head.rstrip("\n\r ").split('\t') column_list = [('%d' % (i + 1), 'c%d: %s' % (i + 1, x)) for i, x in enumerate(cnames)] if self.numerical: # If numerical was requested, filter columns based on metadata if hasattr(dataset, 'metadata') and hasattr(dataset.metadata, 'column_types'): From 61e227dd855db95cee23d4e15015a91b606dee2e Mon Sep 17 00:00:00 2001 From: M Bernt Date: Fri, 31 Jan 2020 15:53:32 +0100 Subject: [PATCH 093/853] add missing tool output --- test/functional/tools/column_param.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/functional/tools/column_param.xml b/test/functional/tools/column_param.xml index f89979179dfc..dad77b65b6bd 100644 --- a/test/functional/tools/column_param.xml +++ b/test/functional/tools/column_param.xml @@ -1,8 +1,8 @@ '$output1' + echo "col $col" >> '$output1' && + echo "col_names $col_names" >> '$output1' && + cut -f '$col' '$input1' >> '$output1' ]]> From a93a69dc5932f6686248d24e70334ad38b073ec5 Mon Sep 17 00:00:00 2001 From: Anne Fouilloux Date: Sun, 2 Feb 2020 13:44:05 +0100 Subject: [PATCH 094/853] add panoply as new interative tool (#50) --- interactivetool_panoply.xml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 interactivetool_panoply.xml diff --git a/interactivetool_panoply.xml b/interactivetool_panoply.xml new file mode 100644 index 000000000000..6abb7b8e2c98 --- /dev/null +++ b/interactivetool_panoply.xml @@ -0,0 +1,28 @@ + + + quay.io/nordicesmhub/docker-panoply + + + + 5800 + + + + + + + + + + + + + + `Panoply `_ plots geo-referenced and other arrays from netCDF, HDF, GRIB, and other datasets. + + From 081dd5ec7307fec1bb1805ad3b77eee634415bb5 Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Sun, 2 Feb 2020 23:24:45 +0100 Subject: [PATCH 095/853] fix panoply IT --- interactivetool_panoply.xml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/interactivetool_panoply.xml b/interactivetool_panoply.xml index 6abb7b8e2c98..66c18d5139f2 100644 --- a/interactivetool_panoply.xml +++ b/interactivetool_panoply.xml @@ -1,4 +1,5 @@ - + + interative plotting tool for geo-referenced data quay.io/nordicesmhub/docker-panoply @@ -9,9 +10,9 @@ @@ -22,7 +23,8 @@ - + `_ plots geo-referenced and other arrays from netCDF, HDF, GRIB, and other datasets. + ]]> From f04a60a9b46055894b30a21212220f61dcca436c Mon Sep 17 00:00:00 2001 From: Bjoern Gruening Date: Mon, 3 Feb 2020 08:00:16 +0100 Subject: [PATCH 096/853] higlass changes --- interactivetool_higlass.xml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/interactivetool_higlass.xml b/interactivetool_higlass.xml index 1571b811a3a1..20ffda8df0bd 100644 --- a/interactivetool_higlass.xml +++ b/interactivetool_higlass.xml @@ -1,7 +1,7 @@ an interactive Hi-C data visualizer - higlass/higlass-docker + image-default @@ -9,13 +9,12 @@ From 85a441148f606c30242d9a614f63cf4a1ac20c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gr=C3=BCning?= Date: Mon, 3 Feb 2020 23:30:14 +0100 Subject: [PATCH 097/853] Update interactivetool_higlass.xml --- interactivetool_higlass.xml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/interactivetool_higlass.xml b/interactivetool_higlass.xml index 20ffda8df0bd..6d0510925da3 100644 --- a/interactivetool_higlass.xml +++ b/interactivetool_higlass.xml @@ -1,7 +1,7 @@ an interactive Hi-C data visualizer - image-default + quay.io/bgruening/galaxy-higlass @@ -9,19 +9,20 @@ - + - + @@ -35,3 +36,4 @@ + From 49699aecc341066e2004e9f329c4413e03a93590 Mon Sep 17 00:00:00 2001 From: Kaivan Kamali Date: Thu, 6 Feb 2020 12:48:49 -0500 Subject: [PATCH 098/853] Added integration test that spins up a Dockerized iRODS server, and runs a few tests agianst it. --- .../default/pinned-dev-requirements.txt | 1 + lib/galaxy_test/driver/integration_util.py | 2 +- .../irods_beginner_training_2016.pdf | Bin 0 -> 497249 bytes test/integration/objectstore/test_irods.py | 177 ++++++++++++++++++ 4 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 test/integration/objectstore/irods_beginner_training_2016.pdf create mode 100644 test/integration/objectstore/test_irods.py diff --git a/lib/galaxy/dependencies/pipfiles/default/pinned-dev-requirements.txt b/lib/galaxy/dependencies/pipfiles/default/pinned-dev-requirements.txt index 916d6375727b..facffd36b33a 100644 --- a/lib/galaxy/dependencies/pipfiles/default/pinned-dev-requirements.txt +++ b/lib/galaxy/dependencies/pipfiles/default/pinned-dev-requirements.txt @@ -43,6 +43,7 @@ pytest-metadata==1.8.0 pytest-postgresql==1.4.1 pytest-pythonpath==0.7.3 pytest==4.6.9 +python-irodsclient==0.8.2 pytz==2019.3 pyyaml==5.3 recommonmark==0.6.0 diff --git a/lib/galaxy_test/driver/integration_util.py b/lib/galaxy_test/driver/integration_util.py index 59e3ef17b860..2e402984cc0b 100644 --- a/lib/galaxy_test/driver/integration_util.py +++ b/lib/galaxy_test/driver/integration_util.py @@ -2,7 +2,7 @@ Tests that start an actual Galaxy server with a particular configuration in order to test something that cannot be tested with the default functional/api -tessting configuration. +testing configuration. """ import os from unittest import skip, SkipTest, TestCase diff --git a/test/integration/objectstore/irods_beginner_training_2016.pdf b/test/integration/objectstore/irods_beginner_training_2016.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2344e41888a526cb3697b1c1b6c241a7cd974069 GIT binary patch literal 497249 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

AHIVStn6nfStXke|Hb{r_gqwsH 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

-bvP_(CBYVzq<)5bi;L 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 _ot;3myCRM*r|k9r_Qn{&_V$S4MT5>tdZ7o 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ΝtI5PiEr1~@Pm0Aoi`)KLC5N&pJ$44{UYFu zQB31NHAoDvmFP3uRP=@IoN@$#Tb3g*&572LDM@=AOnaQDIq5i1A<mtzAHeW_5KoIg12fp0kzeIc4l^aV`&loT4GFPK_H zU%*6Pu=sS-xCU z?ia&%t~qLVVny0>PKmYG_c8O*g$PTNJc&g$ue#@!i&4|D_fUPCB zQ;x8rY>(@7K{qG|!&EsgaR|fvDNO!&+S?>w0Q3C-Jmtw3DAy@Q$9({%c-z8q?}Bwc zl&IS|0}@NVu$22;W5bUVG?8+WeZZEa_k|_B2gBo?^M~akxOT~V^hp0{dQ8Md9F5{c_OfWB7VkrLtTB~auvqW(l`iT3;Mz#lCKg>zDh9pDho@w z6HNZ(!cz7D)BP=+?7BZ#nD;m$rpCdP>P(+;!7TRyqQC(xb!_^D*{Uwg%vkE!)a`WR z^STl1tTiG)Tl=1C)-EUhOCRFDg(d$j??TGYV6vAK=Cwpj)OayF>MRhPY)tkN92l5E zWBw2w(_X^2m|o%G6V1j%mNEmDAo&dGS3W~9`3wt7eqPaa+J87nH3!`2*Zh^UP2)uk z$Tf%3>0Bc2YTZCmui*O@_lpxF*A3TL%1AY~q#MWw=h~-CbIL;mP~jzrwX9glJTrtl zrrb%tor!fiAA~@r+(aLWb1N+6A;KaR+f$hM78F8f8kbzkgw)l&UND?RIo@J~!b~^V zexe(-B{hG9)hAEk=?Sd|#8Y&G!!O;55^n?(Z-mo|H*#de8|xTp9Ca9SUhwti zSztG(E`*m;zTUzl|FMZu7owbey-*z8KLX>zP<|h#IjtprM31A>g-&~y(MqlZlUxV& zlU#>uHfkkAuLVq#MM&dhZg%qBSR^O>mL~_Z3F-U8P5k+f>;X>=iG1t1`Hr1X) z75CT<>`6=+9P+bDugqda&V=Y=tkZdSK%f3Ex60X19-+J{l5#|BdvK| z*Uh;?OA+lP;xlbu%%AMGusp@RVqCM#bwco9?mtWv;?sEO)8<>2f5|>rjM7F+zuvpl zO@4%7Q+8$g&>a&n#g7-JvxPLCeH2R;4+ZmDV(8C3#En+*JlMJ9D=^RB*;aJp1eGrL zE*?_J0$>>*!3uSbjp>|&sT^_Al4-D!rHv8KHWGfE8DfgG*Xr4Tq_Jpu8XK5sCnAXK zVI_hjEddj4;w_8x3&9wzN0s=Z_72#{h;`O}0Ta!x%iKv5>mi3c`^4pD%n8wTMA+q= zRv<-S_?=~YKrE45M+oTwj9Hl5gEYw=3vreW0I$9Lm)sJOj>D$vgh}IG1Jj)gu1F}x z0gTNX--n+r&kPnu-7`e7>eMq+zp&bj1I3ys-+M)hXKWcltb836rk{HfL)vNXT~uQE zyYbF+2JZ3uiiRak1k-y^V0xRNu;iCW*$3{k;}niH=VqF0UtkAp|HyE$pX*jz(xD1H zPaim#bX_p%t6=gkz-44_s<8Ex*T6jYbzL{k3?8q3dw!aGOekqrrkvzvDErE6R=IKlm zpP2R`#39|e0E0s3H)Gz&vkDnfd$4%f<%tF#j7 z$RSw(>X$wT%Arxmc)5L^x;W*`lZkvwotScZQvyuy9hT^mcGkLCpL#bKhdRFx{+qOY zXE~O-(mBB}IH^6o--J*%@vWPyi+At$SN9%1TpfM$?!Wun*UOK-zP!AtpX`p+*Y}S8 z^x@5A{gV#*pU+m`Jv={s^7Qf3lP6D}pS;*S-939;8r4%y(DUW_^5ks$X!YAgzF+Y+ a{q@bo)lI*h&c{L3?)~m}&;Rz~-v0np%x_Hq literal 0 HcmV?d00001 diff --git a/test/integration/objectstore/test_irods.py b/test/integration/objectstore/test_irods.py new file mode 100644 index 000000000000..636b73ee7ed6 --- /dev/null +++ b/test/integration/objectstore/test_irods.py @@ -0,0 +1,177 @@ +import os +import pytest +import shutil +import ssl +import subprocess +import time + +from irods.exception import CollectionDoesNotExist +from irods.exception import DataObjectDoesNotExist +from irods.session import iRODSSession + +from galaxy_test.driver import integration_util + +SCRIPT_DIRECTORY = os.path.abspath(os.path.dirname(__file__)) + +class IrodsObjectStoreIntegrationTestCase(integration_util.IntegrationTestCase): + + container_name = "irods_server" + + @classmethod + def setUpClass(cls): + print('Starting setUpClass') + super(IrodsObjectStoreIntegrationTestCase, cls).setUpClass() + IrodsObjectStoreIntegrationTestCase.start_irods_server(container_name=IrodsObjectStoreIntegrationTestCase.container_name) + + # Let the server start before running the test + time.sleep(10) + print('Finishing setUpClass') + + @classmethod + def tearDownClass(cls): + print('Starting tearDownClass') + super(IrodsObjectStoreIntegrationTestCase, cls).tearDownClass() + IrodsObjectStoreIntegrationTestCase.stop_irods_server(container_name=IrodsObjectStoreIntegrationTestCase.container_name) + print('Finishing tearDownClass') + + @classmethod + def start_irods_server(cls, container_name, postgres_port=5432, irods_port=1247, docker_image='kxk302/irods-server:0.1'): + start_server = ['docker', 'run', '-h', 'localhost', '-p', '{port}:5432'.format(port=postgres_port), '-p', '{port}:1247'.format(port=irods_port), '-d', '--name', container_name, docker_image] + subprocess.check_call(start_server) + + @classmethod + def stop_irods_server(cls, container_name): + subprocess.check_call(['docker', 'rm', '-f', container_name]) + + def test_get_existing_collection(self): + with iRODSSession(host='localhost', + port='1247', + user='rods', + password='rods', + zone='tempZone') as session: + + zone='tempZone' + user='rods' + + aCollection = "/" + zone + "/home/" + user + + coll = session.collections.get(aCollection) + assert coll.path == aCollection, "Error! Got wrong collection path" + assert len(coll.subcollections) == 0, "Error! Collection should not have any subcollections!" + assert len(coll.data_objects) == 0, "Error! Collection should not have any data objects!" + + def test_create_delete_new_collection(self): + with iRODSSession(host='localhost', + port='1247', + user='rods', + password='rods', + zone='tempZone') as session: + + zone='tempZone' + user='rods' + + newCollection = "/" + zone + "/home/" + user + "/testdir" + + coll = session.collections.create(newCollection) + assert coll.path == newCollection, "Error! Got wrong collection path" + assert len(coll.subcollections) == 0, "Error! Collection should not have any subcollections!" + assert len(coll.data_objects) == 0, "Error! Collection should not have any data objects!" + + coll.remove(recurse=True, force=True) + + with pytest.raises(CollectionDoesNotExist): + coll = session.collections.get(newCollection) + + def test_create_delete_new_data_object(self): + with iRODSSession(host='localhost', + port='1247', + user='rods', + password='rods', + zone='tempZone') as session: + + zone='tempZone' + user='rods' + + newCollection = "/" + zone + "/home/" + user + "/testdir" + newDataObject = newCollection + "/testDataObject" + + # Create new collection + coll = session.collections.create(newCollection) + assert coll.path == newCollection, "Error! Got wrong collection path" + assert len(coll.subcollections) == 0, "Error! Collection should not have any subcollections!" + assert len(coll.data_objects) == 0, "Error! Collection should not have any data objects!" + + # Create data object + obj = session.data_objects.create(newDataObject) + assert obj.name == "testDataObject", "Error! Got wrong data object" + + # Delete data object + obj.unlink(force=True) + + # Get data object + with pytest.raises(DataObjectDoesNotExist): + obj = session.data_objects.get(newDataObject) + + # Delete collection + coll.remove(recurse=True, force=True) + + with pytest.raises(CollectionDoesNotExist): + coll = session.collections.get(newCollection) + + def test_populate_fetch_new_data_object(self): + with iRODSSession(host='localhost', + port='1247', + user='rods', + password='rods', + zone='tempZone') as session: + + zone='tempZone' + user='rods' + + newCollection = "/" + zone + "/home/" + user + "/testdir" + fileName = "irods_beginner_training_2016.pdf" + fileNamePath = os.path.join(SCRIPT_DIRECTORY, fileName) + backupFileName = "irods_beginner_training_2016_backup.pdf" + backupFileNamePath = os.path.join(SCRIPT_DIRECTORY, backupFileName) + + # Copy file from backup + shutil.copyfile(fileNamePath, backupFileNamePath) + + # Create new collection + coll = session.collections.create(newCollection) + assert coll.path == newCollection, "Error! Got wrong collection path" + assert len(coll.subcollections) == 0, "Error! Collection should not have any subcollections!" + assert len(coll.data_objects) == 0, "Error! Collection should not have any data objects!" + + # Create new data object + session.data_objects.put(backupFileNamePath, newCollection + "/" + backupFileName) + + # Delete local file + os.remove(backupFileNamePath) + + # Get the data object back + obj = session.data_objects.get(newCollection + "/" + backupFileName) + + # Write the data object to the file system + with obj.open("r") as f_in, open(backupFileNamePath, "wb") as f_out: + f_out.write(f_in.read()) + + # Assert the size of file fetched from iRODS matches the local backup copy + assert os.path.getsize(fileNamePath) == os.path.getsize(backupFileNamePath), "Error! Size of file fetched from iRODS does not match the size of the original file" + + # Delete local file + os.remove(backupFileNamePath) + + # Delete data object + obj.unlink(force=True) + + # Get data object + with pytest.raises(DataObjectDoesNotExist): + obj = session.data_objects.get(newCollection + "/" + backupFileName) + + # Delete collection + coll.remove(recurse=True, force=True) + + # Get collection + with pytest.raises(CollectionDoesNotExist): + coll = session.collections.get(newCollection) From 4c7c2da3bd7aa6d5c38c8cb70beea90a302db4ca Mon Sep 17 00:00:00 2001 From: Anne Fouilloux Date: Sat, 8 Feb 2020 20:26:29 +0100 Subject: [PATCH 099/853] try to fix panoply interactive tool (#51) * try to fix panoply interactive tool * add colorbars for panoply * remove colorbars moved colorbars to dockerfile. Untar colorbars.tar in the user home --- interactivetool_panoply.xml | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/interactivetool_panoply.xml b/interactivetool_panoply.xml index 66c18d5139f2..2323bcae5c35 100644 --- a/interactivetool_panoply.xml +++ b/interactivetool_panoply.xml @@ -9,17 +9,26 @@ - + + + From 55dc0e6a2f361dbcbeda6fec22be38da27e17fd2 Mon Sep 17 00:00:00 2001 From: Gianmauro Cuccuru Date: Tue, 11 Feb 2020 11:16:37 +0100 Subject: [PATCH 100/853] add a new function to get the local ip address --- lib/galaxy_ext/container_monitor/monitor.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/galaxy_ext/container_monitor/monitor.py b/lib/galaxy_ext/container_monitor/monitor.py index 86987b81e2da..35e3c58d6fdb 100644 --- a/lib/galaxy_ext/container_monitor/monitor.py +++ b/lib/galaxy_ext/container_monitor/monitor.py @@ -12,6 +12,19 @@ from galaxy.tool_util.deps import docker_util +def get_ip(): + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + # doesn't even have to be reachable + s.connect(('10.255.255.255', 1)) + ip = s.getsockname()[0] + except Exception: + ip = None + finally: + s.close() + return ip + + def parse_ports(container_name, connection_configuration): while True: ports_command = docker_util.build_docker_simple_command("port", container_name=container_name, **connection_configuration) @@ -41,11 +54,7 @@ def main(): try: ports_raw = parse_ports(container_name, connection_configuration) if ports_raw is not None: - try: - host_ip = socket.gethostbyname(socket.gethostname()) - except Exception: - # doesn't work on OS X - host_ip = None + host_ip = get_ip() with open("container_runtime.json", "w") as f: ports = docker_util.parse_port_text(ports_raw) if host_ip is not None: From e5d1a7f1670c48e2077c9a2abc15eabdf352007e Mon Sep 17 00:00:00 2001 From: Gianmauro Cuccuru Date: Tue, 11 Feb 2020 15:07:07 +0100 Subject: [PATCH 101/853] move the function into a different path --- lib/galaxy/util/sockets.py | 13 +++++++++++++ lib/galaxy_ext/container_monitor/monitor.py | 15 +-------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/galaxy/util/sockets.py b/lib/galaxy/util/sockets.py index ffc246627e1d..826e69c1a23c 100644 --- a/lib/galaxy/util/sockets.py +++ b/lib/galaxy/util/sockets.py @@ -4,6 +4,19 @@ import subprocess +def get_ip(): + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + # doesn't even have to be reachable + s.connect(('10.255.255.255', 1)) + ip = s.getsockname()[0] + except Exception: + ip = None + finally: + s.close() + return ip + + def unused_port(range=None): if range: return __unused_port_on_range(range) diff --git a/lib/galaxy_ext/container_monitor/monitor.py b/lib/galaxy_ext/container_monitor/monitor.py index 35e3c58d6fdb..e3254f2cc70f 100644 --- a/lib/galaxy_ext/container_monitor/monitor.py +++ b/lib/galaxy_ext/container_monitor/monitor.py @@ -1,6 +1,5 @@ import json import os -import socket import subprocess import sys import tempfile @@ -10,19 +9,7 @@ sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir))) from galaxy.tool_util.deps import docker_util - - -def get_ip(): - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - try: - # doesn't even have to be reachable - s.connect(('10.255.255.255', 1)) - ip = s.getsockname()[0] - except Exception: - ip = None - finally: - s.close() - return ip +from galaxy.util.sockets import get_ip def parse_ports(container_name, connection_configuration): From bda4454671564810febbe4491a923e95d47c6344 Mon Sep 17 00:00:00 2001 From: Anne Fouilloux Date: Sat, 15 Feb 2020 12:22:19 +0100 Subject: [PATCH 102/853] update docker for interactive climate (#53) * update docker for interactive climate * test if data or not before copy --- interactivetool_climate_notebook.xml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/interactivetool_climate_notebook.xml b/interactivetool_climate_notebook.xml index aa1692ada80c..0ddca7eacb83 100644 --- a/interactivetool_climate_notebook.xml +++ b/interactivetool_climate_notebook.xml @@ -1,6 +1,6 @@ - + - nordicesmhub/docker-climate-notebook:1.0 + nordicesmhub/docker-climate-notebook:1.2 @@ -21,8 +21,10 @@ mkdir -p ./jupyter/outputs/ && mkdir -p ./jupyter/data && - #set $cleaned_name = re.sub('[^\w\-\.]', '_', str($input.element_identifier)) - ln -sf '$input' './jupyter/data/${cleaned_name}' && + #if $input: + #set $cleaned_name = re.sub('[^\w\-\.]', '_', str($input.element_identifier)) + cp '$input' './jupyter/data/${cleaned_name}' && + #end if ## change into the directory where the notebooks are located cd ./jupyter/ && From 79d63abf72566c85dfdd486e587005796e78f42f Mon Sep 17 00:00:00 2001 From: Anne Fouilloux Date: Sat, 15 Feb 2020 15:01:26 +0100 Subject: [PATCH 103/853] Try to follow panoply developer recommendations (#52) * Try to follow panoply developer recommendations to fix errors * bug fix: do not fail if no png If users do not create any png files, it should not fail --- interactivetool_panoply.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/interactivetool_panoply.xml b/interactivetool_panoply.xml index 2323bcae5c35..5e84abffe8ac 100644 --- a/interactivetool_panoply.xml +++ b/interactivetool_panoply.xml @@ -9,17 +9,17 @@ From 057dc3a9cc47a31c54d45ac47b81e92528237af7 Mon Sep 17 00:00:00 2001 From: Kaivan Kamali Date: Wed, 19 Feb 2020 13:53:17 -0500 Subject: [PATCH 104/853] Revised parts of rods.py to use the new iRods Python client code. test_datatype_upload.py passes now with iRods as the object store. --- lib/galaxy/objectstore/rods.py | 985 ++++++++++++++++++++++++--------- lib/galaxy/objectstore/s3.py | 4 +- 2 files changed, 713 insertions(+), 276 deletions(-) diff --git a/lib/galaxy/objectstore/rods.py b/lib/galaxy/objectstore/rods.py index 65114037c16b..872354330f85 100644 --- a/lib/galaxy/objectstore/rods.py +++ b/lib/galaxy/objectstore/rods.py @@ -1,20 +1,27 @@ """ Object Store plugin for the Integrated Rule-Oriented Data Store (iRODS) - -The module is named rods to avoid conflicting with the PyRods module, irods """ - import logging +import multiprocessing import os +from pathlib import Path +import shutil +import subprocess +import threading import time +from datetime import datetime + from posixpath import ( basename as path_basename, dirname as path_dirname, join as path_join ) - try: import irods + import irods.keywords as kw + from irods.exception import CollectionDoesNotExist + from irods.exception import DataObjectDoesNotExist + from irods.session import iRODSSession except ImportError: irods = None @@ -22,59 +29,275 @@ ObjectInvalid, ObjectNotFound ) +from galaxy.util import ( + directory_hash_id, + string_as_bool, + umask_fix_perms, + which, +) from galaxy.util.path import safe_relpath +from galaxy.util.sleeper import Sleeper +from .s3_multipart_upload import multipart_upload from ..objectstore import ( DiskObjectStore, - local_extra_dirs + local_extra_dirs, + convert_bytes ) -IRODS_IMPORT_MESSAGE = ('The Python irods package is required to use this ' - 'feature, please install it') +IRODS_IMPORT_MESSAGE = ('The Python irods package is required to use this feature, please install it') log = logging.getLogger(__name__) +def parse_config_xml(config_xml): + print('IRODS2: inside parse_config_xml') + try: + a_xml = config_xml.findall('auth')[0] + username = a_xml.get('username') + password = a_xml.get('password') -class IRODSObjectStore(DiskObjectStore): - """ - Galaxy object store based on iRODS - """ + b_xml = config_xml.findall('resource')[0] + resource_name = b_xml.get('name') - def __init__(self, config, file_path=None, extra_dirs=None): - super(IRODSObjectStore, self).__init__(config, file_path=file_path, extra_dirs=extra_dirs) - assert irods is not None, IRODS_IMPORT_MESSAGE - self.cache_path = config.object_store_cache_path - self.default_resource = config.irods_default_resource or None + b_xml = config_xml.findall('zone')[0] + zone_name = b_xml.get('name') - # Connect to iRODS (AssertionErrors will be raised if anything goes wrong) - self.rods_env, self.rods_conn = rods_connect() - - # if the root collection path in the config is unset or relative, try to use a sensible default - if config.irods_root_collection_path is None or (config.irods_root_collection_path is not None and not config.irods_root_collection_path.startswith('/')): - rods_home = self.rods_env.rodsHome - assert rods_home != '', "Unable to initialize iRODS Object Store: rodsHome cannot be determined and irods_root_collection_path in Galaxy config is unset or not absolute." - if config.irods_root_collection_path is None: - self.root_collection_path = path_join(rods_home, 'galaxy_data') - else: - self.root_collection_path = path_join(rods_home, config.irods_root_collection_path) + cn_xml = config_xml.findall('connection') + if not cn_xml: + cn_xml = {} else: - self.root_collection_path = config.irods_root_collection_path - - # will return a collection object regardless of whether it exists - self.root_collection = irods.irodsCollection(self.rods_conn, self.root_collection_path) - - if self.root_collection.getId() == -1: - log.warning("iRODS root collection does not exist, will attempt to create: %s", self.root_collection_path) - self.root_collection.upCollection() - assert self.root_collection.createCollection(os.path.basename(self.root_collection_path)) == 0, "iRODS root collection creation failed: %s" % self.root_collection_path - self.root_collection = irods.irodsCollection(self.rods_conn, self.root_collection_path) - assert self.root_collection.getId() != -1, "iRODS root collection creation claimed success but still does not exist" - - if self.default_resource is None: - self.default_resource = self.rods_env.rodsDefResource - - log.info("iRODS data for this instance will be stored in collection: %s, resource: %s", self.root_collection_path, self.default_resource) - - def __get_rods_path(self, obj, base_dir=None, dir_only=False, extra_dir=None, extra_dir_at_root=False, alt_name=None, strip_dat=True, **kwargs): + cn_xml = cn_xml[0] + + host = cn_xml.get('host', None) + port = int(cn_xml.get('port', 0)) + + c_xml = config_xml.findall('cache')[0] + cache_size = float(c_xml.get('size', -1)) + staging_path = c_xml.get('path', None) + + tag, attrs = 'extra_dir', ('type', 'path') + extra_dirs = config_xml.findall(tag) + if not extra_dirs: + msg = 'No {tag} element in XML tree'.format(tag=tag) + log.error(msg) + raise Exception(msg) + extra_dirs = [dict(((k, e.get(k)) for k in attrs)) for e in extra_dirs] + + return { + 'auth': { + 'username': username, + 'password': password, + }, + 'resource': { + 'name': resource_name, + }, + 'zone': { + 'name': zone_name, + }, + 'connection': { + 'host': host, + 'port': port, + }, + 'cache': { + 'size': cache_size, + 'path': staging_path, + }, + 'extra_dirs': extra_dirs, + } + except Exception: + # Toss it back up after logging, we can't continue loading at this point. + log.exception("Malformed iRODS ObjectStore Configuration XML -- unable to continue") + raise + +class CloudConfigMixin(object): + + def _config_to_dict(self): + print('IRODS2: inside _config_to_dict') + return { + 'auth': { + 'username': self.username, + 'password': self.password, + }, + 'resource': { + 'name': self.resource, + }, + 'zone': { + 'name': self.zone, + }, + 'connection': { + 'host': self.host, + 'port': self.port, + }, + 'cache': { + 'size': self.cache_size, + 'path': self.staging_path, + } + } + +class IRODSObjectStore(DiskObjectStore, CloudConfigMixin): + """ + Object store that stores objects as data objects in an iRODS collection. A local cache + exists that is used as an intermediate location for files between Galaxy and iRODS. + """ + + store_type = 'irods' + + #def _get_bucket(self, bucket_name): + #def _get_size_in_s3(self, rel_path): + #def _key_exists(self, rel_path): + + def __init__(self, config, config_dict): + super(IRODSObjectStore, self).__init__(config, config_dict) + print('IRODS2: inside __init__') + + auth_dict = config_dict['auth'] + self.username = auth_dict.get('username') + self.password = auth_dict.get('password') + + resource_dict = config_dict['resource'] + self.resource = resource_dict.get('name') + + zone_dict = config_dict['zone'] + self.zone = zone_dict.get('name') + + connection_dict = config_dict['connection'] + self.host = connection_dict.get('host') + self.port = connection_dict.get('port') + + cache_dict = config_dict['cache'] + self.cache_size = cache_dict.get('size', -1) + self.staging_path = cache_dict.get('path') or self.config.object_store_cache_path + + extra_dirs = dict((e['type'], e['path']) for e in config_dict.get('extra_dirs', [])) + self.extra_dirs.update(extra_dirs) + + log.debug("Object cache dir: %s", self.staging_path) + log.debug("Job work dir: %s", self.extra_dirs['job_work']) + + self._initialize() + + def __del__(self): + print('IRODS2: inside __del__') + self.session.cleanup() + + def _initialize(self): + if irods is None: + raise Exception(IRODS_IMPORT_MESSAGE) + + self.home = "/" + self.zone + "/home/" + self.username + + self.session = self._configure_connection() + #self.bucket = self._get_bucket(self.bucket) + # Clean cache only if value is set in galaxy.ini + if self.cache_size != -1: + # Convert GBs to bytes for comparison + self.cache_size = self.cache_size * 1073741824 + # Helper for interruptable sleep + self.sleeper = Sleeper() + self.cache_monitor_thread = threading.Thread(target=self.__cache_monitor) + self.cache_monitor_thread.start() + log.info("Cache cleaner manager started") + # Test if 'axel' is available for parallel download and pull the key into cache + if which('axel'): + self.use_axel = True + else: + self.use_axel = False + + def _configure_connection(self, host='localhost', port='1247', user='rods', password='rods', zone='tempZone'): + with iRODSSession(host=host, port=port, user=user, password=password, zone=zone) as session: + ###assert session.pool.get_connection() == 1, 'Failed to establish iRODS session' + print('IRODS2: inside iRODSSession') + return session + + @classmethod + def parse_xml(cls, config_xml): + print('IRODS2: inside parse_xml') + return parse_config_xml(config_xml) + + def to_dict(self): + print('IRODS: inside to_dict') + as_dict = super(IRODSObjectStore, self).to_dict() + as_dict.update(self._config_to_dict()) + return as_dict + + def __cache_monitor(self): + time.sleep(2) # Wait for things to load before starting the monitor + while self.running: + total_size = 0 + # Is this going to be too expensive of an operation to be done frequently? + file_list = [] + for dirpath, _, filenames in os.walk(self.staging_path): + for filename in filenames: + filepath = os.path.join(dirpath, filename) + file_size = os.path.getsize(filepath) + total_size += file_size + # Get the time given file was last accessed + last_access_time = time.localtime(os.stat(filepath)[7]) + # Compose a tuple of the access time and the file path + file_tuple = last_access_time, filepath, file_size + file_list.append(file_tuple) + # Sort the file list (based on access time) + file_list.sort() + # Initiate cleaning once within 10% of the defined cache size? + cache_limit = self.cache_size * 0.9 + if total_size > cache_limit: + log.info("Initiating cache cleaning: current cache size: %s; clean until smaller than: %s", + convert_bytes(total_size), convert_bytes(cache_limit)) + # How much to delete? If simply deleting up to the cache-10% limit, + # is likely to be deleting frequently and may run the risk of hitting + # the limit - maybe delete additional #%? + # For now, delete enough to leave at least 10% of the total cache free + delete_this_much = total_size - cache_limit + self.__clean_cache(file_list, delete_this_much) + self.sleeper.sleep(30) # Test cache size every 30 seconds? + + def __clean_cache(self, file_list, delete_this_much): + """ Keep deleting files from the file_list until the size of the deleted + files is greater than the value in delete_this_much parameter. + + :type file_list: list + :param file_list: List of candidate files that can be deleted. This method + will start deleting files from the beginning of the list so the list + should be sorted accordingly. The list must contains 3-element tuples, + positioned as follows: position 0 holds file last accessed timestamp + (as time.struct_time), position 1 holds file path, and position 2 has + file size (e.g., (, /mnt/data/dataset_1.dat), 472394) + + :type delete_this_much: int + :param delete_this_much: Total size of files, in bytes, that should be deleted. + """ + # Keep deleting datasets from file_list until deleted_amount does not + # exceed delete_this_much; start deleting from the front of the file list, + # which assumes the oldest files come first on the list. + deleted_amount = 0 + for entry in file_list: + if deleted_amount < delete_this_much: + deleted_amount += entry[2] + os.remove(entry[1]) + # Debugging code for printing deleted files' stats + # folder, file_name = os.path.split(f[1]) + # file_date = time.strftime("%m/%d/%y %H:%M:%S", f[0]) + # log.debug("%s. %-25s %s, size %s (deleted %s/%s)" \ + # % (i, file_name, convert_bytes(f[2]), file_date, \ + # convert_bytes(deleted_amount), convert_bytes(delete_this_much))) + else: + log.debug("Cache cleaning done. Total space freed: %s", convert_bytes(deleted_amount)) + return + + # def _get_bucket(self, bucket_name): + + def _fix_permissions(self, rel_path): + """ Set permissions on rel_path""" + for basedir, _, files in os.walk(rel_path): + umask_fix_perms(basedir, self.config.umask, 0o777, self.config.gid) + for filename in files: + path = os.path.join(basedir, filename) + # Ignore symlinks + if os.path.islink(path): + continue + umask_fix_perms(path, self.config.umask, 0o666, self.config.gid) + + def _construct_path(self, obj, base_dir=None, dir_only=None, extra_dir=None, extra_dir_at_root=False, alt_name=None, obj_dir=False, **kwargs): + print('************* Entering _construct_path **************') # extra_dir should never be constructed from provided data but just # make sure there are no shenannigans afoot if extra_dir and extra_dir != os.path.normpath(extra_dir): @@ -86,270 +309,484 @@ def __get_rods_path(self, obj, base_dir=None, dir_only=False, extra_dir=None, ex if not safe_relpath(alt_name): log.warning('alt_name would locate path outside dir: %s', alt_name) raise ObjectInvalid("The requested object is invalid") - # alt_name can contain parent directory references, but iRODS will - # not follow them, so if they are valid we normalize them out + # alt_name can contain parent directory references, but S3 will not + # follow them, so if they are valid we normalize them out alt_name = os.path.normpath(alt_name) - path = "" + rel_path = os.path.join(*directory_hash_id(obj.id)) + print('obj.id: ', obj.id) + print('rel_path: ', rel_path) if extra_dir is not None: - path = extra_dir + if extra_dir_at_root: + rel_path = os.path.join(extra_dir, rel_path) + print('rel_path: ', rel_path) + else: + rel_path = os.path.join(rel_path, extra_dir) + print('rel_path: ', rel_path) - # extra_dir_at_root is ignored - since the iRODS plugin does not use - # the directory hash, there is only one level of subdirectory. + # for JOB_WORK directory + if obj_dir: + rel_path = os.path.join(rel_path, str(obj.id)) + if base_dir: + base = self.extra_dirs.get(base_dir) + print('************* Exiting 1 _construct_path **************') + return os.path.join(base, rel_path) + + # S3 folders are marked by having trailing '/' so add it now + ###rel_path = '%s/' % rel_path if not dir_only: - # the .dat extension is stripped when stored in iRODS - # TODO: is the strip_dat kwarg the best way to implement this? - if strip_dat and alt_name and alt_name.endswith('.dat'): - alt_name = os.path.splitext(alt_name)[0] - default_name = 'dataset_%s' % obj.id - if not strip_dat: - default_name += '.dat' - path = path_join(path, alt_name if alt_name else default_name) - - path = path_join(self.root_collection_path, path) - return path - - def __get_cache_path(self, obj, **kwargs): - # FIXME: does not handle collections - # FIXME: collisions could occur here - return os.path.join(self.cache_path, path_basename(self.__get_rods_path(obj, strip_dat=False, **kwargs))) - - def __clean_cache_entry(self, obj, **kwargs): - # FIXME: does not handle collections + rel_path = os.path.join(rel_path, alt_name if alt_name else "dataset_%s.dat" % obj.id) + print('************* Exiting 2 _construct_path **************') + return rel_path + + def _get_cache_path(self, rel_path): + return os.path.abspath(os.path.join(self.staging_path, rel_path)) + + #def _get_transfer_progress(self): + # return self.transfer_progress + + #def _get_size_in_s3(self, rel_path): + + def _get_size_in_irods(self, rel_path): + ''' try: - os.unlink(self.__get_cache_path(obj, **kwargs)) - except OSError: - # it is expected that we'll call this method a lot regardless of - # whether we think the cached file exists - pass + key = self.bucket.get_key(rel_path) + if key: + return key.size + except S3ResponseError: + log.exception("Could not get size of key '%s' from S3", rel_path) + return -1 + ''' + + def _data_object_exists(self, rel_path): + exists = False + try: + # A hackish way of testing if the rel_path is a folder vs a file + is_dir = rel_path[-1] == '/' + if is_dir: + keyresult = self.bucket.get_all_keys(prefix=rel_path) + if len(keyresult) > 0: + exists = True + else: + exists = False + else: + key = Key(self.bucket, rel_path) + exists = key.exists() + except S3ResponseError: + log.exception("Trouble checking existence of S3 key '%s'", rel_path) + return False + if rel_path[0] == '/': + raise + return exists + + def _in_cache(self, rel_path): + """ Check if the given dataset is in the local cache and return True if so. """ + # log.debug("------ Checking cache for rel_path %s" % rel_path) + print('*************** Entering _in_cache() *****************') + cache_path = self._get_cache_path(rel_path) + print('cache_path: ', cache_path) + print('os.path.exists: ', os.path.exists(cache_path)) + print('*************** Exiting _in_cache() *****************') + return os.path.exists(cache_path) + # TODO: Part of checking if a file is in cache should be to ensure the + # size of the cached file matches that on S3. Once the upload tool explicitly + # creates, this check sould be implemented- in the mean time, it's not + # looking likely to be implementable reliably. + # if os.path.exists(cache_path): + # # print("***1 %s exists" % cache_path) + # if self._key_exists(rel_path): + # # print("***2 %s exists in S3" % rel_path) + # # Make sure the size in cache is available in its entirety + # # print("File '%s' cache size: %s, S3 size: %s" % (cache_path, os.path.getsize(cache_path), self._get_size_in_s3(rel_path))) + # if os.path.getsize(cache_path) == self._get_size_in_s3(rel_path): + # # print("***2.1 %s exists in S3 and the size is the same as in cache (in_cache=True)" % rel_path) + # exists = True + # else: + # # print("***2.2 %s exists but differs in size from cache (in_cache=False)" % cache_path) + # exists = False + # else: + # # Although not perfect decision making, this most likely means + # # that the file is currently being uploaded + # # print("***3 %s found in cache but not in S3 (in_cache=True)" % cache_path) + # exists = True + # else: + + def _pull_into_cache(self, rel_path): + # Ensure the cache directory structure exists (e.g., dataset_#_files/) + rel_path_dir = os.path.dirname(rel_path) + if not os.path.exists(self._get_cache_path(rel_path_dir)): + os.makedirs(self._get_cache_path(rel_path_dir)) + # Now pull in the file + file_ok = self._download(rel_path) + self._fix_permissions(self._get_cache_path(rel_path_dir)) + return file_ok + + #def _transfer_cb(self, complete, total): + # self.transfer_progress += 10 + + def _download(self, rel_path): + try: + log.debug("Pulling key '%s' into cache to %s", rel_path, self._get_cache_path(rel_path)) + key = self.bucket.get_key(rel_path) + # Test if cache is large enough to hold the new file + if self.cache_size > 0 and key.size > self.cache_size: + log.critical("File %s is larger (%s) than the cache size (%s). Cannot download.", + rel_path, key.size, self.cache_size) + return False + if self.use_axel: + log.debug("Parallel pulled key '%s' into cache to %s", rel_path, self._get_cache_path(rel_path)) + ncores = multiprocessing.cpu_count() + url = key.generate_url(7200) + ret_code = subprocess.call(['axel', '-a', '-n', ncores, url]) + if ret_code == 0: + return True + else: + log.debug("Pulled key '%s' into cache to %s", rel_path, self._get_cache_path(rel_path)) + self.transfer_progress = 0 # Reset transfer progress counter + key.get_contents_to_filename(self._get_cache_path(rel_path), cb=self._transfer_cb, num_cb=10) + return True + except S3ResponseError: + log.exception("Problem downloading key '%s' from S3 bucket '%s'", rel_path, self.bucket.name) + return False - def __get_rods_handle(self, obj, mode='r', **kwargs): - if kwargs.get('dir_only', False): - return irods.irodsCollection(self.rods_conn, self.__get_rods_path(obj, **kwargs)) + def _push_to_os(self, rel_path, source_file=None, from_string=None): + """ + Push the file pointed to by ``rel_path`` to the iRODS. Extract folder name + from rel_path as iRODS collection name, and extract file name from rel_path + as iRODS data object name. + If ``source_file`` is provided, push that file instead while + still using ``rel_path`` for collection and object tore names. + If ``from_string`` is provided, set contents of the file to the value of + the string. + """ + print('**** Entering _push_to_os ****') + print('IRODS: rel_path: ', rel_path) + p = Path(rel_path) + print('p: ', p) + print('p.parent: ', p.parent) + print('p.stem: ', p.stem) + print('p.suffix: ', p.suffix) + + data_object = p.stem + p.suffix + subcollection = p.parent + print('data_object: ', data_object) + print('subcollection: ', subcollection) + + source_file = source_file if source_file else self._get_cache_path(rel_path) + print('IRODS: source_file: ', source_file) + + options = {kw.FORCE_FLAG_KW: ''} + + if os.path.exists(source_file): + # Check if the data object exists in iRODS + subcollection_path = self.home + "/" + str(subcollection) + full_irods_path = subcollection_path + "/" + str(data_object) + print('full_irods_path: ', full_irods_path) + exists = self.session.data_objects.exists(full_irods_path) + if os.path.getsize(source_file) == 0 and exists: + log.debug("Wanted to push file '%s' to iRODS collection '%s' but its size is 0; skipping.", source_file, rel_path) + print('**** Exiting 1 _push_to_os ****') + return True + if from_string: + data_obj = self.session.data_objects.create(full_irods_path, recurse=True, **options) + with data_obj.open('w') as data_obj_fp: + data_obj_fp.write(from_string) + log.debug("Pushed data from string '%s' to collection '%s'", from_string, full_irods_path) + else: + start_time = datetime.now() + log.debug("Pushing cache file '%s' of size %s bytes to collection '%s'", source_file, os.path.getsize(source_file), rel_path) + + # Create sub-collection first + self.session.collections.create(subcollection_path) + + file_content = None + with open(source_file, 'rb') as content_file: + file_content = content_file.read() + + # Write to file in subcollection created above + data_obj = self.session.data_objects.create(full_irods_path, recurse=True, **options) + with data_obj.open('w') as data_obj_fp: + data_obj_fp.write(file_content) + + end_time = datetime.now() + log.debug("Pushed cache file '%s' to collection '%s' (%s bytes transfered in %s sec)", + source_file, rel_path, os.path.getsize(source_file), end_time - start_time) + print('**** Exiting 2 _push_to_os ****') + return True else: - return irods.irodsOpen(self.rods_conn, self.__get_rods_path(obj, **kwargs), mode) + log.error("Tried updating key '%s' from source file '%s', but source file does not exist.", + rel_path, source_file) + + print('**** Exiting 3 _push_to_os ****') + return False - def __mkcolls(self, rods_path): + def file_ready(self, obj, **kwargs): """ - An os.makedirs() for iRODS collections. `rods_path` is the desired collection to create. + A helper method that checks if a file corresponding to a dataset is + ready and available to be used. Return ``True`` if so, ``False`` otherwise. """ - assert rods_path.startswith(self.root_collection_path + '/'), '__mkcolls(): Creating collections outside the root collection is not allowed (requested path was: %s)' % rods_path - mkcolls = [] - c = irods.irodsCollection(self.rods_conn, rods_path) - while c.getId() == -1: - assert c.getCollName().startswith(self.root_collection_path + '/'), '__mkcolls(): Attempted to move above the root collection: %s' % c.getCollName() - mkcolls.append(c.getCollName()) - c.upCollection() - for collname in reversed(mkcolls): - log.debug('Creating collection %s' % collname) - ci = irods.collInp_t() - ci.collName = collname - status = irods.rcCollCreate(self.rods_conn, ci) - assert status == 0, '__mkcolls(): Failed to create collection: %s' % collname - - @local_extra_dirs + rel_path = self._construct_path(obj, **kwargs) + # Make sure the size in cache is available in its entirety + if self._in_cache(rel_path): + if os.path.getsize(self._get_cache_path(rel_path)) == self._get_size_in_s3(rel_path): + return True + log.debug("Waiting for dataset %s to transfer from OS: %s/%s", rel_path, + os.path.getsize(self._get_cache_path(rel_path)), self._get_size_in_s3(rel_path)) + return False + def exists(self, obj, **kwargs): - doi = irods.dataObjInp_t() - doi.objPath = self.__get_rods_path(obj, **kwargs) - log.debug('exists(): checking: %s', doi.objPath) - return irods.rcObjStat(self.rods_conn, doi) is not None + print('*************Entering exists()*************') + in_cache = in_irods = False + for key, value in kwargs.items(): + print("The value of {} is {}".format(key, value)) + rel_path = self._construct_path(obj, **kwargs) + print('rel_path: ', rel_path) + + # Check cache + if self._in_cache(rel_path): + in_cache = True + # Check iRODS + ###in_irods = self._data_object_exists(rel_path) + + # dir_only does not get synced so shortcut the decision + dir_only = kwargs.get('dir_only', False) + base_dir = kwargs.get('base_dir', None) + if dir_only: + if in_cache or in_irods: + print('*************Exiting 1 exists()*************') + return True + # for JOB_WORK directory + elif base_dir: + if not os.path.exists(rel_path): + os.makedirs(rel_path) + print('*************Exiting 2 exists()*************') + return True + else: + print('*************Exiting 3 exists()*************') + return False + + # TODO: Sync should probably not be done here. Add this to an async upload stack? + if in_cache and not in_irods: + self._push_to_os(rel_path, source_file=self._get_cache_path(rel_path)) + print('*************Exiting 4 exists()*************') + return True + elif in_irods: + print('*************Exiting 5 exists()*************') + return True + else: + print('*************Exiting 6 exists()*************') + return False - @local_extra_dirs def create(self, obj, **kwargs): if not self.exists(obj, **kwargs): - rods_path = self.__get_rods_path(obj, **kwargs) - log.debug('create(): %s', rods_path) + + # Pull out locally used fields + extra_dir = kwargs.get('extra_dir', None) + extra_dir_at_root = kwargs.get('extra_dir_at_root', False) dir_only = kwargs.get('dir_only', False) - # short circuit collection creation since most of the time it will - # be the root collection which already exists - collection_path = rods_path if dir_only else path_dirname(rods_path) - if collection_path != self.root_collection_path: - self.__mkcolls(collection_path) + alt_name = kwargs.get('alt_name', None) + + # Construct hashed path + rel_path = os.path.join(*directory_hash_id(obj.id)) + + # Optionally append extra_dir + if extra_dir is not None: + if extra_dir_at_root: + rel_path = os.path.join(extra_dir, rel_path) + else: + rel_path = os.path.join(rel_path, extra_dir) + + # Create given directory in cache + cache_dir = os.path.join(self.staging_path, rel_path) + if not os.path.exists(cache_dir): + os.makedirs(cache_dir) + + # Although not really necessary to create S3 folders (because S3 has + # flat namespace), do so for consistency with the regular file system + # S3 folders are marked by having trailing '/' so add it now + # s3_dir = '%s/' % rel_path + # self._push_to_os(s3_dir, from_string='') + # If instructed, create the dataset in cache & in S3 if not dir_only: - # rcDataObjCreate is used instead of the irodsOpen wrapper so - # that we can prevent overwriting - doi = irods.dataObjInp_t() - doi.objPath = rods_path - doi.createMode = 0o640 - doi.dataSize = 0 # 0 actually means "unknown", although literally 0 would be preferable - irods.addKeyVal(doi.condInput, irods.DEST_RESC_NAME_KW, self.default_resource) - status = irods.rcDataObjCreate(self.rods_conn, doi) - assert status >= 0, 'create(): rcDataObjCreate() failed: %s: %s: %s' % (rods_path, status, irods.strerror(status)) - - @local_extra_dirs + rel_path = os.path.join(rel_path, alt_name if alt_name else "dataset_%s.dat" % obj.id) + open(os.path.join(self.staging_path, rel_path), 'w').close() + self._push_to_os(rel_path, from_string='') + def empty(self, obj, **kwargs): - assert 'dir_only' not in kwargs, 'empty(): `dir_only` parameter is invalid here' - h = self.__get_rods_handle(obj, **kwargs) - try: - return h.getSize() == 0 - except AttributeError: - # h is None - raise ObjectNotFound() + if self.exists(obj, **kwargs): + return bool(self.size(obj, **kwargs) > 0) + else: + raise ObjectNotFound('objectstore.empty, object does not exist: %s, kwargs: %s' + % (str(obj), str(kwargs))) def size(self, obj, **kwargs): - assert 'dir_only' not in kwargs, 'size(): `dir_only` parameter is invalid here' - h = self.__get_rods_handle(obj, **kwargs) - try: - return h.getSize() - except AttributeError: - # h is None - return 0 + print('*************** Entering size ****************') + rel_path = self._construct_path(obj, **kwargs) + if self._in_cache(rel_path): + try: + print('*************** Exiting 1 size ****************') + return os.path.getsize(self._get_cache_path(rel_path)) + except OSError as ex: + log.info("Could not get size of file '%s' in local cache, will try S3. Error: %s", rel_path, ex) + elif self.exists(obj, **kwargs): + print('*************** Exiting 2 size ****************') + ## + ## TODO + ## + return self._get_size_in_s3(rel_path) + log.warning("Did not find dataset '%s', returning 0 for size", rel_path) + print('*************** Exiting 3 size ****************') + return 0 - @local_extra_dirs def delete(self, obj, entire_dir=False, **kwargs): - assert 'dir_only' not in kwargs, 'delete(): `dir_only` parameter is invalid here' - rods_path = self.__get_rods_path(obj, **kwargs) - # __get_rods_path prepends self.root_collection_path but we are going - # to ensure that it's valid anyway for safety's sake - assert rods_path.startswith(self.root_collection_path + '/'), 'ERROR: attempt to delete object outside root collection (path was: %s)' % rods_path - if entire_dir: - # TODO - raise NotImplementedError() - h = self.__get_rods_handle(obj, **kwargs) + rel_path = self._construct_path(obj, **kwargs) + extra_dir = kwargs.get('extra_dir', None) + base_dir = kwargs.get('base_dir', None) + dir_only = kwargs.get('dir_only', False) + obj_dir = kwargs.get('obj_dir', False) try: - # note: PyRods' irodsFile.delete() does not set force - status = h.delete() - assert status == 0, '%d: %s' % (status, irods.strerror(status)) - return True - except AttributeError: - log.warning('delete(): operation failed: object does not exist: %s', rods_path) - except AssertionError as e: - # delete() does not raise on deletion failure - log.error('delete(): operation failed: %s', e) - finally: - # remove the cached entry (finally is executed even when the try - # contains a return) - self.__clean_cache_entry(self, obj, **kwargs) + # Remove temparory data in JOB_WORK directory + if base_dir and dir_only and obj_dir: + shutil.rmtree(os.path.abspath(rel_path)) + return True + + # For the case of extra_files, because we don't have a reference to + # individual files/keys we need to remove the entire directory structure + # with all the files in it. This is easy for the local file system, + # but requires iterating through each individual key in S3 and deleing it. + if entire_dir and extra_dir: + shutil.rmtree(self._get_cache_path(rel_path)) + results = self.bucket.get_all_keys(prefix=rel_path) + for key in results: + log.debug("Deleting key %s", key.name) + key.delete() + return True + else: + # Delete from cache first + os.unlink(self._get_cache_path(rel_path)) + # Delete from S3 as well + if self._key_exists(rel_path): + key = Key(self.bucket, rel_path) + log.debug("Deleting key %s", key.name) + key.delete() + return True + except S3ResponseError: + log.exception("Could not delete key '%s' from S3", rel_path) + except OSError: + log.exception('%s delete error', self.get_filename(obj, **kwargs)) return False - @local_extra_dirs def get_data(self, obj, start=0, count=-1, **kwargs): - log.debug('get_data(): %s') - h = self.__get_rods_handle(obj, **kwargs) - try: - h.seek(start) - except AttributeError: - raise ObjectNotFound() - if count == -1: - return h.read() - else: - return h.read(count) - # TODO: make sure implicit close is okay, DiskObjectStore actually - # reads data into a var, closes, and returns the var + rel_path = self._construct_path(obj, **kwargs) + # Check cache first and get file if not there + if not self._in_cache(rel_path): + self._pull_into_cache(rel_path) + # Read the file content from cache + data_file = open(self._get_cache_path(rel_path), 'r') + data_file.seek(start) + content = data_file.read(count) + data_file.close() + return content - @local_extra_dirs def get_filename(self, obj, **kwargs): - log.debug("get_filename(): called on %s %s. For better performance, avoid this method and use get_data() instead.", obj.__class__.__name__, obj.id) - cached_path = self.__get_cache_path(obj, **kwargs) + base_dir = kwargs.get('base_dir', None) + dir_only = kwargs.get('dir_only', False) + obj_dir = kwargs.get('obj_dir', False) + rel_path = self._construct_path(obj, **kwargs) + + # for JOB_WORK directory + if base_dir and dir_only and obj_dir: + return os.path.abspath(rel_path) + + cache_path = self._get_cache_path(rel_path) + # S3 does not recognize directories as files so cannot check if those exist. + # So, if checking dir only, ensure given dir exists in cache and return + # the expected cache path. + # dir_only = kwargs.get('dir_only', False) + # if dir_only: + # if not os.path.exists(cache_path): + # os.makedirs(cache_path) + # return cache_path + # Check if the file exists in the cache first + if self._in_cache(rel_path): + return cache_path + # Check if the file exists in persistent storage and, if it does, pull it into cache + elif self.exists(obj, **kwargs): + if dir_only: # Directories do not get pulled into cache + return cache_path + else: + if self._pull_into_cache(rel_path): + return cache_path + # For the case of retrieving a directory only, return the expected path + # even if it does not exist. + # if dir_only: + # return cache_path + raise ObjectNotFound('objectstore.get_filename, no cache_path: %s, kwargs: %s' + % (str(obj), str(kwargs))) + # return cache_path # Until the upload tool does not explicitly create the dataset, return expected path - if not self.exists(obj, **kwargs): - raise ObjectNotFound() - - # TODO: implement or define whether dir_only is valid - if 'dir_only' in kwargs: - raise NotImplementedError() - - # cache hit - if os.path.exists(cached_path): - return os.path.abspath(cached_path) - - # cache miss - # TODO: thread this - incoming_path = os.path.join(os.path.dirname(cached_path), "__incoming_%s" % os.path.basename(cached_path)) - doi = irods.dataObjInp_t() - doi.objPath = self.__get_rods_path(obj, **kwargs) - doi.dataSize = 0 # TODO: does this affect performance? should we get size? - doi.numThreads = 0 - # TODO: might want to VERIFY_CHKSUM_KW - log.debug('get_filename(): caching %s to %s', doi.objPath, incoming_path) - - # do the iget - status = irods.rcDataObjGet(self.rods_conn, doi, incoming_path) - - # if incoming already exists, we'll wait for another process or thread - # to finish caching - if status != irods.OVERWRITE_WITHOUT_FORCE_FLAG: - assert status == 0, 'get_filename(): iget %s failed (%s): %s' % (doi.objPath, status, irods.strerror(status)) - # POSIX rename is atomic - # TODO: rename without clobbering - os.rename(incoming_path, cached_path) - log.debug('get_filename(): cached %s to %s', doi.objPath, cached_path) - - # another process or thread is caching, wait for it - while not os.path.exists(cached_path): - # TODO: force restart after mod time > some configurable, or - # otherwise deal with this potential deadlock and interrupted - # transfers - time.sleep(5) - log.debug("get_filename(): waiting on incoming '%s' for %s %s", incoming_path, obj.__class__.__name__, obj.id) - - return os.path.abspath(cached_path) - - @local_extra_dirs def update_from_file(self, obj, file_name=None, create=False, **kwargs): - assert 'dir_only' not in kwargs, 'update_from_file(): `dir_only` parameter is invalid here' - - # do not create if not requested - if create and not self.exists(obj, **kwargs): - raise ObjectNotFound() - - if file_name is None: - file_name = self.__get_cache_path(obj, **kwargs) - - # put will create if necessary - doi = irods.dataObjInp_t() - doi.objPath = self.__get_rods_path(obj, **kwargs) - doi.createMode = 0o640 - doi.dataSize = os.stat(file_name).st_size - doi.numThreads = 0 - irods.addKeyVal(doi.condInput, irods.DEST_RESC_NAME_KW, self.default_resource) - irods.addKeyVal(doi.condInput, irods.FORCE_FLAG_KW, '') - # TODO: might want to VERIFY_CHKSUM_KW - log.debug('update_from_file(): updating %s to %s', file_name, doi.objPath) - - # do the iput - status = irods.rcDataObjPut(self.rods_conn, doi, file_name) - assert status == 0, 'update_from_file(): iput %s failed (%s): %s' % (doi.objPath, status, irods.strerror(status)) + if create: + self.create(obj, **kwargs) + if self.exists(obj, **kwargs): + rel_path = self._construct_path(obj, **kwargs) + # Chose whether to use the dataset file itself or an alternate file + if file_name: + source_file = os.path.abspath(file_name) + # Copy into cache + cache_file = self._get_cache_path(rel_path) + try: + if source_file != cache_file: + # FIXME? Should this be a `move`? + shutil.copy2(source_file, cache_file) + self._fix_permissions(cache_file) + except OSError: + log.exception("Trouble copying source file '%s' to cache '%s'", source_file, cache_file) + else: + source_file = self._get_cache_path(rel_path) + # Update the file on S3 + self._push_to_os(rel_path, source_file) + else: + raise ObjectNotFound('objectstore.update_from_file, object does not exist: %s, kwargs: %s' + % (str(obj), str(kwargs))) def get_object_url(self, obj, **kwargs): + if self.exists(obj, **kwargs): + rel_path = self._construct_path(obj, **kwargs) + try: + key = Key(self.bucket, rel_path) + return key.generate_url(expires_in=86400) # 24hrs + except S3ResponseError: + log.exception("Trouble generating URL for dataset '%s'", rel_path) return None def get_store_usage_percent(self): return 0.0 +''' + ########################################################### + ## These should be read from env variables or a config file + ########################################################### + # host='localhost' + host='127.0.0.1' + port='1247' + user='rods' + password='rods' + zone='tempZone' + ###defaultResource = 'demoResc' -# monkeypatch an strerror method into the irods module -def _rods_strerror(errno): - """ - The missing `strerror` for iRODS error codes - """ - if not hasattr(irods, '__rods_strerror_map'): - irods.__rods_strerror_map = {} - for name in dir(irods): - v = getattr(irods, name) - if type(v) == int and v < 0: - irods.__rods_strerror_map[v] = name - return irods.__rods_strerror_map.get(errno, 'GALAXY_NO_ERRNO_MAPPING_FOUND') - - -if irods is not None: - irods.strerror = _rods_strerror - - -def rods_connect(): - """ - A basic iRODS connection mechanism that connects using the current iRODS - environment - """ - status, env = irods.getRodsEnv() - assert status == 0, 'connect(): getRodsEnv() failed (%s): %s' % (status, irods.strerror(status)) - conn, err = irods.rcConnect(env.rodsHost, - env.rodsPort, - env.rodsUserName, - env.rodsZone) - assert err.status == 0, 'connect(): rcConnect() failed (%s): %s' % (err.status, err.msg) - status, pw = irods.obfGetPw() - assert status == 0, 'connect(): getting password with obfGetPw() failed (%s): %s' % (status, irods.strerror(status)) - status = irods.clientLoginWithObfPassword(conn, pw) - assert status == 0, 'connect(): logging in with clientLoginWithObfPassword() failed (%s): %s' % (status, irods.strerror(status)) - return env, conn + # Connect to iRODS (AssertionErrors will be raised if anything goes wrong) + self.session = irods_connect(host, port, user, password, zone) + + # Set iRODS home path + ###self.home_path = "/" + zone + "/home/" + user + '/galaxy_data' + self.home_path = "/" + zone + "/home/" + user + assert self.home_path != '', "Unable to initialize iRODS Object Store: irods_home cannot be determined." + + # Will return a collection object regardless of whether it exists + self.root_collection = self.session.collections.get(self.home_path) + if self.root_collection.path != self.home_path: + log.warning("iRODS root collection does not exist, will attempt to create: %s", self.home_path) + self.root_collection = self.session.collections.create(self.home_path) + assert self.root_collection.path == self.home_path, "iRODS root collection creation failed: %s" % self.home_path +''' \ No newline at end of file diff --git a/lib/galaxy/objectstore/s3.py b/lib/galaxy/objectstore/s3.py index 0ecd8891447e..0c2ea1281329 100644 --- a/lib/galaxy/objectstore/s3.py +++ b/lib/galaxy/objectstore/s3.py @@ -167,8 +167,8 @@ def __init__(self, config, config_dict): (e['type'], e['path']) for e in config_dict.get('extra_dirs', [])) self.extra_dirs.update(extra_dirs) - log.debug("Object cache dir: %s", self.staging_path) - log.debug(" job work dir: %s", self.extra_dirs['job_work']) + log.debug("Object cache dir: %s", self.staging_path) + log.debug("Job work dir: %s", self.extra_dirs['job_work']) self._initialize() From cc0a71bc14ec7cef0e85c82b607769547b36ea8d Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Thu, 20 Feb 2020 13:22:14 +0100 Subject: [PATCH 105/853] Make dataset discovery respect final_job_state Fixes https://github.com/galaxyproject/galaxy/issues/9394 --- lib/galaxy/job_execution/output_collect.py | 9 +++-- lib/galaxy/jobs/__init__.py | 5 ++- lib/galaxy/metadata/set_metadata.py | 10 ++++- lib/galaxy/model/store/discover.py | 38 +++++++++++-------- lib/galaxy/tools/__init__.py | 5 ++- lib/galaxy_test/api/test_tools.py | 16 ++++++++ .../collection_creates_dynamic_nested.xml | 6 ++- 7 files changed, 64 insertions(+), 25 deletions(-) diff --git a/lib/galaxy/job_execution/output_collect.py b/lib/galaxy/job_execution/output_collect.py index 68602df59bcf..713c657e33c1 100644 --- a/lib/galaxy/job_execution/output_collect.py +++ b/lib/galaxy/job_execution/output_collect.py @@ -121,7 +121,7 @@ def collect_dynamic_outputs( hdca = job_context.create_hdca(name, structure) persist_elements_to_hdca(job_context, elements, hdca, collector=DEFAULT_DATASET_COLLECTOR) elif destination_type == "hdas": - persist_hdas(elements, job_context) + persist_hdas(elements, job_context, final_job_state=job_context.final_job_state) for name, has_collection in output_collections.items(): output_collection_def = job_context.output_collection_def(name) @@ -152,6 +152,7 @@ def collect_dynamic_outputs( filenames, name=output_collection_def.name, metadata_source_name=output_collection_def.metadata_source, + final_job_state=job_context.final_job_state, ) collection_builder.populate() except Exception: @@ -175,7 +176,7 @@ def find_files(self, output_name, collection, dataset_collectors): class JobContext(ModelPersistenceContext, BaseJobContext): - def __init__(self, tool, tool_provided_metadata, job, job_working_directory, permission_provider, metadata_source_provider, input_dbkey, object_store): + def __init__(self, tool, tool_provided_metadata, job, job_working_directory, permission_provider, metadata_source_provider, input_dbkey, object_store, final_job_state): self.tool = tool self.metadata_source_provider = metadata_source_provider self.permission_provider = permission_provider @@ -186,6 +187,7 @@ def __init__(self, tool, tool_provided_metadata, job, job_working_directory, per self.job_working_directory = job_working_directory self.tool_provided_metadata = tool_provided_metadata self.object_store = object_store + self.final_job_state = final_job_state @property def work_context(self): @@ -296,7 +298,7 @@ def job_id(self): class SessionlessJobContext(SessionlessModelPersistenceContext, BaseJobContext): - def __init__(self, metadata_params, tool_provided_metadata, object_store, export_store, import_store, working_directory): + def __init__(self, metadata_params, tool_provided_metadata, object_store, export_store, import_store, working_directory, final_job_state): # TODO: use a metadata source provider... (pop from inputs and add parameter) # TODO: handle input_dbkey... input_dbkey = "?" @@ -305,6 +307,7 @@ def __init__(self, metadata_params, tool_provided_metadata, object_store, export self.tool_provided_metadata = tool_provided_metadata self.import_store = import_store self.input_dbkey = input_dbkey + self.final_job_state = final_job_state def output_collection_def(self, name): tool_as_dict = self.metadata_params["tool"] diff --git a/lib/galaxy/jobs/__init__.py b/lib/galaxy/jobs/__init__.py index 04e036d09b5b..f9cce38d98db 100644 --- a/lib/galaxy/jobs/__init__.py +++ b/lib/galaxy/jobs/__init__.py @@ -1684,7 +1684,7 @@ def fail(): if not extended_metadata: # importing metadata will discover outputs if extended metadata # is enabled. - self.discover_outputs(job, inp_data, out_data, out_collections) + self.discover_outputs(job, inp_data, out_data, out_collections, final_job_state=final_job_state) # Certain tools require tasks to be completed after job execution # ( this used to be performed in the "exec_after_process" hook, but hooks are deprecated ). @@ -1732,7 +1732,7 @@ def fail(): self.cleanup(delete_files=delete_files) log.debug(finish_timer.to_str(job_id=self.job_id, tool_id=job.tool_id)) - def discover_outputs(self, job, inp_data, out_data, out_collections): + def discover_outputs(self, job, inp_data, out_data, out_collections, final_job_state): # Try to just recover input_ext and dbkey from job parameters (used and set in # galaxy.tools.actions). Old jobs may have not set these in the job parameters # before persisting them. @@ -1765,6 +1765,7 @@ def discover_outputs(self, job, inp_data, out_data, out_collections): inp_data=inp_data, input_ext=input_ext, input_dbkey=input_dbkey, + final_job_state=final_job_state, ) def check_tool_output(self, tool_stdout, tool_stderr, tool_exit_code, job, job_stdout=None, job_stderr=None): diff --git a/lib/galaxy/metadata/set_metadata.py b/lib/galaxy/metadata/set_metadata.py index 4d0c050ca362..db50f6c38e29 100644 --- a/lib/galaxy/metadata/set_metadata.py +++ b/lib/galaxy/metadata/set_metadata.py @@ -279,7 +279,15 @@ def set_meta(new_dataset_instance, file_dict): # discover extra outputs... from galaxy.job_execution.output_collect import collect_dynamic_outputs, collect_primary_datasets, SessionlessJobContext - job_context = SessionlessJobContext(metadata_params, tool_provided_metadata, object_store, export_store, import_model_store, os.path.join(tool_job_working_directory, "working")) + job_context = SessionlessJobContext( + metadata_params, + tool_provided_metadata, + object_store, + export_store, + import_model_store, + os.path.join(tool_job_working_directory, "working"), + final_job_state=final_job_state, + ) output_collections = {} for name, output_collection in metadata_params["output_collections"].items(): diff --git a/lib/galaxy/model/store/discover.py b/lib/galaxy/model/store/discover.py index 0d668ff93bb1..0470cdd158f5 100644 --- a/lib/galaxy/model/store/discover.py +++ b/lib/galaxy/model/store/discover.py @@ -58,6 +58,7 @@ def create_dataset( sources=[], hashes=[], created_from_basename=None, + final_job_state='ok', ): sa_session = self.sa_session @@ -103,10 +104,10 @@ def create_dataset( flush=False, sa_session=sa_session) ld.library_dataset_dataset_association = ldda - ldda.raw_set_dataset_state(ldda.states.OK) self.add_library_dataset_to_folder(library_folder, ld) primary_data = ldda + primary_data.raw_set_dataset_state(final_job_state) for source_dict in sources: source = galaxy.model.DatasetSource() @@ -165,20 +166,28 @@ def create_dataset( dataset_att_name = dataset_att_by_name.get(att_set, att_set) setattr(primary_data, dataset_att_name, dataset_attributes.get(att_set, getattr(primary_data, dataset_att_name))) - metadata_dict = dataset_attributes.get('metadata', None) - if metadata_dict: - if "dbkey" in dataset_attributes: - metadata_dict["dbkey"] = dataset_attributes["dbkey"] - # branch tested with tool_provided_metadata_3 / tool_provided_metadata_10 - primary_data.metadata.from_JSON_dict(json_dict=metadata_dict) - else: - primary_data.set_meta() + try: + metadata_dict = dataset_attributes.get('metadata', None) + if metadata_dict: + if "dbkey" in dataset_attributes: + metadata_dict["dbkey"] = dataset_attributes["dbkey"] + # branch tested with tool_provided_metadata_3 / tool_provided_metadata_10 + primary_data.metadata.from_JSON_dict(json_dict=metadata_dict) + else: + primary_data.set_meta() + except Exception: + if primary_data.state == galaxy.model.HistoryDatasetAssociation.states.OK: + primary_data.state = galaxy.model.HistoryDatasetAssociation.states.FAILED_METADATA + log.exception("Exception occured while setting metdata") - primary_data.set_peek() + try: + primary_data.set_peek() + except Exception: + log.exception("Exception occured while setting dataset peek") return primary_data - def populate_collection_elements(self, collection, root_collection_builder, filenames, name=None, metadata_source_name=None): + def populate_collection_elements(self, collection, root_collection_builder, filenames, name=None, metadata_source_name=None, final_job_state='ok'): # TODO: allow configurable sorting. # # @@ -225,6 +234,7 @@ def populate_collection_elements(self, collection, root_collection_builder, file sources=sources, hashes=hashes, created_from_basename=created_from_basename, + final_job_state=final_job_state, ) log.debug( "(%s) Created dynamic collection dataset for path [%s] with element identifier [%s] for output [%s] %s", @@ -256,8 +266,6 @@ def populate_collection_elements(self, collection, root_collection_builder, file association_name = '__new_primary_file_%s|%s__' % (name, element_identifier_str) self.add_output_dataset_association(association_name, dataset) - dataset.raw_set_dataset_state('ok') - self.flush() @abc.abstractproperty @@ -511,7 +519,7 @@ def persist_elements_to_folder(model_persistence_context, elements, library_fold ) -def persist_hdas(elements, model_persistence_context): +def persist_hdas(elements, model_persistence_context, final_job_state='ok'): # discover files as individual datasets for the target history datasets = [] @@ -553,8 +561,8 @@ def collect_elements_for_history(elements): sources=sources, hashes=hashes, created_from_basename=created_from_basename, + final_job_state=final_job_state, ) - dataset.raw_set_dataset_state('ok') if not hda_id: datasets.append(dataset) diff --git a/lib/galaxy/tools/__init__.py b/lib/galaxy/tools/__init__.py index 3a01212badc7..a6564a5543cb 100755 --- a/lib/galaxy/tools/__init__.py +++ b/lib/galaxy/tools/__init__.py @@ -1783,7 +1783,7 @@ def job_failed(self, job_wrapper, message, exception=False): """ pass - def discover_outputs(self, out_data, out_collections, tool_provided_metadata, tool_working_directory, job, input_ext, input_dbkey, inp_data=None): + def discover_outputs(self, out_data, out_collections, tool_provided_metadata, tool_working_directory, job, input_ext, input_dbkey, inp_data=None, final_job_state='ok'): """ Find any additional datasets generated by a tool and attach (for cases where number of outputs is not known in advance). @@ -1802,6 +1802,7 @@ def discover_outputs(self, out_data, out_collections, tool_provided_metadata, to metadata_source_provider, input_dbkey, object_store=tool.app.object_store, + final_job_state=final_job_state, ) collected = output_collect.collect_primary_datasets( job_context, @@ -2480,7 +2481,7 @@ def exec_after_process(self, app, inp_data, out_data, param_dict, job=None, **kw try: dataset.set_peek() except Exception: - log.exception() + log.exception("Exception occured while setting dataset peek") self.sa_session.add(dataset) self.sa_session.flush() diff --git a/lib/galaxy_test/api/test_tools.py b/lib/galaxy_test/api/test_tools.py index b29404c3751f..c14ab404ffb3 100644 --- a/lib/galaxy_test/api/test_tools.py +++ b/lib/galaxy_test/api/test_tools.py @@ -917,6 +917,22 @@ def test_dynamic_list_output(self, history_id): output_element_hda_0 = output_element_0["object"] assert output_element_hda_0["metadata_column_types"] is not None + @skip_without_tool("collection_creates_dynamic_nested") + @uses_test_history(require_new=False) + def test_dynamic_list_output_datasets_in_failed_state(self, history_id): + inputs = { + 'fail_bool': True + } + create = self._run("collection_creates_dynamic_nested", history_id, inputs, assert_ok=False, wait_for_job=True) + self._assert_status_code_is(create, 200) + collection = self._get("dataset_collections/%s" % create.json()["output_collections"][0]["id"], data={"instance_type": "history"}).json() + assert collection['element_count'] == 3 + for nested_collection in collection['elements']: + nested_collection = nested_collection['object'] + assert nested_collection['element_count'] == 2 + for element in nested_collection['elements']: + assert element['object']['state'] == 'error' + def test_nonadmin_users_cannot_create_tools(self): payload = dict( representation=json.dumps(MINIMAL_TOOL), diff --git a/test/functional/tools/collection_creates_dynamic_nested.xml b/test/functional/tools/collection_creates_dynamic_nested.xml index 40a3f50247c3..0e4c122d5e39 100644 --- a/test/functional/tools/collection_creates_dynamic_nested.xml +++ b/test/functional/tools/collection_creates_dynamic_nested.xml @@ -1,4 +1,4 @@ - + oe1_ie1.fq ; echo "B" > oe1_ie2.fq ; @@ -6,11 +6,13 @@ echo "D" > oe2_ie2.fq ; echo "E" > oe3_ie1.fq ; echo "F" > oe3_ie2.fq ; - sleep '$sleep_time'; + sleep '$sleep_time'; + exit $fail_bool ]]> + From bc1013c001e1207bbf1b24334db97d350b1c1d07 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Sun, 22 Dec 2019 11:03:55 +0100 Subject: [PATCH 106/853] Add more repository installation test cases These were supposed to not pass without https://github.com/galaxyproject/galaxy/pull/9159, but they do. I don't think this increases test coverage but it might be handy to have this as integration test cases when we rip out the toolshed from the Galaxy code base ? --- test/integration/test_repository_operations.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/integration/test_repository_operations.py b/test/integration/test_repository_operations.py index ea41c27ae224..13a8c010372e 100644 --- a/test/integration/test_repository_operations.py +++ b/test/integration/test_repository_operations.py @@ -41,6 +41,21 @@ def test_repository_uninstall(self): self._install_repository() self._uninstall_repository() + def test_datatype_uninstall(self): + repo = ('devteam', 'blast_datatypes', '01b38f20197e') + self.install_repository(*repo) + self.uninstall_repository(*repo) + + def test_package_uninstall(self): + repo = ('iuc', 'package_fastqc_0_11_4', 'a8f485b2efd9') + self.install_repository(*repo) + self.uninstall_repository(*repo) + + def test_tool_with_package_dependency_uninstall(self): + repo = ('iuc', 'fastqc', 'e7b2202befea') + self.install_repository(*repo) + self.uninstall_repository(*repo) + def test_repository_update(self): response = self._install_repository(revision=REVISION_4, version="0.0.3")[0] assert response['ctx_rev'] == '4' From 8682677f8f90e84e66a30e944b750d91751c21b8 Mon Sep 17 00:00:00 2001 From: guerler Date: Thu, 20 Feb 2020 14:00:18 -0500 Subject: [PATCH 107/853] Parse highlight property in default uploader component --- client/galaxy/scripts/components/Upload/Default.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/galaxy/scripts/components/Upload/Default.vue b/client/galaxy/scripts/components/Upload/Default.vue index 064918b16fb7..0e257cc18c46 100644 --- a/client/galaxy/scripts/components/Upload/Default.vue +++ b/client/galaxy/scripts/components/Upload/Default.vue @@ -1,5 +1,5 @@