From dc9134e515f3aa4702fb74dc8ee41a9318c19d68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Fri, 17 Jul 2026 11:59:56 +0400 Subject: [PATCH] feat: parameterize provider address and source for multi-stand (DEV/TEST/PROD) support --- .../docs-generator/internal/writers/writers.go | 18 +++++++++--------- TOOLS/docs-generator/main.go | 4 +++- TOOLS/scripts/build-provider.sh | 2 +- provider/main.go | 5 +++-- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/TOOLS/docs-generator/internal/writers/writers.go b/TOOLS/docs-generator/internal/writers/writers.go index ec09f28..ab7b4a6 100644 --- a/TOOLS/docs-generator/internal/writers/writers.go +++ b/TOOLS/docs-generator/internal/writers/writers.go @@ -19,12 +19,12 @@ import ( var CloudOutputByServiceID = map[int]types.CloudOutputSnapshot{} // ResourceDocs генерирует полный набор .md файлов для одного сервиса. -func ResourceDocs(docsDir string, spec types.ServiceSpec, version string, apiEndpoint string) { +func ResourceDocs(docsDir string, spec types.ServiceSpec, version string, apiEndpoint string, providerSource string) { base := spec.Name nav := fmt.Sprintf("[Manual](%s.md) | [Create params](%s_params_create.md) | [Modify params](%s_params_modify.md) | [Output params](%s_outputs.md) | [Operations](%s_ops.md) | [Example](%s_example.md)", base, base, base, base, base, base) WriteFile(filepath.Join(docsDir, base+".md"), buildManualPage(spec, nav)) - WriteFile(filepath.Join(docsDir, base+"_example.md"), buildExamplePage(spec, nav, version, apiEndpoint)) + WriteFile(filepath.Join(docsDir, base+"_example.md"), buildExamplePage(spec, nav, version, apiEndpoint, providerSource)) WriteFile(filepath.Join(docsDir, base+"_params_create.md"), buildCreateParamsPage(spec, nav)) WriteFile(filepath.Join(docsDir, base+"_params_modify.md"), buildModifyParamsPage(spec, nav)) WriteFile(filepath.Join(docsDir, base+"_outputs.md"), buildOutputsPage(spec, nav)) @@ -36,7 +36,7 @@ func ResourceDocs(docsDir string, spec types.ServiceSpec, version string, apiEnd srNav := fmt.Sprintf("[%s (основной)](%s.md) | [Operations](%s_ops.md) | [%s](%s.md) | [Example](%s_example.md)", spec.ServiceDisplayName, base, base, Capitalize(srName), srBase, srBase) WriteFile(filepath.Join(docsDir, srBase+".md"), buildSubresourcePage(spec, srName, srNav)) - WriteFile(filepath.Join(docsDir, srBase+"_example.md"), buildSubresourceExamplePage(spec, srName, srNav, version, apiEndpoint)) + WriteFile(filepath.Join(docsDir, srBase+"_example.md"), buildSubresourceExamplePage(spec, srName, srNav, version, apiEndpoint, providerSource)) } } @@ -178,12 +178,12 @@ func htmlToMarkdown(s string) string { return strings.TrimSpace(s) } -func buildExamplePage(spec types.ServiceSpec, nav, version string, apiEndpoint string) string { +func buildExamplePage(spec types.ServiceSpec, nav, version string, apiEndpoint string, providerSource string) string { var b strings.Builder b.WriteString(buildHeader(spec, nav)) b.WriteString(fmt.Sprintf("## Copy-ready manifest (`%s_main.tf`)\n\n", spec.Name)) b.WriteString("```hcl\n") - b.WriteString(exampleBlock(spec, version, apiEndpoint)) + b.WriteString(exampleBlock(spec, version, apiEndpoint, providerSource)) b.WriteString("```\n\n") b.WriteString("## Outputs usage\n\n") b.WriteString("```hcl\n") @@ -200,7 +200,7 @@ func buildExamplePage(spec types.ServiceSpec, nav, version string, apiEndpoint s return b.String() } -func exampleBlock(spec types.ServiceSpec, version string, apiEndpoint string) string { +func exampleBlock(spec types.ServiceSpec, version string, apiEndpoint string, providerSource string) string { createParams := FindParams(spec.Operations, "create") requiredParams, defaultParams := SplitParams(createParams) @@ -208,7 +208,7 @@ func exampleBlock(spec types.ServiceSpec, version string, apiEndpoint string) st b.WriteString("terraform {\n") b.WriteString(" required_providers {\n") b.WriteString(" nubes = {\n") - b.WriteString(" source = \"registry.kube5s.ru/nubes-test/nubes\"\n") + b.WriteString(fmt.Sprintf(" source = \"%s\"\n", providerSource)) b.WriteString(fmt.Sprintf(" version = \"%s\"\n", version)) b.WriteString(" }\n") b.WriteString(" }\n") @@ -452,7 +452,7 @@ func buildSubresourcePage(spec types.ServiceSpec, srName string, nav string) str return b.String() } -func buildSubresourceExamplePage(spec types.ServiceSpec, srName string, nav string, version string, apiEndpoint string) string { +func buildSubresourceExamplePage(spec types.ServiceSpec, srName string, nav string, version string, apiEndpoint string, providerSource string) string { var b strings.Builder srResourceName := fmt.Sprintf("nubes_%s_%s", spec.Name, Slug(srName)) b.WriteString(fmt.Sprintf("# Resource %s — Example\n\n", srResourceName)) @@ -464,7 +464,7 @@ func buildSubresourceExamplePage(spec types.ServiceSpec, srName string, nav stri b.WriteString("terraform {\n") b.WriteString(" required_providers {\n") b.WriteString(" nubes = {\n") - b.WriteString(" source = \"registry.kube5s.ru/nubes-test/nubes\"\n") + b.WriteString(fmt.Sprintf(" source = \"%s\"\n", providerSource)) b.WriteString(fmt.Sprintf(" version = \"%s\"\n", version)) b.WriteString(" }\n") b.WriteString(" }\n") diff --git a/TOOLS/docs-generator/main.go b/TOOLS/docs-generator/main.go index d701f64..946514f 100644 --- a/TOOLS/docs-generator/main.go +++ b/TOOLS/docs-generator/main.go @@ -27,6 +27,7 @@ func main() { // ⛔ LEGACY DEFAULT (index.cfm) — переопределяется через NUBES_API_ENDPOINT в profile.env. // Никогда не использовать deck-api.ngcloud.ru напрямую. apiEndpointFlag := flag.String("api-endpoint", "https://lk-api-gateway.ngcloud.ru/api/v1/svc", "API endpoint for example block") + providerSourceFlag := flag.String("provider-source", "registry.kube5s.ru/nubes-dev/nubes", "Provider source for example block") opsFlag := flag.Bool("ops", false, "Generate per-service operations docs (resources_ops_yaml → docs/.../operations)") flag.Parse() @@ -51,6 +52,7 @@ func main() { panic("--version is required") } apiEndpoint := *apiEndpointFlag + providerSource := *providerSourceFlag servicesOrder := loadServicesList(servicesList) specs := loadSpecs(resourcesDir, servicesOrder) @@ -69,7 +71,7 @@ func main() { if excludeSet[spec.Name] { continue } - writers.ResourceDocs(docsDir, spec, version, apiEndpoint) + writers.ResourceDocs(docsDir, spec, version, apiEndpoint, providerSource) processedSpecs = append(processedSpecs, spec) } writers.IndexMD(docsDir, processedSpecs) diff --git a/TOOLS/scripts/build-provider.sh b/TOOLS/scripts/build-provider.sh index 387843c..6335ffe 100755 --- a/TOOLS/scripts/build-provider.sh +++ b/TOOLS/scripts/build-provider.sh @@ -77,7 +77,7 @@ build_and_zip() { fi echo "Building for ${os}/${arch}..." - (cd "$PROVIDER_DIR" && CGO_ENABLED=0 GOOS="$os" GOARCH="$arch" go build -ldflags "-X main.version=${VERSION}" -o "${BUILD_DIR}/${binary}" .) + (cd "$PROVIDER_DIR" && CGO_ENABLED=0 GOOS="$os" GOARCH="$arch" go build -ldflags "-X main.version=${VERSION} -X main.address=${REGISTRY_HOSTNAME}/${NAMESPACE}/${PROVIDER_NAME}" -o "${BUILD_DIR}/${binary}" .) (cd "$BUILD_DIR" && python3 -m zipfile -c "terraform-provider-nubes_${VERSION}_${os}_${arch}.zip" "$binary") rm -f "${BUILD_DIR:?}/${binary}" diff --git a/provider/main.go b/provider/main.go index b347808..19e06bb 100644 --- a/provider/main.go +++ b/provider/main.go @@ -16,15 +16,16 @@ import ( "github.com/hashicorp/terraform-plugin-framework/providerserver" ) -// version задаётся через ldflags при сборке: -ldflags "-X main.version=X.Y.Z" +// address задаётся через ldflags при сборке: -ldflags "-X main.address=host/ns/name" // Значение по умолчанию — только для dev-сборок без скрипта. var ( version string = "0.0.0-dev" + address string = "registry.kube5s.ru/nubes-dev/nubes" ) func main() { opts := providerserver.ServeOpts{ - Address: "terra.k8c.ru/nubes-test/nubes", + Address: address, } err := providerserver.Serve(context.Background(), provider.New(version), opts)