class Longleaf::ServiceCandidateFilesystemIterator

Iterator for getting file candidates which have services which need to be run. Implementation uses metadata files directly from the filesystem for determinations about service status.

Public Class Methods

new(file_selector, event, app_config, force = false) click to toggle source
# File lib/longleaf/candidates/service_candidate_filesystem_iterator.rb, line 14
def initialize(file_selector, event, app_config, force = false)
  @file_selector = file_selector
  @event = event
  @app_config = app_config
  @force = force
end

Public Instance Methods

each() { |file_rec| ... } click to toggle source

Iterate through the candidates in this object and execute the provided block with each candidate. A block is required.

# File lib/longleaf/candidates/service_candidate_filesystem_iterator.rb, line 49
def each
  file_rec = next_candidate
  until file_rec.nil?
    yield file_rec

    file_rec = next_candidate
  end
end
next_candidate() click to toggle source

Get the file record for the next candidate which needs services run which match the provided file_selector @return [FileRecord] file record of the next candidate with services needing to be run, or nil if there are no more candidates.

# File lib/longleaf/candidates/service_candidate_filesystem_iterator.rb, line 25
def next_candidate
  loop do
    next_path = @file_selector.next_path
    return nil if next_path.nil?

    logger.debug("Evaluating candidate #{next_path}")
    storage_loc = @app_config.location_manager.get_location_by_path(next_path)
    file_rec = FileRecord.new(next_path, storage_loc)

    # Skip over unregistered files
    if !file_rec.metadata_present?
      logger.debug("Ignoring unregistered file #{next_path}")
      next
    end

    @app_config.md_manager.load(file_rec)

    # Return the file record if it needs any services run
    return file_rec if needs_run?(file_rec)
  end
end

Private Instance Methods

needs_run?(file_rec) click to toggle source

Returns true if the file record contains any services which need to be run

# File lib/longleaf/candidates/service_candidate_filesystem_iterator.rb, line 60
def needs_run?(file_rec)
  md_rec = file_rec.metadata_record
  storage_loc = file_rec.storage_location
  service_manager = @app_config.service_manager

  # File is not a valid candidate for services if it is deregistered, unless performing cleanup
  if @event != EventNames::CLEANUP && md_rec.deregistered?
    logger.debug("Skipping deregistered file: #{file_rec.path}")
    return false
  end

  expected_services = service_manager.list_services(
      location: storage_loc.name,
      event: @event)

  # When in force mode, candidate needs a run as long as there are any services configured for it.
  if @force && !expected_services.empty?
    logger.debug("Forcing run needed for file: #{file_rec.path}")
    return true
  end

  expected_services.each do |service_name|
    if service_manager.service_needed?(service_name, md_rec)
      logger.debug("Service #{service_name} needed for file: #{file_rec.path}")
      return true
    end
  end

  logger.debug("Run not needed for file: #{file_rec.path}")
  # No services needed to be run for this file
  false
end