shad-go/distbuild/pkg/api
2024-06-05 20:36:34 +03:00
..
mock Updated to the most recent version, which uses go 1.22 2024-06-05 20:36:34 +03:00
build.go Updated to the most recent version, which uses go 1.22 2024-06-05 20:36:34 +03:00
build_client.go Updated to the most recent version, which uses go 1.22 2024-06-05 20:36:34 +03:00
build_handler.go go fix old build tags. 2022-03-15 23:49:56 +03:00
build_test.go Updated to the most recent version, which uses go 1.22 2024-06-05 20:36:34 +03:00
heartbeat.go Updated to the most recent version, which uses go 1.22 2024-06-05 20:36:34 +03:00
heartbeat_client.go go fix old build tags. 2022-03-15 23:49:56 +03:00
heartbeat_handler.go go fix old build tags. 2022-03-15 23:49:56 +03:00
heartbeat_test.go Updated to the most recent version, which uses go 1.22 2024-06-05 20:36:34 +03:00
README.md Cleanup distbuild 2023-04-26 16:29:27 +04:00

api

Пакет api реализует протокол, по которому общаются компоненты системы.

Этот пакет не занимается передачей файлов и артефактов, соответствующие функции находятся в пакетах filecache и artifact.

Worker <-> Coordinator

  • Worker и Coordinator общаются через один запрос POST /heartbeat.
  • Worker посылает HeartbeatRequest и получает в ответ HeartbeatResponse.
  • Запрос и ответ передаются в формате json.
  • Ошибка обработки heartbeat передаётся как текстовая строка.

Client <-> Coordinator

Client и Coordinator общаются через два вызова.

  • POST /build - стартует новый билд.

    • Client посылает в Body запроса json c описанием сборки.
    • Coordinator стримит в body ответа json сообщения, описывающие прогресс сборки.
    • Тут можно было бы использовать websocket, но нас устраивает более простое решение.
    • Чтобы послать клиенту неполный body, нужно использовать метод Flush. Прочитайте про http.ResponseController и используйте его.
    • Первым сообщением в ответе Coordinator присылает buildID.
  • POST /signal?build_id=12345 - посылает сигнал бегущему билду.

    • Запрос и ответ передаются в формате json.

Замечания

  • Конструкторы клиентов и хендлеров принимают первым параметром *zap.Logger. Запишите в лог события получения/отправки запроса и все ошибки. Это поможет вам отлаживать интеграционные тесты в следующей части задания.

  • Все методы должны "пробрасывать" контекст.

    • Контекст на клиенте нужно передать в функцию http.NewRequestWithContext.
    • Контекст на сервере нужно получить из r.Context() и передать в Service.
  • Код в этом пакете не должен запускать новые горутины.

  • Ошибку из Service.StartBuild нужно посылать клиенту. Если эта ошибка произошла после того, как хендлер начал писать body, то ошибку нужно передавать в потоке json-ов в поле StatusUpdate.BuildFailed.

  • Код всех вызовов в этом пакете работает одинаково:

    1. Пользователь вызывает метод *Client.
    2. Метод делает HTTP запрос к серверу.
    3. *Handler принимает запрос, декодирует его и передает в *Service.
    4. (*) В случае вызова /build, сервис пишет обновления в StatusWriter, а клиентский код читает эти обновления из StatusReader.
    5. Ответ или ошибка из *Service возвращается пользователю.