t2-server 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,8 @@
1
+ *~
2
+ pkg/
3
+ html/
4
+ .buildpath
5
+ .project
6
+ .idea
7
+ .rvmrc
8
+ Gemfile.lock
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ cache: bundler
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.0
@@ -1,5 +1,29 @@
1
1
  = Changes log for the T2 Ruby Gem
2
2
 
3
+ == Version 1.1.0
4
+
5
+ * Remove hirb as a runtime dependency.
6
+ * t2-server-admin: Minor fix for readability.
7
+ * Add a gem version badge from badge.fury.io.
8
+ * Use bundler and stop using jeweler.
9
+ * Update dependencies.
10
+ * Add travis configuration.
11
+ * Separate out the version code from the main include file.
12
+ * If in travis, don't wait for a server address.
13
+ * Update note about SemVer in readme.
14
+ * Add travis badge and update ruby testing info.
15
+ * Refactor out rexml and nokogiri xml support.
16
+ * Setup rubygems and bundler in the main require file.
17
+ * t2-run-workflow: Fix baclava output option.
18
+ * Fix error in exception caused by chunked response.
19
+ * Add provenance capture and retrieval functionality.
20
+ * Can now toggle provenance generation on and off.
21
+ * Implement a comparable version class.
22
+ * Restrict provenance functionality to correct server versions.
23
+ * Remove Server#version_components from the docs.
24
+ * Tighten ratom version and move libxml-ruby to runtime list.
25
+ * Align baclava output method names with the prov ones.
26
+
3
27
  == Version 1.0.0
4
28
 
5
29
  * Remove deprecated methods.
data/Gemfile ADDED
@@ -0,0 +1,35 @@
1
+ # Copyright (c) 2014 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.
30
+ #
31
+ # Author: Robert Haines
32
+
33
+ source "https://rubygems.org"
34
+
35
+ gemspec
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010-2013 The University of Manchester, UK.
1
+ Copyright (c) 2010-2014 The University of Manchester, UK.
2
2
 
3
3
  All rights reserved.
4
4
 
@@ -4,9 +4,11 @@ Authors:: Robert Haines
4
4
  Contact:: mailto:support@mygrid.org.uk
5
5
  URL:: http://www.taverna.org.uk/
