nicholasjackson/minke

View on GitHub
lib/minke/docker/docker_compose.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Minke
  module Docker
    class DockerComposeFactory
      def initialize system_runner, project_name, docker_network = nil
        @project_name = project_name
        @system_runner = system_runner
        @docker_network = docker_network
      end

      def create compose_file
        Minke::Docker::DockerCompose.new compose_file, @system_runner, @project_name, @docker_network
      end
    end

    class DockerCompose
      @compose_file = nil

      def initialize compose_file, system_runner, project_name, docker_network = nil
        @project_name = project_name
        @compose_file = compose_file
        @system_runner = system_runner
        @docker_network = docker_network ||= 'bridge'
      end

      ##
      # start the containers in a stack defined by the docker compose file
      def up
        execute_command "up -d"
        sleep 2
      end

      ##
      # stop the containers in a stack and removes them as defined by the docker compose file
      def down
        execute_command "down -v"
      end

      ##
      # remove the containers started in a stack defined by the docker compose file
      def rm
        execute_command 'rm -v' unless ::Docker.info["Driver"] == "btrfs"
      end

      ##
      # stream the logs for the current running stack
      def logs
        execute_command 'logs -f'
      end

      def execute_command command
        hash = create_compose

        unless @docker_network == nil
          hash.merge!(create_compose_network)
        end

        directory = File.dirname(@compose_file)

        temp_file = directory + '/tmp_docker-compose.yml'
        @system_runner.write_file temp_file, YAML.dump(hash)

        ex = "docker-compose -f #{temp_file} -p #{@project_name} #{command}"

        @system_runner.execute ex
        @system_runner.remove_entry_secure temp_file
      end

      def create_compose_network
        { 'networks' => {'default' => { 'external' => { 'name' => @docker_network } } } }
      end

      def services 
        create_compose['services']
      end

      def create_compose
        existing = YAML.load(File.read(@compose_file))
        services = {}

        existing['services'].keys.each do |key|
          newservice = existing['services'][key].merge({'external_links' => ["#{@project_name}_consul_1:consul"]})
          services[key] = newservice
        end

        compose = { 'version' => 2.to_s, 'services' => services }

        compose
      end

    end
  end
end