1 class Arvados::V1::CollectionsController < ApplicationController
3 # Collections are owned by system_user. Creating a collection has
4 # two effects: The collection is added if it doesn't already
5 # exist, and a "permission" Link is added (if one doesn't already
6 # exist) giving the current user (or specified owner_uuid)
7 # permission to read it.
8 owner_uuid = resource_attrs.delete(:owner_uuid) || current_user.uuid
9 owner_kind = if owner_uuid.match(/-(\w+)-/)[1] == User.uuid_prefix
14 unless current_user.can? write: owner_uuid
15 raise ArvadosModel::PermissionDeniedError
18 @object = model_class.new resource_attrs.reject { |k,v| k == :owner_uuid }
21 rescue ActiveRecord::RecordNotUnique
22 logger.debug resource_attrs.inspect
23 if resource_attrs[:manifest_text] and resource_attrs[:uuid]
24 @existing_object = model_class.
25 where('uuid=? and manifest_text=?',
26 resource_attrs[:uuid],
27 resource_attrs[:manifest_text]).
29 @object = @existing_object || @object
35 owner_uuid: owner_uuid,
36 link_class: 'permission',
38 head_kind: 'arvados#collection',
39 head_uuid: @object.uuid,
40 tail_kind: owner_kind,
43 ActiveRecord::Base.transaction do
44 if Link.where(link_attrs).empty?
45 Link.create! link_attrs
53 def collection_uuid(uuid)
54 m = /([a-f0-9]{32}(\+[0-9]+)?)(\+.*)?/.match(uuid)
62 def script_param_edges(visited, sp)
63 if sp and not sp.empty?
67 script_param_edges(visited, v)
71 script_param_edges(visited, v)
74 m = collection_uuid(sp)
76 generate_provenance_edges(visited, m)
83 def generate_provenance_edges(visited, uuid)
84 m = collection_uuid(uuid)
86 if not uuid or uuid.empty? or visited[uuid] or visited[m]
90 #puts "visiting #{uuid}"
93 # uuid is a collection
95 Collection.where(uuid:"uuid").each do |c|
99 Job.where(output: uuid).each do |job|
100 generate_provenance_edges(visited, job.uuid)
103 Job.where(log: uuid).each do |job|
104 generate_provenance_edges(visited, job.uuid)
110 # uuid is something else
111 rsc = ArvadosBase::resource_class_for_uuid uuid
114 Job.where(uuid: uuid).each do |job|
116 script_param_edges(visited, job, "", job.script_parameters)
120 Link.where(head_uuid: uuid, link_class: "provenance").each do |link|
121 generate_provenance_edges(visited, link.tail_uuid)
124 #puts "finished #{uuid}"
131 generate_provenance_edges(visited, @object.uuid)
137 def find_object_by_uuid
139 if !@object and !params[:uuid].match(/^[0-9a-f]+\+\d+$/)
140 # Normalize the given uuid and search again.
141 hash_part = params[:uuid].match(/^([0-9a-f]*)/)[1]
142 collection = Collection.where('uuid like ?', hash_part + '+%').first
144 # We know the collection exists, and what its real uuid is in
145 # the database. Now, throw out @objects and repeat the usual
146 # lookup procedure. (Returning the collection at this point
147 # would bypass permission checks.)
149 @where = { uuid: collection.uuid }
150 find_objects_for_index
151 @object = @objects.first