6
6
  Licence:: BSD (See LICENCE or http://www.opensource.org/licenses/bsd-license.php)
7
- Copyright:: (c) 2010-2013 The University of Manchester, UK
7
+ Copyright:: (c) 2010-2014 The University of Manchester, UK
8
8
 
9
+ {<img src="https://badge.fury.io/rb/t2-server.png" alt="Gem Version" />}[http://badge.fury.io/rb/t2-server]
9
10
  {<img src="https://codeclimate.com/github/myGrid/t2-server-gem.png" />}[https://codeclimate.com/github/myGrid/t2-server-gem]
11
+ {<img src="https://travis-ci.org/myGrid/t2-server-gem.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/myGrid/t2-server-gem]
10
12
 
11
13
  == Synopsis
12
14
 
@@ -28,9 +30,7 @@ https://github.com/myGrid/t2-server-gem
28
30
 
29
31
  == Compatibility
30
32
 
31
- After the release of version 1.0.0 this gem will follow the principles of
32
- {Semantic Versioning}[http://semver.org/]. Until that point there may be
33
- breaking changes to the API, although these will be kept to a minimum.
33
+ This gem uses {Semantic Versioning}[http://semver.org/].
34
34
 
35
35
  === Taverna Server
36
36
 
@@ -52,18 +52,24 @@ Server, but if that is not possible right now then these are the recommended
52
52
  version pairings:
53
53
  * pre Taverna Server 2.3, use version 0.6.1 of the gem
54
54
  * 2.3, use version 0.9.3
55
- * 2.4 and up, use version 1.0.0
55
+ * 2.4 and up, use version 1.0.0 and up.
56
56
 
57
57
  === Ruby
58
58
 
59
59
  This library is known to work with the following versions of Ruby:
60
- * 1.8.7
61
60
  * 1.9.2
62
- * 1.9.3 *
63
- * 2.0.0
61
+ * 1.9.3 +*
62
+ * 2.0.0 +*
63
+ * 2.1.0 +
64
64
 
65
- Those marked with an asterisk (*) are supported and bugs found against them
66
- will be fixed. Other versions may work but are not tested or supported.
65
+ Those marked with an asterisk (*) are fully supported and bugs found against
66
+ them will be fixed. Other versions may work but are not tested or supported.
67
+
68
+ Those marked with a plus (+) are tested in
69
+ {https://travis-ci.org/myGrid/t2-server-gem}[Travis].
70
+
71
+ Ruby 1.8.7 is no longer supported as it reached its end of life at the end of
72
+ June 2013.
67
73
 
68
74
  == Usage
69
75
 
@@ -233,12 +239,29 @@ supported:
233
239
  But make sure you request baclava output *before* starting the run. Baclava
234
240
  output can be downloaded into memory or saved directly to a file.
235
241
 
236
- run.request_baclava_output
242
+ run.generate_baclava_output
237
243
  run.start
238
244
  run.wait
239
245
  output = run.baclava_output # download to memory
240
246
  run.baclava_output("/path/to/output.baclava") # save to a file
241
247
 
248
+ Later versions of Taverna Server can generate a complete provenance log of a
249
+ workflow run in {Taverna-PROV}[https://github.com/myGrid/taverna-prov] format.
250
+ The generation of provenance data must be requested *before* starting the run.
251
+
252
+ run.generate_provenance
253
+ run.start
254
+ ...
255
+ provenance = run.provenance # download to memory
256
+ run.provenance("/path/to/provenance.zip") # save to a file
257
+
258
+ The resultant provenance bundle is a zip file containing all input, output and
259
+ intermediate values as separate files, along with the provenance of
260
+ the workflow run. The bundle is based on the
261
+ {Research Object Bundle specification}[http://wf4ever.github.io/ro/bundle/],
262
+ and complies with the
263
+ {W3C PROV-O provenance specification}[http://www.w3.org/TR/prov-o/].
264
+
242
265
  The log from Taverna Server can be downloaded in a similar way to zip files or
243
266
  Baclava documents.
244
267
 
@@ -246,7 +269,7 @@ Baclava documents.
246
269
  run.log("/path/to/log.txt") # save to a file
247
270
 
248
271
  When downloading outputs the underlying stream can be accessed by supplying a
249
- block to the value, zip_output, baclava_output or log methods:
272
+ block to the value, zip_output, provenance, baclava_output or log methods:
250
273
 
251
274
  run.output_port("port_name").value do |data|
252
275
  print data
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2013 The University of Manchester, UK.
1
+ # Copyright (c) 2010-2014 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -30,49 +30,12 @@
30
30
  #
31
31
  # Author: Robert Haines
32
32
 
33
- require 'rubygems'
34
- require 'rake'
35
- require 'rake/clean'
36
- require 'rake/tasklib'
37
- require 'rdoc/task'
38
- require 'jeweler'
39
-
40
- # we need to add lib to the path because we're not installed yet!
41
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), "lib")
42
- require 't2-server'
33
+ require "bundler/gem_tasks"
34
+ require "rake/testtask"
35
+ require "rdoc/task"
43
36
 
44
37
  task :default => [:test]
45
38
 
46
- Jeweler::Tasks.new do |s|
47
- s.name = "t2-server"
48
- s.version = T2Server::Version::STRING
49
- s.authors = ["Robert Haines", "Finn Bacall"]
50
- s.email = ["support@mygrid.org.uk"]
51
- s.homepage = "http://www.taverna.org.uk/"
52
- s.platform = Gem::Platform::RUBY
53
- s.summary = "Support for interacting with Taverna 2 Server."
54
- s.description = "This gem provides access to the Taverna 2 Server " +
55
- "REST interface from Ruby."
56
- s.require_path = "lib"
57
- s.bindir = "bin"
58
- s.executables = ["t2-delete-runs", "t2-run-workflow", "t2-server-info",
59
- "t2-get-output", "t2-server-admin"]
60
- s.test_file = "test/ts_t2server.rb"
61
- s.has_rdoc = true
62
- s.extra_rdoc_files = ["README.rdoc", "LICENCE.rdoc", "CHANGES.rdoc"]
63
- s.rdoc_options = ["-N", "--tab-width=2", "--main=README.rdoc"]
64
- s.add_development_dependency('rake', '~> 0.9.2')
65
- s.add_development_dependency('libxml-ruby', '>= 1.1.4')
66
- s.add_development_dependency('nokogiri', '>= 1.5.0')
67
- s.add_development_dependency('rdoc', '>= 3.9.4')
68
- s.add_development_dependency('jeweler', '~> 1.8.3')
69
- s.add_development_dependency('launchy', '~> 2.2.0')
70
- s.add_runtime_dependency('net-http-persistent', '~> 2.6')
71
- s.add_runtime_dependency('taverna-baclava', '~> 1.0.0')
72
- s.add_runtime_dependency('ratom', '~> 0.8.2')
73
- s.add_runtime_dependency('hirb', '>= 0.4.0')
74
- end
75
-
76
39
  # This test task does not use the standard Rake::TestTask class as we need to
77
40
  # be able to supply an argument to the test. This is so that the test can be
78
41
  # run with a server address from a CI server. The equivalent TestTask would be
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- # Copyright (c) 2010-2013 The University of Manchester, UK.
2
+ # Copyright (c) 2010-2014 The University of Manchester, UK.
3
3
  #
4
4
  # All rights reserved.
5
5
  #
@@ -86,13 +86,19 @@ conn_params, creds = register_options("Usage: t2-run-workflow [options] "\
86
86
  user, pass = cred.chomp.split(':', 2)
87
87
  options[:screds] << [uri, user, pass]
88
88
  end
89
+ opt.on("-P [FILE]", "--provenance", "Generate provenance for the run and "\
90
+ "save it to a file. A filename may be specified or 'provenance.zip' "\
91
+ "will be used. Getting outputs in baclava format overrides this "\
92
+ "option.") do |val|
93
+ options[:provenance] = (val || "provenance.zip").chomp
94
+ end
89
95
  opt.on("-b BACLAVA", "--baclava-in=BACLAVA", "Set baclava file for input "\
90
96
  "port values") do |val|
91
97
  inputs[:baclava] = val
92
98
  end
93
- opt.on("-o", "--baclava-out=BACLAVA", "Return outputs in baclava format."\
99
+ opt.on("-o [FILE]", "--baclava-out", "Return outputs in baclava format."\
94
100
  " A filename may be specified or 'out.xml' is used") do |val|
95
- options[:baclava_out] = val.chomp
101
+ options[:baclava_out] = (val || "out.xml").chomp
96
102
  end
97
103
  opt.on("-n", "--no-wait", "Do not wait for workflow to finish, return "\
98
104
  "once it has started running") do |val|
@@ -189,6 +195,9 @@ begin
189
195
  run.add_password_credential(list[0], list[1], list[2])
190
196
  end
191
197
 
198
+ # generate provenance?
199
+ run.generate_provenance if options[:provenance]
200
+
192
201
  # output baclava?
193
202
  run.request_baclava_output if options[:baclava_out]
194
203
 
@@ -250,6 +259,12 @@ begin
250
259
  end
251
260
  end
252
261
  end
262
+
263
+ if options[:provenance]
264
+ run.provenance(options[:provenance])
265
+ puts "Provenance file written to '#{options[:provenance]}'"
266
+ end
267
+
253
268
  end
254
269
 
255
270
  # delete run?
@@ -33,7 +33,6 @@
33
33
 
34
34
  require 'rubygems'
35
35
  require 't2-server-cli'
36
- require 'hirb'
37
36
 
38
37
  include T2Server::CLI
39
38
 
@@ -58,6 +57,17 @@ conn_params, creds = register_options("Usage: t2-server-admin [options] " +
58
57
  end
59
58
  end
60
59
 
60
+ if options[:list]
61
+ begin
62
+ require 'hirb'
63
+ rescue LoadError
64
+ puts "\n****\nTo list administrative resources in your terminal the "\
65
+ "hirb gem must be installed:\n\n$ gem install hirb\n\nThis information "\
66
+ "will not be shown this time, sorry.\n****\n\n"
67
+ options[:list] = false
68
+ end
69
+ end
70
+
61
71
  # get runs and server address from the arguments
62
72
  resources = []
63
73
  address = ""
@@ -84,7 +94,7 @@ begin
84
94
  server.administrator(creds) do |admin|
85
95
  # list and exit?
86
96
  if options[:list]
87
- puts (Hirb::Helpers::ObjectTable.render admin.resources.values,
97
+ puts Hirb::Helpers::ObjectTable.render(admin.resources.values,
88
98
  :fields=>[:name, :writable?],
89
99
  :headers=>{:name => 'Resource name', :writable? => 'Access'},
90
100
  :filters=>{:writable? => :access},
@@ -33,7 +33,6 @@
33
33
 
34
34
  require 'rubygems'
35
35
  require 't2-server-cli'
36
- require 'hirb'
37
36
 
38
37
  include T2Server::CLI
39
38
 
@@ -51,6 +50,17 @@ conn_params, creds = register_options("Usage: t2-server-info [options] " +
51
50
  end
52
51
  end
53
52
 
53
+ if options[:list] > 0
54
+ begin
55
+ require 'hirb'
56
+ rescue LoadError
57
+ puts "\n****\nTo tabulate run information in your terminal the hirb gem "\
58
+ "must be installed:\n\n$ gem install hirb\n\nRun information will not "\
59
+ "be shown this time, sorry.\n****\n\n"
60
+ options[:list] = 0
61
+ end
62
+ end
63
+
54
64
  # read and check server address and credentials
55
65
  uri, creds = parse_address(ARGV.shift, creds)
56
66
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2013 The University of Manchester, UK.
1
+ # Copyright (c) 2010-2014 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -30,9 +30,12 @@
30
30
  #
31
31
  # Author: Robert Haines
32
32
 
33
- require 'yaml'
33
+ require 'rubygems'
34
+ require 'bundler/setup'
35
+
36
+ require 't2-server/version'
34
37
  require 't2-server/util'
35
- require 't2-server/xml/xml'
38
+ require 't2-server/xml'
36
39
  require 't2-server/exceptions'
37
40
  require 't2-server/net/credentials'
38
41
  require 't2-server/net/connection'
@@ -50,14 +53,4 @@ require 't2-server/admin'
50
53
  # * T2Server::Server - Use this if you are providing a web interface to a
51
54
  # Taverna 2 Server instance.
52
55
  module T2Server
53
-
54
- # Library version information.
55
- module Version
56
- # Version information in a Hash
57
- INFO = YAML.load_file(File.join(File.dirname(__FILE__), "..",
58
- "version.yml"))
59
-
60
- # Version number as a String
61
- STRING = [:major, :minor, :patch].map {|d| INFO[d]}.compact.join('.')
62
- end
63
56
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2012 The University of Manchester, UK.
1
+ # Copyright (c) 2010-2014 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -104,7 +104,8 @@ module T2Server
104
104
  @method = method
105
105
  @path = path
106
106
  @code = response.code
107
- @body = response.body.empty? ? "<none>" : "#{response.body}"
107
+ @body = response.body.to_s
108
+ @body = @body.empty? ? "<none>" : "#{response.body}"
108
109
  message = "Unexpected server response:\n Method: #{@method}\n Path: "\
109
110
  "#{@path}\n Code: #{@code}\n Body: #{@body}"
110
111
  super message
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2013 The University of Manchester, UK.
1
+ # Copyright (c) 2010-2014 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -30,7 +30,6 @@
30
30
  #
31
31
  # Author: Robert Haines
32
32
 
33
- require 'rubygems'
34
33
  require 'atom'
35
34
  require 'uri'
36
35
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2013 The University of Manchester, UK.
1
+ # Copyright (c) 2010-2014 The University of Manchester, UK.
2
2
  #
3
3
  # All rights reserved.
4
4
  #
@@ -32,7 +32,6 @@
32
32
 
33
33
  require 'base64'
34
34
  require 'time'
35
- require 'rubygems'
36
35
  require 'taverna-baclava'
37
36
 
38
37
  module T2Server
@@ -79,6 +78,8 @@ module T2Server
79
78
  :inputexp => "//nsr:expected",
80
79
  :name => "//nsr:name",
81
80
  :feed => "//nsr:interaction",
81
+ :gen_prov => "//nsr:generate-provenance",
82
+ :run_bundle => "//nsr:run-bundle",
82
83
 
83
84
  # Port descriptions XPath queries
84
85
  :port_in => "//port:input",
@@ -110,6 +111,7 @@ module T2Server
110
111
  @workflow = ""
111
112
  @baclava_in = false
112
113
  @baclava_out = false
114
+ @provenance = false
113
115
 
114
116
  @credentials = credentials
115
117
 
@@ -466,11 +468,11 @@ module T2Server
466
468
  end
467
469
 
468
470
  # :call-seq:
469
- # request_baclava_output -> true or false
471
+ # generate_baclava_output -> true or false
470
472
  #
471
473
  # Set the server to save the outputs of this run in baclava format. This
472
474
  # must be done before the run is started.
473
- def request_baclava_output
475
+ def generate_baclava_output
474
476
  return if @baclava_out
475
477
  state = status
476
478
  raise RunStateError.new(state, :initialized) if state != :initialized
@@ -479,6 +481,16 @@ module T2Server
479
481
  @credentials)
480
482
  end
481
483
 
484
+ # :stopdoc:
485
+ def request_baclava_output
486
+ warn "[DEPRECATED] Run#request_baclava_output is deprecated and will "\
487
+ "be removed in the next major release. Please use "\
488
+ "Run#generate_baclava_output instead."
489
+
490
+ generate_baclava_output
491
+ end
492
+ # :startdoc:
493
+
482
494
  # :call-seq:
483
495
  # baclava_input? -> true or false
484
496
  #
@@ -488,13 +500,23 @@ module T2Server
488
500
  end
489
501
 
490
502
  # :call-seq:
491
- # baclava_output? -> true or false
503
+ # generate_baclava_output? -> true or false
492
504
  #
493
505
  # Has this run been set to return results in baclava format?
494
- def baclava_output?
506
+ def generate_baclava_output?
495
507
  @baclava_out
496
508
  end
497
509
 
510
+ # :stopdoc:
511
+ def baclava_output?
512
+ warn "[DEPRECATED] Run#baclava_output? is deprecated and will be "\
513
+ "removed in the next major release. Please use "\
514
+ "Run#generate_baclava_output? instead."
515
+
516
+ generate_baclava_output?
517
+ end
518
+ # :startdoc:
519
+
498
520
  # :call-seq:
499
521
  # baclava_output -> string
500
522
  # baclava_output(filename) -> fixnum
@@ -530,6 +552,66 @@ module T2Server
530
552
  download_or_stream(param, baclava_uri, "*/*", &block)
531
553
  end
532
554
 
555
+ # :call-seq:
556
+ # generate_provenance(toggle = true) -> true or false
557
+ #
558
+ # Toggle the generation of provenance for this run on or off. This must be
559
+ # done before the run is started. Once the run has completed provenance
560
+ # can be retrieved with Run#provenance.
561
+ #
562
+ # Requesting baclava output for a run will override this setting.
563
+ def generate_provenance(toggle = true)
564
+ return @provenance if @provenance == toggle || links[:gen_prov].nil?
565
+ state = status
566
+ raise RunStateError.new(state, :initialized) if state != :initialized
567
+
568
+ result = @server.update(links[:gen_prov], toggle.to_s, "text/plain",
569
+ @credentials)
570
+
571
+ # If changing the setting worked then return the new setting, otherwise
572
+ # return the old one.
573
+ @provenance = result ? toggle : @provenance
574
+ end
575
+
576
+ # :call-seq:
577
+ # generate_provenance? -> true or false
578
+ #
579
+ # Has this run been set to generate provenance output?
580
+ def generate_provenance?
581
+ @provenance
582
+ end
583
+
584
+ # :call-seq:
585
+ # provenance -> binary blob
586
+ # provenance(filename) -> fixnum
587
+ # provenance(stream) -> fixnum
588
+ # provenance {|chunk| ...}
589
+ #
590
+ # Get the provenance of this run from the server in zip format.
591
+ #
592
+ # Calling this method with no parameters will simply return a blob of
593
+ # zipped data. Providing a filename will stream the data directly to that
594
+ # file and return the number of bytes written. Passing in an object that
595
+ # has a +write+ method (for example, an instance of File or IO) will
596
+ # stream the data directly to that object and return the number of bytes
597
+ # that were streamed. Passing in a block will allow access to the
598
+ # underlying data stream:
599
+ # run.provenance do |chunk|
600
+ # print chunk
601
+ # end
602
+ #
603
+ # Raises RunStateError if the run has not finished running.
604
+ def provenance(param = nil, &block)
605
+ raise ArgumentError,
606
+ 'both a parameter and block given for provenance' if param && block
607
+
608
+ state = status
609
+ raise RunStateError.new(state, :finished) if state != :finished
610
+
611
+ raise AccessForbiddenError.new("provenance") unless @provenance
612
+ download_or_stream(param, links[:run_bundle], "*/*", &block)
613
+ end
614
+
533
615
  # :call-seq:
534
616
  # zip_output -> binary blob
535
617
  # zip_output(filename) -> fixnum
@@ -1084,7 +1166,7 @@ module T2Server
1084
1166
  # first parse out the basic stuff
1085
1167
  links = get_uris_from_doc(doc, [:expiry, :workflow, :status,
1086
1168
  :createtime, :starttime, :finishtime, :wdir, :inputs, :output,
1087
- :securectx, :listeners, :name, :feed])
1169
+ :securectx, :listeners, :name, :feed, :gen_prov, :run_bundle])
1088
1170
 
1089
1171
  # Working dir links
1090
1172
  _get_wdir_links(links)