ManageIQ/floe

View on GitHub
lib/floe/container_runner.rb

Summary

Maintainability
A
35 mins
Test Coverage
F
45%
# frozen_string_literal: true

require_relative "container_runner/docker_mixin"
require_relative "container_runner/docker"
require_relative "container_runner/kubernetes"
require_relative "container_runner/podman"

module Floe
  class ContainerRunner
    class << self
      def cli_options(optimist)
        optimist.banner("")
        optimist.banner("Container runner options:")

        optimist.opt :container_runner, "Type of runner for docker container images (docker, podman, or kubernetes)", :type => :string, :short => 'r'
        optimist.opt :container_runner_options, "Options to pass to the container runner", :type => :strings, :short => 'o'

        optimist.opt :docker,     "Use docker to run container images     (short for --container-runner=docker)",     :type => :boolean
        optimist.opt :podman,     "Use podman to run container images     (short for --container-runner=podman)",     :type => :boolean
        optimist.opt :kubernetes, "Use kubernetes to run container images (short for --container-runner=kubernetes)", :type => :boolean
      end

      def resolve_cli_options!(opts)
        # shortcut support
        opts[:container_runner] ||= "docker" if opts[:docker]
        opts[:container_runner] ||= "podman" if opts[:podman]
        opts[:container_runner] ||= "kubernetes" if opts[:kubernetes]

        runner_options = opts[:container_runner_options].to_h { |opt| opt.split("=", 2) }

        begin
          set_runner(opts[:container_runner], runner_options)
        rescue ArgumentError => e
          Optimist.die(:container_runner, e.message)
        end
      end

      def runner
        @runner || set_runner(nil)
      end

      def set_runner(name_or_instance, options = {})
        @runner =
          case name_or_instance
          when "docker", nil
            Floe::ContainerRunner::Docker.new(options)
          when "podman"
            Floe::ContainerRunner::Podman.new(options)
          when "kubernetes"
            Floe::ContainerRunner::Kubernetes.new(options)
          when Floe::Runner
            name_or_instance
          else
            raise ArgumentError, "container runner must be one of: docker, podman, kubernetes"
          end
      end
    end
  end
end

Floe::Runner.register_scheme("docker", -> { Floe::ContainerRunner.runner })