diff --git a/.gitignore b/.gitignore index e8eaf71..7052962 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,4 @@ universal_rebuild/gen_v2 universal_rebuild/docs_template_gen_v2 secrets/test.token.new secrets/*.token.new +terraform-provider-nubes_* diff --git a/devops/ARCHITECTURE.md b/devops/ARCHITECTURE.md index 2d84f0c..3bf1284 100644 --- a/devops/ARCHITECTURE.md +++ b/devops/ARCHITECTURE.md @@ -108,6 +108,23 @@ resource "nubes_postgres_restart" "restart1" { run_id = "2026-02-20-001" } +## Concurrency and State Locking + +**Provider-level guarantees:** +- The provider does NOT implement distributed locking for instance operations. +- Two concurrent `terraform apply` with the same `resource_name` may create duplicate + instances, leading to a «multiple instances found» error on subsequent applies. + +**User responsibility:** +- Use Terraform backend with state locking (S3+DynamoDB, etc.). +- Do NOT run `terraform apply` from two workspaces against the same state simultaneously. +- If duplicates occur: delete extras via Cloud Console and re-apply. + +**API-side limitations:** +- Nubes API does not enforce unique `displayName` per serviceId. +- The provider cannot atomically guarantee «create-or-adopt» without API support + for conditional creation or name uniqueness constraints. + ## Documentation Model From the unified YAML, generate: diff --git a/internal/core/client.go b/internal/core/client.go index f44191c..77af981 100644 --- a/internal/core/client.go +++ b/internal/core/client.go @@ -25,9 +25,11 @@ func debugLog(format string, args ...interface{}) { // UniversalClient handles Nubes API logic type UniversalClient struct { - HttpClient *http.Client - ApiEndpoint string - ApiToken string + HttpClient *http.Client + ApiEndpoint string + ApiToken string + ProviderVersion string + LogLevel string } // Request models diff --git a/universal_rebuild/internal/resources_core/instance_state.go b/universal_rebuild/internal/resources_core/instance_state.go index 713adbd..835ec93 100644 --- a/universal_rebuild/internal/resources_core/instance_state.go +++ b/universal_rebuild/internal/resources_core/instance_state.go @@ -11,23 +11,23 @@ import ( type InstanceState int const ( - StateUnknown InstanceState = iota - StateNotCreated // 1 - StateCreating // 2 - StateCreationFailed // 3 - StateRunning // 4 - StateRunningPending // 5 - StateModifying // 6 - StateModificationFailed // 7 - StateSuspending // 8 - StateSuspendFailed // 9 - StateSuspended // 10 - StateResuming // 11 - StateResumeFailed // 12 - StateDeleting // 13 - StateDeletionFailed // 14 - StateDeleted // 15 - StateOrphaned // 16 + StateUnknown InstanceState = iota + StateNotCreated // 1 + StateCreating // 2 + StateCreationFailed // 3 + StateRunning // 4 + StateRunningPending // 5 + StateModifying // 6 + StateModificationFailed // 7 + StateSuspending // 8 + StateSuspendFailed // 9 + StateSuspended // 10 + StateResuming // 11 + StateResumeFailed // 12 + StateDeleting // 13 + StateDeletionFailed // 14 + StateDeleted // 15 + StateOrphaned // 16 ) // classifyStatus определяет состояние инстанса по данным API. diff --git a/universal_rebuild/main.go b/universal_rebuild/main.go index 8b7c190..c038cb0 100644 --- a/universal_rebuild/main.go +++ b/universal_rebuild/main.go @@ -10,7 +10,7 @@ import ( ) var ( - version string = "5.0.51" + version string = "5.0.56" ) func main() {