Files
tf_provider/TOOLS/yaml-generator/main.go
T
“Naeel” dd56bcda83 refactor: restructure project — separate tools, config, generated, provider
TOOLS/        — generators + scripts + config + ARCHITECTURE.md
  ├── yaml-generator/    (code)
  ├── resource-generator/ (code)
  ├── docs-generator/    (code)
  ├── scripts/           (← devops/*.sh)
  ├── config/            (← devops/profiles/ + devops/config/)
  │   ├── test/          profile.env, services_list.txt, operation_timeouts.json
  │   ├── prod/
  │   └── dev/
  └── ARCHITECTURE.md    (← devops/ARCHITECTURE.md)

generated/    — pipeline output only (gitignored)
  ├── test/resources_yaml/, go/, docs/, provider_build/
  ├── prod/
  └── dev/

provider/     — code only, no generated files
  resources_yaml/        — DELETED (generated)
  internal/resources_gen/ — DELETED (generated)

devops/       — removed (replaced by TOOLS/scripts + TOOLS/config + generated/)

Generators now fail if NUBES_*_DIR not set (no defaults to provider/).
Provider requires pipeline to populate resources_gen/ before build.
2026-07-06 09:06:09 +04:00

97 lines
2.4 KiB
Go

// service_spec_gen — генератор YAML-спеков сервисов из API Nubes.
//
// Читает список сервисов, дёргает API, собирает операции/параметры/MAN,
// пишет один YAML на сервис в resources_yaml/.
package main
import (
"fmt"
"os"
"path/filepath"
"strings"
"gopkg.in/yaml.v3"
"yaml-generator/internal/client"
"yaml-generator/internal/config"
"yaml-generator/internal/normalize"
"yaml-generator/internal/spec"
"yaml-generator/internal/types"
)
func main() {
cfg, err := config.Load()
if err != nil {
panic(err)
}
cli := client.New(cfg.APIEndpoint, cfg.APIToken)
services := cfg.Services
if cfg.SingleServiceID > 0 {
services = []config.ServiceRef{{ID: cfg.SingleServiceID, Name: cfg.SingleServiceName}}
}
outputDir := cfg.OutputDir
if outputDir == "" {
panic("NUBES_OUTPUT_DIR is required — generated files must go to generated/{stand}/resources_yaml/")
}
if err := spec.ValidateOutputDir(outputDir); err != nil {
panic(err)
}
if err := os.MkdirAll(outputDir, 0o755); err != nil {
panic(err)
}
for _, svc := range services {
if svc.ID <= 0 {
continue
}
info, err := cli.GetService(svc.ID)
if err != nil {
fmt.Fprintf(os.Stderr, "WARNING: service %d (%s) skipped: %v\n", svc.ID, svc.Name, err)
continue
}
name := strings.TrimSpace(svc.Name)
if name == "" {
name = strings.TrimSpace(info.ShortName)
}
if name == "" {
name = strings.TrimSpace(info.DisplayName)
}
name = normalize.ServiceName(name)
if name == "" {
name = fmt.Sprintf("service_%d", svc.ID)
}
ops, hasSuspend, _, _, err := cli.CollectOperations(info.Operations)
if err != nil {
panic(err)
}
specYAML := types.ServiceSpec{
Name: name,
ServiceID: svc.ID,
ServiceDisplayName: strings.TrimSpace(info.DisplayName),
ServiceShortName: strings.TrimSpace(info.ShortName),
ServiceMan: strings.TrimSpace(info.Man),
Lifecycle: types.Lifecycle{
SuspendOnDestroyDefault: hasSuspend,
AdoptExistingOnCreateDefault: false,
},
Outputs: types.OutputSection{Params: spec.DefaultOutputParams()},
Operations: ops,
}
outPath := filepath.Join(outputDir, fmt.Sprintf("%d_%s.yaml", svc.ID, name))
buf, err := yaml.Marshal(specYAML)
if err != nil {
panic(err)
}
if err := os.WriteFile(outPath, buf, 0o644); err != nil {
panic(err)
}
fmt.Printf("written %s\n", outPath)
}
}