Introduce the modifier YAML kind for delayed parent-level modify operations and generate dedicated Terraform resources with typed parameters. Keep modifier parameters out of the ordinary instance CRUD resource, register modifiers separately, and leave delete as a no-op until an inverse API payload is confirmed. Mark vcOrg and vcNsxt modify operations during YAML generation so the contract survives regeneration.
97 lines
3.2 KiB
Go
97 lines
3.2 KiB
Go
// generate_resources_v2 — главный генератор Terraform-провайдера Nubes.
|
|
//
|
|
// ⛔ ПОДЧИНЯЕТСЯ TOOLS/ARCHITECTURE.md — все правила генерации прописаны там.
|
|
//
|
|
// Пайплайн: YAML-спеки сервисов → Go-ресурсы + registry.go.
|
|
//
|
|
// На вход: resources_yaml/*.yaml (сгенерированы service_spec_gen из API).
|
|
// На выход: internal/resources_gen/*.go (CRUD-ресурсы, subresource'ы, registry).
|
|
//
|
|
// Три вида ресурсов:
|
|
// - instance → nubes_{service} (основной CRUD инстанса)
|
|
// - subresource → nubes_{service}_{sub} (пользователи, базы, ...)
|
|
// - action → ТОЛЬКО redeploy встроен как git_revision.
|
|
// restart/recovery/reconcile исключены (ARCHITECTURE.md).
|
|
|
|
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"resource-generator/internal/loader"
|
|
"resource-generator/internal/writers"
|
|
)
|
|
|
|
type serviceWriteErr struct {
|
|
kind string
|
|
name string
|
|
err error
|
|
}
|
|
|
|
func main() {
|
|
if err := run(); err != nil {
|
|
fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func run() error {
|
|
resourcesDir := strings.TrimSpace(os.Getenv("NUBES_RESOURCES_DIR"))
|
|
if resourcesDir == "" {
|
|
return fmt.Errorf("NUBES_RESOURCES_DIR is required — must point to generated/{stand}/resources_yaml/")
|
|
}
|
|
outDir := strings.TrimSpace(os.Getenv("NUBES_RESOURCES_GEN_DIR"))
|
|
if outDir == "" {
|
|
return fmt.Errorf("NUBES_RESOURCES_GEN_DIR is required — must point to generated/{stand}/go/")
|
|
}
|
|
|
|
instanceResources, subresources, actions, modifiers, err := loader.LoadSpecs(resourcesDir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var writeErrs []serviceWriteErr
|
|
|
|
for _, svc := range instanceResources {
|
|
if err := writers.WriteInstanceResource(outDir, svc); err != nil {
|
|
writeErrs = append(writeErrs, serviceWriteErr{kind: "instance", name: svc.Name, err: err})
|
|
}
|
|
}
|
|
for _, sr := range subresources {
|
|
if err := writers.WriteSubresource(outDir, sr); err != nil {
|
|
name := fmt.Sprintf("%s_%s", sr.ServiceName, sr.SubName)
|
|
writeErrs = append(writeErrs, serviceWriteErr{kind: "subresource", name: name, err: err})
|
|
}
|
|
}
|
|
for _, act := range actions {
|
|
if err := writers.WriteActionResource(outDir, act); err != nil {
|
|
name := fmt.Sprintf("%s_%s", act.ServiceName, act.ActionName)
|
|
writeErrs = append(writeErrs, serviceWriteErr{kind: "action", name: name, err: err})
|
|
}
|
|
}
|
|
for _, modifier := range modifiers {
|
|
if err := writers.WriteModifierResource(outDir, modifier); err != nil {
|
|
name := fmt.Sprintf("%s_%s", modifier.ServiceName, modifier.ModifierName)
|
|
writeErrs = append(writeErrs, serviceWriteErr{kind: "modifier", name: name, err: err})
|
|
}
|
|
}
|
|
|
|
if len(writeErrs) > 0 {
|
|
var b strings.Builder
|
|
b.WriteString("generation failed for one or more resources:\n")
|
|
for _, we := range writeErrs {
|
|
b.WriteString(fmt.Sprintf("- %s %s: %v\n", we.kind, we.name, we.err))
|
|
}
|
|
return errors.New(strings.TrimSpace(b.String()))
|
|
}
|
|
|
|
if err := writers.WriteRegistry(outDir, instanceResources, subresources, actions, modifiers); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|