X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d4939c581f629a19220bc5b469fed98462b2b7eb..3ede205bf0e5af7a88e04009cd66ff111e0729c3:/services/api/app/models/container_request.rb diff --git a/services/api/app/models/container_request.rb b/services/api/app/models/container_request.rb index 4e76a0e08a..6353132e90 100644 --- a/services/api/app/models/container_request.rb +++ b/services/api/app/models/container_request.rb @@ -62,6 +62,12 @@ class ContainerRequest < ArvadosModel %w(modified_by_client_uuid container_uuid requesting_container_uuid) end + def container_completed! + # may implement retry logic here in the future. + self.state = ContainerRequest::Final + self.save! + end + protected def fill_field_defaults @@ -70,35 +76,34 @@ class ContainerRequest < ArvadosModel self.runtime_constraints ||= {} self.mounts ||= {} self.cwd ||= "." - self.priority ||= 1 end - # Turn a container request into a container. + # Create a new container (or find an existing one) to satisfy this + # request. def resolve - # In the future this will do things like resolve symbolic git and keep - # references to content addresses. - Container.create!({ :command => self.command, - :container_image => self.container_image, - :cwd => self.cwd, - :environment => self.environment, - :mounts => self.mounts, - :output_path => self.output_path, - :runtime_constraints => self.runtime_constraints }) + # TODO: resolve symbolic git and keep references to content + # addresses. + c = act_as_system_user do + Container.create!(command: self.command, + container_image: self.container_image, + cwd: self.cwd, + environment: self.environment, + mounts: self.mounts, + output_path: self.output_path, + runtime_constraints: self.runtime_constraints) + end + self.container_uuid = c.uuid end def set_container - if self.container_uuid_changed? - if not current_user.andand.is_admin and not self.container_uuid.nil? - errors.add :container_uuid, "can only be updated to nil." - end - else - if self.state_changed? - if self.state == Committed and (self.state_was == Uncommitted or self.state_was.nil?) - act_as_system_user do - self.container_uuid = self.resolve.andand.uuid - end - end - end + if (container_uuid_changed? and + not current_user.andand.is_admin and + not container_uuid.nil?) + errors.add :container_uuid, "can only be updated to nil." + return false + end + if state_changed? and state == Committed and container_uuid.nil? + resolve end end @@ -119,6 +124,10 @@ class ContainerRequest < ArvadosModel errors.add :container_uuid, "has not been resolved to a container." end + if priority.nil? + errors.add :priority, "cannot be nil" + end + # Can update priority, container count. permitted.push :priority, :container_count_max, :container_uuid @@ -131,6 +140,10 @@ class ContainerRequest < ArvadosModel end when Final + if not current_user.andand.is_admin + errors.add :state, "of container request can only be set to Final by system." + end + if self.state_changed? permitted.push :state else @@ -145,16 +158,14 @@ class ContainerRequest < ArvadosModel end def update_priority - if [Committed, Final].include? self.state and (self.state_changed? or - self.priority_changed? or - self.container_uuid_changed?) - [self.container_uuid_was, self.container_uuid].each do |cuuid| - unless cuuid.nil? - c = Container.find_by_uuid cuuid - act_as_system_user do - c.update_priority! - end - end + if self.state_changed? or + self.priority_changed? or + self.container_uuid_changed? + act_as_system_user do + Container. + where('uuid in (?)', + [self.container_uuid_was, self.container_uuid].compact). + map(&:update_priority!) end end end