98 lines
3.1 KiB
Go
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
|
|
}
|