lib/gdk/services.rb (54 lines of code) (raw):

# frozen_string_literal: true module GDK # Services module contains individual service classes (e.g. Redis) that # are responsible for producing the correct command line to execute and # if the service should in fact be executed. # module Services # This are the classes in Services modules that are used as base classes for services SERVICE_BASE_CLASSES = %i[ Base Legacy InvalidEnvironmentKeyError ].freeze # Return a list of class names that represent a Service # # @return [Array<Symbol>] array of class names exposing a service def self.all_service_names ::GDK::Services.constants.select { |c| ::GDK::Services.const_get(c).is_a? Class } - SERVICE_BASE_CLASSES end # Returns an Array of all services, including enabled and not # enabled. # # @return [Array<Class>] all services def self.all all_service_names.map do |const| const_get(const).new end end # Return the service that matches the given name # # @param [Symbol|String] name # @return [::GDK::Services::Base|nil] service instance def self.fetch(name) service = all_service_names.find { |srv| srv == name.to_sym } return unless service const_get(service).new end # Returns an Array of enabled services only. # # @return [Array<Class>] enabled services def self.enabled all.select(&:enabled?) end # Returns an Array of legacy services defined in +Procfile+. # # @return [Array<Class>] legacy services def self.legacy Legacy.new(GDK.root).all end # Legacy services. # # @deprecated This class will be removed when all services have been converted to GDK::Services # @see https://gitlab.com/gitlab-org/gitlab-development-kit/-/issues/904 class Legacy Mock = Struct.new(:name, :command, :enabled, :env) do alias_method :enabled?, :enabled end def initialize(gdk_root) @procfile_path = gdk_root.join('Procfile') end # Load a list of services from Procfile def all return [] unless @procfile_path.exist? @procfile_path.readlines.filter_map do |line| line.chomp! name, command = line.split(': ', 2) next unless name && command commented = name.sub!(/^\s*#\s*/, '') delete_exec_prefix!(name, command) Mock.new(name, command, !commented, {}) end end private def delete_exec_prefix!(service, command) exec_prefix = 'exec ' abort "fatal: Procfile command for service #{service} does not start with 'exec'" unless command.start_with?(exec_prefix) command.delete_prefix!(exec_prefix) end end private_constant :Legacy end end