diff --git a/app/models/domain.rb b/app/models/domain.rb index a9defdf50..5b3a6cd65 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -203,6 +203,31 @@ class Domain < ActiveRecord::Base statuses.include? DomainStatus::SERVER_TECH_CHANGE_PROHIBITED end + def self.clean_expired_pendings + DomainCron.send(__method__) + ActiveSupport::Deprecation.deprecate_methods(DomainCron, __method__) + end + + def self.start_expire_period + DomainCron.send(__method__) + ActiveSupport::Deprecation.deprecate_methods(DomainCron, __method__) + end + + def self.start_redemption_grace_period + DomainCron.send(__method__) + ActiveSupport::Deprecation.deprecate_methods(DomainCron, __method__) + end + + def self.start_delete_period + DomainCron.send(__method__) + ActiveSupport::Deprecation.deprecate_methods(DomainCron, __method__) + end + + def self.destroy_delete_candidates + DomainCron.send(__method__) + ActiveSupport::Deprecation.deprecate_methods(DomainCron, __method__) + end + class << self def convert_period_to_time(period, unit) return (period.to_i / 365).years if unit == 'd' @@ -221,109 +246,6 @@ class Domain < ActiveRecord::Base ) end - # rubocop: disable Metrics/AbcSize - # rubocop: disable Metrics/CyclomaticComplexity - # rubocop: disable Metrics/PerceivedComplexity - def clean_expired_pendings - STDOUT << "#{Time.zone.now.utc} - Clean expired domain pendings\n" unless Rails.env.test? - - expire_at = Setting.expire_pending_confirmation.hours.ago - count = 0 - expired_pending_domains = Domain.where('registrant_verification_asked_at <= ?', expire_at) - expired_pending_domains.each do |domain| - unless domain.pending_update? || domain.pending_delete? || domain.pending_delete_confirmation? - msg = "#{Time.zone.now.utc} - ISSUE: DOMAIN #{domain.id}: #{domain.name} IS IN EXPIRED PENDING LIST, " \ - "but no pendingDelete/pendingUpdate state present!\n" - STDOUT << msg unless Rails.env.test? - next - end - count += 1 - if domain.pending_update? - domain.send_mail :pending_update_expired_notification_for_new_registrant - end - if domain.pending_delete? || domain.pending_delete_confirmation? - DomainMailer.pending_delete_expired_notification(domain.id, true).deliver - end - domain.clean_pendings! - unless Rails.env.test? - STDOUT << "#{Time.zone.now.utc} Domain.clean_expired_pendings: ##{domain.id} (#{domain.name})\n" - end - end - STDOUT << "#{Time.zone.now.utc} - Successfully cancelled #{count} domain pendings\n" unless Rails.env.test? - count - end - # rubocop: enable Metrics/PerceivedComplexity - # rubocop: enable Metrics/AbcSize - # rubocop: enable Metrics/CyclomaticComplexity - - # rubocop: disable Metrics/LineLength - def start_expire_period - STDOUT << "#{Time.zone.now.utc} - Expiring domains\n" unless Rails.env.test? - - domains = Domain.where('valid_to <= ?', Time.zone.now) - domains.each do |domain| - next unless domain.expirable? - domain.set_graceful_expired - DomainMailer.expiration_reminder(domain.id).deliver - STDOUT << "#{Time.zone.now.utc} Domain.start_expire_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? - domain.save - end - - STDOUT << "#{Time.zone.now.utc} - Successfully expired #{domains.count} domains\n" unless Rails.env.test? - end - - def start_redemption_grace_period - STDOUT << "#{Time.zone.now.utc} - Setting server_hold to domains\n" unless Rails.env.test? - - d = Domain.where('outzone_at <= ?', Time.zone.now) - d.each do |domain| - next unless domain.server_holdable? - domain.statuses << DomainStatus::SERVER_HOLD - STDOUT << "#{Time.zone.now.utc} Domain.start_redemption_grace_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? - domain.save - end - - STDOUT << "#{Time.zone.now.utc} - Successfully set server_hold to #{d.count} domains\n" unless Rails.env.test? - end - - def start_delete_period - STDOUT << "#{Time.zone.now.utc} - Setting delete_candidate to domains\n" unless Rails.env.test? - - d = Domain.where('delete_at <= ?', Time.zone.now) - d.each do |domain| - next unless domain.delete_candidateable? - domain.statuses << DomainStatus::DELETE_CANDIDATE - STDOUT << "#{Time.zone.now.utc} Domain.start_delete_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? - domain.save - end - - return if Rails.env.test? - STDOUT << "#{Time.zone.now.utc} - Successfully set delete_candidate to #{d.count} domains\n" - end - - # rubocop:disable Rails/FindEach - # rubocop:disable Metrics/AbcSize - def destroy_delete_candidates - STDOUT << "#{Time.zone.now.utc} - Destroying domains\n" unless Rails.env.test? - - c = 0 - Domain.where("statuses @> '{deleteCandidate}'::varchar[]").each do |x| - WhoisRecord.where(domain_id: x.id).destroy_all - destroy_with_message x - STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: by deleteCandidate ##{x.id} (#{x.name})\n" unless Rails.env.test? - - c += 1 - end - - Domain.where('force_delete_at <= ?', Time.zone.now).each do |x| - WhoisRecord.where(domain_id: x.id).destroy_all - destroy_with_message x - STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: by force delete time ##{x.id} (#{x.name})\n" unless Rails.env.test? - c += 1 - end - - STDOUT << "#{Time.zone.now.utc} - Successfully destroyed #{c} domains\n" unless Rails.env.test? - end # rubocop: enable Metrics/AbcSize # rubocop:enable Rails/FindEach # rubocop: enable Metrics/LineLength diff --git a/app/models/domain_cron.rb b/app/models/domain_cron.rb new file mode 100644 index 000000000..3fd09dc1f --- /dev/null +++ b/app/models/domain_cron.rb @@ -0,0 +1,98 @@ +class DomainCron + + def self.clean_expired_pendings + STDOUT << "#{Time.zone.now.utc} - Clean expired domain pendings\n" unless Rails.env.test? + + expire_at = Setting.expire_pending_confirmation.hours.ago + count = 0 + expired_pending_domains = Domain.where('registrant_verification_asked_at <= ?', expire_at) + expired_pending_domains.each do |domain| + unless domain.pending_update? || domain.pending_delete? || domain.pending_delete_confirmation? + msg = "#{Time.zone.now.utc} - ISSUE: DOMAIN #{domain.id}: #{domain.name} IS IN EXPIRED PENDING LIST, " \ + "but no pendingDelete/pendingUpdate state present!\n" + STDOUT << msg unless Rails.env.test? + next + end + count += 1 + if domain.pending_update? + domain.send_mail :pending_update_expired_notification_for_new_registrant + end + if domain.pending_delete? || domain.pending_delete_confirmation? + DomainMailer.pending_delete_expired_notification(domain.id, true).deliver + end + domain.clean_pendings! + unless Rails.env.test? + STDOUT << "#{Time.zone.now.utc} Domain.clean_expired_pendings: ##{domain.id} (#{domain.name})\n" + end + end + STDOUT << "#{Time.zone.now.utc} - Successfully cancelled #{count} domain pendings\n" unless Rails.env.test? + count + end + + def self.start_expire_period + STDOUT << "#{Time.zone.now.utc} - Expiring domains\n" unless Rails.env.test? + + domains = Domain.where('valid_to <= ?', Time.zone.now) + domains.each do |domain| + next unless domain.expirable? + domain.set_graceful_expired + DomainMailer.expiration_reminder(domain.id).deliver + STDOUT << "#{Time.zone.now.utc} Domain.start_expire_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? + domain.save + end + + STDOUT << "#{Time.zone.now.utc} - Successfully expired #{domains.count} domains\n" unless Rails.env.test? + end + + def self.start_redemption_grace_period + STDOUT << "#{Time.zone.now.utc} - Setting server_hold to domains\n" unless Rails.env.test? + + d = Domain.where('outzone_at <= ?', Time.zone.now) + d.each do |domain| + next unless domain.server_holdable? + domain.statuses << DomainStatus::SERVER_HOLD + STDOUT << "#{Time.zone.now.utc} Domain.start_redemption_grace_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? + domain.save + end + + STDOUT << "#{Time.zone.now.utc} - Successfully set server_hold to #{d.count} domains\n" unless Rails.env.test? + end + + def self.start_delete_period + STDOUT << "#{Time.zone.now.utc} - Setting delete_candidate to domains\n" unless Rails.env.test? + + d = Domain.where('delete_at <= ?', Time.zone.now) + d.each do |domain| + next unless domain.delete_candidateable? + domain.statuses << DomainStatus::DELETE_CANDIDATE + STDOUT << "#{Time.zone.now.utc} Domain.start_delete_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? + domain.save + end + + return if Rails.env.test? + STDOUT << "#{Time.zone.now.utc} - Successfully set delete_candidate to #{d.count} domains\n" + end + + def self.destroy_delete_candidates + STDOUT << "#{Time.zone.now.utc} - Destroying domains\n" unless Rails.env.test? + + c = 0 + Domain.where("statuses @> '{deleteCandidate}'::varchar[]").each do |x| + WhoisRecord.where(domain_id: x.id).destroy_all + destroy_with_message x + STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: by deleteCandidate ##{x.id} (#{x.name})\n" unless Rails.env.test? + + c += 1 + end + + Domain.where('force_delete_at <= ?', Time.zone.now).each do |x| + WhoisRecord.where(domain_id: x.id).destroy_all + destroy_with_message x + STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: by force delete time ##{x.id} (#{x.name})\n" unless Rails.env.test? + c += 1 + end + + STDOUT << "#{Time.zone.now.utc} - Successfully destroyed #{c} domains\n" unless Rails.env.test? + end + +end diff --git a/config/schedule.rb b/config/schedule.rb index 5524f10ab..81f11c341 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -31,7 +31,7 @@ if @cron_group == 'registry' # end every :day, at: '12:20am' do - runner 'Domain.clean_expired_pendings' + runner 'DomainCron.clean_expired_pendings' end every 3.hours do @@ -39,19 +39,19 @@ if @cron_group == 'registry' end every 42.minutes do - runner 'Domain.destroy_delete_candidates' + runner 'DomainCron.destroy_delete_candidates' end every 45.minutes do - runner 'Domain.start_expire_period' + runner 'DomainCron.start_expire_period' end every 50.minutes do - runner 'Domain.start_delete_period' + runner 'DomainCron.start_delete_period' end every 52.minutes do - runner 'Domain.start_redemption_grace_period' + runner 'DomainCron.start_redemption_grace_period' end end diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index 9dd0f1a48..cddb9141b 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -140,20 +140,20 @@ describe Domain do domain.registrant_verification_asked_at = 30.days.ago domain.pending_delete! - Domain.clean_expired_pendings.should == 1 + DomainCron.clean_expired_pendings.should == 1 domain.reload.pending_delete?.should == false domain.pending_json.should == {} end it 'should expire domains' do - Domain.start_expire_period + DomainCron.start_expire_period @domain.statuses.include?(DomainStatus::EXPIRED).should == false old_valid_to = Time.zone.now - 10.days @domain.valid_to = old_valid_to @domain.save - Domain.start_expire_period + DomainCron.start_expire_period @domain.reload @domain.statuses.include?(DomainStatus::EXPIRED).should == true @domain.outzone_at.should be_within(5).of(old_valid_to + Setting.expire_warning_period.days) @@ -161,7 +161,7 @@ describe Domain do old_valid_to + Setting.expire_warning_period.days + Setting.redemption_grace_period.days ) - Domain.start_expire_period + DomainCron.start_expire_period @domain.reload @domain.statuses.include?(DomainStatus::EXPIRED).should == true end @@ -173,7 +173,7 @@ describe Domain do @domain.outzone_at, @domain.delete_at = nil, nil @domain.save - Domain.start_expire_period + DomainCron.start_expire_period @domain.reload @domain.statuses.include?(DomainStatus::EXPIRED).should == true @domain.outzone_at.should be_within(5).of(old_valid_to + Setting.expire_warning_period.days) @@ -183,7 +183,7 @@ describe Domain do end it 'should start redemption grace period' do - Domain.start_redemption_grace_period + DomainCron.start_redemption_grace_period @domain.reload @domain.statuses.include?(DomainStatus::SERVER_HOLD).should == false @@ -191,20 +191,20 @@ describe Domain do @domain.statuses << DomainStatus::SERVER_MANUAL_INZONE # this prohibits server_hold @domain.save - Domain.start_redemption_grace_period + DomainCron.start_redemption_grace_period @domain.reload @domain.statuses.include?(DomainStatus::SERVER_HOLD).should == false @domain.statuses = [] @domain.save - Domain.start_redemption_grace_period + DomainCron.start_redemption_grace_period @domain.reload @domain.statuses.include?(DomainStatus::SERVER_HOLD).should == true end it 'should start delete period' do - Domain.start_delete_period + DomainCron.start_delete_period @domain.reload @domain.statuses.include?(DomainStatus::DELETE_CANDIDATE).should == false @@ -212,13 +212,13 @@ describe Domain do @domain.statuses << DomainStatus::SERVER_DELETE_PROHIBITED # this prohibits delete_candidate @domain.save - Domain.start_delete_period + DomainCron.start_delete_period @domain.reload @domain.statuses.include?(DomainStatus::DELETE_CANDIDATE).should == false @domain.statuses = [] @domain.save - Domain.start_delete_period + DomainCron.start_delete_period @domain.reload @domain.statuses.include?(DomainStatus::DELETE_CANDIDATE).should == true @@ -234,7 +234,7 @@ describe Domain do Domain.count.should == 2 - Domain.start_delete_period + DomainCron.start_delete_period Domain.destroy_delete_candidates Domain.count.should == 0 @@ -391,7 +391,7 @@ describe Domain do end it 'should start redemption grace period' do - Domain.start_redemption_grace_period + DomainCron.start_redemption_grace_period @domain.reload @domain.statuses.include?(DomainStatus::SERVER_HOLD).should == false @@ -399,14 +399,14 @@ describe Domain do @domain.statuses << DomainStatus::SERVER_MANUAL_INZONE # this prohibits server_hold @domain.save - Domain.start_redemption_grace_period + DomainCron.start_redemption_grace_period @domain.reload @domain.statuses.include?(DomainStatus::SERVER_HOLD).should == false @domain.statuses = [] @domain.save - Domain.start_redemption_grace_period + DomainCron.start_redemption_grace_period @domain.reload @domain.statuses.include?(DomainStatus::SERVER_HOLD).should == true end