class Gitlab::QA::Component::MockServer


see: smocker.dev/
General purpose http mock server

def alpine_service_container

Returns:
  • (Component::Alpine) -
def alpine_service_container
  @alpine_service_container ||= Alpine.new.tap do |alpine|
    alpine.volumes = tls_volume
    alpine.network = network
  end
end

def initialize

def initialize
  super
  @tls = false
  @name = "smocker"
  @tls_path = "/etc/smocker/tls"
  @ports = [80, 8081]
  @environment = { "SMOCKER_MOCK_SERVER_LISTEN_PORT" => 80 }
  @tls_volume = { "smocker-ssl" => @tls_path }
end

def poll_mock_healthcheck(max_tries)

Returns:
  • (void) -

Parameters:
  • max_tries (Integer) --
def poll_mock_healthcheck(max_tries)
  url = "#{tls ? 'https' : 'http'}://#{hostname}:8081/version"
  curl_cmd = "curl --cacert #{tls_path}/smocker.crt -s -f -o /dev/null -w '%{http_code}' #{url}"
  tries = 0
  loop do
    # Poll healthcheck endpoint and remove service container if it passes
    if docker.exec(alpine_service_container.name, curl_cmd, shell: "sh")
      alpine_service_container.teardown!
      break
    end
  rescue Support::ShellCommand::StatusError => e
    # re-raise StatusError so that built in startup retry is used in case of failure
    raise e if tries >= max_tries
    tries += 1
    sleep 1
  end
end

def prepare

def prepare
  super
  alpine_service_container.start_instance
  setup_tls if tls
end

def setup_tls

Returns:
  • (void) -
def setup_tls
  @volumes = tls_volume
  @ports = [443, 8081]
  @environment = {
    "SMOCKER_MOCK_SERVER_LISTEN_PORT" => 443,
    "SMOCKER_TLS_ENABLE" => "true",
    "SMOCKER_TLS_CERT_FILE" => "#{tls_path}/smocker.crt",
    "SMOCKER_TLS_PRIVATE_KEY_FILE" => "#{tls_path}/smocker.key"
  }
  docker.copy(alpine_service_container.name, "#{CERTIFICATES_PATH}/smocker/.", tls_path)
end

def teardown!

def teardown!
  # Print smocker log output by using docker logs command because smocker only logs to stdout
  Docker::Command.execute("logs #{name}")
  # Remove alpine service container
  alpine_service_container.teardown!
  super
end

def wait_until_ready

Returns:
  • (void) -
def wait_until_ready
  logger.info("Waiting for mock server to start!")
  poll_mock_healthcheck(3)
  logger.info("Mock server container is healthy!")
end