Merge branch '15109-logs-table-admin-docs'
[arvados.git] / services / api / app / models / container_request.rb
index e1ae2b54891adbc85e8fc6b48e17e9faaeac9b59..292decafbfb94ad381ab84bcfe01da13c5e9d68d 100644 (file)
@@ -19,13 +19,16 @@ class ContainerRequest < ArvadosModel
                primary_key: :uuid,
              }
 
-  serialize :properties, Hash
+  # Posgresql JSONB columns should NOT be declared as serialized, Rails 5
+  # already know how to properly treat them.
+  attribute :properties, :jsonbHash, default: {}
+  attribute :secret_mounts, :jsonbHash, default: {}
+
   serialize :environment, Hash
   serialize :mounts, Hash
   serialize :runtime_constraints, Hash
   serialize :command, Array
   serialize :scheduling_parameters, Hash
-  serialize :secret_mounts, Hash
 
   before_validation :fill_field_defaults, :if => :new_record?
   before_validation :validate_runtime_constraints
@@ -150,7 +153,7 @@ class ContainerRequest < ArvadosModel
       manifest = Collection.where(portable_data_hash: pdh).first.manifest_text
 
       coll_uuid = self.send(out_type + '_uuid')
-      coll = coll_uuid.nil? ? nil : Collection.find_by_uuid(coll_uuid)
+      coll = coll_uuid.nil? ? nil : Collection.where(uuid: coll_uuid).first
       if !coll
         coll = Collection.new(
           owner_uuid: self.owner_uuid,
@@ -166,7 +169,7 @@ class ContainerRequest < ArvadosModel
         src = Arv::Collection.new(manifest)
         dst = Arv::Collection.new(coll.manifest_text)
         dst.cp_r("./", ".", src)
-        dst.cp_r("./", "container #{container.uuid}", src)
+        dst.cp_r("./", "log for container #{container.uuid}", src)
         manifest = dst.manifest_text
       end
 
@@ -191,6 +194,7 @@ class ContainerRequest < ArvadosModel
     self.environment ||= {}
     self.runtime_constraints ||= {}
     self.mounts ||= {}
+    self.secret_mounts ||= {}
     self.cwd ||= "."
     self.container_count_max ||= Rails.configuration.container_count_max
     self.scheduling_parameters ||= {}
@@ -215,14 +219,29 @@ class ContainerRequest < ArvadosModel
       else
         self.container_count += 1
         if self.container_uuid_was
-          # old_container = Container.find_by_uuid()
-          # # copy logs from old container into CR's log collection
-          # #
-          #   src = Arv::Collection.new(manifest)
-          #   tgt = Arv::Collection.new(coll.manifest_text)
-          #   tgt.cp_r("./", "./", src)
-          #   tgt.cp_r("./", "container #{container.uuid}", src)
-          #   manifest = tgt.manifest_text
+          old_container = Container.find_by_uuid(self.container_uuid_was)
+          old_logs = Collection.where(portable_data_hash: old_container.log).first
+          if old_logs
+            log_coll = self.log_uuid.nil? ? nil : Collection.where(uuid: self.log_uuid).first
+            if self.log_uuid.nil?
+              log_coll = Collection.new(
+                owner_uuid: self.owner_uuid,
+                name: coll_name = "Container log for request #{uuid}",
+                manifest_text: "")
+            end
+
+            # copy logs from old container into CR's log collection
+            src = Arv::Collection.new(old_logs.manifest_text)
+            dst = Arv::Collection.new(log_coll.manifest_text)
+            dst.cp_r("./", "log for container #{old_container.uuid}", src)
+            manifest = dst.manifest_text
+
+            log_coll.assign_attributes(
+              portable_data_hash: Digest::MD5.hexdigest(manifest) + '+' + manifest.bytesize.to_s,
+              manifest_text: manifest)
+            log_coll.save_with_unique_name!
+            self.log_uuid = log_coll.uuid
+          end
         end
       end
     end