class Gitlab::QA::Component::Base
def add_network_alias(name)
def add_network_alias(name) @network_aliases.push(name) end
def assert_name!
def assert_name! raise 'Invalid instance name!' unless name end
def hostname
def hostname "#{name}.#{network}" end
def image
def image return self.class.const_get('DOCKER_IMAGE') if self.class.const_defined?('DOCKER_IMAGE') raise NotImplementedError, "#{self.class.name} must specify a docker image as DOCKER_IMAGE" end
def initialize
def initialize @docker = Docker::Engine.new @environment = {} @volumes = {} @network_aliases = [] self.exec_commands = [] end
def instance
def instance prepare start reconfigure wait_until_ready process_exec_commands yield self if block_given? ensure teardown end
def name
def name raise NotImplementedError, "#{self.class.name} must specify a default name" end
def prepare
def prepare prepare_docker_image prepare_network end
def prepare_docker_image
def prepare_docker_image return if Runtime::Env.skip_pull? pull end
def prepare_network
def prepare_network return if docker.network_exists?(network) docker.network_create(network) end
def process_exec_commands
def process_exec_commands exec_commands.each { |command| docker.exec(name, command) } end
def pull
def pull docker.pull(image, tag) end
def restart
def restart assert_name! docker.restart(name) end
def start # rubocop:disable Metrics/AbcSize
def start # rubocop:disable Metrics/AbcSize docker.run(image, tag) do |command| command << "-d" command << "--name #{name}" command << "--net #{network}" command << "--hostname #{hostname}" @volumes.to_h.each do |to, from| command.volume(to, from, 'Z') end command.volume(File.join(Runtime::Env.host_artifacts_dir, name, 'logs'), '/var/log/gitlab', 'Z') @environment.to_h.each do |key, value| command.env(key, value) end @network_aliases.to_a.each do |network_alias| command << "--network-alias #{network_alias}" end end end
def tag
def tag return self.class.const_get('DOCKER_IMAGE_TAG') if self.class.const_defined?('DOCKER_IMAGE_TAG') raise NotImplementedError, "#{self.class.name} must specify a docker image tag as DOCKER_IMAGE_TAG" end
def teardown
def teardown assert_name! return unless docker.running?(name) docker.stop(name) docker.remove(name) end