X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/4acab1500c713175d90962d78f78dfd8e5966528..2204a8d9305c85d2f7d65621a66443e7104c5f6b:/services/api/app/models/container.rb diff --git a/services/api/app/models/container.rb b/services/api/app/models/container.rb index e95c1e8289..edcb8501a4 100644 --- a/services/api/app/models/container.rb +++ b/services/api/app/models/container.rb @@ -24,6 +24,7 @@ class Container < ArvadosModel before_validation :fill_field_defaults, :if => :new_record? before_validation :set_timestamps validates :command, :container_image, :output_path, :cwd, :priority, :presence => true + validates :priority, numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 1000 } validate :validate_state_change validate :validate_change validate :validate_lock @@ -31,6 +32,7 @@ class Container < ArvadosModel after_validation :assign_auth before_save :sort_serialized_attrs after_save :handle_completed + after_save :propagate_priority has_many :container_requests, :foreign_key => :container_uuid, :class_name => 'ContainerRequest', :primary_key => :uuid belongs_to :auth, :class_name => 'ApiClientAuthorization', :foreign_key => :auth_uuid, :primary_key => :uuid @@ -93,6 +95,20 @@ class Container < ArvadosModel end end + def propagate_priority + if self.priority_changed? + act_as_system_user do + # Update the priority of child container requests to match new priority + # of the parent container. + ContainerRequest.where(requesting_container_uuid: self.uuid, + state: ContainerRequest::Committed).each do |cr| + cr.priority = self.priority + cr.save + end + end + end + end + # Create a new container (or find an existing one) to satisfy the # given container request. def self.resolve(req) @@ -297,17 +313,13 @@ class Container < ArvadosModel end def self.readable_by(*users_list) - if users_list.select { |u| u.is_admin }.any? - return self + # Load optional keyword arguments, if they exist. + if users_list.last.is_a? Hash + kwargs = users_list.pop + else + kwargs = {} end - user_uuids = users_list.map { |u| u.uuid } - uuid_list = user_uuids + users_list.flat_map { |u| u.groups_i_can(:read) } - uuid_list.uniq! - permitted = "(SELECT head_uuid FROM links WHERE link_class='permission' AND tail_uuid IN (:uuids))" - joins(:container_requests). - where("container_requests.uuid IN #{permitted} OR "+ - "container_requests.owner_uuid IN (:uuids)", - uuids: uuid_list) + Container.where(ContainerRequest.readable_by(*users_list).where("containers.uuid = container_requests.container_uuid").exists) end def final? @@ -322,7 +334,7 @@ class Container < ArvadosModel self.runtime_constraints ||= {} self.mounts ||= {} self.cwd ||= "." - self.priority ||= 1 + self.priority ||= 0 self.scheduling_parameters ||= {} end @@ -425,12 +437,10 @@ class Container < ArvadosModel # that a container cannot "claim" a collection that it doesn't otherwise # have access to just by setting the output field to the collection PDH. if output_changed? - c = Collection.unscoped do - Collection. - readable_by(current_user). + c = Collection. + readable_by(current_user, {include_trash: true}). where(portable_data_hash: self.output). first - end if !c errors.add :output, "collection must exist and be readable by current user." end