taverna-player 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +18 -0
- data/Gemfile +18 -0
- data/LICENCE.rdoc +29 -0
- data/README.rdoc +663 -0
- data/Rakefile +65 -0
- data/app/assets/javascripts/taverna_player/application.js +14 -0
- data/app/assets/javascripts/taverna_player/runs.js +42 -0
- data/app/assets/stylesheets/scaffold.css +56 -0
- data/app/assets/stylesheets/taverna_player/application.css +13 -0
- data/app/assets/stylesheets/taverna_player/coderay.css +120 -0
- data/app/controllers/taverna_player/application_controller.rb +16 -0
- data/app/controllers/taverna_player/runs_controller.rb +18 -0
- data/app/controllers/taverna_player/service_credentials_controller.rb +18 -0
- data/app/helpers/taverna_player/application_helper.rb +55 -0
- data/app/helpers/taverna_player/runs_helper.rb +84 -0
- data/app/models/taverna_player/interaction.rb +25 -0
- data/app/models/taverna_player/run.rb +117 -0
- data/app/models/taverna_player/run_port.rb +148 -0
- data/app/models/taverna_player/service_credential.rb +56 -0
- data/app/views/layouts/taverna_player/embedded.html.erb +27 -0
- data/app/views/taverna_player/runs/_button.html.erb +19 -0
- data/app/views/taverna_player/runs/_info.html.erb +56 -0
- data/app/views/taverna_player/runs/_info.json.jbuilder +2 -0
- data/app/views/taverna_player/runs/_inputs.html.erb +34 -0
- data/app/views/taverna_player/runs/_inputs.json.jbuilder +8 -0
- data/app/views/taverna_player/runs/_interaction.html.erb +68 -0
- data/app/views/taverna_player/runs/_outputs.html.erb +41 -0
- data/app/views/taverna_player/runs/_poll.html.erb +27 -0
- data/app/views/taverna_player/runs/create.json.jbuilder +3 -0
- data/app/views/taverna_player/runs/embedded/_button.html.erb +19 -0
- data/app/views/taverna_player/runs/embedded/_info.html.erb +25 -0
- data/app/views/taverna_player/runs/embedded/_inputs.html.erb +32 -0
- data/app/views/taverna_player/runs/embedded/_outputs.html.erb +32 -0
- data/app/views/taverna_player/runs/embedded/new.html.erb +58 -0
- data/app/views/taverna_player/runs/embedded/show.html.erb +39 -0
- data/app/views/taverna_player/runs/embedded/show.js.erb +35 -0
- data/app/views/taverna_player/runs/index.html.erb +40 -0
- data/app/views/taverna_player/runs/index.json.jbuilder +1 -0
- data/app/views/taverna_player/runs/new.html.erb +56 -0
- data/app/views/taverna_player/runs/new.json.jbuilder +1 -0
- data/app/views/taverna_player/runs/show.html.erb +29 -0
- data/app/views/taverna_player/runs/show.js.erb +25 -0
- data/app/views/taverna_player/runs/show.json.jbuilder +25 -0
- data/app/views/taverna_player/service_credentials/_form.html.erb +53 -0
- data/app/views/taverna_player/service_credentials/edit.html.erb +18 -0
- data/app/views/taverna_player/service_credentials/index.html.erb +41 -0
- data/app/views/taverna_player/service_credentials/new.html.erb +17 -0
- data/app/views/taverna_player/service_credentials/show.html.erb +36 -0
- data/config/routes.rb +34 -0
- data/db/migrate/20130313105546_create_taverna_player_runs.rb +16 -0
- data/db/migrate/20130315163019_create_taverna_player_run_ports.rb +15 -0
- data/db/migrate/20130318170744_add_attachment_file_to_taverna_player_run_ports.rb +6 -0
- data/db/migrate/20130319183634_create_delayed_jobs.rb +22 -0
- data/db/migrate/20130320102600_add_status_message_to_taverna_player_runs.rb +5 -0
- data/db/migrate/20130321100110_add_depth_and_metadata_to_taverna_player_run_ports.rb +6 -0
- data/db/migrate/20130704095504_add_attachment_results_to_taverna_player_runs.rb +5 -0
- data/db/migrate/20130705142704_add_embedded_to_taverna_player_runs.rb +5 -0
- data/db/migrate/20130714140911_create_taverna_player_interactions.rb +13 -0
- data/db/migrate/20130717083653_add_proxy_to_taverna_player_runs.rb +6 -0
- data/db/migrate/20130717155415_add_stop_to_taverna_player_runs.rb +5 -0
- data/db/migrate/20130811152840_add_attachment_log_to_taverna_player_runs.rb +5 -0
- data/db/migrate/20130811211725_change_taverna_player_runs_state_column.rb +5 -0
- data/db/migrate/20130812155839_add_name_to_taverna_player_runs.rb +5 -0
- data/db/migrate/20130918135348_create_taverna_player_service_credentials.rb +15 -0
- data/db/migrate/20130919154200_add_displayed_to_taverna_player_interactions.rb +5 -0
- data/db/migrate/20131007153209_add_job_ref_to_taverna_player_runs.rb +13 -0
- data/db/migrate/20131010094537_add_reply_caching_to_taverna_player_interactions.rb +19 -0
- data/db/migrate/20131017141514_add_failure_message_to_taverna_player_run.rb +5 -0
- data/db/migrate/20131018152940_add_serial_number_to_taverna_player_interactions.rb +5 -0
- data/db/migrate/20131018160715_add_parent_run_id_to_taverna_player_runs.rb +5 -0
- data/db/migrate/20131102113933_add_page_uri_to_taverna_player_interaction.rb +5 -0
- data/db/migrate/20131105115218_remove_proxy_from_taverna_player_runs.rb +11 -0
- data/db/migrate/20131105141934_change_taverna_player_interactions_output_value_column_name.rb +5 -0
- data/db/migrate/20131112165520_add_user_to_taverna_player_run.rb +5 -0
- data/lib/generators/taverna_player/callbacks_generator.rb +25 -0
- data/lib/generators/taverna_player/controllers_generator.rb +30 -0
- data/lib/generators/taverna_player/install_generator.rb +30 -0
- data/lib/generators/taverna_player/job_generator.rb +26 -0
- data/lib/generators/taverna_player/models_generator.rb +27 -0
- data/lib/generators/taverna_player/renderers_generator.rb +26 -0
- data/lib/generators/taverna_player/views_generator.rb +27 -0
- data/lib/generators/templates/ReadMe.txt +118 -0
- data/lib/generators/templates/callbacks/render_callbacks.rb +56 -0
- data/lib/generators/templates/callbacks/worker_callbacks.rb +31 -0
- data/lib/generators/templates/controllers/runs_controller.rb +20 -0
- data/lib/generators/templates/controllers/service_credentials_controller.rb +20 -0
- data/lib/generators/templates/initializer.rb +154 -0
- data/lib/generators/templates/models/run.rb +20 -0
- data/lib/tasks/delete-cancelled-runs.rake +26 -0
- data/lib/tasks/delete-old-embedded-runs.rake +26 -0
- data/lib/taverna-player.rb +139 -0
- data/lib/taverna_player/concerns/controllers/runs_controller.rb +281 -0
- data/lib/taverna_player/concerns/controllers/service_credentials_controller.rb +89 -0
- data/lib/taverna_player/concerns/models/run.rb +205 -0
- data/lib/taverna_player/engine.rb +23 -0
- data/lib/taverna_player/model_proxy.rb +51 -0
- data/lib/taverna_player/output_renderer.rb +96 -0
- data/lib/taverna_player/render_callbacks.rb +41 -0
- data/lib/taverna_player/version.rb +15 -0
- data/lib/taverna_player/worker.rb +325 -0
- data/script/delayed_job +5 -0
- data/script/rails +8 -0
- data/taverna_player.gemspec +46 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +16 -0
- data/test/dummy/app/assets/stylesheets/application.css +14 -0
- data/test/dummy/app/controllers/application_controller.rb +15 -0
- data/test/dummy/app/controllers/home_controller.rb +16 -0
- data/test/dummy/app/controllers/taverna_player/runs_controller.rb +25 -0
- data/test/dummy/app/controllers/taverna_player/service_credentials_controller.rb +25 -0
- data/test/dummy/app/controllers/workflows_controller.rb +17 -0
- data/test/dummy/app/models/user.rb +15 -0
- data/test/dummy/app/models/workflow.rb +32 -0
- data/test/dummy/app/views/home/index.html.erb +18 -0
- data/test/dummy/app/views/layouts/application.html.erb +43 -0
- data/test/dummy/app/views/workflows/index.html.erb +35 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +58 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/taverna_player.example.rb +40 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +22 -0
- data/test/dummy/db/migrate/20130314103555_create_workflows.rb +12 -0
- data/test/dummy/db/migrate/20130318141557_create_taverna_player_runs.taverna_player.rb +17 -0
- data/test/dummy/db/migrate/20130318141558_create_taverna_player_run_ports.taverna_player.rb +16 -0
- data/test/dummy/db/migrate/20130318173013_add_attachment_file_to_taverna_player_run_ports.taverna_player.rb +7 -0
- data/test/dummy/db/migrate/20130319183816_create_delayed_jobs.taverna_player.rb +23 -0
- data/test/dummy/db/migrate/20130320102635_add_status_message_to_taverna_player_runs.taverna_player.rb +6 -0
- data/test/dummy/db/migrate/20130321161859_add_depth_and_metadata_to_taverna_player_run_ports.taverna_player.rb +7 -0
- data/test/dummy/db/migrate/20130704100146_add_attachment_results_to_taverna_player_runs.taverna_player.rb +6 -0
- data/test/dummy/db/migrate/20130705142816_add_embedded_to_taverna_player_runs.taverna_player.rb +6 -0
- data/test/dummy/db/migrate/20130714142144_create_taverna_player_interactions.taverna_player.rb +14 -0
- data/test/dummy/db/migrate/20130717084809_add_proxy_to_taverna_player_runs.taverna_player.rb +7 -0
- data/test/dummy/db/migrate/20130718102707_add_stop_to_taverna_player_runs.taverna_player.rb +6 -0
- data/test/dummy/db/migrate/20130811204449_add_attachment_log_to_taverna_player_runs.taverna_player.rb +6 -0
- data/test/dummy/db/migrate/20130811212709_change_taverna_player_runs_state_column.taverna_player.rb +6 -0
- data/test/dummy/db/migrate/20130812161152_add_name_to_taverna_player_runs.taverna_player.rb +6 -0
- data/test/dummy/db/migrate/20130918155525_create_taverna_player_service_credentials.taverna_player.rb +16 -0
- data/test/dummy/db/migrate/20130919155202_add_displayed_to_taverna_player_interactions.taverna_player.rb +6 -0
- data/test/dummy/db/migrate/20131007153659_add_job_ref_to_taverna_player_runs.taverna_player.rb +14 -0
- data/test/dummy/db/migrate/20131016123941_add_reply_caching_to_taverna_player_interactions.taverna_player.rb +20 -0
- data/test/dummy/db/migrate/20131017141614_add_failure_message_to_taverna_player_run.taverna_player.rb +6 -0
- data/test/dummy/db/migrate/20131018153316_add_serial_number_to_taverna_player_interactions.taverna_player.rb +6 -0
- data/test/dummy/db/migrate/20131018164614_add_parent_run_id_to_taverna_player_runs.taverna_player.rb +6 -0
- data/test/dummy/db/migrate/20131102114343_add_page_uri_to_taverna_player_interaction.taverna_player.rb +6 -0
- data/test/dummy/db/migrate/20131105115724_remove_proxy_from_taverna_player_runs.taverna_player.rb +12 -0
- data/test/dummy/db/migrate/20131105142417_change_taverna_player_interactions_output_value_column_name.taverna_player.rb +6 -0
- data/test/dummy/db/migrate/20131112165815_add_user_to_taverna_player_run.taverna_player.rb +6 -0
- data/test/dummy/db/migrate/20131114130937_create_users.rb +10 -0
- data/test/dummy/db/schema.rb +123 -0
- data/test/dummy/lib/callbacks.rb +35 -0
- data/test/dummy/log/.gitkeep +0 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/delayed_job +5 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/test/functional/home_controller_test.rb +28 -0
- data/test/dummy/test/functional/workflows_controller_test.rb +21 -0
- data/test/fixtures/files/crassostrea_gigas.csv +737 -0
- data/test/fixtures/taverna_player/interactions.yml +32 -0
- data/test/fixtures/taverna_player/run_ports.yml +54 -0
- data/test/fixtures/taverna_player/runs.yml +69 -0
- data/test/fixtures/taverna_player/service_credentials.yml +25 -0
- data/test/fixtures/users.yml +16 -0
- data/test/fixtures/workflows.yml +32 -0
- data/test/functional/taverna_player/runs_controller_test.rb +316 -0
- data/test/functional/taverna_player/service_credentials_controller_test.rb +99 -0
- data/test/taverna_player_test.rb +25 -0
- data/test/test_helper.rb +33 -0
- data/test/unit/helpers/taverna_player/application_helper_test.rb +70 -0
- data/test/unit/helpers/taverna_player/runs_helper_test.rb +45 -0
- data/test/unit/taverna_player/interaction_test.rb +47 -0
- data/test/unit/taverna_player/run_port_test.rb +309 -0
- data/test/unit/taverna_player/run_test.rb +196 -0
- data/test/unit/taverna_player/service_credential_test.rb +64 -0
- data/test/workflows/hello.t2flow +164 -0
- data/test/workflows/list_with_errors.t2flow +107 -0
- data/test/workflows/pass_through.t2flow +12 -0
- metadata +539 -0
data/.gitignore
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
Gemfile.lock
|
|
2
|
+
.bundle/
|
|
3
|
+
log/*.log
|
|
4
|
+
pkg/
|
|
5
|
+
test/dummy/db/*.sqlite3
|
|
6
|
+
test/dummy/log/*.log
|
|
7
|
+
test/dummy/tmp/
|
|
8
|
+
test/dummy/.sass-cache
|
|
9
|
+
test/dummy/public/system/
|
|
10
|
+
test/dummy/config/initializers/taverna_player.rb
|
|
11
|
+
|
|
12
|
+
*~
|
|
13
|
+
rdoc/
|
|
14
|
+
.buildpath
|
|
15
|
+
.project
|
|
16
|
+
.settings
|
|
17
|
+
.idea
|
|
18
|
+
.rvmrc
|
data/Gemfile
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
source "https://rubygems.org"
|
|
2
|
+
|
|
3
|
+
# Declare your gem's dependencies in taverna_player.gemspec.
|
|
4
|
+
# Bundler will treat runtime dependencies like base dependencies, and
|
|
5
|
+
# development dependencies will be added by default to the :development group.
|
|
6
|
+
gemspec
|
|
7
|
+
|
|
8
|
+
# These gems are used by the dummy application
|
|
9
|
+
gem "jquery-rails"
|
|
10
|
+
gem "taverna-t2flow", "~> 0.4.5"
|
|
11
|
+
|
|
12
|
+
# Declare any dependencies that are still in development here instead of in
|
|
13
|
+
# your gemspec. These might include edge Rails or gems from your path or
|
|
14
|
+
# Git. Remember to move these dependencies to your gemspec before releasing
|
|
15
|
+
# your gem to rubygems.org.
|
|
16
|
+
|
|
17
|
+
# To use debugger
|
|
18
|
+
# gem 'debugger'
|
data/LICENCE.rdoc
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
Copyright (c) 2013 The University of Manchester, UK.
|
|
2
|
+
|
|
3
|
+
All rights reserved.
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
* Redistributions of source code must retain the above copyright notice,
|
|
9
|
+
this list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
* Neither the names of The University of Manchester nor the names of its
|
|
16
|
+
contributors may be used to endorse or promote products derived from this
|
|
17
|
+
software without specific prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
22
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
23
|
+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
24
|
+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
25
|
+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
26
|
+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
27
|
+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
28
|
+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
29
|
+
POSSIBILITY OF SUCH DAMAGE.
|
data/README.rdoc
ADDED
|
@@ -0,0 +1,663 @@
|
|
|
1
|
+
= Taverna Player
|
|
2
|
+
|
|
3
|
+
Authors:: Robert Haines
|
|
4
|
+
Contact:: mailto:support@mygrid.org.uk
|
|
5
|
+
URL:: http://www.taverna.org.uk
|
|
6
|
+
Licence:: BSD (See LICENCE or http://www.opensource.org/licenses/bsd-license.php)
|
|
7
|
+
Copyright:: (c) 2013 The University of Manchester, UK
|
|
8
|
+
|
|
9
|
+
{<img src="https://codeclimate.com/github/myGrid/taverna-player.png" />}[https://codeclimate.com/github/myGrid/taverna-player]
|
|
10
|
+
|
|
11
|
+
== Synopsis
|
|
12
|
+
|
|
13
|
+
Taverna Player is a Ruby on Rails plugin to run Taverna workflows on a Taverna
|
|
14
|
+
Server.
|
|
15
|
+
|
|
16
|
+
Taverna Player handles all aspects of running a workflow including:
|
|
17
|
+
* Gathering inputs and upload to Taverna Server
|
|
18
|
+
* Monitoring the run
|
|
19
|
+
* Presenting workflow interactions to the user
|
|
20
|
+
* Gathering and download of workflow outputs
|
|
21
|
+
|
|
22
|
+
It, purposefully, does not:
|
|
23
|
+
* Manage workflows
|
|
24
|
+
* Manage users
|
|
25
|
+
|
|
26
|
+
== Getting started
|
|
27
|
+
|
|
28
|
+
These instructions assume that you are familiar with Rails and its concepts.
|
|
29
|
+
Also, knowledge of {Rails Engines}[http://guides.rubyonrails.org/engines.html]
|
|
30
|
+
and how they integrate with other Rails applications will be useful.
|
|
31
|
+
|
|
32
|
+
Taverna Player works with Rails 3.2. Add it to your Gemfile with:
|
|
33
|
+
gem "taverna-player"
|
|
34
|
+
|
|
35
|
+
And run the <tt>bundle install</tt> command to install it.
|
|
36
|
+
|
|
37
|
+
Next you need to run the install generator:
|
|
38
|
+
rails generate taverna_player:install
|
|
39
|
+
|
|
40
|
+
This installs an initializer (into your application's
|
|
41
|
+
<tt>config/initializers</tt> directory) which describes all of Taverna Player's
|
|
42
|
+
configuration options and there are some things that MUST be configured before
|
|
43
|
+
it will work - see below for more information. The install generator also
|
|
44
|
+
prints out a list of other steps for setting up Taverna Player; these are
|
|
45
|
+
repeated and detailed below.
|
|
46
|
+
|
|
47
|
+
== Running Taverna Player
|
|
48
|
+
|
|
49
|
+
Once you have Taverna Player installed and configured in your Rails application
|
|
50
|
+
it will largely take care of itself. The nature of Rails Engines is that they
|
|
51
|
+
become part of the containing application relatively seamlessly.
|
|
52
|
+
|
|
53
|
+
The only extra step required for full operation of Taverna Player is to start
|
|
54
|
+
the delayed_job script so that workflows are actually run. Even if you already
|
|
55
|
+
use delayed_job in your application it is worth checking this section because
|
|
56
|
+
Taverna Player uses its own named queue to run jobs.
|
|
57
|
+
|
|
58
|
+
=== In development
|
|
59
|
+
|
|
60
|
+
If you simply want to have a single worker running while testing then you can
|
|
61
|
+
use the rake task supplied by delayed_job:
|
|
62
|
+
|
|
63
|
+
rake jobs:work
|
|
64
|
+
|
|
65
|
+
=== In production
|
|
66
|
+
|
|
67
|
+
In production you will want to run lots of workers for maximum throughput. A
|
|
68
|
+
good starting number of concurrent workers will probably be the number of
|
|
69
|
+
workflows that your Taverna Server can run at the same time. Any lower than
|
|
70
|
+
this and you are not running Taverna Server at its configured capacity; any
|
|
71
|
+
higher and you just end up with workers waiting for Taverna Server to have
|
|
72
|
+
space for them anyway. You might pick up some efficiencies starting new
|
|
73
|
+
workflow runs while the results of those just finished are being collected but
|
|
74
|
+
it is probably not worth having more than one or two extra workers for this.
|
|
75
|
+
|
|
76
|
+
So if your Taverna Server can run 20 concurrent workflows at once then you
|
|
77
|
+
would start your workers like this:
|
|
78
|
+
|
|
79
|
+
RAILS_ENV=production bundle exec ./script/delayed_job -n 20 --queue=player start
|
|
80
|
+
|
|
81
|
+
See the documentation for {delayed_job}[https://rubygems.org/gems/delayed_job]
|
|
82
|
+
for more options and information.
|
|
83
|
+
|
|
84
|
+
== Hooking Taverna Player into your Rails application
|
|
85
|
+
|
|
86
|
+
Mount the Taverna Player engine in your <tt>config/routes.rb</tt>. For example:
|
|
87
|
+
|
|
88
|
+
mount TavernaPlayer::Engine, :at => "/"
|
|
89
|
+
|
|
90
|
+
You can also nest the Taverna Player runs resources within your workflows
|
|
91
|
+
resources if you wish, like this:
|
|
92
|
+
|
|
93
|
+
resources :workflows do
|
|
94
|
+
resources :runs, :controller => "TavernaPlayer::Runs", :except => :edit
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
The runs resources in Taverna Player do not provide an edit view by default
|
|
98
|
+
so, unless you add it yourself by overriding the controller you should add the
|
|
99
|
+
<tt>:except</tt> clause to the routes.
|
|
100
|
+
|
|
101
|
+
Perform Taverna Player's migrations:
|
|
102
|
+
|
|
103
|
+
rake taverna_player:install:migrations
|
|
104
|
+
rake db:migrate
|
|
105
|
+
|
|
106
|
+
Make sure you have defined root_url to something in your
|
|
107
|
+
<tt>config/routes.rb</tt>. For example:
|
|
108
|
+
|
|
109
|
+
root :to => "home#index"
|
|
110
|
+
|
|
111
|
+
Add Taverna Player's assets to your application's manifests.
|
|
112
|
+
|
|
113
|
+
In app/assets/javascripts/application.js:
|
|
114
|
+
|
|
115
|
+
//= require taverna_player/application
|
|
116
|
+
|
|
117
|
+
In app/assets/stylesheets/application.css
|
|
118
|
+
|
|
119
|
+
*= require taverna_player/application
|
|
120
|
+
|
|
121
|
+
And everything should be found by the asset pipeline automatically.
|
|
122
|
+
|
|
123
|
+
Make sure you have flash messages in your main layout
|
|
124
|
+
(usually <tt>app/views/layouts/application.html.erb</tt>). For example:
|
|
125
|
+
|
|
126
|
+
<p class="notice"><%= notice %></p>
|
|
127
|
+
<p class="alert"><%= alert %></p>
|
|
128
|
+
|
|
129
|
+
Taverna Player uses delayed_job to run workflows on a Taverna Server. If your
|
|
130
|
+
application is not already using delayed_job then you can install the
|
|
131
|
+
delayed_job script in your <tt>script</tt> directory with:
|
|
132
|
+
|
|
133
|
+
rails generate taverna_player:job
|
|
134
|
+
|
|
135
|
+
Taverna Player comes with some very simple, unstyled views and layouts. If you
|
|
136
|
+
wish to override these with your own customized views you can copy them into
|
|
137
|
+
your application with:
|
|
138
|
+
|
|
139
|
+
rails generate taverna_player:views
|
|
140
|
+
|
|
141
|
+
The views are copied to the <tt>app/views/taverna_player</tt> directory so that
|
|
142
|
+
they take precedence over the default ones. You can delete any that you do not
|
|
143
|
+
need to customize but there are no penalties for leaving them there. There is
|
|
144
|
+
more information on overriding views below.
|
|
145
|
+
|
|
146
|
+
If you need to override the Taverna Player controllers, to implement user
|
|
147
|
+
authorization for example, you can copy some customizable stubs with:
|
|
148
|
+
|
|
149
|
+
rails generate taverna_player:controllers
|
|
150
|
+
|
|
151
|
+
The stubs are copied to the <tt>app/controllers/taverna_player</tt> directory
|
|
152
|
+
so that they take precedence over the default ones. You can delete any that you
|
|
153
|
+
do not need to customize but there are no penalties for leaving them there.
|
|
154
|
+
There is more information on overriding controllers below.
|
|
155
|
+
|
|
156
|
+
If you need to override the Taverna Player Run model, to add columns to the
|
|
157
|
+
table for example, you can copy a customizable stub with:
|
|
158
|
+
|
|
159
|
+
rails generate taverna_player:models
|
|
160
|
+
|
|
161
|
+
The stub is copied to the <tt>app/models/taverna_player</tt> directory so that
|
|
162
|
+
it takes precedence over the default one. There is more information on
|
|
163
|
+
overriding models below.
|
|
164
|
+
|
|
165
|
+
If you want to use pre- and post-run callbacks you can setup some basic stubs
|
|
166
|
+
with:
|
|
167
|
+
|
|
168
|
+
rails generate taverna_player:callbacks
|
|
169
|
+
|
|
170
|
+
They will be saved to <tt>lib/taverna_player_callbacks.rb</tt>. Don't forget to
|
|
171
|
+
then require and register them in the Taverna Player initializer. There is more
|
|
172
|
+
information on callbacks below.
|
|
173
|
+
|
|
174
|
+
You can add to, or change, the workflow run outputs render methods to better
|
|
175
|
+
suit your particular application. To copy the defaults that Taverna Player
|
|
176
|
+
ships with into your application for customization run:
|
|
177
|
+
|
|
178
|
+
rails generate taverna_player:renderers
|
|
179
|
+
|
|
180
|
+
They will be saved to <tt>lib/taverna_player_renderers.rb</tt>. Don't forget to
|
|
181
|
+
then require and register them in the Taverna Player initializer. There is more
|
|
182
|
+
information on renderers below.
|
|
183
|
+
|
|
184
|
+
== Taverna Player initializer
|
|
185
|
+
|
|
186
|
+
The {default initializer}[https://github.com/myGrid/taverna-player/blob/master/lib/generators/templates/initializer.rb]
|
|
187
|
+
that is installed by the install generator requires minimal configuration for
|
|
188
|
+
simple set ups. It is fully commented with everything that needs to be set but
|
|
189
|
+
further explanations are given below.
|
|
190
|
+
|
|
191
|
+
=== Essential (required) configuration
|
|
192
|
+
|
|
193
|
+
Firstly, Taverna Player needs to know what the model is that represents
|
|
194
|
+
workflows within your application and it needs to know how to get a workflow
|
|
195
|
+
file out of that model so it can run it. If your workflow model is called
|
|
196
|
+
"Workflow" and the method to get the workflow filename from that model is
|
|
197
|
+
called "file_name" then the following will configure this correctly:
|
|
198
|
+
|
|
199
|
+
config.workflow_model_proxy("Workflow") do |proxy|
|
|
200
|
+
proxy.file_method_name = :file_name
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
Secondly, Taverna Player needs to know where your Taverna Server is and how to
|
|
204
|
+
authenticate to it:
|
|
205
|
+
|
|
206
|
+
config.server_address = "http://localhost:8080/taverna"
|
|
207
|
+
config.server_username = "taverna"
|
|
208
|
+
config.server_password = "taverna"
|
|
209
|
+
|
|
210
|
+
Make sure you do not commit this information into your repository!
|
|
211
|
+
|
|
212
|
+
This should usually be enough to get Taverna Player up and running within your
|
|
213
|
+
application but there are lots of other configuration options detailed below.
|
|
214
|
+
|
|
215
|
+
=== Optional configuration
|
|
216
|
+
|
|
217
|
+
==== Taverna Server
|
|
218
|
+
|
|
219
|
+
There are two settings to control how often Taverna Player communicates with
|
|
220
|
+
Taverna Server:
|
|
221
|
+
|
|
222
|
+
config.server_poll_interval = 5
|
|
223
|
+
config.server_retry_interval = 10
|
|
224
|
+
|
|
225
|
+
The first specifies, in seconds, how often <em>each run</em> is polled. Polling
|
|
226
|
+
is used to check a run's status (has it finished yet?) and check for
|
|
227
|
+
interactions. If you have long running workflows then it is probably worth
|
|
228
|
+
setting this value higher; If you have lots of interactions then keeping it low
|
|
229
|
+
is good to improve the responsiveness for users. Keep in mind that as polling
|
|
230
|
+
is for each run then setting this value very low will produce a lot of polling
|
|
231
|
+
requests when you have lots of running workflows.
|
|
232
|
+
|
|
233
|
+
The second specifies, in seconds, how long to wait before retrying an operation
|
|
234
|
+
that Taverna Server has rejected due to its current load. This can happen in
|
|
235
|
+
two places:
|
|
236
|
+
* Creating the run. Each Taverna Server has a limit (usually quite high) to
|
|
237
|
+
how many workflow runs it can support at a time - this is the entire set of
|
|
238
|
+
runs resident on the server in any state (initialized, running or finished).
|
|
239
|
+
If it is at this limit then it will refuse requests to create any more.
|
|
240
|
+
* Starting the run. Each Taverna Server also has a limit to how many workflow
|
|
241
|
+
runs it can have actually running at once - runs that are yet to start, or
|
|
242
|
+
that have finished do not count towards this total. If it is at this limit
|
|
243
|
+
then it will refuse requests to start any more.
|
|
244
|
+
Neither of these situations are fatal errors however, so Taverna Player will
|
|
245
|
+
back off for the specified time and then try again. It is worth tailoring this
|
|
246
|
+
number to the sort of workflows you will be running. For long-running,
|
|
247
|
+
batch-style workflows then it can be set quite high but if you have workflows
|
|
248
|
+
that make use of interactions (so you have users watching the workflows
|
|
249
|
+
running) then it should probably be set lower.
|
|
250
|
+
|
|
251
|
+
There are a number of options for configuring the connection to the Taverna
|
|
252
|
+
Server. These are actually provided by the underlying
|
|
253
|
+
{t2-server client library}[https://rubygems.org/gems/t2-server] and surfaced
|
|
254
|
+
here for extra control. They are
|
|
255
|
+
{documented in more detail}[http://mygrid.github.io/t2-server-gem/] elsewhere
|
|
256
|
+
but broadly fall into two categories: Security and timeouts.
|
|
257
|
+
|
|
258
|
+
The following are all concerned with connecting to a secure Taverna Server and
|
|
259
|
+
will be set to your Ruby/OS defaults if you leave them alone. If you use a
|
|
260
|
+
self-signed certificate for your server, or you require client certificate
|
|
261
|
+
authentication you will need to edit them appropriately.
|
|
262
|
+
|
|
263
|
+
config.server_connection[:verify_peer] = true
|
|
264
|
+
config.server_connection[:ca_file] = "/etc/certs/my-cert.crt"
|
|
265
|
+
config.server_connection[:ca_path] = "/etc/certs/"
|
|
266
|
+
config.server_connection[:client_certificate] = "client-cert.crt"
|
|
267
|
+
config.server_connection[:client_password] = "P@5$w0Rd!"
|
|
268
|
+
config.server_connection[:ssl_version] = :TLSv1
|
|
269
|
+
|
|
270
|
+
The following are timeout options and should be set with care. The underlying
|
|
271
|
+
operating system defaults (usually 300 seconds each) will be used if they are
|
|
272
|
+
not set explicitly.
|
|
273
|
+
|
|
274
|
+
config.server_connection[:open_timeout] = 300
|
|
275
|
+
config.server_connection[:read_timeout] = 300
|
|
276
|
+
|
|
277
|
+
==== Users
|
|
278
|
+
|
|
279
|
+
If your application has users then there is some basic support for that
|
|
280
|
+
out-of-the-box in Taverna Player. You can tell Taverna Player what your user
|
|
281
|
+
model is called with (example "User" here):
|
|
282
|
+
|
|
283
|
+
config.user_model_proxy = "User"
|
|
284
|
+
|
|
285
|
+
And you can tell it how to discover who your current user is by specifying a
|
|
286
|
+
callback. If you are using {Devise}[https://rubygems.org/gems/devise]
|
|
287
|
+
(recommended) for your authentication then you would supply the provided
|
|
288
|
+
"current_user" method like this:
|
|
289
|
+
|
|
290
|
+
config.current_user_callback = :current_user
|
|
291
|
+
|
|
292
|
+
With this set up then when a run is created Taverna Player will set the owner
|
|
293
|
+
of that run to be the current logged in user if there is one.
|
|
294
|
+
|
|
295
|
+
Note that this does not automatically mean that Taverna Player is checking that
|
|
296
|
+
users are authenticated! If you require this or if you have more complex
|
|
297
|
+
requirements then you will need to override the Run model and the Runs
|
|
298
|
+
controller. See below for more details.
|
|
299
|
+
|
|
300
|
+
==== Files
|
|
301
|
+
|
|
302
|
+
Taverna Player needs to store various files for each run's inputs and outputs.
|
|
303
|
+
The {paperclip}[https://rubygems.org/gems/paperclip] gem is used to provide
|
|
304
|
+
these facilities and the only configuration required is to specify where you
|
|
305
|
+
want it to store its files:
|
|
306
|
+
|
|
307
|
+
config.file_store = ":rails_root/public/system"
|
|
308
|
+
|
|
309
|
+
Use ":rails_root" for the root of your application, or specify a full path for
|
|
310
|
+
anywhere else.
|
|
311
|
+
|
|
312
|
+
==== Run callbacks and renderers
|
|
313
|
+
|
|
314
|
+
These are described in their own sections, below.
|
|
315
|
+
|
|
316
|
+
== Overriding the default views
|
|
317
|
+
|
|
318
|
+
If you use the generator, described above, to copy the views into your
|
|
319
|
+
application they will be used in preference to the default ones. This means
|
|
320
|
+
that any changes you make will be immediately reflected in the output of your
|
|
321
|
+
application. See the
|
|
322
|
+
{Rails documentation}[http://guides.rubyonrails.org/engines.html#overriding-views]
|
|
323
|
+
for more information on overriding views.
|
|
324
|
+
|
|
325
|
+
The supplied views provide a good example of how to maintain a current view of
|
|
326
|
+
the state of a run and handle any workflow interactions that may occur during
|
|
327
|
+
a run. It is worth understanding how they work before pulling them apart for
|
|
328
|
+
your own needs.
|
|
329
|
+
|
|
330
|
+
== Overriding the default models and controllers
|
|
331
|
+
|
|
332
|
+
You can override the following core components:
|
|
333
|
+
* Run (model)
|
|
334
|
+
* RunsController
|
|
335
|
+
* ServiceCredentialsController
|
|
336
|
+
|
|
337
|
+
Use the generators, detailed above, to create stubs for you to expand. These
|
|
338
|
+
components have been designed for overriding with the decorator pattern using
|
|
339
|
+
{ActiveSupport::Concern}[http://api.rubyonrails.org/classes/ActiveSupport/Concern.html].
|
|
340
|
+
This allows for things to be overridden but still have the same name (as is
|
|
341
|
+
required for such things within Rails). Please also see the information about
|
|
342
|
+
overriding models and controllers in the
|
|
343
|
+
{Rails documentation}[http://guides.rubyonrails.org/engines.html#overriding-models-and-controllers].
|
|
344
|
+
|
|
345
|
+
The vitally important thing is to preserve the +include+ statement within your
|
|
346
|
+
overriding code. For example, the RunsController stub looks like this:
|
|
347
|
+
|
|
348
|
+
module TavernaPlayer
|
|
349
|
+
class RunsController < TavernaPlayer::ApplicationController
|
|
350
|
+
# Do not remove the next line.
|
|
351
|
+
include TavernaPlayer::Concerns::Controllers::RunsController
|
|
352
|
+
|
|
353
|
+
# Extend the RunsController here.
|
|
354
|
+
end
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
You can add code both before and after the +include+ statement but anything
|
|
358
|
+
before it might be overridden by the original code itself if there are name
|
|
359
|
+
clashes.
|
|
360
|
+
|
|
361
|
+
If you wanted to add a before filter to authenticate your users you would add
|
|
362
|
+
that line before the +include+ statement, for example.
|
|
363
|
+
|
|
364
|
+
== Run callbacks
|
|
365
|
+
|
|
366
|
+
Taverna Player provides four points around a workflow run for you to specify
|
|
367
|
+
callbacks to be run:
|
|
368
|
+
* Pre-run: This is called directly before Taverna Server is contacted.
|
|
369
|
+
* Post-run: This is called after all operations on Taverna Server have been
|
|
370
|
+
completed when the run finishes normally.
|
|
371
|
+
* Run-cancelled: This is called after all operations on Taverna Server have
|
|
372
|
+
been completed when the run has been cancelled by the user.
|
|
373
|
+
* Run-failed: This is called after all operations on Taverna Server have been
|
|
374
|
+
completed when the run has failed.
|
|
375
|
+
|
|
376
|
+
Each of these callbacks is provided with the current run object as its
|
|
377
|
+
parameter and can be set in the initializer by providing the name of the method
|
|
378
|
+
(string or symbol) to run or a Proc object:
|
|
379
|
+
|
|
380
|
+
config.pre_run_callback = :player_pre_run_callback
|
|
381
|
+
config.post_run_callback = "player_post_run_callback"
|
|
382
|
+
config.run_cancelled_callback = Proc.new { |run| puts "Cancelled: #{run.name}" }
|
|
383
|
+
config.run_failed_callback = :player_run_failed_callback
|
|
384
|
+
|
|
385
|
+
*Important!* If your callback fails then the run itself will "fail". This may
|
|
386
|
+
or may not matter for the run-failed callback but if your pre-run callback
|
|
387
|
+
fails then the run will never get to Taverna Server! How can it? Your pre-run
|
|
388
|
+
callback may have been setting up vital resources for your run; Taverna Player
|
|
389
|
+
can not second-guess this so "fails" the run.
|
|
390
|
+
|
|
391
|
+
For this reason it is not recommended to put a lot of complex functionality
|
|
392
|
+
into the callbacks. An ideal use would be to gather statistics from the run
|
|
393
|
+
(average time, how many times a user runs it, etc) once it has finished.
|
|
394
|
+
|
|
395
|
+
An example callback that just prints out the run's name and workflow id would
|
|
396
|
+
be:
|
|
397
|
+
|
|
398
|
+
def player_run_callback(run)
|
|
399
|
+
w = Workflow.find(run.workflow_id)
|
|
400
|
+
puts "Callback called for run '#{run.name}' of workflow '#{w.id}'"
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
A set of example callbacks can be installed with the generator detailed above.
|
|
404
|
+
Don't forget to make sure any callback code is <tt>require</tt>d somewhere and
|
|
405
|
+
the callbacks themselves registered in the initializer.
|
|
406
|
+
|
|
407
|
+
== Rendering outputs
|
|
408
|
+
|
|
409
|
+
Workflows can produce results in many different formats and Taverna Player
|
|
410
|
+
tries to accomodate this as best it can. It provides basic facilities for
|
|
411
|
+
rendering as many result types as it can and these are extendible wherever
|
|
412
|
+
possible.
|
|
413
|
+
|
|
414
|
+
=== Output helper
|
|
415
|
+
|
|
416
|
+
A very basic output helper is provided, <tt>show_output</tt>, which can be
|
|
417
|
+
used in your views. This will format the output of each workflow output port in
|
|
418
|
+
a generic way. If it is a singleton output then it is displayed normally. If it
|
|
419
|
+
is a list output then the list is rendered as a HTML ordered list
|
|
420
|
+
(<tt><ol></tt>).
|
|
421
|
+
|
|
422
|
+
If you require anything more complex then you will have to override this helper
|
|
423
|
+
or provide your own and call it from your views.
|
|
424
|
+
|
|
425
|
+
=== Type renderers
|
|
426
|
+
|
|
427
|
+
Taverna Player has a system of specific type renderers to handle different
|
|
428
|
+
types of output. A number of defaults are supplied but these can be replaced
|
|
429
|
+
and added to if required.
|
|
430
|
+
|
|
431
|
+
To install a set of example renderers you can use the generator detailed above.
|
|
432
|
+
|
|
433
|
+
To register a renderer for use add it into the renderers block in the
|
|
434
|
+
initializer:
|
|
435
|
+
|
|
436
|
+
config.output_renderers do |renderers|
|
|
437
|
+
...
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
So to just register a single default renderer method (called
|
|
441
|
+
"my_default_renderer") you would do this:
|
|
442
|
+
|
|
443
|
+
config.output_renderers do |renderers|
|
|
444
|
+
renderers.default(:my_default_renderer)
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
And it would be used to render every type of output. A more sensible example
|
|
448
|
+
would be to have a renderer for PNG-type images and a renderer for text
|
|
449
|
+
outputs as well:
|
|
450
|
+
|
|
451
|
+
config.output_renderers do |renderers|
|
|
452
|
+
renderers.default(:my_default_renderer)
|
|
453
|
+
renderers.add("text/plain", :text_renderer, true)
|
|
454
|
+
renderers.add("image/png", :show_image)
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
This does three things:
|
|
458
|
+
* Registers a renderer for PNG images. This could be as simple as wrapping it
|
|
459
|
+
in an <tt><img ../></tt> tag.
|
|
460
|
+
* Registers a renderer for outputs of type "text/plain" and <em>sets this as
|
|
461
|
+
the default renderer for all other types beginning with "text"</em>. That is
|
|
462
|
+
what the final parameter set to +true+ does.
|
|
463
|
+
* Registers a default renderer for all other types. This should probably give
|
|
464
|
+
an explanation as to why the output cannot be shown in the browser with a
|
|
465
|
+
link to download the output to the user's computer.
|
|
466
|
+
|
|
467
|
+
Note the use of MIME types for specifying all types.
|
|
468
|
+
|
|
469
|
+
Obviously outputs such as images and text are so common that Taverna Player
|
|
470
|
+
provides these renderers for you and has them set up and registered by default.
|
|
471
|
+
You would only need to override them if you wanted extra information to be
|
|
472
|
+
displayed as well, such as sizes next to images, etc.
|
|
473
|
+
|
|
474
|
+
Note that it is not a good idea to register a single image renderer for all
|
|
475
|
+
"image" types as many cannot be shown in most browsers, e.g. TIFF images.
|
|
476
|
+
The default set of registered renderers is shown in the default initializer
|
|
477
|
+
but, as an example, here is how it handles the images that most browsers can
|
|
478
|
+
show:
|
|
479
|
+
|
|
480
|
+
renderers.add("image/jpeg", :show_image)
|
|
481
|
+
renderers.add("image/png", :show_image)
|
|
482
|
+
renderers.add("image/gif", :show_image)
|
|
483
|
+
renderers.add("image/bmp", :show_image)
|
|
484
|
+
|
|
485
|
+
Note that the same renderer callback is used for each one.
|
|
486
|
+
|
|
487
|
+
=== Writing your own renderers
|
|
488
|
+
|
|
489
|
+
To be a renderer callback a method must accept two parameters (in this order):
|
|
490
|
+
1. The content to be rendered.
|
|
491
|
+
1. The MIME type of the content.
|
|
492
|
+
|
|
493
|
+
In the case of text outputs the content will likely (depending on the output
|
|
494
|
+
helper you use, described above) be the entire text content of the output. In
|
|
495
|
+
most other cases it will probably be a URI or path to the actual content for
|
|
496
|
+
use in, for example, an <tt><img .../></tt> tag.
|
|
497
|
+
|
|
498
|
+
The type is provided in case a renderer wishes to be general and differentiate
|
|
499
|
+
between different subtypes.
|
|
500
|
+
|
|
501
|
+
Note that all renderer callbacks are called by Taverna Player in a context that
|
|
502
|
+
includes the {ActionView::Helpers}[http://api.rubyonrails.org/classes/ActionView/Helpers.html]
|
|
503
|
+
so your callbacks have access to them too, including helpers from third-party
|
|
504
|
+
gems that register their helpers correctly.
|
|
505
|
+
|
|
506
|
+
=== Example type renderers
|
|
507
|
+
|
|
508
|
+
These are some of the supplied renderers that are registered by default in
|
|
509
|
+
Taverna Player.
|
|
510
|
+
|
|
511
|
+
==== Plain text
|
|
512
|
+
|
|
513
|
+
Taverna Player provides a plain text renderer that formats text with a
|
|
514
|
+
monospaced font, converts URI-like things to clickable links and respects
|
|
515
|
+
carriage returns and newlines. It looks something like this:
|
|
516
|
+
|
|
517
|
+
def format_text(content, type)
|
|
518
|
+
# Use CodeRay to format text so that newlines are respected.
|
|
519
|
+
content = CodeRay.scan(content, :text).div(:css => :class)
|
|
520
|
+
|
|
521
|
+
# Use auto_link to turn URI-like text into links.
|
|
522
|
+
auto_link(content, :html => { :target => '_blank' }, :sanitize => false)
|
|
523
|
+
end
|
|
524
|
+
|
|
525
|
+
The {coderay}[https://rubygems.org/gems/coderay] gem is used to format the
|
|
526
|
+
text, preserving newlines and the
|
|
527
|
+
{rails_autolink}[https://rubygems.org/gems/rails_autolink] gem is used to
|
|
528
|
+
convert URI-like text into clickable links.
|
|
529
|
+
|
|
530
|
+
This renderer is registered as the default for all "text" media types.
|
|
531
|
+
|
|
532
|
+
==== XML
|
|
533
|
+
|
|
534
|
+
This renderer catches "text/XML" outputs:
|
|
535
|
+
|
|
536
|
+
def format_xml(content, type)
|
|
537
|
+
# Make sure XML is indented consistently.
|
|
538
|
+
out = String.new
|
|
539
|
+
REXML::Document.new(content).write(out, 1)
|
|
540
|
+
CodeRay.scan(out, :xml).div(:css => :class, :line_numbers => :table)
|
|
541
|
+
end
|
|
542
|
+
|
|
543
|
+
It uses {REXML}[http://ruby-doc.org/stdlib-1.9.3/libdoc/rexml/rdoc/index.html]
|
|
544
|
+
to format the XML and {coderay}[https://rubygems.org/gems/coderay] to
|
|
545
|
+
syntax-highlight it.
|
|
546
|
+
|
|
547
|
+
Note that for XML to be detected as XML it must, as per the standard, include
|
|
548
|
+
the XML declaration, e.g.:
|
|
549
|
+
|
|
550
|
+
<?xml version="1.0" ?>
|
|
551
|
+
|
|
552
|
+
==== Images
|
|
553
|
+
|
|
554
|
+
As described above, images are just dropped into an <tt><img ../></tt> tag:
|
|
555
|
+
|
|
556
|
+
def show_image(content, type)
|
|
557
|
+
# Can't use image_tag() here because the image doesn't really exist (it's
|
|
558
|
+
# in a zip file, really) and this confuses the Rails asset pipeline.
|
|
559
|
+
tag("img", :src => content)
|
|
560
|
+
end
|
|
561
|
+
|
|
562
|
+
Note the comment about the Rails asset pipeline in there if you are writing
|
|
563
|
+
your own image renderer and are using the asset pipeline.
|
|
564
|
+
|
|
565
|
+
The content parameter here gives the path to the image to be displayed.
|
|
566
|
+
|
|
567
|
+
==== Other types catch-all
|
|
568
|
+
|
|
569
|
+
The default renderer for other, or unknown types, is:
|
|
570
|
+
|
|
571
|
+
def cannot_inline(content, type)
|
|
572
|
+
"Sorry but we cannot show this type of content in the browser. Please " +
|
|
573
|
+
link_to("download it", content) + " to view it on your local machine."
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
== Service Credentials
|
|
577
|
+
|
|
578
|
+
<b>Please see the notes in the limitations section below!</b>
|
|
579
|
+
|
|
580
|
+
At the moment the Service Credentials facilities are basic and provided purely
|
|
581
|
+
to allow access to services which are ostensibly public but still require a
|
|
582
|
+
login of some kind.
|
|
583
|
+
|
|
584
|
+
In practice very few services that will be used via public tools such as
|
|
585
|
+
Taverna Player are in use so this should not affect most users at this time.
|
|
586
|
+
It is the intention to fill this gap in functionality as soon as possible,
|
|
587
|
+
however.
|
|
588
|
+
|
|
589
|
+
If you do have services in your workflows that require such a login then you
|
|
590
|
+
can add them through the Service Credentials model. The types of credential
|
|
591
|
+
that Taverna Server can accept are detailed in the
|
|
592
|
+
{Client Library Documentation}[http://mygrid.github.io/t2-server-gem/] but
|
|
593
|
+
Taverna Player supports a subset:
|
|
594
|
+
|
|
595
|
+
=== REST
|
|
596
|
+
|
|
597
|
+
REST services are commonly secured via HTTP Basic or HTTP Digest authentication
|
|
598
|
+
and Taverna treats these two schemes in the same way. Simply register the
|
|
599
|
+
username and password with the host name of the server on which the service is
|
|
600
|
+
running:
|
|
601
|
+
|
|
602
|
+
https://example.com:8443/
|
|
603
|
+
|
|
604
|
+
The above example shows a https server running on port 8443. If the service is
|
|
605
|
+
on port 80 for http or port 443 for https then you don’t need to specify the
|
|
606
|
+
port.
|
|
607
|
+
|
|
608
|
+
If there are services on the same host that require different credentials then
|
|
609
|
+
you will need to specify the realm for which each set of credentials applies.
|
|
610
|
+
This is done by adding the name of the realm to the end of the host name with
|
|
611
|
+
a # separating them:
|
|
612
|
+
|
|
613
|
+
https://example.com:8443/#realm
|
|
614
|
+
|
|
615
|
+
=== SOAP
|
|
616
|
+
|
|
617
|
+
SOAP services are commonly secured via WS-Security. Simply register the WSDL
|
|
618
|
+
address of the service with your username and password:
|
|
619
|
+
|
|
620
|
+
https://example.com:8443/services/MyService?wsdl
|
|
621
|
+
|
|
622
|
+
=== R server
|
|
623
|
+
|
|
624
|
+
You can authenticate to R Servers in almost exactly the same way as for REST
|
|
625
|
+
services - only the protocol scheme is different. So instead of http or https
|
|
626
|
+
it is rserve:
|
|
627
|
+
|
|
628
|
+
rserve://example.com:6311
|
|
629
|
+
|
|
630
|
+
== Limitations and to-do list
|
|
631
|
+
|
|
632
|
+
The most serious limitation is with the Service Credentials. Because Taverna
|
|
633
|
+
Server needs to be given the credentials in plaintext (which is why you should
|
|
634
|
+
always use HTTPS) we have to store them as such. For the time being it is
|
|
635
|
+
recommended to only use them for services that are ostensibly public, but with
|
|
636
|
+
a login requirement. An example of this might be a R server on the local
|
|
637
|
+
machine, which is only available locally, but nevertheless requires a login.
|
|
638
|
+
|
|
639
|
+
Service Credentials are also intended, at the moment, to be a global resource.
|
|
640
|
+
They are not per-user. Every workflow run will be given these credentials.
|
|
641
|
+
|
|
642
|
+
Service Credentials only provide username/password type credentials at the
|
|
643
|
+
moment.
|
|
644
|
+
|
|
645
|
+
=== To do
|
|
646
|
+
|
|
647
|
+
In no particular order:
|
|
648
|
+
|
|
649
|
+
* Taverna Player as a service. Allow usage of Taverna Player via a fully
|
|
650
|
+
RESTful interface with JSON and XML support (in progress).
|
|
651
|
+
* User specific (and therefore private) credentials wallet for secure services.
|
|
652
|
+
* Comprehensive Taverna Server administration panel. This would allow admin
|
|
653
|
+
users to view and manage runs directly on the Taverna Server along with
|
|
654
|
+
other such admin tasks.
|
|
655
|
+
|
|
656
|
+
== Support
|
|
657
|
+
|
|
658
|
+
Please email {support@mygrid.org.uk}[mailto:support@mygrid.org.uk] for any
|
|
659
|
+
questions relating to Taverna Player.
|
|
660
|
+
|
|
661
|
+
Bug reports or feature requests may be submitted to the
|
|
662
|
+
{public issue tracker}[https://github.com/myGrid/taverna-player/issues] at
|
|
663
|
+
GitHub.
|