lib/gdk/port_manager.rb (94 lines of code) (raw):

# frozen_string_literal: true require 'socket' require 'timeout' require_relative '../gdk' module GDK class PortManager ServiceUnknownError = Class.new(StandardError) PortAlreadyAllocated = Class.new(StandardErrorWithMessage) PortInUseError = Class.new(StandardError) DEFAULT_PORTS_FOR_SERVICES = { 1313 => 'docs_gitlab_com', 2222 => 'sshd', 3000 => 'gdk', 3010 => 'gitlab_pages', 3038 => 'vite', 3333 => 'workhorse', 3444 => 'smartcard_nginx', 3807 => 'sidekiq_exporter', 3808 => 'webpack', 3907 => 'sidekiq_health_check', 4000 => 'grafana', 5100 => 'registry', 5052 => 'gitlab_ai_gateway', 5431 => 'postgresql_geo', 5432 => 'postgresql', 6000 => 'redis_cluster_dev_1', 6001 => 'redis_cluster_dev_2', 6002 => 'redis_cluster_dev_3', 6003 => 'redis_cluster_test_1', 6004 => 'redis_cluster_test_2', 6005 => 'redis_cluster_test_3', 6060 => 'gitlab-zoekt-indexer-test', 6070 => 'gitlab-zoekt-webserver-test', 6080 => 'gitlab-zoekt-indexer-development-1', 6081 => 'gitlab-zoekt-indexer-development-2', 6090 => 'gitlab-zoekt-webserver-development-1', 6091 => 'gitlab-zoekt-webserver-development-2', 6432 => 'pgbouncer_replica-1', 6433 => 'pgbouncer_replica-2', 6434 => 'pgbouncer_replica-2-1', 6435 => 'pgbouncer_replica-2-2', 8065 => 'mattermost', 8080 => 'nginx', 8082 => 'gitlab_ai_gateway_exporter', 8100 => 'vault_proxy', 8123 => 'clickhouse_http', 8200 => 'vault', 8201 => 'openbao_cluster', 9000 => 'object_store', 9001 => 'clickhouse_tcp', 9002 => 'object_store_console', 9009 => 'clickhouse_interserver', 9090 => 'prometheus', 9091 => 'snowplow_micro', 9095 => 'gitlab_topology_service_grpc', 9096 => 'gitlab_topology_service_rest', 9122 => 'gitlab_shell_exporter', 9229 => 'workhorse_exporter', 9236 => 'gitaly_exporter', 9393 => 'gitlab_http_router', 10101 => 'praefect_exporter', 50052 => 'duo-workflow-service' }.freeze attr_reader :claimed_ports_and_services def initialize(config:) @claimed_ports_and_services = {} @config = config @port_offset = config[:port_offset] end def claim(port, service_name) existing_service_name = claimed_service_for_port(port) if existing_service_name return true if existing_service_name == service_name raise PortAlreadyAllocated, "Port #{port} is already allocated for service '#{existing_service_name}'" end claimed_ports_and_services[port] = service_name true end def claimed_service_for_port(port) claimed_ports_and_services[port] end def default_port_for_service(name) services = DEFAULT_PORTS_FOR_SERVICES.to_a index = services.index { |service| service[1] == name } raise ServiceUnknownError, "Service '#{name}' is unknown, please add to GDK::PortManager::DEFAULT_PORTS_FOR_SERVICES" unless index if @port_offset.positive? @port_offset + index else services[index][0] end end private attr_writer :claimed_ports_and_services end end