Files
omnichannel-configserver-mcp/internal/configserver/api_release.go
T
2026-10-07 20:13:23 +07:00

98 lines
3.1 KiB
Go

package configserver
import (
"context"
"encoding/json"
)
// api_release.go — страница «Развёртывание»: файлы схемы, seed/fill, релиз.
// DeploymentUpdate — частичное обновление файлов развёртывания. nil-поля не
// отправляются (сервер не перезаписывает их пустыми значениями).
type DeploymentUpdate struct {
Schema *string
Manifest *string
PrebuildVars *string
IPOverrides *string
}
// SaveDeploymentFiles сохраняет schema/manifest/prebuild_vars/ip_overrides.
func (a *API) SaveDeploymentFiles(ctx context.Context, upd DeploymentUpdate) (*StatusAck, error) {
ctx, cancel := a.withTimeout(ctx)
defer cancel()
body := map[string]string{}
if upd.Schema != nil {
body["schema"] = *upd.Schema
}
if upd.Manifest != nil {
body["manifest"] = *upd.Manifest
}
if upd.PrebuildVars != nil {
body["prebuild_vars"] = *upd.PrebuildVars
}
if upd.IPOverrides != nil {
body["ip_overrides"] = *upd.IPOverrides
}
out := &StatusAck{}
if err := a.Sess.postJSON(ctx, "/api/deployment/files", body, out); err != nil {
return nil, err
}
return out, nil
}
// SeedHosts создаёт хосты из schema.json.
func (a *API) SeedHosts(ctx context.Context) (*SeedHostsAck, error) {
ctx, cancel := a.withTimeout(ctx)
defer cancel()
out := &SeedHostsAck{}
if err := a.Sess.postJSON(ctx, "/api/deployment/seed_hosts", nil, out); err != nil {
return nil, err
}
return out, nil
}
// FillVars заполняет prebuild_vars из схемы (ответ — произвольный JSON).
func (a *API) FillVars(ctx context.Context) (json.RawMessage, error) {
ctx, cancel := a.withTimeout(ctx)
defer cancel()
var out json.RawMessage
if err := a.Sess.postJSON(ctx, "/api/deployment/fill_vars", nil, &out); err != nil {
return nil, err
}
return out, nil
}
// DownloadRelease запускает загрузку релиза. При load_images=true сервер
// отвечает сразу (фоновая задача), прогресс читается через ReleaseJob.
func (a *API) DownloadRelease(ctx context.Context, token string, loadImages bool) (*DownloadReleaseAck, error) {
if token == "" {
token = a.Srv.GitlabToken
}
body := map[string]any{"load_images": loadImages}
if token != "" {
body["gitlab_token"] = token
}
// Синхронная выгрузка (load_images=false) может быть долгой.
ctx, cancel := a.withUploadTimeout(ctx)
defer cancel()
out := &DownloadReleaseAck{}
if err := a.Sess.postJSON(ctx, "/api/deployment/download_release", body, out); err != nil {
return nil, err
}
return out, nil
}
// StartServices создаёт задачи запуска сервисов для хостов из схемы.
func (a *API) StartServices(ctx context.Context) (*StartServicesAck, error) {
ctx, cancel := a.withTimeout(ctx)
defer cancel()
out := &StartServicesAck{}
if err := a.Sess.postJSON(ctx, "/api/deployment/start_services", nil, out); err != nil {
return nil, err
}
return out, nil
}