shad-go/distbuild/pkg/api
2020-04-17 19:41:14 +03:00
..
mock Finish distbuild/api 2020-04-04 19:21:47 +03:00
build.go Improve tests 2020-04-04 23:11:21 +03:00
build_client.go Place build tags 2020-04-05 16:24:48 +03:00
build_handler.go Place build tags 2020-04-05 16:24:48 +03:00
build_test.go Update readme 2020-04-17 19:41:14 +03:00
heartbeat.go Fix typos 2020-04-05 18:19:59 +03:00
heartbeat_client.go Place build tags 2020-04-05 16:24:48 +03:00
heartbeat_handler.go Place build tags 2020-04-05 16:24:48 +03:00
heartbeat_test.go Finish distbuild/api 2020-04-04 19:21:47 +03:00
README.md Update readme 2020-04-17 19:41:14 +03: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 сообщения описывающие прогресс сборки.
    • Первым сообщением в ответе Coordinator присылает buildID.
    • Тут можно было бы использовать websocket, но нас устраивает более простое решение.
  • POST /signal?build_id=12345 - посылает сигнал бегущему билду.

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

Замечания

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

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

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

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

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

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