require 'active_support/core_ext/numeric/bytes' require 'thor' require 'debci/package' module Debci class StorageLimit def storage_limit @storage_limit ||= Debci.config.disk_storage_limit.megabytes end def run expiration = Time.now - Debci.config.data_retention.days packages = Debci::Package.find_by_sql(" SELECT packages.* FROM packages JOIN jobs ON packages.id = jobs.package_id WHERE date > '#{expiration}' GROUP BY packages.id HAVING sum(jobs.log_size + jobs.artifacts_size) >= #{storage_limit} ") packages.each do |package| self.cleanup_package(package) end end def cleanup_package(package) keep = true storage = 0 package.jobs.order("date DESC").in_batches.each do |subset| subset.each do |job| storage += job.disk_usage keep = false if storage > storage_limit unless keep job.cleanup Debci.log('Cleaned up files for job %<job_id>s (%<job>s)' % { job_id: job.run_id, job: job }) end end end end class CLI < Thor desc 'start', 'keeps storage limit by package/suite/architecture' def start ::Debci::StorageLimit.new.run end default_task :start end end end