class Kontrast::GlobalRunner

Public Class Methods

new() click to toggle source
# File lib/kontrast/global_runner.rb, line 7
def initialize
    @page_runner = PageRunner.new
    @api_endpont_runner = ApiEndpointRunner.new
    @path = Kontrast.path
    @current_node = 0
end

Public Instance Methods

create_manifest() click to toggle source

The manifest is a per-node .json file that is used to create the gallery without having to download all assets from S3 to the test environment

# File lib/kontrast/global_runner.rb, line 37
def create_manifest
    # Create manifest
    puts "Creating manifest..."
    if Kontrast.configuration.run_parallel
        build = Kontrast.configuration.remote_path
    else
        build = nil
    end

    diffs = {}
    diffs.merge!(@page_runner.diffs)
    diffs.merge!(@api_endpont_runner.diffs)

    # Set up structure
    manifest = {
        diffs: diffs,
        files: []
    }

    # Dump directories
    Dir.foreach(@path) do |subdir|
        next if ['.', '..'].include?(subdir)
        next if subdir.index('manifest_')
        Dir.foreach("#{@path}/#{subdir}") do |img|
            next if ['.', '..'].include?(img)
            manifest[:files] << "#{subdir}/#{img}"
        end
    end

    if Kontrast.configuration.run_parallel
        # Upload manifest
        Kontrast.fog.directories.get(Kontrast.configuration.aws_bucket).files.create(
            key: "#{build}/manifest_#{@current_node}.json",
            body: manifest.to_json
        )
    else
        # Write manifest
        File.open("#{@path}/manifest_#{@current_node}.json", 'w') do |outf|
            outf.write(manifest.to_json)
        end
    end

    return manifest
end
run() click to toggle source
# File lib/kontrast/global_runner.rb, line 14
def run
    # Make sure the local server is running
    wait_for_server

    # Assign nodes
    if Kontrast.configuration.run_parallel
        total_nodes = Kontrast.configuration.total_nodes
        @current_node = Kontrast.configuration.current_node
    else
        # Override the config for local use
        total_nodes = 1
    end

    # Run both runners
    @page_runner.run(total_nodes, @current_node)
    @api_endpont_runner.run(total_nodes, @current_node)

    # Create manifest
    create_manifest
end

Private Instance Methods

wait_for_server() click to toggle source
# File lib/kontrast/global_runner.rb, line 83
def wait_for_server
    # Test server
    tries = 30
    uri = URI(Kontrast.configuration.test_domain)
    begin
        Net::HTTP.get(uri)
    rescue Errno::ECONNREFUSED, EOFError => e
        tries -= 1
        if tries > 0
            puts "Waiting for test server..."
            sleep 2
            retry
        else
            raise RunnerException.new("Could not reach the test server at '#{uri}'.")
        end
    rescue StandardError => e
        raise RunnerException.new("An unexpected error occured while trying to reach the test server at '#{uri}': #{e.inspect}")
    end

    # Production server
    tries = 30
    uri = URI(Kontrast.configuration.production_domain)
    begin
        Net::HTTP.get(uri)
    rescue Errno::ECONNREFUSED => e
        tries -= 1
        if tries > 0
            puts "Waiting for production server..."
            sleep 2
            retry
        else
            raise RunnerException.new("Could not reach the production server at '#{uri}'.")
        end
    rescue StandardError => e
        raise RunnerException.new("An unexpected error occured while trying to reach the production server at '#{uri}': #{e.inspect}")
    end
end