X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/2d8150ed20d97491930d99a52d923872bca73939..21598295f38998d8028aaa117f192de6b5758808:/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 f92fa21314..3478535230 100644 --- a/services/api/app/models/container_request.rb +++ b/services/api/app/models/container_request.rb @@ -35,18 +35,19 @@ class ContainerRequest < ArvadosModel t.add :environment t.add :expires_at t.add :filters + t.add :log_uuid t.add :mounts t.add :name + t.add :output_name t.add :output_path + t.add :output_uuid t.add :priority t.add :properties t.add :requesting_container_uuid t.add :runtime_constraints + t.add :scheduling_parameters t.add :state t.add :use_existing - t.add :output_uuid - t.add :log_uuid - t.add :scheduling_parameters end # Supported states for a container request @@ -90,15 +91,39 @@ class ContainerRequest < ArvadosModel ['output', 'log'].each do |out_type| pdh = c.send(out_type) next if pdh.nil? - manifest = Collection.where(portable_data_hash: pdh).first.manifest_text - coll = Collection.create!(owner_uuid: owner_uuid, - manifest_text: manifest, - portable_data_hash: pdh, - name: "Container #{out_type} for request #{uuid}", - properties: { - 'type' => out_type, - 'container_request' => uuid, - }) + if self.output_name and out_type == 'output' + coll_name = self.output_name + else + coll_name = "Container #{out_type} for request #{uuid}" + end + manifest = Collection.unscoped.where(portable_data_hash: pdh).first.manifest_text + begin + coll = Collection.create!(owner_uuid: owner_uuid, + manifest_text: manifest, + portable_data_hash: pdh, + name: coll_name, + properties: { + 'type' => out_type, + 'container_request' => uuid, + }) + rescue ActiveRecord::RecordNotUnique => rn + # In case this is executed as part of a transaction: When a Postgres exception happens, + # the following statements on the same transaction become invalid, so a rollback is + # needed. One example are Unit Tests, every test is enclosed inside a transaction so + # that the database can be reverted before every new test starts. + # See: http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html#module-ActiveRecord::Transactions::ClassMethods-label-Exception+handling+and+rolling+back + ActiveRecord::Base.connection.execute 'ROLLBACK' + raise unless out_type == 'output' and self.output_name + # Postgres specific unique name check. See ApplicationController#create for + # a detailed explanation. + raise unless rn.original_exception.is_a? PG::UniqueViolation + err = rn.original_exception + detail = err.result.error_field(PG::Result::PG_DIAG_MESSAGE_DETAIL) + raise unless /^Key \(owner_uuid, name\)=\([a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{15}, .*?\) already exists\./.match detail + # Output collection name collision detected: append a timestamp. + coll_name = "#{self.output_name} #{Time.now.getgm.strftime('%FT%TZ')}" + retry + end if out_type == 'output' out_coll = coll.uuid else @@ -108,6 +133,10 @@ class ContainerRequest < ArvadosModel update_attributes!(state: Final, output_uuid: out_coll, log_uuid: log_coll) end + def self.full_text_searchable_columns + super - ["mounts"] + end + protected def fill_field_defaults @@ -204,7 +233,7 @@ class ContainerRequest < ArvadosModel if !coll raise ArvadosModel::UnresolvableContainerError.new "docker image #{container_image.inspect} not found" end - return coll.portable_data_hash + return Collection.docker_migration_pdh([current_user], coll.portable_data_hash) end def set_container @@ -269,7 +298,8 @@ class ContainerRequest < ArvadosModel :container_image, :cwd, :description, :environment, :filters, :mounts, :name, :output_path, :priority, :properties, :requesting_container_uuid, :runtime_constraints, - :state, :container_uuid, :use_existing, :scheduling_parameters + :state, :container_uuid, :use_existing, :scheduling_parameters, + :output_name when Committed if container_uuid.nil? @@ -281,14 +311,16 @@ class ContainerRequest < ArvadosModel end # Can update priority, container count, name and description - permitted.push :priority, :container_count, :container_count_max, :container_uuid, :name, :description + permitted.push :priority, :container_count, :container_count_max, :container_uuid, + :name, :description if self.state_changed? # Allow create-and-commit in a single operation. permitted.push :command, :container_image, :cwd, :description, :environment, :filters, :mounts, :name, :output_path, :properties, :requesting_container_uuid, :runtime_constraints, - :state, :container_uuid, :use_existing, :scheduling_parameters + :state, :container_uuid, :use_existing, :scheduling_parameters, + :output_name end when Final