diff --git a/app/jobs/nameserver_record_validation_job.rb b/app/jobs/nameserver_record_validation_job.rb index a3be73aaf..5d7994908 100644 --- a/app/jobs/nameserver_record_validation_job.rb +++ b/app/jobs/nameserver_record_validation_job.rb @@ -7,14 +7,18 @@ class NameserverRecordValidationJob < ApplicationJob def perform(domain_name: nil) if domain_name.nil? - domains = Domain.all.select { |domain| domain.nameservers.exists? }. - select { |domain| domain.created_at < Time.zone.now - 8.hours } + domains = Domain.all.select { |domain| domain.created_at < Time.zone.now - NameserverValidator::VALIDATION_DOMAIN_PERIOD } + .select { |domain| domain.nameservers.exists? } domains.each do |domain| domain.nameservers.each do |nameserver| + next if nameserver.nameserver_failed_validation? || nameserver.validated? + result = NameserverValidator.run(domain_name: domain.name, hostname: nameserver.hostname) if result[:result] + add_nameserver_to_succesfully(nameserver) + true else parse_result(result, nameserver) @@ -26,10 +30,16 @@ class NameserverRecordValidationJob < ApplicationJob domain = Domain.find_by(name: domain_name) return logger.info 'Domain not found' if domain.nil? - return logger.info 'It should take 8 hours after the domain was created' if domain.created_at > Time.zone.now - 8.hours + + if domain.created_at > Time.zone.now - NameserverValidator::VALIDATION_DOMAIN_PERIOD + return logger.info "It should take #{NameserverValidator::VALIDATION_DOMAIN_PERIOD} hours after the domain was created" + end + return logger.info 'Domain not has nameservers' if domain.nameservers.empty? domain.nameservers.each do |nameserver| + next if nameserver.nameserver_failed_validation? + result = NameserverValidator.run(domain_name: domain.name, hostname: nameserver.hostname) if result[:result] @@ -44,6 +54,14 @@ class NameserverRecordValidationJob < ApplicationJob private + def add_nameserver_to_succesfully(nameserver) + nameserver.validation_counter = nil + nameserver.failed_validation_reason = nil + nameserver.validation_datetime = Time.zone.now + + nameserver.save + end + def parse_result(result, nameserver) text = "" case result[:reason] diff --git a/app/models/nameserver.rb b/app/models/nameserver.rb index 75255eb89..20d4656c6 100644 --- a/app/models/nameserver.rb +++ b/app/models/nameserver.rb @@ -34,6 +34,8 @@ class Nameserver < ApplicationRecord delegate :name, to: :domain, prefix: true + scope :non_validated, -> { where(validation_datetime: nil) } + self.ignored_columns = %w[legacy_domain_id] def epp_code_map @@ -53,6 +55,18 @@ class Nameserver < ApplicationRecord } end + def nameserver_failed_validation? + return false if validation_counter.nil? + + validation_counter >= NameserverValidator::VALID_NAMESERVER_COUNT_THRESHOLD + end + + def validated? + return false if validation_datetime.nil? + + validation_datetime + NameserverValidator::VALIDATION_NAMESERVER_PERIOD > Time.zone.now + end + def to_s hostname end diff --git a/app/services/nameserver_validator.rb b/app/services/nameserver_validator.rb index 4fd3a7e55..319a8dc92 100644 --- a/app/services/nameserver_validator.rb +++ b/app/services/nameserver_validator.rb @@ -3,6 +3,10 @@ module NameserverValidator extend self + VALIDATION_NAMESERVER_PERIOD = 1.year.freeze + VALIDATION_DOMAIN_PERIOD = 8.hours.freeze + VALID_NAMESERVER_COUNT_THRESHOLD = 3 + def run(domain_name:, hostname:) validate(domain_name: domain_name, hostname: hostname) end