mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
Merge branch 'dev' into ui_pref_routing
This commit is contained in:
@@ -43,6 +43,12 @@ HDAListItemView.prototype.templates = (function(){
|
||||
'<span class="hid"><%- dataset.hid %></span> ',
|
||||
'<span class="name"><%- dataset.name %></span>',
|
||||
'</div>',
|
||||
'</br>',
|
||||
'<span class="nametags">',
|
||||
'<% _.each(dataset.nametags, function(tag){ %>',
|
||||
'<span class="label label-info"><%- tag %></span>',
|
||||
'<% }); %>',
|
||||
'</span>',
|
||||
'</div>'
|
||||
], 'dataset' );
|
||||
|
||||
|
||||
@@ -221,7 +221,8 @@ var View = Backbone.View.extend({
|
||||
hid : item.hid,
|
||||
keep : item.keep,
|
||||
label: item.hid + ': ' + item.name,
|
||||
value: item.id
|
||||
value: item.id,
|
||||
tags : item.tags
|
||||
});
|
||||
self.history[ item.id + '_' + src ] = item;
|
||||
});
|
||||
|
||||
@@ -109,6 +109,11 @@ var View = Backbone.View.extend({
|
||||
}
|
||||
},
|
||||
|
||||
/** Matches a search term with a given text */
|
||||
_match: function( term, text ) {
|
||||
return !term || term == '' || String( text ).toUpperCase().indexOf( term.toUpperCase() ) >= 0
|
||||
},
|
||||
|
||||
/** Updates the selection options */
|
||||
_changeData: function() {
|
||||
var self = this;
|
||||
@@ -125,22 +130,44 @@ var View = Backbone.View.extend({
|
||||
if ( this.model.get( 'searchable' ) ) {
|
||||
this.data2 = [];
|
||||
_.each( this.data, function( option, index ) {
|
||||
self.data2.push( { order: index, id: option.value, text: option.label } );
|
||||
self.data2.push( { order: index, id: option.value, text: option.label, tags: option.tags } );
|
||||
});
|
||||
this.$select.data( 'select2' ) && this.$select.select2( 'destroy' );
|
||||
this.matched_tags = {};
|
||||
this.$select.select2({
|
||||
data : self.data2,
|
||||
closeOnSelect : !this.model.get( 'multiple' ),
|
||||
multiple : this.model.get( 'multiple' ),
|
||||
query : function( q ) {
|
||||
self.matched_tags = {};
|
||||
var pagesize = self.model.get( 'pagesize' );
|
||||
var results = _.filter( self.data2, function ( e ) {
|
||||
return !q.term || q.term == '' || e.text.toUpperCase().indexOf( q.term.toUpperCase() ) >= 0;
|
||||
var found = false;
|
||||
_.each( e.tags, function( tag ) {
|
||||
if ( self._match( q.term, tag ) ) {
|
||||
found = self.matched_tags[ tag ] = true;
|
||||
}
|
||||
});
|
||||
return found || self._match( q.term, e.text );
|
||||
});
|
||||
q.callback({
|
||||
results: results.slice( ( q.page - 1 ) * pagesize, q.page * pagesize ),
|
||||
more : results.length >= q.page * pagesize
|
||||
});
|
||||
},
|
||||
formatResult : function( result ) {
|
||||
return _.escape( result.text ) +
|
||||
'<div class="ui-tags">' +
|
||||
_.reduce( result.tags, function( memo, tag ) {
|
||||
if ( self.matched_tags[ tag ] ) {
|
||||
return memo + ' ' +
|
||||
'<div class="label label-info">' +
|
||||
_.escape( tag ) +
|
||||
'</div>'
|
||||
}
|
||||
return memo;
|
||||
}, '' ) +
|
||||
'</div>';
|
||||
}
|
||||
});
|
||||
this.$( '.select2-container .select2-search input' ).off( 'blur' );
|
||||
|
||||
@@ -106,7 +106,7 @@ define( [ 'utils/utils' ], function( Utils ) {
|
||||
_templateRow: function( options ) {
|
||||
return '<tr class="upload-ftp-row">' +
|
||||
'<td class="_has_collection" style="display: none;"><div class="icon"/></td>' +
|
||||
'<td class="ftp-name">' + options.path + '</td>' +
|
||||
'<td class="ftp-name">' + _.escape(options.path) + '</td>' +
|
||||
'<td class="ftp-size">' + Utils.bytesToString( options.size ) + '</td>' +
|
||||
'<td class="ftp-time">' + options.ctime + '</td>' +
|
||||
'</tr>';
|
||||
|
||||
@@ -18,6 +18,7 @@ window.async_save_text = require( 'utils/async-save-text' );
|
||||
var POPUPMENU = require( 'ui/popupmenu' );
|
||||
window.make_popupmenu = POPUPMENU.make_popupmenu;
|
||||
window.make_popup_menus = POPUPMENU.make_popup_menus;
|
||||
window.toolform = require( 'mvc/tool/tool-form' );
|
||||
window.init_tag_click_function = require( 'ui/autocom_tagging' );
|
||||
var TOURS = require( 'mvc/tours' );
|
||||
var QUERY_STRING = require( 'utils/query-string-parsing' );
|
||||
|
||||
@@ -221,6 +221,13 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
span.nametags {
|
||||
span.label {
|
||||
display: inline-block;
|
||||
margin-right: 2px;
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -68,6 +68,11 @@
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.ui-tags {
|
||||
word-wrap: break-word;
|
||||
padding-right: 25px;
|
||||
}
|
||||
|
||||
.ui-message {
|
||||
padding: 2px 10px 2px 10px;
|
||||
margin-top: @ui-margin-vertical-large;
|
||||
|
||||
@@ -598,6 +598,10 @@
|
||||
<datatype extension="maskinfo-asn1-binary" type="galaxy.datatypes.binary:GenericAsn1Binary" mimetype="application/octet-stream" subclass="true" display_in_upload="true" />
|
||||
<datatype extension="pssm-asn1" type="galaxy.datatypes.data:GenericAsn1" mimetype="text/plain" subclass="true" display_in_upload="true" />
|
||||
<!-- PlantTribes datatypes -->
|
||||
<datatype extension="ptalign" type="galaxy.datatypes.text:PlantTribesMultipleSequenceAlignment" />
|
||||
<datatype extension="ptortho" type="galaxy.datatypes.text:PlantTribesOrtho" />
|
||||
<datatype extension="ptorthocs" type="galaxy.datatypes.text:PlantTribesOrthoCodingSequence" />
|
||||
<datatype extension="pttree" type="galaxy.datatypes.text:PlantTribesPhylogeneticTree" />
|
||||
<datatype extension="smat" type="galaxy.datatypes.text:Smat" display_in_upload="true" />
|
||||
</registration>
|
||||
<sniffers>
|
||||
|
||||
@@ -355,6 +355,16 @@ paste.app_factory = galaxy.web.buildapp:app_factory
|
||||
# separated list.
|
||||
#interactive_environment_plugins_directory =
|
||||
|
||||
# To run interactive environment containers in Docker Swarm mode (on an
|
||||
# existing swarm), set this option to True and set `docker_connect_port` in the
|
||||
# IE plugin config (ini) file(s) of any IE plugins you have enabled and ensure
|
||||
# that you are not using any `docker run`-specific options in your plugins'
|
||||
# `command_inject` options (swarm mode services run using `docker service
|
||||
# create`, which has a different and more limited set of options). This option
|
||||
# can be overridden on a per-plugin basis by using the `swarm_mode` option in
|
||||
# the plugin's ini config file.
|
||||
#interactive_environment_swarm_mode = False
|
||||
|
||||
# Interactive tour directory: where to store interactive tour definition files.
|
||||
# Galaxy ships with several basic interface tours enabled, though a different
|
||||
# directory with custom tours can be specified here. The path is relative to the
|
||||
@@ -1191,7 +1201,7 @@ use_interactive = True
|
||||
# walltime limits but did fail quickly (either while queueing or running). The
|
||||
# commented out default below results in no default job resubmission condition,
|
||||
# failing jobs are just failed outright.
|
||||
#default_job_resubmission_condition =
|
||||
#default_job_resubmission_condition =
|
||||
|
||||
# In multiprocess configurations, notification between processes about new jobs
|
||||
# must be done via the database. In single process configurations, this can be
|
||||
|
||||
@@ -41,3 +41,15 @@ image = qiaoy/iobio-bundle.bam-iobio:1.0-ondemand
|
||||
# share data between the IE and Galaxy.
|
||||
#docker_galaxy_temp_dir = None
|
||||
|
||||
# If your Docker container exposes more then one port, Galaxy needs to know to
|
||||
# which ports it needs to connect. With this option you can specify the port number
|
||||
# inside your container to which Galaxy should connect the UI.
|
||||
#docker_connect_port = None
|
||||
|
||||
# To run containers in Docker Swarm mode on (an existing swarm), set the
|
||||
# following option to True *and*:
|
||||
# - set docker_connect_port above. For qiaoy/iobio-bundle.bam-iobio the port
|
||||
# should most likely be 8000.
|
||||
# - If command_inject is uncommented and includes `--sig-proxy`, that option should
|
||||
# be removed.
|
||||
#swarm_mode = False
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
# The image argument was moved to "allowed_images.yml.sample"
|
||||
|
||||
# Additional arguments that are passed to the `docker run` command.
|
||||
command_inject = --sig-proxy=true -e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=120
|
||||
#command_inject = --sig-proxy=true -e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=120
|
||||
|
||||
# URL to access the Galaxy API with from the spawn Docker containter, if empty
|
||||
# this falls back to galaxy.ini's galaxy_infrastructure_url and finally to the
|
||||
@@ -43,4 +43,12 @@ command_inject = --sig-proxy=true -e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=12
|
||||
# If your Docker container exposes more then one port, Galaxy needs to know to
|
||||
# which ports it needs to connect. With this option you can specify the port number
|
||||
# inside your container to which Galaxy should connect the UI.
|
||||
# docker_connect_port = None
|
||||
#docker_connect_port = None
|
||||
|
||||
# To run containers in Docker Swarm mode on (an existing swarm), set the
|
||||
# following option to True *and*:
|
||||
# - set docker_connect_port above. For Jupyter the # port should most likely be
|
||||
# 8888.
|
||||
# - If command_inject is uncommented and includes `--sig-proxy`, that option should
|
||||
# be removed.
|
||||
#swarm_mode = False
|
||||
|
||||
@@ -40,3 +40,16 @@ command_inject = --sig-proxy=true -e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=12
|
||||
# you can have a shared sshfs share which you can use as temporary directory to
|
||||
# share data between the IE and Galaxy.
|
||||
#docker_galaxy_temp_dir = None
|
||||
|
||||
# If your Docker container exposes more then one port, Galaxy needs to know to
|
||||
# which ports it needs to connect. With this option you can specify the port number
|
||||
# inside your container to which Galaxy should connect the UI.
|
||||
#docker_connect_port = None
|
||||
|
||||
# To run containers in Docker Swarm mode on (an existing swarm), set the
|
||||
# following option to True *and*:
|
||||
# - set docker_connect_port above. For thoba/neo4j_galaxy_ie the port
|
||||
# should most likely be 7474.
|
||||
# - If command_inject is uncommented and includes `--sig-proxy`, that option should
|
||||
# be removed.
|
||||
#swarm_mode = False
|
||||
|
||||
@@ -19,3 +19,16 @@ image = shiltemann/docker-phinch-galaxy:16.04
|
||||
# The Docker hostname. It can be useful to run the Docker daemon on a different
|
||||
# host than Galaxy.
|
||||
#docker_hostname = localhost
|
||||
|
||||
# If your Docker container exposes more then one port, Galaxy needs to know to
|
||||
# which ports it needs to connect. With this option you can specify the port number
|
||||
# inside your container to which Galaxy should connect the UI.
|
||||
#docker_connect_port = None
|
||||
|
||||
# To run containers in Docker Swarm mode on (an existing swarm), set the
|
||||
# following option to True *and*:
|
||||
# - set docker_connect_port above. For shiltemann/docker-phinch-galaxy the port
|
||||
# should most likely be 80.
|
||||
# - If command_inject is uncommented and includes `--sig-proxy`, that option should
|
||||
# be removed.
|
||||
#swarm_mode = False
|
||||
|
||||
@@ -41,3 +41,16 @@ password_auth = True
|
||||
# you can have a shared sshfs share which you can use as temporary directory to
|
||||
# share data between the IE and Galaxy.
|
||||
#docker_galaxy_temp_dir = None
|
||||
|
||||
# If your Docker container exposes more then one port, Galaxy needs to know to
|
||||
# which ports it needs to connect. With this option you can specify the port number
|
||||
# inside your container to which Galaxy should connect the UI.
|
||||
#docker_connect_port = None
|
||||
|
||||
# To run containers in Docker Swarm mode on (an existing swarm), set the
|
||||
# following option to True *and*:
|
||||
# - set docker_connect_port above. For erasche/docker-rstudio-notebook the port
|
||||
# should most likely be 80.
|
||||
# - If command_inject is uncommented and includes `--sig-proxy`, that option should
|
||||
# be removed.
|
||||
#swarm_mode = False
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
name: searchover
|
||||
type:
|
||||
- masthead
|
||||
activate: true
|
||||
|
||||
icon: fa-search
|
||||
tooltip: Click to activate search and press Ctrl + Alt + q to open the overlay
|
||||
|
||||
function: >
|
||||
$.getJSON("/api/webhooks", function( data ) {
|
||||
for( var item in data ) {
|
||||
var webhook = data[item];
|
||||
if( webhook.name === "searchover" ) {
|
||||
if( webhook.script && !window.static_search ) {
|
||||
$( '<script/>', { type: 'text/javascript' } ).text( webhook.script ).appendTo( 'head' );
|
||||
$( '<style/>', { type: 'text/css' } ).text( webhook.styles ).appendTo( 'head' );
|
||||
window.static_search = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,177 @@
|
||||
.overlay-wrapper {
|
||||
margin-top: -5%;
|
||||
}
|
||||
|
||||
.search-screen {
|
||||
position: fixed;
|
||||
z-index: 202;
|
||||
width:100%;
|
||||
height:100%;
|
||||
display:none;
|
||||
}
|
||||
|
||||
.search-screen-overlay {
|
||||
position: fixed;
|
||||
top:0;
|
||||
left:0;
|
||||
background: rgba(224, 224, 224, 0.75);
|
||||
z-index: 201;
|
||||
width:100%;
|
||||
height:100%;
|
||||
display:none;
|
||||
opacity: 2;
|
||||
}
|
||||
|
||||
.overlay-filters {
|
||||
display: table;
|
||||
margin: 0 auto 5px;
|
||||
}
|
||||
|
||||
.overlay-filters ul {
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.overlay-filters li {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.overlay-filters li a {
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
padding: 5px 5px;
|
||||
}
|
||||
|
||||
.overlay-filters li a:hover i {
|
||||
color: #212121;
|
||||
}
|
||||
|
||||
.overlay-filters li a i {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
.search-header {
|
||||
background-color: #e1e1e1;
|
||||
background: -moz-linear-gradient(top, rgba(225, 225, 225, 1) 0%, rgba(238, 238, 238, 1) 37%, rgba(225, 225, 225, 1) 100%);
|
||||
background: linear-gradient(to bottom, rgba(225, 225, 225, 1) 0%, rgba(238, 238, 238, 1) 37%, rgba(225, 225, 225, 1) 100%);
|
||||
-moz-box-shadow: 0px 2px 5px 0px rgba(158, 158, 158, 0.75);
|
||||
box-shadow: 0px 2px 5px 0px rgba(158, 158, 158, 0.75);
|
||||
|
||||
position: fixed;
|
||||
top: 34px;
|
||||
width: 100%;
|
||||
z-index: 203;
|
||||
}
|
||||
|
||||
.txtbx-search-data {
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
border-radius: 14px;
|
||||
border: 1px solid #2c3143;
|
||||
margin: 20px auto 10px;
|
||||
width: 300px;
|
||||
padding: 11px;
|
||||
}
|
||||
|
||||
.search-section {
|
||||
color: #007AB5;
|
||||
margin-top: 20px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.search-section .section-title {
|
||||
margin-left: 7px;
|
||||
}
|
||||
|
||||
.link-tile {
|
||||
background-color: #0070A8;
|
||||
border: 1px solid #005A85;
|
||||
border-radius: 5px;
|
||||
font-size: 12px;
|
||||
width: 19%;
|
||||
height: 75px;
|
||||
margin: 0.5%;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.link-tile.btn-primary:hover,
|
||||
.link-tile.btn-primary:hover {
|
||||
background-color: #005A85;
|
||||
border-color: #005A85;
|
||||
}
|
||||
|
||||
.link-tile.btn-primary:active,
|
||||
.link-tile.btn-primary:focus {
|
||||
background-color: #005A85;
|
||||
border-color: #005A85;
|
||||
}
|
||||
|
||||
.search-results,
|
||||
.removed-items {
|
||||
position: fixed;
|
||||
top: 125px;
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
padding: 0 15px;
|
||||
width: 100%;
|
||||
height: 83%;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.item-actions {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.item-actions:hover {
|
||||
color: gold;
|
||||
}
|
||||
|
||||
.pin-item {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.restore-item,
|
||||
.remove-fav,
|
||||
.remove-item {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.filter-active i {
|
||||
/*color: gold;*/
|
||||
color: #616161;
|
||||
}
|
||||
|
||||
.filter-active i:hover {
|
||||
color: #212121;
|
||||
}
|
||||
|
||||
.filter-inactive i {
|
||||
font-size: 0.875em;
|
||||
color: #9e9e9e;
|
||||
}
|
||||
|
||||
.rotate {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
|
||||
.pinned-item {
|
||||
color: gold;
|
||||
transform: rotate(60deg);
|
||||
}
|
||||
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.show {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.no-results {
|
||||
color: white;
|
||||
margin-top: 0.8%;
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# When running Galaxy Interactive Environments on a swarm (using Docker Engine
|
||||
# swarm mode), GIE sessions that have ended will leave behind "shut down"
|
||||
# Docker services. These must be removed, which you can do with this script.
|
||||
#
|
||||
# Note that this is dependent on the specific ordering and output format of
|
||||
# `docker service ls` and `docker service ps`. As of the time of writing
|
||||
# (Docker version 1.13.1) these formats cannot be controlled as can be done
|
||||
# with `docker ps` and the `--format` option, so be careful when upgrading
|
||||
# Docker releases.
|
||||
|
||||
|
||||
CONTAINER_NAME_PREFIX='galaxy_gie_'
|
||||
LOG_PATH=${1:-'/tmp/galaxy_gie_service_clean.log'}
|
||||
|
||||
|
||||
{
|
||||
echo "Running cleanup at $(date)"
|
||||
for service_name in $(docker service ls | awk "\$2 ~ /^$CONTAINER_NAME_PREFIX/ {print \$2}"); do
|
||||
docker service ps --no-trunc $service_name | tail -1 | awk '{print $6}' | grep -q '^Shutdown$' && docker service rm $service_name;
|
||||
done
|
||||
echo "Done"
|
||||
} >>$LOG_PATH
|
||||
@@ -201,7 +201,8 @@ You might want to run your IEs on a host different to the one that hosts your
|
||||
Galaxy webserver, since IEs on the same host as the webserver compete for
|
||||
resources with that webserver and introduce some security considerations which
|
||||
could be mitigated by moving containers to a separate host. This feature has
|
||||
been available since 15.07 and is used in production at the University of Freiburg.
|
||||
been available since 15.07 and is used in production at the University of
|
||||
Freiburg and on usegalaxy.org.
|
||||
|
||||
First you need to configure a second host to be Docker enabled. In the
|
||||
following we call this host ``gx-docker`` You need to start the Docker daemon
|
||||
@@ -213,9 +214,9 @@ you can start the daemon with
|
||||
$ docker -H 0.0.0.0:4243 -d
|
||||
|
||||
On your client, the Galaxy webserver, you can now install a Docker client. This
|
||||
can also be done on older Systems like Scientific-Linux, CentOS 6, which does
|
||||
not have Docker support by default. The client just talks to the Docker daemon
|
||||
on host ``gx-docker``, and does not run anything itself, locally. You can test
|
||||
can also be done on older systems like Scientific-Linux, CentOS 6, which do not
|
||||
have Docker support by default. The client just talks to the Docker daemon on
|
||||
host ``gx-docker``, and does not run anything itself, locally. You can test
|
||||
your configuration for example by starting busybox from your client on the
|
||||
Docker host with
|
||||
|
||||
@@ -223,7 +224,13 @@ Docker host with
|
||||
|
||||
$ docker -H tcp://gx-docker:4243 run -it busybox sh
|
||||
|
||||
So far so good! Now we need to configure Galaxy to use our new Docker host
|
||||
So far so good! Note, however, that unless restricted by a firewall, this mode
|
||||
of operation is insecure, as any client could connect and run containers on
|
||||
``gx-docker``. If this is a concern at your site, follow the instructions in
|
||||
the Docker documentation to `Protect the Docker daemon socket
|
||||
<https://docs.docker.com/engine/security/https/>`__.
|
||||
|
||||
Now we need to configure Galaxy to use our new Docker host
|
||||
to start the Interactive Environments. For that we need to edit the Jupyter GIE
|
||||
configuration, ``jupyter.ini`` to use our custom docker host
|
||||
|
||||
@@ -233,14 +240,18 @@ configuration, ``jupyter.ini`` to use our custom docker host
|
||||
|
||||
[docker]
|
||||
command = docker -H tcp://gx-docker:4243 {docker_args}
|
||||
image = bgruening/docker-ipython-notebook:dev
|
||||
docker_hostname = gx-docker
|
||||
|
||||
Please adapt your ``command`` and the ``image`` as needed.
|
||||
Please adapt your ``command`` as needed.
|
||||
|
||||
As next step we need to configure a share mount point between the Docker host
|
||||
and Galaxy. Unfortunately, this can not be a NFS mount. Docker does not like
|
||||
NFS yet. You could for example use a sshfs mount with the following script
|
||||
The Jupyter GIE supports getting and fetching Galaxy history datasets entirely
|
||||
through the Galaxy API so it is not necessary to share a filesystem with
|
||||
``gx-docker``. However, other GIE plugins may still require this.
|
||||
|
||||
For those GIE plugins, we need to configure a share mount point between the
|
||||
Docker host and Galaxy. Unfortunately, this can not be a NFS mount. Docker does
|
||||
not like NFS yet. You could for example use a sshfs mount with the following
|
||||
script
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
@@ -252,3 +263,58 @@ NFS yet. You could for example use a sshfs mount with the following script
|
||||
fi
|
||||
|
||||
This will let Galaxy and the Docker host share temporary files.
|
||||
|
||||
Docker Engine Swarm Mode
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
As of Docker Engine version 1.12, Docker Engine can be configured to provide a
|
||||
cluster of Docker Engines in a configuration known as *Docker Engine swarm
|
||||
mode*. This replaces the previous and similarly named *Docker Swarm*
|
||||
clustering solution, which is not compatible with swarm mode.
|
||||
|
||||
`The Docker Engine swarm mode documentation
|
||||
<https://docs.docker.com/engine/swarm/>`__ fully explains the differences, but
|
||||
the major difference is that whereas under Docker Swarm one could run commands
|
||||
on the swarm with ``docker run``, Docker Engine swarm mode requires one to
|
||||
create persistent services with ``docker service create`` and to remove those
|
||||
services once no longer in use with ``docker service rm``.
|
||||
|
||||
Galaxy supports both Docker Engine swarm mode and the legacy Docker Swarm
|
||||
system. Legacy Docker Swarm is supported without any special configuration,
|
||||
because the containers are still run with ``docker run`` as before. To support
|
||||
Docker Engine swarm mode, additional configuration is required. Begin by
|
||||
editing your GIE config plugin's ini configuration file (e.g. ``jupyter.ini``)
|
||||
and set the ``docker_connect_port`` and ``swarm_mode options`` in addition to
|
||||
any other relevant options. Unless you are using a non-standard Docker image,
|
||||
the correct value for ``docker_connect_port`` should be suggested to you in the
|
||||
sample configuration file:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[docker]
|
||||
docker_connect_port = 8888
|
||||
swarm_mode = True
|
||||
|
||||
Note that your Galaxy server does not need to be a member of the swarm itself.
|
||||
It can use the method outlined above in the `Docker on Another Host`_ section
|
||||
to connect as a client to a Docker daemon acting as a swarm mode manager.
|
||||
|
||||
Once configured, you should see that your GIE containers are started and run as
|
||||
services, which you can inspect using the ``docker service ls`` command and
|
||||
other ``docker service`` subcommands.
|
||||
|
||||
**Docker services are not cleaned up by Galaxy**. To clean them up, we have
|
||||
provided a script that can be run from cron which will locate "shut down"
|
||||
services (GIE containers which have stopped themselves) at
|
||||
`cron/clean_docker_swarm_mode_services.sh
|
||||
<https://github.com/galaxyproject/galaxy/blob/dev/cron/clean_docker_swarm_mode_services.sh>`__
|
||||
in the Galaxy source. This script can be run from cron with a crontab entry
|
||||
like this example which runs every 15 minutes:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
*/15 * * * * bash /path/to/clean_docker_swarm_mode_services.sh /path/to/galaxy/log/dir/clean_docker_swarm_mode_services.log
|
||||
|
||||
This entry would be suitable to be run as ``root`` on a swarm mode manager. You
|
||||
could also run it as the Galaxy user on the Galaxy server (with modifications
|
||||
to set the correct daemon socket, if running remotely).
|
||||
|
||||
+12
-19
@@ -577,6 +577,8 @@ class Configuration( object ):
|
||||
elif ie_dirs:
|
||||
self.visualization_plugins_directory += ",%s" % ie_dirs
|
||||
|
||||
self.gie_swarm_mode = string_as_bool( kwargs.get( 'interactive_environment_swarm_mode', False ) )
|
||||
|
||||
self.proxy_session_map = self.resolve_path( kwargs.get( "dynamic_proxy_session_map", "database/session_map.sqlite" ) )
|
||||
self.manage_dynamic_proxy = string_as_bool( kwargs.get( "dynamic_proxy_manage", "True" ) ) # Set to false if being launched externally
|
||||
self.dynamic_proxy_debug = string_as_bool( kwargs.get( "dynamic_proxy_debug", "False" ) )
|
||||
@@ -901,34 +903,25 @@ class ConfiguresGalaxyMixin:
|
||||
|
||||
time.sleep(1)
|
||||
|
||||
def reload_toolbox(self):
|
||||
# Initialize the tools, making sure the list of tool configs includes the reserved migrated_tools_conf.xml file.
|
||||
|
||||
tool_configs = self.config.tool_configs
|
||||
if self.config.migrated_tools_config not in tool_configs:
|
||||
tool_configs.append( self.config.migrated_tools_config )
|
||||
|
||||
from galaxy import tools
|
||||
old_toolbox = self.toolbox
|
||||
self.toolbox = tools.ToolBox( tool_configs, self.config.tool_path, self )
|
||||
self.reindex_tool_search()
|
||||
if old_toolbox:
|
||||
old_toolbox.shutdown()
|
||||
|
||||
def _configure_toolbox( self ):
|
||||
from galaxy import tools
|
||||
from galaxy.managers.citations import CitationsManager
|
||||
self.citations_manager = CitationsManager( self )
|
||||
|
||||
from galaxy.tools.deps import containers
|
||||
from galaxy.tools.toolbox.cache import ToolCache
|
||||
from galaxy.tools.toolbox.lineages.tool_shed import ToolVersionCache
|
||||
|
||||
self.citations_manager = CitationsManager( self )
|
||||
self.tool_cache = ToolCache()
|
||||
self.tool_version_cache = ToolVersionCache(self)
|
||||
|
||||
self._toolbox_lock = threading.RLock()
|
||||
self.toolbox = None
|
||||
self.reload_toolbox()
|
||||
# Initialize the tools, making sure the list of tool configs includes the reserved migrated_tools_conf.xml file.
|
||||
tool_configs = self.config.tool_configs
|
||||
if self.config.migrated_tools_config not in tool_configs:
|
||||
tool_configs.append( self.config.migrated_tools_config )
|
||||
self.toolbox = tools.ToolBox( tool_configs, self.config.tool_path, self )
|
||||
self.reindex_tool_search()
|
||||
|
||||
from galaxy.tools.deps import containers
|
||||
galaxy_root_dir = os.path.abspath(self.config.root)
|
||||
file_path = os.path.abspath(getattr(self.config, "file_path"))
|
||||
app_info = containers.AppInfo(
|
||||
|
||||
@@ -270,7 +270,8 @@ class AlignCheck(Tabular):
|
||||
dataset.metadata.column_names = self.column_names
|
||||
dataset.metadata.column_types = self.column_types
|
||||
dataset.metadata.comment_lines = self.comment_lines
|
||||
dataset.metadata.data_lines -= self.comment_lines
|
||||
if isinstance(dataset.metadata.data_lines, int):
|
||||
dataset.metadata.data_lines -= self.comment_lines
|
||||
|
||||
|
||||
class AlignReport(Tabular):
|
||||
@@ -735,7 +736,8 @@ class CountTable(Tabular):
|
||||
dataset.metadata.groups = colnames[2:]
|
||||
|
||||
dataset.metadata.comment_lines = 1
|
||||
dataset.metadata.data_lines -= 1
|
||||
if isinstance(dataset.metadata.data_lines, int):
|
||||
dataset.metadata.data_lines -= 1
|
||||
|
||||
|
||||
class RefTaxonomy(Tabular):
|
||||
|
||||
@@ -605,3 +605,50 @@ class Smat(Text):
|
||||
if re.match(r"[-+]?\d+$", item) is None:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
class PlantTribesOrtho(Html):
|
||||
"""
|
||||
PlantTribes sequences classified into precomputed, orthologous gene family
|
||||
clusters.
|
||||
"""
|
||||
file_ext = "ptortho"
|
||||
|
||||
def set_peek(self, dataset, is_multi_byte=False):
|
||||
super(PlantTribesOrtho, self).set_peek(dataset, is_multi_byte=is_multi_byte)
|
||||
dataset.blurb = "PlantTribes gene family clusters: %d files" % dataset.metadata.data_lines
|
||||
|
||||
|
||||
class PlantTribesOrthoCodingSequence(Html):
|
||||
"""
|
||||
PlantTribes sequences classified into precomputed, orthologous gene family
|
||||
clusters and corresponding coding sequences.
|
||||
"""
|
||||
file_ext = "ptorthocs"
|
||||
|
||||
def set_peek(self, dataset, is_multi_byte=False):
|
||||
super(PlantTribesOrthoCodingSequence, self).set_peek(dataset, is_multi_byte=is_multi_byte)
|
||||
dataset.blurb = "PlantTribes gene family clusters with corresponding coding sequences: %d files" % dataset.metadata.data_lines
|
||||
|
||||
|
||||
class PlantTribesPhylogeneticTree(Html):
|
||||
"""
|
||||
PlantTribes multiple sequence alignments and inferred maximum likelihood
|
||||
phylogenies for orthogroups.
|
||||
"""
|
||||
file_ext = "pttree"
|
||||
|
||||
def set_peek(self, dataset, is_multi_byte=False):
|
||||
super(PlantTribesPhylogeneticTree, self).set_peek(dataset, is_multi_byte=is_multi_byte)
|
||||
dataset.blurb = "PlantTribes phylogenetic trees: %d files" % dataset.metadata.data_lines
|
||||
|
||||
|
||||
class PlantTribesMultipleSequenceAlignment(Html):
|
||||
"""
|
||||
PlantTribes multiple sequence alignments for orthogroups.
|
||||
"""
|
||||
file_ext = "ptalign"
|
||||
|
||||
def set_peek(self, dataset, is_multi_byte=False):
|
||||
super(PlantTribesMultipleSequenceAlignment, self).set_peek(dataset, is_multi_byte=is_multi_byte)
|
||||
dataset.blurb = "PlantTribes multiple sequence alignments: %d files" % dataset.metadata.data_lines
|
||||
|
||||
@@ -254,13 +254,18 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
|
||||
'id',
|
||||
'type_id',
|
||||
'name',
|
||||
'history_id', 'hid',
|
||||
'history_id',
|
||||
'hid',
|
||||
'history_content_type',
|
||||
'dataset_id',
|
||||
'state', 'extension',
|
||||
'state',
|
||||
'extension',
|
||||
'deleted', 'purged', 'visible',
|
||||
'type', 'url',
|
||||
'create_time', 'update_time',
|
||||
'nametags',
|
||||
'type',
|
||||
'url',
|
||||
'create_time',
|
||||
'update_time',
|
||||
])
|
||||
self.add_view( 'detailed', [
|
||||
'model_class',
|
||||
@@ -281,6 +286,7 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
|
||||
'creating_job',
|
||||
'rerunnable',
|
||||
|
||||
'tags',
|
||||
'uuid',
|
||||
'permissions',
|
||||
'file_name',
|
||||
@@ -292,7 +298,7 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
|
||||
# 'url',
|
||||
'download_url',
|
||||
|
||||
'annotation', 'tags',
|
||||
'annotation',
|
||||
|
||||
'api_type'
|
||||
], include_keys_from='summary' )
|
||||
@@ -326,7 +332,7 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
|
||||
'misc_blurb' : self._remap_from( 'blurb' ),
|
||||
'file_ext' : self._remap_from( 'extension' ),
|
||||
'file_path' : self._remap_from( 'file_name' ),
|
||||
|
||||
'nametags' : self.serialize_nametags,
|
||||
'resubmitted' : lambda i, k, **c: self.hda_manager.has_been_resubmitted( i ),
|
||||
'display_apps' : self.serialize_display_apps,
|
||||
'display_types' : self.serialize_old_display_applications,
|
||||
@@ -380,6 +386,17 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
|
||||
|
||||
return display_apps
|
||||
|
||||
def serialize_nametags( self, hda, key, trans=None, **context ):
|
||||
"""
|
||||
Return list of 'name' child tags attached to this dataset.
|
||||
TODO: investigate faster ways to fetch 'name' tags and values
|
||||
"""
|
||||
nametags = []
|
||||
for tag in hda.tags:
|
||||
if tag.tag.name == 'name':
|
||||
nametags.append(tag.value)
|
||||
return nametags
|
||||
|
||||
def serialize_old_display_applications( self, hda, key, trans=None, **context ):
|
||||
"""
|
||||
Return dictionary containing old-style display app urls.
|
||||
|
||||
@@ -745,9 +745,7 @@ class WorkflowContentsManager(UsesAnnotations):
|
||||
del step_dict['tool_id']
|
||||
del step_dict['tool_version']
|
||||
del step_dict['tool_inputs']
|
||||
workflow = step.subworkflow
|
||||
step_dict['stored_workflow_id'] = encode(workflow.stored_workflow.id)
|
||||
step_dict['workflow_id'] = encode(workflow.id)
|
||||
step_dict['workflow_id'] = encode(step.subworkflow.id)
|
||||
|
||||
for conn in step.input_connections:
|
||||
step_id = step.id if legacy else step.order_index
|
||||
|
||||
@@ -1416,6 +1416,7 @@ class History( object, Dictifiable, UsesAnnotations, HasName ):
|
||||
.options( joinedload("dataset"),
|
||||
joinedload("dataset.actions"),
|
||||
joinedload("dataset.actions.role"),
|
||||
joinedload("tags"),
|
||||
))
|
||||
self._active_datasets_and_roles = query.all()
|
||||
return self._active_datasets_and_roles
|
||||
|
||||
@@ -226,13 +226,13 @@ class GalaxyQueueWorker(ConsumerMixin, threading.Thread):
|
||||
if body.get('noop', None) != self.app.config.server_name:
|
||||
try:
|
||||
f = self.task_mapping[body['task']]
|
||||
log.info("Instance '%s' recieved '%s' task, executing now.", self.app.config.server_name, body['task'])
|
||||
log.info("Instance '%s' received '%s' task, executing now.", self.app.config.server_name, body['task'])
|
||||
f(self.app, **body['kwargs'])
|
||||
except Exception:
|
||||
# this shouldn't ever throw an exception, but...
|
||||
log.exception("Error running control task type: %s" % body['task'])
|
||||
else:
|
||||
log.warning("Recieved a malformed task message:\n%s" % body)
|
||||
log.warning("Received a malformed task message:\n%s" % body)
|
||||
message.ack()
|
||||
|
||||
def shutdown(self):
|
||||
|
||||
@@ -214,6 +214,7 @@ class DefaultToolAction( object ):
|
||||
# format.
|
||||
input_ext = 'data' if tool.profile < 16.04 else "input"
|
||||
input_dbkey = incoming.get( "dbkey", "?" )
|
||||
preserved_tags = []
|
||||
for name, data in reversed(inp_data.items()):
|
||||
if not data:
|
||||
data = NoneDataset( datatypes_registry=app.datatypes_registry )
|
||||
@@ -234,6 +235,9 @@ class DefaultToolAction( object ):
|
||||
if identifier is not None:
|
||||
incoming[ "%s|__identifier__" % name ] = identifier
|
||||
|
||||
for tag in data.tags:
|
||||
preserved_tags.append(tag)
|
||||
|
||||
# Collect chromInfo dataset and add as parameters to incoming
|
||||
( chrom_info, db_dataset ) = app.genome_builds.get_chrom_info( input_dbkey, trans=trans, custom_build_hack_get_len_from_fasta_conversion=tool.id != 'CONVERTER_fasta_to_len' )
|
||||
if db_dataset:
|
||||
@@ -303,6 +307,9 @@ class DefaultToolAction( object ):
|
||||
trans.sa_session.add( data )
|
||||
trans.app.security_agent.set_all_dataset_permissions( data.dataset, output_permissions, new=True )
|
||||
|
||||
for tag in preserved_tags:
|
||||
data.tags.append(tag.copy())
|
||||
|
||||
# Must flush before setting object store id currently.
|
||||
# TODO: optimize this.
|
||||
trans.sa_session.flush()
|
||||
|
||||
@@ -215,16 +215,19 @@ class CondaContext(installable.InstallableContext):
|
||||
|
||||
def exec_command(self, operation, args):
|
||||
command = self.command(operation, args)
|
||||
env = {'HOME': self.conda_prefix} # We don't want to pollute ~/.conda, which may not even be writable
|
||||
env = {}
|
||||
condarc_override = self.condarc_override
|
||||
if condarc_override:
|
||||
env["CONDARC"] = condarc_override
|
||||
log.debug("Executing command: %s", command)
|
||||
env['HOME'] = tempfile.mkdtemp(prefix='conda_exec_home_') # We don't want to pollute ~/.conda, which may not even be writable
|
||||
try:
|
||||
return self.shell_exec(command, env=env)
|
||||
except commands.CommandLineException as e:
|
||||
log.warning(e)
|
||||
return e.returncode
|
||||
finally:
|
||||
shutil.rmtree(env['HOME'], ignore_errors=True)
|
||||
|
||||
def exec_create(self, args):
|
||||
create_base_args = [
|
||||
|
||||
@@ -232,7 +232,7 @@ class CondaDependencyResolver(DependencyResolver, MultipleDependencyResolver, Li
|
||||
if job_directory:
|
||||
conda_environment = os.path.join(job_directory, conda_env)
|
||||
else:
|
||||
conda_environment = None
|
||||
conda_environment = self.conda_context.env_path(conda_target.install_environment)
|
||||
|
||||
return CondaDependency(
|
||||
self.conda_context,
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
Basic tool parameters.
|
||||
"""
|
||||
import logging
|
||||
import numbers
|
||||
import os
|
||||
import os.path
|
||||
import re
|
||||
@@ -131,8 +130,6 @@ class ToolParameter( object, Dictifiable ):
|
||||
|
||||
def to_python( self, value, app ):
|
||||
"""Convert a value created with to_json back to an object representation"""
|
||||
if isinstance( value, numbers.Number ):
|
||||
return unicodify( value )
|
||||
return value
|
||||
|
||||
def value_to_basic( self, value, app, use_security=False ):
|
||||
@@ -1767,8 +1764,13 @@ class DataToolParameter( BaseDataToolParameter ):
|
||||
multiple = self.multiple
|
||||
|
||||
# build and append a new select option
|
||||
def append( list, id, hid, name, src, keep=False ):
|
||||
return list.append( { 'id' : trans.security.encode_id( id ), 'hid' : hid, 'name' : name, 'src' : src, 'keep': keep } )
|
||||
def append( list, hda, name, src, keep=False ):
|
||||
return list.append( { 'id' : trans.security.encode_id( hda.id ),
|
||||
'hid' : hda.hid,
|
||||
'name' : name,
|
||||
'tags' : [ t.user_tname if not t.value else "%s:%s" % (t.user_tname, t.value) for t in hda.tags ],
|
||||
'src' : src,
|
||||
'keep' : keep } )
|
||||
|
||||
# add datasets
|
||||
visible_hda = other_values.get( self.name )
|
||||
@@ -1779,7 +1781,7 @@ class DataToolParameter( BaseDataToolParameter ):
|
||||
m = match.hda
|
||||
has_matched = has_matched or visible_hda == m or visible_hda == hda
|
||||
m_name = '%s (as %s)' % ( match.original_hda.name, match.target_ext ) if match.implicit_conversion else m.name
|
||||
append( d[ 'options' ][ 'hda' ], m.id, m.hid, m_name, 'hda' )
|
||||
append( d[ 'options' ][ 'hda' ], m, m_name, 'hda' )
|
||||
if not has_matched and hasattr( visible_hda, 'hid' ):
|
||||
if visible_hda.deleted:
|
||||
hda_state = 'deleted'
|
||||
@@ -1787,13 +1789,13 @@ class DataToolParameter( BaseDataToolParameter ):
|
||||
hda_state = 'hidden'
|
||||
else:
|
||||
hda_state = 'unavailable'
|
||||
append( d[ 'options' ][ 'hda' ], visible_hda.id, visible_hda.hid, '(%s) %s' % ( hda_state, visible_hda.name ), 'hda', True )
|
||||
append( d[ 'options' ][ 'hda' ], visible_hda, '(%s) %s' % ( hda_state, visible_hda.name ), 'hda', True )
|
||||
|
||||
# add dataset collections
|
||||
dataset_collection_matcher = DatasetCollectionMatcher( dataset_matcher )
|
||||
for hdca in history.active_dataset_collections:
|
||||
if dataset_collection_matcher.hdca_match( hdca, reduction=multiple ):
|
||||
append( d[ 'options' ][ 'hdca' ], hdca.id, hdca.hid, hdca.name, 'hdca' )
|
||||
append( d[ 'options' ][ 'hdca' ], hdca, hdca.name, 'hdca' )
|
||||
|
||||
# sort both lists
|
||||
d['options']['hda'] = sorted(d['options']['hda'], key=lambda k: k['hid'], reverse=True)
|
||||
@@ -1920,20 +1922,22 @@ class DataCollectionToolParameter( BaseDataToolParameter ):
|
||||
# append directly matched collections
|
||||
for hdca in self.match_collections( trans, history, dataset_matcher ):
|
||||
d['options']['hdca'].append({
|
||||
'id': trans.security.encode_id( hdca.id ),
|
||||
'hid': hdca.hid,
|
||||
'name': hdca.name,
|
||||
'src': 'hdca'
|
||||
'id' : trans.security.encode_id( hdca.id ),
|
||||
'hid' : hdca.hid,
|
||||
'name' : hdca.name,
|
||||
'src' : 'hdca',
|
||||
'tags' : [ t.user_tname if not t.value else "%s:%s" % (t.user_tname, t.value) for t in hdca.tags ]
|
||||
})
|
||||
|
||||
# append matching subcollections
|
||||
for hdca in self.match_multirun_collections( trans, history, dataset_matcher ):
|
||||
subcollection_type = self._history_query( trans ).can_map_over( hdca ).collection_type
|
||||
d['options']['hdca'].append({
|
||||
'id': trans.security.encode_id( hdca.id ),
|
||||
'hid': hdca.hid,
|
||||
'name': hdca.name,
|
||||
'src': 'hdca',
|
||||
'id' : trans.security.encode_id( hdca.id ),
|
||||
'hid' : hdca.hid,
|
||||
'name' : hdca.name,
|
||||
'src' : 'hdca',
|
||||
'tags' : [ t.user_tname if not t.value else "%s:%s" % (t.user_tname, t.value) for t in hdca.tags ],
|
||||
'map_over_type': subcollection_type
|
||||
})
|
||||
|
||||
|
||||
@@ -56,10 +56,13 @@ def swap_inf_nan( val ):
|
||||
def safe_loads( arg ):
|
||||
"""
|
||||
This is a wrapper around loads that returns the parsed value instead of
|
||||
raising a value error.
|
||||
raising a value error. It also avoids autoconversion of non-iterables
|
||||
i.e numeric and boolean values.
|
||||
"""
|
||||
try:
|
||||
loaded = json.loads( arg )
|
||||
if loaded is not None and not isinstance( loaded, collections.Iterable ):
|
||||
loaded = arg
|
||||
except ( TypeError, ValueError ):
|
||||
loaded = arg
|
||||
return loaded
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import logging
|
||||
import os
|
||||
from datetime import datetime, timedelta
|
||||
from six import string_types
|
||||
import six
|
||||
from string import punctuation as PUNCTUATION
|
||||
|
||||
from sqlalchemy import and_, false, func, or_
|
||||
@@ -1120,6 +1120,30 @@ class Admin( object ):
|
||||
job=job,
|
||||
message="<a href='jobs'>Back</a>" )
|
||||
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def manage_tool_dependencies( self, trans, install_dependencies=False, build_cache=False, install_for_tools=[], viewkey='View tool-centric dependencies'):
|
||||
tools_by_id = trans.app.toolbox.tools_by_id
|
||||
if install_dependencies:
|
||||
# install the dependencies for the tools in the install_for_tools list
|
||||
if not isinstance(install_for_tools, list):
|
||||
install_for_tools = [install_for_tools]
|
||||
requirements = set([tools_by_id[tid].tool_requirements for tid in install_for_tools])
|
||||
[trans.app.toolbox.tools_by_id[install_for_tools[0]]._view.install_dependencies(r) for r in requirements]
|
||||
view = six.next(six.itervalues(trans.app.toolbox.tools_by_id))._view
|
||||
tool_ids_by_requirements = {}
|
||||
for tid, tool in trans.app.toolbox.tools_by_id.items():
|
||||
if tool.tool_requirements not in tool_ids_by_requirements:
|
||||
tool_ids_by_requirements[tool.tool_requirements] = [tid]
|
||||
else:
|
||||
tool_ids_by_requirements[tool.tool_requirements].append(tid)
|
||||
requirements_status = {r: view.get_requirements_status({tid: r}, tools_by_id[tids[0]].installed_tool_dependencies) for r, tids in tool_ids_by_requirements.items()}
|
||||
return trans.fill_template( '/webapps/galaxy/admin/manage_dependencies.mako',
|
||||
tools=tools_by_id,
|
||||
requirements_status=requirements_status,
|
||||
tool_ids_by_requirements=tool_ids_by_requirements,
|
||||
viewkey=viewkey )
|
||||
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def sanitize_whitelist( self, trans, submit_whitelist=False, tools_to_whitelist=[]):
|
||||
@@ -1127,7 +1151,7 @@ class Admin( object ):
|
||||
# write the configured sanitize_whitelist_file with new whitelist
|
||||
# and update in-memory list.
|
||||
with open(trans.app.config.sanitize_whitelist_file, 'wt') as f:
|
||||
if isinstance(tools_to_whitelist, string_types):
|
||||
if isinstance(tools_to_whitelist, six.string_types):
|
||||
tools_to_whitelist = [tools_to_whitelist]
|
||||
new_whitelist = sorted([tid for tid in tools_to_whitelist if tid in trans.app.toolbox.tools_by_id])
|
||||
f.write("\n".join(new_whitelist))
|
||||
|
||||
@@ -6,8 +6,10 @@ import yaml
|
||||
import stat
|
||||
import random
|
||||
import tempfile
|
||||
import uuid
|
||||
from subprocess import Popen, PIPE
|
||||
|
||||
from galaxy.util import string_as_bool_or_none
|
||||
from galaxy.util.bunch import Bunch
|
||||
from galaxy import web, model
|
||||
from galaxy.managers import api_keys
|
||||
@@ -17,6 +19,9 @@ import logging
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
CONTAINER_NAME_PREFIX = 'galaxy_gie_'
|
||||
|
||||
|
||||
class InteractiveEnvironmentRequest(object):
|
||||
|
||||
def __init__(self, trans, plugin):
|
||||
@@ -44,6 +49,11 @@ class InteractiveEnvironmentRequest(object):
|
||||
self.attr.docker_hostname = self.attr.viz_config.get("docker", "docker_hostname")
|
||||
self.attr.docker_connect_port = self.attr.viz_config.get("docker", "docker_connect_port") or None
|
||||
|
||||
if string_as_bool_or_none(self.attr.viz_config.get("docker", "swarm_mode")) is not None:
|
||||
self.attr.swarm_mode = string_as_bool_or_none(self.attr.viz_config.get("docker", "swarm_mode"))
|
||||
else:
|
||||
self.attr.swarm_mode = trans.app.config.gie_swarm_mode
|
||||
|
||||
# Generate per-request passwords the IE plugin can use to configure
|
||||
# the destination container.
|
||||
self.notebook_pw_salt = self.generate_password(length=12)
|
||||
@@ -78,6 +88,10 @@ class InteractiveEnvironmentRequest(object):
|
||||
if self.attr.proxy_prefix.startswith('/'):
|
||||
self.attr.proxy_prefix = '/' + self.attr.proxy_prefix.lstrip('/')
|
||||
|
||||
assert not self.attr.swarm_mode or (self.attr.swarm_mode and
|
||||
self.attr.docker_connect_port is not None), \
|
||||
"Error: Docker swarm mode enabled but docker_connect_port is not set"
|
||||
|
||||
def load_allowed_images(self):
|
||||
if os.path.exists(os.path.join(self.attr.our_config_dir, 'allowed_images.yml')):
|
||||
fn = os.path.join(self.attr.our_config_dir, 'allowed_images.yml')
|
||||
@@ -108,11 +122,12 @@ class InteractiveEnvironmentRequest(object):
|
||||
# their defaults dictionary instead.
|
||||
default_dict = {
|
||||
'command': 'docker {docker_args}',
|
||||
'command_inject': '--sig-proxy=true -e DEBUG=false',
|
||||
'command_inject': '-e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=120',
|
||||
'docker_hostname': 'localhost',
|
||||
'wx_tempdir': 'False',
|
||||
'docker_galaxy_temp_dir': None,
|
||||
'docker_connect_port': None
|
||||
'docker_connect_port': None,
|
||||
'swarm_mode': None,
|
||||
}
|
||||
viz_config = ConfigParser.SafeConfigParser(default_dict)
|
||||
conf_path = os.path.join( self.attr.our_config_dir, self.attr.viz_id + ".ini" )
|
||||
@@ -211,33 +226,73 @@ class InteractiveEnvironmentRequest(object):
|
||||
def volume(self, host_path, container_path, **kwds):
|
||||
return DockerVolume(host_path, container_path, **kwds)
|
||||
|
||||
def docker_cmd(self, image, env_override={}, volumes=[]):
|
||||
def docker_cmd(self, image, env_override=None, volumes=None):
|
||||
"""
|
||||
Generate and return the docker command to execute
|
||||
"""
|
||||
if env_override is None:
|
||||
env_override = {}
|
||||
if volumes is None:
|
||||
volumes = []
|
||||
temp_dir = self.temp_dir
|
||||
conf = self.get_conf_dict()
|
||||
conf.update(env_override)
|
||||
env_str = ' '.join(['-e "%s=%s"' % (key.upper(), item) for key, item in conf.items()])
|
||||
volume_str = ' '.join(['-v "%s"' % volume for volume in volumes])
|
||||
import_volume_str = '-v "{temp_dir}:/import/"'.format(temp_dir=temp_dir) if self.attr.import_volume else ''
|
||||
name = None
|
||||
# This is the basic docker command such as "sudo -u docker docker {docker_args}"
|
||||
# or just "docker {docker_args}"
|
||||
command = self.attr.viz_config.get("docker", "command")
|
||||
# Then we format in the entire docker command in place of
|
||||
# {docker_args}, so as to let the admin not worry about which args are
|
||||
# getting passed
|
||||
command = command.format(docker_args='run {command_inject} {environment} -d -P {import_volume_str} {volume_str} {image}')
|
||||
command_inject = self.attr.viz_config.get("docker", "command_inject")
|
||||
# --name should really not be set, but we'll try to honor it anyway
|
||||
if '--name' not in command_inject:
|
||||
name = CONTAINER_NAME_PREFIX + uuid.uuid4().hex
|
||||
if not self.attr.swarm_mode:
|
||||
command = command.format(docker_args='run {command_inject} {name} {environment} -d -P {import_volume_str} {volume_str} {image}')
|
||||
# --sig-proxy is not valid in the swarm mode context
|
||||
if '--sig-proxy=' not in command_inject:
|
||||
command_inject = '--sig-proxy=true ' + command_inject
|
||||
else:
|
||||
command = command.format(docker_args='service create --replicas 1 --restart-condition none {command_inject} {name} -p {docker_connect_port} {environment} {image}')
|
||||
|
||||
# Once that's available, we format again with all of our arguments
|
||||
command = command.format(
|
||||
command_inject=self.attr.viz_config.get("docker", "command_inject"),
|
||||
command_inject=command_inject,
|
||||
name='--name=%s' % name if name is not None else '',
|
||||
environment=env_str,
|
||||
import_volume_str=import_volume_str,
|
||||
volume_str=volume_str,
|
||||
image=image,
|
||||
docker_connect_port=self.attr.docker_connect_port,
|
||||
)
|
||||
return command
|
||||
|
||||
def get_digest_image(self, image):
|
||||
"""Get the digest image string for an image.
|
||||
|
||||
:type image: str
|
||||
:param image: image name and optionally, tag
|
||||
|
||||
:returns: digest string, having the format `<name>@<hash_alg>:<digest>`, e.g.:
|
||||
`'bgruening/docker-jupyter-notebook@sha256:3ec0bc9abc9d511aa602ee4fff2534d80dd9b1564482de52cb5de36cce6debae'`
|
||||
"""
|
||||
command = self.attr.viz_config.get("docker", "command")
|
||||
command = command.format(docker_args="image inspect --format '{{{{(index .RepoDigests 0)}}}}' {image}".format(image=image))
|
||||
p = Popen(command, stdout=PIPE, stderr=PIPE, close_fds=True, shell=True)
|
||||
stdout, stderr = p.communicate()
|
||||
digest = None
|
||||
if p.returncode == 0:
|
||||
digest = stdout.strip()
|
||||
elif p.returncode == 1 and stderr.strip() == 'Error: No such image: {image}'.format(image=image):
|
||||
log.warning("%s not pulled, cannot get digest", image)
|
||||
else:
|
||||
log.error( "%s\n%s" % (stdout, stderr) )
|
||||
return digest or image
|
||||
|
||||
def _idsToVolumes(self, ids):
|
||||
if len(ids.strip()) == 0:
|
||||
return []
|
||||
@@ -286,6 +341,11 @@ class InteractiveEnvironmentRequest(object):
|
||||
raise Exception("Attempting to launch disallowed image! %s not in list of allowed images [%s]"
|
||||
% (image, ', '.join(self.allowed_images)))
|
||||
|
||||
# The digest image is necessary if using swarm mode and the image's
|
||||
# registry (e.g. docker hub, quay.io) is down. See:
|
||||
# https://github.com/docker/docker/issues/31427
|
||||
image = self.get_digest_image(image)
|
||||
|
||||
if additional_ids is not None:
|
||||
volumes += self._idsToVolumes(additional_ids)
|
||||
|
||||
@@ -355,7 +415,10 @@ class InteractiveEnvironmentRequest(object):
|
||||
:returns: inspect_data, a dict of docker inspect output
|
||||
"""
|
||||
command = self.attr.viz_config.get("docker", "command")
|
||||
command = command.format(docker_args="inspect %s" % container_id)
|
||||
if not self.attr.swarm_mode:
|
||||
command = command.format(docker_args="inspect %s" % container_id)
|
||||
else:
|
||||
command = command.format(docker_args="service inspect %s" % container_id)
|
||||
log.info("Inspecting docker container {0} with command [{1}]".format(
|
||||
container_id,
|
||||
command
|
||||
@@ -368,15 +431,6 @@ class InteractiveEnvironmentRequest(object):
|
||||
return None
|
||||
|
||||
inspect_data = json.loads(stdout)
|
||||
# [{
|
||||
# "NetworkSettings" : {
|
||||
# "Ports" : {
|
||||
# "3306/tcp" : [
|
||||
# {
|
||||
# "HostIp" : "127.0.0.1",
|
||||
# "HostPort" : "3306"
|
||||
# }
|
||||
# ]
|
||||
return inspect_data
|
||||
|
||||
def get_container_host(self, inspect_data):
|
||||
@@ -410,13 +464,43 @@ class InteractiveEnvironmentRequest(object):
|
||||
Someday code that calls this should be refactored whenever we get
|
||||
containers with multiple ports working.
|
||||
"""
|
||||
# non-swarm:
|
||||
# [{
|
||||
# "NetworkSettings" : {
|
||||
# "Ports" : {
|
||||
# "3306/tcp" : [
|
||||
# {
|
||||
# "HostIp" : "127.0.0.1",
|
||||
# "HostPort" : "3306"
|
||||
# }
|
||||
# ]
|
||||
# swarm:
|
||||
# [{
|
||||
# "Endpoint": {
|
||||
# "Ports": [
|
||||
# {
|
||||
# "Protocol": "tcp",
|
||||
# "TargetPort": 8888,
|
||||
# "PublishedPort": 30000,
|
||||
# "PublishMode": "ingress"
|
||||
# }
|
||||
# ]
|
||||
mappings = []
|
||||
port_mappings = inspect_data[0]['NetworkSettings']['Ports']
|
||||
for port_name in port_mappings:
|
||||
for binding in port_mappings[port_name]:
|
||||
if not self.attr.swarm_mode:
|
||||
port_mappings = inspect_data[0]['NetworkSettings']['Ports']
|
||||
for port_name in port_mappings:
|
||||
for binding in port_mappings[port_name]:
|
||||
mappings.append((
|
||||
port_name.replace('/tcp', '').replace('/udp', ''),
|
||||
binding['HostIp'],
|
||||
binding['HostPort']
|
||||
))
|
||||
else:
|
||||
port_mappings = inspect_data[0]['Endpoint']['Ports']
|
||||
for binding in port_mappings:
|
||||
mappings.append((
|
||||
port_name.replace('/tcp', '').replace('/udp', ''),
|
||||
binding['HostIp'],
|
||||
binding['HostPort']
|
||||
binding['TargetPort'],
|
||||
'127.0.0.1', # use the routing mesh
|
||||
binding['PublishedPort']
|
||||
))
|
||||
return mappings
|
||||
|
||||
@@ -52,7 +52,12 @@ def edgelist_for_workflow_steps( steps ):
|
||||
for step in steps:
|
||||
edges.append( ( steps_to_index[step], steps_to_index[step] ) )
|
||||
for conn in step.input_connections:
|
||||
edges.append( ( steps_to_index[conn.output_step], steps_to_index[conn.input_step] ) )
|
||||
output_index = steps_to_index[conn.output_step]
|
||||
input_index = steps_to_index[conn.input_step]
|
||||
# self connection - a cycle not detectable by topsort function.
|
||||
if output_index == input_index:
|
||||
raise CycleError([], 0, 0)
|
||||
edges.append( ( output_index, input_index ) )
|
||||
return edges
|
||||
|
||||
|
||||
|
||||
+38
-8
@@ -8,7 +8,6 @@ rm -f run_functional_tests.log
|
||||
|
||||
show_help() {
|
||||
cat <<EOF
|
||||
'${0##*/} (test_path)' for testing all the tools in functional directory
|
||||
'${0##*/} -id bbb' for testing one tool with id 'bbb' ('bbb' is the tool id)
|
||||
'${0##*/} -sid ccc' for testing one section with sid 'ccc' ('ccc' is the string after 'section::')
|
||||
'${0##*/} -list' for listing all the tool ids
|
||||
@@ -24,14 +23,49 @@ cat <<EOF
|
||||
'${0##*/} -qunit testname' for running single JavaScript test with given name
|
||||
'${0##*/} -selenium' for running all selenium web tests (in test/selenium_tests)
|
||||
'${0##*/} -selenium (test_path)' for running specified selenium web tests (use nosetest path)
|
||||
'${0##*/} -casperjs (py_test_path)' for running casperjs JavaScript tests using a Python wrapper for consistency. py_test_path in casperjs_runner.py e.g. 'Test_04_HDAs' or 'Test_04_HDAs.test_00_HDA_states'.
|
||||
|
||||
This wrapper script largely serves as a point documentation and convenience -
|
||||
most tests shipped with Galaxy can be run with nosetests or qunit directly.
|
||||
|
||||
The main test types are as follows:
|
||||
|
||||
- API: These tests are located in test/api and test various aspects of the Galaxy
|
||||
API and test general backend aspects of Galaxy using the API.
|
||||
- Integration: These tests are located in test/integration and test special
|
||||
configurations of Galaxy. All API tests assume a particular Galaxy configuration
|
||||
defined by test/base/driver_util.py and integration tests can be used to
|
||||
launch and test Galaxy in other configurations.
|
||||
- Framework: These tests are all Galaxy tool tests and can be found in
|
||||
test/functional/tools. These are for the most part meant to test and
|
||||
demonstrate features of the tool evaluation environment and of Galaxy tool XML
|
||||
files.
|
||||
- Unit: These are Python unit tests either defined as doctests or inside of
|
||||
test/unit. These should generally not require a Galaxy instance and should
|
||||
quickly test just a component or a few components of Galaxy's backend code.
|
||||
- QUnit: These are JavaScript unit tests defined in test/qunit.
|
||||
- Selenium: These are full stack tests meant to test the Galaxy UI with real
|
||||
browsers and are located in test/selenium_tests.
|
||||
- ToolShed: These are web tests that use the older Python web testing
|
||||
framework twill to test ToolShed related functionality. These are
|
||||
located in test/shed_functional.
|
||||
|
||||
Nose tests will allow specific tests to be selected per the documentation at
|
||||
https://nose.readthedocs.org/en/latest/usage.html#selecting-tests. These are
|
||||
indicated with the optional parameter (test_path). A few examples are:
|
||||
|
||||
Run all TestUserInfo functional tests:
|
||||
./run_tests.sh test/functional/test_user_info.py:TestUserInfo
|
||||
Run all API tests:
|
||||
./run_tests.sh -api
|
||||
|
||||
The same test as above can be run using nosetests directly as follows:
|
||||
nosetests test/api
|
||||
|
||||
However when using nosetests directly output options defined in this
|
||||
file aren't respected and a new Galaxy instance will be created for each
|
||||
TestCase class (this scripts optimizes it so all tests can share a Galaxy
|
||||
instance).
|
||||
|
||||
Run a full class of API tests:
|
||||
./run_tests.sh -api test/api/test_tools.py:ToolsTestCase
|
||||
|
||||
Run a specific API test:
|
||||
./run_tests.sh -api test/api/test_tools.py:ToolsTestCase.test_map_over_with_output_format_actions
|
||||
@@ -140,10 +174,6 @@ GALAXY_CONFIG_MASTER_KEY Master or admin API key to use as part of
|
||||
testing with GALAXY_TEST_EXTERNAL.
|
||||
GALAXY_TEST_USER_API_KEY User API key to use as part of testing with
|
||||
GALAXY_TEST_EXTERNAL.
|
||||
GALAXY_TEST_HISTORY_ID Point casperjs tests at specific external
|
||||
history for testing.
|
||||
GALAXY_TEST_WORKFLOW_FILE Point casperjs tests at specific workflow
|
||||
file for testing.
|
||||
GALAXY_TEST_VERBOSE_ERRORS Enable more verbose errors during API tests.
|
||||
GALAXY_TEST_UPLOAD_ASYNC Upload tool test inputs asynchronously (may
|
||||
overwhelm sqlite database).
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"analysis.js","sources":["../src/analysis.js"],"names":["jQuery","require","$","GalaxyApp","QUERY_STRING","PANEL","ToolPanel","HistoryPanel","PAGE","ToolForm","UserPreferences","Tours","window","app","options","bootstrapped","Galaxy","debug","config","toolPanel","el","userIsAnonymous","user","isAnonymous","toolbox","toolbox_in_panel","stored_workflow_menu_entries","nginx_upload_path","ftp_upload_site","default_genome","default_extension","centerPanel","CenterPanel","historyPanel","galaxyRoot","root","allow_user_dataset_purge","analysisPage","PageLayoutView","_","extend","left","center","right","page","params","tool_panel","upload","uploadButton","currHistoryPanel","historyView","listenToGalaxy","display","view","remove","router","Backbone","Router","initialize","this","execute","callback","args","name","queryObj","parse","pop","push","apply","routes","(/)","(/)root*","(/)tours(/)(:tour_id)","(/)users(/)","show_tours","tour_id","giveTour","ToursView","show_users","View","home","tool_id","job_id","show","_loadCenterIframe","_loadToolForm","workflow_id","m_c","m_a","id","url","prop","render","loadCurrentHistory","listenTo","fetch","urlRoot","connectToQuotaMeter","masthead","quotaMeter","history","start","pushState"],"mappings":"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"}
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"app.js","sources":["../src/app.js"],"names":["define","Utils","Masthead","Modal","QuotaMeter","Backbone","View","extend","initialize","options","Galaxy","app","this","modal","masthead","setElement","_template","$el","append","$","render","require","Analysis","window","console","log","err","debug","initialize2","merge","params","$container","parent","attr","addClass","message_box_visible","show","show_inactivity_warning","menu","Menu","GalaxyMenu","config","quotaMeter","UserQuotaMeter","model","user","el","display","target","remove","panels","_buildPanels","Views","panel_ids","i","id","view","components","header","title","cls","buttons","body","$panel","_templatePanel","find","html","Panel","center","panel","drag","toggle","right","message_box_class","message_box_content","inactivity_box_content","root"],"mappings":"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"}
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"analysis.js","sources":["../../src/app/analysis.js"],"names":["define","Backbone","View","extend","initialize","options","this","Utils","merge","setElement","_template","params","$","prop","Galaxy","root","tool_id","param","workflow_id","m_c","m_a","config","require_login","user","id","self","on","show","empty","hide","display","$el","scrollTop","append","tool_search","Tools","ToolSearch","spinner_url","search_url","hidden","tools","ToolCollection","toolbox","tool_panel","ToolPanel","layout","toolbox_in_panel","tool_panel_view","ToolPanelView","model","toolPanel","get","size","render","prepend","_templateTool","title","href","i","stored_workflow_menu_entries","m","stored_workflow","name","encoded_stored_workflow_id","click","parent","handle_minwidth_hint","attr","upload","Upload","components","header","buttons","buttonRefresh","Ui","ButtonLink","cls","icon","onclick","top","currHistoryPanel","loadCurrentHistory","buttonOptions","target","buttonViewMulti","body","historyOptionsMenu","optionsMenu","anonymous","purgeAllowed","allow_user_dataset_purge","HistoryPanel","CurrentHistoryPanel","el","linkTarget","$scrollContainer","connectToQuotaMeter","quotaMeter","listenToGalaxy","left"],"mappings":"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"}
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"hda-li.js","sources":["../../../src/mvc/history/hda-li.js"],"names":["define","DATASET_LI","BASE_MVC","_l","_super","DatasetListItemView","HDAListItemView","extend","className","prototype","initialize","attributes","options","call","this","toString","modelString","model","templates","titleBarTemplate","wrapTemplate","warnings","_","hidden","titleBar"],"mappings":"AAAAA,QACI,yBACA,eACA,sBACD,SAAUC,EAAYC,EAAUC,GAEnC,YAGA,IAAIC,GAASH,EAAWI,oBAMpBC,EAAkBF,EAAOG,QAGzBC,UAAcJ,EAAOK,UAAUD,UAAY,mBAE3CE,WAAa,SAAUC,EAAYC,GAC/BR,EAAOK,UAAUC,WAAWG,KAAMC,KAAMH,EAAYC,IAKxDG,SAAW,WACP,GAAIC,GAAgBF,KAAW,MAAIA,KAAKG,MAAQ,GAAK,YACrD,OAAO,mBAAqBD,EAAc,MAwC9C,OAlCJV,GAAgBG,UAAUS,UAAa,WAEnC,GAAIC,GAAmBjB,EAASkB,cAE5B,6CACI,mCACA,sBAEI,+CACA,gDACJ,SACJ,UACD,WAECC,EAAWC,EAAEf,UAAYH,EAAOK,UAAUS,UAAUG,UACpDE,OAASrB,EAASkB,cAEd,gCACI,+CACIjB,EAAI,gCACR,SACJ,WACD,YAGP,OAAOmB,GAAEf,UAAYH,EAAOK,UAAUS,WAClCM,SAAWL,EACXE,SAAWA,QAQXf,gBAAmBA"}
|
||||
{"version":3,"file":"hda-li.js","sources":["../../../src/mvc/history/hda-li.js"],"names":["define","DATASET_LI","BASE_MVC","_l","_super","DatasetListItemView","HDAListItemView","extend","className","prototype","initialize","attributes","options","call","this","toString","modelString","model","templates","titleBarTemplate","wrapTemplate","warnings","_","hidden","titleBar"],"mappings":"AAAAA,QACI,yBACA,eACA,sBACD,SAAUC,EAAYC,EAAUC,GAEnC,YAGA,IAAIC,GAASH,EAAWI,oBAMpBC,EAAkBF,EAAOG,QAGzBC,UAAcJ,EAAOK,UAAUD,UAAY,mBAE3CE,WAAa,SAAUC,EAAYC,GAC/BR,EAAOK,UAAUC,WAAWG,KAAMC,KAAMH,EAAYC,IAKxDG,SAAW,WACP,GAAIC,GAAgBF,KAAW,MAAIA,KAAKG,MAAQ,GAAK,YACrD,OAAO,mBAAqBD,EAAc,MA8C9C,OAxCJV,GAAgBG,UAAUS,UAAa,WAEnC,GAAIC,GAAmBjB,EAASkB,cAE5B,6CACI,mCACA,sBAEI,+CACA,gDACJ,SACA,QACA,0BACI,gDACI,mDACJ,YACJ,UACJ,UACD,WAECC,EAAWC,EAAEf,UAAYH,EAAOK,UAAUS,UAAUG,UACpDE,OAASrB,EAASkB,cAEd,gCACI,+CACIjB,EAAI,gCACR,SACJ,WACD,YAGP,OAAOmB,GAAEf,UAAYH,EAAOK,UAAUS,WAClCM,SAAWL,EACXE,SAAWA,QAQXf,gBAAmBA"}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
{"version":3,"file":"upload-ftp.js","sources":["../../../src/mvc/upload/upload-ftp.js"],"names":["define","Utils","Backbone","View","extend","initialize","options","self","this","merge","class_add","class_remove","class_partial","collection","onchange","onadd","onremove","setElement","_template","rows","get","url","Galaxy","root","success","ftp_files","_fill","error","length","$","html","_templateTable","size","index","push","_add","bytesToString","show","$select_all","addClass","on","add","hasClass","ftp_file","model_index","_find","trigger","_refresh","_templateInfo","hide","$it","_templateRow","$icon","find","append","removeClass","filtered","where","file_mode","enabled","item","findWhere","file_path","path","ctime","ftp_upload_site"],"mappings":"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"}
|
||||
{"version":3,"file":"upload-ftp.js","sources":["../../../src/mvc/upload/upload-ftp.js"],"names":["define","Utils","Backbone","View","extend","initialize","options","self","this","merge","class_add","class_remove","class_partial","collection","onchange","onadd","onremove","setElement","_template","rows","get","url","Galaxy","root","success","ftp_files","_fill","error","length","$","html","_templateTable","size","index","push","_add","bytesToString","show","$select_all","addClass","on","add","hasClass","ftp_file","model_index","_find","trigger","_refresh","_templateInfo","hide","$it","_templateRow","$icon","find","append","removeClass","filtered","where","file_mode","enabled","item","findWhere","file_path","path","_","escape","ctime","ftp_upload_site"],"mappings":"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"}
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"onload.js","sources":["../src/onload.js"],"names":["replace_big_select_inputs","min_length","max_length","select_elts","refresh_select2","element","select_elt","$","options","placeholder","closeOnSelect","is","dropdownAutoWidth","containerCssClass","select2","jQuery","fn","undefined","each","this","not","num_options","find","length","hasClass","init_refresh_on_change","off","change","select_field","select_val","val","ref_on_change_vals","attr","split","last_selected_value","inArray","window","trigger","document","get","form","submit","click","confirm","_","Backbone","panels","require","extend","async_save_text","POPUPMENU","make_popupmenu","make_popup_menus","init_tag_click_function","TOURS","QUERY_STRING","ready","tooltip","placement","anchor","galaxy_main_exists","parent","frames","galaxy_main","href","indexOf","et","JSON","parse","sessionStorage","getItem","hooked_tour_from_data","steps","self","top","tour","Tour","tour_opts","init","restart"],"mappings":"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"}
|
||||
{"version":3,"file":"onload.js","sources":["../src/onload.js"],"names":["replace_big_select_inputs","min_length","max_length","select_elts","refresh_select2","element","select_elt","$","options","placeholder","closeOnSelect","is","dropdownAutoWidth","containerCssClass","select2","jQuery","fn","undefined","each","this","not","num_options","find","length","hasClass","init_refresh_on_change","off","change","select_field","select_val","val","ref_on_change_vals","attr","split","last_selected_value","inArray","window","trigger","document","get","form","submit","click","confirm","_","Backbone","panels","require","extend","async_save_text","POPUPMENU","make_popupmenu","make_popup_menus","toolform","init_tag_click_function","TOURS","QUERY_STRING","ready","tooltip","placement","anchor","galaxy_main_exists","parent","frames","galaxy_main","href","indexOf","et","JSON","parse","sessionStorage","getItem","hooked_tour_from_data","steps","self","top","tour","Tour","tour_opts","init","restart"],"mappings":"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"}
|
||||
@@ -0,0 +1,2 @@
|
||||
var jQuery=require("jquery"),$=jQuery,GalaxyApp=require("galaxy").GalaxyApp,QUERY_STRING=require("utils/query-string-parsing"),PANEL=require("layout/panel"),ToolPanel=require("./tool-panel"),HistoryPanel=require("./history-panel"),PAGE=require("layout/page"),ToolForm=require("mvc/tool/tool-form"),UserPreferences=require("mvc/user/user-preferences");Tours=require("mvc/tours"),window.app=function(a,b){window.Galaxy=new GalaxyApp(a,b),Galaxy.debug("analysis app");var c=a.config,d=new ToolPanel({el:"#left",userIsAnonymous:Galaxy.user.isAnonymous(),toolbox:c.toolbox,toolbox_in_panel:c.toolbox_in_panel,stored_workflow_menu_entries:c.stored_workflow_menu_entries,nginx_upload_path:c.nginx_upload_path,ftp_upload_site:c.ftp_upload_site,default_genome:c.default_genome,default_extension:c.default_extension}),e=new PANEL.CenterPanel({el:"#center"}),f=new HistoryPanel({el:"#right",galaxyRoot:Galaxy.root,userIsAnonymous:Galaxy.user.isAnonymous(),allow_user_dataset_purge:c.allow_user_dataset_purge}),g=new PAGE.PageLayoutView(_.extend(a,{el:"body",left:d,center:e,right:f}));Galaxy.page=g,Galaxy.params=Galaxy.config.params,Galaxy.toolPanel=d.tool_panel,Galaxy.upload=d.uploadButton,Galaxy.currHistoryPanel=f.historyView,Galaxy.currHistoryPanel.listenToGalaxy(Galaxy),Galaxy.app={display:function(a){$(".select2-hidden-accessible").remove(),e.display(a)}},Galaxy.router=new(Backbone.Router.extend({initialize:function(a){this.options=a},execute:function(a,b,c){Galaxy.debug("router execute:",a,b,c);var d=QUERY_STRING.parse(b.pop());b.push(d),a&&a.apply(this,b)},routes:{"(/)":"home","(/)root*":"home","(/)tours(/)(:tour_id)":"show_tours","(/)users(/)":"show_users"},show_tours:function(a){a?Tours.giveTour(a):e.display(new Tours.ToursView)},show_users:function(){e.display(new UserPreferences.View)},home:function(a){a.tool_id||a.job_id?"upload1"===a.tool_id?(Galaxy.upload.show(),this._loadCenterIframe("welcome")):this._loadToolForm(a):this._loadCenterIframe(a.workflow_id?"workflow/run?id="+a.workflow_id:a.m_c?a.m_c+"/"+a.m_a:"welcome")},_loadToolForm:function(a){a.id=a.tool_id,e.display(new ToolForm.View(a))},_loadCenterIframe:function(a,b){b=b||Galaxy.root,a=b+a,e.$("#galaxy_main").prop("src",a)}}))(a),$(function(){g.render(),g.right.historyView.loadCurrentHistory(),Galaxy.listenTo(g.right.historyView,"history-size-change",function(){Galaxy.user.fetch({url:Galaxy.user.urlRoot()+"/"+(Galaxy.user.id||"current")})}),g.right.historyView.connectToQuotaMeter(g.masthead.quotaMeter),Backbone.history.start({root:Galaxy.root,pushState:!0})})};
|
||||
//# sourceMappingURL=../maps/analysis.js.map
|
||||
@@ -0,0 +1,2 @@
|
||||
define(["utils/utils","layout/masthead","mvc/ui/ui-modal","mvc/ui/ui-modal","mvc/user/user-quotameter"],function(a,b,c,d){return Backbone.View.extend({initialize:function(a){Galaxy.app=this,Galaxy.modal=new c.View,Galaxy.masthead=new b.View(a),this.setElement(this._template(a)),this.$el.append(Galaxy.masthead.$el),$("body").append(this.$el),this.render()},render:function(){require(["app/analysis"],function(a){window.console.log(a)},function(a){console.debug(a)})},initialize2:function(e){this.options=a.merge(e,{}),this.params=this.options.params,this.setElement(this._template(e)),Galaxy.app=this,$("body").append(this.$el);var f=$(this.$el.parent()).attr("scroll","no").addClass("full-content");this.options.message_box_visible&&(f.addClass("has-message-box"),this.$("#messagebox").show()),this.options.show_inactivity_warning&&(f.addClass("has-inactivity-box"),this.$("#inactivebox").show()),Galaxy.masthead||(Galaxy.masthead=new b.View(e),Galaxy.modal=new c.View,Galaxy.menu=new Menu.GalaxyMenu({masthead:Galaxy.masthead,config:e}),Galaxy.quotaMeter=new d.UserQuotaMeter({model:Galaxy.user,el:Galaxy.masthead.$(".quota-meter-container")}).render())},display:function(a,b){$(".select2-hidden-accessible").remove(),this.panels&&this.panels[b||"center"].display(a)},_buildPanels:function(b,c){this.panels=[];var d=["left","center","right"];for(var e in d){var f=d[e],g=this.panels[f]=new b[f](c);if("center"==f)this.$("#center").append(g.$el);else{var h=a.merge(g.components,{header:{title:"",cls:"",buttons:[]},body:{cls:""}}),i=$(this._templatePanel(f));i.find(".panel-header-text").html(h.header.title),i.find(".unified-panel-header-inner").addClass(h.header.cls);for(var e in h.header.buttons)i.find(".panel-header-buttons").append(h.header.buttons[e].$el);i.find(".unified-panel-body").addClass(h.body.cls).append(g.$el);{new Panel({center:this.$("#center"),panel:i,drag:i.find(".unified-panel-footer > .drag"),toggle:i.find(".unified-panel-footer > .panel-collapse"),right:"right"==f})}this.$el.append(i)}}},_templatePanel:function(a){return'<div id="'+a+'"><div class="unified-panel-header" unselectable="on"><div class="unified-panel-header-inner"><div class="panel-header-buttons" style="float: right"/><div class="panel-header-text"/></div></div><div class="unified-panel-body"/><div class="unified-panel-footer"><div class="panel-collapse '+a+'"/><div class="drag"/></div></div>'},_template:function(){return'<div id="everything" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"><div id="background"/><div id="messagebox" class="panel-'+Galaxy.config.message_box_class+'-message" style="display: none;">'+Galaxy.config.message_box_content+'</div><div id="inactivebox" class="panel-warning-message" style="display: none;">'+Galaxy.config.inactivity_box_content+' <a href="'+Galaxy.root+'user/resend_verification">Resend verification.</a></div><div id="center" class="inbound"/></div>'}})});
|
||||
//# sourceMappingURL=../maps/app.js.map
|
||||
@@ -0,0 +1,2 @@
|
||||
define([],function(){Backbone.View.extend({initialize:function(a){this.options=Utils.merge(a,{}),this.setElement(this._template());var b=this.options.params;this.$("#galaxy_main").prop("src",Galaxy.root+(b.tool_id&&"tool_runner?"+$.param(b)||b.workflow_id&&"workflow/run?id="+b.workflow_id||b.m_c&&b.m_c+"/"+b.m_a||Galaxy.config.require_login&&!Galaxy.user.id&&"user/login"||"root/welcome"));var c=this;this.$("#galaxy_main").on("load",function(){$(this).show(),c.$("#center-panel").empty().hide()})},display:function(a){this.$("#galaxy_main").hide(),this.$("#center-panel").empty().scrollTop(0).append(a).show()},_template:function(){return'<div style="position: absolute; width: 100%; height: 100%"><iframe name="galaxy_main" id="galaxy_main" frameborder="0" style="position: absolute; width: 100%; height: 100%;"/><div id="center-panel" style="position: absolute; width: 100%; height: 100%; padding: 10px; overflow: auto;"/></div>'}}),Backbone.View.extend({initialize:function(a){if(this.options=Utils.merge(a,{}),this.setElement(this._template()),Galaxy.user.id||!Galaxy.config.require_login){var b=new Tools.ToolSearch({spinner_url:a.spinner_url,search_url:a.search_url,hidden:!1}),c=new Tools.ToolCollection(a.toolbox),d=new Tools.ToolPanel({tool_search:b,tools:c,layout:a.toolbox_in_panel});tool_panel_view=new Tools.ToolPanelView({model:d}),Galaxy.toolPanel=d,d.get("layout").size()>0&&(tool_panel_view.render(),this.$(".toolMenu").show()),this.$el.prepend(tool_panel_view.$el),this.$("#internal-workflows").append(this._templateTool({title:"All workflows",href:"workflow/list_for_run"}));for(var e in a.stored_workflow_menu_entries){var f=a.stored_workflow_menu_entries[e];this.$("#internal-workflows").append(this._templateTool({title:f.stored_workflow.name,href:"workflow/run?id="+f.encoded_stored_workflow_id}))}this.$("a[minsizehint]").click(function(){parent.handle_minwidth_hint&&parent.handle_minwidth_hint($(this).attr("minsizehint"))}),Galaxy.upload=new Upload(a),this.components={header:{title:"Tools",buttons:[Galaxy.upload]}}}},_templateTool:function(a){return'<div class="toolTitle"><a href="'+Galaxy.root+a.href+'" target="galaxy_main">'+a.title+"</a></div>"},_template:function(){return'<div class="toolMenuContainer"><div class="toolMenu" style="display: none"><div id="search-no-results" style="display: none; padding-top: 5px"><em><strong>Search did not match any tools.</strong></em></div></div><div class="toolSectionPad"/><div class="toolSectionPad"/><div class="toolSectionTitle" id="title_XXinternalXXworkflow"><span>Workflows</span></div><div id="internal-workflows" class="toolSectionBody"><div class="toolSectionBg"/></div></div>'}}),Backbone.View.extend({initialize:function(a){this.options=Utils.merge(a,{}),this.setElement(this._template());var b=new Ui.ButtonLink({id:"history-refresh-button",title:"Refresh history",cls:"panel-header-button",icon:"fa fa-refresh",onclick:function(){top.Galaxy&&top.Galaxy.currHistoryPanel&&top.Galaxy.currHistoryPanel.loadCurrentHistory()}}),c=new Ui.ButtonLink({id:"history-options-button",title:"History options",cls:"panel-header-button",target:"galaxy_main",icon:"fa fa-cog",href:Galaxy.root+"root/history_options"}),d=new Ui.ButtonLink({id:"history-view-multi-button",title:"View all histories",cls:"panel-header-button",icon:"fa fa-columns",href:Galaxy.root+"history/view_multiple"});this.components={header:{title:"History",cls:"history-panel-header",buttons:[b,c,d]},body:{cls:"unified-panel-body-background"}},Galaxy.historyOptionsMenu=optionsMenu(c.$el,{anonymous:Galaxy.user.id&&"true"||"false",purgeAllowed:Galaxy.config.allow_user_dataset_purge&&"true"||"false",root:Galaxy.root}),Galaxy.currHistoryPanel=new HistoryPanel.CurrentHistoryPanel({el:this.$el,purgeAllowed:Galaxy.config.allow_user_dataset_purge,linkTarget:"galaxy_main",$scrollContainer:function(){return this.$el.parent()}}),Galaxy.currHistoryPanel.connectToQuotaMeter(Galaxy.quotaMeter),Galaxy.currHistoryPanel.listenToGalaxy(Galaxy),Galaxy.currHistoryPanel.loadCurrentHistory()},_template:function(){return'<div id="current-history-panel" class="history-panel"/>'}});return{left:Backbone.View.extend({initialize:function(){}})}});
|
||||
//# sourceMappingURL=../../maps/app/analysis.js.map
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,2 +1,2 @@
|
||||
webpackJsonp([4],[function(e,r,n){(function(e){var r=n(1),a=r,i=n(57).GalaxyApp,o=n(10),t=n(5),l=n(59);window.app=function(n,c){window.Galaxy=new i(n,c),Galaxy.debug("login app");var d=encodeURI(n.redirect);if(!n.show_welcome_with_login){var w=r.param({use_panels:"True",redirect:d});return void(window.location.href=Galaxy.root+"user/login?"+w)}var p=new l.PageLayoutView(e.extend(n,{el:"body",center:new o.CenterPanel({el:"#center"}),right:new o.RightPanel({title:t("Login required"),el:"#right"})}));a(function(){var e=r.param({redirect:d}),a=Galaxy.root+"user/login?"+e;p.render(),p.center.$("#galaxy_main").prop("src",n.welcome_url),p.right.$(".unified-panel-body").css("overflow","hidden").html('<iframe src="'+a+'" frameborder="0" style="width: 100%; height: 100%;"/>')})}}).call(r,n(2))}]);
|
||||
webpackJsonp([4],[function(e,r,n){(function(e){var r=n(1),a=r,i=n(36).GalaxyApp,o=n(9),t=n(4),l=n(38);window.app=function(n,c){window.Galaxy=new i(n,c),Galaxy.debug("login app");var d=encodeURI(n.redirect);if(!n.show_welcome_with_login){var w=r.param({use_panels:"True",redirect:d});return void(window.location.href=Galaxy.root+"user/login?"+w)}var p=new l.PageLayoutView(e.extend(n,{el:"body",center:new o.CenterPanel({el:"#center"}),right:new o.RightPanel({title:t("Login required"),el:"#right"})}));a(function(){var e=r.param({redirect:d}),a=Galaxy.root+"user/login?"+e;p.render(),p.center.$("#galaxy_main").prop("src",n.welcome_url),p.right.$(".unified-panel-body").css("overflow","hidden").html('<iframe src="'+a+'" frameborder="0" style="width: 100%; height: 100%;"/>')})}}).call(r,n(2))}]);
|
||||
//# sourceMappingURL=login.bundled.js.map
|
||||
File diff suppressed because one or more lines are too long
@@ -1,2 +1,2 @@
|
||||
define(["mvc/dataset/dataset-li","mvc/base-mvc","utils/localization"],function(a,b,c){"use strict";var d=a.DatasetListItemView,e=d.extend({className:d.prototype.className+" history-content",initialize:function(a,b){d.prototype.initialize.call(this,a,b)},toString:function(){var a=this.model?this.model+"":"(no model)";return"HDAListItemView("+a+")"}});return e.prototype.templates=function(){var a=b.wrapTemplate(['<div class="title-bar clear" tabindex="0">','<span class="state-icon"></span>','<div class="title">','<span class="hid"><%- dataset.hid %></span> ','<span class="name"><%- dataset.name %></span>',"</div>","</div>"],"dataset"),e=_.extend({},d.prototype.templates.warnings,{hidden:b.wrapTemplate(["<% if( !dataset.visible ){ %>",'<div class="hidden-msg warningmessagesmall">',c("This dataset has been hidden"),"</div>","<% } %>"],"dataset")});return _.extend({},d.prototype.templates,{titleBar:a,warnings:e})}(),{HDAListItemView:e}});
|
||||
define(["mvc/dataset/dataset-li","mvc/base-mvc","utils/localization"],function(a,b,c){"use strict";var d=a.DatasetListItemView,e=d.extend({className:d.prototype.className+" history-content",initialize:function(a,b){d.prototype.initialize.call(this,a,b)},toString:function(){var a=this.model?this.model+"":"(no model)";return"HDAListItemView("+a+")"}});return e.prototype.templates=function(){var a=b.wrapTemplate(['<div class="title-bar clear" tabindex="0">','<span class="state-icon"></span>','<div class="title">','<span class="hid"><%- dataset.hid %></span> ','<span class="name"><%- dataset.name %></span>',"</div>","</br>",'<span class="nametags">',"<% _.each(dataset.nametags, function(tag){ %>",'<span class="label label-info"><%- tag %></span>',"<% }); %>","</span>","</div>"],"dataset"),e=_.extend({},d.prototype.templates.warnings,{hidden:b.wrapTemplate(["<% if( !dataset.visible ){ %>",'<div class="hidden-msg warningmessagesmall">',c("This dataset has been hidden"),"</div>","<% } %>"],"dataset")});return _.extend({},d.prototype.templates,{titleBar:a,warnings:e})}(),{HDAListItemView:e}});
|
||||
//# sourceMappingURL=../../../maps/mvc/history/hda-li.js.map
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,2 +1,2 @@
|
||||
define(["utils/utils"],function(a){return Backbone.View.extend({initialize:function(b){var c=this;this.options=a.merge(b,{class_add:"upload-icon-button fa fa-square-o",class_remove:"upload-icon-button fa fa-check-square-o",class_partial:"upload-icon-button fa fa-minus-square-o",collection:null,onchange:function(){},onadd:function(){},onremove:function(){}}),this.collection=this.options.collection,this.setElement(this._template()),this.rows=[],a.get({url:Galaxy.root+"api/remote_files",success:function(a){c._fill(a)},error:function(){c._fill()}})},_fill:function(b){if(b&&b.length>0){this.$(".upload-ftp-content").html($(this._templateTable()));var c=0;for(index in b)this.rows.push(this._add(b[index])),c+=b[index].size;if(this.$(".upload-ftp-number").html(b.length+" files"),this.$(".upload-ftp-disk").html(a.bytesToString(c,!0)),this.collection){var d=this;this.$("._has_collection").show(),this.$select_all=this.$(".upload-selectall").addClass(this.options.class_add),this.$select_all.on("click",function(){var a=d.$select_all.hasClass(d.options.class_add);for(index in b){var c=b[index],e=d._find(c);(!e&&a||e&&!a)&&d.rows[index].trigger("click")}}),this._refresh()}}else this.$(".upload-ftp-content").html($(this._templateInfo()));this.$(".upload-ftp-wait").hide()},_add:function(a){var b=this,c=$(this._templateRow(a)),d=c.find(".icon");return this.$("tbody").append(c),this.collection?(d.addClass(this._find(a)?this.options.class_remove:this.options.class_add),c.on("click",function(){var c=b._find(a);d.removeClass(),c?(b.options.onremove(c),d.addClass(b.options.class_add)):(b.options.onadd(a),d.addClass(b.options.class_remove)),b._refresh()})):c.on("click",function(){b.options.onchange(a)}),c},_refresh:function(){var a=this.collection.where({file_mode:"ftp",enabled:!0});this.$select_all.removeClass(),this.$select_all.addClass(0==a.length?this.options.class_add:a.length==this.rows.length?this.options.class_remove:this.options.class_partial)},_find:function(a){var b=this.collection.findWhere({file_path:a.path,file_mode:"ftp",enabled:!0});return b&&b.get("id")},_templateRow:function(b){return'<tr class="upload-ftp-row"><td class="_has_collection" style="display: none;"><div class="icon"/></td><td class="ftp-name">'+b.path+'</td><td class="ftp-size">'+a.bytesToString(b.size)+'</td><td class="ftp-time">'+b.ctime+"</td></tr>"},_templateTable:function(){return'<span style="whitespace: nowrap; float: left;">Available files: </span><span style="whitespace: nowrap; float: right;"><span class="upload-icon fa fa-file-text-o"/><span class="upload-ftp-number"/> <span class="upload-icon fa fa-hdd-o"/><span class="upload-ftp-disk"/></span><table class="grid" style="float: left;"><thead><tr><th class="_has_collection" style="display: none;"><div class="upload-selectall"></th><th>Name</th><th>Size</th><th>Created</th></tr></thead><tbody/></table>'},_templateInfo:function(){return'<div class="upload-ftp-warning warningmessage">Your FTP directory does not contain any files.</div>'},_template:function(){return'<div class="upload-ftp"><div class="upload-ftp-wait fa fa-spinner fa-spin"/><div class="upload-ftp-help">This Galaxy server allows you to upload files via FTP. To upload some files, log in to the FTP server at <strong>'+this.options.ftp_upload_site+'</strong> using your Galaxy credentials (email address and password).</div><div class="upload-ftp-content"/><div>'}})});
|
||||
define(["utils/utils"],function(a){return Backbone.View.extend({initialize:function(b){var c=this;this.options=a.merge(b,{class_add:"upload-icon-button fa fa-square-o",class_remove:"upload-icon-button fa fa-check-square-o",class_partial:"upload-icon-button fa fa-minus-square-o",collection:null,onchange:function(){},onadd:function(){},onremove:function(){}}),this.collection=this.options.collection,this.setElement(this._template()),this.rows=[],a.get({url:Galaxy.root+"api/remote_files",success:function(a){c._fill(a)},error:function(){c._fill()}})},_fill:function(b){if(b&&b.length>0){this.$(".upload-ftp-content").html($(this._templateTable()));var c=0;for(index in b)this.rows.push(this._add(b[index])),c+=b[index].size;if(this.$(".upload-ftp-number").html(b.length+" files"),this.$(".upload-ftp-disk").html(a.bytesToString(c,!0)),this.collection){var d=this;this.$("._has_collection").show(),this.$select_all=this.$(".upload-selectall").addClass(this.options.class_add),this.$select_all.on("click",function(){var a=d.$select_all.hasClass(d.options.class_add);for(index in b){var c=b[index],e=d._find(c);(!e&&a||e&&!a)&&d.rows[index].trigger("click")}}),this._refresh()}}else this.$(".upload-ftp-content").html($(this._templateInfo()));this.$(".upload-ftp-wait").hide()},_add:function(a){var b=this,c=$(this._templateRow(a)),d=c.find(".icon");return this.$("tbody").append(c),this.collection?(d.addClass(this._find(a)?this.options.class_remove:this.options.class_add),c.on("click",function(){var c=b._find(a);d.removeClass(),c?(b.options.onremove(c),d.addClass(b.options.class_add)):(b.options.onadd(a),d.addClass(b.options.class_remove)),b._refresh()})):c.on("click",function(){b.options.onchange(a)}),c},_refresh:function(){var a=this.collection.where({file_mode:"ftp",enabled:!0});this.$select_all.removeClass(),this.$select_all.addClass(0==a.length?this.options.class_add:a.length==this.rows.length?this.options.class_remove:this.options.class_partial)},_find:function(a){var b=this.collection.findWhere({file_path:a.path,file_mode:"ftp",enabled:!0});return b&&b.get("id")},_templateRow:function(b){return'<tr class="upload-ftp-row"><td class="_has_collection" style="display: none;"><div class="icon"/></td><td class="ftp-name">'+_.escape(b.path)+'</td><td class="ftp-size">'+a.bytesToString(b.size)+'</td><td class="ftp-time">'+b.ctime+"</td></tr>"},_templateTable:function(){return'<span style="whitespace: nowrap; float: left;">Available files: </span><span style="whitespace: nowrap; float: right;"><span class="upload-icon fa fa-file-text-o"/><span class="upload-ftp-number"/> <span class="upload-icon fa fa-hdd-o"/><span class="upload-ftp-disk"/></span><table class="grid" style="float: left;"><thead><tr><th class="_has_collection" style="display: none;"><div class="upload-selectall"></th><th>Name</th><th>Size</th><th>Created</th></tr></thead><tbody/></table>'},_templateInfo:function(){return'<div class="upload-ftp-warning warningmessage">Your FTP directory does not contain any files.</div>'},_template:function(){return'<div class="upload-ftp"><div class="upload-ftp-wait fa fa-spinner fa-spin"/><div class="upload-ftp-help">This Galaxy server allows you to upload files via FTP. To upload some files, log in to the FTP server at <strong>'+this.options.ftp_upload_site+'</strong> using your Galaxy credentials (email address and password).</div><div class="upload-ftp-content"/><div>'}})});
|
||||
//# sourceMappingURL=../../../maps/mvc/upload/upload-ftp.js.map
|
||||
@@ -1,2 +1,2 @@
|
||||
function replace_big_select_inputs(a,b,c){function d(a){var b=$(a),c={placeholder:"Click to select",closeOnSelect:!b.is("[MULTIPLE]"),dropdownAutoWidth:!0,containerCssClass:"select2-minwidth"};return a.select2(c)}jQuery.fn.select2&&(void 0===a&&(a=20),void 0===b&&(b=3e3),c=c||$("select"),c.each(function(){var c=$(this).not("[multiple]"),e=c.find("option").length;a>e||e>b||c.hasClass("no-autocomplete")||d(c)}))}function init_refresh_on_change(){$("select[refresh_on_change='true']").off("change").change(function(){var a=$(this),b=a.val(),c=a.attr("refresh_on_change_values");if(c){c=c.split(",");var d=a.attr("last_selected_value");if(-1===$.inArray(b,c)&&-1===$.inArray(d,c))return}$(window).trigger("refresh_on_change"),$(document).trigger("convert_to_values"),a.get(0).form.submit()}),$(":checkbox[refresh_on_change='true']").off("click").click(function(){var a=$(this),b=a.val(),c=a.attr("refresh_on_change_values");if(c){c=c.split(",");var d=a.attr("last_selected_value");if(-1===$.inArray(b,c)&&-1===$.inArray(d,c))return}$(window).trigger("refresh_on_change"),a.get(0).form.submit()}),$("a[confirm]").off("click").click(function(){return confirm($(this).attr("confirm"))})}window.jQuery=jQuery,window.$=jQuery,window._=_,window.Backbone=Backbone,window.panels=require("layout/panel"),_.extend(window,require("layout/modal")),window.async_save_text=require("utils/async-save-text");var POPUPMENU=require("ui/popupmenu");window.make_popupmenu=POPUPMENU.make_popupmenu,window.make_popup_menus=POPUPMENU.make_popup_menus,window.init_tag_click_function=require("ui/autocom_tagging");var TOURS=require("mvc/tours"),QUERY_STRING=require("utils/query-string-parsing");window.init_refresh_on_change=init_refresh_on_change,$(document).ready(function(){init_refresh_on_change(),$.fn.tooltip&&($(".unified-panel-header [title]").tooltip({placement:"bottom"}),$("[title]").tooltip()),make_popup_menus(),replace_big_select_inputs(20,1500),$("a").click(function(){var a=$(this),b=parent.frames&&parent.frames.galaxy_main;if("galaxy_main"==a.attr("target")&&!b){var c=a.attr("href");c+=-1==c.indexOf("?")?"?":"&",c+="use_panels=True",a.attr("href",c),a.attr("target","_self")}return a});var a=JSON.parse(sessionStorage.getItem("activeGalaxyTour"));if(a&&(a=TOURS.hooked_tour_from_data(a),a&&a.steps&&window&&window.self===window.top)){var b=new Tour(_.extend({steps:a.steps},TOURS.tour_opts));b.init(),b.restart()}});
|
||||
function replace_big_select_inputs(a,b,c){function d(a){var b=$(a),c={placeholder:"Click to select",closeOnSelect:!b.is("[MULTIPLE]"),dropdownAutoWidth:!0,containerCssClass:"select2-minwidth"};return a.select2(c)}jQuery.fn.select2&&(void 0===a&&(a=20),void 0===b&&(b=3e3),c=c||$("select"),c.each(function(){var c=$(this).not("[multiple]"),e=c.find("option").length;a>e||e>b||c.hasClass("no-autocomplete")||d(c)}))}function init_refresh_on_change(){$("select[refresh_on_change='true']").off("change").change(function(){var a=$(this),b=a.val(),c=a.attr("refresh_on_change_values");if(c){c=c.split(",");var d=a.attr("last_selected_value");if(-1===$.inArray(b,c)&&-1===$.inArray(d,c))return}$(window).trigger("refresh_on_change"),$(document).trigger("convert_to_values"),a.get(0).form.submit()}),$(":checkbox[refresh_on_change='true']").off("click").click(function(){var a=$(this),b=a.val(),c=a.attr("refresh_on_change_values");if(c){c=c.split(",");var d=a.attr("last_selected_value");if(-1===$.inArray(b,c)&&-1===$.inArray(d,c))return}$(window).trigger("refresh_on_change"),a.get(0).form.submit()}),$("a[confirm]").off("click").click(function(){return confirm($(this).attr("confirm"))})}window.jQuery=jQuery,window.$=jQuery,window._=_,window.Backbone=Backbone,window.panels=require("layout/panel"),_.extend(window,require("layout/modal")),window.async_save_text=require("utils/async-save-text");var POPUPMENU=require("ui/popupmenu");window.make_popupmenu=POPUPMENU.make_popupmenu,window.make_popup_menus=POPUPMENU.make_popup_menus,window.toolform=require("mvc/tool/tool-form"),window.init_tag_click_function=require("ui/autocom_tagging");var TOURS=require("mvc/tours"),QUERY_STRING=require("utils/query-string-parsing");window.init_refresh_on_change=init_refresh_on_change,$(document).ready(function(){init_refresh_on_change(),$.fn.tooltip&&($(".unified-panel-header [title]").tooltip({placement:"bottom"}),$("[title]").tooltip()),make_popup_menus(),replace_big_select_inputs(20,1500),$("a").click(function(){var a=$(this),b=parent.frames&&parent.frames.galaxy_main;if("galaxy_main"==a.attr("target")&&!b){var c=a.attr("href");c+=-1==c.indexOf("?")?"?":"&",c+="use_panels=True",a.attr("href",c),a.attr("target","_self")}return a});var a=JSON.parse(sessionStorage.getItem("activeGalaxyTour"));if(a&&(a=TOURS.hooked_tour_from_data(a),a&&a.steps&&window&&window.self===window.top)){var b=new Tour(_.extend({steps:a.steps},TOURS.tour_opts));b.init(),b.restart()}});
|
||||
//# sourceMappingURL=../maps/onload.js.map
|
||||
File diff suppressed because one or more lines are too long
@@ -78,6 +78,7 @@
|
||||
<div class="toolTitle"><a href="${h.url_for( controller='admin', action='review_tool_migration_stages' )}" target="galaxy_main">Review tool migration stages</a></div>
|
||||
<div class="toolTitle"><a href="${h.url_for( controller='admin', action='tool_errors' )}" target="galaxy_main">View Tool Error Logs</a></div>
|
||||
<div class="toolTitle"><a href="${h.url_for( controller='admin', action='sanitize_whitelist' )}" target="galaxy_main">Manage Display Whitelist</a></div>
|
||||
<div class="toolTitle"><a href="${h.url_for( controller='admin', action='manage_tool_dependencies' )}" target="galaxy_main">Manage Tool Dependencies</a></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="toolSectionPad"></div>
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/webapps/tool_shed/repository/common.mako" import="render_dependency_status"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
<%def name="render_tool_dependencies( requirements_status, ctr=False, ncols_extra=4, show_environment_path=False )">
|
||||
%for i, dependency in enumerate(requirements_status):
|
||||
%if i != 0:
|
||||
</tr>
|
||||
%if ctr % 2 == 1:
|
||||
<tr class="odd_row">
|
||||
%else:
|
||||
<tr class="tr">
|
||||
%endif
|
||||
%for i in range(ncols_extra-1):
|
||||
<td></td>
|
||||
%endfor
|
||||
%endif
|
||||
%if show_environment_path:
|
||||
<td>${dependency.get('environment_path', '') | h}</td>
|
||||
%endif
|
||||
${render_dependency_status(dependency)}
|
||||
%endfor
|
||||
</%def>
|
||||
|
||||
<%def name="render_tool_centric_table( tools, requirements_status)">
|
||||
<tr>
|
||||
<th bgcolor="#D8D8D8">Install</th>
|
||||
<th bgcolor="#D8D8D8">Name</th>
|
||||
<th bgcolor="#D8D8D8">ID</th>
|
||||
<th bgcolor="#D8D8D8">Requirement</th>
|
||||
<th bgcolor="#D8D8D8">Version</th>
|
||||
<th bgcolor="#D8D8D8">Resolver</th>
|
||||
<th bgcolor="#D8D8D8">Exact</th>
|
||||
<th bgcolor="#D8D8D8"></th>
|
||||
</tr>
|
||||
<% ctr = 0 %>
|
||||
%for tool in tools.values():
|
||||
%if tool.tool_requirements:
|
||||
%if ctr % 2 == 1:
|
||||
<tr class="odd_row">
|
||||
%else:
|
||||
<tr class="tr">
|
||||
%endif
|
||||
<td>
|
||||
<input type="checkbox" name="install_for_tools" value="${tool.id}"/>
|
||||
</td>
|
||||
<td>${ tool.name | h }</td>
|
||||
<td>${ tool.id | h }</td>
|
||||
${render_tool_dependencies( requirements_status[tool.tool_requirements], ctr=ctr) }
|
||||
</tr>
|
||||
<% ctr += 1 %>
|
||||
%endif
|
||||
%endfor
|
||||
</%def>
|
||||
|
||||
<%def name="render_dependencies_details( tools, requirements_status, tool_ids_by_requirements)">
|
||||
<tr>
|
||||
<th bgcolor="#D8D8D8">Install</th>
|
||||
<th bgcolor="#D8D8D8">Used by</th>
|
||||
<th bgcolor="#D8D8D8">Environment Path</th>
|
||||
<th bgcolor="#D8D8D8">Requirement</th>
|
||||
<th bgcolor="#D8D8D8">Version</th>
|
||||
<th bgcolor="#D8D8D8">Resolver</th>
|
||||
<th bgcolor="#D8D8D8">Exact</th>
|
||||
<th bgcolor="#D8D8D8"></th>
|
||||
</tr>
|
||||
<% ctr = 0 %>
|
||||
%for requirements, r_status in requirements_status.items():
|
||||
%if requirements:
|
||||
<% tool_ids = tool_ids_by_requirements[requirements] %>
|
||||
%if ctr % 2 == 1:
|
||||
<tr class="odd_row">
|
||||
%else:
|
||||
<tr class="tr">
|
||||
%endif
|
||||
<td>
|
||||
<input type="checkbox" name="install_for_tools" value="${tool_ids[0]}"/>
|
||||
</td>
|
||||
<td>${ ", ".join([tools[tid].name for tid in tool_ids]) | h }</td>
|
||||
${render_tool_dependencies( r_status, ctr=ctr, show_environment_path=True, ncols_extra=3) }
|
||||
</tr>
|
||||
%endif
|
||||
<% ctr += 1 %>
|
||||
%endfor
|
||||
</%def>
|
||||
|
||||
%if message:
|
||||
${render_msg( message, status )}
|
||||
%endif
|
||||
|
||||
<h2>Manage Tool Dependencies</h2>
|
||||
<p>This page gives an overview of all tool dependencies required by all tools currently loaded, including tools not installed through the Tool Shed.</p>
|
||||
|
||||
<form name="manage_tool_dependencies" action="${h.url_for( controller='admin', action='manage_tool_dependencies' )}">
|
||||
%if viewkey == "Switch to tool-centric view":
|
||||
<input type="submit" name="viewkey" value="Switch to details view"/>
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Tool-centric dependencies</div>
|
||||
<div class="toolFormBody">
|
||||
<table class="manage-table colored" border="0" cellspacing="0" cellpadding="0" width="100%">
|
||||
${render_tool_centric_table(tools, requirements_status)}
|
||||
%else:
|
||||
<input type="submit" name="viewkey" value="Switch to tool-centric view"/>
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Dependency details</div>
|
||||
<div class="toolFormBody">
|
||||
<table class="manage-table colored" border="0" cellspacing="0" cellpadding="0" width="100%">
|
||||
${render_dependencies_details(tools, requirements_status, tool_ids_by_requirements)}
|
||||
%endif
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<input type="submit" name="install_dependencies" value="Install checked dependencies using Conda"/>
|
||||
</form>
|
||||
@@ -1026,6 +1026,38 @@
|
||||
%>
|
||||
</%def>
|
||||
|
||||
<%def name="render_dependency_status( dependency, prepare_for_install=False)">
|
||||
<td>${dependency['name'] | h}</td>
|
||||
<td>${dependency['version'] | h}</td>
|
||||
%if not prepare_for_install:
|
||||
%if dependency['dependency_type']:
|
||||
<td>${dependency['dependency_type'].title() | h}</td>
|
||||
%else:
|
||||
<td>${dependency['dependency_type'] | h}</td>
|
||||
%endif
|
||||
<td>${dependency['exact'] | h}</td>
|
||||
%endif
|
||||
%if dependency['dependency_type'] == None:
|
||||
<td>
|
||||
<img src="${h.url_for('/static')}/images/icon_error_sml.gif" title='Dependency not resolved'/>
|
||||
%if prepare_for_install:
|
||||
Not Installed
|
||||
%endif
|
||||
</td>
|
||||
%elif not dependency['exact']:
|
||||
<td>
|
||||
<img src="${h.url_for('/static')}/images/icon_warning_sml.gif" title='Dependency resolved, but version ${dependency['version']} not found'/>
|
||||
</td>
|
||||
%else:
|
||||
<td>
|
||||
<img src="${h.url_for('/static')}/june_2007_style/blue/ok_small.png"/>
|
||||
%if prepare_for_install:
|
||||
Installed through ${dependency['dependency_type'].title() | h}
|
||||
%endif
|
||||
</td>
|
||||
%endif
|
||||
</%def>
|
||||
|
||||
<%def name="render_tool_dependency_resolver( requirements_status, prepare_for_install=False )">
|
||||
<tr class="datasetRow">
|
||||
<td style="padding-left: 20 px;">
|
||||
@@ -1043,37 +1075,8 @@
|
||||
</head>
|
||||
<body>
|
||||
%for dependency in requirements_status:
|
||||
${render_dependency_status(dependency, prepare_for_install)}
|
||||
<tr>
|
||||
<td>${dependency['name'] | h}</td>
|
||||
<td>${dependency['version'] | h}</td>
|
||||
%if not prepare_for_install:
|
||||
%if dependency['dependency_type']:
|
||||
<td>${dependency['dependency_type'].title() | h}</td>
|
||||
%else:
|
||||
<td>${dependency['dependency_type'] | h}</td>
|
||||
%endif
|
||||
<td>${dependency['exact'] | h}</td>
|
||||
%endif
|
||||
%if dependency['dependency_type'] == None:
|
||||
<td>
|
||||
<img src="${h.url_for('/static')}/images/icon_error_sml.gif" title='Dependency not resolved'/>
|
||||
%if prepare_for_install:
|
||||
Not Installed
|
||||
%endif
|
||||
</td>
|
||||
%elif not dependency['exact']:
|
||||
<td>
|
||||
<img src="${h.url_for('/static')}/images/icon_warning_sml.gif" title='Dependency resolved, but version ${dependency['version']} not found'/>
|
||||
</td>
|
||||
%else:
|
||||
<td>
|
||||
<img src="${h.url_for('/static')}/june_2007_style/blue/ok_small.png"/>
|
||||
%if prepare_for_install:
|
||||
Installed through ${dependency['dependency_type'].title() | h}
|
||||
%endif
|
||||
</td>
|
||||
%endif
|
||||
</tr>
|
||||
%endfor
|
||||
</body>
|
||||
</table>
|
||||
|
||||
+2
-3
@@ -2,6 +2,5 @@ Galaxy Testing
|
||||
==============
|
||||
|
||||
The Galaxy code base is large and contains many kinds of tests. Please
|
||||
consult the [Galaxy
|
||||
wiki](http://wiki.galaxyproject.org/Admin/Running%20Tests) for more
|
||||
information on testing Galaxy.
|
||||
run the command ``sh run_tests.sh --help`` from Galaxy's root for a
|
||||
description of each test type and location.
|
||||
|
||||
@@ -1005,9 +1005,7 @@ steps:
|
||||
assert invocation[ 'state' ] != 'scheduled'
|
||||
|
||||
self.__review_paused_steps( uploaded_workflow_id, invocation_id, order_index=4, action=True )
|
||||
|
||||
time.sleep( 5 )
|
||||
self.dataset_populator.wait_for_history( history_id, assert_ok=True )
|
||||
self.wait_for_invocation_and_jobs( history_id, uploaded_workflow_id, invocation_id )
|
||||
invocation = self._invocation_details( uploaded_workflow_id, invocation_id )
|
||||
assert invocation[ 'state' ] == 'scheduled'
|
||||
self.assertEqual("reviewed\n1\nreviewed\n4\n", self.dataset_populator.get_history_dataset_content( history_id ) )
|
||||
|
||||
@@ -6,6 +6,7 @@ attribute.
|
||||
|
||||
from selenium.webdriver.common.action_chains import ActionChains
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.common.exceptions import TimeoutException
|
||||
from selenium.webdriver.common.keys import Keys
|
||||
from selenium.webdriver.support import expected_conditions as ec
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
@@ -14,6 +15,7 @@ UNSPECIFIED_TIMEOUT = object()
|
||||
|
||||
|
||||
class HasDriver:
|
||||
TimeoutException = TimeoutException
|
||||
|
||||
def assert_xpath(self, xpath):
|
||||
assert self.driver.find_element_by_xpath(xpath)
|
||||
@@ -30,36 +32,66 @@ class HasDriver:
|
||||
assert len(self.driver.find_elements_by_css_selector(selector)) == 0
|
||||
|
||||
def wait_for_xpath(self, xpath):
|
||||
wait = self.wait()
|
||||
element = wait.until(ec.presence_of_element_located((By.XPATH, xpath)))
|
||||
element = self._wait_on(
|
||||
ec.presence_of_element_located((By.XPATH, xpath)),
|
||||
"XPATH selector [%s] to become present" % xpath,
|
||||
)
|
||||
return element
|
||||
|
||||
def wait_for_xpath_visible(self, xpath):
|
||||
wait = self.wait()
|
||||
element = wait.until(ec.visibility_of_element_located((By.XPATH, xpath)))
|
||||
element = self._wait_on(
|
||||
ec.visibility_of_element_located((By.XPATH, xpath)),
|
||||
"XPATH selector [%s] to become visible" % xpath,
|
||||
)
|
||||
return element
|
||||
|
||||
def wait_for_selector(self, selector):
|
||||
wait = self.wait()
|
||||
element = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, selector)))
|
||||
element = self._wait_on(
|
||||
ec.presence_of_element_located((By.CSS_SELECTOR, selector)),
|
||||
"CSS selector [%s] to become present" % selector,
|
||||
)
|
||||
return element
|
||||
|
||||
def wait_for_selector_visible(self, selector):
|
||||
wait = self.wait()
|
||||
return wait.until(ec.visibility_of_element_located((By.CSS_SELECTOR, selector)))
|
||||
element = self._wait_on(
|
||||
ec.visibility_of_element_located((By.CSS_SELECTOR, selector)),
|
||||
"CSS selector [%s] to become visible" % selector,
|
||||
)
|
||||
return element
|
||||
|
||||
def wait_for_selector_clickable(self, selector):
|
||||
element = self._wait_on(
|
||||
ec.element_to_be_clickable((By.CSS_SELECTOR, selector)),
|
||||
"CSS selector [%s] to become clickable" % selector,
|
||||
)
|
||||
return element
|
||||
|
||||
def wait_for_selector_absent_or_hidden(self, selector):
|
||||
wait = self.wait()
|
||||
return wait.until(ec.invisibility_of_element_located((By.CSS_SELECTOR, selector)))
|
||||
element = self._wait_on(
|
||||
ec.invisibility_of_element_located((By.CSS_SELECTOR, selector)),
|
||||
"CSS selector [%s] to become absent or hidden" % selector,
|
||||
)
|
||||
return element
|
||||
|
||||
def wait_for_selector_absent(self, selector):
|
||||
wait = self.wait()
|
||||
return wait.until(lambda driver: len(driver.find_elements_by_css_selector(selector)) == 0)
|
||||
element = self._wait_on(
|
||||
lambda driver: len(driver.find_elements_by_css_selector(selector)) == 0,
|
||||
"CSS selector [%s] to become absent" % selector,
|
||||
)
|
||||
return element
|
||||
|
||||
def wait_for_id(self, id):
|
||||
return self._wait_on(
|
||||
ec.presence_of_element_located((By.ID, id)),
|
||||
"presence of DOM ID [%s]" % id,
|
||||
)
|
||||
|
||||
def _wait_on(self, condition, on_str=None):
|
||||
if on_str is None:
|
||||
on_str = str(condition)
|
||||
message = "Timeout waiting on %s." % on_str
|
||||
wait = self.wait()
|
||||
element = wait.until(ec.presence_of_element_located((By.ID, id)))
|
||||
return element
|
||||
return wait.until(condition, message)
|
||||
|
||||
def action_chains(self):
|
||||
return ActionChains(self.driver)
|
||||
@@ -95,3 +127,10 @@ class HasDriver:
|
||||
def click_submit(self, form):
|
||||
submit_button = form.find_element_by_css_selector("input[type='submit']")
|
||||
submit_button.click()
|
||||
|
||||
def prepend_timeout_message(self, timeout_exception, message):
|
||||
return TimeoutException(
|
||||
msg=message + (timeout_exception.msg or ''),
|
||||
screen=timeout_exception.screen,
|
||||
stacktrace=timeout_exception.stacktrace,
|
||||
)
|
||||
|
||||
@@ -107,7 +107,10 @@ class NavigatesGalaxy(HasDriver):
|
||||
assert final_state == "ok", final_state
|
||||
return final_state
|
||||
|
||||
def history_panel_wait_for_hid_ok(self, hid, timeout=30):
|
||||
def history_panel_wait_for_hid_ok(self, hid, timeout=60):
|
||||
self.history_panel_wait_for_hid_state(hid, 'ok', timeout=timeout)
|
||||
|
||||
def history_panel_wait_for_hid_state(self, hid, state, timeout=60):
|
||||
current_history_id = self.current_history_id()
|
||||
|
||||
def history_has_hid(driver):
|
||||
@@ -117,8 +120,21 @@ class NavigatesGalaxy(HasDriver):
|
||||
self.wait(timeout).until(history_has_hid)
|
||||
contents = self.api_get("histories/%s/contents" % current_history_id)
|
||||
history_item = [d for d in contents if d["hid"] == hid][0]
|
||||
history_item_selector_okay = "#%s-%s.state-ok" % (history_item["history_content_type"], history_item["id"])
|
||||
self.wait_for_selector_visible(history_item_selector_okay)
|
||||
history_item_selector = "#%s-%s" % (history_item["history_content_type"], history_item["id"])
|
||||
self.wait_for_selector_visible(history_item_selector)
|
||||
history_item_selector_state = "%s.state-%s" % (history_item_selector, state)
|
||||
try:
|
||||
self.wait_for_selector_visible(history_item_selector_state)
|
||||
except self.TimeoutException as e:
|
||||
history_item = self.driver.find_element_by_css_selector(history_item_selector)
|
||||
current_state = "UNKNOWN"
|
||||
classes = history_item.get_attribute("class").split(" ")
|
||||
for clazz in classes:
|
||||
if clazz.startswith("state-"):
|
||||
current_state = clazz[len("state-"):]
|
||||
template = "Failed waiting on history item %d state to change to [%s] current state [%s]. "
|
||||
message = template % (hid, state, current_state)
|
||||
raise self.prepend_timeout_message(e, message)
|
||||
|
||||
def get_logged_in_user(self):
|
||||
return self.api_get("users/current")
|
||||
@@ -301,6 +317,31 @@ class NavigatesGalaxy(HasDriver):
|
||||
menu_selector = self.test_data["historyOptions"]["selectors"]["menu"]
|
||||
return menu_selector
|
||||
|
||||
def history_panel_multi_operations_selector(self):
|
||||
return self.test_data["historyPanel"]["selectors"]["history"]["multiOperationsIcon"]
|
||||
|
||||
def history_panel_multi_operations_show(self):
|
||||
operations_selector = self.history_panel_multi_operations_selector()
|
||||
operations_element = self.wait_for_selector_clickable(operations_selector)
|
||||
operations_element.click()
|
||||
|
||||
def history_panel_muli_operation_select_hid(self, hid):
|
||||
item_selector = self.history_panel_item_selector(hid, wait=True)
|
||||
operation_radio_selector = "%s .selector" % item_selector
|
||||
element = self.wait_for_selector_clickable(operation_radio_selector)
|
||||
element.click()
|
||||
|
||||
def history_panel_multi_operation_action_selector(self):
|
||||
return self.test_data["historyPanel"]["selectors"]["history"]["multiOperationsActionBtn"]
|
||||
|
||||
def history_panel_multi_operation_action_click(self, action):
|
||||
time.sleep(5)
|
||||
button_element = self.wait_for_selector_clickable(self.history_panel_multi_operation_action_selector())
|
||||
button_element.click()
|
||||
menu_element = self.wait_for_selector_visible(".list-action-menu.open")
|
||||
action_element = menu_element.find_element_by_link_text(action)
|
||||
action_element.click()
|
||||
|
||||
def history_panel_item_selector(self, hid, wait=False):
|
||||
current_history_id = self.current_history_id()
|
||||
contents = self.api_get("histories/%s/contents" % current_history_id)
|
||||
|
||||
@@ -107,6 +107,8 @@ historyPanel:
|
||||
nameEditableTextInput : '.name input'
|
||||
subtitle : '.subtitle'
|
||||
size : '.history-size'
|
||||
multiOperationsIcon: '.actions .show-selectors-btn'
|
||||
multiOperationsActionBtn: '.list-action-menu .list-action-menu-btn'
|
||||
tagIcon : '.actions .history-tag-btn'
|
||||
tagArea : '.controls .tags-display'
|
||||
annoIcon : '.actions .history-annotate-btn'
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
from .framework import SeleniumTestCase
|
||||
from .framework import selenium_test
|
||||
|
||||
|
||||
class CollectionBuildersTestCase(SeleniumTestCase):
|
||||
|
||||
ensure_registered = True
|
||||
|
||||
@selenium_test
|
||||
def test_build_list_simple(self):
|
||||
self.perform_upload(self.get_filename("1.fasta"))
|
||||
self.history_panel_wait_for_hid_ok(1)
|
||||
self.history_panel_multi_operations_show()
|
||||
self.history_panel_muli_operation_select_hid(1)
|
||||
self.history_panel_multi_operation_action_click("Build Dataset List")
|
||||
|
||||
name_element = self.wait_for_selector_visible("input.collection-name")
|
||||
name_element.send_keys("my cool list")
|
||||
|
||||
create_element = self.wait_for_selector_clickable("button.create-collection")
|
||||
create_element.click()
|
||||
self.history_panel_wait_for_hid_ok(2)
|
||||
|
||||
@selenium_test
|
||||
def test_build_pair_simple(self):
|
||||
self.perform_upload(self.get_filename("1.tabular"))
|
||||
self.perform_upload(self.get_filename("2.tabular"))
|
||||
self.history_panel_wait_for_hid_ok(1)
|
||||
self.history_panel_wait_for_hid_ok(2)
|
||||
self.history_panel_multi_operations_show()
|
||||
self.history_panel_muli_operation_select_hid(1)
|
||||
self.history_panel_muli_operation_select_hid(2)
|
||||
self.history_panel_multi_operation_action_click("Build Dataset Pair")
|
||||
name_element = self.wait_for_selector_visible("input.collection-name")
|
||||
name_element.send_keys("my awesome pair")
|
||||
|
||||
create_element = self.wait_for_selector_clickable("button.create-collection")
|
||||
create_element.click()
|
||||
self.history_panel_wait_for_hid_ok(3)
|
||||
@@ -204,11 +204,11 @@ class MockHistoryDatasetAssociation( object ):
|
||||
)
|
||||
self.dbkey = "hg19"
|
||||
self.implicitly_converted_parent_datasets = False
|
||||
|
||||
self.name = name
|
||||
self.hid = id
|
||||
self.id = id
|
||||
self.children = []
|
||||
self.tags = []
|
||||
|
||||
@property
|
||||
def state( self ):
|
||||
|
||||
Reference in New Issue
Block a user