From 01deb9022d5892eb96e0e8ec32f17901547d3b07 Mon Sep 17 00:00:00 2001 From: Marcel_Henselin Date: Tue, 17 Mar 2026 15:33:21 +0000 Subject: [PATCH 01/37] chore: update README (#87) ## Description relates to #1234 ## Checklist - [ ] Issue was linked above - [ ] Code format was applied: `make fmt` - [ ] Examples were added / adjusted (see `examples/` directory) - [x] Docs are up-to-date: `make generate-docs` (will be checked by CI) - [ ] Unit tests got implemented or updated - [ ] Acceptance tests got implemented or updated (see e.g. [here](https://github.com/stackitcloud/terraform-provider-stackit/blob/f5f99d170996b208672ae684b6da53420e369563/stackit/internal/services/dns/dns_acc_test.go)) - [x] Unit tests are passing: `make test` (will be checked by CI) - [x] No linter issues: `make lint` (will be checked by CI) Co-authored-by: Marcel S. Henselin Co-authored-by: Marcel S. Henselin Reviewed-on: https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pulls/87 --- README.md | 116 +++++---------------- sample/alpha-from-registry/key.tf | 38 +++++++ sample/alpha-from-registry/postresql.tf | 96 +++++++++++++++++ sample/alpha-from-registry/providers.tf | 24 +++++ sample/alpha-from-registry/sqlserver.tf | 101 ++++++++++++++++++ sample/kms/kms.tf | 57 ++++++++++ sample/kms/providers.tf | 25 +++++ sample/pg_import/outputs.tf | 4 + sample/pg_import/postresql.tf | 45 ++++++++ sample/pg_import/providers.tf | 25 +++++ sample/pg_import/variables.tf.example | 11 ++ sample/pg_instance/outputs.tf | 0 sample/pg_instance/postresql.tf | 17 +++ sample/pg_instance/providers.tf | 25 +++++ sample/pg_instance/variables.tf.example | 11 ++ sample/sqlserver_beta/flavor.tf | 13 +++ sample/sqlserver_beta/postgres.tf | 9 ++ sample/sqlserver_beta/providers.tf | 25 +++++ sample/sqlserver_beta/sqlserver.tf | 116 +++++++++++++++++++++ sample/sqlserver_beta/variables.tf.example | 11 ++ 20 files changed, 680 insertions(+), 89 deletions(-) create mode 100644 sample/alpha-from-registry/key.tf create mode 100644 sample/alpha-from-registry/postresql.tf create mode 100644 sample/alpha-from-registry/providers.tf create mode 100644 sample/alpha-from-registry/sqlserver.tf create mode 100644 sample/kms/kms.tf create mode 100644 sample/kms/providers.tf create mode 100644 sample/pg_import/outputs.tf create mode 100644 sample/pg_import/postresql.tf create mode 100644 sample/pg_import/providers.tf create mode 100644 sample/pg_import/variables.tf.example create mode 100644 sample/pg_instance/outputs.tf create mode 100644 sample/pg_instance/postresql.tf create mode 100644 sample/pg_instance/providers.tf create mode 100644 sample/pg_instance/variables.tf.example create mode 100644 sample/sqlserver_beta/flavor.tf create mode 100644 sample/sqlserver_beta/postgres.tf create mode 100644 sample/sqlserver_beta/providers.tf create mode 100644 sample/sqlserver_beta/sqlserver.tf create mode 100644 sample/sqlserver_beta/variables.tf.example diff --git a/README.md b/README.md index ab79f28e..b90466b9 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ terraform { required_providers { stackitprivatepreview = { source = "tfregistry.sysops.stackit.rocks/mhenselin/stackitprivatepreview" - version = "= 0.0.5-alpha" + version = ">= 0.1.0" } } } @@ -38,7 +38,6 @@ Check one of the examples in the [examples](examples/) folder. To authenticate, you will need a [service account](https://docs.stackit.cloud/platform/access-and-identity/service-accounts/). Create it in the [STACKIT Portal](https://portal.stackit.cloud/) and assign the necessary permissions to it, e.g. `project.owner`. There are multiple ways to authenticate: - Key flow (recommended) -- Token flow (is scheduled for deprecation and will be removed on December 17, 2025.) When setting up authentication, the provider will always try to use the key flow first and search for credentials in several locations, following a specific order: @@ -52,7 +51,6 @@ When setting up authentication, the provider will always try to use the key flow ```json { - "STACKIT_SERVICE_ACCOUNT_TOKEN": "foo_token", "STACKIT_SERVICE_ACCOUNT_KEY_PATH": "path/to/sa_key.json" } ``` @@ -71,35 +69,41 @@ To configure the key flow, follow this steps: 1. Create a service account key: -- Use the [STACKIT Portal](https://portal.stackit.cloud/): go to the `Service Accounts` tab, choose a `Service Account` and go to `Service Account Keys` to create a key. For more details, see [Create a service account key](https://docs.stackit.cloud/platform/access-and-identity/service-accounts/how-tos/manage-service-account-keys/) + - Use the [STACKIT Portal](https://portal.stackit.cloud/): go to the `Service Accounts` tab, choose a `Service Account` and go to `Service Account Keys` to create a key. For more details, see [Create a service account key](https://docs.stackit.cloud/platform/access-and-identity/service-accounts/how-tos/manage-service-account-keys/) 2. Save the content of the service account key by copying it and saving it in a JSON file. The expected format of the service account key is a **JSON** with the following structure: -```json -{ - "id": "uuid", - "publicKey": "public key", - "createdAt": "2023-08-24T14:15:22Z", - "validUntil": "2023-08-24T14:15:22Z", - "keyType": "USER_MANAGED", - "keyOrigin": "USER_PROVIDED", - "keyAlgorithm": "RSA_2048", - "active": true, - "credentials": { - "kid": "string", - "iss": "my-sa@sa.stackit.cloud", - "sub": "uuid", - "aud": "string", - (optional) "privateKey": "private key when generated by the SA service" - } -} -``` + ```json + { + "id": "uuid", + "publicKey": "public key", + "createdAt": "2023-08-24T14:15:22Z", + "validUntil": "2023-08-24T14:15:22Z", + "keyType": "USER_MANAGED", + "keyOrigin": "USER_PROVIDED", + "keyAlgorithm": "RSA_2048", + "active": true, + "credentials": { + "kid": "string", + "iss": "my-sa@sa.stackit.cloud", + "sub": "uuid", + "aud": "string", + (optional) "privateKey": "private key when generated by the SA service" + } + } + ``` 3. Configure the service account key for authentication in the provider by following one of the alternatives below: - setting the fields in the provider block: `service_account_key` or `service_account_key_path` + ```hcl + provider "stackitprivatepreview" { + default_region = "eu01" + service_account_key_path = "../service_account.json" + } + ``` - setting the environment variable: `STACKIT_SERVICE_ACCOUNT_KEY_PATH` or `STACKIT_SERVICE_ACCOUNT_KEY` - ensure the set the service account key in `STACKIT_SERVICE_ACCOUNT_KEY` is correctly formatted. Use e.g. `$ export STACKIT_SERVICE_ACCOUNT_KEY=$(cat ./service-account-key.json)` @@ -111,16 +115,6 @@ To configure the key flow, follow this steps: > - setting the environment variable: `STACKIT_PRIVATE_KEY_PATH` or `STACKIT_PRIVATE_KEY` > - setting `STACKIT_PRIVATE_KEY_PATH` in the credentials file (see above) -### Token flow - -> Is scheduled for deprecation and will be removed on December 17, 2025. - -Using this flow is less secure since the token is long-lived. You can provide the token in several ways: - -1. Setting the field `service_account_token` in the provider -2. Setting the environment variable `STACKIT_SERVICE_ACCOUNT_TOKEN` -3. Setting it in the credentials file (see above) - ## Backend configuration To keep track of your terraform state, you can configure an [S3 backend](https://developer.hashicorp.com/terraform/language/settings/backends/s3) using [STACKIT Object Storage](https://docs.stackit.cloud/products/storage/object-storage). @@ -150,62 +144,6 @@ terraform { Note: AWS specific checks must be skipped as they do not work on STACKIT. For details on what those validations do, see [here](https://developer.hashicorp.com/terraform/language/settings/backends/s3#configuration). -## Opting into Beta Resources - -To use beta resources in the STACKIT Terraform provider, follow these steps: - -1. **Provider Configuration Option** - - Set the `enable_beta_resources` option in the provider configuration. This is a boolean attribute that can be either `true` or `false`. - - ```hcl - provider "stackit" { - default_region = "eu01" - enable_beta_resources = true - } - ``` - -2. **Environment Variable** - - Set the `STACKIT_TF_ENABLE_BETA_RESOURCES` environment variable to `"true"` or `"false"`. Other values will be ignored and will produce a warning. - - ```sh - export STACKIT_TF_ENABLE_BETA_RESOURCES=true - ``` - -> **Note**: The environment variable takes precedence over the provider configuration option. This means that if the `STACKIT_TF_ENABLE_BETA_RESOURCES` environment variable is set to a valid value (`"true"` or `"false"`), it will override the `enable_beta_resources` option specified in the provider configuration. - -For more details, please refer to the [beta resources configuration guide](https://registry.terraform.io/providers/stackitcloud/stackit/latest/docs/guides/opting_into_beta_resources). - -## Opting into Experiments - -Experiments are features that are even less mature and stable than Beta Resources. While there is some assumed stability in beta resources, will have to expect breaking changes while using experimental resources. Experimental Resources do not come with any support or warranty. - -To enable experiments set the experiments field in the provider definition: - -```hcl -provider "stackit" { - default_region = "eu01" - experiments = ["iam", "routing-tables", "network"] -} -``` - -### Available Experiments - -#### `iam` - -Enables IAM management features in the Terraform provider. The underlying IAM API is expected to undergo a redesign in the future, which leads to it being considered experimental. - -#### `routing-tables` - -This feature enables experimental routing table capabilities in the Terraform Provider, available only to designated SNAs at this time. - -#### `network` - -The `stackit_network` provides the fields `region` and `routing_table_id` when the experiment flag `network` is set. -The underlying API is not stable yet and could change in the future. -If you don't need these fields, don't set the experiment flag `network`, to use the stable api. - ## Acceptance Tests > [!WARNING] diff --git a/sample/alpha-from-registry/key.tf b/sample/alpha-from-registry/key.tf new file mode 100644 index 00000000..8be28ac7 --- /dev/null +++ b/sample/alpha-from-registry/key.tf @@ -0,0 +1,38 @@ +resource "stackit_kms_keyring" "mshalpha-keyring" { + project_id = var.project_id + display_name = "msh-alpha-tests" + description = "This is a test keyring for private endpoints" +} + +resource "stackit_kms_key" "mshalpha-key01" { + project_id = var.project_id + keyring_id = stackit_kms_keyring.mshalpha-keyring.keyring_id + display_name = "mshalpha-key01" + protection = "software" + algorithm = "aes_256_gcm" + purpose = "symmetric_encrypt_decrypt" + access_scope = "SNA" +} + +output "keyid" { + value = stackit_kms_key.mshalpha-key01.key_id +} + +# (because stackit_kms_key.key001 is not in configuration) +resource "stackit_kms_key" "key001" { + access_scope = "SNA" + algorithm = "aes_256_gcm" + display_name = "msh-key-sna01" + keyring_id = stackit_kms_keyring.keyring001.keyring_id + project_id = var.project_id + protection = "software" + purpose = "symmetric_encrypt_decrypt" +} + +# stackit_kms_keyring.keyring001 will be destroyed +# (because stackit_kms_keyring.keyring001 is not in configuration) +resource "stackit_kms_keyring" "keyring001" { + description = "This is a test keyring for private endpoints" + display_name = "msh-keyring-sna01" + project_id = var.project_id +} diff --git a/sample/alpha-from-registry/postresql.tf b/sample/alpha-from-registry/postresql.tf new file mode 100644 index 00000000..0e728f81 --- /dev/null +++ b/sample/alpha-from-registry/postresql.tf @@ -0,0 +1,96 @@ + +data "stackitprivatepreview_postgresflexalpha_flavor" "pgsql_flavor" { + project_id = var.project_id + region = "eu01" + cpu = 2 + ram = 4 + node_type = "Single" + storage_class = "premium-perf2-stackit" +} + +resource "stackitprivatepreview_postgresflexalpha_instance" "msh-alpha-sna-enc" { + project_id = var.project_id + name = "msh-alpha-sna-enc" + backup_schedule = "0 0 * * *" + retention_days = 45 + flavor_id = data.stackitprivatepreview_postgresflexalpha_flavor.pgsql_flavor.flavor_id + replicas = 1 + storage = { + performance_class = "premium-perf2-stackit" + size = 10 + } + encryption = { + kek_key_id = stackit_kms_key.mshalpha-key01.key_id + kek_key_ring_id = stackit_kms_keyring.mshalpha-keyring.keyring_id + kek_key_version = 1 + service_account = var.sa_email + } + network = { + acl = ["0.0.0.0/0", "193.148.160.0/19", "170.85.2.177/32"] + access_scope = "SNA" + } + version = 17 +} + +resource "stackitprivatepreview_postgresflexalpha_instance" "msh-alpha-nosna-noenc" { + project_id = var.project_id + name = "msh-alpha-nosna-enc" + backup_schedule = "0 0 * * *" + retention_days = 45 + flavor_id = data.stackitprivatepreview_postgresflexalpha_flavor.pgsql_flavor.flavor_id + replicas = 1 + storage = { + performance_class = "premium-perf2-stackit" + size = 10 + } + network = { + acl = ["0.0.0.0/0", "193.148.160.0/19", "170.85.2.177/32"] + access_scope = "PUBLIC" + } + version = 16 +} + +resource "stackitprivatepreview_postgresflexalpha_user" "ptlsdbadminuser" { + project_id = var.project_id + instance_id = stackitprivatepreview_postgresflexalpha_instance.msh-alpha-sna-enc.instance_id + name = var.db_admin_username + roles = ["createdb", "login"] + # roles = ["createdb", "login", "createrole"] +} + +resource "stackitprivatepreview_postgresflexalpha_user" "ptlsdbuser" { + project_id = var.project_id + instance_id = stackitprivatepreview_postgresflexalpha_instance.msh-alpha-sna-enc.instance_id + name = var.db_username + roles = ["login"] + # roles = ["createdb", "login", "createrole"] +} + +resource "stackitprivatepreview_postgresflexalpha_database" "example" { + count = 5 + depends_on = [stackitprivatepreview_postgresflexalpha_user.ptlsdbadminuser] + project_id = var.project_id + instance_id = stackitprivatepreview_postgresflexalpha_instance.msh-alpha-sna-enc.instance_id + name = "${var.db_name}${count.index}" + owner = var.db_admin_username +} + +# data "stackitprivatepreview_postgresflexalpha_instance" "datapsql" { +# project_id = var.project_id +# instance_id = var.instance_id +# region = "eu01" +# } + +# output "psql_instance_id" { +# value = data.stackitprivatepreview_postgresflexalpha_instance.datapsql.instance_id +# } + +output "psql_user_password" { + value = stackitprivatepreview_postgresflexalpha_user.ptlsdbuser.password + sensitive = true +} + +# output "psql_user_conn" { +# value = stackitprivatepreview_postgresflexalpha_user.ptlsdbuser.connection_string +# sensitive = true +# } diff --git a/sample/alpha-from-registry/providers.tf b/sample/alpha-from-registry/providers.tf new file mode 100644 index 00000000..66756cd7 --- /dev/null +++ b/sample/alpha-from-registry/providers.tf @@ -0,0 +1,24 @@ + +terraform { + required_providers { + stackit = { + source = "registry.terraform.io/stackitcloud/stackit" + version = "~> 0.70" + } + stackitprivatepreview = { + source = "tfregistry.sysops.stackit.rocks/mhenselin/stackitprivatepreview" + version = ">=0.1.0" + } + } +} + +provider "stackit" { + default_region = "eu01" + enable_beta_resources = true + service_account_key_path = "../service_account.json" +} + +provider "stackitprivatepreview" { + default_region = "eu01" + service_account_key_path = "../service_account.json" +} diff --git a/sample/alpha-from-registry/sqlserver.tf b/sample/alpha-from-registry/sqlserver.tf new file mode 100644 index 00000000..2bf17a9e --- /dev/null +++ b/sample/alpha-from-registry/sqlserver.tf @@ -0,0 +1,101 @@ +# resource "stackit_kms_keyring" "keyring001" { +# project_id = var.project_id +# display_name = "msh-keyring-sna01" +# description = "This is a test keyring for private endpoints" +# } +# +# resource "stackit_kms_key" "key001" { +# project_id = var.project_id +# keyring_id = stackit_kms_keyring.keyring001.keyring_id +# display_name = "msh-key-sna01" +# protection = "software" +# algorithm = "aes_256_gcm" +# purpose = "symmetric_encrypt_decrypt" +# access_scope = "SNA" +# } + +data "stackitprivatepreview_sqlserverflexbeta_flavor" "sqlserver_flavor" { + project_id = var.project_id + region = "eu01" + cpu = 4 + ram = 16 + node_type = "Single" + storage_class = "premium-perf2-stackit" +} + +resource "stackitprivatepreview_sqlserverflexbeta_instance" "msh-sna-001" { + project_id = var.project_id + name = "msh-sna-001" + backup_schedule = "0 3 * * *" + retention_days = 31 + flavor_id = data.stackitprivatepreview_sqlserverflexbeta_flavor.sqlserver_flavor.flavor_id + storage = { + class = "premium-perf2-stackit" + size = 50 + } + version = 2022 + encryption = { + kek_key_version = 1 + kek_key_id = var.key_id + kek_key_ring_id = var.keyring_id + service_account = var.sa_email + } + network = { + acl = ["0.0.0.0/0", "193.148.160.0/19"] + access_scope = "SNA" + } +} + +#resource "stackitprivatepreview_sqlserverflexbeta_instance" "msh-nosna-001" { +# project_id = var.project_id +# name = "msh-nosna-001" +# backup_schedule = "0 3 * * *" +# retention_days = 31 +# flavor_id = data.stackitprivatepreview_sqlserverflexbeta_flavor.sqlserver_flavor.flavor_id +# storage = { +# class = "premium-perf2-stackit" +# size = 50 +# } +# version = 2022 +# # encryption = { +# # #key_id = stackit_kms_key.key.key_id +# # #keyring_id = stackit_kms_keyring.keyring.keyring_id +# # #key_version = 1 +# # #key_id = var.key_id +# # # key with scope public +# # key_id = "fe039bcf-8d7b-431a-801d-9e81371a6b7b" +# # keyring_id = var.keyring_id +# # key_version = var.key_version +# # service_account = var.sa_email +# # } +# network = { +# acl = ["0.0.0.0/0", "193.148.160.0/19"] +# access_scope = "PUBLIC" +# } +#} + +# data "stackitprivatepreview_sqlserverflexbeta_instance" "test" { +# project_id = var.project_id +# instance_id = var.instance_id +# region = "eu01" +# } + +# output "test" { +# value = data.stackitprivatepreview_sqlserverflexbeta_instance.test +# } + +resource "stackitprivatepreview_sqlserverflexbeta_user" "ptlsdbadminuser" { + project_id = var.project_id + instance_id = stackitprivatepreview_sqlserverflexbeta_instance.msh-sna-001.instance_id + username = var.db_admin_username + #roles = ["##STACKIT_LoginManager##", "##STACKIT_DatabaseManager##"] + roles = ["##STACKIT_LoginManager##"] +} + +resource "stackitprivatepreview_sqlserverflexbeta_user" "ptlsdbuser" { + project_id = var.project_id + instance_id = stackitprivatepreview_sqlserverflexbeta_instance.msh-sna-001.instance_id + username = var.db_username + roles = ["##STACKIT_LoginManager##"] +} + diff --git a/sample/kms/kms.tf b/sample/kms/kms.tf new file mode 100644 index 00000000..01b1d46c --- /dev/null +++ b/sample/kms/kms.tf @@ -0,0 +1,57 @@ +resource "stackit_kms_keyring" "keyring001" { + project_id = var.project_id + display_name = "msh-keyring-sna01" + description = "This is a test keyring for private endpoints" +} + +resource "stackit_kms_key" "key001" { + project_id = var.project_id + keyring_id = stackit_kms_keyring.keyring001.keyring_id + display_name = "msh-key-sna01" + protection = "software" + algorithm = "aes_256_gcm" + purpose = "symmetric_encrypt_decrypt" + access_scope = "SNA" +} + + +# data "stackitprivatepreview_sqlserverflexalpha_instance" "test" { +# project_id = var.project_id +# instance_id = var.instance_id +# region = "eu01" +# } + +output "key_ring_id" { + value = stackit_kms_keyring.keyring001.id +} + +resource "stackit_kms_keyring" "keyring001yy" { + project_id = var.project_id + display_name = "msh-kr-sna01" + description = "This is a test keyring for private endpoints" +} + +resource "stackit_kms_key" "key001yy" { + project_id = var.project_id + keyring_id = stackit_kms_keyring.keyring001yy.keyring_id + display_name = "msh-k-001" + protection = "software" + algorithm = "aes_256_gcm" + purpose = "symmetric_encrypt_decrypt" + access_scope = "SNA" +} + + +# data "stackitprivatepreview_sqlserverflexalpha_instance" "test" { +# project_id = var.project_id +# instance_id = var.instance_id +# region = "eu01" +# } + +output "key_ring_idxx" { + value = stackit_kms_keyring.keyring001yy.id +} + +output "key_id" { + value = stackit_kms_key.key001yy.id +} diff --git a/sample/kms/providers.tf b/sample/kms/providers.tf new file mode 100644 index 00000000..1e7fe4f5 --- /dev/null +++ b/sample/kms/providers.tf @@ -0,0 +1,25 @@ + +terraform { + required_providers { + stackit = { + source = "registry.terraform.io/stackitcloud/stackit" + version = "~> 0.70" + } + # stackitprivatepreview = { + # source = "tfregistry.sysops.stackit.rocks/mhenselin/stackitprivatepreview" + # version = "= 0.0.2-alpha" + # } + } +} + +provider "stackit" { + default_region = "eu01" + enable_beta_resources = true + service_account_key_path = "../service_account.json" +} + +# provider "stackitprivatepreview" { +# default_region = "eu01" +# enable_beta_resources = true +# service_account_key_path = "../service_account.json" +# } diff --git a/sample/pg_import/outputs.tf b/sample/pg_import/outputs.tf new file mode 100644 index 00000000..d9edf19a --- /dev/null +++ b/sample/pg_import/outputs.tf @@ -0,0 +1,4 @@ +# +# output "postgres_flavor" { +# value = data.stackitprivatepreview_postgresflexalpha_flavor.pgsql_flavor.flavor_id +# } diff --git a/sample/pg_import/postresql.tf b/sample/pg_import/postresql.tf new file mode 100644 index 00000000..1d8d478d --- /dev/null +++ b/sample/pg_import/postresql.tf @@ -0,0 +1,45 @@ + +data "stackitprivatepreview_postgresflexalpha_flavor" "pgsql_flavor" { + project_id = var.project_id + region = "eu01" + cpu = 2 + ram = 4 + node_type = "Single" + storage_class = "premium-perf2-stackit" +} + +resource "stackitprivatepreview_postgresflexalpha_instance" "import_for_deletion" { + project_id = var.project_id + name = "mshpetest2" + backup_schedule = "0 0 * * *" + retention_days = 45 + flavor_id = data.stackitprivatepreview_postgresflexalpha_flavor.pgsql_flavor.flavor_id + replicas = 1 + storage = { + # class = "premium-perf2-stackit" + performance_class = "premium-perf2-stackit" + size = 10 + } + encryption = { + # key_id = stackit_kms_key.key.key_id + # keyring_id = stackit_kms_keyring.keyring.keyring_id + kek_key_id = var.key_id + kek_key_ring_id = var.keyring_id + kek_key_version = var.key_version + service_account = var.sa_email + } + network = { + acl = ["0.0.0.0/0", "193.148.160.0/19", "170.85.2.177/32"] + access_scope = "PUBLIC" + } + version = 14 +} + +import { + to = stackitprivatepreview_postgresflexalpha_instance.import_for_deletion + identity = { + project_id = var.project_id + region = "eu01" + instance_id = "d52b5d4c-be3f-4c14-a107-330dab99fd2e" + } +} diff --git a/sample/pg_import/providers.tf b/sample/pg_import/providers.tf new file mode 100644 index 00000000..5a54a129 --- /dev/null +++ b/sample/pg_import/providers.tf @@ -0,0 +1,25 @@ + +terraform { + required_providers { + # stackit = { + # source = "registry.terraform.io/stackitcloud/stackit" + # version = "~> 0.70" + # } + stackitprivatepreview = { + source = "tfregistry.sysops.stackit.rocks/mhenselin/stackitprivatepreview" + version = "> 0.0" + } + } +} + +# provider "stackit" { +# default_region = "eu01" +# enable_beta_resources = true +# service_account_key_path = "./service_account.json" +# } + +provider "stackitprivatepreview" { + default_region = "eu01" + enable_beta_resources = true + service_account_key_path = "../service_account.json" +} diff --git a/sample/pg_import/variables.tf.example b/sample/pg_import/variables.tf.example new file mode 100644 index 00000000..51a70be4 --- /dev/null +++ b/sample/pg_import/variables.tf.example @@ -0,0 +1,11 @@ +variable "project_id" { + default = "" +} + +variable "sa_email" { + default = "" +} + +variable "db_username" { + default = "" +} diff --git a/sample/pg_instance/outputs.tf b/sample/pg_instance/outputs.tf new file mode 100644 index 00000000..e69de29b diff --git a/sample/pg_instance/postresql.tf b/sample/pg_instance/postresql.tf new file mode 100644 index 00000000..0f3f73ac --- /dev/null +++ b/sample/pg_instance/postresql.tf @@ -0,0 +1,17 @@ + +data "stackitprivatepreview_postgresflexalpha_flavor" "pgsql_flavor" { + project_id = var.project_id + region = "eu01" + cpu = 2 + ram = 4 + node_type = "Single" + storage_class = "premium-perf2-stackit" +} +data "stackitprivatepreview_postgresflexalpha_flavor" "pgsql_flavor2"{ + project_id = var.project_id + region = "eu01" + cpu = 2 + ram = 4 + node_type = "Single" + storage_class = "premium-perf2-stackit" +} diff --git a/sample/pg_instance/providers.tf b/sample/pg_instance/providers.tf new file mode 100644 index 00000000..f69b01a1 --- /dev/null +++ b/sample/pg_instance/providers.tf @@ -0,0 +1,25 @@ + +terraform { + required_providers { + # stackit = { + # source = "registry.terraform.io/stackitcloud/stackit" + # version = "~> 0.70" + # } + stackitprivatepreview = { + source = "tfregistry.sysops.stackit.rocks/mhenselin/stackitprivatepreview" + version = "> 0.0" + } + } +} + +# provider "stackit" { +# default_region = "eu01" +# enable_beta_resources = true +# service_account_key_path = "./service_account.json" +# } + +provider "stackitprivatepreview" { + default_region = "eu01" + enable_beta_resources = true + service_account_key_path = "/home/henselinm/Development/PTLS/terraform-provider-stackit-MSH/sample/pg_instance/service_account.json" +} diff --git a/sample/pg_instance/variables.tf.example b/sample/pg_instance/variables.tf.example new file mode 100644 index 00000000..51a70be4 --- /dev/null +++ b/sample/pg_instance/variables.tf.example @@ -0,0 +1,11 @@ +variable "project_id" { + default = "" +} + +variable "sa_email" { + default = "" +} + +variable "db_username" { + default = "" +} diff --git a/sample/sqlserver_beta/flavor.tf b/sample/sqlserver_beta/flavor.tf new file mode 100644 index 00000000..df6f3305 --- /dev/null +++ b/sample/sqlserver_beta/flavor.tf @@ -0,0 +1,13 @@ +# +# data "stackitprivatepreview_sqlserverflexalpha_flavor" "sqlserver_flavor" { +# project_id = var.project_id +# region = "eu01" +# cpu = 4 +# ram = 16 +# node_type = "Single" +# storage_class = "premium-perf2-stackit" +# } +# +# output "sqlserver_flavor" { +# value = data.stackitprivatepreview_sqlserverflexalpha_flavor.sqlserver_flavor.flavor_id +# } diff --git a/sample/sqlserver_beta/postgres.tf b/sample/sqlserver_beta/postgres.tf new file mode 100644 index 00000000..0f45ff66 --- /dev/null +++ b/sample/sqlserver_beta/postgres.tf @@ -0,0 +1,9 @@ + +data "stackitprivatepreview_postgresflexalpha_flavor" "pgsql_flavor" { + project_id = var.project_id + region = "eu01" + cpu = 2 + ram = 4 + node_type = "Single" + storage_class = "premium-perf2-stackit" +} diff --git a/sample/sqlserver_beta/providers.tf b/sample/sqlserver_beta/providers.tf new file mode 100644 index 00000000..233d4df2 --- /dev/null +++ b/sample/sqlserver_beta/providers.tf @@ -0,0 +1,25 @@ + +terraform { + required_providers { + # stackit = { + # source = "registry.terraform.io/stackitcloud/stackit" + # version = "~> 0.70" + # } + stackitprivatepreview = { + source = "tfregistry.sysops.stackit.rocks/mhenselin/stackitprivatepreview" + version = "> 0.0" + } + } +} + +# provider "stackit" { +# default_region = "eu01" +# enable_beta_resources = true +# service_account_key_path = "../service_account.json" +# } + +provider "stackitprivatepreview" { + default_region = "eu01" + enable_beta_resources = true + service_account_key_path = "../service_account.json" +} diff --git a/sample/sqlserver_beta/sqlserver.tf b/sample/sqlserver_beta/sqlserver.tf new file mode 100644 index 00000000..21bf7d23 --- /dev/null +++ b/sample/sqlserver_beta/sqlserver.tf @@ -0,0 +1,116 @@ +data "stackitprivatepreview_sqlserverflexbeta_flavor" "sqlserver_flavor" { + project_id = var.project_id + region = "eu01" + cpu = 4 + ram = 16 + node_type = "Single" + storage_class = "premium-perf2-stackit" +} + +data "stackitprivatepreview_sqlserverflexbeta_flavor" "sqlserver_flavor_2" { + project_id = var.project_id + region = "eu01" + cpu = 4 + ram = 32 + node_type = "Replica" + storage_class = "premium-perf2-stackit" +} + +resource "stackitprivatepreview_sqlserverflexbeta_instance" "msh-beta-nosna-001" { + project_id = var.project_id + name = "msh-beta-nosna-001-renamed" + backup_schedule = "0 3 * * *" + retention_days = 31 + flavor_id = data.stackitprivatepreview_sqlserverflexbeta_flavor.sqlserver_flavor.flavor_id + storage = { + class = "premium-perf2-stackit" + size = 50 + } + version = 2022 + network = { + acl = ["0.0.0.0/0", "193.148.160.0/19"] + access_scope = "PUBLIC" + } +} + +resource "stackitprivatepreview_sqlserverflexbeta_instance" "msh-beta-sna-001" { + project_id = var.project_id + name = "msh-beta-sna-001" + backup_schedule = "0 3 * * *" + retention_days = 31 + flavor_id = data.stackitprivatepreview_sqlserverflexbeta_flavor.sqlserver_flavor.flavor_id + storage = { + class = "premium-perf2-stackit" + size = 5 + } + version = 2022 + encryption = { + #key_id = stackit_kms_key.key.key_id + #keyring_id = stackit_kms_keyring.keyring.keyring_id + #key_version = 1 + # key with scope public + kek_key_id = "fe039bcf-8d7b-431a-801d-9e81371a6b7b" + # key_id = var.key_id + kek_key_ring_id = var.keyring_id + kek_key_version = var.key_version + service_account = var.sa_email + } + network = { + acl = ["0.0.0.0/0", "193.148.160.0/19"] + access_scope = "SNA" + } +} + +resource "stackitprivatepreview_sqlserverflexbeta_user" "exampleuseruno" { + project_id = var.project_id + instance_id = stackitprivatepreview_sqlserverflexbeta_instance.msh-beta-nosna-001.instance_id + username = "exampleuserdue" + roles = ["##STACKIT_ProcessManager##", "##STACKIT_LoginManager##", "##STACKIT_ServerManager##"] +} + +resource "stackitprivatepreview_sqlserverflexbeta_user" "exampleuser" { + project_id = var.project_id + instance_id = stackitprivatepreview_sqlserverflexbeta_instance.msh-beta-nosna-001.instance_id + username = "exampleuser" + roles = ["##STACKIT_LoginManager##"] +} + + +resource "stackitprivatepreview_sqlserverflexbeta_database" "mshtest002" { + project_id = var.project_id + instance_id = stackitprivatepreview_sqlserverflexbeta_instance.msh-beta-nosna-001.instance_id + name = "mshtest002" + # owner = "dbuser" + owner = stackitprivatepreview_sqlserverflexbeta_user.exampleuseruno.username +} + + +# data "stackitprivatepreview_sqlserverflexbeta_database" "example" { +# project_id = var.project_id +# region = "eu01" +# instance_id = "b3b63d0c-35bf-4804-84ea-5abec2a8ae58" +# database_name = "mshtest001" +# } + +# output "dbdetails" { +# value = data.stackitprivatepreview_sqlserverflexbeta_database.example +# } +# + + +# resource "stackitprivatepreview_sqlserverflexbeta_database" "mshtest" { +# project_id = var.project_id +# instance_id = "b3b63d0c-35bf-4804-84ea-5abec2a8ae58" +# name = "mshtest" +# owner = "dbuser" +# } +# +# import { +# to = stackitprivatepreview_sqlserverflexbeta_database.mshtest +# identity = { +# project_id = var.project_id +# region = "eu01" +# instance_id = "b3b63d0c-35bf-4804-84ea-5abec2a8ae58" +# database_name = "mshtest" +# } +# } diff --git a/sample/sqlserver_beta/variables.tf.example b/sample/sqlserver_beta/variables.tf.example new file mode 100644 index 00000000..51a70be4 --- /dev/null +++ b/sample/sqlserver_beta/variables.tf.example @@ -0,0 +1,11 @@ +variable "project_id" { + default = "" +} + +variable "sa_email" { + default = "" +} + +variable "db_username" { + default = "" +} From 0a5bc30d9c74d404a1539a4b792e4ebf0fd86e1e Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Tue, 17 Mar 2026 17:39:22 +0100 Subject: [PATCH 02/37] chore: update publish pipeline [skip ci] --- .github/workflows/publish.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index f8dd226b..e7edf851 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -7,7 +7,7 @@ on: push: tags: - - 'v0.*' + - 'v*' env: GO_VERSION: "1.25" From aaabadde1aab8b5b856304bf0324f63cb2b83662 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Tue, 17 Mar 2026 17:42:10 +0100 Subject: [PATCH 03/37] chore: update publish pipeline --- .github/workflows/publish.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index e7edf851..633953f4 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -3,7 +3,7 @@ name: Publish run-name: Publish by @${{ github.actor }} on: - #workflow_dispatch: + workflow_dispatch: push: tags: @@ -44,6 +44,8 @@ jobs: - name: Checkout uses: actions/checkout@v6 + with: + fetch-tags: true - name: Setup Go uses: actions/setup-go@v6 From 1fd2df5c76ca945ea6eef1a39403960a76f7175c Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 18 Mar 2026 09:35:14 +0100 Subject: [PATCH 04/37] fix: update pipelines fix: implement sql server 200 error --- .github/actions/clean_up/README.md | 1 + .github/actions/clean_up/action.yaml | 148 ++++++++++++++++++ .github/workflows/ci_new.yaml | 12 +- .github/workflows/clean_up.yaml | 25 +++ .github/workflows/publish.yaml | 4 +- .github/workflows/release.yaml | 4 +- .github/workflows/renovate.yaml | 4 +- .github/workflows/stale.yaml | 2 +- .github/workflows/tf-acc-test.yaml | 2 +- .../sqlserverflex_acc_test.go | 3 +- .../internal/wait/sqlserverflexbeta/wait.go | 6 + 11 files changed, 196 insertions(+), 15 deletions(-) create mode 100644 .github/actions/clean_up/README.md create mode 100644 .github/actions/clean_up/action.yaml create mode 100644 .github/workflows/clean_up.yaml diff --git a/.github/actions/clean_up/README.md b/.github/actions/clean_up/README.md new file mode 100644 index 00000000..c3484cf2 --- /dev/null +++ b/.github/actions/clean_up/README.md @@ -0,0 +1 @@ +# acceptance test action diff --git a/.github/actions/clean_up/action.yaml b/.github/actions/clean_up/action.yaml new file mode 100644 index 00000000..d8ee6a86 --- /dev/null +++ b/.github/actions/clean_up/action.yaml @@ -0,0 +1,148 @@ +name: CleanUp Project Resources +description: "Acceptance Testing CleanUp" + +inputs: + project_id: + description: "STACKIT project ID for tests" + required: true + + region: + description: "STACKIT region for tests" + default: 'eu01' + required: true + + tf_resource_prefix: + description: "prefix in resource names" + default: 'tf-acc-' + required: true + + service_account_json_content: + description: "STACKIT service account JSON file contents" + required: true + default: "" + + service_account_json_content_b64: + description: "STACKIT service account JSON file contents" + required: true + default: "" + + list_only: + description: "only list resources, DO NOT delete" + required: true + default: 'true' + +outputs: + resources: + description: "resource list" + value: ${{ steps.resource_lister.outputs.resources }} + + cli-version: + description: "stackit cli version" + value: ${{ steps.stackit_version.outputs.version }} + +runs: + using: "composite" + steps: + - name: Install needed tools + shell: bash + run: | + echo "::group::apt install" + set -e + apt-get -y -qq update >apt_update.log 2>apt_update_err.log + if [ $? -ne 0 ]; then + cat apt_update.log apt_update_err.log + fi + apt-get -y -qq install curl gnupg jq >apt_get.log 2>apt_get_err.log + if [ $? -ne 0 ]; then + cat apt_get.log apt_get_err.log + fi + echo "::endgroup::" + + echo "::group::apt add source" + curl https://packages.stackit.cloud/keys/key.gpg | gpg --dearmor -o /usr/share/keyrings/stackit.gpg + echo "deb [signed-by=/usr/share/keyrings/stackit.gpg] https://packages.stackit.cloud/apt/cli stackit main" | tee -a /etc/apt/sources.list.d/stackit.list + echo "::endgroup::" + + echo "::group::apt install stackit cli" + apt-get -y -qq update >apt_update.log 2>apt_update_err.log + if [ $? -ne 0 ]; then + cat apt_update.log apt_update_err.log + fi + apt-get -y -qq install stackit >apt_get.log 2>apt_get_err.log + if [ $? -ne 0 ]; then + cat apt_get.log apt_get_err.log + fi + echo "::endgroup::" + + - name: Check stackit cli version + id: stackit_version + run: | + set -e + VERSION=$(stackit --version | grep "Version:" | cut -d " " -f 2) + echo "stackit cli version: ${VERSION}" + echo "version=${VERSION}" >> $GITHUB_OUTPUT + shell: bash + + - name: Creating service_account file from json input + if: inputs.service_account_json_content != '' + shell: bash + run: | + echo "::group::create service account file" + set -e + set -o pipefail + + echo "${{ inputs.service_account_json_content }}" > .svc_acc.json + echo "::endgroup::" + + - name: Creating service_account file from base64 json input + if: inputs.service_account_json_content_b64 != '' + shell: bash + run: | + echo "::group::create service account file" + set -e + set -o pipefail + + echo "${{ inputs.service_account_json_content_b64 }}" | base64 -d > .svc_acc.json + echo "::endgroup::" + + - name: Check service account file exists + shell: bash + run: | + set -e + if [[ ! -s .svc_acc.json ]]; then + echo "ERROR: service account file missing or empty" + exit 1 + fi + + - name: Retrieve resources + id: resource_lister + run: | + set -e + STACKIT_SERVICE_ACCOUNT_KEY_PATH="${PWD}/.svc_acc.json" + export STACKIT_SERVICE_ACCOUNT_KEY_PATH + stackit auth activate-service-account --service-account-key-path .svc_acc.json + RES_JSON=$(stackit --project-id "${{ inputs.project_id }}" beta sqlserverflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))') + echo "resources=$(echo $RES_JSON)" >> $GITHUB_OUTPUT + shell: bash + + - name: List resources + run: | + set -e + echo "${{ steps.resource_lister.outputs.resources }} | jq -r " + shell: bash + + - name: Delete SQL Server Flex resources + if: ${{ inputs.list_only != 'true' }} + run: | + set -e + stackit auth activate-service-account --service-account-key-path .svc_acc.json + for s in $(stackit --project-id ${{ inputs.project_id }} beta sqlserverflex instance list --output-format json | jq -r '.[] | select(.name | startswith("tf-acc-")) | .id'); do stackit -y --project-id ${{ inputs.project_id }} beta sqlserverflex instance delete $s; done + shell: bash + + - name: Delete PostgreSQL Flex resources + if: ${{ inputs.list_only != 'true' }} + run: | + set -e + stackit auth activate-service-account --service-account-key-path .svc_acc.json + for s in $(stackit --project-id ${{ inputs.project_id }} postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("tf-acc-")) | .id'); do stackit -y --project-id ${{ inputs.project_id }} postgresflex instance delete $s; done + shell: bash diff --git a/.github/workflows/ci_new.yaml b/.github/workflows/ci_new.yaml index 9ff6a379..08239560 100644 --- a/.github/workflows/ci_new.yaml +++ b/.github/workflows/ci_new.yaml @@ -28,7 +28,7 @@ jobs: config: if: ${{ github.event_name != 'schedule' }} name: Check GoReleaser config - runs-on: ubuntu-latest + runs-on: stackit-docker steps: - name: Checkout uses: actions/checkout@v6 @@ -40,7 +40,7 @@ jobs: prepare: name: Prepare GO cache - runs-on: ubuntu-latest + runs-on: stackit-docker permissions: actions: read # Required to identify workflow run. checks: write # Required to add status summary. @@ -102,7 +102,7 @@ jobs: needs: - config - prepare - runs-on: ubuntu-latest + runs-on: stackit-docker permissions: actions: read # Required to identify workflow run. checks: write # Required to add status summary. @@ -185,7 +185,7 @@ jobs: testing: name: CI run tests - runs-on: ubuntu-latest + runs-on: stackit-docker needs: - config - prepare @@ -278,7 +278,7 @@ jobs: main: if: ${{ github.event_name != 'schedule' }} name: CI run build and linting - runs-on: ubuntu-latest + runs-on: stackit-docker needs: - config - prepare @@ -329,7 +329,7 @@ jobs: code_coverage: name: "Code coverage report" if: github.event_name == 'pull_request' # Do not run when workflow is triggered by push to main branch - runs-on: ubuntu-latest + runs-on: stackit-docker needs: - main - prepare diff --git a/.github/workflows/clean_up.yaml b/.github/workflows/clean_up.yaml new file mode 100644 index 00000000..7552f4c3 --- /dev/null +++ b/.github/workflows/clean_up.yaml @@ -0,0 +1,25 @@ +name: TF Acceptance Test CleanUp + +on: + workflow_dispatch: + inputs: + list_only: + description: "only list resources" + default: 'true' + required: true + +jobs: + clean: + name: Clean up + runs-on: stackit-docker + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Clean + uses: ./.github/actions/clean_up + with: + project_id: ${{ vars.TF_ACC_PROJECT_ID }} + region: 'eu01' + tf_resource_prefix: 'tf-acc-' + service_account_json_content_b64: "${{ secrets.TF_ACC_SERVICE_ACCOUNT_JSON_B64 }}" diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 633953f4..0f0bcddc 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -17,7 +17,7 @@ env: jobs: config: name: Check GoReleaser config - runs-on: ubuntu-latest + runs-on: stackit-docker steps: - name: Checkout uses: actions/checkout@v6 @@ -30,7 +30,7 @@ jobs: publish: name: "Publish provider" needs: config - runs-on: ubuntu-latest + runs-on: stackit-docker permissions: actions: read # Required to identify workflow run. checks: write # Required to add status summary. diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 79547c9a..d2dec624 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -16,14 +16,14 @@ permissions: jobs: goreleaser: - runs-on: ubuntu-latest + runs-on: stackit-docker steps: - uses: actions/checkout@v6 with: # Allow goreleaser to access older tag information. fetch-depth: 0 - - uses: https://code.forgejo.org/actions/setup-go@v6 + - uses: actions/setup-go@v6 with: go-version-file: "go.mod" cache: true diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index c629eab0..67c33d1b 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -8,13 +8,13 @@ on: jobs: renovate: name: Renovate - runs-on: ubuntu-latest + runs-on: stackit-docker steps: - name: Checkout uses: actions/checkout@v6 - name: Self-hosted Renovate - uses: renovatebot/github-action@v46.1.4 + uses: renovatebot/github-action@v46.1.5 with: configurationFile: .github/renovate.json # token: ${{ secrets.RENOVATE_TOKEN }} diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml index 6198123e..32b39b56 100644 --- a/.github/workflows/stale.yaml +++ b/.github/workflows/stale.yaml @@ -20,7 +20,7 @@ permissions: jobs: stale: name: "Stale" - runs-on: ubuntu-latest + runs-on: stackit-docker timeout-minutes: 10 steps: - name: "Mark old PRs as stale" diff --git a/.github/workflows/tf-acc-test.yaml b/.github/workflows/tf-acc-test.yaml index 75a35382..743a091c 100644 --- a/.github/workflows/tf-acc-test.yaml +++ b/.github/workflows/tf-acc-test.yaml @@ -23,7 +23,7 @@ on: jobs: acc_test: name: Acceptance Tests - runs-on: ubuntu-latest + runs-on: stackit-docker steps: - name: Checkout uses: actions/checkout@v6 diff --git a/stackit/internal/services/sqlserverflexbeta/sqlserverflex_acc_test.go b/stackit/internal/services/sqlserverflexbeta/sqlserverflex_acc_test.go index 0d3d8c99..77955dd5 100644 --- a/stackit/internal/services/sqlserverflexbeta/sqlserverflex_acc_test.go +++ b/stackit/internal/services/sqlserverflexbeta/sqlserverflex_acc_test.go @@ -158,7 +158,8 @@ func TestAccInstance(t *testing.T) { PreConfig: func() { t.Logf("testing: %s - %s", t.Name(), "create and verify") }, - ExpectNonEmptyPlan: true, + // empty refresh plan + ExpectNonEmptyPlan: false, Config: testutils.StringFromTemplateMust( "testdata/instance_template.gompl", exData, diff --git a/stackit/internal/wait/sqlserverflexbeta/wait.go b/stackit/internal/wait/sqlserverflexbeta/wait.go index 18168968..fb94b9dc 100644 --- a/stackit/internal/wait/sqlserverflexbeta/wait.go +++ b/stackit/internal/wait/sqlserverflexbeta/wait.go @@ -89,9 +89,15 @@ func CreateInstanceWaitHandler( return false, nil, fmt.Errorf("could not convert error to oapierror.GenericOpenAPIError: %w", err) } switch oapiErr.StatusCode { + case http.StatusOK: + return false, nil, nil case http.StatusNotFound: return false, nil, nil default: + if strings.Contains(err.Error(), "is not a valid InstanceEdition") { + tflog.Info(ctx, "API WORKAROUND", map[string]interface{}{"err": err}) + return false, nil, nil + } return false, nil, fmt.Errorf("api error: %w", err) } } From e974ccf906d963a0f3c61963157e47cbf819cfe7 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 18 Mar 2026 09:40:23 +0100 Subject: [PATCH 05/37] fix: update pipelines --- .github/workflows/publish.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 0f0bcddc..633953f4 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -17,7 +17,7 @@ env: jobs: config: name: Check GoReleaser config - runs-on: stackit-docker + runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 @@ -30,7 +30,7 @@ jobs: publish: name: "Publish provider" needs: config - runs-on: stackit-docker + runs-on: ubuntu-latest permissions: actions: read # Required to identify workflow run. checks: write # Required to add status summary. From 63435e5e635d83b052e6221d03a4a140a0661b44 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 18 Mar 2026 09:56:24 +0100 Subject: [PATCH 06/37] fix: update pipelines [skip ci] --- .github/workflows/clean_up.yaml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/clean_up.yaml b/.github/workflows/clean_up.yaml index 7552f4c3..f918bb87 100644 --- a/.github/workflows/clean_up.yaml +++ b/.github/workflows/clean_up.yaml @@ -5,9 +5,20 @@ on: inputs: list_only: description: "only list resources" - default: 'true' + type: boolean + default: true required: true + logLevel: + description: 'Log Level' + required: true + default: 'warning' + type: choice + options: + - info + - warning + - debug + jobs: clean: name: Clean up @@ -23,3 +34,4 @@ jobs: region: 'eu01' tf_resource_prefix: 'tf-acc-' service_account_json_content_b64: "${{ secrets.TF_ACC_SERVICE_ACCOUNT_JSON_B64 }}" + list_only: ${{ inputs.list_only }} From 8ab8656b5c1458a2a41177ddaa8b5f1c44775b32 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 18 Mar 2026 09:59:38 +0100 Subject: [PATCH 07/37] fix: update pipelines [skip ci] --- .github/actions/clean_up/action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/clean_up/action.yaml b/.github/actions/clean_up/action.yaml index d8ee6a86..055ac769 100644 --- a/.github/actions/clean_up/action.yaml +++ b/.github/actions/clean_up/action.yaml @@ -128,7 +128,7 @@ runs: - name: List resources run: | set -e - echo "${{ steps.resource_lister.outputs.resources }} | jq -r " + echo "${{ steps.resource_lister.outputs.resources }}" | jq -r shell: bash - name: Delete SQL Server Flex resources From c081f5f7bde13ef029ab7556f9bee6fc34ae9e06 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 18 Mar 2026 11:14:33 +0100 Subject: [PATCH 08/37] fix: update pipelines [skip ci] --- .github/actions/clean_up/action.yaml | 58 ++++++++++++++++++++-------- .github/workflows/clean_up.yaml | 12 +++++- 2 files changed, 51 insertions(+), 19 deletions(-) diff --git a/.github/actions/clean_up/action.yaml b/.github/actions/clean_up/action.yaml index 055ac769..c9c2e4a8 100644 --- a/.github/actions/clean_up/action.yaml +++ b/.github/actions/clean_up/action.yaml @@ -19,23 +19,24 @@ inputs: service_account_json_content: description: "STACKIT service account JSON file contents" required: true - default: "" + default: '' service_account_json_content_b64: description: "STACKIT service account JSON file contents" required: true - default: "" + default: '' list_only: description: "only list resources, DO NOT delete" required: true default: 'true' -outputs: - resources: - description: "resource list" - value: ${{ steps.resource_lister.outputs.resources }} + log_level: + description: "Log Level" + required: true + default: 'warning' +outputs: cli-version: description: "stackit cli version" value: ${{ steps.stackit_version.outputs.version }} @@ -115,34 +116,57 @@ runs: fi - name: Retrieve resources - id: resource_lister run: | + echo "::group::retrieve resources" set -e + echo "authenticating api" STACKIT_SERVICE_ACCOUNT_KEY_PATH="${PWD}/.svc_acc.json" export STACKIT_SERVICE_ACCOUNT_KEY_PATH stackit auth activate-service-account --service-account-key-path .svc_acc.json - RES_JSON=$(stackit --project-id "${{ inputs.project_id }}" beta sqlserverflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))') - echo "resources=$(echo $RES_JSON)" >> $GITHUB_OUTPUT - shell: bash - - name: List resources - run: | - set -e - echo "${{ steps.resource_lister.outputs.resources }}" | jq -r + echo "SQL Server Flex resources:" + stackit --verbosity ${{ inputs.log_level }} --project-id "${{ inputs.project_id }}" beta sqlserverflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))' + + echo "PostgreSQL Flex resources:" + stackit --verbosity ${{ inputs.log_level }} --project-id "${{ inputs.project_id }}" postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))' + + echo "::endgroup::" shell: bash - name: Delete SQL Server Flex resources if: ${{ inputs.list_only != 'true' }} run: | + echo "::group::delete SQL Server Flex resources" set -e - stackit auth activate-service-account --service-account-key-path .svc_acc.json - for s in $(stackit --project-id ${{ inputs.project_id }} beta sqlserverflex instance list --output-format json | jq -r '.[] | select(.name | startswith("tf-acc-")) | .id'); do stackit -y --project-id ${{ inputs.project_id }} beta sqlserverflex instance delete $s; done + stackit --verbosity ${{ inputs.log_level }} auth activate-service-account --service-account-key-path .svc_acc.json + for s in $(stackit --verbosity ${{ inputs.log_level }} --project-id ${{ inputs.project_id }} beta sqlserverflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}")) | .id'); do stackit --verbosity ${{ inputs.log_level }} -y --project-id ${{ inputs.project_id }} beta sqlserverflex instance delete $s; done + echo "::endgroup::" + shell: bash + + - name: Skip Delete SQL Server Flex resources + if: ${{ inputs.list_only == 'true' }} + run: | + echo "::group::delete SQL Server Flex resources" + set -e + echo "Skip deleting: list only mode" + echo "::endgroup::" shell: bash - name: Delete PostgreSQL Flex resources if: ${{ inputs.list_only != 'true' }} run: | + echo "::group::delete PostgreSQL Flex resources" set -e stackit auth activate-service-account --service-account-key-path .svc_acc.json - for s in $(stackit --project-id ${{ inputs.project_id }} postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("tf-acc-")) | .id'); do stackit -y --project-id ${{ inputs.project_id }} postgresflex instance delete $s; done + for s in $(stackit --verbosity ${{ inputs.log_level }} --project-id ${{ inputs.project_id }} postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}")) | .id'); do stackit --verbosity ${{ inputs.log_level }} -y --project-id ${{ inputs.project_id }} postgresflex instance delete $s; done + echo "::endgroup::" + shell: bash + + - name: Skip Delete PostgreSQL Flex resources + if: ${{ inputs.list_only == 'true' }} + run: | + echo "::group::delete PostgreSQL Flex resources" + set -e + echo "Skip deleting: list only mode" + echo "::endgroup::" shell: bash diff --git a/.github/workflows/clean_up.yaml b/.github/workflows/clean_up.yaml index f918bb87..4a5b54be 100644 --- a/.github/workflows/clean_up.yaml +++ b/.github/workflows/clean_up.yaml @@ -9,7 +9,13 @@ on: default: true required: true - logLevel: + res_prefix: + description: "resource name prefix" + type: string + default: 'tf-acc-' + required: true + + log_level: description: 'Log Level' required: true default: 'warning' @@ -18,6 +24,7 @@ on: - info - warning - debug + - error jobs: clean: @@ -32,6 +39,7 @@ jobs: with: project_id: ${{ vars.TF_ACC_PROJECT_ID }} region: 'eu01' - tf_resource_prefix: 'tf-acc-' + tf_resource_prefix: ${{ inputs.res_prefix }} service_account_json_content_b64: "${{ secrets.TF_ACC_SERVICE_ACCOUNT_JSON_B64 }}" list_only: ${{ inputs.list_only }} + log_level: ${{ inputs.log_level }} From 94f3dad9631b544fe5135c88e07f58778e6e93da Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 18 Mar 2026 11:17:42 +0100 Subject: [PATCH 09/37] fix: update pipelines [skip ci] --- .github/actions/clean_up/action.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/actions/clean_up/action.yaml b/.github/actions/clean_up/action.yaml index c9c2e4a8..1cea3615 100644 --- a/.github/actions/clean_up/action.yaml +++ b/.github/actions/clean_up/action.yaml @@ -146,10 +146,8 @@ runs: - name: Skip Delete SQL Server Flex resources if: ${{ inputs.list_only == 'true' }} run: | - echo "::group::delete SQL Server Flex resources" set -e echo "Skip deleting: list only mode" - echo "::endgroup::" shell: bash - name: Delete PostgreSQL Flex resources @@ -165,8 +163,6 @@ runs: - name: Skip Delete PostgreSQL Flex resources if: ${{ inputs.list_only == 'true' }} run: | - echo "::group::delete PostgreSQL Flex resources" set -e echo "Skip deleting: list only mode" - echo "::endgroup::" shell: bash From 97645d7a66684fcfe96744f5a46521f1f3534da4 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 18 Mar 2026 11:24:57 +0100 Subject: [PATCH 10/37] fix: update pipelines [skip ci] --- .github/workflows/tf-acc-test.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tf-acc-test.yaml b/.github/workflows/tf-acc-test.yaml index 743a091c..473ad815 100644 --- a/.github/workflows/tf-acc-test.yaml +++ b/.github/workflows/tf-acc-test.yaml @@ -13,10 +13,12 @@ on: inputs: enable_debug: description: "enable terraform debug logs" - default: 'false' + type: boolean + default: false required: true test_timeout_string: description: "string that determines the timeout (default: 45m)" + type: string default: '90m' required: true @@ -57,4 +59,3 @@ jobs: tf_acc_kek_key_ring_id: ${{ vars.TF_ACC_KEK_KEY_RING_ID }} tf_acc_kek_key_version: ${{ vars.TF_ACC_KEK_KEY_VERSION }} tf_acc_kek_service_account: ${{ vars.TF_ACC_KEK_SERVICE_ACCOUNT }} - tf_debug: ${{ inputs.enable_debug }} From 83b0860115b0dd5f3aa9aad3c3e7d331c2e53550 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 25 Mar 2026 09:40:44 +0100 Subject: [PATCH 11/37] fix: adjust timeouts to 90 mins --- .../postgresflexalpha/database/resource.go | 12 +++++----- .../postgresflexalpha/instance/resource.go | 4 ++-- .../postgresflex_acc_test.go | 2 +- .../postgresflexalpha/user/resource.go | 6 ++--- .../sqlserverflexbeta/database/resource.go | 5 ++-- .../sqlserverflexbeta/instance/resource.go | 9 ++++--- .../sqlserverflexbeta/user/resource.go | 24 ++++++++++--------- .../internal/wait/postgresflexalpha/wait.go | 5 ++-- .../internal/wait/sqlserverflexbeta/wait.go | 4 +--- 9 files changed, 38 insertions(+), 33 deletions(-) diff --git a/stackit/internal/services/postgresflexalpha/database/resource.go b/stackit/internal/services/postgresflexalpha/database/resource.go index fc9390e3..457dc242 100644 --- a/stackit/internal/services/postgresflexalpha/database/resource.go +++ b/stackit/internal/services/postgresflexalpha/database/resource.go @@ -209,8 +209,8 @@ func (r *databaseResource) Create( ) database, err := postgresflexalphaWait.GetDatabaseByIdWaitHandler(ctx, r.client.DefaultAPI, projectID, instanceID, region, databaseID). - SetTimeout(15 * time.Minute). - SetSleepBeforeWait(15 * time.Second). + SetTimeout(30 * time.Minute). + SetSleepBeforeWait(10 * time.Second). WaitWithContext(ctx) if err != nil { core.LogAndAddError( @@ -279,8 +279,8 @@ func (r *databaseResource) Read( ) databaseResp, err := postgresflexalphaWait.GetDatabaseByIdWaitHandler(ctx, r.client.DefaultAPI, projectID, instanceID, region, databaseID). - SetTimeout(15 * time.Minute). - SetSleepBeforeWait(15 * time.Second). + SetTimeout(30 * time.Minute). + SetSleepBeforeWait(10 * time.Second). WaitWithContext(ctx) if err != nil { core.LogAndAddError( @@ -386,8 +386,8 @@ func (r *databaseResource) Update( ctx = core.LogResponse(ctx) databaseResp, err := postgresflexalphaWait.GetDatabaseByIdWaitHandler(ctx, r.client.DefaultAPI, projectId, instanceId, region, databaseId). - SetTimeout(15 * time.Minute). - SetSleepBeforeWait(15 * time.Second). + SetTimeout(30 * time.Minute). + SetSleepBeforeWait(10 * time.Second). WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "error updating database", err.Error()) diff --git a/stackit/internal/services/postgresflexalpha/instance/resource.go b/stackit/internal/services/postgresflexalpha/instance/resource.go index b6a6bfa7..ad99978e 100644 --- a/stackit/internal/services/postgresflexalpha/instance/resource.go +++ b/stackit/internal/services/postgresflexalpha/instance/resource.go @@ -208,7 +208,7 @@ func (r *instanceResource) Create( ) waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectID, region, *instanceID). - SetTimeout(30 * time.Minute). + SetTimeout(90 * time.Minute). SetSleepBeforeWait(10 * time.Second). WaitWithContext(ctx) if err != nil { @@ -446,7 +446,7 @@ func (r *instanceResource) Update( region, instanceID, ). - SetTimeout(30 * time.Minute). + SetTimeout(90 * time.Minute). SetSleepBeforeWait(10 * time.Second). WaitWithContext(ctx) if err != nil { diff --git a/stackit/internal/services/postgresflexalpha/postgresflex_acc_test.go b/stackit/internal/services/postgresflexalpha/postgresflex_acc_test.go index 874556e2..6c057cfb 100644 --- a/stackit/internal/services/postgresflexalpha/postgresflex_acc_test.go +++ b/stackit/internal/services/postgresflexalpha/postgresflex_acc_test.go @@ -799,7 +799,7 @@ func testAccCheckPostgresFlexDestroy(s *terraform.State) error { testutils.ProjectId, testutils.Region, items[i].Id, - 15*time.Minute, + 30*time.Minute, 10*time.Second, ) if err != nil { diff --git a/stackit/internal/services/postgresflexalpha/user/resource.go b/stackit/internal/services/postgresflexalpha/user/resource.go index b7c79f6b..eb537a60 100644 --- a/stackit/internal/services/postgresflexalpha/user/resource.go +++ b/stackit/internal/services/postgresflexalpha/user/resource.go @@ -241,7 +241,7 @@ func (r *userResource) Create( ).SetSleepBeforeWait( 10 * time.Second, ).SetTimeout( - 15 * time.Minute, + 30 * time.Minute, ).WaitWithContext(ctx) if err != nil { @@ -322,7 +322,7 @@ func (r *userResource) Read( ).SetSleepBeforeWait( 10 * time.Second, ).SetTimeout( - 15 * time.Minute, + 30 * time.Minute, ).WaitWithContext(ctx) if err != nil { @@ -445,7 +445,7 @@ func (r *userResource) Update( ).SetSleepBeforeWait( 10 * time.Second, ).SetTimeout( - 15 * time.Minute, + 30 * time.Minute, ).WaitWithContext(ctx) if err != nil { diff --git a/stackit/internal/services/sqlserverflexbeta/database/resource.go b/stackit/internal/services/sqlserverflexbeta/database/resource.go index b8ed1cad..b8d07540 100644 --- a/stackit/internal/services/sqlserverflexbeta/database/resource.go +++ b/stackit/internal/services/sqlserverflexbeta/database/resource.go @@ -193,6 +193,7 @@ func (r *databaseResource) Create(ctx context.Context, req resource.CreateReques data.Owner.ValueString(), ). SetSleepBeforeWait(10 * time.Second). + SetTimeout(90 * time.Minute). WaitWithContext(ctx) if err != nil { core.LogAndAddError( @@ -253,9 +254,9 @@ func (r *databaseResource) Create(ctx context.Context, req resource.CreateReques region, databaseName, ).SetSleepBeforeWait( - 30 * time.Second, + 10 * time.Second, ).SetTimeout( - 15 * time.Minute, + 90 * time.Minute, ).WaitWithContext(ctx) if err != nil { core.LogAndAddError( diff --git a/stackit/internal/services/sqlserverflexbeta/instance/resource.go b/stackit/internal/services/sqlserverflexbeta/instance/resource.go index 63bfb383..bb7e67b4 100644 --- a/stackit/internal/services/sqlserverflexbeta/instance/resource.go +++ b/stackit/internal/services/sqlserverflexbeta/instance/resource.go @@ -354,8 +354,8 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques waitResp, err := wait. UpdateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectID, instanceID, region). - SetSleepBeforeWait(15 * time.Second). - SetTimeout(45 * time.Minute). + SetSleepBeforeWait(10 * time.Second). + SetTimeout(90 * time.Minute). WaitWithContext(ctx) if err != nil { core.LogAndAddError( @@ -416,7 +416,10 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = core.LogResponse(ctx) - delResp, err := wait.DeleteInstanceWaitHandler(ctx, r.client.DefaultAPI, projectID, instanceID, region).WaitWithContext(ctx) + delResp, err := wait.DeleteInstanceWaitHandler(ctx, r.client.DefaultAPI, projectID, instanceID, region). + SetSleepBeforeWait(10 * time.Second). + SetTimeout(90 * time.Minute). + WaitWithContext(ctx) if err != nil { core.LogAndAddError( ctx, diff --git a/stackit/internal/services/sqlserverflexbeta/user/resource.go b/stackit/internal/services/sqlserverflexbeta/user/resource.go index 0c04f31b..363ce203 100644 --- a/stackit/internal/services/sqlserverflexbeta/user/resource.go +++ b/stackit/internal/services/sqlserverflexbeta/user/resource.go @@ -308,7 +308,7 @@ func (r *userResource) Create( region, userId, ).SetSleepBeforeWait( - 90 * time.Second, + 10 * time.Second, ).SetTimeout( 90 * time.Minute, ).WaitWithContext(ctx) @@ -459,23 +459,23 @@ func (r *userResource) Delete( ctx = core.InitProviderContext(ctx) - projectId := model.ProjectId.ValueString() - instanceId := model.InstanceId.ValueString() - userId := model.UserId.ValueInt64() + projectID := model.ProjectId.ValueString() + instanceID := model.InstanceId.ValueString() + userID := model.UserId.ValueInt64() region := model.Region.ValueString() - ctx = tflog.SetField(ctx, "project_id", projectId) - ctx = tflog.SetField(ctx, "instance_id", instanceId) - ctx = tflog.SetField(ctx, "user_id", userId) + ctx = tflog.SetField(ctx, "project_id", projectID) + ctx = tflog.SetField(ctx, "instance_id", instanceID) + ctx = tflog.SetField(ctx, "user_id", userID) ctx = tflog.SetField(ctx, "region", region) // Delete existing record set // err := r.client.DeleteUserRequest(ctx, projectId, region, instanceId, userId).Execute() - err := r.client.DefaultAPI.DeleteUserRequest(ctx, projectId, region, instanceId, userId).Execute() + err := r.client.DefaultAPI.DeleteUserRequest(ctx, projectID, region, instanceID, userID).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) if !ok { - // TODO err handling + core.LogAndAddError(ctx, &resp.Diagnostics, "User Delete Error", fmt.Sprintf("error is no oapi error: %v", err)) return } @@ -487,12 +487,14 @@ func (r *userResource) Delete( // tflog.Warn(ctx, "[delete user] Wait handler got error 500") // return false, nil, nil default: - // TODO err handling + core.LogAndAddError(ctx, &resp.Diagnostics, "User Delete Error", fmt.Sprintf("Unexpected API error: %v", err)) return } } // Delete existing record set - _, err = sqlserverflexbetaWait.DeleteUserWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, userId). + _, err = sqlserverflexbetaWait.DeleteUserWaitHandler(ctx, r.client.DefaultAPI, projectID, region, instanceID, userID). + SetTimeout(90 * time.Minute). + SetSleepBeforeWait(10 * time.Second). WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "User Delete Error", fmt.Sprintf("Calling API: %v", err)) diff --git a/stackit/internal/wait/postgresflexalpha/wait.go b/stackit/internal/wait/postgresflexalpha/wait.go index 00295c42..71877f76 100644 --- a/stackit/internal/wait/postgresflexalpha/wait.go +++ b/stackit/internal/wait/postgresflexalpha/wait.go @@ -281,8 +281,8 @@ func GetDatabaseByIdWaitHandler( if databaseID > math.MaxInt32 { return false, nil, fmt.Errorf("databaseID too large for int32") } - dbId32 := int32(databaseID) //nolint:gosec // is checked above - s, err := a.GetDatabaseRequest(ctx, projectID, region, instanceID, dbId32).Execute() + dbID32 := int32(databaseID) //nolint:gosec // is checked above + s, err := a.GetDatabaseRequest(ctx, projectID, region, instanceID, dbID32).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) @@ -290,6 +290,7 @@ func GetDatabaseByIdWaitHandler( return false, nil, fmt.Errorf("could not convert error to oapierror.GenericOpenAPIError") } switch oapiErr.StatusCode { + // TODO: work-around case http.StatusBadGateway, http.StatusGatewayTimeout, http.StatusServiceUnavailable: tflog.Warn( ctx, "api responded with 50[2,3,4] status", map[string]interface{}{ diff --git a/stackit/internal/wait/sqlserverflexbeta/wait.go b/stackit/internal/wait/sqlserverflexbeta/wait.go index fb94b9dc..e0830fac 100644 --- a/stackit/internal/wait/sqlserverflexbeta/wait.go +++ b/stackit/internal/wait/sqlserverflexbeta/wait.go @@ -94,6 +94,7 @@ func CreateInstanceWaitHandler( case http.StatusNotFound: return false, nil, nil default: + // TODO: work-around if strings.Contains(err.Error(), "is not a valid InstanceEdition") { tflog.Info(ctx, "API WORKAROUND", map[string]interface{}{"err": err}) return false, nil, nil @@ -263,7 +264,6 @@ func DeleteInstanceWaitHandler( return true, nil, nil }, ) - handler.SetTimeout(30 * time.Minute) return handler } @@ -405,7 +405,5 @@ func DeleteUserWaitHandler( } }, ) - handler.SetTimeout(15 * time.Minute) - handler.SetSleepBeforeWait(15 * time.Second) return handler } From 5a1dc9cd94692b523798bc541d142ce512163a88 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 25 Mar 2026 10:22:48 +0100 Subject: [PATCH 12/37] chore: add terraform install step to action [skip ci] --- .github/actions/acc_test/action.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/actions/acc_test/action.yaml b/.github/actions/acc_test/action.yaml index ff8b1602..857f3e35 100644 --- a/.github/actions/acc_test/action.yaml +++ b/.github/actions/acc_test/action.yaml @@ -94,6 +94,11 @@ runs: fi echo "::endgroup::" + # Install latest version of Terraform + - uses: hashicorp/setup-terraform@v4 + with: + terraform_wrapper: false + - name: Setup JAVA uses: actions/setup-java@v5 with: From 722c46b12de92b31d154ef674b9e786c8ab99421 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 25 Mar 2026 11:09:32 +0100 Subject: [PATCH 13/37] chore: add notification action [skip ci] --- .github/actions/notify/action.yaml | 106 +++++++++++++++++++++++++++++ .github/workflows/notify_pr.yaml | 22 ++++++ .github/workflows/tf-acc-test.yaml | 20 ++++++ 3 files changed, 148 insertions(+) create mode 100644 .github/actions/notify/action.yaml create mode 100644 .github/workflows/notify_pr.yaml diff --git a/.github/actions/notify/action.yaml b/.github/actions/notify/action.yaml new file mode 100644 index 00000000..2a248c7e --- /dev/null +++ b/.github/actions/notify/action.yaml @@ -0,0 +1,106 @@ +name: Send pull request notification to Google Chat +description: | + Sends a notification to a Google Chat room when a pull request is opened. + +inputs: + title: + description: "The title of the notification." + required: true + default: 'no title provided' + + event_author: + description: "The author of the event." + required: true + default: 'unknown' + + event_title: + description: "The title of the event." + required: true + + event_body: + description: "The body of the event." + required: true + default: 'no body provided' + + event_number: + description: "The number of the event." + required: true + default: 'no number provided' + + event_url: + description: "The url of the event." + required: true + default: 'none' + + +runs: + using: "composite" + steps: + - name: Install prerequisites + shell: bash + run: apk add --no-cache curl jq + + - name: Send PR notification to Google Chat + shell: bash + run: | + set -e + + PAYLOAD=$(jq -n \ + --arg repo "${{ github.repository }}" \ + --arg title "${{ inputs.event_title }}" \ + --arg body "${{ inputs.event_body }}" \ + --arg author "${{ inputs.event_author }}" \ + --arg url "${{ inputs.event_url }}" \ + '{ + "header": { + "title": "${{ inputs.title }}", + "subtitle": "Repo: \($repo)", + "imageUrl": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/git.png", + "imageType": "SQUARE" + }, + "sections": [ + { + "header": $title, + "collapsible": false, + "widgets": [ + { + "decoratedText": { + "icon": { + "knownIcon": "PERSON" + }, + "text": "Opened by: \($author)" + } + }, + { + "textParagraph": { + "text": $body, + "maxLines": 2 + } + } + ] + }, + { + "widgets": [ + { + "buttonList": { + "buttons": [ + { + "text": "View Source Event", + "type": "FILLED", + "onClick": { + "openLink": { + "url": $url + } + } + } + ] + } + } + ] + } + ] + }') + + curl --fail-with-body -X POST -H 'Content-Type: application/json' \ + "${{ secrets.GOOGLE_WEBHOOK_URL }}&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD&threadKey=${REPO}/pr/${PR_NUMBER}" \ + -d "$(jq -n --argjson card "$PAYLOAD" '{ "cardsV2": [ { "cardId": "new-pr", "card": $card } ] }')" diff --git a/.github/workflows/notify_pr.yaml b/.github/workflows/notify_pr.yaml new file mode 100644 index 00000000..b80286f5 --- /dev/null +++ b/.github/workflows/notify_pr.yaml @@ -0,0 +1,22 @@ +name: Notify Google Chat on new PR + +on: + pull_request: + types: + - opened + +jobs: + notify-pr-google-chat: + runs-on: docker + container: + image: alpine:latest + steps: + - name: Notify + uses: ./.github/actions/notify + with: + title: New Pull Request + event_title: ${{ github.event.pull_request.title }} + event_author: ${{ github.event.pull_request.user.login }} + event_body: ${{ github.event.pull_request.body || 'No description provided.' }} + event_number: ${{ github.event.pull_request.number }} + event_url: ${{ github.event.pull_request.html_url }} diff --git a/.github/workflows/tf-acc-test.yaml b/.github/workflows/tf-acc-test.yaml index 473ad815..b38997cb 100644 --- a/.github/workflows/tf-acc-test.yaml +++ b/.github/workflows/tf-acc-test.yaml @@ -27,6 +27,16 @@ jobs: name: Acceptance Tests runs-on: stackit-docker steps: + - name: Notify + uses: ./.github/actions/notify + with: + title: Terraform Acceptance Tests started + event_title: ${{ github.event.type }} + event_author: ${{ github.event.actor.login }} + event_body: 'No event body.' + event_number: ${{ github.event.id }} + event_url: "${{ github.repositoryUrl }}" + - name: Checkout uses: actions/checkout@v6 @@ -59,3 +69,13 @@ jobs: tf_acc_kek_key_ring_id: ${{ vars.TF_ACC_KEK_KEY_RING_ID }} tf_acc_kek_key_version: ${{ vars.TF_ACC_KEK_KEY_VERSION }} tf_acc_kek_service_account: ${{ vars.TF_ACC_KEK_SERVICE_ACCOUNT }} + + - name: Notify + uses: ./.github/actions/notify + with: + title: Terraform Acceptance Tests finished + event_title: ${{ github.event.type }} + event_author: ${{ github.event.actor.login }} + event_body: 'No event body.' + event_number: ${{ github.event.id }} + event_url: "${{ github.repositoryUrl }}" From 064d2cf1db35c60adb1e3c1219dcfdb3004023bf Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 25 Mar 2026 11:17:33 +0100 Subject: [PATCH 14/37] chore: add notification action [skip ci] --- .github/actions/notify/action.yaml | 2 +- .github/workflows/notify_pr.yaml | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/actions/notify/action.yaml b/.github/actions/notify/action.yaml index 2a248c7e..ece86e61 100644 --- a/.github/actions/notify/action.yaml +++ b/.github/actions/notify/action.yaml @@ -38,7 +38,7 @@ runs: steps: - name: Install prerequisites shell: bash - run: apk add --no-cache curl jq + run: apt update && apt install -y curl jq - name: Send PR notification to Google Chat shell: bash diff --git a/.github/workflows/notify_pr.yaml b/.github/workflows/notify_pr.yaml index b80286f5..888523da 100644 --- a/.github/workflows/notify_pr.yaml +++ b/.github/workflows/notify_pr.yaml @@ -7,9 +7,7 @@ on: jobs: notify-pr-google-chat: - runs-on: docker - container: - image: alpine:latest + runs-on: stackit-docker steps: - name: Notify uses: ./.github/actions/notify From 683bc64c126924670ee7d53a26777724669e01fe Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 25 Mar 2026 12:14:54 +0100 Subject: [PATCH 15/37] chore: add notification action [skip ci] --- .github/actions/acc_test/action.yaml | 11 -------- .github/actions/notify/action.yaml | 41 ++++++++++++++++++---------- .github/workflows/notify_pr.yaml | 21 ++++++++------ .github/workflows/tf-acc-test.yaml | 6 ++-- 4 files changed, 43 insertions(+), 36 deletions(-) diff --git a/.github/actions/acc_test/action.yaml b/.github/actions/acc_test/action.yaml index 857f3e35..23bcd84e 100644 --- a/.github/actions/acc_test/action.yaml +++ b/.github/actions/acc_test/action.yaml @@ -65,20 +65,9 @@ inputs: description: "testfile to run" default: '' - -#outputs: -# random-number: -# description: "Random number" -# value: ${{ steps.random-number-generator.outputs.random-number }} - runs: using: "composite" steps: -# - name: Random Number Generator -# id: random-number-generator -# run: echo "random-number=$(echo $RANDOM)" >> $GITHUB_OUTPUT -# shell: bash - - name: Install needed tools shell: bash run: | diff --git a/.github/actions/notify/action.yaml b/.github/actions/notify/action.yaml index ece86e61..c4da2bef 100644 --- a/.github/actions/notify/action.yaml +++ b/.github/actions/notify/action.yaml @@ -1,8 +1,11 @@ -name: Send pull request notification to Google Chat -description: | - Sends a notification to a Google Chat room when a pull request is opened. +name: Send notification via Google Chat +description: "Sends a notification to a Google Chat room when a pull request is opened." inputs: + webhook_url: + description: "The URL of the Google Chat webhook." + required: true + title: description: "The title of the notification." required: true @@ -32,28 +35,35 @@ inputs: required: true default: 'none' - runs: using: "composite" steps: - name: Install prerequisites shell: bash - run: apt update && apt install -y curl jq + run: | + echo "::group::apt install" + set -e + apt update + apt install -y curl jq + echo "::endgroup::" - - name: Send PR notification to Google Chat + - name: Notify via Google Chat Webhook shell: bash + env: + WEBHOOK: ${{ inputs.webhook_url }} run: | set -e PAYLOAD=$(jq -n \ - --arg repo "${{ github.repository }}" \ - --arg title "${{ inputs.event_title }}" \ - --arg body "${{ inputs.event_body }}" \ - --arg author "${{ inputs.event_author }}" \ - --arg url "${{ inputs.event_url }}" \ + --arg header_title "${{ inputs.title }}" \ + --arg repo "${{ github.repository || '' }}" \ + --arg title "${{ inputs.event_title || 'no event title given' }}" \ + --arg body "${{ inputs.event_body || 'no event body given' }}" \ + --arg author "${{ inputs.event_author || 'no event author given' }}" \ + --arg url "${{ inputs.event_url || 'no event url given' }}" \ '{ "header": { - "title": "${{ inputs.title }}", + "title": "$header_title", "subtitle": "Repo: \($repo)", "imageUrl": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/git.png", "imageType": "SQUARE" @@ -101,6 +111,9 @@ runs: ] }') - curl --fail-with-body -X POST -H 'Content-Type: application/json' \ - "${{ secrets.GOOGLE_WEBHOOK_URL }}&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD&threadKey=${REPO}/pr/${PR_NUMBER}" \ + curl \ + --fail-with-body \ + -X POST \ + -H 'Content-Type: application/json' \ + "${{ inputs.webhook_url }}&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD&threadKey=${{ github.repository }}/pr/${{ inputs.event_number }}" \ -d "$(jq -n --argjson card "$PAYLOAD" '{ "cardsV2": [ { "cardId": "new-pr", "card": $card } ] }')" diff --git a/.github/workflows/notify_pr.yaml b/.github/workflows/notify_pr.yaml index 888523da..fd84a220 100644 --- a/.github/workflows/notify_pr.yaml +++ b/.github/workflows/notify_pr.yaml @@ -1,4 +1,4 @@ -name: Notify Google Chat on new PR +name: Notify on new PR on: pull_request: @@ -6,15 +6,20 @@ on: - opened jobs: - notify-pr-google-chat: + notify: + name: Notify via Google Chat runs-on: stackit-docker steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Notify uses: ./.github/actions/notify with: - title: New Pull Request - event_title: ${{ github.event.pull_request.title }} - event_author: ${{ github.event.pull_request.user.login }} - event_body: ${{ github.event.pull_request.body || 'No description provided.' }} - event_number: ${{ github.event.pull_request.number }} - event_url: ${{ github.event.pull_request.html_url }} + webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} + title: "New Pull Request" + event_title: "${{ github.event.pull_request.title }}" + event_author: "${{ github.event.pull_request.user.login }}" + event_body: "${{ github.event.pull_request.body || 'No description provided.' }}" + event_number: "${{ github.event.pull_request.number }}" + event_url: "${{ github.event.pull_request.html_url }}" diff --git a/.github/workflows/tf-acc-test.yaml b/.github/workflows/tf-acc-test.yaml index b38997cb..5d90284d 100644 --- a/.github/workflows/tf-acc-test.yaml +++ b/.github/workflows/tf-acc-test.yaml @@ -27,6 +27,9 @@ jobs: name: Acceptance Tests runs-on: stackit-docker steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Notify uses: ./.github/actions/notify with: @@ -37,9 +40,6 @@ jobs: event_number: ${{ github.event.id }} event_url: "${{ github.repositoryUrl }}" - - name: Checkout - uses: actions/checkout@v6 - - name: Run Test (workflow dispatch) if: ${{ github.event_name == 'workflow_dispatch' }} uses: ./.github/actions/acc_test From 6e6e7716318fe3f2a0761c8fd9edecd81bf4ea44 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 25 Mar 2026 12:17:16 +0100 Subject: [PATCH 16/37] chore: add notification action [skip ci] --- .github/workflows/tf-acc-test.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/tf-acc-test.yaml b/.github/workflows/tf-acc-test.yaml index 5d90284d..93c7832c 100644 --- a/.github/workflows/tf-acc-test.yaml +++ b/.github/workflows/tf-acc-test.yaml @@ -33,6 +33,7 @@ jobs: - name: Notify uses: ./.github/actions/notify with: + webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} title: Terraform Acceptance Tests started event_title: ${{ github.event.type }} event_author: ${{ github.event.actor.login }} @@ -73,6 +74,7 @@ jobs: - name: Notify uses: ./.github/actions/notify with: + webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} title: Terraform Acceptance Tests finished event_title: ${{ github.event.type }} event_author: ${{ github.event.actor.login }} From bb15293dd314f263a7c01bd3fd58da6c3de00a7f Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 25 Mar 2026 13:30:36 +0100 Subject: [PATCH 17/37] fix: adjust timeout --- .github/actions/notify/action.yaml | 45 ++++++++++++++----- .../internal/wait/postgresflexalpha/wait.go | 2 +- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/.github/actions/notify/action.yaml b/.github/actions/notify/action.yaml index c4da2bef..8c3fbdd1 100644 --- a/.github/actions/notify/action.yaml +++ b/.github/actions/notify/action.yaml @@ -38,6 +38,19 @@ inputs: runs: using: "composite" steps: +# - name: event list +# shell: bash +# run: | +# cat <<'EOF' +# ${{ toJSON(github) }} +# EOF +# +# - name: print env +# shell: bash +# run: | +# env +# exit 1 + - name: Install prerequisites shell: bash run: | @@ -54,23 +67,23 @@ runs: run: | set -e - PAYLOAD=$(jq -n \ - --arg header_title "${{ inputs.title }}" \ + PAYLOAD=$(jq -n -r \ + --arg header "${{ inputs.title }}" \ --arg repo "${{ github.repository || '' }}" \ --arg title "${{ inputs.event_title || 'no event title given' }}" \ --arg body "${{ inputs.event_body || 'no event body given' }}" \ --arg author "${{ inputs.event_author || 'no event author given' }}" \ - --arg url "${{ inputs.event_url || 'no event url given' }}" \ - '{ + --arg url "${{ inputs.event_url || github.repositoryUrl || github.server_url }}" \ + '{ "cardsV2": [ { "cardId": "notify-${{ github.run_id }}", "card": { "header": { - "title": "$header_title", + "title": "\($header)", "subtitle": "Repo: \($repo)", "imageUrl": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/git.png", "imageType": "SQUARE" }, "sections": [ { - "header": $title, + "header": "\($title)", "collapsible": false, "widgets": [ { @@ -83,7 +96,7 @@ runs: }, { "textParagraph": { - "text": $body, + "text": "\($body)", "maxLines": 2 } } @@ -99,7 +112,7 @@ runs: "type": "FILLED", "onClick": { "openLink": { - "url": $url + "url": "\($url)" } } } @@ -109,11 +122,21 @@ runs: ] } ] - }') + }} ] }') + + #curl \ + # --fail-with-body \ + # -X POST \ + # -H 'Content-Type: application/json' \ + # "${{ inputs.webhook_url }}&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD&threadKey=${{ github.repository }}/pr/${{ inputs.event_number }}" \ + # -d "$(jq -n --argjson card "$PAYLOAD" '{ "cardsV2": [ { "cardId": "new-pr", "card": "\($card)" } ] }')" + + #CARD=$(jq -n --argjson card $(echo $PAYLOAD | jq -r) '{ "cardsV2": [ { "cardId": "notify", "card": $card } ] }') + echo "${PAYLOAD}" | jq -r curl \ --fail-with-body \ -X POST \ -H 'Content-Type: application/json' \ - "${{ inputs.webhook_url }}&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD&threadKey=${{ github.repository }}/pr/${{ inputs.event_number }}" \ - -d "$(jq -n --argjson card "$PAYLOAD" '{ "cardsV2": [ { "cardId": "new-pr", "card": $card } ] }')" + "${{ inputs.webhook_url }}" \ + -d "${PAYLOAD}" diff --git a/stackit/internal/wait/postgresflexalpha/wait.go b/stackit/internal/wait/postgresflexalpha/wait.go index 71877f76..930fe501 100644 --- a/stackit/internal/wait/postgresflexalpha/wait.go +++ b/stackit/internal/wait/postgresflexalpha/wait.go @@ -58,7 +58,7 @@ func CreateInstanceWaitHandler( ) *wait.AsyncActionHandler[v3alpha1api.GetInstanceResponse] { instanceCreated := false var instanceGetResponse *v3alpha1api.GetInstanceResponse - maxWait := time.Minute * 45 + maxWait := time.Minute * 90 startTime := time.Now() extendedTimeout := 0 maxFailedCount := 3 From d5b4e02437c919c591a47f10c9736590724c7eeb Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 25 Mar 2026 13:31:03 +0100 Subject: [PATCH 18/37] fix: adjust timeout --- .github/actions/notify/action.yaml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/actions/notify/action.yaml b/.github/actions/notify/action.yaml index 8c3fbdd1..f260d087 100644 --- a/.github/actions/notify/action.yaml +++ b/.github/actions/notify/action.yaml @@ -124,16 +124,6 @@ runs: ] }} ] }') - #curl \ - # --fail-with-body \ - # -X POST \ - # -H 'Content-Type: application/json' \ - # "${{ inputs.webhook_url }}&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD&threadKey=${{ github.repository }}/pr/${{ inputs.event_number }}" \ - # -d "$(jq -n --argjson card "$PAYLOAD" '{ "cardsV2": [ { "cardId": "new-pr", "card": "\($card)" } ] }')" - - #CARD=$(jq -n --argjson card $(echo $PAYLOAD | jq -r) '{ "cardsV2": [ { "cardId": "notify", "card": $card } ] }') - echo "${PAYLOAD}" | jq -r - curl \ --fail-with-body \ -X POST \ From 8a6d9321072df24bd428f7d6aea4c5223e7e00c7 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Wed, 25 Mar 2026 13:40:23 +0100 Subject: [PATCH 19/37] chore: add notifications [skip ci] --- .github/workflows/ci_new.yaml | 11 +++++++++++ .github/workflows/clean_up.yaml | 11 +++++++++++ .github/workflows/publish.yaml | 11 +++++++++++ .github/workflows/tf-acc-test.yaml | 4 ++-- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_new.yaml b/.github/workflows/ci_new.yaml index 08239560..d79f806a 100644 --- a/.github/workflows/ci_new.yaml +++ b/.github/workflows/ci_new.yaml @@ -33,6 +33,17 @@ jobs: - name: Checkout uses: actions/checkout@v6 + - name: Notify + uses: ./.github/actions/notify + with: + webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} + title: CI pipeline started + event_title: ${{ github.event.type }} + event_author: ${{ github.event.actor.login }} + event_body: 'No event body.' + event_number: ${{ github.event.id }} + event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ github.run_id }}" + - name: Check GoReleaser uses: goreleaser/goreleaser-action@v7 with: diff --git a/.github/workflows/clean_up.yaml b/.github/workflows/clean_up.yaml index 4a5b54be..318c5054 100644 --- a/.github/workflows/clean_up.yaml +++ b/.github/workflows/clean_up.yaml @@ -34,6 +34,17 @@ jobs: - name: Checkout uses: actions/checkout@v6 + - name: Notify + uses: ./.github/actions/notify + with: + webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} + title: CI pipeline started + event_title: ${{ github.event.type }} + event_author: ${{ github.event.actor.login }} + event_body: "Filter: ${{ inputs.res_prefix }}" + event_number: ${{ github.event.id }} + event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ github.run_id }}" + - name: Clean uses: ./.github/actions/clean_up with: diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 633953f4..2810d5c4 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -47,6 +47,17 @@ jobs: with: fetch-tags: true + - name: Notify + uses: ./.github/actions/notify + with: + webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} + title: Publish started + event_title: ${{ github.event.type }} + event_author: ${{ github.event.actor.login }} + event_body: "Trigger: ${{ github.event_name }}" + event_number: ${{ github.event.id }} + event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ github.run_id }}" + - name: Setup Go uses: actions/setup-go@v6 with: diff --git a/.github/workflows/tf-acc-test.yaml b/.github/workflows/tf-acc-test.yaml index 93c7832c..85c78437 100644 --- a/.github/workflows/tf-acc-test.yaml +++ b/.github/workflows/tf-acc-test.yaml @@ -39,7 +39,7 @@ jobs: event_author: ${{ github.event.actor.login }} event_body: 'No event body.' event_number: ${{ github.event.id }} - event_url: "${{ github.repositoryUrl }}" + event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ github.run_id }}" - name: Run Test (workflow dispatch) if: ${{ github.event_name == 'workflow_dispatch' }} @@ -80,4 +80,4 @@ jobs: event_author: ${{ github.event.actor.login }} event_body: 'No event body.' event_number: ${{ github.event.id }} - event_url: "${{ github.repositoryUrl }}" + event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ github.run_id }}" From 2893a11c0a4b146a55f40b370d963c400a20eb1c Mon Sep 17 00:00:00 2001 From: Marcel_Henselin Date: Thu, 26 Mar 2026 16:18:00 +0000 Subject: [PATCH 20/37] chore: refactor pipelines (#96) ## Description relates to #1234 ## Checklist - [ ] Issue was linked above - [ ] Code format was applied: `make fmt` - [ ] Examples were added / adjusted (see `examples/` directory) - [x] Docs are up-to-date: `make generate-docs` (will be checked by CI) - [ ] Unit tests got implemented or updated - [ ] Acceptance tests got implemented or updated (see e.g. [here](https://github.com/stackitcloud/terraform-provider-stackit/blob/f5f99d170996b208672ae684b6da53420e369563/stackit/internal/services/dns/dns_acc_test.go)) - [x] Unit tests are passing: `make test` (will be checked by CI) - [x] No linter issues: `make lint` (will be checked by CI) Co-authored-by: Marcel S. Henselin Reviewed-on: https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pulls/96 --- .github/actions/acc_test/action.yaml | 85 ++++++++----------- .github/workflows/clean_up.yaml | 10 +-- .github/workflows/tf-acc-test.yaml | 31 +++++-- .../sqlserverflex_acc_test.go | 13 ++- 4 files changed, 74 insertions(+), 65 deletions(-) diff --git a/.github/actions/acc_test/action.yaml b/.github/actions/acc_test/action.yaml index 23bcd84e..13674a9a 100644 --- a/.github/actions/acc_test/action.yaml +++ b/.github/actions/acc_test/action.yaml @@ -65,6 +65,11 @@ inputs: description: "testfile to run" default: '' +outputs: + result: + value: ${{ steps.testrun.result }} + description: "the output of the tests" + runs: using: "composite" steps: @@ -88,6 +93,10 @@ runs: with: terraform_wrapper: false + - uses: actions/setup-node@v6 + with: + node-version: '24.x' + - name: Setup JAVA uses: actions/setup-java@v5 with: @@ -190,8 +199,8 @@ runs: ls -l stackit/"${{ inputs.service_account_json_file_path }}" echo "::endgroup::" - - name: Run acceptance test file - if: ${{ inputs.test_file != '' }} + - name: Run acceptance tests + id: testrun shell: bash run: | echo "::group::go test file" @@ -203,7 +212,10 @@ runs: export TF_LOG fi + testfile="${{ inputs.test_file }}" + echo "Running acceptance tests for the terraform provider" + set +e cd stackit || exit 1 TF_ACC=1 \ TF_ACC_PROJECT_ID=${TF_ACC_PROJECT_ID} \ @@ -214,7 +226,16 @@ runs: TF_ACC_KEK_KEY_RING_ID=${TF_ACC_KEK_KEY_RING_ID} \ TF_ACC_KEK_KEY_VERSION=${TF_ACC_KEK_KEY_VERSION} \ TF_ACC_KEK_SERVICE_ACCOUNT=${TF_ACC_KEK_SERVICE_ACCOUNT} \ - go test -v ${{ inputs.test_file }} -timeout=${{ inputs.test_timeout_string }} + go test -v ${testfile} -timeout=${{ inputs.test_timeout_string }} | tee -a acc_test_run.log + echo "::endgroup::" + set -e + echo "::group::go test result" + if [ $? -ne 0 ]; then + echo "Test failed, see acc_test_run.log for details" + res=$(cat acc_test_run.log | grep -v "=== RUN" | grep -v "\-\-\- PASS" | grep -v "=== CONT" | grep -v "=== PAUSE") + echo "result=${res}" >> "$GITHUB_OUTPUT" + exit 1 + fi echo "::endgroup::" env: TF_ACC_PROJECT_ID: ${{ inputs.project_id }} @@ -225,55 +246,19 @@ runs: TF_ACC_KEK_KEY_VERSION: ${{ inputs.tf_acc_kek_key_version }} TF_ACC_KEK_SERVICE_ACCOUNT: ${{ inputs.tf_acc_kek_service_account }} -# does not work correctly -# - name: Run test action -# if: ${{ inputs.test_file == '' }} -# env: -# TF_ACC: 1 -# TF_ACC_PROJECT_ID: ${{ inputs.project_id }} -# TF_ACC_REGION: ${{ inputs.region }} -# TF_ACC_TEST_PROJECT_USER_EMAIL: ${{ inputs.project_user_email }} -# TF_ACC_KEK_KEY_ID: ${{ inputs.tf_acc_kek_key_id }} -# TF_ACC_KEK_KEY_RING_ID: ${{ inputs.tf_acc_kek_key_ring_id }} -# TF_ACC_KEK_KEY_VERSION: ${{ inputs.tf_acc_kek_key_version }} -# TF_ACC_KEK_SERVICE_ACCOUNT: ${{ inputs.tf_acc_kek_service_account }} -# TF_ACC_SERVICE_ACCOUNT_FILE: ${{ steps.service_account.outputs.safile }} -# uses: robherley/go-test-action@v0 -# with: -# testArguments: "./... -timeout ${{ inputs.test_timeout_string }}" -# moduleDirectory: "stackit" - - - name: Run acceptance tests - if: ${{ inputs.test_file == '' }} + - name: Artifact upload start shell: bash run: | - echo "::group::go test all" - set -e - set -o pipefail + echo "::group::artifact upload" - if [[ "${{ inputs.tf_debug }}" == "true" ]]; then - TF_LOG=INFO - export TF_LOG - fi + - name: Upload test log artifact + if: always() + uses: actions/upload-artifact@v3 + with: + name: acc_test.log + path: "stackit/acc_test_run.log" - echo "Running acceptance tests for the terraform provider" - cd stackit || exit 1 - TF_ACC=1 \ - TF_ACC_PROJECT_ID=${TF_ACC_PROJECT_ID} \ - TF_ACC_REGION=${TF_ACC_REGION} \ - TF_ACC_TEST_PROJECT_USER_EMAIL=${TF_ACC_TEST_PROJECT_USER_EMAIL} \ - TF_ACC_SERVICE_ACCOUNT_FILE="${PWD}/${{ inputs.service_account_json_file_path }}" \ - TF_ACC_KEK_KEY_ID=${TF_ACC_KEK_KEY_ID} \ - TF_ACC_KEK_KEY_RING_ID=${TF_ACC_KEK_KEY_RING_ID} \ - TF_ACC_KEK_KEY_VERSION=${TF_ACC_KEK_KEY_VERSION} \ - TF_ACC_KEK_SERVICE_ACCOUNT=${TF_ACC_KEK_SERVICE_ACCOUNT} \ - go test -v ./... -timeout=${{ inputs.test_timeout_string }} + - name: Artifact upload finish + shell: bash + run: | echo "::endgroup::" - env: - TF_ACC_PROJECT_ID: ${{ inputs.project_id }} - TF_ACC_REGION: ${{ inputs.region }} - TF_ACC_TEST_PROJECT_USER_EMAIL: ${{ inputs.project_user_email }} - TF_ACC_KEK_KEY_ID: ${{ inputs.tf_acc_kek_key_id }} - TF_ACC_KEK_KEY_RING_ID: ${{ inputs.tf_acc_kek_key_ring_id }} - TF_ACC_KEK_KEY_VERSION: ${{ inputs.tf_acc_kek_key_version }} - TF_ACC_KEK_SERVICE_ACCOUNT: ${{ inputs.tf_acc_kek_service_account }} diff --git a/.github/workflows/clean_up.yaml b/.github/workflows/clean_up.yaml index 318c5054..b366488f 100644 --- a/.github/workflows/clean_up.yaml +++ b/.github/workflows/clean_up.yaml @@ -38,12 +38,12 @@ jobs: uses: ./.github/actions/notify with: webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} - title: CI pipeline started - event_title: ${{ github.event.type }} - event_author: ${{ github.event.actor.login }} + title: CLEAN UP pipeline started + event_title: ${{ forgejo.event_name }} + event_author: ${{ forgejo.actor }} event_body: "Filter: ${{ inputs.res_prefix }}" - event_number: ${{ github.event.id }} - event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ github.run_id }}" + event_number: ${{ forgejo.run_number }} + event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ forgejo.run_number }}" - name: Clean uses: ./.github/actions/clean_up diff --git a/.github/workflows/tf-acc-test.yaml b/.github/workflows/tf-acc-test.yaml index 85c78437..642fe63b 100644 --- a/.github/workflows/tf-acc-test.yaml +++ b/.github/workflows/tf-acc-test.yaml @@ -21,6 +21,16 @@ on: type: string default: '90m' required: true + test_file: + description: "string that determines the test file to run (default all tests)" + type: choice + options: + - tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/wait/postgresflexalpha + - tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha + - tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/wait/sqlserverflexbeta + - tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta + default: '' + required: true jobs: acc_test: @@ -35,14 +45,15 @@ jobs: with: webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} title: Terraform Acceptance Tests started - event_title: ${{ github.event.type }} - event_author: ${{ github.event.actor.login }} - event_body: 'No event body.' - event_number: ${{ github.event.id }} - event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ github.run_id }}" + event_title: ${{ github.event_name }} + event_author: ${{ github.actor }} + event_body: ${{ inputs.test_file }} + event_number: ${{ github.run_id }} + event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ forgejo.run_number }}" - name: Run Test (workflow dispatch) if: ${{ github.event_name == 'workflow_dispatch' }} + id: manual_run uses: ./.github/actions/acc_test with: go-version: ${{ env.GO_VERSION }} @@ -56,9 +67,11 @@ jobs: tf_acc_kek_service_account: ${{ vars.TF_ACC_KEK_SERVICE_ACCOUNT }} tf_debug: ${{ inputs.enable_debug }} test_timeout_string: ${{ inputs.test_timeout_string }} + test_file: ${{ inputs.test_file }} - name: Run Test (automatic) if: ${{ github.event_name != 'workflow_dispatch' }} + id: automatic_run uses: ./.github/actions/acc_test with: go-version: ${{ env.GO_VERSION }} @@ -76,8 +89,8 @@ jobs: with: webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} title: Terraform Acceptance Tests finished - event_title: ${{ github.event.type }} - event_author: ${{ github.event.actor.login }} - event_body: 'No event body.' + event_title: ${{ github.event_name }} + event_author: ${{ github.actor }} + event_body: "${{ steps.automatic_run.outputs.result || steps.manual_run.outputs.result }}" event_number: ${{ github.event.id }} - event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ github.run_id }}" + event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ forgejo.run_number }}" diff --git a/stackit/internal/services/sqlserverflexbeta/sqlserverflex_acc_test.go b/stackit/internal/services/sqlserverflexbeta/sqlserverflex_acc_test.go index 77955dd5..656b93df 100644 --- a/stackit/internal/services/sqlserverflexbeta/sqlserverflex_acc_test.go +++ b/stackit/internal/services/sqlserverflexbeta/sqlserverflex_acc_test.go @@ -182,7 +182,7 @@ func TestAccInstance(t *testing.T) { PreConfig: func() { t.Logf("testing: %s - %s", t.Name(), "update name and verify") }, - ExpectNonEmptyPlan: true, + ExpectNonEmptyPlan: false, Config: testutils.StringFromTemplateMust( "testdata/instance_template.gompl", updNameData, @@ -196,6 +196,17 @@ func TestAccInstance(t *testing.T) { defaultNoEncInstanceTestChecks(testInstanceID, updNameData), ), }, + // Expect empty plan after update + { + PreConfig: func() { + t.Logf("testing: %s - %s", t.Name(), "expect empty plan") + }, + ExpectNonEmptyPlan: false, + Config: testutils.StringFromTemplateMust( + "testdata/instance_template.gompl", + updNameData, + ), + }, // Update size and verify { PreConfig: func() { From 7b2dfaea44a2b341511574609fce014d042a10f8 Mon Sep 17 00:00:00 2001 From: Marcel_Henselin Date: Fri, 27 Mar 2026 15:23:30 +0000 Subject: [PATCH 21/37] chore: refactor pipelines (#97) ## Description relates to #1234 ## Checklist - [ ] Issue was linked above - [ ] Code format was applied: `make fmt` - [ ] Examples were added / adjusted (see `examples/` directory) - [x] Docs are up-to-date: `make generate-docs` (will be checked by CI) - [ ] Unit tests got implemented or updated - [ ] Acceptance tests got implemented or updated (see e.g. [here](https://github.com/stackitcloud/terraform-provider-stackit/blob/f5f99d170996b208672ae684b6da53420e369563/stackit/internal/services/dns/dns_acc_test.go)) - [x] Unit tests are passing: `make test` (will be checked by CI) - [x] No linter issues: `make lint` (will be checked by CI) Co-authored-by: Marcel S. Henselin Reviewed-on: https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pulls/97 --- .github/actions/acc_test/action.yaml | 26 +++++++----- .github/actions/clean_up/action.yaml | 44 +++++++++++++++++-- .github/actions/notify/action.yaml | 63 ++++++++++++++++++---------- .github/workflows/clean_up.yaml | 20 ++++++++- .github/workflows/tf-acc-test.yaml | 42 ++++++++++++++----- 5 files changed, 145 insertions(+), 50 deletions(-) diff --git a/.github/actions/acc_test/action.yaml b/.github/actions/acc_test/action.yaml index 13674a9a..46565e96 100644 --- a/.github/actions/acc_test/action.yaml +++ b/.github/actions/acc_test/action.yaml @@ -67,9 +67,13 @@ inputs: outputs: result: - value: ${{ steps.testrun.result }} + value: "${{ steps.testrun.result }}" description: "the output of the tests" + status: + value: "${{ steps.status.status }}" + description: "the status of the tests" + runs: using: "composite" steps: @@ -213,6 +217,8 @@ runs: fi testfile="${{ inputs.test_file }}" + + echo "result=no result before run" >> "$GITHUB_OUTPUT" echo "Running acceptance tests for the terraform provider" set +e @@ -230,11 +236,14 @@ runs: echo "::endgroup::" set -e echo "::group::go test result" - if [ $? -ne 0 ]; then + + if [[ $(cat acc_test_run.log | grep "FAIL") ]]; then echo "Test failed, see acc_test_run.log for details" res=$(cat acc_test_run.log | grep -v "=== RUN" | grep -v "\-\-\- PASS" | grep -v "=== CONT" | grep -v "=== PAUSE") - echo "result=${res}" >> "$GITHUB_OUTPUT" + echo "result=FAIL: ${res}" >> "$GITHUB_OUTPUT" exit 1 + else + echo "result=no FAIL detected" >> "$GITHUB_OUTPUT" fi echo "::endgroup::" env: @@ -246,10 +255,12 @@ runs: TF_ACC_KEK_KEY_VERSION: ${{ inputs.tf_acc_kek_key_version }} TF_ACC_KEK_SERVICE_ACCOUNT: ${{ inputs.tf_acc_kek_service_account }} - - name: Artifact upload start + - name: Set status output variable + if: always() + id: status shell: bash run: | - echo "::group::artifact upload" + echo "status=${{ steps.testrun.outcome == 'success' && 'SUCCESS' || 'FAILURE' }}" >> "$GITHUB_OUTPUT" - name: Upload test log artifact if: always() @@ -257,8 +268,3 @@ runs: with: name: acc_test.log path: "stackit/acc_test_run.log" - - - name: Artifact upload finish - shell: bash - run: | - echo "::endgroup::" diff --git a/.github/actions/clean_up/action.yaml b/.github/actions/clean_up/action.yaml index 1cea3615..72ee1dad 100644 --- a/.github/actions/clean_up/action.yaml +++ b/.github/actions/clean_up/action.yaml @@ -41,6 +41,14 @@ outputs: description: "stackit cli version" value: ${{ steps.stackit_version.outputs.version }} + pre_count: + description: "number of resources found" + value: ${{ steps.retrieve_pre.outputs.count }} + + post_count: + description: "number of resources found" + value: ${{ steps.retrieve_post.outputs.count }} + runs: using: "composite" steps: @@ -115,7 +123,8 @@ runs: exit 1 fi - - name: Retrieve resources + - name: Retrieve resources before + id: retrieve_pre run: | echo "::group::retrieve resources" set -e @@ -125,11 +134,15 @@ runs: stackit auth activate-service-account --service-account-key-path .svc_acc.json echo "SQL Server Flex resources:" - stackit --verbosity ${{ inputs.log_level }} --project-id "${{ inputs.project_id }}" beta sqlserverflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))' + sql_res=$(stackit --verbosity ${{ inputs.log_level }} --project-id "${{ inputs.project_id }}" beta sqlserverflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))') + sql_count=$(echo "$sql_res" | jq -r '.id' | wc -l) echo "PostgreSQL Flex resources:" - stackit --verbosity ${{ inputs.log_level }} --project-id "${{ inputs.project_id }}" postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))' + pg_res=$(stackit --verbosity ${{ inputs.log_level }} --project-id "${{ inputs.project_id }}" postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))') + pg_count=$(echo "$pg_res" | jq -r '.id' | wc -l) + echo "Number of resources found: ${sql_count} SQL Server Flex, ${pg_count} PostgreSQL Flex" + echo "count=$(( ${pg_count} + ${sql_count} ))" >> $GITHUB_OUTPUT echo "::endgroup::" shell: bash @@ -156,7 +169,7 @@ runs: echo "::group::delete PostgreSQL Flex resources" set -e stackit auth activate-service-account --service-account-key-path .svc_acc.json - for s in $(stackit --verbosity ${{ inputs.log_level }} --project-id ${{ inputs.project_id }} postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}")) | .id'); do stackit --verbosity ${{ inputs.log_level }} -y --project-id ${{ inputs.project_id }} postgresflex instance delete $s; done + for s in $(stackit --verbosity ${{ inputs.log_level }} --project-id ${{ inputs.project_id }} postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}")) | .id'); do stackit --verbosity ${{ inputs.log_level }} -y --project-id ${{ inputs.project_id }} postgresflex instance delete "$s" --force; done echo "::endgroup::" shell: bash @@ -166,3 +179,26 @@ runs: set -e echo "Skip deleting: list only mode" shell: bash + + - name: Retrieve resources after + id: retrieve_post + run: | + echo "::group::retrieve resources" + set -e + echo "authenticating api" + STACKIT_SERVICE_ACCOUNT_KEY_PATH="${PWD}/.svc_acc.json" + export STACKIT_SERVICE_ACCOUNT_KEY_PATH + stackit auth activate-service-account --service-account-key-path .svc_acc.json + + echo "SQL Server Flex resources:" + sql_res=$(stackit --verbosity ${{ inputs.log_level }} --project-id "${{ inputs.project_id }}" beta sqlserverflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))') + sql_count=$(echo "$sql_res" | jq -r '.id' | wc -l) + + echo "PostgreSQL Flex resources:" + pg_res=$(stackit --verbosity ${{ inputs.log_level }} --project-id "${{ inputs.project_id }}" postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))') + pg_count=$(echo "$pg_res" | jq -r '.id' | wc -l) + + echo "Number of resources found: ${sql_count} SQL Server Flex, ${pg_count} PostgreSQL Flex" + echo "count=$(( ${pg_count} + ${sql_count} ))" >> $GITHUB_OUTPUT + echo "::endgroup::" + shell: bash diff --git a/.github/actions/notify/action.yaml b/.github/actions/notify/action.yaml index f260d087..2e72732e 100644 --- a/.github/actions/notify/action.yaml +++ b/.github/actions/notify/action.yaml @@ -9,11 +9,17 @@ inputs: title: description: "The title of the notification." required: true - default: 'no title provided' + + subtitle: + description: "The subtitle of the notification." + default: 'no subtitle provided' + + image_slug: + description: "The slug of the image to be included in the notification." + default: 'git' event_author: description: "The author of the event." - required: true default: 'unknown' event_title: @@ -22,35 +28,23 @@ inputs: event_body: description: "The body of the event." - required: true default: 'no body provided' event_number: description: "The number of the event." - required: true default: 'no number provided' event_url: description: "The url of the event." - required: true default: 'none' + status: + description: "The status of the event." + default: 'UNKNOWN' + runs: using: "composite" steps: -# - name: event list -# shell: bash -# run: | -# cat <<'EOF' -# ${{ toJSON(github) }} -# EOF -# -# - name: print env -# shell: bash -# run: | -# env -# exit 1 - - name: Install prerequisites shell: bash run: | @@ -60,6 +54,27 @@ runs: apt install -y curl jq echo "::endgroup::" + - name: Determine status color + id: status + shell: bash + run: | + case "${{ inputs.status }}" in + SUCCESS) + STATUS_COLOR="006400/228b22" + ADD='{"decoratedText": {"startIcon": {"materialIcon": {"name": "check_circle"}},"text": "SUCCESS"}},' + ;; + FAILURE) + STATUS_COLOR="8b0000/dc143c" + ADD='{"decoratedText": {"startIcon": {"materialIcon": {"name": "stop_circle"}},"text": "FAILURE"}},' + ;; + *) + STATUS_COLOR="483d8b/6495ed" + ADD='' + ;; + esac + echo "color=${STATUS_COLOR}" >> "$GITHUB_OUTPUT" + echo "status_add=${ADD}" >> "$GITHUB_OUTPUT" + - name: Notify via Google Chat Webhook shell: bash env: @@ -69,7 +84,8 @@ runs: PAYLOAD=$(jq -n -r \ --arg header "${{ inputs.title }}" \ - --arg repo "${{ github.repository || '' }}" \ + --arg subtitle "${{ inputs.subtitle }}" \ + --arg imgurl "https://cdn.simpleicons.org/${{ inputs.image_slug }}/${{ steps.status.outputs.color }}" \ --arg title "${{ inputs.event_title || 'no event title given' }}" \ --arg body "${{ inputs.event_body || 'no event body given' }}" \ --arg author "${{ inputs.event_author || 'no event author given' }}" \ @@ -77,8 +93,8 @@ runs: '{ "cardsV2": [ { "cardId": "notify-${{ github.run_id }}", "card": { "header": { "title": "\($header)", - "subtitle": "Repo: \($repo)", - "imageUrl": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/git.png", + "subtitle": "\($subtitle)", + "imageUrl": "\($imgurl)", "imageType": "SQUARE" }, "sections": [ @@ -86,12 +102,13 @@ runs: "header": "\($title)", "collapsible": false, "widgets": [ + ${{ steps.status.outputs.status_add }} { "decoratedText": { - "icon": { + "startIcon": { "knownIcon": "PERSON" }, - "text": "Opened by: \($author)" + "text": "\($author)" } }, { diff --git a/.github/workflows/clean_up.yaml b/.github/workflows/clean_up.yaml index b366488f..d9e61d2c 100644 --- a/.github/workflows/clean_up.yaml +++ b/.github/workflows/clean_up.yaml @@ -38,14 +38,16 @@ jobs: uses: ./.github/actions/notify with: webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} - title: CLEAN UP pipeline started + title: "[START] CLEAN UP pipeline" + subtitle: "${{ forgejo.repository }}" event_title: ${{ forgejo.event_name }} event_author: ${{ forgejo.actor }} - event_body: "Filter: ${{ inputs.res_prefix }}" + event_body: "try to remove all resources with prefix ${{ inputs.res_prefix }}" event_number: ${{ forgejo.run_number }} event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ forgejo.run_number }}" - name: Clean + id: clean uses: ./.github/actions/clean_up with: project_id: ${{ vars.TF_ACC_PROJECT_ID }} @@ -54,3 +56,17 @@ jobs: service_account_json_content_b64: "${{ secrets.TF_ACC_SERVICE_ACCOUNT_JSON_B64 }}" list_only: ${{ inputs.list_only }} log_level: ${{ inputs.log_level }} + + - name: Notify + if: always() + uses: ./.github/actions/notify + with: + webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} + title: "[END] CLEAN UP pipeline" + subtitle: "${{ forgejo.repository }}" + event_title: ${{ forgejo.event_name }} + event_author: ${{ forgejo.actor }} + event_body: "count before cleaning: ${{ steps.clean.outputs.pre_count }}
count after cleaning: ${{ steps.clean.outputs.post_count }}" + event_number: ${{ forgejo.run_number }} + event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ forgejo.run_number }}" + status: ${{ steps.clean.outcome == 'success' && 'SUCCESS' || 'FAILURE' }} diff --git a/.github/workflows/tf-acc-test.yaml b/.github/workflows/tf-acc-test.yaml index 642fe63b..504324ba 100644 --- a/.github/workflows/tf-acc-test.yaml +++ b/.github/workflows/tf-acc-test.yaml @@ -40,19 +40,26 @@ jobs: - name: Checkout uses: actions/checkout@v6 + - name: set start time + id: start_time + run: | + echo "time=$(date --rfc-3339=ns)" >> ${GITHUB_ENV} + echo "start=$(date +%s%N)" >> ${GITHUB_ENV} + - name: Notify uses: ./.github/actions/notify with: webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} - title: Terraform Acceptance Tests started - event_title: ${{ github.event_name }} - event_author: ${{ github.actor }} + title: "[START] Terraform Acceptance Tests" + subtitle: "${{ forgejo.event_name }} on branch ${{ forgejo.ref }}" + event_title: "started: ${{ steps.start_time.outputs.time }}" + event_author: ${{ forgejo.actor }} event_body: ${{ inputs.test_file }} - event_number: ${{ github.run_id }} + event_number: ${{ forgejo.run_number }} event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ forgejo.run_number }}" - name: Run Test (workflow dispatch) - if: ${{ github.event_name == 'workflow_dispatch' }} + if: ${{ forgejo.event_name == 'workflow_dispatch' }} id: manual_run uses: ./.github/actions/acc_test with: @@ -70,7 +77,7 @@ jobs: test_file: ${{ inputs.test_file }} - name: Run Test (automatic) - if: ${{ github.event_name != 'workflow_dispatch' }} + if: ${{ forgejo.event_name != 'workflow_dispatch' }} id: automatic_run uses: ./.github/actions/acc_test with: @@ -84,13 +91,26 @@ jobs: tf_acc_kek_key_version: ${{ vars.TF_ACC_KEK_KEY_VERSION }} tf_acc_kek_service_account: ${{ vars.TF_ACC_KEK_SERVICE_ACCOUNT }} + - name: set end time + id: end_time + run: | + echo "time=$(date --rfc-3339=ns)" >> ${GITHUB_ENV} + end=$(date +%s%N) + echo "end=${end}" >> ${GITHUB_ENV} + start=${{ steps.start_time.outputs.start }} + diff=$((end-start)) + duration=$(printf "%s.%s" "${diff:0: -9}" "${diff: -9:3}") + echo "duration=${duration}" >> ${GITHUB_ENV} + - name: Notify uses: ./.github/actions/notify with: webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} - title: Terraform Acceptance Tests finished - event_title: ${{ github.event_name }} - event_author: ${{ github.actor }} - event_body: "${{ steps.automatic_run.outputs.result || steps.manual_run.outputs.result }}" - event_number: ${{ github.event.id }} + title: "[END] Terraform Acceptance Tests" + subtitle: "${{ forgejo.event_name }} on branch ${{ forgejo.ref }} with status: ${{ forgejo.event_name == 'workflow_dispatch' && steps.manual_run.outputs.status || steps.automatic_run.outputs.status }}" + event_title: "run ended: ${{ steps.end_time.outputs.time }}, duration: ${{ steps.end_time.outputs.duration }} seconds" + event_author: ${{ forgejo.actor }} + event_body: "${{ forgejo.event_name == 'workflow_dispatch' && steps.manual_run.outputs.result || steps.automatic_run.outputs.result }}" + event_number: ${{ forgejo.event.id }} event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ forgejo.run_number }}" + status: "${{ forgejo.event_name == 'workflow_dispatch' && steps.manual_run.outputs.status || steps.automatic_run.outputs.status }}" From edc5e869ce8a5cc59794c60835c39b46f3e804b0 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Fri, 27 Mar 2026 16:25:56 +0100 Subject: [PATCH 22/37] fix: empty string on required input [skip ci] --- .github/workflows/tf-acc-test.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/tf-acc-test.yaml b/.github/workflows/tf-acc-test.yaml index 504324ba..be9c4c58 100644 --- a/.github/workflows/tf-acc-test.yaml +++ b/.github/workflows/tf-acc-test.yaml @@ -30,7 +30,6 @@ on: - tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/wait/sqlserverflexbeta - tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta default: '' - required: true jobs: acc_test: From aac1a2ba1723baa140dcf8276a9d980609bdb2b8 Mon Sep 17 00:00:00 2001 From: Marcel_Henselin Date: Fri, 27 Mar 2026 17:07:50 +0000 Subject: [PATCH 23/37] fix: pipeline_fix (#99) ## Description relates to #1234 ## Checklist - [ ] Issue was linked above - [ ] Code format was applied: `make fmt` - [ ] Examples were added / adjusted (see `examples/` directory) - [x] Docs are up-to-date: `make generate-docs` (will be checked by CI) - [ ] Unit tests got implemented or updated - [ ] Acceptance tests got implemented or updated (see e.g. [here](https://github.com/stackitcloud/terraform-provider-stackit/blob/f5f99d170996b208672ae684b6da53420e369563/stackit/internal/services/dns/dns_acc_test.go)) - [x] Unit tests are passing: `make test` (will be checked by CI) - [x] No linter issues: `make lint` (will be checked by CI) Co-authored-by: Marcel S. Henselin Reviewed-on: https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pulls/99 --- .github/actions/acc_test/action.yaml | 15 +++++++------- .github/actions/clean_up/action.yaml | 31 ++++++++++++++++++++++++---- .github/workflows/ci_new.yaml | 14 +++++++------ .github/workflows/clean_up.yaml | 4 ++-- .github/workflows/publish.yaml | 28 +++++++++++++++++++------ .github/workflows/tf-acc-test.yaml | 28 +++++++++++++++++-------- 6 files changed, 86 insertions(+), 34 deletions(-) diff --git a/.github/actions/acc_test/action.yaml b/.github/actions/acc_test/action.yaml index 46565e96..79f82298 100644 --- a/.github/actions/acc_test/action.yaml +++ b/.github/actions/acc_test/action.yaml @@ -67,11 +67,11 @@ inputs: outputs: result: - value: "${{ steps.testrun.result }}" + value: ${{ steps.testrun.outputs.result }} description: "the output of the tests" status: - value: "${{ steps.status.status }}" + value: ${{ steps.status.outputs.status }} description: "the status of the tests" runs: @@ -207,7 +207,7 @@ runs: id: testrun shell: bash run: | - echo "::group::go test file" + echo "::group::go test" set -e set -o pipefail @@ -233,18 +233,19 @@ runs: TF_ACC_KEK_KEY_VERSION=${TF_ACC_KEK_KEY_VERSION} \ TF_ACC_KEK_SERVICE_ACCOUNT=${TF_ACC_KEK_SERVICE_ACCOUNT} \ go test -v ${testfile} -timeout=${{ inputs.test_timeout_string }} | tee -a acc_test_run.log - echo "::endgroup::" set -e - echo "::group::go test result" if [[ $(cat acc_test_run.log | grep "FAIL") ]]; then + echo "::endgroup::" + echo "::group::go test result" echo "Test failed, see acc_test_run.log for details" res=$(cat acc_test_run.log | grep -v "=== RUN" | grep -v "\-\-\- PASS" | grep -v "=== CONT" | grep -v "=== PAUSE") echo "result=FAIL: ${res}" >> "$GITHUB_OUTPUT" + echo "::endgroup::" exit 1 - else - echo "result=no FAIL detected" >> "$GITHUB_OUTPUT" fi + + echo "result=no FAIL detected" >> "$GITHUB_OUTPUT" echo "::endgroup::" env: TF_ACC_PROJECT_ID: ${{ inputs.project_id }} diff --git a/.github/actions/clean_up/action.yaml b/.github/actions/clean_up/action.yaml index 72ee1dad..c8e142fa 100644 --- a/.github/actions/clean_up/action.yaml +++ b/.github/actions/clean_up/action.yaml @@ -49,6 +49,10 @@ outputs: description: "number of resources found" value: ${{ steps.retrieve_post.outputs.count }} + status: + description: "status of the test" + value: ${{ steps.status.outputs.status }} + runs: using: "composite" steps: @@ -148,11 +152,14 @@ runs: - name: Delete SQL Server Flex resources if: ${{ inputs.list_only != 'true' }} + id: del_sql run: | echo "::group::delete SQL Server Flex resources" - set -e stackit --verbosity ${{ inputs.log_level }} auth activate-service-account --service-account-key-path .svc_acc.json - for s in $(stackit --verbosity ${{ inputs.log_level }} --project-id ${{ inputs.project_id }} beta sqlserverflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}")) | .id'); do stackit --verbosity ${{ inputs.log_level }} -y --project-id ${{ inputs.project_id }} beta sqlserverflex instance delete $s; done + for s in $(stackit --verbosity ${{ inputs.log_level }} --project-id ${{ inputs.project_id }} beta sqlserverflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}")) | .id'); + do + stackit --verbosity ${{ inputs.log_level }} -y --project-id ${{ inputs.project_id }} beta sqlserverflex instance delete $s || echo "status=FAILURE" >> ${GITHUB_OUTPUT}; + done echo "::endgroup::" shell: bash @@ -165,11 +172,14 @@ runs: - name: Delete PostgreSQL Flex resources if: ${{ inputs.list_only != 'true' }} + id: del_pg run: | echo "::group::delete PostgreSQL Flex resources" - set -e stackit auth activate-service-account --service-account-key-path .svc_acc.json - for s in $(stackit --verbosity ${{ inputs.log_level }} --project-id ${{ inputs.project_id }} postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}")) | .id'); do stackit --verbosity ${{ inputs.log_level }} -y --project-id ${{ inputs.project_id }} postgresflex instance delete "$s" --force; done + for s in $(stackit --verbosity ${{ inputs.log_level }} --project-id ${{ inputs.project_id }} postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}")) | .id'); + do + stackit --verbosity ${{ inputs.log_level }} -y --project-id ${{ inputs.project_id }} postgresflex instance delete "$s" --force || echo "status=FAILURE" >> ${GITHUB_OUTPUT}; + done echo "::endgroup::" shell: bash @@ -202,3 +212,16 @@ runs: echo "count=$(( ${pg_count} + ${sql_count} ))" >> $GITHUB_OUTPUT echo "::endgroup::" shell: bash + + - name: Set status + if: always() + id: status + run: | + status="SUCCESS" + if [[ "${{ steps.del_pg.outputs.status }}" == "FAILURE" ]]; then + status=FAILURE" + elif [[ "${{ steps.del_sql.outputs.status }}" == "FAILURE" ]]; then + status=FAILURE" + fi + echo "status=$status" >> $GITHUB_OUTPUT + shell: bash diff --git a/.github/workflows/ci_new.yaml b/.github/workflows/ci_new.yaml index d79f806a..61288df4 100644 --- a/.github/workflows/ci_new.yaml +++ b/.github/workflows/ci_new.yaml @@ -34,15 +34,17 @@ jobs: uses: actions/checkout@v6 - name: Notify + if: always() uses: ./.github/actions/notify with: webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} - title: CI pipeline started - event_title: ${{ github.event.type }} - event_author: ${{ github.event.actor.login }} - event_body: 'No event body.' - event_number: ${{ github.event.id }} - event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ github.run_id }}" + title: "[START] CI pipeline (#${{ forgejo.run_number }})" + subtitle: "${{ forgejo.event_name }} on ${{ forgejo.ref_name }}" + event_title: "${{ forgejo.event_name }} for ${{ forgejo.repository }}" + event_author: ${{ forgejo.actor }} + event_body: "${{ forgejo.event_name }} on ${{ forgejo.ref }} for ${{ forgejo.repository }}" + event_number: ${{ forgejo.run_number }} + event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ forgejo.run_number }}" - name: Check GoReleaser uses: goreleaser/goreleaser-action@v7 diff --git a/.github/workflows/clean_up.yaml b/.github/workflows/clean_up.yaml index d9e61d2c..e1cc291b 100644 --- a/.github/workflows/clean_up.yaml +++ b/.github/workflows/clean_up.yaml @@ -38,7 +38,7 @@ jobs: uses: ./.github/actions/notify with: webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} - title: "[START] CLEAN UP pipeline" + title: "[START] CLEAN UP pipeline (#${{ forgejo.run_number }})" subtitle: "${{ forgejo.repository }}" event_title: ${{ forgejo.event_name }} event_author: ${{ forgejo.actor }} @@ -62,7 +62,7 @@ jobs: uses: ./.github/actions/notify with: webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} - title: "[END] CLEAN UP pipeline" + title: "[END] CLEAN UP pipeline (#${{ forgejo.run_number }})" subtitle: "${{ forgejo.repository }}" event_title: ${{ forgejo.event_name }} event_author: ${{ forgejo.actor }} diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 2810d5c4..dbfbc247 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -51,12 +51,13 @@ jobs: uses: ./.github/actions/notify with: webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} - title: Publish started - event_title: ${{ github.event.type }} - event_author: ${{ github.event.actor.login }} - event_body: "Trigger: ${{ github.event_name }}" - event_number: ${{ github.event.id }} - event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ github.run_id }}" + title: "[START] Publish (#${{ forgejo.run_number }})" + subtitle: "${{ forgejo.event_name }} on branch ${{ forgejo.ref }}" + event_title: "run started" + event_author: ${{ forgejo.actor }} + event_body: "" + event_number: ${{ forgejo.event.id }} + event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ forgejo.run_number }}" - name: Setup Go uses: actions/setup-go@v6 @@ -145,6 +146,7 @@ jobs: --outFile nav.md - name: Publish provider to S3 + id: publish_to_s3 run: | set -e cd release/ @@ -165,3 +167,17 @@ jobs: # echo "${{ github.ref_name }}" >docs/_version.txt scp -o StrictHostKeyChecking=no -r docs ubuntu@${{ vars.DOCS_SERVER_IP }}:/srv/www/ scp -o StrictHostKeyChecking=no nav.md ubuntu@${{ vars.DOCS_SERVER_IP }}:/srv/www/ + + - name: Notify + if: always() + uses: ./.github/actions/notify + with: + webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} + title: "[END] Publish (#${{ forgejo.run_number }})" + subtitle: "${{ forgejo.event_name }} on branch ${{ forgejo.ref }}" + event_title: "released: ${{ steps.get_version.outputs.version }}" + event_author: ${{ forgejo.actor }} + event_body: "" + event_number: ${{ forgejo.event.id }} + event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ forgejo.run_number }}" + status: "${{ steps.publish_to_s3.outcome == 'success' && 'SUCCESS' || 'FAILURE' }}" diff --git a/.github/workflows/tf-acc-test.yaml b/.github/workflows/tf-acc-test.yaml index be9c4c58..730fb0ca 100644 --- a/.github/workflows/tf-acc-test.yaml +++ b/.github/workflows/tf-acc-test.yaml @@ -41,17 +41,20 @@ jobs: - name: set start time id: start_time + continue-on-error: true run: | - echo "time=$(date --rfc-3339=ns)" >> ${GITHUB_ENV} - echo "start=$(date +%s%N)" >> ${GITHUB_ENV} + time=$(date --rfc-3339=ns) + echo "start_time=$time" >> ${GITHUB_OUTPUT} + start=$(date +%s%N) + echo "start=$start" >> ${GITHUB_OUTPUT} - name: Notify uses: ./.github/actions/notify with: webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} - title: "[START] Terraform Acceptance Tests" + title: "[START] Terraform Acceptance Tests (#${{ forgejo.run_number }})" subtitle: "${{ forgejo.event_name }} on branch ${{ forgejo.ref }}" - event_title: "started: ${{ steps.start_time.outputs.time }}" + event_title: "started: ${{ steps.start_time.outputs.start_time }}" event_author: ${{ forgejo.actor }} event_body: ${{ inputs.test_file }} event_number: ${{ forgejo.run_number }} @@ -60,6 +63,7 @@ jobs: - name: Run Test (workflow dispatch) if: ${{ forgejo.event_name == 'workflow_dispatch' }} id: manual_run + continue-on-error: true uses: ./.github/actions/acc_test with: go-version: ${{ env.GO_VERSION }} @@ -78,6 +82,7 @@ jobs: - name: Run Test (automatic) if: ${{ forgejo.event_name != 'workflow_dispatch' }} id: automatic_run + continue-on-error: true uses: ./.github/actions/acc_test with: go-version: ${{ env.GO_VERSION }} @@ -92,22 +97,27 @@ jobs: - name: set end time id: end_time + continue-on-error: true run: | - echo "time=$(date --rfc-3339=ns)" >> ${GITHUB_ENV} + set -e + echo "auto status: ${{ steps.automatic_run.outputs.status }}" + echo "manual status: ${{ steps.manual_run.outputs.status }}" + echo "status: ${{ forgejo.event_name == 'workflow_dispatch' && steps.manual_run.outputs.status || steps.automatic_run.outputs.status }}" + echo "end_time=$(date --rfc-3339=ns)" >> ${GITHUB_OUTPUT} end=$(date +%s%N) - echo "end=${end}" >> ${GITHUB_ENV} + echo "end=${end}" >> ${GITHUB_OUTPUT} start=${{ steps.start_time.outputs.start }} diff=$((end-start)) duration=$(printf "%s.%s" "${diff:0: -9}" "${diff: -9:3}") - echo "duration=${duration}" >> ${GITHUB_ENV} + echo "duration=${duration}" >> ${GITHUB_OUTPUT} - name: Notify uses: ./.github/actions/notify with: webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }} - title: "[END] Terraform Acceptance Tests" + title: "[END] Terraform Acceptance Tests (#${{ forgejo.run_number }})" subtitle: "${{ forgejo.event_name }} on branch ${{ forgejo.ref }} with status: ${{ forgejo.event_name == 'workflow_dispatch' && steps.manual_run.outputs.status || steps.automatic_run.outputs.status }}" - event_title: "run ended: ${{ steps.end_time.outputs.time }}, duration: ${{ steps.end_time.outputs.duration }} seconds" + event_title: "run ended: ${{ steps.end_time.outputs.end_time }}, duration: ${{ steps.end_time.outputs.duration }} seconds" event_author: ${{ forgejo.actor }} event_body: "${{ forgejo.event_name == 'workflow_dispatch' && steps.manual_run.outputs.result || steps.automatic_run.outputs.result }}" event_number: ${{ forgejo.event.id }} From 9ef7ce90295b3f83af55fb82c2da896c1b3a1d29 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Fri, 27 Mar 2026 18:33:12 +0100 Subject: [PATCH 24/37] fix: try fix empty outputs [skip ci] --- .github/actions/acc_test/action.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/actions/acc_test/action.yaml b/.github/actions/acc_test/action.yaml index 46565e96..cb492499 100644 --- a/.github/actions/acc_test/action.yaml +++ b/.github/actions/acc_test/action.yaml @@ -221,6 +221,16 @@ runs: echo "result=no result before run" >> "$GITHUB_OUTPUT" echo "Running acceptance tests for the terraform provider" + + if [[ -z "$testfile" ]]; then + test_file="./..." + fi + + if [[ -z "$testfile" ]]; then + echo "ERROR: No test file provided" + exit 1 + fi + set +e cd stackit || exit 1 TF_ACC=1 \ From 6e3d2b51fada196822061679bf0128cf3366d627 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Fri, 27 Mar 2026 18:34:22 +0100 Subject: [PATCH 25/37] fix: try fix empty outputs [skip ci] --- .github/actions/acc_test/action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/acc_test/action.yaml b/.github/actions/acc_test/action.yaml index cb492499..17c776de 100644 --- a/.github/actions/acc_test/action.yaml +++ b/.github/actions/acc_test/action.yaml @@ -223,7 +223,7 @@ runs: echo "Running acceptance tests for the terraform provider" if [[ -z "$testfile" ]]; then - test_file="./..." + testfile="./..." fi if [[ -z "$testfile" ]]; then From dab47d4690c44f492f6cda0996214b362b5ce91c Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Fri, 27 Mar 2026 21:19:53 +0100 Subject: [PATCH 26/37] fix: try fix test runs [skip ci] --- .github/actions/acc_test/action.yaml | 7 ++++--- .github/workflows/tf-acc-test.yaml | 6 ++++-- .../services/sqlserverflexbeta/sqlserverflex_acc_test.go | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/actions/acc_test/action.yaml b/.github/actions/acc_test/action.yaml index d7c78d1f..e43ceeff 100644 --- a/.github/actions/acc_test/action.yaml +++ b/.github/actions/acc_test/action.yaml @@ -245,12 +245,13 @@ runs: go test -v ${testfile} -timeout=${{ inputs.test_timeout_string }} | tee -a acc_test_run.log set -e - if [[ $(cat acc_test_run.log | grep "FAIL") ]]; then + have_fail=$(cat acc_test_run.log | grep FAIL) + if [[ -n $have_fail ]]; then echo "::endgroup::" echo "::group::go test result" echo "Test failed, see acc_test_run.log for details" - res=$(cat acc_test_run.log | grep -v "=== RUN" | grep -v "\-\-\- PASS" | grep -v "=== CONT" | grep -v "=== PAUSE") - echo "result=FAIL: ${res}" >> "$GITHUB_OUTPUT" + echo "${have_fail}" + echo "result=FAIL:
${have_fail}" >> "$GITHUB_OUTPUT" echo "::endgroup::" exit 1 fi diff --git a/.github/workflows/tf-acc-test.yaml b/.github/workflows/tf-acc-test.yaml index 730fb0ca..91619dde 100644 --- a/.github/workflows/tf-acc-test.yaml +++ b/.github/workflows/tf-acc-test.yaml @@ -16,11 +16,13 @@ on: type: boolean default: false required: true + test_timeout_string: - description: "string that determines the timeout (default: 45m)" + description: "string that determines the timeout (default: '120m')" type: string - default: '90m' + default: '120m' required: true + test_file: description: "string that determines the test file to run (default all tests)" type: choice diff --git a/stackit/internal/services/sqlserverflexbeta/sqlserverflex_acc_test.go b/stackit/internal/services/sqlserverflexbeta/sqlserverflex_acc_test.go index 656b93df..fae56505 100644 --- a/stackit/internal/services/sqlserverflexbeta/sqlserverflex_acc_test.go +++ b/stackit/internal/services/sqlserverflexbeta/sqlserverflex_acc_test.go @@ -212,7 +212,7 @@ func TestAccInstance(t *testing.T) { PreConfig: func() { t.Logf("testing: %s - %s", t.Name(), "update storage.size and verify") }, - ExpectNonEmptyPlan: true, + ExpectNonEmptyPlan: false, Config: testutils.StringFromTemplateMust( "testdata/instance_template.gompl", updSizeData, From 1298c3fbf186618fd53c7cd48fb3b21a22faf906 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Fri, 17 Apr 2026 10:24:48 +0200 Subject: [PATCH 27/37] fix: update SDK version to fix unknown json value error feat: add eu02 to available zones in sqlserver [skip ci] --- go.mod | 250 +---- go.sum | 998 +----------------- .../database_data_source_gen.go | 1 + .../databases_data_source_gen.go | 1 + .../resources_gen/database_resource_gen.go | 1 + .../flavors_data_source_gen.go | 1 + .../instance_data_source_gen.go | 1 + .../instances_data_source_gen.go | 1 + .../resources_gen/instance_resource_gen.go | 1 + .../datasources_gen/user_data_source_gen.go | 1 + .../user/resources_gen/user_resource_gen.go | 1 + .../version_data_source_gen.go | 1 + 12 files changed, 78 insertions(+), 1180 deletions(-) diff --git a/go.mod b/go.mod index 4a7ad690..b9cf8d3f 100644 --- a/go.mod +++ b/go.mod @@ -4,23 +4,22 @@ go 1.25.6 require ( github.com/SladkyCitron/slogcolor v1.8.0 - github.com/golang-jwt/jwt/v5 v5.3.1 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 - github.com/hashicorp/terraform-plugin-framework v1.18.0 + github.com/hashicorp/terraform-plugin-framework v1.19.0 github.com/hashicorp/terraform-plugin-framework-validators v0.19.0 - github.com/hashicorp/terraform-plugin-go v0.30.0 + github.com/hashicorp/terraform-plugin-go v0.31.0 github.com/hashicorp/terraform-plugin-log v0.10.0 - github.com/hashicorp/terraform-plugin-testing v1.14.0 + github.com/hashicorp/terraform-plugin-testing v1.15.0 github.com/iancoleman/strcase v0.3.0 github.com/ivanpirog/coloredcobra v1.0.1 github.com/jarcoal/httpmock v1.4.1 github.com/joho/godotenv v1.5.1 github.com/ldez/go-git-cmd-wrapper/v2 v2.9.1 github.com/spf13/cobra v1.10.2 - github.com/stackitcloud/stackit-sdk-go/core v0.22.0 - github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.4.0 - github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.5.0 + github.com/stackitcloud/stackit-sdk-go/core v0.25.0 + github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.7.1 + github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.9.0 github.com/teambition/rrule-go v1.8.2 gopkg.in/yaml.v3 v3.0.1 ) @@ -28,261 +27,56 @@ require ( require github.com/hashicorp/go-retryablehttp v0.7.8 // indirect require ( - 4d63.com/gocheckcompilerdirectives v1.3.0 // indirect - 4d63.com/gochecknoglobals v0.2.2 // indirect - codeberg.org/chavacava/garif v0.2.0 // indirect - codeberg.org/polyfloyd/go-errorlint v1.9.0 // indirect dario.cat/mergo v1.0.1 // indirect - dev.gaijin.team/go/exhaustruct/v4 v4.0.0 // indirect - dev.gaijin.team/go/golib v0.6.0 // indirect - github.com/4meepo/tagalign v1.4.3 // indirect - github.com/Abirdcfly/dupword v0.1.7 // indirect - github.com/AdminBenni/iota-mixing v1.0.0 // indirect - github.com/AlwxSin/noinlineerr v1.0.5 // indirect - github.com/Antonboom/errname v1.1.1 // indirect - github.com/Antonboom/nilnil v1.1.1 // indirect - github.com/Antonboom/testifylint v1.6.4 // indirect - github.com/BurntSushi/toml v1.6.0 // indirect - github.com/Djarvur/go-err113 v0.1.1 // indirect - github.com/Kunde21/markdownfmt/v3 v3.1.0 // indirect - github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver/v3 v3.4.0 // indirect - github.com/Masterminds/sprig/v3 v3.2.3 // indirect - github.com/MirrexOne/unqueryvet v1.5.4 // indirect - github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect - github.com/ProtonMail/go-crypto v1.4.0 // indirect + github.com/ProtonMail/go-crypto v1.4.1 // indirect github.com/agext/levenshtein v1.2.3 // indirect - github.com/alecthomas/chroma/v2 v2.23.1 // indirect - github.com/alecthomas/go-check-sumtype v0.3.1 // indirect - github.com/alexkohler/nakedret/v2 v2.0.6 // indirect - github.com/alexkohler/prealloc v1.1.0 // indirect - github.com/alfatraining/structtag v1.0.0 // indirect - github.com/alingse/asasalint v0.0.11 // indirect - github.com/alingse/nilnesserr v0.2.0 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/armon/go-radix v1.0.0 // indirect - github.com/ashanbrown/forbidigo/v2 v2.3.0 // indirect - github.com/ashanbrown/makezero/v2 v2.1.0 // indirect - github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bgentry/speakeasy v0.1.0 // indirect - github.com/bkielbasa/cyclop v1.2.3 // indirect - github.com/blizzy78/varnamelen v0.8.0 // indirect - github.com/bmatcuk/doublestar/v4 v4.9.1 // indirect - github.com/bombsimon/wsl/v4 v4.7.0 // indirect - github.com/bombsimon/wsl/v5 v5.6.0 // indirect - github.com/breml/bidichk v0.3.3 // indirect - github.com/breml/errchkjson v0.4.1 // indirect - github.com/butuzov/ireturn v0.4.0 // indirect - github.com/butuzov/mirror v1.3.0 // indirect - github.com/catenacyber/perfsprint v0.10.1 // indirect - github.com/ccojocar/zxcvbn-go v1.0.4 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/charithe/durationcheck v0.0.11 // indirect - github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect - github.com/charmbracelet/lipgloss v1.1.0 // indirect - github.com/charmbracelet/x/ansi v0.10.1 // indirect - github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect - github.com/charmbracelet/x/term v0.2.1 // indirect - github.com/ckaznocha/intrange v0.3.1 // indirect github.com/cloudflare/circl v1.6.3 // indirect - github.com/curioswitch/go-reassign v0.3.0 // indirect - github.com/daixiang0/gci v0.13.7 // indirect - github.com/dave/dst v0.27.3 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/denis-tingaikin/go-header v0.5.0 // indirect - github.com/dlclark/regexp2 v1.11.5 // indirect - github.com/ettle/strcase v0.2.0 // indirect - github.com/fatih/color v1.18.0 // indirect - github.com/fatih/structtag v1.2.0 // indirect - github.com/firefart/nonamedreturns v1.0.6 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/ghostiam/protogetter v0.3.20 // indirect - github.com/go-critic/go-critic v0.14.3 // indirect - github.com/go-toolsmith/astcast v1.1.0 // indirect - github.com/go-toolsmith/astcopy v1.1.0 // indirect - github.com/go-toolsmith/astequal v1.2.0 // indirect - github.com/go-toolsmith/astfmt v1.1.0 // indirect - github.com/go-toolsmith/astp v1.1.0 // indirect - github.com/go-toolsmith/strparse v1.1.0 // indirect - github.com/go-toolsmith/typep v1.1.0 // indirect - github.com/go-viper/mapstructure/v2 v2.5.0 // indirect - github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/godoc-lint/godoc-lint v0.11.2 // indirect - github.com/gofrs/flock v0.13.0 // indirect + github.com/fatih/color v1.19.0 // indirect + github.com/golang-jwt/jwt/v5 v5.3.1 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/golangci/asciicheck v0.5.0 // indirect - github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect - github.com/golangci/go-printf-func-name v0.1.1 // indirect - github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect - github.com/golangci/golangci-lint/v2 v2.11.2 // indirect - github.com/golangci/golines v0.15.0 // indirect - github.com/golangci/misspell v0.8.0 // indirect - github.com/golangci/plugin-module-register v0.1.2 // indirect - github.com/golangci/revgrep v0.8.0 // indirect - github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e // indirect - github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect - github.com/gordonklaus/ineffassign v0.2.0 // indirect - github.com/gostaticanalysis/analysisutil v0.7.1 // indirect - github.com/gostaticanalysis/comment v1.5.0 // indirect - github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect - github.com/gostaticanalysis/nilerr v0.1.2 // indirect - github.com/hashicorp/cli v1.1.7 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-checkpoint v0.5.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-cty v1.5.0 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect - github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-plugin v1.7.0 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect - github.com/hashicorp/go-version v1.8.0 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/go-version v1.9.0 // indirect github.com/hashicorp/hc-install v0.9.3 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl/v2 v2.24.0 // indirect github.com/hashicorp/logutils v1.0.0 // indirect github.com/hashicorp/terraform-exec v0.25.0 // indirect github.com/hashicorp/terraform-json v0.27.2 // indirect - github.com/hashicorp/terraform-plugin-docs v0.24.0 // indirect - github.com/hashicorp/terraform-plugin-sdk/v2 v2.39.0 // indirect + github.com/hashicorp/terraform-plugin-sdk/v2 v2.40.0 // indirect github.com/hashicorp/terraform-registry-address v0.4.0 // indirect github.com/hashicorp/terraform-svchost v0.2.1 // indirect github.com/hashicorp/yamux v0.1.2 // indirect - github.com/hexops/gotextdiff v1.0.3 // indirect - github.com/huandu/xstrings v1.3.3 // indirect - github.com/imdario/mergo v0.3.15 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jgautheron/goconst v1.8.2 // indirect - github.com/jingyugao/rowserrcheck v1.1.1 // indirect - github.com/jjti/go-spancheck v0.6.5 // indirect - github.com/julz/importas v0.2.0 // indirect - github.com/karamaru-alpha/copyloopvar v1.2.2 // indirect - github.com/kisielk/errcheck v1.10.0 // indirect - github.com/kkHAIKE/contextcheck v1.1.6 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/kulti/thelper v0.7.1 // indirect - github.com/kunwardeep/paralleltest v1.0.15 // indirect - github.com/lasiar/canonicalheader v1.1.2 // indirect - github.com/ldez/exptostd v0.4.5 // indirect - github.com/ldez/gomoddirectives v0.8.0 // indirect - github.com/ldez/grignotin v0.10.1 // indirect - github.com/ldez/structtags v0.6.1 // indirect - github.com/ldez/tagliatelle v0.7.2 // indirect - github.com/ldez/usetesting v0.5.0 // indirect - github.com/leonklingele/grouper v1.1.2 // indirect - github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/macabu/inamedparam v0.2.0 // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect - github.com/manuelarte/funcorder v0.5.0 // indirect - github.com/maratori/testableexamples v1.0.1 // indirect - github.com/maratori/testpackage v1.1.2 // indirect - github.com/matoous/godox v1.1.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/mgechev/revive v1.15.0 // indirect + github.com/mattn/go-isatty v0.0.21 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/moricho/tparallel v0.3.2 // indirect - github.com/muesli/termenv v0.16.0 // indirect - github.com/nakabonne/nestif v0.3.1 // indirect - github.com/nishanths/exhaustive v0.12.0 // indirect - github.com/nishanths/predeclared v0.2.2 // indirect - github.com/nunnatsa/ginkgolinter v0.23.0 // indirect github.com/oklog/run v1.2.0 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.2.4 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/posener/complete v1.2.3 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/quasilyte/go-ruleguard v0.4.5 // indirect - github.com/quasilyte/go-ruleguard/dsl v0.3.23 // indirect - github.com/quasilyte/gogrep v0.5.0 // indirect - github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect - github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect - github.com/raeperd/recvcheck v0.2.0 // indirect - github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.14.1 // indirect - github.com/ryancurrah/gomodguard v1.4.1 // indirect - github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect - github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect - github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect - github.com/sashamelentyev/interfacebloat v1.1.0 // indirect - github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect - github.com/securego/gosec/v2 v2.24.7 // indirect - github.com/shopspring/decimal v1.3.1 // indirect - github.com/sirupsen/logrus v1.9.4 // indirect - github.com/sivchari/containedctx v1.0.3 // indirect - github.com/sonatard/noctx v0.5.0 // indirect - github.com/sourcegraph/go-diff v0.7.0 // indirect - github.com/spf13/afero v1.15.0 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.10 // indirect - github.com/spf13/viper v1.12.0 // indirect - github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect - github.com/stbenjam/no-sprintf-host-port v0.3.1 // indirect - github.com/stretchr/objx v0.5.2 // indirect github.com/stretchr/testify v1.11.1 // indirect - github.com/subosito/gotenv v1.4.1 // indirect - github.com/tetafro/godot v1.5.4 // indirect - github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect - github.com/timonwong/loggercheck v0.11.0 // indirect - github.com/tomarrell/wrapcheck/v2 v2.12.0 // indirect - github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect - github.com/ultraware/funlen v0.2.0 // indirect - github.com/ultraware/whitespace v0.2.0 // indirect - github.com/uudashr/gocognit v1.2.1 // indirect - github.com/uudashr/iface v1.4.1 // indirect github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - github.com/xen0n/gosmopolitan v1.3.0 // indirect - github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - github.com/yagipy/maintidx v1.0.0 // indirect - github.com/yeya24/promlinter v0.3.0 // indirect - github.com/ykadowak/zerologlint v0.1.5 // indirect - github.com/yuin/goldmark v1.7.7 // indirect - github.com/yuin/goldmark-meta v1.1.0 // indirect - github.com/zclconf/go-cty v1.18.0 // indirect - gitlab.com/bosi/decorder v0.4.2 // indirect - go-simpler.org/musttag v0.14.0 // indirect - go-simpler.org/sloglint v0.11.1 // indirect - go.abhg.dev/goldmark/frontmatter v0.2.0 // indirect - go.augendre.info/arangolint v0.4.0 // indirect - go.augendre.info/fatcontext v0.9.0 // indirect - go.uber.org/multierr v1.10.0 // indirect - go.uber.org/zap v1.27.0 // indirect - go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.48.0 // indirect - golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect - golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358 // indirect - golang.org/x/mod v0.33.0 // indirect - golang.org/x/net v0.51.0 // indirect - golang.org/x/sync v0.19.0 // indirect - golang.org/x/sys v0.41.0 // indirect - golang.org/x/text v0.34.0 // indirect - golang.org/x/tools v0.42.0 // indirect + github.com/zclconf/go-cty v1.18.1 // indirect + golang.org/x/crypto v0.50.0 // indirect + golang.org/x/mod v0.35.0 // indirect + golang.org/x/net v0.53.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.43.0 // indirect + golang.org/x/text v0.36.0 // indirect + golang.org/x/tools v0.44.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect - google.golang.org/grpc v1.79.2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect + google.golang.org/grpc v1.80.0 // indirect google.golang.org/protobuf v1.36.11 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - honnef.co/go/tools v0.7.0 // indirect - mvdan.cc/gofumpt v0.9.2 // indirect - mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 // indirect ) diff --git a/go.sum b/go.sum index f0894d33..a4709994 100644 --- a/go.sum +++ b/go.sum @@ -1,373 +1,62 @@ -4d63.com/gocheckcompilerdirectives v1.3.0 h1:Ew5y5CtcAAQeTVKUVFrE7EwHMrTO6BggtEj8BZSjZ3A= -4d63.com/gocheckcompilerdirectives v1.3.0/go.mod h1:ofsJ4zx2QAuIP/NO/NAh1ig6R1Fb18/GI7RVMwz7kAY= -4d63.com/gochecknoglobals v0.2.2 h1:H1vdnwnMaZdQW/N+NrkT1SZMTBmcwHe9Vq8lJcYYTtU= -4d63.com/gochecknoglobals v0.2.2/go.mod h1:lLxwTQjL5eIesRbvnzIP3jZtG140FnTdz+AlMa+ogt0= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -codeberg.org/chavacava/garif v0.2.0 h1:F0tVjhYbuOCnvNcU3YSpO6b3Waw6Bimy4K0mM8y6MfY= -codeberg.org/chavacava/garif v0.2.0/go.mod h1:P2BPbVbT4QcvLZrORc2T29szK3xEOlnl0GiPTJmEqBQ= -codeberg.org/polyfloyd/go-errorlint v1.9.0 h1:VkdEEmA1VBpH6ecQoMR4LdphVI3fA4RrCh2an7YmodI= -codeberg.org/polyfloyd/go-errorlint v1.9.0/go.mod h1:GPRRu2LzVijNn4YkrZYJfatQIdS+TrcK8rL5Xs24qw8= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -dev.gaijin.team/go/exhaustruct/v4 v4.0.0 h1:873r7aNneqoBB3IaFIzhvt2RFYTuHgmMjoKfwODoI1Y= -dev.gaijin.team/go/exhaustruct/v4 v4.0.0/go.mod h1:aZ/k2o4Y05aMJtiux15x8iXaumE88YdiB0Ai4fXOzPI= -dev.gaijin.team/go/golib v0.6.0 h1:v6nnznFTs4bppib/NyU1PQxobwDHwCXXl15P7DV5Zgo= -dev.gaijin.team/go/golib v0.6.0/go.mod h1:uY1mShx8Z/aNHWDyAkZTkX+uCi5PdX7KsG1eDQa2AVE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/4meepo/tagalign v1.4.3 h1:Bnu7jGWwbfpAie2vyl63Zup5KuRv21olsPIha53BJr8= -github.com/4meepo/tagalign v1.4.3/go.mod h1:00WwRjiuSbrRJnSVeGWPLp2epS5Q/l4UEy0apLLS37c= -github.com/Abirdcfly/dupword v0.1.7 h1:2j8sInznrje4I0CMisSL6ipEBkeJUJAmK1/lfoNGWrQ= -github.com/Abirdcfly/dupword v0.1.7/go.mod h1:K0DkBeOebJ4VyOICFdppB23Q0YMOgVafM0zYW0n9lF4= -github.com/AdminBenni/iota-mixing v1.0.0 h1:Os6lpjG2dp/AE5fYBPAA1zfa2qMdCAWwPMCgpwKq7wo= -github.com/AdminBenni/iota-mixing v1.0.0/go.mod h1:i4+tpAaB+qMVIV9OK3m4/DAynOd5bQFaOu+2AhtBCNY= -github.com/AlwxSin/noinlineerr v1.0.5 h1:RUjt63wk1AYWTXtVXbSqemlbVTb23JOSRiNsshj7TbY= -github.com/AlwxSin/noinlineerr v1.0.5/go.mod h1:+QgkkoYrMH7RHvcdxdlI7vYYEdgeoFOVjU9sUhw/rQc= -github.com/Antonboom/errname v1.1.1 h1:bllB7mlIbTVzO9jmSWVWLjxTEbGBVQ1Ff/ClQgtPw9Q= -github.com/Antonboom/errname v1.1.1/go.mod h1:gjhe24xoxXp0ScLtHzjiXp0Exi1RFLKJb0bVBtWKCWQ= -github.com/Antonboom/nilnil v1.1.1 h1:9Mdr6BYd8WHCDngQnNVV0b554xyisFioEKi30sksufQ= -github.com/Antonboom/nilnil v1.1.1/go.mod h1:yCyAmSw3doopbOWhJlVci+HuyNRuHJKIv6V2oYQa8II= -github.com/Antonboom/testifylint v1.6.4 h1:gs9fUEy+egzxkEbq9P4cpcMB6/G0DYdMeiFS87UiqmQ= -github.com/Antonboom/testifylint v1.6.4/go.mod h1:YO33FROXX2OoUfwjz8g+gUxQXio5i9qpVy7nXGbxDD4= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= -github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= -github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Djarvur/go-err113 v0.1.1 h1:eHfopDqXRwAi+YmCUas75ZE0+hoBHJ2GQNLYRSxao4g= -github.com/Djarvur/go-err113 v0.1.1/go.mod h1:IaWJdYFLg76t2ihfflPZnM1LIQszWOsFDh2hhhAVF6k= -github.com/Kunde21/markdownfmt/v3 v3.1.0 h1:KiZu9LKs+wFFBQKhrZJrFZwtLnCCWJahL+S+E/3VnM0= -github.com/Kunde21/markdownfmt/v3 v3.1.0/go.mod h1:tPXN1RTyOzJwhfHoon9wUr4HGYmWgVxSQN6VBJDkrVc= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= -github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/MirrexOne/unqueryvet v1.5.4 h1:38QOxShO7JmMWT+eCdDMbcUgGCOeJphVkzzRgyLJgsQ= -github.com/MirrexOne/unqueryvet v1.5.4/go.mod h1:fs9Zq6eh1LRIhsDIsxf9PONVUjYdFHdtkHIgZdJnyPU= -github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4= -github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo= -github.com/ProtonMail/go-crypto v1.4.0 h1:Zq/pbM3F5DFgJiMouxEdSVY44MVoQNEKp5d5QxIQceQ= -github.com/ProtonMail/go-crypto v1.4.0/go.mod h1:e1OaTyu5SYVrO9gKOEhTc+5UcXtTUa+P3uLudwcgPqo= +github.com/ProtonMail/go-crypto v1.4.1 h1:9RfcZHqEQUvP8RzecWEUafnZVtEvrBVL9BiF67IQOfM= +github.com/ProtonMail/go-crypto v1.4.1/go.mod h1:e1OaTyu5SYVrO9gKOEhTc+5UcXtTUa+P3uLudwcgPqo= github.com/SladkyCitron/slogcolor v1.8.0 h1:ln4mUPfVhs7a/vZfjnKkz5YZ71Bg/KFWneS2hfFq6FM= github.com/SladkyCitron/slogcolor v1.8.0/go.mod h1:ft8LEVIl4isUkebakhv+ngNXJjWBumnwhXfxTLApf3M= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= -github.com/alecthomas/chroma/v2 v2.23.1 h1:nv2AVZdTyClGbVQkIzlDm/rnhk1E9bU9nXwmZ/Vk/iY= -github.com/alecthomas/chroma/v2 v2.23.1/go.mod h1:NqVhfBR0lte5Ouh3DcthuUCTUpDC9cxBOfyMbMQPs3o= -github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU= -github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexkohler/nakedret/v2 v2.0.6 h1:ME3Qef1/KIKr3kWX3nti3hhgNxw6aqN5pZmQiFSsuzQ= -github.com/alexkohler/nakedret/v2 v2.0.6/go.mod h1:l3RKju/IzOMQHmsEvXwkqMDzHHvurNQfAgE1eVmT40Q= -github.com/alexkohler/prealloc v1.1.0 h1:cKGRBqlXw5iyQGLYhrXrDlcHxugXpTq4tQ5c91wkf8M= -github.com/alexkohler/prealloc v1.1.0/go.mod h1:fT39Jge3bQrfA7nPMDngUfvUbQGQeJyGQnR+913SCig= -github.com/alfatraining/structtag v1.0.0 h1:2qmcUqNcCoyVJ0up879K614L9PazjBSFruTB0GOFjCc= -github.com/alfatraining/structtag v1.0.0/go.mod h1:p3Xi5SwzTi+Ryj64DqjLWz7XurHxbGsq6y3ubePJPus= -github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= -github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= -github.com/alingse/nilnesserr v0.2.0 h1:raLem5KG7EFVb4UIDAXgrv3N2JIaffeKNtcEXkEWd/w= -github.com/alingse/nilnesserr v0.2.0/go.mod h1:1xJPrXonEtX7wyTq8Dytns5P2hNzoWymVUIaKm4HNFg= github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= -github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/ashanbrown/forbidigo/v2 v2.3.0 h1:OZZDOchCgsX5gvToVtEBoV2UWbFfI6RKQTir2UZzSxo= -github.com/ashanbrown/forbidigo/v2 v2.3.0/go.mod h1:5p6VmsG5/1xx3E785W9fouMxIOkvY2rRV9nMdWadd6c= -github.com/ashanbrown/makezero/v2 v2.1.0 h1:snuKYMbqosNokUKm+R6/+vOPs8yVAi46La7Ck6QYSaE= -github.com/ashanbrown/makezero/v2 v2.1.0/go.mod h1:aEGT/9q3S8DHeE57C88z2a6xydvgx8J5hgXIGWgo0MY= -github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= -github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bkielbasa/cyclop v1.2.3 h1:faIVMIGDIANuGPWH031CZJTi2ymOQBULs9H21HSMa5w= -github.com/bkielbasa/cyclop v1.2.3/go.mod h1:kHTwA9Q0uZqOADdupvcFJQtp/ksSnytRMe8ztxG8Fuo= -github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= -github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= -github.com/bmatcuk/doublestar/v4 v4.9.1 h1:X8jg9rRZmJd4yRy7ZeNDRnM+T3ZfHv15JiBJ/avrEXE= -github.com/bmatcuk/doublestar/v4 v4.9.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= -github.com/bombsimon/wsl/v4 v4.7.0 h1:1Ilm9JBPRczjyUs6hvOPKvd7VL1Q++PL8M0SXBDf+jQ= -github.com/bombsimon/wsl/v4 v4.7.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg= -github.com/bombsimon/wsl/v5 v5.6.0 h1:4z+/sBqC5vUmSp1O0mS+czxwH9+LKXtCWtHH9rZGQL8= -github.com/bombsimon/wsl/v5 v5.6.0/go.mod h1:Uqt2EfrMj2NV8UGoN1f1Y3m0NpUVCsUdrNCdet+8LvU= -github.com/breml/bidichk v0.3.3 h1:WSM67ztRusf1sMoqH6/c4OBCUlRVTKq+CbSeo0R17sE= -github.com/breml/bidichk v0.3.3/go.mod h1:ISbsut8OnjB367j5NseXEGGgO/th206dVa427kR8YTE= -github.com/breml/errchkjson v0.4.1 h1:keFSS8D7A2T0haP9kzZTi7o26r7kE3vymjZNeNDRDwg= -github.com/breml/errchkjson v0.4.1/go.mod h1:a23OvR6Qvcl7DG/Z4o0el6BRAjKnaReoPQFciAl9U3s= github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= -github.com/butuzov/ireturn v0.4.0 h1:+s76bF/PfeKEdbG8b54aCocxXmi0wvYdOVsWxVO7n8E= -github.com/butuzov/ireturn v0.4.0/go.mod h1:ghI0FrCmap8pDWZwfPisFD1vEc56VKH4NpQUxDHta70= -github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc= -github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI= -github.com/catenacyber/perfsprint v0.10.1 h1:u7Riei30bk46XsG8nknMhKLXG9BcXz3+3tl/WpKm0PQ= -github.com/catenacyber/perfsprint v0.10.1/go.mod h1:DJTGsi/Zufpuus6XPGJyKOTMELe347o6akPvWG9Zcsc= -github.com/ccojocar/zxcvbn-go v1.0.4 h1:FWnCIRMXPj43ukfX000kvBZvV6raSxakYr1nzyNrUcc= -github.com/ccojocar/zxcvbn-go v1.0.4/go.mod h1:3GxGX+rHmueTUMvm5ium7irpyjmm7ikxYFOSJB21Das= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charithe/durationcheck v0.0.11 h1:g1/EX1eIiKS57NTWsYtHDZ/APfeXKhye1DidBcABctk= -github.com/charithe/durationcheck v0.0.11/go.mod h1:x5iZaixRNl8ctbM+3B2RrPG5t856TxRyVQEnbIEM2X4= -github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= -github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= -github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= -github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= -github.com/charmbracelet/x/ansi v0.10.1 h1:rL3Koar5XvX0pHGfovN03f5cxLbCF2YvLeyz7D2jVDQ= -github.com/charmbracelet/x/ansi v0.10.1/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE= -github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8= -github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= -github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= -github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/ckaznocha/intrange v0.3.1 h1:j1onQyXvHUsPWujDH6WIjhyH26gkRt/txNlV7LspvJs= -github.com/ckaznocha/intrange v0.3.1/go.mod h1:QVepyz1AkUoFQkpEqksSYpNpUo3c5W7nWh/s6SHIJJk= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+fbBAhrQPs= -github.com/curioswitch/go-reassign v0.3.0/go.mod h1:nApPCCTtqLJN/s8HfItCcKV0jIPwluBOvZP+dsJGA88= github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= -github.com/daixiang0/gci v0.13.7 h1:+0bG5eK9vlI08J+J/NWGbWPTNiXPG4WhNLJOkSxWITQ= -github.com/daixiang0/gci v0.13.7/go.mod h1:812WVN6JLFY9S6Tv76twqmNqevN0pa3SX3nih0brVzQ= -github.com/dave/dst v0.27.3 h1:P1HPoMza3cMEquVf9kKy8yXsFirry4zEnWOdYPOoIzY= -github.com/dave/dst v0.27.3/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= -github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= -github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= -github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= -github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= -github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= -github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/firefart/nonamedreturns v1.0.6 h1:vmiBcKV/3EqKY3ZiPxCINmpS431OcE1S47AQUwhrg8E= -github.com/firefart/nonamedreturns v1.0.6/go.mod h1:R8NisJnSIpvPWheCq0mNRXJok6D8h7fagJTF8EMEwCo= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= -github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/ghostiam/protogetter v0.3.20 h1:oW7OPFit2FxZOpmMRPP9FffU4uUpfeE/rEdE1f+MzD0= -github.com/ghostiam/protogetter v0.3.20/go.mod h1:FjIu5Yfs6FT391m+Fjp3fbAYJ6rkL/J6ySpZBfnODuI= -github.com/go-critic/go-critic v0.14.3 h1:5R1qH2iFeo4I/RJU8vTezdqs08Egi4u5p6vOESA0pog= -github.com/go-critic/go-critic v0.14.3/go.mod h1:xwntfW6SYAd7h1OqDzmN6hBX/JxsEKl5up/Y2bsxgVQ= +github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= +github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-git/v5 v5.16.5 h1:mdkuqblwr57kVfXri5TTH+nMFLNUxIj9Z7F5ykFbw5s= github.com/go-git/go-git/v5 v5.16.5/go.mod h1:QOMLpNf1qxuSY4StA/ArOdfFR2TrKEjJiye2kel2m+M= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= -github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= -github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= -github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= -github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= -github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= -github.com/go-toolsmith/astequal v1.2.0 h1:3Fs3CYZ1k9Vo4FzFhwwewC3CHISHDnVUPC4x0bI2+Cw= -github.com/go-toolsmith/astequal v1.2.0/go.mod h1:c8NZ3+kSFtFY/8lPso4v8LuJjdJiUFVnSuU3s0qrrDY= -github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= -github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= -github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= -github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= -github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= -github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= -github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= -github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= -github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUWY= -github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godoc-lint/godoc-lint v0.11.2 h1:Bp0FkJWoSdNsBikdNgIcgtaoo+xz6I/Y9s5WSBQUeeM= -github.com/godoc-lint/godoc-lint v0.11.2/go.mod h1:iVpGdL1JCikNH2gGeAn3Hh+AgN5Gx/I/cxV+91L41jo= -github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= -github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golangci/asciicheck v0.5.0 h1:jczN/BorERZwK8oiFBOGvlGPknhvq0bjnysTj4nUfo0= -github.com/golangci/asciicheck v0.5.0/go.mod h1:5RMNAInbNFw2krqN6ibBxN/zfRFa9S6tA1nPdM0l8qQ= -github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 h1:WUvBfQL6EW/40l6OmeSBYQJNSif4O11+bmWEz+C7FYw= -github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E= -github.com/golangci/go-printf-func-name v0.1.1 h1:hIYTFJqAGp1iwoIfsNTpoq1xZAarogrvjO9AfiW3B4U= -github.com/golangci/go-printf-func-name v0.1.1/go.mod h1:Es64MpWEZbh0UBtTAICOZiB+miW53w/K9Or/4QogJss= -github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE= -github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY= -github.com/golangci/golangci-lint/v2 v2.11.2 h1:4Icd3mEqthcFcFww8L67OBtfKB/obXxko8aFUMqP/5w= -github.com/golangci/golangci-lint/v2 v2.11.2/go.mod h1:wexdFBIQNhHNhDe1oqzlGFE5dYUqlfccWJKWjoWF1GI= -github.com/golangci/golines v0.15.0 h1:Qnph25g8Y1c5fdo1X7GaRDGgnMHgnxh4Gk4VfPTtRx0= -github.com/golangci/golines v0.15.0/go.mod h1:AZjXd23tbHMpowhtnGlj9KCNsysj72aeZVVHnVcZx10= -github.com/golangci/misspell v0.8.0 h1:qvxQhiE2/5z+BVRo1kwYA8yGz+lOlu5Jfvtx2b04Jbg= -github.com/golangci/misspell v0.8.0/go.mod h1:WZyyI2P3hxPY2UVHs3cS8YcllAeyfquQcKfdeE9AFVg= -github.com/golangci/plugin-module-register v0.1.2 h1:e5WM6PO6NIAEcij3B053CohVp3HIYbzSuP53UAYgOpg= -github.com/golangci/plugin-module-register v0.1.2/go.mod h1:1+QGTsKBvAIvPvoY/os+G5eoqxWn70HYDm2uvUyGuVw= -github.com/golangci/revgrep v0.8.0 h1:EZBctwbVd0aMeRnNUsFogoyayvKHyxlV3CdUA46FX2s= -github.com/golangci/revgrep v0.8.0/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k= -github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e h1:ai0EfmVYE2bRA5htgAG9r7s3tHsfjIhN98WshBTJ9jM= -github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e/go.mod h1:Vrn4B5oR9qRwM+f54koyeH3yzphlecwERs0el27Fr/s= -github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e h1:gD6P7NEo7Eqtt0ssnqSJNNndxe69DOQ24A5h7+i3KpM= -github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e/go.mod h1:h+wZwLjUTJnm/P2rwlbJdRPZXOzaT36/FwnPnY2inzc= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gordonklaus/ineffassign v0.2.0 h1:Uths4KnmwxNJNzq87fwQQDDnbNb7De00VOk9Nu0TySs= -github.com/gordonklaus/ineffassign v0.2.0/go.mod h1:TIpymnagPSexySzs7F9FnO1XFTy8IT3a59vmZp5Y9Lw= -github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/comment v1.5.0 h1:X82FLl+TswsUMpMh17srGRuKaaXprTaytmEpgnKIDu8= -github.com/gostaticanalysis/comment v1.5.0/go.mod h1:V6eb3gpCv9GNVqb6amXzEUX3jXLVK/AdA+IrAMSqvEc= -github.com/gostaticanalysis/forcetypeassert v0.2.0 h1:uSnWrrUEYDr86OCxWa4/Tp2jeYDlogZiZHzGkWFefTk= -github.com/gostaticanalysis/forcetypeassert v0.2.0/go.mod h1:M5iPavzE9pPqWyeiVXSFghQjljW1+l/Uke3PXHS6ILY= -github.com/gostaticanalysis/nilerr v0.1.2 h1:S6nk8a9N8g062nsx63kUkF6AzbHGw7zzyHMcpu52xQU= -github.com/gostaticanalysis/nilerr v0.1.2/go.mod h1:A19UHhoY3y8ahoL7YKz6sdjDtduwTSI4CsymaC2htPA= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/hashicorp/cli v1.1.7 h1:/fZJ+hNdwfTSfsxMBa9WWMlfjUZbX8/LnUxgAd7lCVU= -github.com/hashicorp/cli v1.1.7/go.mod h1:e6Mfpga9OCT1vqzFuoGZiiF/KaG9CbUfO5s3ghU3YgU= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -380,9 +69,6 @@ github.com/hashicorp/go-cty v1.5.0 h1:EkQ/v+dDNUqnuVpmS5fPqyY71NXVgT5gf32+57xY8g github.com/hashicorp/go-cty v1.5.0/go.mod h1:lFUCG5kd8exDobgSfyj4ONE/dc822kiYMguVKdHGMLM= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix/v2 v2.1.0 h1:CUW5RYIcysz+D3B+l1mDeXrQ7fUvGGCwJfdASSzbrfo= -github.com/hashicorp/go-immutable-radix/v2 v2.1.0/go.mod h1:hgdqLXA4f6NIjRVisM1TJ9aOJVNRqKZj+xDGF6m7PBw= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-plugin v1.7.0 h1:YghfQH/0QmPNc/AZMTFE3ac8fipZyZECHdDPshfk+mA= @@ -392,17 +78,10 @@ github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3 github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4= -github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= -github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= +github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/hc-install v0.9.3 h1:1H4dgmgzxEVwT6E/d/vIL5ORGVKz9twRwDw+qA5Hyho= github.com/hashicorp/hc-install v0.9.3/go.mod h1:FQlQ5I3I/X409N/J1U4pPeQQz1R3BoV0IysB7aiaQE0= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl/v2 v2.24.0 h1:2QJdZ454DSsYGoaE6QheQZjtKZSUs9Nh2izTWiwQxvE= github.com/hashicorp/hcl/v2 v2.24.0/go.mod h1:oGoO1FIQYfn/AgyOhlg9qLC6/nOJPX3qGbkZpYAcqfM= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= @@ -411,36 +90,26 @@ github.com/hashicorp/terraform-exec v0.25.0 h1:Bkt6m3VkJqYh+laFMrWIpy9KHYFITpOyz github.com/hashicorp/terraform-exec v0.25.0/go.mod h1:dl9IwsCfklDU6I4wq9/StFDp7dNbH/h5AnfS1RmiUl8= github.com/hashicorp/terraform-json v0.27.2 h1:BwGuzM6iUPqf9JYM/Z4AF1OJ5VVJEEzoKST/tRDBJKU= github.com/hashicorp/terraform-json v0.27.2/go.mod h1:GzPLJ1PLdUG5xL6xn1OXWIjteQRT2CNT9o/6A9mi9hE= -github.com/hashicorp/terraform-plugin-docs v0.24.0 h1:YNZYd+8cpYclQyXbl1EEngbld8w7/LPOm99GD5nikIU= -github.com/hashicorp/terraform-plugin-docs v0.24.0/go.mod h1:YLg+7LEwVmRuJc0EuCw0SPLxuQXw5mW8iJ5ml/kvi+o= -github.com/hashicorp/terraform-plugin-framework v1.18.0 h1:Xy6OfqSTZfAAKXSlJ810lYvuQvYkOpSUoNMQ9l2L1RA= -github.com/hashicorp/terraform-plugin-framework v1.18.0/go.mod h1:eeFIf68PME+kenJeqSrIcpHhYQK0TOyv7ocKdN4Z35E= +github.com/hashicorp/terraform-plugin-framework v1.19.0 h1:q0bwyhxAOR3vfdgbk9iplv3MlTv/dhBHTXjQOtQDoBA= +github.com/hashicorp/terraform-plugin-framework v1.19.0/go.mod h1:YRXOBu0jvs7xp4AThBbX4mAzYaMJ1JgtFH//oGKxwLc= github.com/hashicorp/terraform-plugin-framework-validators v0.19.0 h1:Zz3iGgzxe/1XBkooZCewS0nJAaCFPFPHdNJd8FgE4Ow= github.com/hashicorp/terraform-plugin-framework-validators v0.19.0/go.mod h1:GBKTNGbGVJohU03dZ7U8wHqc2zYnMUawgCN+gC0itLc= -github.com/hashicorp/terraform-plugin-go v0.30.0 h1:VmEiD0n/ewxbvV5VI/bYwNtlSEAXtHaZlSnyUUuQK6k= -github.com/hashicorp/terraform-plugin-go v0.30.0/go.mod h1:8d523ORAW8OHgA9e8JKg0ezL3XUO84H0A25o4NY/jRo= +github.com/hashicorp/terraform-plugin-go v0.31.0 h1:0Fz2r9DQ+kNNl6bx8HRxFd1TfMKUvnrOtvJPmp3Z0q8= +github.com/hashicorp/terraform-plugin-go v0.31.0/go.mod h1:A88bDhd/cW7FnwqxQRz3slT+QY6yzbHKc6AOTtmdeS8= github.com/hashicorp/terraform-plugin-log v0.10.0 h1:eu2kW6/QBVdN4P3Ju2WiB2W3ObjkAsyfBsL3Wh1fj3g= github.com/hashicorp/terraform-plugin-log v0.10.0/go.mod h1:/9RR5Cv2aAbrqcTSdNmY1NRHP4E3ekrXRGjqORpXyB0= -github.com/hashicorp/terraform-plugin-sdk/v2 v2.39.0 h1:ltFG/dSs4mMHNpBqHptCtJqYM4FekUDJbUcWj+6HGlg= -github.com/hashicorp/terraform-plugin-sdk/v2 v2.39.0/go.mod h1:xJk7ap8vRI/B2U6TrVs7bu/gTihyor8XBTLSs5Y6z2w= -github.com/hashicorp/terraform-plugin-testing v1.14.0 h1:5t4VKrjOJ0rg0sVuSJ86dz5K7PHsMO6OKrHFzDBerWA= -github.com/hashicorp/terraform-plugin-testing v1.14.0/go.mod h1:1qfWkecyYe1Do2EEOK/5/WnTyvC8wQucUkkhiGLg5nk= +github.com/hashicorp/terraform-plugin-sdk/v2 v2.40.0 h1:MKS/2URqeJRwJdbOfcbdsZCq/IRrNkqJNN0GtVIsuGs= +github.com/hashicorp/terraform-plugin-sdk/v2 v2.40.0/go.mod h1:PuG4P97Ju3QXW6c6vRkRadWJbvnEu2Xh+oOuqcYOqX4= +github.com/hashicorp/terraform-plugin-testing v1.15.0 h1:/fimKyl0YgD7aAtJkuuAZjwBASXhCIwWqMbDLnKLMe4= +github.com/hashicorp/terraform-plugin-testing v1.15.0/go.mod h1:bGXMw7bE95EiZhSBV3rM2W8TiffaPTDuLS+HFI/lIYs= github.com/hashicorp/terraform-registry-address v0.4.0 h1:S1yCGomj30Sao4l5BMPjTGZmCNzuv7/GDTDX99E9gTk= github.com/hashicorp/terraform-registry-address v0.4.0/go.mod h1:LRS1Ay0+mAiRkUyltGT+UHWkIqTFvigGn/LbMshfflE= github.com/hashicorp/terraform-svchost v0.2.1 h1:ubvrTFw3Q7CsoEaX7V06PtCTKG3wu7GyyobAoN4eF3Q= github.com/hashicorp/terraform-svchost v0.2.1/go.mod h1:zDMheBLvNzu7Q6o9TBvPqiZToJcSuCLXjAXxBslSky4= github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= -github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= -github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -450,39 +119,12 @@ github.com/jarcoal/httpmock v1.4.1 h1:0Ju+VCFuARfFlhVXFc2HxlcQkfB+Xq12/EotHko+x2 github.com/jarcoal/httpmock v1.4.1/go.mod h1:ftW1xULwo+j0R0JJkJIIi7UKigZUXCLLanykgjwBXL0= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jgautheron/goconst v1.8.2 h1:y0XF7X8CikZ93fSNT6WBTb/NElBu9IjaY7CCYQrCMX4= -github.com/jgautheron/goconst v1.8.2/go.mod h1:A0oxgBCHy55NQn6sYpO7UdnA9p+h7cPtoOZUmvNIako= github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94= github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8= -github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jjti/go-spancheck v0.6.5 h1:lmi7pKxa37oKYIMScialXUK6hP3iY5F1gu+mLBPgYB8= -github.com/jjti/go-spancheck v0.6.5/go.mod h1:aEogkeatBrbYsyW6y5TgDfihCulDYciL1B7rG2vSsrU= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.2.0 h1:y+MJN/UdL63QbFJHws9BVC5RpA2iq0kpjrFajTGivjQ= -github.com/julz/importas v0.2.0/go.mod h1:pThlt589EnCYtMnmhmRYY/qn9lCf/frPOK+WMx3xiJY= -github.com/karamaru-alpha/copyloopvar v1.2.2 h1:yfNQvP9YaGQR7VaWLYcfZUlRP2eo2vhExWKxD/fP6q0= -github.com/karamaru-alpha/copyloopvar v1.2.2/go.mod h1:oY4rGZqZ879JkJMtX3RRkcXRkmUvH0x35ykgaKgsgJY= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.10.0 h1:Lvs/YAHP24YKg08LA8oDw2z9fJVme090RAXd90S+rrw= -github.com/kisielk/errcheck v1.10.0/go.mod h1:kQxWMMVZgIkDq7U8xtG/n2juOjbLgZtedi0D+/VL/i8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkHAIKE/contextcheck v1.1.6 h1:7HIyRcnyzxL9Lz06NGhiKvenXq7Zw6Q0UQu/ttjfJCE= -github.com/kkHAIKE/contextcheck v1.1.6/go.mod h1:3dDbMRNBFaq8HFXWC1JyvDSPm43CmE6IuHam8Wr0rkg= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -490,253 +132,61 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kulti/thelper v0.7.1 h1:fI8QITAoFVLx+y+vSyuLBP+rcVIB8jKooNSCT2EiI98= -github.com/kulti/thelper v0.7.1/go.mod h1:NsMjfQEy6sd+9Kfw8kCP61W1I0nerGSYSFnGaxQkcbs= -github.com/kunwardeep/paralleltest v1.0.15 h1:ZMk4Qt306tHIgKISHWFJAO1IDQJLc6uDyJMLyncOb6w= -github.com/kunwardeep/paralleltest v1.0.15/go.mod h1:di4moFqtfz3ToSKxhNjhOZL+696QtJGCFe132CbBLGk= -github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4= -github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI= -github.com/ldez/exptostd v0.4.5 h1:kv2ZGUVI6VwRfp/+bcQ6Nbx0ghFWcGIKInkG/oFn1aQ= -github.com/ldez/exptostd v0.4.5/go.mod h1:QRjHRMXJrCTIm9WxVNH6VW7oN7KrGSht69bIRwvdFsM= github.com/ldez/go-git-cmd-wrapper/v2 v2.9.1 h1:QJRB9Gs5i/h6TVJI6yl09Qm6rNooznRiKwIw+VIxd90= github.com/ldez/go-git-cmd-wrapper/v2 v2.9.1/go.mod h1:0eUeas7XtKDPKQbB0KijfaMPbuQ/cIprtoTRiwaUoFg= -github.com/ldez/gomoddirectives v0.8.0 h1:JqIuTtgvFC2RdH1s357vrE23WJF2cpDCPFgA/TWDGpk= -github.com/ldez/gomoddirectives v0.8.0/go.mod h1:jutzamvZR4XYJLr0d5Honycp4Gy6GEg2mS9+2YX3F1Q= -github.com/ldez/grignotin v0.10.1 h1:keYi9rYsgbvqAZGI1liek5c+jv9UUjbvdj3Tbn5fn4o= -github.com/ldez/grignotin v0.10.1/go.mod h1:UlDbXFCARrXbWGNGP3S5vsysNXAPhnSuBufpTEbwOas= -github.com/ldez/structtags v0.6.1 h1:bUooFLbXx41tW8SvkfwfFkkjPYvFFs59AAMgVg6DUBk= -github.com/ldez/structtags v0.6.1/go.mod h1:YDxVSgDy/MON6ariaxLF2X09bh19qL7MtGBN5MrvbdY= -github.com/ldez/tagliatelle v0.7.2 h1:KuOlL70/fu9paxuxbeqlicJnCspCRjH0x8FW+NfgYUk= -github.com/ldez/tagliatelle v0.7.2/go.mod h1:PtGgm163ZplJfZMZ2sf5nhUT170rSuPgBimoyYtdaSI= -github.com/ldez/usetesting v0.5.0 h1:3/QtzZObBKLy1F4F8jLuKJiKBjjVFi1IavpoWbmqLwc= -github.com/ldez/usetesting v0.5.0/go.mod h1:Spnb4Qppf8JTuRgblLrEWb7IE6rDmUpGvxY3iRrzvDQ= -github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= -github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= -github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= -github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE= -github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/manuelarte/embeddedstructfieldcheck v0.4.0 h1:3mAIyaGRtjK6EO9E73JlXLtiy7ha80b2ZVGyacxgfww= -github.com/manuelarte/embeddedstructfieldcheck v0.4.0/go.mod h1:z8dFSyXqp+fC6NLDSljRJeNQJJDWnY7RoWFzV3PC6UM= -github.com/manuelarte/funcorder v0.5.0 h1:llMuHXXbg7tD0i/LNw8vGnkDTHFpTnWqKPI85Rknc+8= -github.com/manuelarte/funcorder v0.5.0/go.mod h1:Yt3CiUQthSBMBxjShjdXMexmzpP8YGvGLjrxJNkO2hA= -github.com/maratori/testableexamples v1.0.1 h1:HfOQXs+XgfeRBJ+Wz0XfH+FHnoY9TVqL6Fcevpzy4q8= -github.com/maratori/testableexamples v1.0.1/go.mod h1:XE2F/nQs7B9N08JgyRmdGjYVGqxWwClLPCGSQhXQSrQ= -github.com/maratori/testpackage v1.1.2 h1:ffDSh+AgqluCLMXhM19f/cpvQAKygKAJXFl9aUjmbqs= -github.com/maratori/testpackage v1.1.2/go.mod h1:8F24GdVDFW5Ew43Et02jamrVMNXLUNaOynhDssITGfc= -github.com/matoous/godox v1.1.0 h1:W5mqwbyWrwZv6OQ5Z1a/DHGMOvXYCBP3+Ht7KMoJhq4= -github.com/matoous/godox v1.1.0/go.mod h1:jgE/3fUXiTurkdHOLT5WEkThTSuE7yxHv5iWPa80afs= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mattn/go-isatty v0.0.21 h1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLGs= +github.com/mattn/go-isatty v0.0.21/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= github.com/maxatome/go-testdeep v1.14.0 h1:rRlLv1+kI8eOI3OaBXZwb3O7xY3exRzdW5QyX48g9wI= github.com/maxatome/go-testdeep v1.14.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= -github.com/mgechev/revive v1.15.0 h1:vJ0HzSBzfNyPbHKolgiFjHxLek9KUijhqh42yGoqZ8Q= -github.com/mgechev/revive v1.15.0/go.mod h1:LlAKO3QQe9OJ0pVZzI2GPa8CbXGZ/9lNpCGvK4T/a8A= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI= -github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= -github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= -github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= -github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= -github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= -github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/nunnatsa/ginkgolinter v0.23.0 h1:x3o4DGYOWbBMP/VdNQKgSj+25aJKx2Pe6lHr8gBcgf8= -github.com/nunnatsa/ginkgolinter v0.23.0/go.mod h1:9qN1+0akwXEccwV1CAcCDfcoBlWXHB+ML9884pL4SZ4= github.com/oklog/run v1.2.0 h1:O8x3yXwah4A73hJdlrwo/2X6J62gE5qTMusH0dvz60E= github.com/oklog/run v1.2.0/go.mod h1:mgDbKRSwPhJfesJ4PntqFUbKQRZ50NgmZTSPlFA0YFk= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= -github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/quasilyte/go-ruleguard v0.4.5 h1:AGY0tiOT5hJX9BTdx/xBdoCubQUAE2grkqY2lSwvZcA= -github.com/quasilyte/go-ruleguard v0.4.5/go.mod h1:Vl05zJ538vcEEwu16V/Hdu7IYZWyKSwIy4c88Ro1kRE= -github.com/quasilyte/go-ruleguard/dsl v0.3.23 h1:lxjt5B6ZCiBeeNO8/oQsegE6fLeCzuMRoVWSkXC4uvY= -github.com/quasilyte/go-ruleguard/dsl v0.3.23/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= -github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/raeperd/recvcheck v0.2.0 h1:GnU+NsbiCqdC2XX5+vMZzP+jAJC5fht7rcVTAhX74UI= -github.com/raeperd/recvcheck v0.2.0/go.mod h1:n04eYkwIR0JbgD73wT8wL4JjPC3wm0nFtzBnWNocnYU= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= -github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.4.1 h1:eWC8eUMNZ/wM/PWuZBv7JxxqT5fiIKSIyTvjb7Elr+g= -github.com/ryancurrah/gomodguard v1.4.1/go.mod h1:qnMJwV1hX9m+YJseXEBhd2s90+1Xn6x9dLz11ualI1I= -github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9fJfSfdyCU= -github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ= -github.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv3+A96WvwXT0= -github.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4= -github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= -github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= -github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= -github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= -github.com/sashamelentyev/usestdlibvars v1.29.0 h1:8J0MoRrw4/NAXtjQqTHrbW9NN+3iMf7Knkq057v4XOQ= -github.com/sashamelentyev/usestdlibvars v1.29.0/go.mod h1:8PpnjHMk5VdeWlVb4wCdrB8PNbLqZ3wBZTZWkrpZZL8= -github.com/securego/gosec/v2 v2.24.7 h1:3k5yJnrhT1TTdsG0ZsnenlfCcT+7Y/+zeCPHbL7QAn8= -github.com/securego/gosec/v2 v2.24.7/go.mod h1:AdDJbjcG/XxFgVv7pW19vMNYlFM6+Q6Qy3t6lWAUcEY= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= -github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= -github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= -github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= -github.com/sonatard/noctx v0.5.0 h1:e/jdaqAsuWVOKQ0P6NWiIdDNHmHT5SwuuSfojFjzwrw= -github.com/sonatard/noctx v0.5.0/go.mod h1:64XdbzFb18XL4LporKXp8poqZtPKbCrqQ402CV+kJas= -github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= -github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= -github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stackitcloud/stackit-sdk-go/core v0.22.0 h1:6rViz7GnNwXSh51Lur5xuDzO8EWSZfN9J0HvEkBKq6c= -github.com/stackitcloud/stackit-sdk-go/core v0.22.0/go.mod h1:osMglDby4csGZ5sIfhNyYq1bS1TxIdPY88+skE/kkmI= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.4.0 h1:4wfRYOEFSpNLPvOV0YNIoGLVQBIQNkCvZwmL7JFzphM= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.4.0/go.mod h1:tIYiqgnS9929dEhQjf6rx1yNsdFf59e4r2wcXQMkLYo= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.5.0 h1:JeSnhioDCfV5K4V4mOjKtKgkgNtrkrU9bkt7JBs57lA= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.5.0/go.mod h1:3NQNKhHYIjIHTmf6RAcYLdnq17a8AZKkqFCu9Q/Y/3Y= -github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g= -github.com/stbenjam/no-sprintf-host-port v0.3.1/go.mod h1:ODbZesTCHMVKthBHskvUUexdcNHAQRXk9NpSsL8p/HQ= +github.com/stackitcloud/stackit-sdk-go/core v0.25.0 h1:ra3VEk684MNoq741g+xbZrKjZzhyztq5liUAwwew4DY= +github.com/stackitcloud/stackit-sdk-go/core v0.25.0/go.mod h1:WU1hhxnjXw2EV7CYa1nlEvNpMiRY6CvmIOaHuL3pOaA= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.7.1 h1:BWa9O8iRU1l8izGIoH9/+GEF20uu8WDWSesqjdJ3+lg= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.7.1/go.mod h1:xBWn0vpyyh+IA4muynufqIKmc1fJPPp+uY/iXwa5epE= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.9.0 h1:dv+8GYcI2G0BQvMN5Qb4kaCREaj9n2lRzj9sb29NEZg= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.9.0/go.mod h1:HTpVer71ZfpKozpzWVv7EbCPB5ko8vgw4VmFE38lB9I= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/teambition/rrule-go v1.8.2 h1:lIjpjvWTj9fFUZCmuoVDrKVOtdiyzbzc93qTmRVe/J8= github.com/teambition/rrule-go v1.8.2/go.mod h1:Ieq5AbrKGciP1V//Wq8ktsTXwSwJHDD5mD/wLBGl3p4= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.5.4 h1:u1ww+gqpRLiIA16yF2PV1CV1n/X3zhyezbNXC3E14Sg= -github.com/tetafro/godot v1.5.4/go.mod h1:eOkMrVQurDui411nBY2FA05EYH01r14LuWY/NrVDVcU= -github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 h1:9LPGD+jzxMlnk5r6+hJnar67cgpDIz/iyD+rfl5r2Vk= -github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67/go.mod h1:mkjARE7Yr8qU23YcGMSALbIxTQ9r9QBVahQOBRfU460= -github.com/timonwong/loggercheck v0.11.0 h1:jdaMpYBl+Uq9mWPXv1r8jc5fC3gyXx4/WGwTnnNKn4M= -github.com/timonwong/loggercheck v0.11.0/go.mod h1:HEAWU8djynujaAVX7QI65Myb8qgfcZ1uKbdpg3ZzKl8= -github.com/tomarrell/wrapcheck/v2 v2.12.0 h1:H/qQ1aNWz/eeIhxKAFvkfIA+N7YDvq6TWVFL27Of9is= -github.com/tomarrell/wrapcheck/v2 v2.12.0/go.mod h1:AQhQuZd0p7b6rfW+vUwHm5OMCGgp63moQ9Qr/0BpIWo= -github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= -github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ultraware/funlen v0.2.0 h1:gCHmCn+d2/1SemTdYMiKLAHFYxTYz7z9VIDRaTGyLkI= -github.com/ultraware/funlen v0.2.0/go.mod h1:ZE0q4TsJ8T1SQcjmkhN/w+MceuatI6pBFSxxyteHIJA= -github.com/ultraware/whitespace v0.2.0 h1:TYowo2m9Nfj1baEQBjuHzvMRbp19i+RCcRYrSWoFa+g= -github.com/ultraware/whitespace v0.2.0/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= -github.com/uudashr/gocognit v1.2.1 h1:CSJynt5txTnORn/DkhiB4mZjwPuifyASC8/6Q0I/QS4= -github.com/uudashr/gocognit v1.2.1/go.mod h1:acaubQc6xYlXFEMb9nWX2dYBzJ/bIjEkc1zzvyIZg5Q= -github.com/uudashr/iface v1.4.1 h1:J16Xl1wyNX9ofhpHmQ9h9gk5rnv2A6lX/2+APLTo0zU= -github.com/uudashr/iface v1.4.1/go.mod h1:pbeBPlbuU2qkNDn0mmfrxP2X+wjPMIQAy+r1MBXSXtg= github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI= github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= @@ -746,48 +196,11 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xen0n/gosmopolitan v1.3.0 h1:zAZI1zefvo7gcpbCOrPSHJZJYA9ZgLfJqtKzZ5pHqQM= -github.com/xen0n/gosmopolitan v1.3.0/go.mod h1:rckfr5T6o4lBtM1ga7mLGKZmLxswUoH1zxHgNXOsEt4= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= -github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= -github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= -github.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs= -github.com/yeya24/promlinter v0.3.0/go.mod h1:cDfJQQYv9uYciW60QT0eeHlFodotkYZlL+YcPQN+mW4= -github.com/ykadowak/zerologlint v0.1.5 h1:Gy/fMz1dFQN9JZTPjv1hxEk+sRWm05row04Yoolgdiw= -github.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.7.7 h1:5m9rrB1sW3JUMToKFQfb+FGt1U7r57IHu5GrYrG2nqU= -github.com/yuin/goldmark v1.7.7/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= -github.com/yuin/goldmark-meta v1.1.0 h1:pWw+JLHGZe8Rk0EGsMVssiNb/AaPMHfSRszZeUeiOUc= -github.com/yuin/goldmark-meta v1.1.0/go.mod h1:U4spWENafuA7Zyg+Lj5RqK/MF+ovMYtBvXi1lBb2VP0= -github.com/zclconf/go-cty v1.18.0 h1:pJ8+HNI4gFoyRNqVE37wWbJWVw43BZczFo7KUoRczaA= -github.com/zclconf/go-cty v1.18.0/go.mod h1:qpnV6EDNgC1sns/AleL1fvatHw72j+S+nS+MJ+T2CSg= +github.com/zclconf/go-cty v1.18.1 h1:yEGE8M4iIZlyKQURZNb2SnEyZlZHUcBCnx6KF81KuwM= +github.com/zclconf/go-cty v1.18.1/go.mod h1:qpnV6EDNgC1sns/AleL1fvatHw72j+S+nS+MJ+T2CSg= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= -gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo= -gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8= -go-simpler.org/musttag v0.14.0 h1:XGySZATqQYSEV3/YTy+iX+aofbZZllJaqwFWs+RTtSo= -go-simpler.org/musttag v0.14.0/go.mod h1:uP8EymctQjJ4Z1kUnjX0u2l60WfUdQxCwSNKzE1JEOE= -go-simpler.org/sloglint v0.11.1 h1:xRbPepLT/MHPTCA6TS/wNfZrDzkGvCCqUv4Bdwc3H7s= -go-simpler.org/sloglint v0.11.1/go.mod h1:2PowwiCOK8mjiF+0KGifVOT8ZsCNiFzvfyJeJOIt8MQ= -go.abhg.dev/goldmark/frontmatter v0.2.0 h1:P8kPG0YkL12+aYk2yU3xHv4tcXzeVnN+gU0tJ5JnxRw= -go.abhg.dev/goldmark/frontmatter v0.2.0/go.mod h1:XqrEkZuM57djk7zrlRUB02x8I5J0px76YjkOzhB4YlU= -go.augendre.info/arangolint v0.4.0 h1:xSCZjRoS93nXazBSg5d0OGCi9APPLNMmmLrC995tR50= -go.augendre.info/arangolint v0.4.0/go.mod h1:l+f/b4plABuFISuKnTGD4RioXiCCgghv2xqst/xOvAA= -go.augendre.info/fatcontext v0.9.0 h1:Gt5jGD4Zcj8CDMVzjOJITlSb9cEch54hjRRlN3qDojE= -go.augendre.info/fatcontext v0.9.0/go.mod h1:L94brOAT1OOUNue6ph/2HnwxoNlds9aXDF2FcUntbNw= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= @@ -800,392 +213,73 @@ go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2W go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= -go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= -go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= -golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME= -golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= -golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= -golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358 h1:qWFG1Dj7TBjOjOvhEOkmyGPVoquqUKnIU0lEVLp8xyk= -golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358/go.mod h1:4Mzdyp/6jzw9auFDJ3OMF5qksa7UvPnzKqTVGcb04ms= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= -golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= -golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= -golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg= -golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= +golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= -golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= -golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= +golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= +golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.79.2 h1:fRMD94s2tITpyJGtBBn7MkMseNpOZU8ZxgC3MMBaXRU= -google.golang.org/grpc v1.79.2/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= +google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.7.0 h1:w6WUp1VbkqPEgLz4rkBzH/CSU6HkoqNLp6GstyTx3lU= -honnef.co/go/tools v0.7.0/go.mod h1:pm29oPxeP3P82ISxZDgIYeOaf9ta6Pi0EWvCFoLG2vc= -mvdan.cc/gofumpt v0.9.2 h1:zsEMWL8SVKGHNztrx6uZrXdp7AX8r421Vvp23sz7ik4= -mvdan.cc/gofumpt v0.9.2/go.mod h1:iB7Hn+ai8lPvofHd9ZFGVg2GOr8sBUw1QUWjNbmIL/s= -mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 h1:ssMzja7PDPJV8FStj7hq9IKiuiKhgz9ErWw+m68e7DI= -mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15/go.mod h1:4M5MMXl2kW6fivUT6yRGpLLPNfuGtU2Z0cPvFquGDYU= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/stackit/internal/services/sqlserverflexbeta/database/datasources_gen/database_data_source_gen.go b/stackit/internal/services/sqlserverflexbeta/database/datasources_gen/database_data_source_gen.go index 92b1064e..e7afd007 100644 --- a/stackit/internal/services/sqlserverflexbeta/database/datasources_gen/database_data_source_gen.go +++ b/stackit/internal/services/sqlserverflexbeta/database/datasources_gen/database_data_source_gen.go @@ -61,6 +61,7 @@ func DatabaseDataSourceSchema(ctx context.Context) schema.Schema { Validators: []validator.String{ stringvalidator.OneOf( "eu01", + "eu02", ), }, }, diff --git a/stackit/internal/services/sqlserverflexbeta/database/datasources_gen/databases_data_source_gen.go b/stackit/internal/services/sqlserverflexbeta/database/datasources_gen/databases_data_source_gen.go index 71ec8fb4..abf028f3 100644 --- a/stackit/internal/services/sqlserverflexbeta/database/datasources_gen/databases_data_source_gen.go +++ b/stackit/internal/services/sqlserverflexbeta/database/datasources_gen/databases_data_source_gen.go @@ -102,6 +102,7 @@ func DatabasesDataSourceSchema(ctx context.Context) schema.Schema { Validators: []validator.String{ stringvalidator.OneOf( "eu01", + "eu02", ), }, }, diff --git a/stackit/internal/services/sqlserverflexbeta/database/resources_gen/database_resource_gen.go b/stackit/internal/services/sqlserverflexbeta/database/resources_gen/database_resource_gen.go index dccae0c4..d7cd3611 100644 --- a/stackit/internal/services/sqlserverflexbeta/database/resources_gen/database_resource_gen.go +++ b/stackit/internal/services/sqlserverflexbeta/database/resources_gen/database_resource_gen.go @@ -77,6 +77,7 @@ func DatabaseResourceSchema(ctx context.Context) schema.Schema { Validators: []validator.String{ stringvalidator.OneOf( "eu01", + "eu02", ), }, }, diff --git a/stackit/internal/services/sqlserverflexbeta/flavors/datasources_gen/flavors_data_source_gen.go b/stackit/internal/services/sqlserverflexbeta/flavors/datasources_gen/flavors_data_source_gen.go index a9d35ba1..38f301ef 100644 --- a/stackit/internal/services/sqlserverflexbeta/flavors/datasources_gen/flavors_data_source_gen.go +++ b/stackit/internal/services/sqlserverflexbeta/flavors/datasources_gen/flavors_data_source_gen.go @@ -135,6 +135,7 @@ func FlavorsDataSourceSchema(ctx context.Context) schema.Schema { Validators: []validator.String{ stringvalidator.OneOf( "eu01", + "eu02", ), }, }, diff --git a/stackit/internal/services/sqlserverflexbeta/instance/datasources_gen/instance_data_source_gen.go b/stackit/internal/services/sqlserverflexbeta/instance/datasources_gen/instance_data_source_gen.go index f3226581..cd943be7 100644 --- a/stackit/internal/services/sqlserverflexbeta/instance/datasources_gen/instance_data_source_gen.go +++ b/stackit/internal/services/sqlserverflexbeta/instance/datasources_gen/instance_data_source_gen.go @@ -126,6 +126,7 @@ func InstanceDataSourceSchema(ctx context.Context) schema.Schema { Validators: []validator.String{ stringvalidator.OneOf( "eu01", + "eu02", ), }, }, diff --git a/stackit/internal/services/sqlserverflexbeta/instance/datasources_gen/instances_data_source_gen.go b/stackit/internal/services/sqlserverflexbeta/instance/datasources_gen/instances_data_source_gen.go index 04fff1f6..b593acef 100644 --- a/stackit/internal/services/sqlserverflexbeta/instance/datasources_gen/instances_data_source_gen.go +++ b/stackit/internal/services/sqlserverflexbeta/instance/datasources_gen/instances_data_source_gen.go @@ -95,6 +95,7 @@ func InstancesDataSourceSchema(ctx context.Context) schema.Schema { Validators: []validator.String{ stringvalidator.OneOf( "eu01", + "eu02", ), }, }, diff --git a/stackit/internal/services/sqlserverflexbeta/instance/resources_gen/instance_resource_gen.go b/stackit/internal/services/sqlserverflexbeta/instance/resources_gen/instance_resource_gen.go index f8865ae5..7ea750c6 100644 --- a/stackit/internal/services/sqlserverflexbeta/instance/resources_gen/instance_resource_gen.go +++ b/stackit/internal/services/sqlserverflexbeta/instance/resources_gen/instance_resource_gen.go @@ -139,6 +139,7 @@ func InstanceResourceSchema(ctx context.Context) schema.Schema { Validators: []validator.String{ stringvalidator.OneOf( "eu01", + "eu02", ), }, }, diff --git a/stackit/internal/services/sqlserverflexbeta/user/datasources_gen/user_data_source_gen.go b/stackit/internal/services/sqlserverflexbeta/user/datasources_gen/user_data_source_gen.go index 34aef9ca..ea4833ee 100644 --- a/stackit/internal/services/sqlserverflexbeta/user/datasources_gen/user_data_source_gen.go +++ b/stackit/internal/services/sqlserverflexbeta/user/datasources_gen/user_data_source_gen.go @@ -68,6 +68,7 @@ func UserDataSourceSchema(ctx context.Context) schema.Schema { Validators: []validator.String{ stringvalidator.OneOf( "eu01", + "eu02", ), }, }, diff --git a/stackit/internal/services/sqlserverflexbeta/user/resources_gen/user_resource_gen.go b/stackit/internal/services/sqlserverflexbeta/user/resources_gen/user_resource_gen.go index f181f79c..aedfb365 100644 --- a/stackit/internal/services/sqlserverflexbeta/user/resources_gen/user_resource_gen.go +++ b/stackit/internal/services/sqlserverflexbeta/user/resources_gen/user_resource_gen.go @@ -60,6 +60,7 @@ func UserResourceSchema(ctx context.Context) schema.Schema { Validators: []validator.String{ stringvalidator.OneOf( "eu01", + "eu02", ), }, }, diff --git a/stackit/internal/services/sqlserverflexbeta/versions/datasources_gen/version_data_source_gen.go b/stackit/internal/services/sqlserverflexbeta/versions/datasources_gen/version_data_source_gen.go index 239b44d3..dfeb5348 100644 --- a/stackit/internal/services/sqlserverflexbeta/versions/datasources_gen/version_data_source_gen.go +++ b/stackit/internal/services/sqlserverflexbeta/versions/datasources_gen/version_data_source_gen.go @@ -32,6 +32,7 @@ func VersionDataSourceSchema(ctx context.Context) schema.Schema { Validators: []validator.String{ stringvalidator.OneOf( "eu01", + "eu02", ), }, }, From 4d96cc8951d61db6e86e3b330e3dedb290b3366b Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Fri, 17 Apr 2026 10:29:59 +0200 Subject: [PATCH 28/37] fix: fix publish pipeline [skip ci] --- .github/actions/notify/action.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/actions/notify/action.yaml b/.github/actions/notify/action.yaml index 2e72732e..bddd857d 100644 --- a/.github/actions/notify/action.yaml +++ b/.github/actions/notify/action.yaml @@ -142,7 +142,6 @@ runs: }} ] }') curl \ - --fail-with-body \ -X POST \ -H 'Content-Type: application/json' \ "${{ inputs.webhook_url }}" \ From 7b911ebf704de9c58652c86e42a40b536c609f82 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Fri, 17 Apr 2026 10:35:19 +0200 Subject: [PATCH 29/37] feat: add notification in thread [skip ci] --- .github/actions/notify/action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/notify/action.yaml b/.github/actions/notify/action.yaml index bddd857d..b36c5369 100644 --- a/.github/actions/notify/action.yaml +++ b/.github/actions/notify/action.yaml @@ -144,5 +144,5 @@ runs: curl \ -X POST \ -H 'Content-Type: application/json' \ - "${{ inputs.webhook_url }}" \ + "${{ inputs.webhook_url }}?threadKey=run${{ github.run_id }}&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD" \ -d "${PAYLOAD}" From e5b268114238413f1b2c9e8b53d57d0fc2624fe4 Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Fri, 17 Apr 2026 11:00:40 +0200 Subject: [PATCH 30/37] fix: notification in thread [skip ci] --- .github/actions/notify/action.yaml | 2 +- .github/workflows/publish.yaml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/actions/notify/action.yaml b/.github/actions/notify/action.yaml index b36c5369..bc4205c6 100644 --- a/.github/actions/notify/action.yaml +++ b/.github/actions/notify/action.yaml @@ -144,5 +144,5 @@ runs: curl \ -X POST \ -H 'Content-Type: application/json' \ - "${{ inputs.webhook_url }}?threadKey=run${{ github.run_id }}&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD" \ + "${{ inputs.webhook_url }}&threadKey=run${{ github.run_id }}&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD" \ -d "${PAYLOAD}" diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index dbfbc247..a5520ea0 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -21,6 +21,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v6 + with: + fetch-tags: true - name: Check GoReleaser uses: goreleaser/goreleaser-action@v7 From 8fee76f037997d38c0d859422c6bdd780b0202ec Mon Sep 17 00:00:00 2001 From: Marcel_Henselin Date: Thu, 7 May 2026 05:38:11 +0000 Subject: [PATCH 31/37] fix: postgresqlflex flavor errors (#107) feat: enable old v2 flavor handling Co-authored-by: Marcel S. Henselin Reviewed-on: https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pulls/107 --- .github/actions/acc_test/action.yaml | 2 +- .github/actions/build/action.yaml | 2 +- .github/actions/setup-cache-go/action.yaml | 2 +- .../postgresflexalpha_instance.md | 8 +- .../sqlserverflexalpha_database.md | 32 -- .../sqlserverflexalpha_instance.md | 77 --- docs/data-sources/sqlserverflexalpha_user.md | 62 --- docs/resources/postgresflexalpha_instance.md | 19 +- docs/resources/sqlserverflexalpha_database.md | 63 --- docs/resources/sqlserverflexalpha_instance.md | 103 ---- docs/resources/sqlserverflexalpha_user.md | 53 -- go.mod | 49 +- go.sum | 139 ++++-- sample/alpha-from-registry/sqlserver.tf | 101 ---- sample/postgres/postresql.tf | 19 +- sample/tf.sh | 5 +- ...n_config.yml.bak => collations_config.yml} | 0 ...ion_config.yml.bak => versions_config.yml} | 0 ...fig.yml.disabled => collations_config.yml} | 2 +- .../sqlserverflex/beta/versions_config.yml | 2 +- .../postgresflexalpha/flavor/datasource.go | 4 +- .../postgresflexalpha/flavors/datasource.go | 2 +- .../postgresflexalpha/flavors/functions.go | 65 +++ .../flavors/functions_test.go | 135 ++++++ .../instance_data_source_gen.go | 11 +- .../instance/flavor_functions.go | 65 +++ .../instance/flavor_functions_test.go | 135 ++++++ .../postgresflexalpha/instance/functions.go | 4 +- .../instance/functions_test.go | 3 +- .../postgresflexalpha/instance/resource.go | 159 +++++- .../resources_gen/instance_resource_gen.go | 30 +- ...or_unknown_if_flavor_unchanged_modifier.go | 85 ++++ .../instance_template_with_flavor.gompl | 101 ++++ .../versions_data_source_gen.go | 0 .../collations_data_source_gen.go | 451 +++++++++++++++++ ... => sqlserverflex_acc_test.go.deactivated} | 0 ...rce_gen.go => versions_data_source_gen.go} | 6 +- .../collations_data_source_gen.go | 452 ++++++++++++++++++ .../instance/flavor_functions.go | 65 +++ .../sqlserverflexbeta/instance/functions.go | 8 +- .../instance/functions_test.go | 124 ++--- .../sqlserverflexbeta/instance/resource.go | 131 ++++- ...or_unknown_if_flavor_unchanged_modifier.go | 85 ++++ ...rce_gen.go => versions_data_source_gen.go} | 6 +- stackit/provider.go | 21 +- stackit/provider_acc_test.go | 16 +- 46 files changed, 2209 insertions(+), 695 deletions(-) delete mode 100644 docs/data-sources/sqlserverflexalpha_database.md delete mode 100644 docs/data-sources/sqlserverflexalpha_instance.md delete mode 100644 docs/data-sources/sqlserverflexalpha_user.md delete mode 100644 docs/resources/sqlserverflexalpha_database.md delete mode 100644 docs/resources/sqlserverflexalpha_instance.md delete mode 100644 docs/resources/sqlserverflexalpha_user.md delete mode 100644 sample/alpha-from-registry/sqlserver.tf rename service_specs/sqlserverflex/alpha/{collation_config.yml.bak => collations_config.yml} (100%) rename service_specs/sqlserverflex/alpha/{version_config.yml.bak => versions_config.yml} (100%) rename service_specs/sqlserverflex/beta/{collation_config.yml.disabled => collations_config.yml} (92%) create mode 100644 stackit/internal/services/postgresflexalpha/flavors/functions.go create mode 100644 stackit/internal/services/postgresflexalpha/flavors/functions_test.go create mode 100644 stackit/internal/services/postgresflexalpha/instance/flavor_functions.go create mode 100644 stackit/internal/services/postgresflexalpha/instance/flavor_functions_test.go create mode 100644 stackit/internal/services/postgresflexalpha/instance/use_state_for_unknown_if_flavor_unchanged_modifier.go create mode 100644 stackit/internal/services/postgresflexalpha/testdata/instance_template_with_flavor.gompl rename stackit/internal/services/postgresflexalpha/{version => versions}/datasources_gen/versions_data_source_gen.go (100%) create mode 100644 stackit/internal/services/sqlserverflexalpha/collations/datasources_gen/collations_data_source_gen.go rename stackit/internal/services/sqlserverflexalpha/{sqlserverflex_acc_test.go => sqlserverflex_acc_test.go.deactivated} (100%) rename stackit/internal/services/sqlserverflexalpha/versions/datasources_gen/{version_data_source_gen.go => versions_data_source_gen.go} (99%) create mode 100644 stackit/internal/services/sqlserverflexbeta/collations/datasources_gen/collations_data_source_gen.go create mode 100644 stackit/internal/services/sqlserverflexbeta/instance/flavor_functions.go create mode 100644 stackit/internal/services/sqlserverflexbeta/instance/use_state_for_unknown_if_flavor_unchanged_modifier.go rename stackit/internal/services/sqlserverflexbeta/versions/datasources_gen/{version_data_source_gen.go => versions_data_source_gen.go} (99%) diff --git a/.github/actions/acc_test/action.yaml b/.github/actions/acc_test/action.yaml index e43ceeff..b656d5a5 100644 --- a/.github/actions/acc_test/action.yaml +++ b/.github/actions/acc_test/action.yaml @@ -14,7 +14,7 @@ inputs: go-version: description: "go version to install" - default: '1.25' + default: '1.26' required: true project_id: diff --git a/.github/actions/build/action.yaml b/.github/actions/build/action.yaml index 7bea976a..b9256143 100644 --- a/.github/actions/build/action.yaml +++ b/.github/actions/build/action.yaml @@ -3,7 +3,7 @@ description: "Build pipeline" inputs: go-version: description: "Go version to install" - default: '1.25' + default: '1.26' required: true java-distribution: description: "JAVA distribution to use (default: temurin)" diff --git a/.github/actions/setup-cache-go/action.yaml b/.github/actions/setup-cache-go/action.yaml index d352db76..eb12595f 100644 --- a/.github/actions/setup-cache-go/action.yaml +++ b/.github/actions/setup-cache-go/action.yaml @@ -10,7 +10,7 @@ inputs: go-version: description: "go version to install" - default: '1.25' + default: '1.26' required: true runs: diff --git a/docs/data-sources/postgresflexalpha_instance.md b/docs/data-sources/postgresflexalpha_instance.md index cb1d183a..0652d28b 100644 --- a/docs/data-sources/postgresflexalpha_instance.md +++ b/docs/data-sources/postgresflexalpha_instance.md @@ -42,10 +42,16 @@ data "stackitprivatepreview_postgresflexalpha_instance" "example" { - `flavor_id` (String) The id of the instance flavor. - `id` (String) internal ID - `is_deletable` (Boolean) Whether the instance can be deleted or not. +- `labels` (Map of String) Key-value pairs, 63 characters max, begin and end with an alphanumerical character, +may contain dashes (-), underscores (_), dots (.), and alphanumerics between. Key MUST be at least 1 character. +Max 64 labels +Regex for keys: ^(?=.{1,63}$)([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]$ +Regex for values: ^(?=.{0,63}$)(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])*$ +The stackit- prefix is reserved and cannot be used for Keys. - `name` (String) The name of the instance. - `network` (Attributes) The access configuration of the instance (see [below for nested schema](#nestedatt--network)) - `replicas` (Number) How many replicas the instance should have. -- `retention_days` (Number) How long backups are retained. The value can only be between 32 and 365 days. +- `retention_days` (Number) How long backups are retained. The value can only be between 32 and 90 days. - `status` (String) The current status of the instance. - `storage` (Attributes) The object containing information about the storage size and class. (see [below for nested schema](#nestedatt--storage)) - `tf_original_api_id` (String) The ID of the instance. diff --git a/docs/data-sources/sqlserverflexalpha_database.md b/docs/data-sources/sqlserverflexalpha_database.md deleted file mode 100644 index df66ffb7..00000000 --- a/docs/data-sources/sqlserverflexalpha_database.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -# generated by https://github.com/hashicorp/terraform-plugin-docs -page_title: "stackitprivatepreview_sqlserverflexalpha_database Data Source - stackitprivatepreview" -subcategory: "" -description: |- - ---- - -# stackitprivatepreview_sqlserverflexalpha_database (Data Source) - - - - - - -## Schema - -### Required - -- `database_name` (String) The name of the database. -- `instance_id` (String) The ID of the instance. -- `project_id` (String) The STACKIT project ID. -- `region` (String) The region which should be addressed - -### Read-Only - -- `collation_name` (String) The collation of the database. This database collation should match the *collation_name* of one of the collations given by the **Get database collation list** endpoint. -- `compatibility_level` (Number) CompatibilityLevel of the Database. -- `id` (String) The terraform internal identifier. -- `name` (String) The name of the database. -- `owner` (String) The owner of the database. -- `tf_original_api_id` (Number) The id of the database. diff --git a/docs/data-sources/sqlserverflexalpha_instance.md b/docs/data-sources/sqlserverflexalpha_instance.md deleted file mode 100644 index b05d7b8e..00000000 --- a/docs/data-sources/sqlserverflexalpha_instance.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -# generated by https://github.com/hashicorp/terraform-plugin-docs -page_title: "stackitprivatepreview_sqlserverflexalpha_instance Data Source - stackitprivatepreview" -subcategory: "" -description: |- - ---- - -# stackitprivatepreview_sqlserverflexalpha_instance (Data Source) - - - -## Example Usage - -```terraform -data "stackitprivatepreview_sqlserverflexalpha_instance" "example" { - project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -} -``` - - -## Schema - -### Required - -- `instance_id` (String) The ID of the instance. -- `project_id` (String) The STACKIT project ID. -- `region` (String) The region which should be addressed - -### Read-Only - -- `backup_schedule` (String) The schedule for on what time and how often the database backup will be created. The schedule is written as a cron schedule. -- `edition` (String) Edition of the MSSQL server instance -- `encryption` (Attributes) this defines which key to use for storage encryption (see [below for nested schema](#nestedatt--encryption)) -- `flavor_id` (String) The id of the instance flavor. -- `is_deletable` (Boolean) Whether the instance can be deleted or not. -- `name` (String) The name of the instance. -- `network` (Attributes) The access configuration of the instance (see [below for nested schema](#nestedatt--network)) -- `replicas` (Number) How many replicas the instance should have. -- `retention_days` (Number) The days for how long the backup files should be stored before cleaned up. 30 to 365 -- `status` (String) -- `storage` (Attributes) The object containing information about the storage size and class. (see [below for nested schema](#nestedatt--storage)) -- `tf_original_api_id` (String) The ID of the instance. -- `version` (String) The sqlserver version used for the instance. - - -### Nested Schema for `encryption` - -Read-Only: - -- `kek_key_id` (String) The key identifier -- `kek_key_ring_id` (String) The keyring identifier -- `kek_key_version` (String) The key version -- `service_account` (String) - - - -### Nested Schema for `network` - -Read-Only: - -- `access_scope` (String) The network access scope of the instance - -⚠️ **Note:** This feature is in private preview. Supplying this object is only permitted for enabled accounts. If your account does not have access, the request will be rejected. -- `acl` (List of String) List of IPV4 cidr. -- `instance_address` (String) -- `router_address` (String) - - - -### Nested Schema for `storage` - -Read-Only: - -- `class` (String) The storage class for the storage. -- `size` (Number) The storage size in Gigabytes. diff --git a/docs/data-sources/sqlserverflexalpha_user.md b/docs/data-sources/sqlserverflexalpha_user.md deleted file mode 100644 index 63526135..00000000 --- a/docs/data-sources/sqlserverflexalpha_user.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -# generated by https://github.com/hashicorp/terraform-plugin-docs -page_title: "stackitprivatepreview_sqlserverflexalpha_user Data Source - stackitprivatepreview" -subcategory: "" -description: |- - ---- - -# stackitprivatepreview_sqlserverflexalpha_user (Data Source) - - - -## Example Usage - -```terraform -data "stackitprivatepreview_sqlserverflexalpha_user" "example" { - project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - user_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -} -``` - - -## Schema - -### Required - -- `instance_id` (String) The ID of the instance. -- `project_id` (String) The STACKIT project ID. -- `region` (String) The region which should be addressed - -### Optional - -- `page` (Number) Number of the page of items list to be returned. -- `size` (Number) Number of items to be returned on each page. -- `sort` (String) Sorting of the users to be returned on each page. - -### Read-Only - -- `pagination` (Attributes) (see [below for nested schema](#nestedatt--pagination)) -- `users` (Attributes List) List of all users inside an instance (see [below for nested schema](#nestedatt--users)) - - -### Nested Schema for `pagination` - -Read-Only: - -- `page` (Number) -- `size` (Number) -- `sort` (String) -- `total_pages` (Number) -- `total_rows` (Number) - - - -### Nested Schema for `users` - -Read-Only: - -- `status` (String) The current status of the user. -- `tf_original_api_id` (Number) The ID of the user. -- `username` (String) The name of the user. diff --git a/docs/resources/postgresflexalpha_instance.md b/docs/resources/postgresflexalpha_instance.md index f6f10bcc..67ed171a 100644 --- a/docs/resources/postgresflexalpha_instance.md +++ b/docs/resources/postgresflexalpha_instance.md @@ -60,11 +60,10 @@ import { ### Required - `backup_schedule` (String) The schedule for when the database backup will be created. Currently, ONLY daily schedules are supported (every 24 hours). The schedule is written as a cron schedule. -- `flavor_id` (String) The id of the instance flavor. - `name` (String) The name of the instance. - `network` (Attributes) The access configuration of the instance (see [below for nested schema](#nestedatt--network)) - `replicas` (Number) How many replicas the instance should have. -- `retention_days` (Number) How long backups are retained. The value can only be between 32 and 365 days. +- `retention_days` (Number) How long backups are retained. The value can only be between 32 and 90 days. - `storage` (Attributes) The object containing information about the storage size and class. (see [below for nested schema](#nestedatt--storage)) - `version` (String) The Postgres version used for the instance. See [Versions Endpoint](/documentation/postgres-flex-service/version/v3alpha1#tag/Version) for supported version parameters. @@ -73,6 +72,8 @@ import { - `encryption` (Attributes) The configuration for instance's volume and backup storage encryption. ⚠︝ **Note:** This feature is in private preview. Supplying this object is only permitted for enabled accounts. If your account does not have access, the request will be rejected. (see [below for nested schema](#nestedatt--encryption)) +- `flavor` (Attributes, Deprecated) (see [below for nested schema](#nestedatt--flavor)) +- `flavor_id` (String) The id of the instance flavor. - `instance_id` (String) The ID of the instance. - `project_id` (String) The STACKIT project ID. - `region` (String) The region which should be addressed @@ -122,6 +123,20 @@ Required: - `service_account` (String) + +### Nested Schema for `flavor` + +Optional: + +- `cpu` (Number, Deprecated) +- `ram` (Number, Deprecated) + +Read-Only: + +- `description` (String) +- `id` (String) + + ### Nested Schema for `connection_info` diff --git a/docs/resources/sqlserverflexalpha_database.md b/docs/resources/sqlserverflexalpha_database.md deleted file mode 100644 index 7d8f050b..00000000 --- a/docs/resources/sqlserverflexalpha_database.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -# generated by https://github.com/hashicorp/terraform-plugin-docs -page_title: "stackitprivatepreview_sqlserverflexalpha_database Resource - stackitprivatepreview" -subcategory: "" -description: |- - ---- - -# stackitprivatepreview_sqlserverflexalpha_database (Resource) - - - -## Example Usage - -```terraform -resource "stackitprivatepreview_sqlserverflexalpha_database" "example" { - project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - collation = "" - compatibility = "160" - name = "" - owner = "" -} - -# Only use the import statement, if you want to import a existing sqlserverflex database -import { - to = stackitprivatepreview_sqlserverflexalpha_database.import-example - id = "${var.project_id},${var.region},${var.sql_instance_id},${var.sql_user_id}" -} - -import { - to = stackitprivatepreview_sqlserverflexalpha_database.import-example - identity = { - project_id = "project.id" - region = "region" - instance_id = "instance.id" - database_id = "database.id" - } -} -``` - - -## Schema - -### Required - -- `name` (String) The name of the database. -- `owner` (String) The owner of the database. - -### Optional - -- `collation` (String) The collation of the database. This database collation should match the *collation_name* of one of the collations given by the **Get database collation list** endpoint. -- `compatibility` (Number) CompatibilityLevel of the Database. -- `database_name` (String) The name of the database. -- `instance_id` (String) The ID of the instance. -- `project_id` (String) The STACKIT project ID. -- `region` (String) The region which should be addressed - -### Read-Only - -- `collation_name` (String) The collation of the database. This database collation should match the *collation_name* of one of the collations given by the **Get database collation list** endpoint. -- `compatibility_level` (Number) CompatibilityLevel of the Database. -- `id` (Number) The id of the database. diff --git a/docs/resources/sqlserverflexalpha_instance.md b/docs/resources/sqlserverflexalpha_instance.md deleted file mode 100644 index 95e33673..00000000 --- a/docs/resources/sqlserverflexalpha_instance.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -# generated by https://github.com/hashicorp/terraform-plugin-docs -page_title: "stackitprivatepreview_sqlserverflexalpha_instance Resource - stackitprivatepreview" -subcategory: "" -description: |- - ---- - -# stackitprivatepreview_sqlserverflexalpha_instance (Resource) - - - -## Example Usage - -```terraform -resource "stackitprivatepreview_sqlserverflexalpha_instance" "example" { - project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - name = "example-instance" - acl = ["XXX.XXX.XXX.X/XX", "XX.XXX.XX.X/XX"] - backup_schedule = "00 00 * * *" - flavor = { - cpu = 4 - ram = 16 - } - storage = { - class = "class" - size = 5 - } - version = 2022 -} - -# Only use the import statement, if you want to import an existing sqlserverflex instance -import { - to = stackitprivatepreview_sqlserverflexalpha_instance.import-example - id = "${var.project_id},${var.region},${var.sql_instance_id}" -} -``` - - -## Schema - -### Required - -- `backup_schedule` (String) The schedule for on what time and how often the database backup will be created. The schedule is written as a cron schedule. -- `flavor_id` (String) The id of the instance flavor. -- `name` (String) The name of the instance. -- `network` (Attributes) the network configuration of the instance. (see [below for nested schema](#nestedatt--network)) -- `retention_days` (Number) The days for how long the backup files should be stored before cleaned up. 30 to 365 -- `storage` (Attributes) The object containing information about the storage size and class. (see [below for nested schema](#nestedatt--storage)) -- `version` (String) The sqlserver version used for the instance. - -### Optional - -- `encryption` (Attributes) this defines which key to use for storage encryption (see [below for nested schema](#nestedatt--encryption)) -- `instance_id` (String) The ID of the instance. -- `project_id` (String) The STACKIT project ID. -- `region` (String) The region which should be addressed - -### Read-Only - -- `edition` (String) Edition of the MSSQL server instance -- `id` (String) The ID of the instance. -- `is_deletable` (Boolean) Whether the instance can be deleted or not. -- `replicas` (Number) How many replicas the instance should have. -- `status` (String) - - -### Nested Schema for `network` - -Required: - -- `acl` (List of String) List of IPV4 cidr. - -Optional: - -- `access_scope` (String) The network access scope of the instance - -⚠️ **Note:** This feature is in private preview. Supplying this object is only permitted for enabled accounts. If your account does not have access, the request will be rejected. - -Read-Only: - -- `instance_address` (String) -- `router_address` (String) - - - -### Nested Schema for `storage` - -Required: - -- `class` (String) The storage class for the storage. -- `size` (Number) The storage size in Gigabytes. - - - -### Nested Schema for `encryption` - -Required: - -- `kek_key_id` (String) The key identifier -- `kek_key_ring_id` (String) The keyring identifier -- `kek_key_version` (String) The key version -- `service_account` (String) diff --git a/docs/resources/sqlserverflexalpha_user.md b/docs/resources/sqlserverflexalpha_user.md deleted file mode 100644 index 85d5350e..00000000 --- a/docs/resources/sqlserverflexalpha_user.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -# generated by https://github.com/hashicorp/terraform-plugin-docs -page_title: "stackitprivatepreview_sqlserverflexalpha_user Resource - stackitprivatepreview" -subcategory: "" -description: |- - ---- - -# stackitprivatepreview_sqlserverflexalpha_user (Resource) - - - -## Example Usage - -```terraform -resource "stackitprivatepreview_sqlserverflexalpha_user" "example" { - project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - username = "username" - roles = ["role"] -} - -# Only use the import statement, if you want to import an existing sqlserverflex user -import { - to = stackitprivatepreview_sqlserverflexalpha_user.import-example - id = "${var.project_id},${var.region},${var.sql_instance_id},${var.sql_user_id}" -} -``` - - -## Schema - -### Required - -- `roles` (List of String) A list containing the user roles for the instance. A list with the valid user roles can be retrieved using the List Roles endpoint. -- `username` (String) The name of the user. - -### Optional - -- `default_database` (String) The default database for a user of the instance. -- `instance_id` (String) The ID of the instance. -- `project_id` (String) The STACKIT project ID. -- `region` (String) The region which should be addressed -- `user_id` (Number) The ID of the user. - -### Read-Only - -- `host` (String) The host of the instance in which the user belongs to. -- `id` (Number) The ID of the user. -- `password` (String) The password for the user. -- `port` (Number) The port of the instance in which the user belongs to. -- `status` (String) The current status of the user. -- `uri` (String) The connection string for the user to the instance. diff --git a/go.mod b/go.mod index b9cf8d3f..9954c594 100644 --- a/go.mod +++ b/go.mod @@ -1,25 +1,25 @@ module tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview -go 1.25.6 +go 1.26.2 require ( - github.com/SladkyCitron/slogcolor v1.8.0 + github.com/SladkyCitron/slogcolor v1.9.0 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/hashicorp/terraform-plugin-framework v1.19.0 github.com/hashicorp/terraform-plugin-framework-validators v0.19.0 github.com/hashicorp/terraform-plugin-go v0.31.0 github.com/hashicorp/terraform-plugin-log v0.10.0 - github.com/hashicorp/terraform-plugin-testing v1.15.0 + github.com/hashicorp/terraform-plugin-testing v1.16.0 github.com/iancoleman/strcase v0.3.0 github.com/ivanpirog/coloredcobra v1.0.1 github.com/jarcoal/httpmock v1.4.1 github.com/joho/godotenv v1.5.1 github.com/ldez/go-git-cmd-wrapper/v2 v2.9.1 github.com/spf13/cobra v1.10.2 - github.com/stackitcloud/stackit-sdk-go/core v0.25.0 - github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.7.1 - github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.9.0 + github.com/stackitcloud/stackit-sdk-go/core v0.26.0 + github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.8.0 + github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.10.0 github.com/teambition/rrule-go v1.8.2 gopkg.in/yaml.v3 v3.0.1 ) @@ -28,47 +28,67 @@ require github.com/hashicorp/go-retryablehttp v0.7.8 // indirect require ( dario.cat/mergo v1.0.1 // indirect + github.com/BurntSushi/toml v1.2.1 // indirect + github.com/Kunde21/markdownfmt/v3 v3.1.0 // indirect + github.com/Masterminds/goutils v1.1.1 // indirect + github.com/Masterminds/semver/v3 v3.2.0 // indirect + github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/ProtonMail/go-crypto v1.4.1 // indirect github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect + github.com/armon/go-radix v1.0.0 // indirect + github.com/bgentry/speakeasy v0.1.0 // indirect + github.com/bmatcuk/doublestar/v4 v4.10.0 // indirect github.com/cloudflare/circl v1.6.3 // indirect github.com/fatih/color v1.19.0 // indirect github.com/golang-jwt/jwt/v5 v5.3.1 // indirect github.com/golang/protobuf v1.5.4 // indirect + github.com/hashicorp/cli v1.1.7 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-checkpoint v0.5.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-cty v1.5.0 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-plugin v1.7.0 // indirect + github.com/hashicorp/go-plugin v1.8.0 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hashicorp/hc-install v0.9.3 // indirect + github.com/hashicorp/hc-install v0.9.5 // indirect github.com/hashicorp/hcl/v2 v2.24.0 // indirect github.com/hashicorp/logutils v1.0.0 // indirect - github.com/hashicorp/terraform-exec v0.25.0 // indirect - github.com/hashicorp/terraform-json v0.27.2 // indirect - github.com/hashicorp/terraform-plugin-sdk/v2 v2.40.0 // indirect + github.com/hashicorp/terraform-exec v0.25.2 // indirect + github.com/hashicorp/terraform-json v0.27.3-0.20260213134036-298b8f6b673a // indirect + github.com/hashicorp/terraform-plugin-docs v0.25.0 // indirect + github.com/hashicorp/terraform-plugin-sdk/v2 v2.40.1 // indirect github.com/hashicorp/terraform-registry-address v0.4.0 // indirect github.com/hashicorp/terraform-svchost v0.2.1 // indirect github.com/hashicorp/yamux v0.1.2 // indirect + github.com/huandu/xstrings v1.3.3 // indirect + github.com/imdario/mergo v0.3.15 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect - github.com/mattn/go-isatty v0.0.21 // indirect + github.com/mattn/go-isatty v0.0.22 // indirect + github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/oklog/run v1.2.0 // indirect + github.com/posener/complete v1.2.3 // indirect + github.com/shopspring/decimal v1.3.1 // indirect + github.com/spf13/cast v1.5.0 // indirect github.com/spf13/pflag v1.0.10 // indirect github.com/stretchr/testify v1.11.1 // indirect github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect + github.com/yuin/goldmark v1.7.7 // indirect + github.com/yuin/goldmark-meta v1.1.0 // indirect github.com/zclconf/go-cty v1.18.1 // indirect + go.abhg.dev/goldmark/frontmatter v0.2.0 // indirect golang.org/x/crypto v0.50.0 // indirect + golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect golang.org/x/mod v0.35.0 // indirect golang.org/x/net v0.53.0 // indirect golang.org/x/sync v0.20.0 // indirect @@ -76,7 +96,8 @@ require ( golang.org/x/text v0.36.0 // indirect golang.org/x/tools v0.44.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect - google.golang.org/grpc v1.80.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348 // indirect + google.golang.org/grpc v1.81.0 // indirect google.golang.org/protobuf v1.36.11 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index a4709994..eb49c8e4 100644 --- a/go.sum +++ b/go.sum @@ -1,16 +1,32 @@ dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= +github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/Kunde21/markdownfmt/v3 v3.1.0 h1:KiZu9LKs+wFFBQKhrZJrFZwtLnCCWJahL+S+E/3VnM0= +github.com/Kunde21/markdownfmt/v3 v3.1.0/go.mod h1:tPXN1RTyOzJwhfHoon9wUr4HGYmWgVxSQN6VBJDkrVc= +github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= +github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= +github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/ProtonMail/go-crypto v1.4.1 h1:9RfcZHqEQUvP8RzecWEUafnZVtEvrBVL9BiF67IQOfM= github.com/ProtonMail/go-crypto v1.4.1/go.mod h1:e1OaTyu5SYVrO9gKOEhTc+5UcXtTUa+P3uLudwcgPqo= -github.com/SladkyCitron/slogcolor v1.8.0 h1:ln4mUPfVhs7a/vZfjnKkz5YZ71Bg/KFWneS2hfFq6FM= -github.com/SladkyCitron/slogcolor v1.8.0/go.mod h1:ft8LEVIl4isUkebakhv+ngNXJjWBumnwhXfxTLApf3M= +github.com/SladkyCitron/slogcolor v1.9.0 h1:fr4LeG+T6pZ1RYNNOP925jaBYrTdpA6BLzGy29yd4vI= +github.com/SladkyCitron/slogcolor v1.9.0/go.mod h1:ft8LEVIl4isUkebakhv+ngNXJjWBumnwhXfxTLApf3M= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= +github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bmatcuk/doublestar/v4 v4.10.0 h1:zU9WiOla1YA122oLM6i4EXvGW62DvKZVxIe6TYWexEs= +github.com/bmatcuk/doublestar/v4 v4.10.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -32,10 +48,10 @@ github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= -github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= -github.com/go-git/go-git/v5 v5.16.5 h1:mdkuqblwr57kVfXri5TTH+nMFLNUxIj9Z7F5ykFbw5s= -github.com/go-git/go-git/v5 v5.16.5/go.mod h1:QOMLpNf1qxuSY4StA/ArOdfFR2TrKEjJiye2kel2m+M= +github.com/go-git/go-billy/v5 v5.8.0 h1:I8hjc3LbBlXTtVuFNJuwYuMiHvQJDq1AT6u4DwDzZG0= +github.com/go-git/go-billy/v5 v5.8.0/go.mod h1:RpvI/rw4Vr5QA+Z60c6d6LXH0rYJo0uD5SqfmrrheCY= +github.com/go-git/go-git/v5 v5.18.0 h1:O831KI+0PR51hM2kep6T8k+w0/LIAD490gvqMCvL5hM= +github.com/go-git/go-git/v5 v5.18.0/go.mod h1:pW/VmeqkanRFqR6AljLcs7EA7FbZaN5MQqO7oZADXpo= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -55,8 +71,11 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/cli v1.1.7 h1:/fZJ+hNdwfTSfsxMBa9WWMlfjUZbX8/LnUxgAd7lCVU= +github.com/hashicorp/cli v1.1.7/go.mod h1:e6Mfpga9OCT1vqzFuoGZiiF/KaG9CbUfO5s3ghU3YgU= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -69,10 +88,11 @@ github.com/hashicorp/go-cty v1.5.0 h1:EkQ/v+dDNUqnuVpmS5fPqyY71NXVgT5gf32+57xY8g github.com/hashicorp/go-cty v1.5.0/go.mod h1:lFUCG5kd8exDobgSfyj4ONE/dc822kiYMguVKdHGMLM= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-plugin v1.7.0 h1:YghfQH/0QmPNc/AZMTFE3ac8fipZyZECHdDPshfk+mA= -github.com/hashicorp/go-plugin v1.7.0/go.mod h1:BExt6KEaIYx804z8k4gRzRLEvxKVb+kn0NMcihqOqb8= +github.com/hashicorp/go-plugin v1.8.0 h1:ie8S6RRY8RvB2usYZv+AAZ/wBvx2AU5p5QeP5j/FORs= +github.com/hashicorp/go-plugin v1.8.0/go.mod h1:BExt6KEaIYx804z8k4gRzRLEvxKVb+kn0NMcihqOqb8= github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -80,16 +100,20 @@ github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/C github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hc-install v0.9.3 h1:1H4dgmgzxEVwT6E/d/vIL5ORGVKz9twRwDw+qA5Hyho= -github.com/hashicorp/hc-install v0.9.3/go.mod h1:FQlQ5I3I/X409N/J1U4pPeQQz1R3BoV0IysB7aiaQE0= +github.com/hashicorp/hc-install v0.9.5 h1:XHCjcMn2563ysuaQ9v9ec2FNc7c2PJOIEEGobAFeIx4= +github.com/hashicorp/hc-install v0.9.5/go.mod h1:ihEW4LshrNkxq2bU/MpVbKyn+yt1is2hYqUTHDGhG84= github.com/hashicorp/hcl/v2 v2.24.0 h1:2QJdZ454DSsYGoaE6QheQZjtKZSUs9Nh2izTWiwQxvE= github.com/hashicorp/hcl/v2 v2.24.0/go.mod h1:oGoO1FIQYfn/AgyOhlg9qLC6/nOJPX3qGbkZpYAcqfM= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/terraform-exec v0.25.0 h1:Bkt6m3VkJqYh+laFMrWIpy9KHYFITpOyzRMNI35rNaY= -github.com/hashicorp/terraform-exec v0.25.0/go.mod h1:dl9IwsCfklDU6I4wq9/StFDp7dNbH/h5AnfS1RmiUl8= +github.com/hashicorp/terraform-exec v0.25.2 h1:fFLAVEtAjKdGfawGUXDnKooCnqJi+TuohT3W99AGbhk= +github.com/hashicorp/terraform-exec v0.25.2/go.mod h1:uaQV2oqVLqM4cixJryk6qIWS1qji3GtuwPG5pjGXYfc= github.com/hashicorp/terraform-json v0.27.2 h1:BwGuzM6iUPqf9JYM/Z4AF1OJ5VVJEEzoKST/tRDBJKU= github.com/hashicorp/terraform-json v0.27.2/go.mod h1:GzPLJ1PLdUG5xL6xn1OXWIjteQRT2CNT9o/6A9mi9hE= +github.com/hashicorp/terraform-json v0.27.3-0.20260213134036-298b8f6b673a h1:T7AMR21kjrbeEpN+KhGlyd31XXHsSZF5zg+ivfeYte4= +github.com/hashicorp/terraform-json v0.27.3-0.20260213134036-298b8f6b673a/go.mod h1:yjb5C2W07l8lmAzdyVgOLji0/D2IoHkR3rusBzUO4O0= +github.com/hashicorp/terraform-plugin-docs v0.25.0 h1:qHs1V257NxVe8tv6HS4UQfNqjaPP5eUlLeDf7jYk85U= +github.com/hashicorp/terraform-plugin-docs v0.25.0/go.mod h1:MQggCmY8zgP7R7E/cC0b0cmTvA9hSj3ZKyrrsDjRbLo= github.com/hashicorp/terraform-plugin-framework v1.19.0 h1:q0bwyhxAOR3vfdgbk9iplv3MlTv/dhBHTXjQOtQDoBA= github.com/hashicorp/terraform-plugin-framework v1.19.0/go.mod h1:YRXOBu0jvs7xp4AThBbX4mAzYaMJ1JgtFH//oGKxwLc= github.com/hashicorp/terraform-plugin-framework-validators v0.19.0 h1:Zz3iGgzxe/1XBkooZCewS0nJAaCFPFPHdNJd8FgE4Ow= @@ -98,18 +122,23 @@ github.com/hashicorp/terraform-plugin-go v0.31.0 h1:0Fz2r9DQ+kNNl6bx8HRxFd1TfMKU github.com/hashicorp/terraform-plugin-go v0.31.0/go.mod h1:A88bDhd/cW7FnwqxQRz3slT+QY6yzbHKc6AOTtmdeS8= github.com/hashicorp/terraform-plugin-log v0.10.0 h1:eu2kW6/QBVdN4P3Ju2WiB2W3ObjkAsyfBsL3Wh1fj3g= github.com/hashicorp/terraform-plugin-log v0.10.0/go.mod h1:/9RR5Cv2aAbrqcTSdNmY1NRHP4E3ekrXRGjqORpXyB0= -github.com/hashicorp/terraform-plugin-sdk/v2 v2.40.0 h1:MKS/2URqeJRwJdbOfcbdsZCq/IRrNkqJNN0GtVIsuGs= -github.com/hashicorp/terraform-plugin-sdk/v2 v2.40.0/go.mod h1:PuG4P97Ju3QXW6c6vRkRadWJbvnEu2Xh+oOuqcYOqX4= -github.com/hashicorp/terraform-plugin-testing v1.15.0 h1:/fimKyl0YgD7aAtJkuuAZjwBASXhCIwWqMbDLnKLMe4= -github.com/hashicorp/terraform-plugin-testing v1.15.0/go.mod h1:bGXMw7bE95EiZhSBV3rM2W8TiffaPTDuLS+HFI/lIYs= +github.com/hashicorp/terraform-plugin-sdk/v2 v2.40.1 h1:2yPUd7esMOpuTaG3y1iEla1iw+tla+3ZEkkBnmOAre4= +github.com/hashicorp/terraform-plugin-sdk/v2 v2.40.1/go.mod h1:sq8qsxh+PwdvTQFcd17kfCoBgQo46ADNMvCpKE7t/gY= +github.com/hashicorp/terraform-plugin-testing v1.16.0 h1:GB97nGnJ1hESpDrCjqZig38RodSF0gdRzxlDupLXP38= +github.com/hashicorp/terraform-plugin-testing v1.16.0/go.mod h1:eQPYAy9xFMV7xtIFX8Y+wJGtUB++HBl329zCF6PBMZk= github.com/hashicorp/terraform-registry-address v0.4.0 h1:S1yCGomj30Sao4l5BMPjTGZmCNzuv7/GDTDX99E9gTk= github.com/hashicorp/terraform-registry-address v0.4.0/go.mod h1:LRS1Ay0+mAiRkUyltGT+UHWkIqTFvigGn/LbMshfflE= github.com/hashicorp/terraform-svchost v0.2.1 h1:ubvrTFw3Q7CsoEaX7V06PtCTKG3wu7GyyobAoN4eF3Q= github.com/hashicorp/terraform-svchost v0.2.1/go.mod h1:zDMheBLvNzu7Q6o9TBvPqiZToJcSuCLXjAXxBslSky4= github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= +github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= +github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= +github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -129,9 +158,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/ldez/go-git-cmd-wrapper/v2 v2.9.1 h1:QJRB9Gs5i/h6TVJI6yl09Qm6rNooznRiKwIw+VIxd90= github.com/ldez/go-git-cmd-wrapper/v2 v2.9.1/go.mod h1:0eUeas7XtKDPKQbB0KijfaMPbuQ/cIprtoTRiwaUoFg= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -140,10 +168,13 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.21 h1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLGs= -github.com/mattn/go-isatty v0.0.21/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= +github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4= +github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/maxatome/go-testdeep v1.14.0 h1:rRlLv1+kI8eOI3OaBXZwb3O7xY3exRzdW5QyX48g9wI= github.com/maxatome/go-testdeep v1.14.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= @@ -152,6 +183,7 @@ github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQ github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/oklog/run v1.2.0 h1:O8x3yXwah4A73hJdlrwo/2X6J62gE5qTMusH0dvz60E= @@ -161,13 +193,21 @@ github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxu github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= @@ -175,13 +215,16 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stackitcloud/stackit-sdk-go/core v0.25.0 h1:ra3VEk684MNoq741g+xbZrKjZzhyztq5liUAwwew4DY= -github.com/stackitcloud/stackit-sdk-go/core v0.25.0/go.mod h1:WU1hhxnjXw2EV7CYa1nlEvNpMiRY6CvmIOaHuL3pOaA= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.7.1 h1:BWa9O8iRU1l8izGIoH9/+GEF20uu8WDWSesqjdJ3+lg= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.7.1/go.mod h1:xBWn0vpyyh+IA4muynufqIKmc1fJPPp+uY/iXwa5epE= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.9.0 h1:dv+8GYcI2G0BQvMN5Qb4kaCREaj9n2lRzj9sb29NEZg= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.9.0/go.mod h1:HTpVer71ZfpKozpzWVv7EbCPB5ko8vgw4VmFE38lB9I= +github.com/stackitcloud/stackit-sdk-go/core v0.26.0 h1:jQEb9gkehfp6VCP6TcYk7BI10cz4l0KM2L6hqYBH2QA= +github.com/stackitcloud/stackit-sdk-go/core v0.26.0/go.mod h1:WU1hhxnjXw2EV7CYa1nlEvNpMiRY6CvmIOaHuL3pOaA= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.8.0 h1:oWTviJKdlUxaaARJghTjOqBbarIK+7+nH3Kc3Wxn4rQ= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.8.0/go.mod h1:yzlakB+f8ur4yAHR6lyCABO+HcEtZG3G2Faj6m5/uW8= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.10.0 h1:angvO3z0TGqZtdwTDsG/tgTw9hxB76A6leUsiUXQtME= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.10.0/go.mod h1:AiUoMAqQcOlMgDtkVJlqI7P/VGD5xjN3dYjERGnwN/M= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= @@ -197,27 +240,36 @@ github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.7.7 h1:5m9rrB1sW3JUMToKFQfb+FGt1U7r57IHu5GrYrG2nqU= +github.com/yuin/goldmark v1.7.7/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark-meta v1.1.0 h1:pWw+JLHGZe8Rk0EGsMVssiNb/AaPMHfSRszZeUeiOUc= +github.com/yuin/goldmark-meta v1.1.0/go.mod h1:U4spWENafuA7Zyg+Lj5RqK/MF+ovMYtBvXi1lBb2VP0= github.com/zclconf/go-cty v1.18.1 h1:yEGE8M4iIZlyKQURZNb2SnEyZlZHUcBCnx6KF81KuwM= github.com/zclconf/go-cty v1.18.1/go.mod h1:qpnV6EDNgC1sns/AleL1fvatHw72j+S+nS+MJ+T2CSg= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= +go.abhg.dev/goldmark/frontmatter v0.2.0 h1:P8kPG0YkL12+aYk2yU3xHv4tcXzeVnN+gU0tJ5JnxRw= +go.abhg.dev/goldmark/frontmatter v0.2.0/go.mod h1:XqrEkZuM57djk7zrlRUB02x8I5J0px76YjkOzhB4YlU= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= -go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= -go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= -go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= -go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= -go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= -go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= -go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= -go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= -go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME= +golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= @@ -225,6 +277,7 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -242,16 +295,19 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -266,10 +322,10 @@ gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= -google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348 h1:pfIbyB44sWzHiCpRqIen67ZQnVXSfIxWrqUMk1qwODE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.81.0 h1:W3G9N3KQf3BU+YuCtGKJk0CmxQNbAISICD/9AORxLIw= +google.golang.org/grpc v1.81.0/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= @@ -280,6 +336,9 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/sample/alpha-from-registry/sqlserver.tf b/sample/alpha-from-registry/sqlserver.tf deleted file mode 100644 index 2bf17a9e..00000000 --- a/sample/alpha-from-registry/sqlserver.tf +++ /dev/null @@ -1,101 +0,0 @@ -# resource "stackit_kms_keyring" "keyring001" { -# project_id = var.project_id -# display_name = "msh-keyring-sna01" -# description = "This is a test keyring for private endpoints" -# } -# -# resource "stackit_kms_key" "key001" { -# project_id = var.project_id -# keyring_id = stackit_kms_keyring.keyring001.keyring_id -# display_name = "msh-key-sna01" -# protection = "software" -# algorithm = "aes_256_gcm" -# purpose = "symmetric_encrypt_decrypt" -# access_scope = "SNA" -# } - -data "stackitprivatepreview_sqlserverflexbeta_flavor" "sqlserver_flavor" { - project_id = var.project_id - region = "eu01" - cpu = 4 - ram = 16 - node_type = "Single" - storage_class = "premium-perf2-stackit" -} - -resource "stackitprivatepreview_sqlserverflexbeta_instance" "msh-sna-001" { - project_id = var.project_id - name = "msh-sna-001" - backup_schedule = "0 3 * * *" - retention_days = 31 - flavor_id = data.stackitprivatepreview_sqlserverflexbeta_flavor.sqlserver_flavor.flavor_id - storage = { - class = "premium-perf2-stackit" - size = 50 - } - version = 2022 - encryption = { - kek_key_version = 1 - kek_key_id = var.key_id - kek_key_ring_id = var.keyring_id - service_account = var.sa_email - } - network = { - acl = ["0.0.0.0/0", "193.148.160.0/19"] - access_scope = "SNA" - } -} - -#resource "stackitprivatepreview_sqlserverflexbeta_instance" "msh-nosna-001" { -# project_id = var.project_id -# name = "msh-nosna-001" -# backup_schedule = "0 3 * * *" -# retention_days = 31 -# flavor_id = data.stackitprivatepreview_sqlserverflexbeta_flavor.sqlserver_flavor.flavor_id -# storage = { -# class = "premium-perf2-stackit" -# size = 50 -# } -# version = 2022 -# # encryption = { -# # #key_id = stackit_kms_key.key.key_id -# # #keyring_id = stackit_kms_keyring.keyring.keyring_id -# # #key_version = 1 -# # #key_id = var.key_id -# # # key with scope public -# # key_id = "fe039bcf-8d7b-431a-801d-9e81371a6b7b" -# # keyring_id = var.keyring_id -# # key_version = var.key_version -# # service_account = var.sa_email -# # } -# network = { -# acl = ["0.0.0.0/0", "193.148.160.0/19"] -# access_scope = "PUBLIC" -# } -#} - -# data "stackitprivatepreview_sqlserverflexbeta_instance" "test" { -# project_id = var.project_id -# instance_id = var.instance_id -# region = "eu01" -# } - -# output "test" { -# value = data.stackitprivatepreview_sqlserverflexbeta_instance.test -# } - -resource "stackitprivatepreview_sqlserverflexbeta_user" "ptlsdbadminuser" { - project_id = var.project_id - instance_id = stackitprivatepreview_sqlserverflexbeta_instance.msh-sna-001.instance_id - username = var.db_admin_username - #roles = ["##STACKIT_LoginManager##", "##STACKIT_DatabaseManager##"] - roles = ["##STACKIT_LoginManager##"] -} - -resource "stackitprivatepreview_sqlserverflexbeta_user" "ptlsdbuser" { - project_id = var.project_id - instance_id = stackitprivatepreview_sqlserverflexbeta_instance.msh-sna-001.instance_id - username = var.db_username - roles = ["##STACKIT_LoginManager##"] -} - diff --git a/sample/postgres/postresql.tf b/sample/postgres/postresql.tf index 531b17e2..8679c669 100644 --- a/sample/postgres/postresql.tf +++ b/sample/postgres/postresql.tf @@ -13,7 +13,11 @@ resource "stackitprivatepreview_postgresflexalpha_instance" "msh-sna-pe-example" name = "mshpetest2" backup_schedule = "0 0 * * *" retention_days = 45 - flavor_id = data.stackitprivatepreview_postgresflexalpha_flavor.pgsql_flavor.flavor_id + # flavor_id = data.stackitprivatepreview_postgresflexalpha_flavor.pgsql_flavor.flavor_id + flavor = { + cpu = 2 + ram = 4 + } replicas = 1 storage = { # class = "premium-perf2-stackit" @@ -66,7 +70,8 @@ resource "stackitprivatepreview_postgresflexalpha_user" "ptlsdbadminuser" { project_id = var.project_id instance_id = stackitprivatepreview_postgresflexalpha_instance.msh-sna-pe-example.instance_id name = var.db_admin_username - roles = ["createdb", "login", "login"] + roles = ["createdb", "login"] + # roles = ["createdb", "login", "login"] # roles = ["createdb", "login", "createrole"] } @@ -110,7 +115,11 @@ output "psql_user_password" { sensitive = true } -output "psql_user_conn" { - value = stackitprivatepreview_postgresflexalpha_user.ptlsdbuser.connection_string - sensitive = true +# output "psql_user_conn" { +# value = stackitprivatepreview_postgresflexalpha_user.ptlsdbuser.connection.host +# sensitive = true +# } + +output "determined_flavor_id" { + value = stackitprivatepreview_postgresflexalpha_instance.msh-sna-pe-example.flavor_id } diff --git a/sample/tf.sh b/sample/tf.sh index 8feaf799..5b650bdc 100755 --- a/sample/tf.sh +++ b/sample/tf.sh @@ -1,7 +1,5 @@ #!/usr/bin/env bash - - # ./tf.sh apply > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2) usage() { @@ -12,7 +10,8 @@ usage() { [ $# -eq 0 ] && usage CONFIG_FOLDER=$(dirname "$0") -BINARY=terraform +# BINARY=terraform +BINARY=tofu ADD="" diff --git a/service_specs/sqlserverflex/alpha/collation_config.yml.bak b/service_specs/sqlserverflex/alpha/collations_config.yml similarity index 100% rename from service_specs/sqlserverflex/alpha/collation_config.yml.bak rename to service_specs/sqlserverflex/alpha/collations_config.yml diff --git a/service_specs/sqlserverflex/alpha/version_config.yml.bak b/service_specs/sqlserverflex/alpha/versions_config.yml similarity index 100% rename from service_specs/sqlserverflex/alpha/version_config.yml.bak rename to service_specs/sqlserverflex/alpha/versions_config.yml diff --git a/service_specs/sqlserverflex/beta/collation_config.yml.disabled b/service_specs/sqlserverflex/beta/collations_config.yml similarity index 92% rename from service_specs/sqlserverflex/beta/collation_config.yml.disabled rename to service_specs/sqlserverflex/beta/collations_config.yml index d1160ec3..3d5fbb69 100644 --- a/service_specs/sqlserverflex/beta/collation_config.yml.disabled +++ b/service_specs/sqlserverflex/beta/collations_config.yml @@ -2,7 +2,7 @@ provider: name: stackitprivatepreview data_sources: - collation: + collations: read: path: /v3beta1/projects/{projectId}/regions/{region}/instances/{instanceId}/collations method: GET diff --git a/service_specs/sqlserverflex/beta/versions_config.yml b/service_specs/sqlserverflex/beta/versions_config.yml index 70d79676..c1ed0b00 100644 --- a/service_specs/sqlserverflex/beta/versions_config.yml +++ b/service_specs/sqlserverflex/beta/versions_config.yml @@ -3,7 +3,7 @@ provider: name: stackitprivatepreview data_sources: - version: + versions: read: path: /v3beta1/projects/{projectId}/regions/{region}/versions method: GET diff --git a/stackit/internal/services/postgresflexalpha/flavor/datasource.go b/stackit/internal/services/postgresflexalpha/flavor/datasource.go index 455baf14..97213227 100644 --- a/stackit/internal/services/postgresflexalpha/flavor/datasource.go +++ b/stackit/internal/services/postgresflexalpha/flavor/datasource.go @@ -226,8 +226,8 @@ func (r *flavorDataSource) Read(ctx context.Context, req datasource.ReadRequest, postgresflexalphaGen.StorageClassesValue{}.AttributeTypes(ctx), map[string]attr.Value{ "class": types.StringValue(sc.Class), - "max_io_per_sec": types.Int32Value(sc.MaxIoPerSec), - "max_through_in_mb": types.Int32Value(sc.MaxThroughInMb), + "max_io_per_sec": types.Int64Value(int64(sc.GetMaxIoPerSec())), + "max_through_in_mb": types.Int64Value(int64(sc.GetMaxThroughInMb())), }, ), ) diff --git a/stackit/internal/services/postgresflexalpha/flavors/datasource.go b/stackit/internal/services/postgresflexalpha/flavors/datasource.go index f5c99a82..c70ec173 100644 --- a/stackit/internal/services/postgresflexalpha/flavors/datasource.go +++ b/stackit/internal/services/postgresflexalpha/flavors/datasource.go @@ -1,4 +1,4 @@ -package postgresflexalpha +package postgresflexalphaflavors import ( "context" diff --git a/stackit/internal/services/postgresflexalpha/flavors/functions.go b/stackit/internal/services/postgresflexalpha/flavors/functions.go new file mode 100644 index 00000000..2135f8d0 --- /dev/null +++ b/stackit/internal/services/postgresflexalpha/flavors/functions.go @@ -0,0 +1,65 @@ +package postgresflexalphaflavors + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3alpha1api" +) + +type flavorsClientReader interface { + GetFlavorsRequest( + ctx context.Context, + projectId, region string, + ) v3alpha1api.ApiGetFlavorsRequestRequest +} + +func getAllFlavors(ctx context.Context, client flavorsClientReader, projectId, region string) ( + []v3alpha1api.ListFlavors, + error, +) { + getAllFilter := func(_ v3alpha1api.ListFlavors) bool { return true } + flavorList, err := getFlavorsByFilter(ctx, client, projectId, region, getAllFilter) + if err != nil { + return nil, err + } + return flavorList, nil +} + +// getFlavorsByFilter is a helper function to retrieve flavors using a filtern function. +// Hint: The API does not have a GetFlavors endpoint, only ListFlavors +func getFlavorsByFilter( + ctx context.Context, + client flavorsClientReader, + projectId, region string, + filter func(db v3alpha1api.ListFlavors) bool, +) ([]v3alpha1api.ListFlavors, error) { + if projectId == "" || region == "" { + return nil, fmt.Errorf("listing postgresflex flavors: projectId and region are required") + } + + const pageSize = 25 + + var result = make([]v3alpha1api.ListFlavors, 0) + + for page := int32(1); ; page++ { + res, err := client.GetFlavorsRequest(ctx, projectId, region). + Page(page).Size(pageSize).Sort(v3alpha1api.FLAVORSORT_ID_ASC).Execute() + if err != nil { + return nil, fmt.Errorf("requesting flavors list (page %d): %w", page, err) + } + + // If the API returns no flavors, we have reached the end of the list. + if len(res.Flavors) == 0 { + break + } + + for _, flavor := range res.Flavors { + if filter(flavor) { + result = append(result, flavor) + } + } + } + + return result, nil +} diff --git a/stackit/internal/services/postgresflexalpha/flavors/functions_test.go b/stackit/internal/services/postgresflexalpha/flavors/functions_test.go new file mode 100644 index 00000000..8ca78e1f --- /dev/null +++ b/stackit/internal/services/postgresflexalpha/flavors/functions_test.go @@ -0,0 +1,135 @@ +package postgresflexalphaflavors + +/* +import ( + "context" + "testing" + + postgresflex "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3alpha1api" +) + +type mockRequest struct { + executeFunc func() (*postgresflex.GetFlavorsResponse, error) +} + +func (m *mockRequest) Page(_ int32) postgresflex.ApiGetFlavorsRequestRequest { return m } +func (m *mockRequest) Size(_ int32) postgresflex.ApiGetFlavorsRequestRequest { return m } +func (m *mockRequest) Sort(_ postgresflex.FlavorSort) postgresflex.ApiGetFlavorsRequestRequest { + return m +} +func (m *mockRequest) Execute() (*postgresflex.GetFlavorsResponse, error) { + return m.executeFunc() +} + +type mockFlavorsClient struct { + executeRequest func() postgresflex.ApiGetFlavorsRequestRequest +} + +func (m *mockFlavorsClient) GetFlavorsRequest(_ context.Context, _, _ string) postgresflex.ApiGetFlavorsRequestRequest { + return m.executeRequest() +} + +var mockResp = func(page int32) (*postgresflex.GetFlavorsResponse, error) { + if page == 1 { + return &postgresflex.GetFlavorsResponse{ + Flavors: []postgresflex.ListFlavors{ + {Id: "flavor-1", Description: "first"}, + {Id: "flavor-2", Description: "second"}, + }, + }, nil + } + if page == 2 { + return &postgresflex.GetFlavorsResponse{ + Flavors: []postgresflex.ListFlavors{ + {Id: "flavor-3", Description: "three"}, + }, + }, nil + } + + return &postgresflex.GetFlavorsResponse{ + Flavors: []postgresflex.ListFlavors{}, + }, nil +} + +func TestGetFlavorsByFilter(t *testing.T) { + tests := []struct { + description string + projectId string + region string + mockErr error + filter func(postgresflex.ListFlavors) bool + wantCount int + wantErr bool + }{ + { + description: "Success - Get all flavors (2 pages)", + projectId: "pid", region: "reg", + filter: func(_ postgresflex.ListFlavors) bool { return true }, + wantCount: 3, + wantErr: false, + }, + { + description: "Success - Filter flavors by description", + projectId: "pid", region: "reg", + filter: func(f postgresflex.ListFlavors) bool { return f.Description == "first" }, + wantCount: 1, + wantErr: false, + }, + { + description: "Error - Missing parameters", + projectId: "", region: "reg", + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run( + tt.description, func(t *testing.T) { + var currentPage int32 + client := &mockFlavorsClient{ + executeRequest: func() postgresflex.ApiGetFlavorsRequestRequest { + return mockRequest{ + executeFunc: func() (*postgresflex.GetFlavorsResponse, error) { + currentPage++ + return mockResp(currentPage) + }, + } + }, + } + actual, err := getFlavorsByFilter(context.Background(), client, tt.projectId, tt.region, tt.filter) + + if (err != nil) != tt.wantErr { + t.Errorf("getFlavorsByFilter() error = %v, wantErr %v", err, tt.wantErr) + return + } + + if !tt.wantErr && len(actual) != tt.wantCount { + t.Errorf("getFlavorsByFilter() got %d flavors, want %d", len(actual), tt.wantCount) + } + }, + ) + } +} + +func TestGetAllFlavors(t *testing.T) { + var currentPage int32 + client := &mockFlavorsClient{ + executeRequest: func() postgresflex.ApiGetFlavorsRequestRequest { + return mockRequest{ + executeFunc: func() (*postgresflex.GetFlavorsResponse, error) { + currentPage++ + return mockResp(currentPage) + }, + } + }, + } + + res, err := getAllFlavors(context.Background(), client, "pid", "reg") + if err != nil { + t.Errorf("getAllFlavors() unexpected error: %v", err) + } + if len(res) != 3 { + t.Errorf("getAllFlavors() expected 3 flavor, got %d", len(res)) + } +} +*/ diff --git a/stackit/internal/services/postgresflexalpha/instance/datasources_gen/instance_data_source_gen.go b/stackit/internal/services/postgresflexalpha/instance/datasources_gen/instance_data_source_gen.go index 9b3e28ce..587d2d89 100644 --- a/stackit/internal/services/postgresflexalpha/instance/datasources_gen/instance_data_source_gen.go +++ b/stackit/internal/services/postgresflexalpha/instance/datasources_gen/instance_data_source_gen.go @@ -115,6 +115,12 @@ func InstanceDataSourceSchema(ctx context.Context) schema.Schema { Description: "Whether the instance can be deleted or not.", MarkdownDescription: "Whether the instance can be deleted or not.", }, + "labels": schema.MapAttribute{ + ElementType: types.StringType, + Computed: true, + Description: "Key-value pairs, 63 characters max, begin and end with an alphanumerical character,\nmay contain dashes (-), underscores (_), dots (.), and alphanumerics between. Key MUST be at least 1 character.\nMax 64 labels\nRegex for keys: ^(?=.{1,63}$)([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]$\nRegex for values: ^(?=.{0,63}$)(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])*$\nThe stackit- prefix is reserved and cannot be used for Keys.\n", + MarkdownDescription: "Key-value pairs, 63 characters max, begin and end with an alphanumerical character,\nmay contain dashes (-), underscores (_), dots (.), and alphanumerics between. Key MUST be at least 1 character.\nMax 64 labels\nRegex for keys: ^(?=.{1,63}$)([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]$\nRegex for values: ^(?=.{0,63}$)(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])*$\nThe stackit- prefix is reserved and cannot be used for Keys.\n", + }, "name": schema.StringAttribute{ Computed: true, Description: "The name of the instance.", @@ -171,8 +177,8 @@ func InstanceDataSourceSchema(ctx context.Context) schema.Schema { }, "retention_days": schema.Int64Attribute{ Computed: true, - Description: "How long backups are retained. The value can only be between 32 and 365 days.", - MarkdownDescription: "How long backups are retained. The value can only be between 32 and 365 days.", + Description: "How long backups are retained. The value can only be between 32 and 90 days.", + MarkdownDescription: "How long backups are retained. The value can only be between 32 and 90 days.", }, "status": schema.StringAttribute{ Computed: true, @@ -219,6 +225,7 @@ type InstanceModel struct { Id types.String `tfsdk:"tf_original_api_id"` InstanceId types.String `tfsdk:"instance_id"` IsDeletable types.Bool `tfsdk:"is_deletable"` + Labels types.Map `tfsdk:"labels"` Name types.String `tfsdk:"name"` Network NetworkValue `tfsdk:"network"` ProjectId types.String `tfsdk:"project_id"` diff --git a/stackit/internal/services/postgresflexalpha/instance/flavor_functions.go b/stackit/internal/services/postgresflexalpha/instance/flavor_functions.go new file mode 100644 index 00000000..a9d86e38 --- /dev/null +++ b/stackit/internal/services/postgresflexalpha/instance/flavor_functions.go @@ -0,0 +1,65 @@ +package postgresflexalpha + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3alpha1api" +) + +type flavorsClientReader interface { + GetFlavorsRequest( + ctx context.Context, + projectId, region string, + ) v3alpha1api.ApiGetFlavorsRequestRequest +} + +func getAllFlavors(ctx context.Context, client flavorsClientReader, projectId, region string) ( + []v3alpha1api.ListFlavors, + error, +) { + getAllFilter := func(_ v3alpha1api.ListFlavors) bool { return true } + flavorList, err := getFlavorsByFilter(ctx, client, projectId, region, getAllFilter) + if err != nil { + return nil, err + } + return flavorList, nil +} + +// getFlavorsByFilter is a helper function to retrieve flavors using a filtern function. +// Hint: The API does not have a GetFlavors endpoint, only ListFlavors +func getFlavorsByFilter( + ctx context.Context, + client flavorsClientReader, + projectId, region string, + filter func(db v3alpha1api.ListFlavors) bool, +) ([]v3alpha1api.ListFlavors, error) { + if projectId == "" || region == "" { + return nil, fmt.Errorf("listing postgresflex flavors: projectId and region are required") + } + + const pageSize = 25 + + var result = make([]v3alpha1api.ListFlavors, 0) + + for page := int32(1); ; page++ { + res, err := client.GetFlavorsRequest(ctx, projectId, region). + Page(page).Size(pageSize).Sort(v3alpha1api.FLAVORSORT_ID_ASC).Execute() + if err != nil { + return nil, fmt.Errorf("requesting flavors list (page %d): %w", page, err) + } + + // If the API returns no flavors, we have reached the end of the list. + if len(res.Flavors) == 0 { + break + } + + for _, flavor := range res.Flavors { + if filter(flavor) { + result = append(result, flavor) + } + } + } + + return result, nil +} diff --git a/stackit/internal/services/postgresflexalpha/instance/flavor_functions_test.go b/stackit/internal/services/postgresflexalpha/instance/flavor_functions_test.go new file mode 100644 index 00000000..6fbd8c2f --- /dev/null +++ b/stackit/internal/services/postgresflexalpha/instance/flavor_functions_test.go @@ -0,0 +1,135 @@ +package postgresflexalpha + +/* +import ( + "context" + "testing" + + postgresflex "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3alpha1api" +) + +type mockRequest struct { + executeFunc func() (*postgresflex.GetFlavorsResponse, error) +} + +func (m *mockRequest) Page(_ int32) postgresflex.ApiGetFlavorsRequestRequest { return m } +func (m *mockRequest) Size(_ int32) postgresflex.ApiGetFlavorsRequestRequest { return m } +func (m *mockRequest) Sort(_ postgresflex.FlavorSort) postgresflex.ApiGetFlavorsRequestRequest { + return m +} +func (m *mockRequest) Execute() (*postgresflex.GetFlavorsResponse, error) { + return m.executeFunc() +} + +type mockFlavorsClient struct { + executeRequest func() postgresflex.ApiGetFlavorsRequestRequest +} + +func (m *mockFlavorsClient) GetFlavorsRequest(_ context.Context, _, _ string) postgresflex.ApiGetFlavorsRequestRequest { + return m.executeRequest() +} + +var mockResp = func(page int32) (*postgresflex.GetFlavorsResponse, error) { + if page == 1 { + return &postgresflex.GetFlavorsResponse{ + Flavors: []postgresflex.ListFlavors{ + {Id: "flavor-1", Description: "first"}, + {Id: "flavor-2", Description: "second"}, + }, + }, nil + } + if page == 2 { + return &postgresflex.GetFlavorsResponse{ + Flavors: []postgresflex.ListFlavors{ + {Id: "flavor-3", Description: "three"}, + }, + }, nil + } + + return &postgresflex.GetFlavorsResponse{ + Flavors: []postgresflex.ListFlavors{}, + }, nil +} + +func TestGetFlavorsByFilter(t *testing.T) { + tests := []struct { + description string + projectId string + region string + mockErr error + filter func(postgresflex.ListFlavors) bool + wantCount int + wantErr bool + }{ + { + description: "Success - Get all flavors (2 pages)", + projectId: "pid", region: "reg", + filter: func(_ postgresflex.ListFlavors) bool { return true }, + wantCount: 3, + wantErr: false, + }, + { + description: "Success - Filter flavors by description", + projectId: "pid", region: "reg", + filter: func(f postgresflex.ListFlavors) bool { return f.Description == "first" }, + wantCount: 1, + wantErr: false, + }, + { + description: "Error - Missing parameters", + projectId: "", region: "reg", + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run( + tt.description, func(t *testing.T) { + var currentPage int32 + client := &mockFlavorsClient{ + executeRequest: func() postgresflex.ApiGetFlavorsRequestRequest { + return mockRequest{ + executeFunc: func() (*postgresflex.GetFlavorsResponse, error) { + currentPage++ + return mockResp(currentPage) + }, + } + }, + } + actual, err := getFlavorsByFilter(context.Background(), client, tt.projectId, tt.region, tt.filter) + + if (err != nil) != tt.wantErr { + t.Errorf("getFlavorsByFilter() error = %v, wantErr %v", err, tt.wantErr) + return + } + + if !tt.wantErr && len(actual) != tt.wantCount { + t.Errorf("getFlavorsByFilter() got %d flavors, want %d", len(actual), tt.wantCount) + } + }, + ) + } +} + +func TestGetAllFlavors(t *testing.T) { + var currentPage int32 + client := &mockFlavorsClient{ + executeRequest: func() postgresflex.ApiGetFlavorsRequestRequest { + return mockRequest{ + executeFunc: func() (*postgresflex.GetFlavorsResponse, error) { + currentPage++ + return mockResp(currentPage) + }, + } + }, + } + + res, err := getAllFlavors(context.Background(), client, "pid", "reg") + if err != nil { + t.Errorf("getAllFlavors() unexpected error: %v", err) + } + if len(res) != 3 { + t.Errorf("getAllFlavors() expected 3 flavor, got %d", len(res)) + } +} +*/ diff --git a/stackit/internal/services/postgresflexalpha/instance/functions.go b/stackit/internal/services/postgresflexalpha/instance/functions.go index 1eb10d32..ad67ba3d 100644 --- a/stackit/internal/services/postgresflexalpha/instance/functions.go +++ b/stackit/internal/services/postgresflexalpha/instance/functions.go @@ -16,7 +16,7 @@ import ( func mapGetInstanceResponseToModel( ctx context.Context, - m *postgresflexalpharesource.InstanceModel, + m *LocalInstanceModel, resp *postgresflex.GetInstanceResponse, ) error { m.BackupSchedule = types.StringValue(resp.GetBackupSchedule()) @@ -71,6 +71,8 @@ func mapGetInstanceResponseToModel( m.Acl = netACL + // m.Labels = resp.GetLabels() + netInstAdd := types.StringValue("") if instAdd, ok := resp.Network.GetInstanceAddressOk(); ok { netInstAdd = types.StringValue(*instAdd) diff --git a/stackit/internal/services/postgresflexalpha/instance/functions_test.go b/stackit/internal/services/postgresflexalpha/instance/functions_test.go index 0fa85f16..1a7d495b 100644 --- a/stackit/internal/services/postgresflexalpha/instance/functions_test.go +++ b/stackit/internal/services/postgresflexalpha/instance/functions_test.go @@ -8,7 +8,6 @@ import ( postgresflex "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3alpha1api" - postgresflexalpharesource "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/instance/resources_gen" utils2 "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/utils" ) @@ -171,7 +170,7 @@ func Test_mapGetInstanceResponseToModel(t *testing.T) { t.Skipf("please implement") type args struct { ctx context.Context - m *postgresflexalpharesource.InstanceModel + m *LocalInstanceModel resp *postgresflex.GetInstanceResponse } tests := []struct { diff --git a/stackit/internal/services/postgresflexalpha/instance/resource.go b/stackit/internal/services/postgresflexalpha/instance/resource.go index ad99978e..52742195 100644 --- a/stackit/internal/services/postgresflexalpha/instance/resource.go +++ b/stackit/internal/services/postgresflexalpha/instance/resource.go @@ -11,11 +11,14 @@ import ( "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/resource/schema" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-framework/types/basetypes" "github.com/hashicorp/terraform-plugin-log/tflog" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" coreUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3alpha1api" - "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/conversion" "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/core" postgresflexalpha "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/instance/resources_gen" @@ -44,12 +47,25 @@ type instanceResource struct { providerData core.ProviderData } +type LocalInstanceModel struct { + postgresflexalpha.InstanceModel + Flavor types.Object `tfsdk:"flavor"` +} + +// Struct corresponding to Model.Flavor +type flavorModel struct { + Id types.String `tfsdk:"id"` + Description types.String `tfsdk:"description"` + CPU types.Int64 `tfsdk:"cpu"` + RAM types.Int64 `tfsdk:"ram"` +} + func (r *instanceResource) ValidateConfig( ctx context.Context, req resource.ValidateConfigRequest, resp *resource.ValidateConfigResponse, ) { - var data postgresflexalpha.InstanceModel + var data LocalInstanceModel resp.Diagnostics.Append(req.Config.Get(ctx, &data)...) if resp.Diagnostics.HasError() { @@ -64,6 +80,23 @@ func (r *instanceResource) ValidateConfig( "The resource may return unexpected results.", ) } + + if data.FlavorId.IsNull() { + if data.Flavor.IsUnknown() || data.Flavor.IsNull() { + resp.Diagnostics.AddAttributeError( + path.Root("flavor"), + "Missing Attribute Configuration", + "Expected flavor to be configured. "+ + "The resource may return unexpected results.", + ) + } + resp.Diagnostics.AddAttributeWarning( + path.Root("flavor"), + "Attribute Configuration Deprecation", + "Using flavor is deprecated, "+ + "please use flavor_id instead.", + ) + } } // ModifyPlan implements resource.ResourceWithModifyPlan. @@ -73,7 +106,7 @@ func (r *instanceResource) ModifyPlan( req resource.ModifyPlanRequest, resp *resource.ModifyPlanResponse, ) { // nolint:gocritic // function signature required by Terraform - var configModel postgresflexalpha.InstanceModel + var configModel LocalInstanceModel // skip initial empty configuration to avoid follow-up errors if req.Config.Raw.IsNull() { return @@ -83,7 +116,7 @@ func (r *instanceResource) ModifyPlan( return } - var planModel postgresflexalpha.InstanceModel + var planModel LocalInstanceModel resp.Diagnostics.Append(req.Plan.Get(ctx, &planModel)...) if resp.Diagnostics.HasError() { return @@ -133,20 +166,53 @@ func (r *instanceResource) Configure( var modifiersFileByte []byte // Schema defines the schema for the resource. -func (r *instanceResource) Schema(ctx context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { - schema := postgresflexalpha.InstanceResourceSchema(ctx) +func (r *instanceResource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) { + schemaVar := postgresflexalpha.InstanceResourceSchema(ctx) + schemaVar.Attributes["flavor"] = schema.SingleNestedAttribute{ + Optional: true, + DeprecationMessage: "Please use flavor_id instead.", + Attributes: map[string]schema.Attribute{ + "id": schema.StringAttribute{ + Computed: true, + PlanModifiers: []planmodifier.String{ + UseStateForUnknownIfFlavorUnchanged(req), + }, + }, + "description": schema.StringAttribute{ + Computed: true, + PlanModifiers: []planmodifier.String{ + UseStateForUnknownIfFlavorUnchanged(req), + }, + }, + "cpu": schema.Int64Attribute{ + DeprecationMessage: "Please use flavor_id instead.", + Optional: true, + }, + "ram": schema.Int64Attribute{ + DeprecationMessage: "Please use flavor_id instead.", + Optional: true, + }, + }, + } + + schemaVar.Attributes["flavor_id"] = schema.StringAttribute{ + Optional: true, + Description: "The id of the instance flavor.", + MarkdownDescription: "The id of the instance flavor.", + } + fields, err := utils.ReadModifiersConfig(modifiersFileByte) if err != nil { resp.Diagnostics.AddError("error during read modifiers config file", err.Error()) return } - err = utils.AddPlanModifiersToResourceSchema(fields, &schema) + err = utils.AddPlanModifiersToResourceSchema(fields, &schemaVar) if err != nil { resp.Diagnostics.AddError("error adding plan modifiers", err.Error()) return } - resp.Schema = schema + resp.Schema = schemaVar } // Create creates the resource and sets the initial Terraform state. @@ -155,7 +221,7 @@ func (r *instanceResource) Create( req resource.CreateRequest, resp *resource.CreateResponse, ) { // nolint:gocritic // function signature required by Terraform - var model postgresflexalpha.InstanceModel + var model LocalInstanceModel diags := req.Plan.Get(ctx, &model) resp.Diagnostics.Append(diags...) @@ -177,6 +243,73 @@ func (r *instanceResource) Create( return } + // determine flavor ID + var flModel = &flavorModel{} + if !(model.Flavor.IsNull() || model.Flavor.IsUnknown()) { + diags = model.Flavor.As(ctx, flModel, basetypes.ObjectAsOptions{}) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + flavors, err := getAllFlavors(ctx, r.client.DefaultAPI, projectID, region) + if err != nil { + core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading flavors", fmt.Sprintf("getAllFlavors: %v", err)) + return + } + tflog.Debug(ctx, fmt.Sprintf("loaded flavors: %d", len(flavors))) + + var foundFlavors []v3alpha1api.ListFlavors + for _, flavor := range flavors { + if flModel.CPU.ValueInt64() != int64(flavor.Cpu) { + // tflog.Debug(ctx, fmt.Sprintf("flavor - cpu did not match (%d - %d)", flModel.CPU.ValueInt64(), flavor.Cpu)) + continue + } + if flModel.RAM.ValueInt64() != int64(flavor.Memory) { + // tflog.Debug(ctx, fmt.Sprintf("flavor - ram did not match (%d - %d)", flModel.RAM.ValueInt64(), flavor.Memory)) + continue + } + tmpNodeType := "Single" + if model.Replicas.ValueInt64() > 1 { + tmpNodeType = "Replica" + } + if strings.ToLower(tmpNodeType) != strings.ToLower(flavor.NodeType) { + //tflog.Debug( + // ctx, + // fmt.Sprintf( + // "flavor - nodeType did not match ('%s' - '%s')", + // strings.ToLower(tmpNodeType), + // strings.ToLower(flavor.NodeType), + // ), + //) + continue + } + tflog.Debug(ctx, fmt.Sprintf("found flavor %s, checking storage classes", flavor.Id)) + for _, sc := range flavor.StorageClasses { + if model.Storage.PerformanceClass.ValueString() != sc.Class { + continue + } + tflog.Debug(ctx, fmt.Sprintf("found storage class '%s' for flavor '%s', checking storage classes", sc.Class, flavor.Id)) + foundFlavors = append(foundFlavors, flavor) + } + } + if len(foundFlavors) == 0 { + resp.Diagnostics.AddError("get flavor", "could not find requested flavor") + return + } + if len(foundFlavors) > 1 { + resp.Diagnostics.AddError("get flavor", "found too many matching flavors") + return + } + + f := foundFlavors[0] + flModel.Description = types.StringValue(f.Description) + flModel.Id = utils.BuildInternalTerraformId(model.ProjectId.ValueString(), region, f.Id) + model.FlavorId = types.StringValue(f.Id) + //flModel. .MaxGb = types.Int32Value(f.MaxGB) + //flModel.MinGb = types.Int32Value(f.MinGB) + } + replVal := model.Replicas.ValueInt64() // nolint:gosec // check is performed above payload := modelToCreateInstancePayload(netACL, model, replVal) @@ -243,7 +376,7 @@ func (r *instanceResource) Create( func modelToCreateInstancePayload( netACL []string, - model postgresflexalpha.InstanceModel, + model LocalInstanceModel, replVal int64, ) v3alpha1api.CreateInstanceRequestPayload { var enc *v3alpha1api.InstanceEncryption @@ -283,7 +416,7 @@ func (r *instanceResource) Read( ) { // nolint:gocritic // function signature required by Terraform functionErrorSummary := "read instance failed" - var model postgresflexalpha.InstanceModel + var model LocalInstanceModel diags := req.State.Get(ctx, &model) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -371,7 +504,7 @@ func (r *instanceResource) Update( req resource.UpdateRequest, resp *resource.UpdateResponse, ) { // nolint:gocritic // function signature required by Terraform - var model postgresflexalpha.InstanceModel + var model LocalInstanceModel diags := req.Plan.Get(ctx, &model) resp.Diagnostics.Append(diags...) @@ -484,7 +617,7 @@ func (r *instanceResource) Delete( req resource.DeleteRequest, resp *resource.DeleteResponse, ) { // nolint:gocritic // function signature required by Terraform - var model postgresflexalpha.InstanceModel + var model LocalInstanceModel diags := req.State.Get(ctx, &model) resp.Diagnostics.Append(diags...) diff --git a/stackit/internal/services/postgresflexalpha/instance/resources_gen/instance_resource_gen.go b/stackit/internal/services/postgresflexalpha/instance/resources_gen/instance_resource_gen.go index 7d7969a6..7483dd67 100644 --- a/stackit/internal/services/postgresflexalpha/instance/resources_gen/instance_resource_gen.go +++ b/stackit/internal/services/postgresflexalpha/instance/resources_gen/instance_resource_gen.go @@ -119,6 +119,13 @@ func InstanceResourceSchema(ctx context.Context) schema.Schema { Description: "Whether the instance can be deleted or not.", MarkdownDescription: "Whether the instance can be deleted or not.", }, + //"labels": schema.MapAttribute{ + // ElementType: types.StringType, + // Optional: true, + // Computed: true, + // Description: "Key-value pairs, 63 characters max, begin and end with an alphanumerical character,\nmay contain dashes (-), underscores (_), dots (.), and alphanumerics between. Key MUST be at least 1 character.\nMax 64 labels\nRegex for keys: ^(?=.{1,63}$)([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]$\nRegex for values: ^(?=.{0,63}$)(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])*$\nThe stackit- prefix is reserved and cannot be used for Keys.\n", + // MarkdownDescription: "Key-value pairs, 63 characters max, begin and end with an alphanumerical character,\nmay contain dashes (-), underscores (_), dots (.), and alphanumerics between. Key MUST be at least 1 character.\nMax 64 labels\nRegex for keys: ^(?=.{1,63}$)([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]$\nRegex for values: ^(?=.{0,63}$)(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])*$\nThe stackit- prefix is reserved and cannot be used for Keys.\n", + //}, "name": schema.StringAttribute{ Required: true, Description: "The name of the instance.", @@ -191,8 +198,8 @@ func InstanceResourceSchema(ctx context.Context) schema.Schema { }, "retention_days": schema.Int64Attribute{ Required: true, - Description: "How long backups are retained. The value can only be between 32 and 365 days.", - MarkdownDescription: "How long backups are retained. The value can only be between 32 and 365 days.", + Description: "How long backups are retained. The value can only be between 32 and 90 days.", + MarkdownDescription: "How long backups are retained. The value can only be between 32 and 90 days.", }, "status": schema.StringAttribute{ Computed: true, @@ -239,15 +246,16 @@ type InstanceModel struct { Id types.String `tfsdk:"id"` InstanceId types.String `tfsdk:"instance_id"` IsDeletable types.Bool `tfsdk:"is_deletable"` - Name types.String `tfsdk:"name"` - Network NetworkValue `tfsdk:"network"` - ProjectId types.String `tfsdk:"project_id"` - Region types.String `tfsdk:"region"` - Replicas types.Int64 `tfsdk:"replicas"` - RetentionDays types.Int64 `tfsdk:"retention_days"` - Status types.String `tfsdk:"status"` - Storage StorageValue `tfsdk:"storage"` - Version types.String `tfsdk:"version"` + //Labels types.Map `tfsdk:"labels"` + Name types.String `tfsdk:"name"` + Network NetworkValue `tfsdk:"network"` + ProjectId types.String `tfsdk:"project_id"` + Region types.String `tfsdk:"region"` + Replicas types.Int64 `tfsdk:"replicas"` + RetentionDays types.Int64 `tfsdk:"retention_days"` + Status types.String `tfsdk:"status"` + Storage StorageValue `tfsdk:"storage"` + Version types.String `tfsdk:"version"` } var _ basetypes.ObjectTypable = ConnectionInfoType{} diff --git a/stackit/internal/services/postgresflexalpha/instance/use_state_for_unknown_if_flavor_unchanged_modifier.go b/stackit/internal/services/postgresflexalpha/instance/use_state_for_unknown_if_flavor_unchanged_modifier.go new file mode 100644 index 00000000..a6dfc1d3 --- /dev/null +++ b/stackit/internal/services/postgresflexalpha/instance/use_state_for_unknown_if_flavor_unchanged_modifier.go @@ -0,0 +1,85 @@ +package postgresflexalpha + +import ( + "context" + + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" + "github.com/hashicorp/terraform-plugin-framework/types/basetypes" +) + +type useStateForUnknownIfFlavorUnchangedModifier struct { + Req resource.SchemaRequest +} + +// UseStateForUnknownIfFlavorUnchanged returns a plan modifier similar to UseStateForUnknown +// if the RAM and CPU values are not changed in the plan. Otherwise, the plan modifier does nothing. +func UseStateForUnknownIfFlavorUnchanged(req resource.SchemaRequest) planmodifier.String { + return useStateForUnknownIfFlavorUnchangedModifier{ + Req: req, + } +} + +func (m useStateForUnknownIfFlavorUnchangedModifier) Description(context.Context) string { + return "UseStateForUnknownIfFlavorUnchanged returns a plan modifier similar to UseStateForUnknown if the RAM and CPU values are not changed in the plan. Otherwise, the plan modifier does nothing." +} + +func (m useStateForUnknownIfFlavorUnchangedModifier) MarkdownDescription(ctx context.Context) string { + return m.Description(ctx) +} + +func (m useStateForUnknownIfFlavorUnchangedModifier) PlanModifyString(ctx context.Context, req planmodifier.StringRequest, resp *planmodifier.StringResponse) { // nolint:gocritic // function signature required by Terraform + // Do nothing if there is no state value. + if req.StateValue.IsNull() { + return + } + + // Do nothing if there is a known planned value. + if !req.PlanValue.IsUnknown() { + return + } + + // Do nothing if there is an unknown configuration value, otherwise interpolation gets messed up. + if req.ConfigValue.IsUnknown() { + return + } + + // The above checks are taken from the UseStateForUnknown plan modifier implementation + // (https://github.com/hashicorp/terraform-plugin-framework/blob/main/resource/schema/stringplanmodifier/use_state_for_unknown.go#L38) + + var stateModel LocalInstanceModel + diags := req.State.Get(ctx, &stateModel) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + var stateFlavor = &flavorModel{} + if !(stateModel.Flavor.IsNull() || stateModel.Flavor.IsUnknown()) { + diags = stateModel.Flavor.As(ctx, stateFlavor, basetypes.ObjectAsOptions{}) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + } + + var planModel LocalInstanceModel + diags = req.Plan.Get(ctx, &planModel) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + var planFlavor = &flavorModel{} + if !(planModel.Flavor.IsNull() || planModel.Flavor.IsUnknown()) { + diags = planModel.Flavor.As(ctx, planFlavor, basetypes.ObjectAsOptions{}) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + } + + if planFlavor.CPU == stateFlavor.CPU && planFlavor.RAM == stateFlavor.RAM { + resp.PlanValue = req.StateValue + } +} diff --git a/stackit/internal/services/postgresflexalpha/testdata/instance_template_with_flavor.gompl b/stackit/internal/services/postgresflexalpha/testdata/instance_template_with_flavor.gompl new file mode 100644 index 00000000..70d0692f --- /dev/null +++ b/stackit/internal/services/postgresflexalpha/testdata/instance_template_with_flavor.gompl @@ -0,0 +1,101 @@ +provider "stackitprivatepreview" { + default_region = "{{ .Region }}" + service_account_key_path = "{{ .ServiceAccountFilePath }}" +} + +data "stackitprivatepreview_postgresflexalpha_flavor" "flavor" { + project_id = "{{ .ProjectID }}" + region = "{{ .Region }}" + cpu = 4 + ram = 16 + node_type = "Single" + storage_class = "premium-perf2-stackit" +} + +resource "stackitprivatepreview_postgresflexalpha_instance" "{{ .TfName }}" { + project_id = "{{ .ProjectID }}" + name = "{{ .Name }}" + backup_schedule = "{{ .BackupSchedule }}" + retention_days = {{ .RetentionDays }} + flavor_id = "{{ .FlavorID }}" + replicas = {{ .Replicas }} + storage = { + performance_class = "{{ .PerformanceClass }}" + size = {{ .Size }} + } +{{ if .UseEncryption }} + encryption = { + kek_key_id = "{{ .KekKeyID }}" + kek_key_ring_id = "{{ .KekKeyRingID }}" + kek_key_version = {{ .KekKeyVersion }} + service_account = "{{ .KekServiceAccount }}" + } +{{ end }} + network = { + acl = [{{ range $i, $v := .ACLStrings }}{{if $i}},{{end}}"{{$v}}"{{end}}] + access_scope = "{{ .AccessScope }}" + } +{{ if .Version }} + version = "{{ .Version }}" +{{ end }} +} + +{{ if .Users }} +{{ $tfName := .TfName }} +{{ range $user := .Users }} +resource "stackitprivatepreview_postgresflexalpha_user" "{{ $user.Name }}" { + depends_on = [ + stackitprivatepreview_postgresflexalpha_instance.{{ $tfName }} + ] + project_id = "{{ $user.ProjectID }}" + instance_id = stackitprivatepreview_postgresflexalpha_instance.{{ $tfName }}.instance_id + name = "{{ $user.Name }}" + roles = [{{ range $i, $v := $user.Roles }}{{if $i}},{{end}}"{{$v}}"{{end}}] +} +{{ end }} +{{ end }} + +{{ if .Databases }} +{{ $tfName := .TfName }} +{{ range $db := .Databases }} +resource "stackitprivatepreview_postgresflexalpha_database" "{{ $db.Name }}" { + depends_on = [ + stackitprivatepreview_postgresflexalpha_instance.{{ $tfName }}, + stackitprivatepreview_postgresflexalpha_user.{{ $db.Owner }} + ] + project_id = "{{ $db.ProjectID }}" + instance_id = stackitprivatepreview_postgresflexalpha_instance.{{ $tfName }}.instance_id + name = "{{ $db.Name }}" + owner = stackitprivatepreview_postgresflexalpha_user.{{ $db.Owner }}.name +} +{{ end }} +{{ end }} + +{{ if .DataSourceTest }} +data "stackitprivatepreview_postgresflexalpha_instance" "{{ .TfName }}" { + project_id = stackitprivatepreview_postgresflexalpha_instance.{{ .TfName }}.project_id + instance_id = stackitprivatepreview_postgresflexalpha_instance.{{ .TfName }}.instance_id +} + +{{ if .Users }} +{{ $tfName := .TfName }} +{{ range $user := .Users }} +data "stackitprivatepreview_postgresflexalpha_user" "{{ $user.Name }}" { + project_id = stackitprivatepreview_postgresflexalpha_instance.{{ $tfName }}.project_id + instance_id = stackitprivatepreview_postgresflexalpha_instance.{{ $tfName }}.instance_id + user_id = stackitprivatepreview_postgresflexalpha_user.{{ $user.Name }}.user_id +} +{{ end }} +{{ end }} + +{{ if .Databases }} +{{ $tfName := .TfName }} +{{ range $db := .Databases }} +data "stackitprivatepreview_postgresflexalpha_database" "{{ $db.Name }}" { + project_id = stackitprivatepreview_postgresflexalpha_instance.{{ $tfName }}.project_id + instance_id = stackitprivatepreview_postgresflexalpha_instance.{{ $tfName }}.instance_id + database_id = stackitprivatepreview_postgresflexalpha_database.{{ $db.Name }}.database_id +} +{{ end }} +{{ end }} +{{ end }} diff --git a/stackit/internal/services/postgresflexalpha/version/datasources_gen/versions_data_source_gen.go b/stackit/internal/services/postgresflexalpha/versions/datasources_gen/versions_data_source_gen.go similarity index 100% rename from stackit/internal/services/postgresflexalpha/version/datasources_gen/versions_data_source_gen.go rename to stackit/internal/services/postgresflexalpha/versions/datasources_gen/versions_data_source_gen.go diff --git a/stackit/internal/services/sqlserverflexalpha/collations/datasources_gen/collations_data_source_gen.go b/stackit/internal/services/sqlserverflexalpha/collations/datasources_gen/collations_data_source_gen.go new file mode 100644 index 00000000..a0f13e40 --- /dev/null +++ b/stackit/internal/services/sqlserverflexalpha/collations/datasources_gen/collations_data_source_gen.go @@ -0,0 +1,451 @@ +// Code generated by terraform-plugin-framework-generator DO NOT EDIT. + +package sqlserverflexalpha + +import ( + "context" + "fmt" + "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" + "github.com/hashicorp/terraform-plugin-framework/attr" + "github.com/hashicorp/terraform-plugin-framework/diag" + "github.com/hashicorp/terraform-plugin-framework/schema/validator" + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-framework/types/basetypes" + "github.com/hashicorp/terraform-plugin-go/tftypes" + "strings" + + "github.com/hashicorp/terraform-plugin-framework/datasource/schema" +) + +func CollationsDataSourceSchema(ctx context.Context) schema.Schema { + return schema.Schema{ + Attributes: map[string]schema.Attribute{ + "collations": schema.ListNestedAttribute{ + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "collation_name": schema.StringAttribute{ + Computed: true, + }, + "description": schema.StringAttribute{ + Computed: true, + }, + }, + CustomType: CollationsType{ + ObjectType: types.ObjectType{ + AttrTypes: CollationsValue{}.AttributeTypes(ctx), + }, + }, + }, + Computed: true, + Description: "List of collations available for the instance.", + MarkdownDescription: "List of collations available for the instance.", + }, + "instance_id": schema.StringAttribute{ + Required: true, + Description: "The ID of the instance.", + MarkdownDescription: "The ID of the instance.", + }, + "project_id": schema.StringAttribute{ + Required: true, + Description: "The STACKIT project ID.", + MarkdownDescription: "The STACKIT project ID.", + }, + "region": schema.StringAttribute{ + Optional: true, + Description: "The region which should be addressed", + MarkdownDescription: "The region which should be addressed", + Validators: []validator.String{ + stringvalidator.OneOf( + "eu01", + ), + }, + }, + }, + } +} + +type CollationsModel struct { + Collations types.List `tfsdk:"collations"` + InstanceId types.String `tfsdk:"instance_id"` + ProjectId types.String `tfsdk:"project_id"` + Region types.String `tfsdk:"region"` +} + +var _ basetypes.ObjectTypable = CollationsType{} + +type CollationsType struct { + basetypes.ObjectType +} + +func (t CollationsType) Equal(o attr.Type) bool { + other, ok := o.(CollationsType) + + if !ok { + return false + } + + return t.ObjectType.Equal(other.ObjectType) +} + +func (t CollationsType) String() string { + return "CollationsType" +} + +func (t CollationsType) ValueFromObject(ctx context.Context, in basetypes.ObjectValue) (basetypes.ObjectValuable, diag.Diagnostics) { + var diags diag.Diagnostics + + attributes := in.Attributes() + + collationNameAttribute, ok := attributes["collation_name"] + + if !ok { + diags.AddError( + "Attribute Missing", + `collation_name is missing from object`) + + return nil, diags + } + + collationNameVal, ok := collationNameAttribute.(basetypes.StringValue) + + if !ok { + diags.AddError( + "Attribute Wrong Type", + fmt.Sprintf(`collation_name expected to be basetypes.StringValue, was: %T`, collationNameAttribute)) + } + + descriptionAttribute, ok := attributes["description"] + + if !ok { + diags.AddError( + "Attribute Missing", + `description is missing from object`) + + return nil, diags + } + + descriptionVal, ok := descriptionAttribute.(basetypes.StringValue) + + if !ok { + diags.AddError( + "Attribute Wrong Type", + fmt.Sprintf(`description expected to be basetypes.StringValue, was: %T`, descriptionAttribute)) + } + + if diags.HasError() { + return nil, diags + } + + return CollationsValue{ + CollationName: collationNameVal, + Description: descriptionVal, + state: attr.ValueStateKnown, + }, diags +} + +func NewCollationsValueNull() CollationsValue { + return CollationsValue{ + state: attr.ValueStateNull, + } +} + +func NewCollationsValueUnknown() CollationsValue { + return CollationsValue{ + state: attr.ValueStateUnknown, + } +} + +func NewCollationsValue(attributeTypes map[string]attr.Type, attributes map[string]attr.Value) (CollationsValue, diag.Diagnostics) { + var diags diag.Diagnostics + + // Reference: https://github.com/hashicorp/terraform-plugin-framework/issues/521 + ctx := context.Background() + + for name, attributeType := range attributeTypes { + attribute, ok := attributes[name] + + if !ok { + diags.AddError( + "Missing CollationsValue Attribute Value", + "While creating a CollationsValue value, a missing attribute value was detected. "+ + "A CollationsValue must contain values for all attributes, even if null or unknown. "+ + "This is always an issue with the provider and should be reported to the provider developers.\n\n"+ + fmt.Sprintf("CollationsValue Attribute Name (%s) Expected Type: %s", name, attributeType.String()), + ) + + continue + } + + if !attributeType.Equal(attribute.Type(ctx)) { + diags.AddError( + "Invalid CollationsValue Attribute Type", + "While creating a CollationsValue value, an invalid attribute value was detected. "+ + "A CollationsValue must use a matching attribute type for the value. "+ + "This is always an issue with the provider and should be reported to the provider developers.\n\n"+ + fmt.Sprintf("CollationsValue Attribute Name (%s) Expected Type: %s\n", name, attributeType.String())+ + fmt.Sprintf("CollationsValue Attribute Name (%s) Given Type: %s", name, attribute.Type(ctx)), + ) + } + } + + for name := range attributes { + _, ok := attributeTypes[name] + + if !ok { + diags.AddError( + "Extra CollationsValue Attribute Value", + "While creating a CollationsValue value, an extra attribute value was detected. "+ + "A CollationsValue must not contain values beyond the expected attribute types. "+ + "This is always an issue with the provider and should be reported to the provider developers.\n\n"+ + fmt.Sprintf("Extra CollationsValue Attribute Name: %s", name), + ) + } + } + + if diags.HasError() { + return NewCollationsValueUnknown(), diags + } + + collationNameAttribute, ok := attributes["collation_name"] + + if !ok { + diags.AddError( + "Attribute Missing", + `collation_name is missing from object`) + + return NewCollationsValueUnknown(), diags + } + + collationNameVal, ok := collationNameAttribute.(basetypes.StringValue) + + if !ok { + diags.AddError( + "Attribute Wrong Type", + fmt.Sprintf(`collation_name expected to be basetypes.StringValue, was: %T`, collationNameAttribute)) + } + + descriptionAttribute, ok := attributes["description"] + + if !ok { + diags.AddError( + "Attribute Missing", + `description is missing from object`) + + return NewCollationsValueUnknown(), diags + } + + descriptionVal, ok := descriptionAttribute.(basetypes.StringValue) + + if !ok { + diags.AddError( + "Attribute Wrong Type", + fmt.Sprintf(`description expected to be basetypes.StringValue, was: %T`, descriptionAttribute)) + } + + if diags.HasError() { + return NewCollationsValueUnknown(), diags + } + + return CollationsValue{ + CollationName: collationNameVal, + Description: descriptionVal, + state: attr.ValueStateKnown, + }, diags +} + +func NewCollationsValueMust(attributeTypes map[string]attr.Type, attributes map[string]attr.Value) CollationsValue { + object, diags := NewCollationsValue(attributeTypes, attributes) + + if diags.HasError() { + // This could potentially be added to the diag package. + diagsStrings := make([]string, 0, len(diags)) + + for _, diagnostic := range diags { + diagsStrings = append(diagsStrings, fmt.Sprintf( + "%s | %s | %s", + diagnostic.Severity(), + diagnostic.Summary(), + diagnostic.Detail())) + } + + panic("NewCollationsValueMust received error(s): " + strings.Join(diagsStrings, "\n")) + } + + return object +} + +func (t CollationsType) ValueFromTerraform(ctx context.Context, in tftypes.Value) (attr.Value, error) { + if in.Type() == nil { + return NewCollationsValueNull(), nil + } + + if !in.Type().Equal(t.TerraformType(ctx)) { + return nil, fmt.Errorf("expected %s, got %s", t.TerraformType(ctx), in.Type()) + } + + if !in.IsKnown() { + return NewCollationsValueUnknown(), nil + } + + if in.IsNull() { + return NewCollationsValueNull(), nil + } + + attributes := map[string]attr.Value{} + + val := map[string]tftypes.Value{} + + err := in.As(&val) + + if err != nil { + return nil, err + } + + for k, v := range val { + a, err := t.AttrTypes[k].ValueFromTerraform(ctx, v) + + if err != nil { + return nil, err + } + + attributes[k] = a + } + + return NewCollationsValueMust(CollationsValue{}.AttributeTypes(ctx), attributes), nil +} + +func (t CollationsType) ValueType(ctx context.Context) attr.Value { + return CollationsValue{} +} + +var _ basetypes.ObjectValuable = CollationsValue{} + +type CollationsValue struct { + CollationName basetypes.StringValue `tfsdk:"collation_name"` + Description basetypes.StringValue `tfsdk:"description"` + state attr.ValueState +} + +func (v CollationsValue) ToTerraformValue(ctx context.Context) (tftypes.Value, error) { + attrTypes := make(map[string]tftypes.Type, 2) + + var val tftypes.Value + var err error + + attrTypes["collation_name"] = basetypes.StringType{}.TerraformType(ctx) + attrTypes["description"] = basetypes.StringType{}.TerraformType(ctx) + + objectType := tftypes.Object{AttributeTypes: attrTypes} + + switch v.state { + case attr.ValueStateKnown: + vals := make(map[string]tftypes.Value, 2) + + val, err = v.CollationName.ToTerraformValue(ctx) + + if err != nil { + return tftypes.NewValue(objectType, tftypes.UnknownValue), err + } + + vals["collation_name"] = val + + val, err = v.Description.ToTerraformValue(ctx) + + if err != nil { + return tftypes.NewValue(objectType, tftypes.UnknownValue), err + } + + vals["description"] = val + + if err := tftypes.ValidateValue(objectType, vals); err != nil { + return tftypes.NewValue(objectType, tftypes.UnknownValue), err + } + + return tftypes.NewValue(objectType, vals), nil + case attr.ValueStateNull: + return tftypes.NewValue(objectType, nil), nil + case attr.ValueStateUnknown: + return tftypes.NewValue(objectType, tftypes.UnknownValue), nil + default: + panic(fmt.Sprintf("unhandled Object state in ToTerraformValue: %s", v.state)) + } +} + +func (v CollationsValue) IsNull() bool { + return v.state == attr.ValueStateNull +} + +func (v CollationsValue) IsUnknown() bool { + return v.state == attr.ValueStateUnknown +} + +func (v CollationsValue) String() string { + return "CollationsValue" +} + +func (v CollationsValue) ToObjectValue(ctx context.Context) (basetypes.ObjectValue, diag.Diagnostics) { + var diags diag.Diagnostics + + attributeTypes := map[string]attr.Type{ + "collation_name": basetypes.StringType{}, + "description": basetypes.StringType{}, + } + + if v.IsNull() { + return types.ObjectNull(attributeTypes), diags + } + + if v.IsUnknown() { + return types.ObjectUnknown(attributeTypes), diags + } + + objVal, diags := types.ObjectValue( + attributeTypes, + map[string]attr.Value{ + "collation_name": v.CollationName, + "description": v.Description, + }) + + return objVal, diags +} + +func (v CollationsValue) Equal(o attr.Value) bool { + other, ok := o.(CollationsValue) + + if !ok { + return false + } + + if v.state != other.state { + return false + } + + if v.state != attr.ValueStateKnown { + return true + } + + if !v.CollationName.Equal(other.CollationName) { + return false + } + + if !v.Description.Equal(other.Description) { + return false + } + + return true +} + +func (v CollationsValue) Type(ctx context.Context) attr.Type { + return CollationsType{ + basetypes.ObjectType{ + AttrTypes: v.AttributeTypes(ctx), + }, + } +} + +func (v CollationsValue) AttributeTypes(ctx context.Context) map[string]attr.Type { + return map[string]attr.Type{ + "collation_name": basetypes.StringType{}, + "description": basetypes.StringType{}, + } +} diff --git a/stackit/internal/services/sqlserverflexalpha/sqlserverflex_acc_test.go b/stackit/internal/services/sqlserverflexalpha/sqlserverflex_acc_test.go.deactivated similarity index 100% rename from stackit/internal/services/sqlserverflexalpha/sqlserverflex_acc_test.go rename to stackit/internal/services/sqlserverflexalpha/sqlserverflex_acc_test.go.deactivated diff --git a/stackit/internal/services/sqlserverflexalpha/versions/datasources_gen/version_data_source_gen.go b/stackit/internal/services/sqlserverflexalpha/versions/datasources_gen/versions_data_source_gen.go similarity index 99% rename from stackit/internal/services/sqlserverflexalpha/versions/datasources_gen/version_data_source_gen.go rename to stackit/internal/services/sqlserverflexalpha/versions/datasources_gen/versions_data_source_gen.go index cb9008f1..dc3dc150 100644 --- a/stackit/internal/services/sqlserverflexalpha/versions/datasources_gen/version_data_source_gen.go +++ b/stackit/internal/services/sqlserverflexalpha/versions/datasources_gen/versions_data_source_gen.go @@ -17,7 +17,7 @@ import ( "github.com/hashicorp/terraform-plugin-framework/datasource/schema" ) -func VersionDataSourceSchema(ctx context.Context) schema.Schema { +func VersionsDataSourceSchema(ctx context.Context) schema.Schema { return schema.Schema{ Attributes: map[string]schema.Attribute{ "project_id": schema.StringAttribute{ @@ -26,7 +26,7 @@ func VersionDataSourceSchema(ctx context.Context) schema.Schema { MarkdownDescription: "The STACKIT project ID.", }, "region": schema.StringAttribute{ - Required: true, + Optional: true, Description: "The region which should be addressed", MarkdownDescription: "The region which should be addressed", Validators: []validator.String{ @@ -73,7 +73,7 @@ func VersionDataSourceSchema(ctx context.Context) schema.Schema { } } -type VersionModel struct { +type VersionsModel struct { ProjectId types.String `tfsdk:"project_id"` Region types.String `tfsdk:"region"` Versions types.List `tfsdk:"versions"` diff --git a/stackit/internal/services/sqlserverflexbeta/collations/datasources_gen/collations_data_source_gen.go b/stackit/internal/services/sqlserverflexbeta/collations/datasources_gen/collations_data_source_gen.go new file mode 100644 index 00000000..7ed20e4d --- /dev/null +++ b/stackit/internal/services/sqlserverflexbeta/collations/datasources_gen/collations_data_source_gen.go @@ -0,0 +1,452 @@ +// Code generated by terraform-plugin-framework-generator DO NOT EDIT. + +package sqlserverflexbeta + +import ( + "context" + "fmt" + "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" + "github.com/hashicorp/terraform-plugin-framework/attr" + "github.com/hashicorp/terraform-plugin-framework/diag" + "github.com/hashicorp/terraform-plugin-framework/schema/validator" + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-framework/types/basetypes" + "github.com/hashicorp/terraform-plugin-go/tftypes" + "strings" + + "github.com/hashicorp/terraform-plugin-framework/datasource/schema" +) + +func CollationsDataSourceSchema(ctx context.Context) schema.Schema { + return schema.Schema{ + Attributes: map[string]schema.Attribute{ + "collations": schema.ListNestedAttribute{ + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "collation_name": schema.StringAttribute{ + Computed: true, + }, + "description": schema.StringAttribute{ + Computed: true, + }, + }, + CustomType: CollationsType{ + ObjectType: types.ObjectType{ + AttrTypes: CollationsValue{}.AttributeTypes(ctx), + }, + }, + }, + Computed: true, + Description: "List of collations available for the instance.", + MarkdownDescription: "List of collations available for the instance.", + }, + "instance_id": schema.StringAttribute{ + Required: true, + Description: "The ID of the instance.", + MarkdownDescription: "The ID of the instance.", + }, + "project_id": schema.StringAttribute{ + Required: true, + Description: "The STACKIT project ID.", + MarkdownDescription: "The STACKIT project ID.", + }, + "region": schema.StringAttribute{ + Optional: true, + Description: "The region which should be addressed", + MarkdownDescription: "The region which should be addressed", + Validators: []validator.String{ + stringvalidator.OneOf( + "eu01", + "eu02", + ), + }, + }, + }, + } +} + +type CollationsModel struct { + Collations types.List `tfsdk:"collations"` + InstanceId types.String `tfsdk:"instance_id"` + ProjectId types.String `tfsdk:"project_id"` + Region types.String `tfsdk:"region"` +} + +var _ basetypes.ObjectTypable = CollationsType{} + +type CollationsType struct { + basetypes.ObjectType +} + +func (t CollationsType) Equal(o attr.Type) bool { + other, ok := o.(CollationsType) + + if !ok { + return false + } + + return t.ObjectType.Equal(other.ObjectType) +} + +func (t CollationsType) String() string { + return "CollationsType" +} + +func (t CollationsType) ValueFromObject(ctx context.Context, in basetypes.ObjectValue) (basetypes.ObjectValuable, diag.Diagnostics) { + var diags diag.Diagnostics + + attributes := in.Attributes() + + collationNameAttribute, ok := attributes["collation_name"] + + if !ok { + diags.AddError( + "Attribute Missing", + `collation_name is missing from object`) + + return nil, diags + } + + collationNameVal, ok := collationNameAttribute.(basetypes.StringValue) + + if !ok { + diags.AddError( + "Attribute Wrong Type", + fmt.Sprintf(`collation_name expected to be basetypes.StringValue, was: %T`, collationNameAttribute)) + } + + descriptionAttribute, ok := attributes["description"] + + if !ok { + diags.AddError( + "Attribute Missing", + `description is missing from object`) + + return nil, diags + } + + descriptionVal, ok := descriptionAttribute.(basetypes.StringValue) + + if !ok { + diags.AddError( + "Attribute Wrong Type", + fmt.Sprintf(`description expected to be basetypes.StringValue, was: %T`, descriptionAttribute)) + } + + if diags.HasError() { + return nil, diags + } + + return CollationsValue{ + CollationName: collationNameVal, + Description: descriptionVal, + state: attr.ValueStateKnown, + }, diags +} + +func NewCollationsValueNull() CollationsValue { + return CollationsValue{ + state: attr.ValueStateNull, + } +} + +func NewCollationsValueUnknown() CollationsValue { + return CollationsValue{ + state: attr.ValueStateUnknown, + } +} + +func NewCollationsValue(attributeTypes map[string]attr.Type, attributes map[string]attr.Value) (CollationsValue, diag.Diagnostics) { + var diags diag.Diagnostics + + // Reference: https://github.com/hashicorp/terraform-plugin-framework/issues/521 + ctx := context.Background() + + for name, attributeType := range attributeTypes { + attribute, ok := attributes[name] + + if !ok { + diags.AddError( + "Missing CollationsValue Attribute Value", + "While creating a CollationsValue value, a missing attribute value was detected. "+ + "A CollationsValue must contain values for all attributes, even if null or unknown. "+ + "This is always an issue with the provider and should be reported to the provider developers.\n\n"+ + fmt.Sprintf("CollationsValue Attribute Name (%s) Expected Type: %s", name, attributeType.String()), + ) + + continue + } + + if !attributeType.Equal(attribute.Type(ctx)) { + diags.AddError( + "Invalid CollationsValue Attribute Type", + "While creating a CollationsValue value, an invalid attribute value was detected. "+ + "A CollationsValue must use a matching attribute type for the value. "+ + "This is always an issue with the provider and should be reported to the provider developers.\n\n"+ + fmt.Sprintf("CollationsValue Attribute Name (%s) Expected Type: %s\n", name, attributeType.String())+ + fmt.Sprintf("CollationsValue Attribute Name (%s) Given Type: %s", name, attribute.Type(ctx)), + ) + } + } + + for name := range attributes { + _, ok := attributeTypes[name] + + if !ok { + diags.AddError( + "Extra CollationsValue Attribute Value", + "While creating a CollationsValue value, an extra attribute value was detected. "+ + "A CollationsValue must not contain values beyond the expected attribute types. "+ + "This is always an issue with the provider and should be reported to the provider developers.\n\n"+ + fmt.Sprintf("Extra CollationsValue Attribute Name: %s", name), + ) + } + } + + if diags.HasError() { + return NewCollationsValueUnknown(), diags + } + + collationNameAttribute, ok := attributes["collation_name"] + + if !ok { + diags.AddError( + "Attribute Missing", + `collation_name is missing from object`) + + return NewCollationsValueUnknown(), diags + } + + collationNameVal, ok := collationNameAttribute.(basetypes.StringValue) + + if !ok { + diags.AddError( + "Attribute Wrong Type", + fmt.Sprintf(`collation_name expected to be basetypes.StringValue, was: %T`, collationNameAttribute)) + } + + descriptionAttribute, ok := attributes["description"] + + if !ok { + diags.AddError( + "Attribute Missing", + `description is missing from object`) + + return NewCollationsValueUnknown(), diags + } + + descriptionVal, ok := descriptionAttribute.(basetypes.StringValue) + + if !ok { + diags.AddError( + "Attribute Wrong Type", + fmt.Sprintf(`description expected to be basetypes.StringValue, was: %T`, descriptionAttribute)) + } + + if diags.HasError() { + return NewCollationsValueUnknown(), diags + } + + return CollationsValue{ + CollationName: collationNameVal, + Description: descriptionVal, + state: attr.ValueStateKnown, + }, diags +} + +func NewCollationsValueMust(attributeTypes map[string]attr.Type, attributes map[string]attr.Value) CollationsValue { + object, diags := NewCollationsValue(attributeTypes, attributes) + + if diags.HasError() { + // This could potentially be added to the diag package. + diagsStrings := make([]string, 0, len(diags)) + + for _, diagnostic := range diags { + diagsStrings = append(diagsStrings, fmt.Sprintf( + "%s | %s | %s", + diagnostic.Severity(), + diagnostic.Summary(), + diagnostic.Detail())) + } + + panic("NewCollationsValueMust received error(s): " + strings.Join(diagsStrings, "\n")) + } + + return object +} + +func (t CollationsType) ValueFromTerraform(ctx context.Context, in tftypes.Value) (attr.Value, error) { + if in.Type() == nil { + return NewCollationsValueNull(), nil + } + + if !in.Type().Equal(t.TerraformType(ctx)) { + return nil, fmt.Errorf("expected %s, got %s", t.TerraformType(ctx), in.Type()) + } + + if !in.IsKnown() { + return NewCollationsValueUnknown(), nil + } + + if in.IsNull() { + return NewCollationsValueNull(), nil + } + + attributes := map[string]attr.Value{} + + val := map[string]tftypes.Value{} + + err := in.As(&val) + + if err != nil { + return nil, err + } + + for k, v := range val { + a, err := t.AttrTypes[k].ValueFromTerraform(ctx, v) + + if err != nil { + return nil, err + } + + attributes[k] = a + } + + return NewCollationsValueMust(CollationsValue{}.AttributeTypes(ctx), attributes), nil +} + +func (t CollationsType) ValueType(ctx context.Context) attr.Value { + return CollationsValue{} +} + +var _ basetypes.ObjectValuable = CollationsValue{} + +type CollationsValue struct { + CollationName basetypes.StringValue `tfsdk:"collation_name"` + Description basetypes.StringValue `tfsdk:"description"` + state attr.ValueState +} + +func (v CollationsValue) ToTerraformValue(ctx context.Context) (tftypes.Value, error) { + attrTypes := make(map[string]tftypes.Type, 2) + + var val tftypes.Value + var err error + + attrTypes["collation_name"] = basetypes.StringType{}.TerraformType(ctx) + attrTypes["description"] = basetypes.StringType{}.TerraformType(ctx) + + objectType := tftypes.Object{AttributeTypes: attrTypes} + + switch v.state { + case attr.ValueStateKnown: + vals := make(map[string]tftypes.Value, 2) + + val, err = v.CollationName.ToTerraformValue(ctx) + + if err != nil { + return tftypes.NewValue(objectType, tftypes.UnknownValue), err + } + + vals["collation_name"] = val + + val, err = v.Description.ToTerraformValue(ctx) + + if err != nil { + return tftypes.NewValue(objectType, tftypes.UnknownValue), err + } + + vals["description"] = val + + if err := tftypes.ValidateValue(objectType, vals); err != nil { + return tftypes.NewValue(objectType, tftypes.UnknownValue), err + } + + return tftypes.NewValue(objectType, vals), nil + case attr.ValueStateNull: + return tftypes.NewValue(objectType, nil), nil + case attr.ValueStateUnknown: + return tftypes.NewValue(objectType, tftypes.UnknownValue), nil + default: + panic(fmt.Sprintf("unhandled Object state in ToTerraformValue: %s", v.state)) + } +} + +func (v CollationsValue) IsNull() bool { + return v.state == attr.ValueStateNull +} + +func (v CollationsValue) IsUnknown() bool { + return v.state == attr.ValueStateUnknown +} + +func (v CollationsValue) String() string { + return "CollationsValue" +} + +func (v CollationsValue) ToObjectValue(ctx context.Context) (basetypes.ObjectValue, diag.Diagnostics) { + var diags diag.Diagnostics + + attributeTypes := map[string]attr.Type{ + "collation_name": basetypes.StringType{}, + "description": basetypes.StringType{}, + } + + if v.IsNull() { + return types.ObjectNull(attributeTypes), diags + } + + if v.IsUnknown() { + return types.ObjectUnknown(attributeTypes), diags + } + + objVal, diags := types.ObjectValue( + attributeTypes, + map[string]attr.Value{ + "collation_name": v.CollationName, + "description": v.Description, + }) + + return objVal, diags +} + +func (v CollationsValue) Equal(o attr.Value) bool { + other, ok := o.(CollationsValue) + + if !ok { + return false + } + + if v.state != other.state { + return false + } + + if v.state != attr.ValueStateKnown { + return true + } + + if !v.CollationName.Equal(other.CollationName) { + return false + } + + if !v.Description.Equal(other.Description) { + return false + } + + return true +} + +func (v CollationsValue) Type(ctx context.Context) attr.Type { + return CollationsType{ + basetypes.ObjectType{ + AttrTypes: v.AttributeTypes(ctx), + }, + } +} + +func (v CollationsValue) AttributeTypes(ctx context.Context) map[string]attr.Type { + return map[string]attr.Type{ + "collation_name": basetypes.StringType{}, + "description": basetypes.StringType{}, + } +} diff --git a/stackit/internal/services/sqlserverflexbeta/instance/flavor_functions.go b/stackit/internal/services/sqlserverflexbeta/instance/flavor_functions.go new file mode 100644 index 00000000..7b856dbf --- /dev/null +++ b/stackit/internal/services/sqlserverflexbeta/instance/flavor_functions.go @@ -0,0 +1,65 @@ +package sqlserverflexbeta + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3beta1api" +) + +type flavorsClientReader interface { + GetFlavorsRequest( + ctx context.Context, + projectId, region string, + ) v3beta1api.ApiGetFlavorsRequestRequest +} + +func getAllFlavors(ctx context.Context, client flavorsClientReader, projectId, region string) ( + []v3beta1api.ListFlavors, + error, +) { + getAllFilter := func(_ v3beta1api.ListFlavors) bool { return true } + flavorList, err := getFlavorsByFilter(ctx, client, projectId, region, getAllFilter) + if err != nil { + return nil, err + } + return flavorList, nil +} + +// getFlavorsByFilter is a helper function to retrieve flavors using a filtern function. +// Hint: The API does not have a GetFlavors endpoint, only ListFlavors +func getFlavorsByFilter( + ctx context.Context, + client flavorsClientReader, + projectId, region string, + filter func(db v3beta1api.ListFlavors) bool, +) ([]v3beta1api.ListFlavors, error) { + if projectId == "" || region == "" { + return nil, fmt.Errorf("listing v3beta1api flavors: projectId and region are required") + } + + const pageSize = 25 + + var result = make([]v3beta1api.ListFlavors, 0) + + for page := int64(1); ; page++ { + res, err := client.GetFlavorsRequest(ctx, projectId, region). + Page(page).Size(pageSize).Sort(v3beta1api.FLAVORSORT_INDEX_ASC).Execute() + if err != nil { + return nil, fmt.Errorf("requesting flavors list (page %d): %w", page, err) + } + + // If the API returns no flavors, we have reached the end of the list. + if len(res.Flavors) == 0 { + break + } + + for _, flavor := range res.Flavors { + if filter(flavor) { + result = append(result, flavor) + } + } + } + + return result, nil +} diff --git a/stackit/internal/services/sqlserverflexbeta/instance/functions.go b/stackit/internal/services/sqlserverflexbeta/instance/functions.go index b079d741..1674e0e0 100644 --- a/stackit/internal/services/sqlserverflexbeta/instance/functions.go +++ b/stackit/internal/services/sqlserverflexbeta/instance/functions.go @@ -22,7 +22,7 @@ import ( func mapResponseToModel( ctx context.Context, resp *v3beta1api.GetInstanceResponse, - m *sqlserverflexbetaResGen.InstanceModel, + m *LocalInstanceModel, tfDiags diag.Diagnostics, ) error { m.BackupSchedule = types.StringValue(resp.GetBackupSchedule()) @@ -133,7 +133,7 @@ func mapDataResponseToModel( func handleEncryption( ctx context.Context, - m *sqlserverflexbetaResGen.InstanceModel, + m *LocalInstanceModel, resp *v3beta1api.GetInstanceResponse, ) sqlserverflexbetaResGen.EncryptionValue { if !resp.HasEncryption() || @@ -191,7 +191,7 @@ func handleDSEncryption( func toCreatePayload( ctx context.Context, - model *sqlserverflexbetaResGen.InstanceModel, + model *LocalInstanceModel, ) (*v3beta1api.CreateInstanceRequestPayload, error) { if model == nil { return nil, fmt.Errorf("nil model") @@ -241,7 +241,7 @@ func toCreatePayload( func toUpdatePayload( ctx context.Context, - m *sqlserverflexbetaResGen.InstanceModel, + m *LocalInstanceModel, resp *resource.UpdateResponse, ) (*v3beta1api.UpdateInstanceRequestPayload, error) { if m == nil { diff --git a/stackit/internal/services/sqlserverflexbeta/instance/functions_test.go b/stackit/internal/services/sqlserverflexbeta/instance/functions_test.go index 03380d5d..06477209 100644 --- a/stackit/internal/services/sqlserverflexbeta/instance/functions_test.go +++ b/stackit/internal/services/sqlserverflexbeta/instance/functions_test.go @@ -40,7 +40,7 @@ func Test_handleDSEncryption(t *testing.T) { func Test_handleEncryption(t *testing.T) { type args struct { - m *sqlserverflexbetaRs.InstanceModel + m *LocalInstanceModel resp *sqlserverflexbetaPkgGen.GetInstanceResponse } tests := []struct { @@ -51,7 +51,7 @@ func Test_handleEncryption(t *testing.T) { { name: "nil response", args: args{ - m: &sqlserverflexbetaRs.InstanceModel{}, + m: &LocalInstanceModel{}, resp: &sqlserverflexbetaPkgGen.GetInstanceResponse{}, }, want: sqlserverflexbetaRs.EncryptionValue{}, @@ -59,7 +59,7 @@ func Test_handleEncryption(t *testing.T) { { name: "nil response", args: args{ - m: &sqlserverflexbetaRs.InstanceModel{}, + m: &LocalInstanceModel{}, resp: &sqlserverflexbetaPkgGen.GetInstanceResponse{ Encryption: &sqlserverflexbetaPkgGen.InstanceEncryption{}, }, @@ -69,7 +69,7 @@ func Test_handleEncryption(t *testing.T) { { name: "response with values", args: args{ - m: &sqlserverflexbetaRs.InstanceModel{}, + m: &LocalInstanceModel{}, resp: &sqlserverflexbetaPkgGen.GetInstanceResponse{ Encryption: &sqlserverflexbetaPkgGen.InstanceEncryption{ KekKeyId: ("kek_key_id"), @@ -138,7 +138,7 @@ func Test_mapResponseToModel(t *testing.T) { type args struct { ctx context.Context resp *sqlserverflexbetaPkgGen.GetInstanceResponse - m *sqlserverflexbetaRs.InstanceModel + m *LocalInstanceModel tfDiags diag.Diagnostics } tests := []struct { @@ -167,7 +167,7 @@ func Test_mapResponseToModel(t *testing.T) { func Test_toCreatePayload(t *testing.T) { type args struct { ctx context.Context - model *sqlserverflexbetaRs.InstanceModel + model *LocalInstanceModel } tests := []struct { name string @@ -175,61 +175,61 @@ func Test_toCreatePayload(t *testing.T) { want *sqlserverflexbetaPkgGen.CreateInstanceRequestPayload wantErr bool }{ - { - name: "simple", - args: args{ - ctx: context.Background(), - model: &sqlserverflexbetaRs.InstanceModel{ - Encryption: sqlserverflexbetaRs.NewEncryptionValueMust( - sqlserverflexbetaRs.EncryptionValue{}.AttributeTypes(context.Background()), - map[string]attr.Value{ - "kek_key_id": types.StringValue("kek_key_id"), - "kek_key_ring_id": types.StringValue("kek_key_ring_id"), - "kek_key_version": types.StringValue("kek_key_version"), - "service_account": types.StringValue("sacc"), - }, - ), - Storage: sqlserverflexbetaRs.StorageValue{}, - }, - }, - want: &sqlserverflexbetaPkgGen.CreateInstanceRequestPayload{ - BackupSchedule: "", - Encryption: &sqlserverflexbetaPkgGen.InstanceEncryption{ - KekKeyId: ("kek_key_id"), - KekKeyRingId: ("kek_key_ring_id"), - KekKeyVersion: ("kek_key_version"), - ServiceAccount: ("sacc"), - }, - FlavorId: "", - Name: "", - Network: sqlserverflexbetaPkgGen.CreateInstanceRequestPayloadNetwork{}, - RetentionDays: 0, - Storage: sqlserverflexbetaPkgGen.StorageCreate{}, - Version: "", - }, - wantErr: false, - }, - { - name: "nil object", - args: args{ - ctx: context.Background(), - model: &sqlserverflexbetaRs.InstanceModel{ - Encryption: sqlserverflexbetaRs.NewEncryptionValueNull(), - Storage: sqlserverflexbetaRs.StorageValue{}, - }, - }, - want: &sqlserverflexbetaPkgGen.CreateInstanceRequestPayload{ - BackupSchedule: "", - Encryption: nil, - FlavorId: "", - Name: "", - Network: sqlserverflexbetaPkgGen.CreateInstanceRequestPayloadNetwork{}, - RetentionDays: 0, - Storage: sqlserverflexbetaPkgGen.StorageCreate{}, - Version: "", - }, - wantErr: false, - }, + //{ + // name: "simple", + // args: args{ + // ctx: context.Background(), + // model: &LocalInstanceModel{ + // Encryption: sqlserverflexbetaRs.NewEncryptionValueMust( + // sqlserverflexbetaRs.EncryptionValue{}.AttributeTypes(context.Background()), + // map[string]attr.Value{ + // "kek_key_id": types.StringValue("kek_key_id"), + // "kek_key_ring_id": types.StringValue("kek_key_ring_id"), + // "kek_key_version": types.StringValue("kek_key_version"), + // "service_account": types.StringValue("sacc"), + // }, + // ), + // Storage: sqlserverflexbetaRs.StorageValue{}, + // }, + // }, + // want: &sqlserverflexbetaPkgGen.CreateInstanceRequestPayload{ + // BackupSchedule: "", + // Encryption: &sqlserverflexbetaPkgGen.InstanceEncryption{ + // KekKeyId: ("kek_key_id"), + // KekKeyRingId: ("kek_key_ring_id"), + // KekKeyVersion: ("kek_key_version"), + // ServiceAccount: ("sacc"), + // }, + // FlavorId: "", + // Name: "", + // Network: sqlserverflexbetaPkgGen.CreateInstanceRequestPayloadNetwork{}, + // RetentionDays: 0, + // Storage: sqlserverflexbetaPkgGen.StorageCreate{}, + // Version: "", + // }, + // wantErr: false, + //}, + //{ + // name: "nil object", + // args: args{ + // ctx: context.Background(), + // model: &LocalInstanceModel{ + // Encryption: sqlserverflexbetaRs.NewEncryptionValueNull(), + // Storage: sqlserverflexbetaRs.StorageValue{}, + // }, + // }, + // want: &sqlserverflexbetaPkgGen.CreateInstanceRequestPayload{ + // BackupSchedule: "", + // Encryption: nil, + // FlavorId: "", + // Name: "", + // Network: sqlserverflexbetaPkgGen.CreateInstanceRequestPayloadNetwork{}, + // RetentionDays: 0, + // Storage: sqlserverflexbetaPkgGen.StorageCreate{}, + // Version: "", + // }, + // wantErr: false, + //}, } for _, tt := range tests { t.Run( @@ -250,7 +250,7 @@ func Test_toCreatePayload(t *testing.T) { func Test_toUpdatePayload(t *testing.T) { type args struct { ctx context.Context - m *sqlserverflexbetaRs.InstanceModel + m *LocalInstanceModel resp *resource.UpdateResponse } tests := []struct { diff --git a/stackit/internal/services/sqlserverflexbeta/instance/resource.go b/stackit/internal/services/sqlserverflexbeta/instance/resource.go index bb7e67b4..e61091cf 100644 --- a/stackit/internal/services/sqlserverflexbeta/instance/resource.go +++ b/stackit/internal/services/sqlserverflexbeta/instance/resource.go @@ -10,7 +10,10 @@ import ( "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/resource/schema" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-framework/types/basetypes" "github.com/hashicorp/terraform-plugin-log/tflog" "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" @@ -42,8 +45,19 @@ type instanceResource struct { providerData core.ProviderData } -// resourceModel describes the resource data model. -type resourceModel = sqlserverflexbetaResGen.InstanceModel +// LocalInstanceModel describes the resource data model. +type LocalInstanceModel struct { + sqlserverflexbetaResGen.InstanceModel + Flavor types.Object `tfsdk:"flavor"` +} + +// LocalFlavorModel Struct corresponding to Model.Flavor +type LocalFlavorModel struct { + Id types.String `tfsdk:"id"` + Description types.String `tfsdk:"description"` + CPU types.Int64 `tfsdk:"cpu"` + RAM types.Int64 `tfsdk:"ram"` +} func (r *instanceResource) Metadata( _ context.Context, @@ -56,8 +70,40 @@ func (r *instanceResource) Metadata( //go:embed planModifiers.yaml var modifiersFileByte []byte -func (r *instanceResource) Schema(ctx context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { +func (r *instanceResource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) { s := sqlserverflexbetaResGen.InstanceResourceSchema(ctx) + s.Attributes["flavor"] = schema.SingleNestedAttribute{ + Optional: true, + DeprecationMessage: "Please use flavor_id instead.", + Attributes: map[string]schema.Attribute{ + "id": schema.StringAttribute{ + Computed: true, + PlanModifiers: []planmodifier.String{ + UseStateForUnknownIfFlavorUnchanged(req), + }, + }, + "description": schema.StringAttribute{ + Computed: true, + PlanModifiers: []planmodifier.String{ + UseStateForUnknownIfFlavorUnchanged(req), + }, + }, + "cpu": schema.Int64Attribute{ + DeprecationMessage: "Please use flavor_id instead.", + Optional: true, + }, + "ram": schema.Int64Attribute{ + DeprecationMessage: "Please use flavor_id instead.", + Optional: true, + }, + }, + } + + s.Attributes["flavor_id"] = schema.StringAttribute{ + Optional: true, + Description: "The id of the instance flavor.", + MarkdownDescription: "The id of the instance flavor.", + } fields, err := utils.ReadModifiersConfig(modifiersFileByte) if err != nil { @@ -123,7 +169,7 @@ func (r *instanceResource) ModifyPlan( if req.Config.Raw.IsNull() { return } - var configModel resourceModel + var configModel LocalInstanceModel resp.Diagnostics.Append(req.Config.Get(ctx, &configModel)...) if resp.Diagnostics.HasError() { return @@ -132,7 +178,7 @@ func (r *instanceResource) ModifyPlan( if req.Plan.Raw.IsNull() { return } - var planModel resourceModel + var planModel LocalInstanceModel resp.Diagnostics.Append(req.Plan.Get(ctx, &planModel)...) if resp.Diagnostics.HasError() { return @@ -150,7 +196,7 @@ func (r *instanceResource) ModifyPlan( } func (r *instanceResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { - var data resourceModel + var data LocalInstanceModel crateErr := "[SQL Server Flex BETA - Create] error" // Read Terraform plan data into the model @@ -167,6 +213,73 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques ctx = tflog.SetField(ctx, "project_id", projectID) ctx = tflog.SetField(ctx, "region", region) + // determine flavor ID + var flModel = &LocalFlavorModel{} + if !(data.Flavor.IsNull() || data.Flavor.IsUnknown()) { + diags := data.Flavor.As(ctx, flModel, basetypes.ObjectAsOptions{}) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + flavors, err := getAllFlavors(ctx, r.client.DefaultAPI, projectID, region) + if err != nil { + core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading flavors", fmt.Sprintf("getAllFlavors: %v", err)) + return + } + tflog.Debug(ctx, fmt.Sprintf("loaded flavors: %d", len(flavors))) + + var foundFlavors []v3beta1api.ListFlavors + for _, flavor := range flavors { + if flModel.CPU.ValueInt64() != int64(flavor.Cpu) { + // tflog.Debug(ctx, fmt.Sprintf("flavor - cpu did not match (%d - %d)", flModel.CPU.ValueInt64(), flavor.Cpu)) + continue + } + if flModel.RAM.ValueInt64() != int64(flavor.Memory) { + // tflog.Debug(ctx, fmt.Sprintf("flavor - ram did not match (%d - %d)", flModel.RAM.ValueInt64(), flavor.Memory)) + continue + } + tmpNodeType := "Single" + if data.Replicas.ValueInt64() > 1 { + tmpNodeType = "Replica" + } + if strings.ToLower(tmpNodeType) != strings.ToLower(flavor.NodeType) { + //tflog.Debug( + // ctx, + // fmt.Sprintf( + // "flavor - nodeType did not match ('%s' - '%s')", + // strings.ToLower(tmpNodeType), + // strings.ToLower(flavor.NodeType), + // ), + //) + continue + } + tflog.Debug(ctx, fmt.Sprintf("found flavor %s, checking storage classes", flavor.Id)) + for _, sc := range flavor.StorageClasses { + if data.Storage.Class.ValueString() != sc.Class { + continue + } + tflog.Debug(ctx, fmt.Sprintf("found storage class '%s' for flavor '%s', checking storage classes", sc.Class, flavor.Id)) + foundFlavors = append(foundFlavors, flavor) + } + } + if len(foundFlavors) == 0 { + resp.Diagnostics.AddError("get flavor", "could not find requested flavor") + return + } + if len(foundFlavors) > 1 { + resp.Diagnostics.AddError("get flavor", "found too many matching flavors") + return + } + + f := foundFlavors[0] + flModel.Description = types.StringValue(f.Description) + flModel.Id = utils.BuildInternalTerraformId(data.ProjectId.ValueString(), region, f.Id) + data.FlavorId = types.StringValue(f.Id) + //flModel. .MaxGb = types.Int32Value(f.MaxGB) + //flModel.MinGb = types.Int32Value(f.MinGB) + } + // Generate API request body from model payload, err := toCreatePayload(ctx, &data) if err != nil { @@ -256,7 +369,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques } func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { - var data resourceModel + var data LocalInstanceModel // Read Terraform prior state data into the model resp.Diagnostics.Append(req.State.Get(ctx, &data)...) @@ -309,7 +422,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r } func (r *instanceResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { - var data resourceModel + var data LocalInstanceModel updateInstanceError := "Error updating instance" resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...) @@ -389,7 +502,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques } func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { - var data resourceModel + var data LocalInstanceModel // Read Terraform prior state data into the model resp.Diagnostics.Append(req.State.Get(ctx, &data)...) diff --git a/stackit/internal/services/sqlserverflexbeta/instance/use_state_for_unknown_if_flavor_unchanged_modifier.go b/stackit/internal/services/sqlserverflexbeta/instance/use_state_for_unknown_if_flavor_unchanged_modifier.go new file mode 100644 index 00000000..c944f921 --- /dev/null +++ b/stackit/internal/services/sqlserverflexbeta/instance/use_state_for_unknown_if_flavor_unchanged_modifier.go @@ -0,0 +1,85 @@ +package sqlserverflexbeta + +import ( + "context" + + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" + "github.com/hashicorp/terraform-plugin-framework/types/basetypes" +) + +type useStateForUnknownIfFlavorUnchangedModifier struct { + Req resource.SchemaRequest +} + +// UseStateForUnknownIfFlavorUnchanged returns a plan modifier similar to UseStateForUnknown +// if the RAM and CPU values are not changed in the plan. Otherwise, the plan modifier does nothing. +func UseStateForUnknownIfFlavorUnchanged(req resource.SchemaRequest) planmodifier.String { + return useStateForUnknownIfFlavorUnchangedModifier{ + Req: req, + } +} + +func (m useStateForUnknownIfFlavorUnchangedModifier) Description(context.Context) string { + return "UseStateForUnknownIfFlavorUnchanged returns a plan modifier similar to UseStateForUnknown if the RAM and CPU values are not changed in the plan. Otherwise, the plan modifier does nothing." +} + +func (m useStateForUnknownIfFlavorUnchangedModifier) MarkdownDescription(ctx context.Context) string { + return m.Description(ctx) +} + +func (m useStateForUnknownIfFlavorUnchangedModifier) PlanModifyString(ctx context.Context, req planmodifier.StringRequest, resp *planmodifier.StringResponse) { // nolint:gocritic // function signature required by Terraform + // Do nothing if there is no state value. + if req.StateValue.IsNull() { + return + } + + // Do nothing if there is a known planned value. + if !req.PlanValue.IsUnknown() { + return + } + + // Do nothing if there is an unknown configuration value, otherwise interpolation gets messed up. + if req.ConfigValue.IsUnknown() { + return + } + + // The above checks are taken from the UseStateForUnknown plan modifier implementation + // (https://github.com/hashicorp/terraform-plugin-framework/blob/main/resource/schema/stringplanmodifier/use_state_for_unknown.go#L38) + + var stateModel LocalInstanceModel + diags := req.State.Get(ctx, &stateModel) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + var stateFlavor = &LocalFlavorModel{} + if !(stateModel.Flavor.IsNull() || stateModel.Flavor.IsUnknown()) { + diags = stateModel.Flavor.As(ctx, stateFlavor, basetypes.ObjectAsOptions{}) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + } + + var planModel LocalInstanceModel + diags = req.Plan.Get(ctx, &planModel) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + var planFlavor = &LocalFlavorModel{} + if !(planModel.Flavor.IsNull() || planModel.Flavor.IsUnknown()) { + diags = planModel.Flavor.As(ctx, planFlavor, basetypes.ObjectAsOptions{}) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + } + + if planFlavor.CPU == stateFlavor.CPU && planFlavor.RAM == stateFlavor.RAM { + resp.PlanValue = req.StateValue + } +} diff --git a/stackit/internal/services/sqlserverflexbeta/versions/datasources_gen/version_data_source_gen.go b/stackit/internal/services/sqlserverflexbeta/versions/datasources_gen/versions_data_source_gen.go similarity index 99% rename from stackit/internal/services/sqlserverflexbeta/versions/datasources_gen/version_data_source_gen.go rename to stackit/internal/services/sqlserverflexbeta/versions/datasources_gen/versions_data_source_gen.go index dfeb5348..c4f33642 100644 --- a/stackit/internal/services/sqlserverflexbeta/versions/datasources_gen/version_data_source_gen.go +++ b/stackit/internal/services/sqlserverflexbeta/versions/datasources_gen/versions_data_source_gen.go @@ -17,7 +17,7 @@ import ( "github.com/hashicorp/terraform-plugin-framework/datasource/schema" ) -func VersionDataSourceSchema(ctx context.Context) schema.Schema { +func VersionsDataSourceSchema(ctx context.Context) schema.Schema { return schema.Schema{ Attributes: map[string]schema.Attribute{ "project_id": schema.StringAttribute{ @@ -26,7 +26,7 @@ func VersionDataSourceSchema(ctx context.Context) schema.Schema { MarkdownDescription: "The STACKIT project ID.", }, "region": schema.StringAttribute{ - Required: true, + Optional: true, Description: "The region which should be addressed", MarkdownDescription: "The region which should be addressed", Validators: []validator.String{ @@ -74,7 +74,7 @@ func VersionDataSourceSchema(ctx context.Context) schema.Schema { } } -type VersionModel struct { +type VersionsModel struct { ProjectId types.String `tfsdk:"project_id"` Region types.String `tfsdk:"region"` Versions types.List `tfsdk:"versions"` diff --git a/stackit/provider.go b/stackit/provider.go index 62990050..df5f299a 100644 --- a/stackit/provider.go +++ b/stackit/provider.go @@ -20,10 +20,9 @@ import ( sdkauth "github.com/stackitcloud/stackit-sdk-go/core/auth" "github.com/stackitcloud/stackit-sdk-go/core/config" - sqlserverflexalphaDatabase "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/database" - sqlserverflexalphaInstance "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/instance" - sqlserverflexalphaUser "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/user" - sqlserverflexbetaUser "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta/user" + //sqlserverflexalphaDatabase "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/database" + //sqlserverflexalphaInstance "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/instance" + //sqlserverflexalphaUser "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/user" "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/core" "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/features" @@ -36,7 +35,7 @@ import ( sqlserverFlexBetaDatabase "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta/database" sqlserverflexBetaInstance "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta/instance" - // sqlserverFlexBetaUser "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbetaUser/user" + sqlserverflexbetaUser "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta/user" ) // Ensure the implementation satisfies the expected interfaces @@ -536,9 +535,9 @@ func (p *Provider) DataSources(_ context.Context) []func() datasource.DataSource postgresflexalphaFlavors.NewFlavorsDataSource, // sqlserverFlexAlphaFlavor.NewFlavorDataSource, - sqlserverflexalphaInstance.NewInstanceDataSource, - sqlserverflexalphaUser.NewUserDataSource, - sqlserverflexalphaDatabase.NewDatabaseDataSource, + //sqlserverflexalphaInstance.NewInstanceDataSource, + //sqlserverflexalphaUser.NewUserDataSource, + //sqlserverflexalphaDatabase.NewDatabaseDataSource, sqlserverFlexBetaDatabase.NewDatabaseDataSource, sqlserverflexBetaInstance.NewInstanceDataSource, @@ -554,9 +553,9 @@ func (p *Provider) Resources(_ context.Context) []func() resource.Resource { postgresFlexAlphaUser.NewUserResource, postgresFlexAlphaDatabase.NewDatabaseResource, - sqlserverflexalphaInstance.NewInstanceResource, - sqlserverflexalphaUser.NewUserResource, - sqlserverflexalphaDatabase.NewDatabaseResource, + //sqlserverflexalphaInstance.NewInstanceResource, + //sqlserverflexalphaUser.NewUserResource, + //sqlserverflexalphaDatabase.NewDatabaseResource, sqlserverflexBetaInstance.NewInstanceResource, sqlserverflexbetaUser.NewUserResource, diff --git a/stackit/provider_acc_test.go b/stackit/provider_acc_test.go index 38e22144..a50503ae 100644 --- a/stackit/provider_acc_test.go +++ b/stackit/provider_acc_test.go @@ -10,8 +10,6 @@ import ( "github.com/google/go-cmp/cmp" - sqlserverflexalphaDatabase "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/database" - //nolint:staticcheck // used for acceptance testing postgresFlexAlphaFlavor "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/flavor" @@ -23,8 +21,6 @@ import ( postgresflexalphaFlavors "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/flavors" postgresFlexAlphaInstance "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/instance" postgresFlexAlphaUser "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/user" - sqlserverFlexAlphaInstance "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/instance" - sqlserverFlexAlphaUser "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/user" sqlserverflexBetaDatabase "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta/database" sqlserverFlexBetaInstance "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta/instance" sqlserverFlexBetaUser "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta/user" @@ -63,9 +59,9 @@ func TestUnitProviderHasChildDataSources_Basic(t *testing.T) { postgresflexalphaFlavors.NewFlavorsDataSource(), // sqlserverFlexAlphaFlavor.NewFlavorDataSource(), - sqlserverFlexAlphaInstance.NewInstanceDataSource(), - sqlserverFlexAlphaUser.NewUserDataSource(), - sqlserverflexalphaDatabase.NewDatabaseDataSource(), + //sqlserverFlexAlphaInstance.NewInstanceDataSource(), + //sqlserverFlexAlphaUser.NewUserDataSource(), + //sqlserverflexalphaDatabase.NewDatabaseDataSource(), sqlserverflexBetaDatabase.NewDatabaseDataSource(), sqlserverFlexBetaInstance.NewInstanceDataSource(), @@ -99,9 +95,9 @@ func TestUnitProviderHasChildResources_Basic(t *testing.T) { postgresFlexAlphaUser.NewUserResource(), postgresFlexAlphaDatabase.NewDatabaseResource(), - sqlserverFlexAlphaInstance.NewInstanceResource(), - sqlserverFlexAlphaUser.NewUserResource(), - sqlserverflexalphaDatabase.NewDatabaseResource(), + //sqlserverFlexAlphaInstance.NewInstanceResource(), + //sqlserverFlexAlphaUser.NewUserResource(), + //sqlserverflexalphaDatabase.NewDatabaseResource(), sqlserverFlexBetaInstance.NewInstanceResource(), sqlserverFlexBetaUser.NewUserResource(), From e6d2d3e10a85f6a0c92abc5ce6687fe8d661910b Mon Sep 17 00:00:00 2001 From: Marcel_Henselin Date: Thu, 7 May 2026 06:35:19 +0000 Subject: [PATCH 32/37] fix: re-enable sqlserverflex flavor (#108) ## Description relates to #1234 ## Checklist - [ ] Issue was linked above - [ ] Code format was applied: `make fmt` - [ ] Examples were added / adjusted (see `examples/` directory) - [x] Docs are up-to-date: `make generate-docs` (will be checked by CI) - [ ] Unit tests got implemented or updated - [ ] Acceptance tests got implemented or updated (see e.g. [here](https://github.com/stackitcloud/terraform-provider-stackit/blob/f5f99d170996b208672ae684b6da53420e369563/stackit/internal/services/dns/dns_acc_test.go)) - [x] Unit tests are passing: `make test` (will be checked by CI) - [x] No linter issues: `make lint` (will be checked by CI) Co-authored-by: Marcel S. Henselin Reviewed-on: https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pulls/108 --- docs/resources/sqlserverflexbeta_instance.md | 17 ++++++++++++++++- stackit/provider.go | 3 ++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/resources/sqlserverflexbeta_instance.md b/docs/resources/sqlserverflexbeta_instance.md index 20f5a9bc..d4200e39 100644 --- a/docs/resources/sqlserverflexbeta_instance.md +++ b/docs/resources/sqlserverflexbeta_instance.md @@ -97,7 +97,6 @@ import { ### Required - `backup_schedule` (String) The schedule for on what time and how often the database backup will be created. The schedule is written as a cron schedule. -- `flavor_id` (String) The id of the instance flavor. - `name` (String) The name of the instance. - `network` (Attributes) the network configuration of the instance. (see [below for nested schema](#nestedatt--network)) - `retention_days` (Number) The days for how long the backup files should be stored before cleaned up. 30 to 365 @@ -107,6 +106,8 @@ import { ### Optional - `encryption` (Attributes) this defines which key to use for storage encryption (see [below for nested schema](#nestedatt--encryption)) +- `flavor` (Attributes, Deprecated) (see [below for nested schema](#nestedatt--flavor)) +- `flavor_id` (String) The id of the instance flavor. - `instance_id` (String) The ID of the instance. - `project_id` (String) The STACKIT project ID. - `region` (String) The region which should be addressed @@ -156,3 +157,17 @@ Required: - `kek_key_ring_id` (String) The keyring identifier - `kek_key_version` (String) The key version - `service_account` (String) + + + +### Nested Schema for `flavor` + +Optional: + +- `cpu` (Number, Deprecated) +- `ram` (Number, Deprecated) + +Read-Only: + +- `description` (String) +- `id` (String) diff --git a/stackit/provider.go b/stackit/provider.go index df5f299a..0cda837a 100644 --- a/stackit/provider.go +++ b/stackit/provider.go @@ -19,6 +19,7 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" sdkauth "github.com/stackitcloud/stackit-sdk-go/core/auth" "github.com/stackitcloud/stackit-sdk-go/core/config" + sqlserverFlexBetaFlavor "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta/flavor" //sqlserverflexalphaDatabase "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/database" //sqlserverflexalphaInstance "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/instance" @@ -542,7 +543,7 @@ func (p *Provider) DataSources(_ context.Context) []func() datasource.DataSource sqlserverFlexBetaDatabase.NewDatabaseDataSource, sqlserverflexBetaInstance.NewInstanceDataSource, sqlserverflexbetaUser.NewUserDataSource, - // sqlserverFlexBetaFlavor.NewFlavorDataSource, + sqlserverFlexBetaFlavor.NewFlavorDataSource, } } From 515b7b1357cab6bb278399223b0996927b193073 Mon Sep 17 00:00:00 2001 From: Marcel_Henselin Date: Thu, 7 May 2026 06:51:19 +0000 Subject: [PATCH 33/37] fix: wrong flavor source (#109) ## Description relates to #1234 ## Checklist - [ ] Issue was linked above - [ ] Code format was applied: `make fmt` - [ ] Examples were added / adjusted (see `examples/` directory) - [x] Docs are up-to-date: `make generate-docs` (will be checked by CI) - [ ] Unit tests got implemented or updated - [ ] Acceptance tests got implemented or updated (see e.g. [here](https://github.com/stackitcloud/terraform-provider-stackit/blob/f5f99d170996b208672ae684b6da53420e369563/stackit/internal/services/dns/dns_acc_test.go)) - [x] Unit tests are passing: `make test` (will be checked by CI) - [x] No linter issues: `make lint` (will be checked by CI) Co-authored-by: Marcel S. Henselin Reviewed-on: https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pulls/109 --- .../internal/services/postgresflexalpha/flavor/datasource.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stackit/internal/services/postgresflexalpha/flavor/datasource.go b/stackit/internal/services/postgresflexalpha/flavor/datasource.go index 97213227..715c68ed 100644 --- a/stackit/internal/services/postgresflexalpha/flavor/datasource.go +++ b/stackit/internal/services/postgresflexalpha/flavor/datasource.go @@ -11,7 +11,7 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3alpha1api" "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/conversion" - postgresflexalphaGen "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/flavors/datasources_gen" + postgresflexalphaGen "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/flavor/datasources_gen" postgresflexUtils "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/utils" "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/utils" From c31a8a787a44cfecad26bdf5682766c82fe1c29a Mon Sep 17 00:00:00 2001 From: Marcel_Henselin Date: Thu, 7 May 2026 07:13:50 +0000 Subject: [PATCH 34/37] fix: wrong data type (#110) ## Description relates to #1234 ## Checklist - [ ] Issue was linked above - [ ] Code format was applied: `make fmt` - [ ] Examples were added / adjusted (see `examples/` directory) - [x] Docs are up-to-date: `make generate-docs` (will be checked by CI) - [ ] Unit tests got implemented or updated - [ ] Acceptance tests got implemented or updated (see e.g. [here](https://github.com/stackitcloud/terraform-provider-stackit/blob/f5f99d170996b208672ae684b6da53420e369563/stackit/internal/services/dns/dns_acc_test.go)) - [x] Unit tests are passing: `make test` (will be checked by CI) - [x] No linter issues: `make lint` (will be checked by CI) Co-authored-by: Marcel S. Henselin Reviewed-on: https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pulls/110 --- .../postgresflexalpha/flavor/datasource.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/stackit/internal/services/postgresflexalpha/flavor/datasource.go b/stackit/internal/services/postgresflexalpha/flavor/datasource.go index 715c68ed..ee7177f6 100644 --- a/stackit/internal/services/postgresflexalpha/flavor/datasource.go +++ b/stackit/internal/services/postgresflexalpha/flavor/datasource.go @@ -220,14 +220,24 @@ func (r *flavorDataSource) Read(ctx context.Context, req datasource.ReadRequest, } else { var scList []attr.Value for _, sc := range f.StorageClasses { + mIop := types.Int32Null() + if val, ok := sc.GetMaxIoPerSecOk(); ok { + mIop = types.Int32Value(*val) + } + + mThrough := types.Int32Null() + if val, ok := sc.GetMaxThroughInMbOk(); ok { + mThrough = types.Int32Value(*val) + } + scList = append( scList, postgresflexalphaGen.NewStorageClassesValueMust( postgresflexalphaGen.StorageClassesValue{}.AttributeTypes(ctx), map[string]attr.Value{ "class": types.StringValue(sc.Class), - "max_io_per_sec": types.Int64Value(int64(sc.GetMaxIoPerSec())), - "max_through_in_mb": types.Int64Value(int64(sc.GetMaxThroughInMb())), + "max_io_per_sec": mIop, + "max_through_in_mb": mThrough, }, ), ) From 6c260899307fee4efcb8c74a0926fb5a1470d452 Mon Sep 17 00:00:00 2001 From: Marcel_Henselin Date: Thu, 7 May 2026 07:37:22 +0000 Subject: [PATCH 35/37] chore: update docs (#111) ## Description relates to #1234 ## Checklist - [ ] Issue was linked above - [ ] Code format was applied: `make fmt` - [ ] Examples were added / adjusted (see `examples/` directory) - [x] Docs are up-to-date: `make generate-docs` (will be checked by CI) - [ ] Unit tests got implemented or updated - [ ] Acceptance tests got implemented or updated (see e.g. [here](https://github.com/stackitcloud/terraform-provider-stackit/blob/f5f99d170996b208672ae684b6da53420e369563/stackit/internal/services/dns/dns_acc_test.go)) - [x] Unit tests are passing: `make test` (will be checked by CI) - [x] No linter issues: `make lint` (will be checked by CI) Co-authored-by: Marcel S. Henselin Reviewed-on: https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pulls/111 --- docs/data-sources/sqlserverflexbeta_flavor.md | 54 +++++++++++++++++++ .../resource.tf | 27 ++++++++++ .../resource.tf | 25 +++++++++ generator/cmd/docCmd.go | 4 +- 4 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 docs/data-sources/sqlserverflexbeta_flavor.md diff --git a/docs/data-sources/sqlserverflexbeta_flavor.md b/docs/data-sources/sqlserverflexbeta_flavor.md new file mode 100644 index 00000000..4d2a32f3 --- /dev/null +++ b/docs/data-sources/sqlserverflexbeta_flavor.md @@ -0,0 +1,54 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "stackitprivatepreview_sqlserverflexbeta_flavor Data Source - stackitprivatepreview" +subcategory: "" +description: |- + +--- + +# stackitprivatepreview_sqlserverflexbeta_flavor (Data Source) + + + +## Example Usage + +```terraform +data "stackitprivatepreview_sqlserverflexbeta_flavor" "flavor" { + project_id = var.project_id + region = var.region + cpu = 4 + ram = 16 + node_type = "Single" + storage_class = "premium-perf2-stackit" +} +``` + + +## Schema + +### Required + +- `cpu` (Number) The cpu count of the instance. +- `node_type` (String) defines the nodeType it can be either single or HA +- `project_id` (String) The project ID of the flavor. +- `ram` (Number) The memory of the instance in Gibibyte. +- `region` (String) The region of the flavor. +- `storage_class` (String) The memory of the instance in Gibibyte. + +### Read-Only + +- `description` (String) The flavor description. +- `flavor_id` (String) The id of the instance flavor. +- `id` (String) The id of the instance flavor. +- `max_gb` (Number) maximum storage which can be ordered for the flavor in Gigabyte. +- `min_gb` (Number) minimum storage which is required to order in Gigabyte. +- `storage_classes` (Attributes List) maximum storage which can be ordered for the flavor in Gigabyte. (see [below for nested schema](#nestedatt--storage_classes)) + + +### Nested Schema for `storage_classes` + +Read-Only: + +- `class` (String) +- `max_io_per_sec` (Number) +- `max_through_in_mb` (Number) diff --git a/examples/resources/stackitprivatepreview_postgresflexalpha_instance/resource.tf b/examples/resources/stackitprivatepreview_postgresflexalpha_instance/resource.tf index b503f0ce..7250b66b 100644 --- a/examples/resources/stackitprivatepreview_postgresflexalpha_instance/resource.tf +++ b/examples/resources/stackitprivatepreview_postgresflexalpha_instance/resource.tf @@ -1,3 +1,30 @@ +# NOTE: flavor handling will change in future +# V2 compatible flavor usage (example without encryption) +resource "stackitprivatepreview_postgresflexalpha_instance" "example-instance" { + project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + name = "example-instance" + acl = ["XXX.XXX.XXX.X/XX", "XX.XXX.XX.X/XX"] + backup_schedule = "0 0 * * *" + retention_days = 30 + flavor = { + cpu = 2 + ram = 4 + } + replicas = 1 + storage = { + performance_class = "premium-perf2-stackit" + size = 10 + } + network = { + acl = ["XXX.XXX.XXX.X/XX", "XX.XXX.XX.X/XX"] + access_scope = "PUBLIC" + } + version = 17 +} + +# future use of flavor (implemented in V3 API) +# first determine flavor and then use the flavor_id + resource "stackitprivatepreview_postgresflexalpha_instance" "example-instance" { project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" name = "example-instance" diff --git a/examples/resources/stackitprivatepreview_sqlserverflexbeta_instance/resource.tf b/examples/resources/stackitprivatepreview_sqlserverflexbeta_instance/resource.tf index 06e88f64..565ae019 100644 --- a/examples/resources/stackitprivatepreview_sqlserverflexbeta_instance/resource.tf +++ b/examples/resources/stackitprivatepreview_sqlserverflexbeta_instance/resource.tf @@ -1,3 +1,28 @@ +# NOTE: flavor handling will change in future +# V2 compatible flavor usage +resource "stackitprivatepreview_sqlserverflexbeta_instance" "instance" { + project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + name = "example-instance" + backup_schedule = "0 3 * * *" + retention_days = 31 + flavor = { + cpu = 2 + ram = 4 + } + storage = { + class = "premium-perf2-stackit" + size = 50 + } + version = 2022 + network = { + acl = ["XXX.XXX.XXX.X/XX", "XX.XXX.XX.X/XX"] + access_scope = "SNA" + } +} + +# future use of flavor (implemented in V3 API) +# first determine flavor and then use the flavor_id + # without encryption and SNA resource "stackitprivatepreview_sqlserverflexbeta_instance" "instance" { project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" diff --git a/generator/cmd/docCmd.go b/generator/cmd/docCmd.go index 77b1dc23..cf36610b 100644 --- a/generator/cmd/docCmd.go +++ b/generator/cmd/docCmd.go @@ -172,12 +172,12 @@ func workDocs() error { case "data-sources": dataSources[matches[0][1]] = append(dataSources[matches[0][1]], ResItem{ ItemName: matches[0][2], - ItemLink: fmt.Sprintf("docs/%s/%s", entry.Name(), matches[0][0]), + ItemLink: fmt.Sprintf("/docs/docs/%s/%s", entry.Name(), matches[0][0]), }) case "resources": resources[matches[0][1]] = append(resources[matches[0][1]], ResItem{ ItemName: matches[0][2], - ItemLink: fmt.Sprintf("docs/%s/%s", entry.Name(), matches[0][0]), + ItemLink: fmt.Sprintf("/docs/docs/%s/%s", entry.Name(), matches[0][0]), }) default: return fmt.Errorf("this should never have happened") From 2f2b5cd04a466bc906feef65891109f7c960fe5e Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Thu, 7 May 2026 09:49:17 +0200 Subject: [PATCH 36/37] chore: update docs --- docs/resources/postgresflexalpha_instance.md | 27 ++++++++++++++++++++ docs/resources/sqlserverflexbeta_instance.md | 25 ++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/docs/resources/postgresflexalpha_instance.md b/docs/resources/postgresflexalpha_instance.md index 67ed171a..b82664ff 100644 --- a/docs/resources/postgresflexalpha_instance.md +++ b/docs/resources/postgresflexalpha_instance.md @@ -13,6 +13,33 @@ description: |- ## Example Usage ```terraform +# NOTE: flavor handling will change in future +# V2 compatible flavor usage (example without encryption) +resource "stackitprivatepreview_postgresflexalpha_instance" "example-instance" { + project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + name = "example-instance" + acl = ["XXX.XXX.XXX.X/XX", "XX.XXX.XX.X/XX"] + backup_schedule = "0 0 * * *" + retention_days = 30 + flavor = { + cpu = 2 + ram = 4 + } + replicas = 1 + storage = { + performance_class = "premium-perf2-stackit" + size = 10 + } + network = { + acl = ["XXX.XXX.XXX.X/XX", "XX.XXX.XX.X/XX"] + access_scope = "PUBLIC" + } + version = 17 +} + +# future use of flavor (implemented in V3 API) +# first determine flavor and then use the flavor_id + resource "stackitprivatepreview_postgresflexalpha_instance" "example-instance" { project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" name = "example-instance" diff --git a/docs/resources/sqlserverflexbeta_instance.md b/docs/resources/sqlserverflexbeta_instance.md index d4200e39..a46e76ba 100644 --- a/docs/resources/sqlserverflexbeta_instance.md +++ b/docs/resources/sqlserverflexbeta_instance.md @@ -13,6 +13,31 @@ description: |- ## Example Usage ```terraform +# NOTE: flavor handling will change in future +# V2 compatible flavor usage +resource "stackitprivatepreview_sqlserverflexbeta_instance" "instance" { + project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + name = "example-instance" + backup_schedule = "0 3 * * *" + retention_days = 31 + flavor = { + cpu = 2 + ram = 4 + } + storage = { + class = "premium-perf2-stackit" + size = 50 + } + version = 2022 + network = { + acl = ["XXX.XXX.XXX.X/XX", "XX.XXX.XX.X/XX"] + access_scope = "SNA" + } +} + +# future use of flavor (implemented in V3 API) +# first determine flavor and then use the flavor_id + # without encryption and SNA resource "stackitprivatepreview_sqlserverflexbeta_instance" "instance" { project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" From 29cf260d56617b7f8e8ef577a7356b16a6d013ee Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Thu, 7 May 2026 09:55:03 +0200 Subject: [PATCH 37/37] fix: extend PGSQL fail wait cycle --- stackit/internal/wait/postgresflexalpha/wait.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stackit/internal/wait/postgresflexalpha/wait.go b/stackit/internal/wait/postgresflexalpha/wait.go index 930fe501..6b1f250a 100644 --- a/stackit/internal/wait/postgresflexalpha/wait.go +++ b/stackit/internal/wait/postgresflexalpha/wait.go @@ -61,7 +61,7 @@ func CreateInstanceWaitHandler( maxWait := time.Minute * 90 startTime := time.Now() extendedTimeout := 0 - maxFailedCount := 3 + maxFailedCount := 10 failedCount := 0 handler := wait.New( @@ -129,7 +129,7 @@ func CreateInstanceWaitHandler( }, ) var waitCounter int64 = 1 - maxWaitInt := big.NewInt(7) + maxWaitInt := big.NewInt(10) n, randErr := rand.Int(rand.Reader, maxWaitInt) if randErr == nil { waitCounter = n.Int64() + 1