From b4c5b3774b9d5caca7b4ae37f7500d829143676d Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Thu, 22 Jan 2026 16:00:34 +0100 Subject: [PATCH] chore: updated files - work save --- .github/actions/build/action.yaml | 3 + .gitignore | 1 + .goreleaser.yaml | 10 +- cmd/main.go | 5 +- .../data-sources/postgresflexalpha_flavors.md | 68 + .../sqlserverflexalpha_version.md | 35 + go.mod | 84 +- go.sum | 502 ++++- golang-ci.bck.yaml | 3 + golang-ci.yaml | 5 + main.go | 2 +- pkg/albbeta/api_default_test.go | 3 + pkg/albwafalpha/api_default_test.go | 3 + pkg/cdnbeta/api_default_test.go | 3 + pkg/certificatesbeta/api_default_test.go | 3 + pkg/edgebeta/api_default_test.go | 3 + pkg/gitbeta/api_default_test.go | 3 + pkg/iaasalpha/api_default_test.go | 3 + pkg/iaasalpha/wait/wait.go | 3 + pkg/iaasalpha/wait/wait_test.go | 3 + pkg/iaasbeta/api_default_test.go | 3 + pkg/intakebeta/api_default_test.go | 3 + pkg/kmsbeta/api_default_test.go | 3 + pkg/logsalpha/api_default_test.go | 3 + pkg/logsbeta/api_default_test.go | 3 + pkg/postgresflexalpha/api_default_test.go | 3 + .../model_create_instance_request_payload.go | 22 - pkg/runcommandbeta/api_default_test.go | 3 + pkg/sfsbeta/api_default_test.go | 3 + pkg/sqlserverflexalpha/api_default_test.go | 3 + pkg/vpnalpha/api_default_test.go | 3 + sample/postgres/outputs.tf | 3 + sample/postgres/postresql.tf | 35 +- sample/postgres/providers.tf | 7 +- sample/sqlserver/flavor.tf | 13 +- sample/sqlserver/providers.tf | 25 +- sample/sqlserver/sqlserver.tf | 52 +- sample/tf.sh | 3 + scripts/check-docs.sh | 3 + scripts/lint-golangci-lint.sh | 3 + scripts/project.sh | 3 + scripts/replace.sh | 3 + scripts/tfplugindocs.sh | 3 + .../postgres-flex_database_config.yml | 3 + ...g.yml => postgres-flex_flavors_config.yml} | 3 + .../postgres-flex_instance_config.yml | 3 + service_specs/postgres-flex_role_config.yml | 3 + service_specs/postgres-flex_user_config.yml | 3 + .../postgres-flex_version_config.yml | 3 + .../sqlserverflex_database_config.yml | 3 + ...g.yml => sqlserverflex_flavors_config.yml} | 5 +- .../sqlserverflex_instance_config.yml | 3 + service_specs/sqlserverflex_user_config.yml | 3 + .../sqlserverflex_version_config.yml | 3 + .../postgresflexalpha/database/datasource.go | 3 + .../postgresflexalpha/database/functions.go | 3 + .../database/functions_test.go | 3 + .../postgresflexalpha/database/resource.go | 3 + .../database/resource_test.go | 3 + .../postgresflexalpha/flavor/datasource.go | 21 +- .../postgresflexalpha/flavor/functions.go | 3 + .../flavor/functions_test.go | 3 + .../postgresflexalpha/flavors/datasource.go | 73 + .../flavors_data_source_gen.go} | 37 +- .../postgresflexalpha/instance/datasource.go | 3 + .../postgresflexalpha/instance/functions.go | 44 +- .../instance/functions_test.go | 3 + .../postgresflexalpha/instance/models.go | 63 - .../postgresflexalpha/instance/resource.go | 35 +- .../instance/resource_test.go | 3 + .../postgresflexalpha/instance/schema_test.go | 3 + .../services/postgresflexalpha/main.go | 4 + .../postgresflex_acc_test.go | 4 +- .../testdata/resource-complete.tf | 3 + .../postgresflexalpha/user/datasource.go | 3 + .../postgresflexalpha/user/datasource_test.go | 3 + .../postgresflexalpha/user/resource.go | 3 + .../postgresflexalpha/user/resource_test.go | 3 + .../sqlserverflexalpha/backup/datasource.go | 48 - .../datasources_gen/backup_data_source_gen.go | 87 - .../backups_data_source_gen.go | 1735 ----------------- .../collation/datasource.go | 48 - .../collation_data_source_gen.go | 451 ----- .../sqlserverflexalpha/database/datasource.go | 37 +- .../sqlserverflexalpha/database/resource.go | 9 +- .../sqlserverflexalpha/flavor/datasource.go | 32 +- .../sqlserverflexalpha/flavor/functions.go | 234 +-- .../flavor/functions_test.go | 137 ++ .../flavor/list_datasource.go.bak | 79 - .../sqlserverflexalpha/flavors/datasource.go | 71 + .../flavors_data_source_gen.go} | 41 +- .../sqlserverflexalpha/instance/functions.go | 3 + .../services/sqlserverflexalpha/main.go | 4 + .../sqlserverflex_acc_test.go | 2 +- .../testdata/resource-max.tf | 3 + .../testdata/resource-min.tf | 3 + .../sqlserverflexalpha/user/datasource.go | 3 + .../user/datasource_test.go | 3 + .../sqlserverflexalpha/user/resource.go | 3 + .../sqlserverflexalpha/user/resource_test.go | 3 + .../sqlserverflexalpha/version/datasource.go | 50 +- .../internal/wait/postgresflexalpha/wait.go | 20 +- stackit/provider.go | 10 +- stackit/testdata/provider-all-attributes.tf | 3 + stackit/testdata/provider-credentials.tf | 3 + .../testdata/provider-invalid-attribute.tf | 3 + tools/copy.go | 5 +- tools/formats.go | 5 +- tools/main.go | 56 +- tools/templates/data_source_scaffold.gotmpl | 6 +- 110 files changed, 1498 insertions(+), 3013 deletions(-) create mode 100644 docs/data-sources/postgresflexalpha_flavors.md create mode 100644 docs/data-sources/sqlserverflexalpha_version.md rename service_specs/{postgres-flex_flavor_config.yml => postgres-flex_flavors_config.yml} (69%) rename service_specs/{sqlserverflex_flavor_config.yml => sqlserverflex_flavors_config.yml} (64%) create mode 100644 stackit/internal/services/postgresflexalpha/flavors/datasource.go rename stackit/internal/services/postgresflexalpha/{flavor_data_source_gen.go => flavors/datasources_gen/flavors_data_source_gen.go} (97%) delete mode 100644 stackit/internal/services/postgresflexalpha/instance/models.go create mode 100644 stackit/internal/services/postgresflexalpha/main.go delete mode 100644 stackit/internal/services/sqlserverflexalpha/backup/datasource.go delete mode 100644 stackit/internal/services/sqlserverflexalpha/backup/datasources_gen/backup_data_source_gen.go delete mode 100644 stackit/internal/services/sqlserverflexalpha/backup/datasources_gen/backups_data_source_gen.go delete mode 100644 stackit/internal/services/sqlserverflexalpha/collation/datasource.go delete mode 100644 stackit/internal/services/sqlserverflexalpha/collation/datasources_gen/collation_data_source_gen.go create mode 100644 stackit/internal/services/sqlserverflexalpha/flavor/functions_test.go delete mode 100644 stackit/internal/services/sqlserverflexalpha/flavor/list_datasource.go.bak create mode 100644 stackit/internal/services/sqlserverflexalpha/flavors/datasource.go rename stackit/internal/services/sqlserverflexalpha/{flavor_data_source_gen.go => flavors/datasources_gen/flavors_data_source_gen.go} (97%) create mode 100644 stackit/internal/services/sqlserverflexalpha/main.go diff --git a/.github/actions/build/action.yaml b/.github/actions/build/action.yaml index 3601b23f..8e8c97ab 100644 --- a/.github/actions/build/action.yaml +++ b/.github/actions/build/action.yaml @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + name: Build description: "Build pipeline" inputs: diff --git a/.gitignore b/.gitignore index 746f70d3..56ab626b 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,4 @@ coverage.out coverage.html generated stackit-sdk-generator +dist \ No newline at end of file diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 95b11695..e0aafe37 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -5,6 +5,8 @@ # behavior. version: 2 +project_name: terraform-provider-stackitprivatepreview + builds: - env: # goreleaser does not work with CGO, it could also complicate @@ -30,15 +32,15 @@ builds: - goos: darwin goarch: '386' - goos: windows - goarch: 'arm6' + goarch: arm binary: '{{ .ProjectName }}_v{{ .Version }}' archives: - formats: [ 'zip' ] name_template: '{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}' checksum: - extra_files: - - glob: 'terraform-registry-manifest.json' - name_template: '{{ .ProjectName }}_{{ .Version }}_manifest.json' +# extra_files: +# - glob: 'terraform-registry-manifest.json' +# name_template: '{{ .ProjectName }}_{{ .Version }}_manifest.json' name_template: '{{ .ProjectName }}_{{ .Version }}_SHA256SUMS' algorithm: sha256 signs: diff --git a/cmd/main.go b/cmd/main.go index 515fad5d..1da9489e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package main import ( @@ -16,7 +19,7 @@ func NewRootCmd() *cobra.Command { SilenceErrors: true, // Error is beautified in a custom way before being printed SilenceUsage: true, DisableAutoGenTag: true, - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(_ *cobra.Command, _ []string) error { return tools.Build() }, } diff --git a/docs/data-sources/postgresflexalpha_flavors.md b/docs/data-sources/postgresflexalpha_flavors.md new file mode 100644 index 00000000..f90ae257 --- /dev/null +++ b/docs/data-sources/postgresflexalpha_flavors.md @@ -0,0 +1,68 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "stackitprivatepreview_postgresflexalpha_flavors Data Source - stackitprivatepreview" +subcategory: "" +description: |- + +--- + +# stackitprivatepreview_postgresflexalpha_flavors (Data Source) + + + + + + +## Schema + +### Required + +- `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 flavors to be returned on each page. + +### Read-Only + +- `flavors` (Attributes List) List of flavors available for the project. (see [below for nested schema](#nestedatt--flavors)) +- `pagination` (Attributes) (see [below for nested schema](#nestedatt--pagination)) + + +### Nested Schema for `flavors` + +Read-Only: + +- `cpu` (Number) The cpu count of the instance. +- `description` (String) The flavor description. +- `id` (String) The id of the instance flavor. +- `max_gb` (Number) maximum storage which can be ordered for the flavor in Gigabyte. +- `memory` (Number) The memory of the instance in Gibibyte. +- `min_gb` (Number) minimum storage which is required to order in Gigabyte. +- `node_type` (String) defines the nodeType it can be either single or replica +- `storage_classes` (Attributes List) maximum storage which can be ordered for the flavor in Gigabyte. (see [below for nested schema](#nestedatt--flavors--storage_classes)) + + +### Nested Schema for `flavors.storage_classes` + +Read-Only: + +- `class` (String) +- `max_io_per_sec` (Number) +- `max_through_in_mb` (Number) + + + + +### Nested Schema for `pagination` + +Read-Only: + +- `page` (Number) +- `size` (Number) +- `sort` (String) +- `total_pages` (Number) +- `total_rows` (Number) diff --git a/docs/data-sources/sqlserverflexalpha_version.md b/docs/data-sources/sqlserverflexalpha_version.md new file mode 100644 index 00000000..c9c61732 --- /dev/null +++ b/docs/data-sources/sqlserverflexalpha_version.md @@ -0,0 +1,35 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "stackitprivatepreview_sqlserverflexalpha_version Data Source - stackitprivatepreview" +subcategory: "" +description: |- + +--- + +# stackitprivatepreview_sqlserverflexalpha_version (Data Source) + + + + + + +## Schema + +### Required + +- `project_id` (String) The STACKIT project ID. +- `region` (String) The region which should be addressed + +### Read-Only + +- `versions` (Attributes List) A list containing available sqlserver versions. (see [below for nested schema](#nestedatt--versions)) + + +### Nested Schema for `versions` + +Read-Only: + +- `beta` (Boolean) Flag if the version is a beta version. If set the version may contain bugs and is not fully tested. +- `deprecated` (String) Timestamp in RFC3339 format which says when the version will no longer be supported by STACKIT. +- `recommend` (Boolean) Flag if the version is recommend by the STACKIT Team. +- `version` (String) The sqlserver version used for the instance. diff --git a/go.mod b/go.mod index 8f99040c..223830ef 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,12 @@ module github.com/mhenselin/terraform-provider-stackitprivatepreview -go 1.25.5 +go 1.25.6 require ( github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 + github.com/hashicorp/copywrite v0.22.0 + github.com/hashicorp/terraform-plugin-codegen-framework v0.4.1 github.com/hashicorp/terraform-plugin-framework v1.17.0 github.com/hashicorp/terraform-plugin-framework-validators v0.19.0 github.com/hashicorp/terraform-plugin-go v0.29.0 @@ -12,27 +14,49 @@ require ( github.com/hashicorp/terraform-plugin-testing v1.14.0 github.com/ldez/go-git-cmd-wrapper/v2 v2.9.1 github.com/spf13/cobra v1.10.2 - github.com/spf13/viper v1.21.0 - github.com/stackitcloud/stackit-sdk-go/core v0.20.1 - github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0 + github.com/stackitcloud/stackit-sdk-go/core v0.21.0 + github.com/stackitcloud/stackit-sdk-go/services/iaasalpha v0.1.23-alpha + github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.1 github.com/teambition/rrule-go v1.8.2 ) require ( github.com/hashicorp/go-retryablehttp v0.7.8 // indirect - golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2 // indirect + golang.org/x/telemetry v0.0.0-20260116145544-c6413dc483f5 // indirect ) require ( + dario.cat/mergo v1.0.1 // indirect + github.com/AlecAivazis/survey/v2 v2.3.7 // 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.3.0 // indirect + github.com/Masterminds/sprig/v3 v3.3.0 // indirect github.com/ProtonMail/go-crypto v1.3.0 // 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.9.2 // indirect + github.com/bradleyfalzon/ghinstallation/v2 v2.17.0 // indirect + github.com/cli/go-gh/v2 v2.13.0 // indirect + github.com/cli/safeexec v1.0.1 // indirect + github.com/clipperhouse/stringish v0.1.1 // indirect + github.com/clipperhouse/uax29/v2 v2.3.1 // indirect github.com/cloudflare/circl v1.6.2 // indirect github.com/fatih/color v1.18.0 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/go-openapi/errors v0.22.6 // indirect + github.com/go-openapi/strfmt v0.25.0 // indirect + github.com/go-viper/mapstructure/v2 v2.5.0 // indirect + github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/golang-jwt/jwt/v5 v5.3.0 // indirect github.com/golang/protobuf v1.5.4 // indirect + github.com/google/go-github/v45 v45.2.0 // indirect + github.com/google/go-github/v75 v75.0.0 // indirect + github.com/google/go-querystring v1.2.0 // 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 @@ -43,46 +67,72 @@ require ( github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/go-version v1.8.0 // indirect github.com/hashicorp/hc-install v0.9.2 // 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.24.0 // indirect github.com/hashicorp/terraform-json v0.27.2 // indirect + github.com/hashicorp/terraform-plugin-codegen-spec v0.2.0 // indirect + github.com/hashicorp/terraform-plugin-docs v0.24.0 // indirect github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1 // indirect github.com/hashicorp/terraform-registry-address v0.4.0 // indirect - github.com/hashicorp/terraform-svchost v0.1.1 // indirect + github.com/hashicorp/terraform-svchost v0.2.0 // indirect github.com/hashicorp/yamux v0.1.2 // indirect + github.com/huandu/xstrings v1.5.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jedib0t/go-pretty v4.3.0+incompatible // indirect + github.com/jedib0t/go-pretty/v6 v6.7.8 // indirect + github.com/joho/godotenv v1.5.1 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/knadh/koanf v1.5.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.19 // indirect + github.com/mergestat/timediff v0.0.4 // indirect + github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // 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/oklog/run v1.2.0 // indirect - github.com/pelletier/go-toml/v2 v2.2.4 // indirect - github.com/sagikazarmark/locafero v0.11.0 // indirect - github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect + github.com/oklog/ulid v1.3.1 // indirect + github.com/posener/complete v1.2.3 // indirect + github.com/samber/lo v1.52.0 // indirect + github.com/shopspring/decimal v1.4.0 // indirect github.com/spf13/afero v1.15.0 // indirect - github.com/spf13/cast v1.10.0 // indirect + github.com/spf13/cast v1.7.0 // indirect github.com/spf13/pflag v1.0.10 // indirect - github.com/subosito/gotenv v1.6.0 // indirect + github.com/stretchr/testify v1.11.1 // indirect + github.com/thanhpk/randstr v1.0.6 // 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/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 // indirect + github.com/yuin/goldmark v1.7.8 // indirect + github.com/yuin/goldmark-meta v1.1.0 // indirect github.com/zclconf/go-cty v1.17.0 // indirect - go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.46.0 // indirect + go.abhg.dev/goldmark/frontmatter v0.2.0 // indirect + go.mongodb.org/mongo-driver v1.17.7 // indirect + golang.org/x/crypto v0.47.0 // indirect + golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect golang.org/x/mod v0.32.0 // indirect - golang.org/x/net v0.48.0 // indirect + golang.org/x/net v0.49.0 // indirect + golang.org/x/oauth2 v0.34.0 // indirect golang.org/x/sync v0.19.0 // indirect golang.org/x/sys v0.40.0 // indirect + golang.org/x/term v0.39.0 // indirect golang.org/x/text v0.33.0 // indirect - golang.org/x/tools v0.40.0 // indirect + golang.org/x/tools v0.41.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260120221211-b8f7ae30c516 // indirect google.golang.org/grpc v1.78.0 // indirect google.golang.org/protobuf v1.36.11 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) tool golang.org/x/tools/cmd/goimports diff --git a/go.sum b/go.sum index 3b066a44..319bb993 100644 --- a/go.sum +++ b/go.sum @@ -1,96 +1,263 @@ -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +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= +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/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= +github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= +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/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/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= +github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= +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.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= +github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= +github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= +github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= 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/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/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= 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/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +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/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/config v1.8.3/go.mod h1:4AEiLtAb8kLs7vgw2ZV3p2VZ1+hBavOc84hqxVNpCyw= +github.com/aws/aws-sdk-go-v2/credentials v1.4.3/go.mod h1:FNNC6nQZQUuyhq5aE5c7ata8o9e4ECGmS4lAXC7o1mQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.6.0/go.mod h1:gqlclDEZp4aqJOancXK6TN24aKhT0W0Ae9MHk3wzTMM= +github.com/aws/aws-sdk-go-v2/internal/ini v1.2.4/go.mod h1:ZcBrrI3zBKlhGFNYWvju0I3TR93I7YIgAfy82Fh4lcQ= +github.com/aws/aws-sdk-go-v2/service/appconfig v1.4.2/go.mod h1:FZ3HkCe+b10uFZZkFdvf98LHW21k49W8o8J366lqVKY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.2/go.mod h1:72HRZDLMtmVQiLG2tLfQcaWLCssELvGl+Zf2WVxMmR8= +github.com/aws/aws-sdk-go-v2/service/sso v1.4.2/go.mod h1:NBvT9R1MEF+Ud6ApJKM0G+IkPchKS7p7c2YPKwHmBOk= +github.com/aws/aws-sdk-go-v2/service/sts v1.7.2/go.mod h1:8EzeIqfWt2wWT4rJVu3f21TfrhJ8AEMzVybRNSb/b4g= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +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/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/bmatcuk/doublestar/v4 v4.9.2 h1:b0mc6WyRSYLjzofB2v/0cuDUZ+MqoGyH3r0dVij35GI= +github.com/bmatcuk/doublestar/v4 v4.9.2/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bradleyfalzon/ghinstallation/v2 v2.17.0 h1:SmbUK/GxpAspRjSQbB6ARvH+ArzlNzTtHydNyXUQ6zg= +github.com/bradleyfalzon/ghinstallation/v2 v2.17.0/go.mod h1:vuD/xvJT9Y+ZVZRv4HQ42cMyPFIYqpc7AbB4Gvt/DlY= 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/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/cli/go-gh/v2 v2.13.0 h1:jEHZu/VPVoIJkciK3pzZd3rbT8J90swsK5Ui4ewH1ys= +github.com/cli/go-gh/v2 v2.13.0/go.mod h1:Us/NbQ8VNM0fdaILgoXSz6PKkV5PWaEzkJdc9vR2geM= +github.com/cli/safeexec v1.0.1 h1:e/C79PbXF4yYTN/wauC4tviMxEV13BwljGj0N9j+N00= +github.com/cli/safeexec v1.0.1/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5zx3Q= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs= +github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= +github.com/clipperhouse/uax29/v2 v2.3.1 h1:RjM8gnVbFbgI67SBekIC7ihFpyXwRPYWXn9BZActHbw= +github.com/clipperhouse/uax29/v2 v2.3.1/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= github.com/cloudflare/circl v1.6.2 h1:hL7VBpHHKzrV5WTfHCaBsgx/HGbBYlgrwvNXEVDYYsQ= github.com/cloudflare/circl v1.6.2/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= +github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= 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/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/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= 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/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 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.14.0 h1:/MD3lCrGjCen5WfEAzKg00MJJffKhC8gzS80ycmCi60= github.com/go-git/go-git/v5 v5.14.0/go.mod h1:Z5Xhoia5PcWA3NF8vRLURn9E5FRhSl7dGj9ItW3Wk5k= +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-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= +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-openapi/errors v0.22.6 h1:eDxcf89O8odEnohIXwEjY1IB4ph5vmbUsBMsFNwXWPo= +github.com/go-openapi/errors v0.22.6/go.mod h1:z9S8ASTUqx7+CP1Q8dD8ewGH/1JWFFLX/2PmAYNQLgk= +github.com/go-openapi/strfmt v0.25.0 h1:7R0RX7mbKLa9EYCTHRcCuIPcaqlyQiWNPTXwClK0saQ= +github.com/go-openapi/strfmt v0.25.0/go.mod h1:nNXct7OzbwrMY9+5tLX4I21pzcmE6ccMGXl3jFdPfn8= +github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls= +github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= 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-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= -github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +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/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= +github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= github.com/golang-jwt/jwt/v5 v5.3.0/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-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/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.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/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/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.5.0/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.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.6.0/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/go-github/v45 v45.2.0 h1:5oRLszbrkvxDDqBCNj2hjDZMKmvexaZ1xw/FCD+K3FI= +github.com/google/go-github/v45 v45.2.0/go.mod h1:FObaZJEDSTa/WGCzZ2Z3eoCDXWJKMenWWTrd8jrta28= +github.com/google/go-github/v75 v75.0.0 h1:k7q8Bvg+W5KxRl9Tjq16a9XEgVY1pwuiG5sIL7435Ic= +github.com/google/go-github/v75 v75.0.0/go.mod h1:H3LUJEA1TCrzuUqtdAQniBNwuKiQIqdGKgBo1/M/uqI= +github.com/google/go-querystring v1.2.0 h1:yhqkPbu2/OH+V9BfpCVPZkNmUXhb2gBxJArfhIxNtP0= +github.com/google/go-querystring v1.2.0/go.mod h1:8IFJqpSRITyJ8QhQ13bmbeMBDfmeEJZD5A0egEOmkqU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.1.2/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/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +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/consul/api v1.13.0/go.mod h1:ZlVrynguJKcYr54zGaDbaL3fOvKC9m72FhPvA8T35KQ= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/copywrite v0.22.0 h1:mqjMrgP3VptS7aLbu2l39rtznoK+BhphHst6i7HiTAo= +github.com/hashicorp/copywrite v0.22.0/go.mod h1:FqvGJt2+yoYDpVYgFSdg3R2iyhkCVaBmPMhfso0MR2k= 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= github.com/hashicorp/go-checkpoint v0.5.0 h1:MFYpPZCnQqQTE18jFwSII6eUQrD/oxMFp3mlgcqk5mU= github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-cty v1.5.0 h1:EkQ/v+dDNUqnuVpmS5fPqyY71NXVgT5gf32+57xY8g0= github.com/hashicorp/go-cty v1.5.0/go.mod h1:lFUCG5kd8exDobgSfyj4ONE/dc822kiYMguVKdHGMLM= +github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= +github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= 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 v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= 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.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= 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-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= 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-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/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.1.0/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/hc-install v0.9.2 h1:v80EtNX4fCVHqzL9Lg/2xkp62bbvQMnvPQ0G+OmtO24= github.com/hashicorp/hc-install v0.9.2/go.mod h1:XUqBQNnuT4RsxoxiM9ZaUk0NX8hi2h+Lb6/c0OZnC/I= +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= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hashicorp/terraform-exec v0.24.0 h1:mL0xlk9H5g2bn0pPF6JQZk5YlByqSqrO5VoaNtAf8OE= github.com/hashicorp/terraform-exec v0.24.0/go.mod h1:lluc/rDYfAhYdslLJQg3J0oDqo88oGQAdHR+wDqFvo4= 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-codegen-framework v0.4.1 h1:eaI/3dsu2T5QAXbA+7N+B+UBj20GdtYnsRuYypKh3S4= +github.com/hashicorp/terraform-plugin-codegen-framework v0.4.1/go.mod h1:kpYM23L7NtcfaQdWAN0QFkV/lU0w16qJ2ddAPCI4zAg= +github.com/hashicorp/terraform-plugin-codegen-spec v0.2.0 h1:91dQG1A/DxP6vRz9GiytDTrZTXDbhHPvmpYnAyWA/Vw= +github.com/hashicorp/terraform-plugin-codegen-spec v0.2.0/go.mod h1:fywrEKpordQypmAjz/HIfm2LuNVmyJ6KDe8XT9GdJxQ= +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.17.0 h1:JdX50CFrYcYFY31gkmitAEAzLKoBgsK+iaJjDC8OexY= github.com/hashicorp/terraform-plugin-framework v1.17.0/go.mod h1:4OUXKdHNosX+ys6rLgVlgklfxN3WHR5VHSOABeS/BM0= github.com/hashicorp/terraform-plugin-framework-validators v0.19.0 h1:Zz3iGgzxe/1XBkooZCewS0nJAaCFPFPHdNJd8FgE4Ow= @@ -105,19 +272,54 @@ github.com/hashicorp/terraform-plugin-testing v1.14.0 h1:5t4VKrjOJ0rg0sVuSJ86dz5 github.com/hashicorp/terraform-plugin-testing v1.14.0/go.mod h1:1qfWkecyYe1Do2EEOK/5/WnTyvC8wQucUkkhiGLg5nk= 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.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ= -github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc= +github.com/hashicorp/terraform-svchost v0.2.0 h1:wVc2vMiodOHvNZcQw/3y9af1XSomgjGSv+rv3BMCk7I= +github.com/hashicorp/terraform-svchost v0.2.0/go.mod h1:/98rrS2yZsbppi4VGVCjwYmh8dqsKzISqK7Hli+0rcQ= +github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= +github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= 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/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= +github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= +github.com/hjson/hjson-go/v4 v4.0.0 h1:wlm6IYYqHjOdXH1gHev4VoXCaW20HdQAGCxdOEEg2cs= +github.com/hjson/hjson-go/v4 v4.0.0/go.mod h1:KaYt3bTw3zhBjYqnXkYywcYctk0A2nxeEFTse3rH13E= +github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= +github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= 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/jedib0t/go-pretty v4.3.0+incompatible h1:CGs8AVhEKg/n9YbUenWmNStRW2PHJzaeDodcfvRAbIo= +github.com/jedib0t/go-pretty v4.3.0+incompatible/go.mod h1:XemHduiw8R651AF9Pt4FwCTKeG3oo7hrHJAoznj9nag= +github.com/jedib0t/go-pretty/v6 v6.7.8 h1:BVYrDy5DPBA3Qn9ICT+PokP9cvCv1KaHv2i+Hc8sr5o= +github.com/jedib0t/go-pretty/v6 v6.7.8/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= 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/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +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/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 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.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/knadh/koanf v1.5.0 h1:q2TSd/3Pyc/5yP9ldIrSdIz26MCcyNQzW0pEAugLPNs= +github.com/knadh/koanf v1.5.0/go.mod h1:Hgyjp4y8v44hpZtPzs7JZfRAW5AhN7KfZcwv1RYggDs= +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.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 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= @@ -126,67 +328,148 @@ 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.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= 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.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= 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.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= +github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mergestat/timediff v0.0.4 h1:NZ3sqG/6K9flhTubdltmRx3RBfIiYv6LsGP+4FlXMM8= +github.com/mergestat/timediff v0.0.4/go.mod h1:yvMUaRu2oetc+9IbPLYBJviz6sA7xz8OXMDfhBl7YSI= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +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 v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= 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.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= 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 v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 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/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/npillmayer/nestext v0.1.3/go.mod h1:h2lrijH8jpicr25dFY+oAJLyzlya6jhnuG+zWp9L0Uk= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.2.0 h1:O8x3yXwah4A73hJdlrwo/2X6J62gE5qTMusH0dvz60E= github.com/oklog/run v1.2.0/go.mod h1:mgDbKRSwPhJfesJ4PntqFUbKQRZ50NgmZTSPlFA0YFk= -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/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +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/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= 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.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +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.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +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/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/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/rhnvrm/simples3 v0.6.1/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8dPGkC3sA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= 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/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= -github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/samber/lo v1.52.0 h1:Rvi+3BFHES3A8meP33VPAxiBZX/Aws5RxrschYGjomw= +github.com/samber/lo v1.52.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= 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.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +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/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= -github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= -github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= 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.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= -github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= +github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +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.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= -github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= -github.com/stackitcloud/stackit-sdk-go/core v0.20.1 h1:odiuhhRXmxvEvnVTeZSN9u98edvw2Cd3DcnkepncP3M= -github.com/stackitcloud/stackit-sdk-go/core v0.20.1/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0 h1:KgIRTw4gpxx8qoiaLGLbXPVDcBgCxPl60gigw+tizYc= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0/go.mod h1:fd13ANCU/Pye8uDd/6E0I605+6PYfHuVIQpPEK2Ph6c= +github.com/stackitcloud/stackit-sdk-go/core v0.21.0 h1:QXZqiaO7U/4IpTkJfzt4dt6QxJzG2uUS12mBnHpYNik= +github.com/stackitcloud/stackit-sdk-go/core v0.21.0/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= +github.com/stackitcloud/stackit-sdk-go/services/iaasalpha v0.1.23-alpha h1:ugpMOMUZGB0yXsWcfe97F7GCdjlexbjFuGD8ZeyMSts= +github.com/stackitcloud/stackit-sdk-go/services/iaasalpha v0.1.23-alpha/go.mod h1:v5VGvTxLcCdJJmblbhqYalt/MFHcElDfYoy15CMhaWs= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.1 h1:6MJdy1xmdE+uOo/F8mR5HSldjPSHpdhwuqS3u9m2EWQ= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.1/go.mod h1:XLr3ZfrT1g8ZZMm7A6RXOPBuhBkikdUN2o/+/Y+Hu+g= 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/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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= -github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= 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/thanhpk/randstr v1.0.6 h1:psAOktJFD4vV9NEVb3qkhRSMvYh4ORRaj1+w/hn4B+o= +github.com/thanhpk/randstr v1.0.6/go.mod h1:M/H2P1eNLZzlDwAzpkkkUvoyNNMbzRGhESZuEQk3r0U= 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= @@ -196,11 +479,32 @@ 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/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yuin/goldmark v1.1.27/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.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= +github.com/yuin/goldmark v1.7.8/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.17.0 h1:seZvECve6XX4tmnvRzWtJNHdscMtYEx5R7bnnVyd/d0= github.com/zclconf/go-cty v1.17.0/go.mod h1:wqFzcImaLTI6A5HfsRwB0nj5n0MRZFwmey8YoFPPs3U= 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.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.mongodb.org/mongo-driver v1.17.7 h1:a9w+U3Vt67eYzcfq3k/OAv284/uUUkL0uP75VE5rCOU= +go.mongodb.org/mongo-driver v1.17.7/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= 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.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= @@ -213,30 +517,99 @@ go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6 go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= -go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= 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-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +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.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= -golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= +golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= +golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +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/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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/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.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= +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/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +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-20190923162816-aa69164e4478/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-20200625001655-4c5254603344/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-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= -golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= +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-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= +golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= 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-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.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +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/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/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-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/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-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-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/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= @@ -246,43 +619,102 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2 h1:O1cMQHRfwNpDfDJerqRoE2oD+AFlyid87D40L/OkkJo= -golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2/go.mod h1:b7fPSJ0pKZ3ccUh8gnTONJxhn3c/PS6tyzQvyqw4iA8= +golang.org/x/telemetry v0.0.0-20260116145544-c6413dc483f5 h1:i0p03B68+xC1kD2QUO8JzDTPXCzhN56OLJ+IhHY8U3A= +golang.org/x/telemetry v0.0.0-20260116145544-c6413dc483f5/go.mod h1:b7fPSJ0pKZ3ccUh8gnTONJxhn3c/PS6tyzQvyqw4iA8= 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.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= -golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= +golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= +golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +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.5/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.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/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-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= -golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= +golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= +golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= 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/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.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-20251222181119-0a764e51fe1b h1:Mv8VFug0MP9e5vUxfBcE3vUkV6CImK3cMNMIDFjmzxU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260120221211-b8f7ae30c516 h1:sNrWoksmOyF5bvJUcnmbeAmQi8baNhqg5IWaI3llQqU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260120221211-b8f7ae30c516/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +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.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= +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.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 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/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= 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/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= 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.3/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.2.8/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.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/golang-ci.bck.yaml b/golang-ci.bck.yaml index 36ace61d..cbdc4197 100644 --- a/golang-ci.bck.yaml +++ b/golang-ci.bck.yaml @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + # This file contains all available configuration options # with their default values. diff --git a/golang-ci.yaml b/golang-ci.yaml index 4b50846f..42277a38 100644 --- a/golang-ci.yaml +++ b/golang-ci.yaml @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + version: "2" run: concurrency: 4 @@ -67,6 +70,8 @@ linters: - third_party$ - builtin$ - examples$ + - tools/copy.go + - tools/main.go formatters: enable: - gofmt diff --git a/main.go b/main.go index 97559f18..9adda418 100644 --- a/main.go +++ b/main.go @@ -21,7 +21,7 @@ func main() { flag.BoolVar(&debug, "debug", false, "allows debugging the provider") flag.Parse() err := providerserver.Serve(context.Background(), stackit.New(version), providerserver.ServeOpts{ - Address: "registry.terraform.io/mhenselin/stackitprivatepreview", + Address: "tfregistry.sysops.stackit.rocks/mhenselin/stackitprivatepreview", Debug: debug, }) if err != nil { diff --git a/pkg/albbeta/api_default_test.go b/pkg/albbeta/api_default_test.go index 6afff118..03da6aa7 100644 --- a/pkg/albbeta/api_default_test.go +++ b/pkg/albbeta/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT Application Load Balancer API diff --git a/pkg/albwafalpha/api_default_test.go b/pkg/albwafalpha/api_default_test.go index 5d8bc548..333489a1 100644 --- a/pkg/albwafalpha/api_default_test.go +++ b/pkg/albwafalpha/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT Application Load Balancer Web Application Firewall API diff --git a/pkg/cdnbeta/api_default_test.go b/pkg/cdnbeta/api_default_test.go index c91093a1..7f2518a7 100644 --- a/pkg/cdnbeta/api_default_test.go +++ b/pkg/cdnbeta/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* CDN API diff --git a/pkg/certificatesbeta/api_default_test.go b/pkg/certificatesbeta/api_default_test.go index c0617d09..25ab581c 100644 --- a/pkg/certificatesbeta/api_default_test.go +++ b/pkg/certificatesbeta/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT Application Load Balancer Certificates API diff --git a/pkg/edgebeta/api_default_test.go b/pkg/edgebeta/api_default_test.go index d5b03257..bcf1270c 100644 --- a/pkg/edgebeta/api_default_test.go +++ b/pkg/edgebeta/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT Edge Cloud API diff --git a/pkg/gitbeta/api_default_test.go b/pkg/gitbeta/api_default_test.go index 9d6c106e..52796c88 100644 --- a/pkg/gitbeta/api_default_test.go +++ b/pkg/gitbeta/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT Git API diff --git a/pkg/iaasalpha/api_default_test.go b/pkg/iaasalpha/api_default_test.go index e0ab157a..159cb9a3 100644 --- a/pkg/iaasalpha/api_default_test.go +++ b/pkg/iaasalpha/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT IaaS API diff --git a/pkg/iaasalpha/wait/wait.go b/pkg/iaasalpha/wait/wait.go index 6293355a..e2d8a613 100644 --- a/pkg/iaasalpha/wait/wait.go +++ b/pkg/iaasalpha/wait/wait.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package wait import ( diff --git a/pkg/iaasalpha/wait/wait_test.go b/pkg/iaasalpha/wait/wait_test.go index a9aba5b1..655ddbc7 100644 --- a/pkg/iaasalpha/wait/wait_test.go +++ b/pkg/iaasalpha/wait/wait_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package wait import ( diff --git a/pkg/iaasbeta/api_default_test.go b/pkg/iaasbeta/api_default_test.go index e36ae66c..c09d762b 100644 --- a/pkg/iaasbeta/api_default_test.go +++ b/pkg/iaasbeta/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT IaaS API diff --git a/pkg/intakebeta/api_default_test.go b/pkg/intakebeta/api_default_test.go index db9584f4..c32f115c 100644 --- a/pkg/intakebeta/api_default_test.go +++ b/pkg/intakebeta/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT Intake API diff --git a/pkg/kmsbeta/api_default_test.go b/pkg/kmsbeta/api_default_test.go index 2df61068..acff022b 100644 --- a/pkg/kmsbeta/api_default_test.go +++ b/pkg/kmsbeta/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT Key Management Service API diff --git a/pkg/logsalpha/api_default_test.go b/pkg/logsalpha/api_default_test.go index 27ed5249..d285b0b4 100644 --- a/pkg/logsalpha/api_default_test.go +++ b/pkg/logsalpha/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT Logs API diff --git a/pkg/logsbeta/api_default_test.go b/pkg/logsbeta/api_default_test.go index 5bc4fa7e..8289265b 100644 --- a/pkg/logsbeta/api_default_test.go +++ b/pkg/logsbeta/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT Logs API diff --git a/pkg/postgresflexalpha/api_default_test.go b/pkg/postgresflexalpha/api_default_test.go index 81f31fc1..6bb207a8 100644 --- a/pkg/postgresflexalpha/api_default_test.go +++ b/pkg/postgresflexalpha/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* PostgreSQL Flex API diff --git a/pkg/postgresflexalpha/model_create_instance_request_payload.go b/pkg/postgresflexalpha/model_create_instance_request_payload.go index da35858a..96d88b0c 100644 --- a/pkg/postgresflexalpha/model_create_instance_request_payload.go +++ b/pkg/postgresflexalpha/model_create_instance_request_payload.go @@ -17,26 +17,6 @@ import ( // checks if the CreateInstanceRequestPayload type satisfies the MappedNullable interface at compile time var _ MappedNullable = &CreateInstanceRequestPayload{} -/* - types and functions for acl -*/ - -// isModel -type CreateInstancePayloadGetAclAttributeType = *[]string -type CreateInstancePayloadGetAclArgType = *[]string -type CreateInstancePayloadGetAclRetType = []string - -func getCreateInstancePayloadGetAclAttributeTypeOk(arg CreateInstancePayloadGetAclAttributeType) (ret CreateInstancePayloadGetAclRetType, ok bool) { - if arg == nil { - return ret, false - } - return *arg, true -} - -func setCreateInstancePayloadGetAclAttributeType(arg *CreateInstancePayloadGetAclAttributeType, val CreateInstancePayloadGetAclRetType) { - *arg = &val -} - /* types and functions for backupSchedule */ @@ -223,8 +203,6 @@ type CreateInstanceRequestPayloadGetVersionRetType = string // CreateInstanceRequestPayload struct for CreateInstanceRequestPayload type CreateInstanceRequestPayload struct { - // REQUIRED - Acl CreateInstancePayloadGetAclAttributeType `json:"acl" required:"true"` // The schedule for on what time and how often the database backup will be created. The schedule is written as a cron schedule. // REQUIRED BackupSchedule CreateInstanceRequestPayloadGetBackupScheduleAttributeType `json:"backupSchedule" required:"true"` diff --git a/pkg/runcommandbeta/api_default_test.go b/pkg/runcommandbeta/api_default_test.go index a6d1cd09..45d6c073 100644 --- a/pkg/runcommandbeta/api_default_test.go +++ b/pkg/runcommandbeta/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT Run Commands Service API diff --git a/pkg/sfsbeta/api_default_test.go b/pkg/sfsbeta/api_default_test.go index 30c328a8..fec49be3 100644 --- a/pkg/sfsbeta/api_default_test.go +++ b/pkg/sfsbeta/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT File Storage (SFS) diff --git a/pkg/sqlserverflexalpha/api_default_test.go b/pkg/sqlserverflexalpha/api_default_test.go index bfa0f83c..5bc998dc 100644 --- a/pkg/sqlserverflexalpha/api_default_test.go +++ b/pkg/sqlserverflexalpha/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT MSSQL Service API diff --git a/pkg/vpnalpha/api_default_test.go b/pkg/vpnalpha/api_default_test.go index ba7159be..68c2ebcd 100644 --- a/pkg/vpnalpha/api_default_test.go +++ b/pkg/vpnalpha/api_default_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + /* STACKIT VPN API diff --git a/sample/postgres/outputs.tf b/sample/postgres/outputs.tf index bbe5490c..20982c6f 100644 --- a/sample/postgres/outputs.tf +++ b/sample/postgres/outputs.tf @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + output "postgres_flavor" { value = data.stackitprivatepreview_postgresflexalpha_flavor.pgsql_flavor.flavor_id } diff --git a/sample/postgres/postresql.tf b/sample/postgres/postresql.tf index db395a4a..01764ad8 100644 --- a/sample/postgres/postresql.tf +++ b/sample/postgres/postresql.tf @@ -1,9 +1,12 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + data "stackitprivatepreview_postgresflexalpha_flavor" "pgsql_flavor" { - project_id = var.project_id - region = "eu01" - cpu = 2 - ram = 4 - node_type = "Single" + project_id = var.project_id + region = "eu01" + cpu = 2 + ram = 4 + node_type = "Single" storage_class = "premium-perf2-stackit" } @@ -12,19 +15,19 @@ 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 - replicas = 1 + flavor_id = data.stackitprivatepreview_postgresflexalpha_flavor.pgsql_flavor.flavor_id + replicas = 1 storage = { # class = "premium-perf2-stackit" - performance_class = data.stackitprivatepreview_postgresflexalpha_flavor.pgsql_flavor.storage_class - size = 10 + 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 + 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 = { @@ -51,8 +54,8 @@ resource "stackitprivatepreview_postgresflexalpha_user" "ptlsdbuser" { } resource "stackitprivatepreview_postgresflexalpha_database" "example" { - count = 5 - depends_on = [stackitprivatepreview_postgresflexalpha_user.ptlsdbadminuser] + count = 5 + depends_on = [stackitprivatepreview_postgresflexalpha_user.ptlsdbadminuser] project_id = var.project_id instance_id = stackitprivatepreview_postgresflexalpha_instance.msh-sna-pe-example.instance_id name = "${var.db_name}${count.index}" @@ -70,11 +73,11 @@ resource "stackitprivatepreview_postgresflexalpha_database" "example" { # } output "psql_user_password" { - value = stackitprivatepreview_postgresflexalpha_user.ptlsdbuser.password + value = stackitprivatepreview_postgresflexalpha_user.ptlsdbuser.password sensitive = true } output "psql_user_conn" { - value = stackitprivatepreview_postgresflexalpha_user.ptlsdbuser.connection_string + value = stackitprivatepreview_postgresflexalpha_user.ptlsdbuser.connection_string sensitive = true } diff --git a/sample/postgres/providers.tf b/sample/postgres/providers.tf index c5171712..f338db74 100644 --- a/sample/postgres/providers.tf +++ b/sample/postgres/providers.tf @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + terraform { required_providers { # stackit = { @@ -5,8 +8,8 @@ terraform { # version = "~> 0.70" # } stackitprivatepreview = { - source = "registry.terraform.io/mhenselin/stackitprivatepreview" - version = "~> 0.1" + source = "tfregistry.sysops.stackit.rocks/mhenselin/stackitprivatepreview" + version = "0.0.0-SNAPSHOT-e91e10e" } } } diff --git a/sample/sqlserver/flavor.tf b/sample/sqlserver/flavor.tf index 667ead6f..f23c63a0 100644 --- a/sample/sqlserver/flavor.tf +++ b/sample/sqlserver/flavor.tf @@ -1,9 +1,12 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + data "stackitprivatepreview_sqlserverflexalpha_flavor" "sqlserver_flavor" { - project_id = var.project_id - region = "eu01" - cpu = 4 - ram = 16 - node_type = "Single" + project_id = var.project_id + region = "eu01" + cpu = 4 + ram = 16 + node_type = "Single" storage_class = "premium-perf2-stackit" } diff --git a/sample/sqlserver/providers.tf b/sample/sqlserver/providers.tf index c5171712..006aa58b 100644 --- a/sample/sqlserver/providers.tf +++ b/sample/sqlserver/providers.tf @@ -1,21 +1,24 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + terraform { required_providers { - # stackit = { - # source = "registry.terraform.io/stackitcloud/stackit" - # version = "~> 0.70" - # } + stackit = { + source = "registry.terraform.io/stackitcloud/stackit" + version = "~> 0.70" + } stackitprivatepreview = { - source = "registry.terraform.io/mhenselin/stackitprivatepreview" - version = "~> 0.1" + source = "tfregistry.sysops.stackit.rocks/mhenselin/stackitprivatepreview" + version = "0.0.0-SNAPSHOT-e91e10e" } } } -# provider "stackit" { -# default_region = "eu01" -# enable_beta_resources = true -# service_account_key_path = "./service_account.json" -# } +provider "stackit" { + default_region = "eu01" + enable_beta_resources = true + service_account_key_path = "../service_account.json" +} provider "stackitprivatepreview" { default_region = "eu01" diff --git a/sample/sqlserver/sqlserver.tf b/sample/sqlserver/sqlserver.tf index 4206b0fc..984a0464 100644 --- a/sample/sqlserver/sqlserver.tf +++ b/sample/sqlserver/sqlserver.tf @@ -1,40 +1,44 @@ -# resource "stackit_kms_keyring" "keyring" { -# project_id = var.project_id -# display_name = "msh-keyring01" -# description = "This is a test keyring for private endpoints" -# } -# -# resource "stackit_kms_key" "key" { -# project_id = var.project_id -# keyring_id = stackit_kms_keyring.keyring.keyring_id -# display_name = "msh-key01" -# protection = "software" -# algorithm = "aes_256_gcm" -# purpose = "symmetric_encrypt_decrypt" -# access_scope = "SNA" -# } +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 -# output "keyid" { -# value = stackit_kms_key.key.key_id -# } +resource "stackit_kms_keyring" "keyring" { + project_id = var.project_id + display_name = "msh-keyring01" + description = "This is a test keyring for private endpoints" +} + +resource "stackit_kms_key" "key" { + project_id = var.project_id + keyring_id = stackit_kms_keyring.keyring.keyring_id + display_name = "msh-key01" + protection = "software" + algorithm = "aes_256_gcm" + purpose = "symmetric_encrypt_decrypt" + access_scope = "SNA" +} + +output "keyid" { + value = stackit_kms_key.key.key_id +} resource "stackitprivatepreview_sqlserverflexalpha_instance" "sqlsrv" { project_id = var.project_id name = "msh-example-instance-002" backup_schedule = "0 3 * * *" retention_days = 31 - flavor_id = data.stackitprivatepreview_sqlserverflexalpha_flavor.sqlserver_flavor.flavor_id + flavor_id = data.stackitprivatepreview_sqlserverflexalpha_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_id = var.key_id - keyring_id = var.keyring_id - key_version = var.key_version + key_id = stackit_kms_key.key.key_id + keyring_id = stackit_kms_keyring.keyring.keyring_id + #key_id = var.key_id + #keyring_id = var.keyring_id + #key_version = var.key_version + key_version = 1 service_account = var.sa_email } network = { diff --git a/sample/tf.sh b/sample/tf.sh index acec7988..c5565b17 100755 --- a/sample/tf.sh +++ b/sample/tf.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + # ./tf.sh apply > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2) diff --git a/scripts/check-docs.sh b/scripts/check-docs.sh index 7d50bc26..6ae91059 100755 --- a/scripts/check-docs.sh +++ b/scripts/check-docs.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + # This script is used to ensure for PRs the docs are up-to-date via the CI pipeline # Usage: ./check-docs.sh diff --git a/scripts/lint-golangci-lint.sh b/scripts/lint-golangci-lint.sh index c2ffd78f..01d7e429 100755 --- a/scripts/lint-golangci-lint.sh +++ b/scripts/lint-golangci-lint.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + # This script lints the SDK modules and the internal examples # Pre-requisites: golangci-lint set -eo pipefail diff --git a/scripts/project.sh b/scripts/project.sh index 3a810b49..6db3a30c 100755 --- a/scripts/project.sh +++ b/scripts/project.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + # This script is used to manage the project, only used for installing the required tools for now # Usage: ./project.sh [action] diff --git a/scripts/replace.sh b/scripts/replace.sh index 9326b1f7..9a0a5aba 100755 --- a/scripts/replace.sh +++ b/scripts/replace.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + # Add replace directives to local files to go.work set -eo pipefail diff --git a/scripts/tfplugindocs.sh b/scripts/tfplugindocs.sh index 18ac6ad8..1dd6d667 100755 --- a/scripts/tfplugindocs.sh +++ b/scripts/tfplugindocs.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + # Pre-requisites: tfplugindocs set -eo pipefail diff --git a/service_specs/postgres-flex_database_config.yml b/service_specs/postgres-flex_database_config.yml index bde8b2ee..d5f59497 100644 --- a/service_specs/postgres-flex_database_config.yml +++ b/service_specs/postgres-flex_database_config.yml @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + provider: name: stackitprivatepreview diff --git a/service_specs/postgres-flex_flavor_config.yml b/service_specs/postgres-flex_flavors_config.yml similarity index 69% rename from service_specs/postgres-flex_flavor_config.yml rename to service_specs/postgres-flex_flavors_config.yml index 34f69a4d..8d82e021 100644 --- a/service_specs/postgres-flex_flavor_config.yml +++ b/service_specs/postgres-flex_flavors_config.yml @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + provider: name: stackitprivatepreview diff --git a/service_specs/postgres-flex_instance_config.yml b/service_specs/postgres-flex_instance_config.yml index 43af7151..e3dcd8a4 100644 --- a/service_specs/postgres-flex_instance_config.yml +++ b/service_specs/postgres-flex_instance_config.yml @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + provider: name: stackitprivatepreview diff --git a/service_specs/postgres-flex_role_config.yml b/service_specs/postgres-flex_role_config.yml index f1fce784..2af517c3 100644 --- a/service_specs/postgres-flex_role_config.yml +++ b/service_specs/postgres-flex_role_config.yml @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + provider: name: stackitprivatepreview diff --git a/service_specs/postgres-flex_user_config.yml b/service_specs/postgres-flex_user_config.yml index 5b5b844d..d360877e 100644 --- a/service_specs/postgres-flex_user_config.yml +++ b/service_specs/postgres-flex_user_config.yml @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + provider: name: stackitprivatepreview diff --git a/service_specs/postgres-flex_version_config.yml b/service_specs/postgres-flex_version_config.yml index a17433cb..2fb6a3d1 100644 --- a/service_specs/postgres-flex_version_config.yml +++ b/service_specs/postgres-flex_version_config.yml @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + provider: name: stackitprivatepreview diff --git a/service_specs/sqlserverflex_database_config.yml b/service_specs/sqlserverflex_database_config.yml index f6a437a9..e6a0e154 100644 --- a/service_specs/sqlserverflex_database_config.yml +++ b/service_specs/sqlserverflex_database_config.yml @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + provider: name: stackitprivatepreview diff --git a/service_specs/sqlserverflex_flavor_config.yml b/service_specs/sqlserverflex_flavors_config.yml similarity index 64% rename from service_specs/sqlserverflex_flavor_config.yml rename to service_specs/sqlserverflex_flavors_config.yml index 1850e2da..8d82e021 100644 --- a/service_specs/sqlserverflex_flavor_config.yml +++ b/service_specs/sqlserverflex_flavors_config.yml @@ -1,8 +1,11 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + provider: name: stackitprivatepreview data_sources: - flavor: + flavors: read: path: /v3alpha1/projects/{projectId}/regions/{region}/flavors method: GET diff --git a/service_specs/sqlserverflex_instance_config.yml b/service_specs/sqlserverflex_instance_config.yml index 94aa7fe9..8c593393 100644 --- a/service_specs/sqlserverflex_instance_config.yml +++ b/service_specs/sqlserverflex_instance_config.yml @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + provider: name: stackitprivatepreview diff --git a/service_specs/sqlserverflex_user_config.yml b/service_specs/sqlserverflex_user_config.yml index f98d5053..aa3b07f2 100644 --- a/service_specs/sqlserverflex_user_config.yml +++ b/service_specs/sqlserverflex_user_config.yml @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + provider: name: stackitprivatepreview diff --git a/service_specs/sqlserverflex_version_config.yml b/service_specs/sqlserverflex_version_config.yml index 1b2f5c13..4003893a 100644 --- a/service_specs/sqlserverflex_version_config.yml +++ b/service_specs/sqlserverflex_version_config.yml @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + provider: name: stackitprivatepreview diff --git a/stackit/internal/services/postgresflexalpha/database/datasource.go b/stackit/internal/services/postgresflexalpha/database/datasource.go index 3a9897f1..76189970 100644 --- a/stackit/internal/services/postgresflexalpha/database/datasource.go +++ b/stackit/internal/services/postgresflexalpha/database/datasource.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( diff --git a/stackit/internal/services/postgresflexalpha/database/functions.go b/stackit/internal/services/postgresflexalpha/database/functions.go index 07d79e37..43eea60f 100644 --- a/stackit/internal/services/postgresflexalpha/database/functions.go +++ b/stackit/internal/services/postgresflexalpha/database/functions.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( diff --git a/stackit/internal/services/postgresflexalpha/database/functions_test.go b/stackit/internal/services/postgresflexalpha/database/functions_test.go index 7de0937d..f460cf23 100644 --- a/stackit/internal/services/postgresflexalpha/database/functions_test.go +++ b/stackit/internal/services/postgresflexalpha/database/functions_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( diff --git a/stackit/internal/services/postgresflexalpha/database/resource.go b/stackit/internal/services/postgresflexalpha/database/resource.go index 3f73f495..e53d6540 100644 --- a/stackit/internal/services/postgresflexalpha/database/resource.go +++ b/stackit/internal/services/postgresflexalpha/database/resource.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( diff --git a/stackit/internal/services/postgresflexalpha/database/resource_test.go b/stackit/internal/services/postgresflexalpha/database/resource_test.go index c4150d47..b37313b0 100644 --- a/stackit/internal/services/postgresflexalpha/database/resource_test.go +++ b/stackit/internal/services/postgresflexalpha/database/resource_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( diff --git a/stackit/internal/services/postgresflexalpha/flavor/datasource.go b/stackit/internal/services/postgresflexalpha/flavor/datasource.go index b7ed25ee..ea600410 100644 --- a/stackit/internal/services/postgresflexalpha/flavor/datasource.go +++ b/stackit/internal/services/postgresflexalpha/flavor/datasource.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresFlexAlphaFlavor import ( @@ -10,7 +13,7 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types/basetypes" "github.com/mhenselin/terraform-provider-stackitprivatepreview/pkg/postgresflexalpha" "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/conversion" - postgresflex "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha" + postgresflexalphaGen "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/flavors/datasources_gen" postgresflexUtils "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/utils" "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/utils" @@ -143,9 +146,9 @@ func (r *flavorDataSource) Schema(ctx context.Context, _ datasource.SchemaReques Computed: true, }, }, - CustomType: postgresflex.StorageClassesType{ + CustomType: postgresflexalphaGen.StorageClassesType{ ObjectType: types.ObjectType{ - AttrTypes: postgresflex.StorageClassesValue{}.AttributeTypes(ctx), + AttrTypes: postgresflexalphaGen.StorageClassesValue{}.AttributeTypes(ctx), }, }, }, @@ -210,9 +213,9 @@ func (r *flavorDataSource) Read(ctx context.Context, req datasource.ReadRequest, model.MinGb = types.Int64Value(*f.MinGB) if f.StorageClasses == nil { - model.StorageClasses = types.ListNull(postgresflex.StorageClassesType{ + model.StorageClasses = types.ListNull(postgresflexalphaGen.StorageClassesType{ ObjectType: basetypes.ObjectType{ - AttrTypes: postgresflex.StorageClassesValue{}.AttributeTypes(ctx), + AttrTypes: postgresflexalphaGen.StorageClassesValue{}.AttributeTypes(ctx), }, }) } else { @@ -220,8 +223,8 @@ func (r *flavorDataSource) Read(ctx context.Context, req datasource.ReadRequest, for _, sc := range *f.StorageClasses { scList = append( scList, - postgresflex.NewStorageClassesValueMust( - postgresflex.StorageClassesValue{}.AttributeTypes(ctx), + postgresflexalphaGen.NewStorageClassesValueMust( + postgresflexalphaGen.StorageClassesValue{}.AttributeTypes(ctx), map[string]attr.Value{ "class": types.StringValue(*sc.Class), "max_io_per_sec": types.Int64Value(*sc.MaxIoPerSec), @@ -231,9 +234,9 @@ func (r *flavorDataSource) Read(ctx context.Context, req datasource.ReadRequest, ) } storageClassesList := types.ListValueMust( - postgresflex.StorageClassesType{ + postgresflexalphaGen.StorageClassesType{ ObjectType: basetypes.ObjectType{ - AttrTypes: postgresflex.StorageClassesValue{}.AttributeTypes(ctx), + AttrTypes: postgresflexalphaGen.StorageClassesValue{}.AttributeTypes(ctx), }, }, scList, diff --git a/stackit/internal/services/postgresflexalpha/flavor/functions.go b/stackit/internal/services/postgresflexalpha/flavor/functions.go index 0c8b5105..0a811d51 100644 --- a/stackit/internal/services/postgresflexalpha/flavor/functions.go +++ b/stackit/internal/services/postgresflexalpha/flavor/functions.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresFlexAlphaFlavor import ( diff --git a/stackit/internal/services/postgresflexalpha/flavor/functions_test.go b/stackit/internal/services/postgresflexalpha/flavor/functions_test.go index c6f6c5f8..ecc90ebb 100644 --- a/stackit/internal/services/postgresflexalpha/flavor/functions_test.go +++ b/stackit/internal/services/postgresflexalpha/flavor/functions_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresFlexAlphaFlavor import ( diff --git a/stackit/internal/services/postgresflexalpha/flavors/datasource.go b/stackit/internal/services/postgresflexalpha/flavors/datasource.go new file mode 100644 index 00000000..3cc3ab29 --- /dev/null +++ b/stackit/internal/services/postgresflexalpha/flavors/datasource.go @@ -0,0 +1,73 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + +package postgresflexalpha + +import ( + "context" + + "github.com/hashicorp/terraform-plugin-framework/datasource" + "github.com/hashicorp/terraform-plugin-log/tflog" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/pkg/postgresflexalpha" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/conversion" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/core" + postgresflexalphaGen "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/flavors/datasources_gen" + postgresflexUtils "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/utils" +) + +var ( + _ datasource.DataSource = &flavorsDataSource{} + _ datasource.DataSourceWithConfigure = &flavorsDataSource{} +) + +func NewFlavorsDataSource() datasource.DataSource { + return &flavorsDataSource{} +} + +type flavorsDataSource struct { + client *postgresflexalpha.APIClient + providerData core.ProviderData +} + +func (d *flavorsDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { + resp.TypeName = req.ProviderTypeName + "_postgresflexalpha_flavors" +} + +func (d *flavorsDataSource) Schema(ctx context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) { + resp.Schema = postgresflexalphaGen.FlavorsDataSourceSchema(ctx) +} + +// Configure adds the provider configured client to the data source. +func (d *flavorsDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { + var ok bool + d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + if !ok { + return + } + + apiClient := postgresflexUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) + if resp.Diagnostics.HasError() { + return + } + d.client = apiClient + tflog.Info(ctx, "Postgres Flex version client configured") +} + +func (d *flavorsDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { + var data postgresflexalphaGen.FlavorsModel + + // Read Terraform configuration data into the model + resp.Diagnostics.Append(req.Config.Get(ctx, &data)...) + + if resp.Diagnostics.HasError() { + return + } + + // Todo: Read API call logic + + // Example data value setting + // data.Id = types.StringValue("example-id") + + // Save data into Terraform state + resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) +} diff --git a/stackit/internal/services/postgresflexalpha/flavor_data_source_gen.go b/stackit/internal/services/postgresflexalpha/flavors/datasources_gen/flavors_data_source_gen.go similarity index 97% rename from stackit/internal/services/postgresflexalpha/flavor_data_source_gen.go rename to stackit/internal/services/postgresflexalpha/flavors/datasources_gen/flavors_data_source_gen.go index 9e0f567e..924d1375 100644 --- a/stackit/internal/services/postgresflexalpha/flavor_data_source_gen.go +++ b/stackit/internal/services/postgresflexalpha/flavors/datasources_gen/flavors_data_source_gen.go @@ -1,12 +1,10 @@ // Code generated by terraform-plugin-framework-generator DO NOT EDIT. -package postgresflex +package postgresflexalpha import ( "context" "fmt" - "strings" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/diag" @@ -14,42 +12,18 @@ import ( "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 FlavorDataSourceSchema(ctx context.Context) schema.Schema { +func FlavorsDataSourceSchema(ctx context.Context) schema.Schema { return schema.Schema{ Attributes: map[string]schema.Attribute{ - "cpu": schema.Int64Attribute{ - Optional: true, - Computed: true, - //Description: "The cpu count of the instance.", - //MarkdownDescription: "The cpu count of the instance.", - }, - "ram": schema.Int64Attribute{ - Optional: true, - Computed: true, - //Description: "The cpu count of the instance.", - //MarkdownDescription: "The cpu count of the instance.", - }, - "node_type": schema.StringAttribute{ - Optional: true, - Computed: true, - //Description: "The cpu count of the instance.", - //MarkdownDescription: "The cpu count of the instance.", - }, - "storage_class": schema.StringAttribute{ - Optional: true, - Computed: true, - //Description: "The cpu count of the instance.", - //MarkdownDescription: "The cpu count of the instance.", - }, "flavors": schema.ListNestedAttribute{ NestedObject: schema.NestedAttributeObject{ Attributes: map[string]schema.Attribute{ "cpu": schema.Int64Attribute{ - Optional: true, Computed: true, Description: "The cpu count of the instance.", MarkdownDescription: "The cpu count of the instance.", @@ -70,7 +44,6 @@ func FlavorDataSourceSchema(ctx context.Context) schema.Schema { MarkdownDescription: "maximum storage which can be ordered for the flavor in Gigabyte.", }, "memory": schema.Int64Attribute{ - Optional: true, Computed: true, Description: "The memory of the instance in Gibibyte.", MarkdownDescription: "The memory of the instance in Gibibyte.", @@ -81,7 +54,6 @@ func FlavorDataSourceSchema(ctx context.Context) schema.Schema { MarkdownDescription: "minimum storage which is required to order in Gigabyte.", }, "node_type": schema.StringAttribute{ - Optional: true, Computed: true, Description: "defines the nodeType it can be either single or replica", MarkdownDescription: "defines the nodeType it can be either single or replica", @@ -205,9 +177,6 @@ func FlavorDataSourceSchema(ctx context.Context) schema.Schema { } type FlavorsModel struct { - Cpu types.Int64 `tfsdk:"cpu"` - Ram types.Int64 `tfsdk:"ram"` - NodeType types.String `tfsdk:"node_type"` Flavors types.List `tfsdk:"flavors"` Page types.Int64 `tfsdk:"page"` Pagination PaginationValue `tfsdk:"pagination"` diff --git a/stackit/internal/services/postgresflexalpha/instance/datasource.go b/stackit/internal/services/postgresflexalpha/instance/datasource.go index 498ce251..f7442f8a 100644 --- a/stackit/internal/services/postgresflexalpha/instance/datasource.go +++ b/stackit/internal/services/postgresflexalpha/instance/datasource.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( diff --git a/stackit/internal/services/postgresflexalpha/instance/functions.go b/stackit/internal/services/postgresflexalpha/instance/functions.go index 4bab64aa..79d3e9c8 100644 --- a/stackit/internal/services/postgresflexalpha/instance/functions.go +++ b/stackit/internal/services/postgresflexalpha/instance/functions.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( @@ -6,6 +9,7 @@ import ( "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-framework/types/basetypes" postgresflex "github.com/mhenselin/terraform-provider-stackitprivatepreview/pkg/postgresflexalpha" postgresflexalphadatasource "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/instance/datasources_gen" postgresflexalpharesource "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/instance/resources_gen" @@ -15,7 +19,7 @@ import ( func mapGetInstanceResponseToModel(ctx context.Context, m *postgresflexalpharesource.InstanceModel, resp *postgresflex.GetInstanceResponse) error { m.BackupSchedule = types.StringValue(resp.GetBackupSchedule()) // need to leave out encryption, as the GetInstance endpoint does not provide it - //m.Encryption = postgresflexalpharesource.NewEncryptionValueMust( + // m.Encryption = postgresflexalpharesource.NewEncryptionValueMust( // m.Encryption.AttributeTypes(ctx), // map[string]attr.Value{ // "kek_key_id": types.StringValue(resp.Encryption.GetKekKeyId()), @@ -23,13 +27,17 @@ func mapGetInstanceResponseToModel(ctx context.Context, m *postgresflexalphareso // "kek_key_version": types.StringValue(resp.Encryption.GetKekKeyVersion()), // "service_account": types.StringValue(resp.Encryption.GetServiceAccount()), // }, - //) + // ) m.FlavorId = types.StringValue(resp.GetFlavorId()) if m.Id.IsNull() || m.Id.IsUnknown() { m.Id = utils.BuildInternalTerraformId(m.ProjectId.ValueString(), m.Region.ValueString(), m.InstanceId.ValueString()) } m.InstanceId = types.StringPointerValue(resp.Id) - m.IsDeletable = types.BoolValue(resp.GetIsDeletable()) + + m.IsDeletable = types.BoolUnknown() + if isDel, ok := resp.GetIsDeletableOk(); ok { + m.IsDeletable = types.BoolValue(isDel) + } m.Name = types.StringValue(resp.GetName()) netAcl, diags := types.ListValueFrom(ctx, types.StringType, resp.Network.GetAcl()) @@ -37,13 +45,23 @@ func mapGetInstanceResponseToModel(ctx context.Context, m *postgresflexalphareso return fmt.Errorf("failed converting network acl from response") } + netInstAdd := types.StringUnknown() + if instAdd, ok := resp.Network.GetInstanceAddressOk(); ok { + netInstAdd = types.StringValue(instAdd) + } + + netRtrAdd := types.StringUnknown() + if rtrAdd, ok := resp.Network.GetRouterAddressOk(); ok { + netRtrAdd = types.StringValue(rtrAdd) + } + net, diags := postgresflexalpharesource.NewNetworkValue( postgresflexalpharesource.NetworkValue{}.AttributeTypes(ctx), map[string]attr.Value{ - "access_scope": types.StringValue(string(resp.Network.GetAccessScope())), + "access_scope": basetypes.NewStringValue(string(resp.Network.GetAccessScope())), "acl": netAcl, - "instance_address": types.StringValue(resp.Network.GetInstanceAddress()), - "router_address": types.StringValue(resp.Network.GetRouterAddress()), + "instance_address": netInstAdd, + "router_address": netRtrAdd, }, ) if diags.HasError() { @@ -53,7 +71,13 @@ func mapGetInstanceResponseToModel(ctx context.Context, m *postgresflexalphareso m.Network = net m.Replicas = types.Int64Value(int64(resp.GetReplicas())) m.RetentionDays = types.Int64Value(resp.GetRetentionDays()) - m.Status = types.StringValue(string(resp.GetStatus())) + + m.Name = types.StringValue(resp.GetName()) + + m.Status = types.StringUnknown() + if status, ok := resp.GetStatusOk(); ok { + m.Status = types.StringValue(string(status)) + } storage, diags := postgresflexalpharesource.NewStorageValue( postgresflexalpharesource.StorageValue{}.AttributeTypes(ctx), @@ -66,18 +90,20 @@ func mapGetInstanceResponseToModel(ctx context.Context, m *postgresflexalphareso return fmt.Errorf("failed converting storage from response") } m.Storage = storage + m.Version = types.StringValue(resp.GetVersion()) return nil } func mapGetDataInstanceResponseToModel(ctx context.Context, m *postgresflexalphadatasource.InstanceModel, resp *postgresflex.GetInstanceResponse) error { m.BackupSchedule = types.StringValue(resp.GetBackupSchedule()) - //m.Encryption = postgresflexalpharesource.EncryptionValue{ + //nolint:gocritic + // m.Encryption = postgresflexalpharesource.EncryptionValue{ // KekKeyId: types.StringValue(resp.Encryption.GetKekKeyId()), // KekKeyRingId: types.StringValue(resp.Encryption.GetKekKeyRingId()), // KekKeyVersion: types.StringValue(resp.Encryption.GetKekKeyVersion()), // ServiceAccount: types.StringValue(resp.Encryption.GetServiceAccount()), - //} + // } m.FlavorId = types.StringValue(resp.GetFlavorId()) m.Id = utils.BuildInternalTerraformId(m.ProjectId.ValueString(), m.Region.ValueString(), m.InstanceId.ValueString()) m.InstanceId = types.StringPointerValue(resp.Id) diff --git a/stackit/internal/services/postgresflexalpha/instance/functions_test.go b/stackit/internal/services/postgresflexalpha/instance/functions_test.go index 9daee9b7..1b325579 100644 --- a/stackit/internal/services/postgresflexalpha/instance/functions_test.go +++ b/stackit/internal/services/postgresflexalpha/instance/functions_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( diff --git a/stackit/internal/services/postgresflexalpha/instance/models.go b/stackit/internal/services/postgresflexalpha/instance/models.go deleted file mode 100644 index 708e5875..00000000 --- a/stackit/internal/services/postgresflexalpha/instance/models.go +++ /dev/null @@ -1,63 +0,0 @@ -package postgresflexalpha - -import ( - "github.com/hashicorp/terraform-plugin-framework/attr" - "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/hashicorp/terraform-plugin-framework/types/basetypes" -) - -type Model struct { - Id types.String `tfsdk:"id"` // needed by TF - InstanceId types.String `tfsdk:"instance_id"` - ProjectId types.String `tfsdk:"project_id"` - Name types.String `tfsdk:"name"` - BackupSchedule types.String `tfsdk:"backup_schedule"` - FlavorId types.String `tfsdk:"flavor_id"` - Replicas types.Int64 `tfsdk:"replicas"` - RetentionDays types.Int64 `tfsdk:"retention_days"` - Storage types.Object `tfsdk:"storage"` - Version types.String `tfsdk:"version"` - Region types.String `tfsdk:"region"` - Encryption types.Object `tfsdk:"encryption"` - Network types.Object `tfsdk:"network"` -} - -type encryptionModel struct { - KeyRingId types.String `tfsdk:"keyring_id"` - KeyId types.String `tfsdk:"key_id"` - KeyVersion types.String `tfsdk:"key_version"` - ServiceAccount types.String `tfsdk:"service_account"` -} - -var encryptionTypes = map[string]attr.Type{ - "keyring_id": basetypes.StringType{}, - "key_id": basetypes.StringType{}, - "key_version": basetypes.StringType{}, - "service_account": basetypes.StringType{}, -} - -type networkModel struct { - ACL types.List `tfsdk:"acl"` - AccessScope types.String `tfsdk:"access_scope"` - InstanceAddress types.String `tfsdk:"instance_address"` - RouterAddress types.String `tfsdk:"router_address"` -} - -var networkTypes = map[string]attr.Type{ - "acl": basetypes.ListType{ElemType: types.StringType}, - "access_scope": basetypes.StringType{}, - "instance_address": basetypes.StringType{}, - "router_address": basetypes.StringType{}, -} - -// Struct corresponding to Model.Storage -type storageModel struct { - Class types.String `tfsdk:"class"` - Size types.Int64 `tfsdk:"size"` -} - -// Types corresponding to storageModel -var storageTypes = map[string]attr.Type{ - "class": basetypes.StringType{}, - "size": basetypes.Int64Type{}, -} diff --git a/stackit/internal/services/postgresflexalpha/instance/resource.go b/stackit/internal/services/postgresflexalpha/instance/resource.go index 603e7182..f363b339 100644 --- a/stackit/internal/services/postgresflexalpha/instance/resource.go +++ b/stackit/internal/services/postgresflexalpha/instance/resource.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( @@ -9,9 +12,6 @@ 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/resource/schema/stringplanmodifier" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" postgresflex "github.com/mhenselin/terraform-provider-stackitprivatepreview/pkg/postgresflexalpha" @@ -47,7 +47,6 @@ type instanceResource struct { func (r *instanceResource) ValidateConfig(ctx context.Context, req resource.ValidateConfigRequest, resp *resource.ValidateConfigResponse) { var data postgresflexalpha.InstanceModel - // var data Model resp.Diagnostics.Append(req.Config.Get(ctx, &data)...) if resp.Diagnostics.HasError() { @@ -68,7 +67,6 @@ func (r *instanceResource) ValidateConfig(ctx context.Context, req resource.Vali // Use the modifier to set the effective region in the current plan. func (r *instanceResource) ModifyPlan(ctx context.Context, req resource.ModifyPlanRequest, resp *resource.ModifyPlanResponse) { // nolint:gocritic // function signature required by Terraform var configModel postgresflexalpha.InstanceModel - // var configModel Model // skip initial empty configuration to avoid follow-up errors if req.Config.Raw.IsNull() { return @@ -79,7 +77,6 @@ func (r *instanceResource) ModifyPlan(ctx context.Context, req resource.ModifyPl } var planModel postgresflexalpha.InstanceModel - // var planModel Model resp.Diagnostics.Append(req.Plan.Get(ctx, &planModel)...) if resp.Diagnostics.HasError() { return @@ -124,16 +121,6 @@ func (r *instanceResource) Configure( // Schema defines the schema for the resource. func (r *instanceResource) Schema(ctx context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { resp.Schema = postgresflexalpha.InstanceResourceSchema(ctx) - resp.Schema = addPlanModifiers(resp.Schema) -} - -func addPlanModifiers(s schema.Schema) schema.Schema { - attr := s.Attributes["backup_schedule"].(schema.StringAttribute) - attr.PlanModifiers = []planmodifier.String{ - stringplanmodifier.UseStateForUnknown(), - } - s.Attributes["backup_schedule"] = attr - return s } // Create creates the resource and sets the initial Terraform state. @@ -143,7 +130,7 @@ func (r *instanceResource) Create( resp *resource.CreateResponse, ) { // nolint:gocritic // function signature required by Terraform var model postgresflexalpha.InstanceModel - //var model Model + diags := req.Plan.Get(ctx, &model) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -211,7 +198,6 @@ func (r *instanceResource) Create( func modelToCreateInstancePayload(netAcl []string, model postgresflexalpha.InstanceModel, replVal int32) postgresflex.CreateInstanceRequestPayload { payload := postgresflex.CreateInstanceRequestPayload{ - Acl: &netAcl, BackupSchedule: model.BackupSchedule.ValueStringPointer(), Encryption: &postgresflex.InstanceEncryption{ KekKeyId: model.Encryption.KekKeyId.ValueStringPointer(), @@ -243,7 +229,6 @@ func modelToCreateInstancePayload(netAcl []string, model postgresflexalpha.Insta // Read refreshes the Terraform state with the latest data. func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { // nolint:gocritic // function signature required by Terraform var model postgresflexalpha.InstanceModel - //var model Model diags := req.State.Get(ctx, &model) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -290,7 +275,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r // Update updates the resource and sets the updated Terraform state on success. func (r *instanceResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { // nolint:gocritic // function signature required by Terraform var model postgresflexalpha.InstanceModel - //var model Model + diags := req.Plan.Get(ctx, &model) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -312,7 +297,13 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques if diag.HasError() { return } - replInt32 := int32(model.Replicas.ValueInt64()) + + if model.Replicas.ValueInt64() > math.MaxInt32 { + resp.Diagnostics.AddError("invalid int32 value", "provided int64 value does not fit into int32") + return + } + replInt32 := int32(model.Replicas.ValueInt64()) // nolint:gosec // check is performed above + payload := postgresflex.UpdateInstancePartiallyRequestPayload{ BackupSchedule: model.BackupSchedule.ValueStringPointer(), FlavorId: model.FlavorId.ValueStringPointer(), @@ -368,7 +359,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques // Delete deletes the resource and removes the Terraform state on success. func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { // nolint:gocritic // function signature required by Terraform var model postgresflexalpha.InstanceModel - //var model Model + diags := req.State.Get(ctx, &model) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { diff --git a/stackit/internal/services/postgresflexalpha/instance/resource_test.go b/stackit/internal/services/postgresflexalpha/instance/resource_test.go index 46d935a5..6adda61b 100644 --- a/stackit/internal/services/postgresflexalpha/instance/resource_test.go +++ b/stackit/internal/services/postgresflexalpha/instance/resource_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( diff --git a/stackit/internal/services/postgresflexalpha/instance/schema_test.go b/stackit/internal/services/postgresflexalpha/instance/schema_test.go index ec567d75..04805921 100644 --- a/stackit/internal/services/postgresflexalpha/instance/schema_test.go +++ b/stackit/internal/services/postgresflexalpha/instance/schema_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( diff --git a/stackit/internal/services/postgresflexalpha/main.go b/stackit/internal/services/postgresflexalpha/main.go new file mode 100644 index 00000000..24e4af4d --- /dev/null +++ b/stackit/internal/services/postgresflexalpha/main.go @@ -0,0 +1,4 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + +package postgresflexalpha diff --git a/stackit/internal/services/postgresflexalpha/postgresflex_acc_test.go b/stackit/internal/services/postgresflexalpha/postgresflex_acc_test.go index c7cd9096..e79cf893 100644 --- a/stackit/internal/services/postgresflexalpha/postgresflex_acc_test.go +++ b/stackit/internal/services/postgresflexalpha/postgresflex_acc_test.go @@ -1,6 +1,6 @@ // Copyright (c) STACKIT -package postgresflex_test +package postgresflexalpha_test import ( "context" @@ -23,7 +23,7 @@ import ( var ( //go:embed testdata/resource-complete.tf - resourceSecurityGroupMinConfig string + resourceSecurityGroupMinConfig string //nolint:unused // needs implementation ) // Instance resource data diff --git a/stackit/internal/services/postgresflexalpha/testdata/resource-complete.tf b/stackit/internal/services/postgresflexalpha/testdata/resource-complete.tf index e69de29b..d9bbe394 100644 --- a/stackit/internal/services/postgresflexalpha/testdata/resource-complete.tf +++ b/stackit/internal/services/postgresflexalpha/testdata/resource-complete.tf @@ -0,0 +1,3 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + diff --git a/stackit/internal/services/postgresflexalpha/user/datasource.go b/stackit/internal/services/postgresflexalpha/user/datasource.go index b99fe911..ed5aa21b 100644 --- a/stackit/internal/services/postgresflexalpha/user/datasource.go +++ b/stackit/internal/services/postgresflexalpha/user/datasource.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( diff --git a/stackit/internal/services/postgresflexalpha/user/datasource_test.go b/stackit/internal/services/postgresflexalpha/user/datasource_test.go index f3df8380..d26a131c 100644 --- a/stackit/internal/services/postgresflexalpha/user/datasource_test.go +++ b/stackit/internal/services/postgresflexalpha/user/datasource_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( diff --git a/stackit/internal/services/postgresflexalpha/user/resource.go b/stackit/internal/services/postgresflexalpha/user/resource.go index 1cc46ba2..21b66d2f 100644 --- a/stackit/internal/services/postgresflexalpha/user/resource.go +++ b/stackit/internal/services/postgresflexalpha/user/resource.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( diff --git a/stackit/internal/services/postgresflexalpha/user/resource_test.go b/stackit/internal/services/postgresflexalpha/user/resource_test.go index 190cfe81..c699d8de 100644 --- a/stackit/internal/services/postgresflexalpha/user/resource_test.go +++ b/stackit/internal/services/postgresflexalpha/user/resource_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( diff --git a/stackit/internal/services/sqlserverflexalpha/backup/datasource.go b/stackit/internal/services/sqlserverflexalpha/backup/datasource.go deleted file mode 100644 index 24f99500..00000000 --- a/stackit/internal/services/sqlserverflexalpha/backup/datasource.go +++ /dev/null @@ -1,48 +0,0 @@ -package sqlserverflexalpha - -import ( - "context" - - "github.com/hashicorp/terraform-plugin-framework/datasource" - "github.com/hashicorp/terraform-plugin-framework/datasource/schema" - "github.com/hashicorp/terraform-plugin-framework/types" -) - -var _ datasource.DataSource = (*backupDataSource)(nil) - -func NewBackupDataSource() datasource.DataSource { - return &backupDataSource{} -} - -type backupDataSource struct{} - -type backupDataSourceModel struct { - Id types.String `tfsdk:"id"` -} - -func (d *backupDataSource) Metadata(ctx context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { - resp.TypeName = req.ProviderTypeName + "sqlserverflexalpha_backup" -} - -func (d *backupDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { - resp.Schema = sqlserverflexalphaGen.BackupDataSourceSchema(ctx) -} - -func (d *backupDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { - var data sqlserverflexalphaGen.backupDataSourceModel - - // Read Terraform configuration data into the model - resp.Diagnostics.Append(req.Config.Get(ctx, &data)...) - - if resp.Diagnostics.HasError() { - return - } - - // Todo: Read API call logic - - // Example data value setting - data.Id = types.StringValue("example-id") - - // Save data into Terraform state - resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) -} diff --git a/stackit/internal/services/sqlserverflexalpha/backup/datasources_gen/backup_data_source_gen.go b/stackit/internal/services/sqlserverflexalpha/backup/datasources_gen/backup_data_source_gen.go deleted file mode 100644 index e11e4dca..00000000 --- a/stackit/internal/services/sqlserverflexalpha/backup/datasources_gen/backup_data_source_gen.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by terraform-plugin-framework-generator DO NOT EDIT. - -package sqlserverflexalpha - -import ( - "context" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" - "github.com/hashicorp/terraform-plugin-framework/schema/validator" - "github.com/hashicorp/terraform-plugin-framework/types" - - "github.com/hashicorp/terraform-plugin-framework/datasource/schema" -) - -func BackupDataSourceSchema(ctx context.Context) schema.Schema { - return schema.Schema{ - Attributes: map[string]schema.Attribute{ - "backup_id": schema.Int64Attribute{ - Required: true, - Description: "The ID of the backup.", - MarkdownDescription: "The ID of the backup.", - }, - "completion_time": schema.StringAttribute{ - Computed: true, - Description: "The time when the backup was completed in RFC3339 format.", - MarkdownDescription: "The time when the backup was completed in RFC3339 format.", - }, - "id": schema.Int64Attribute{ - Computed: true, - Description: "The ID of the backup.", - MarkdownDescription: "The ID of the backup.", - }, - "instance_id": schema.StringAttribute{ - Required: true, - Description: "The ID of the instance.", - MarkdownDescription: "The ID of the instance.", - }, - "name": schema.StringAttribute{ - Computed: true, - Description: "The name of the backup.", - MarkdownDescription: "The name of the backup.", - }, - "project_id": schema.StringAttribute{ - Required: true, - Description: "The STACKIT project ID.", - MarkdownDescription: "The STACKIT project ID.", - }, - "region": schema.StringAttribute{ - Required: true, - Description: "The region which should be addressed", - MarkdownDescription: "The region which should be addressed", - Validators: []validator.String{ - stringvalidator.OneOf( - "eu01", - ), - }, - }, - "retained_until": schema.StringAttribute{ - Computed: true, - Description: "The time until the backup will be retained.", - MarkdownDescription: "The time until the backup will be retained.", - }, - "size": schema.Int64Attribute{ - Computed: true, - Description: "The size of the backup in bytes.", - MarkdownDescription: "The size of the backup in bytes.", - }, - "type": schema.StringAttribute{ - Computed: true, - Description: "The type of the backup, which can be automated or manual triggered.", - MarkdownDescription: "The type of the backup, which can be automated or manual triggered.", - }, - }, - } -} - -type BackupModel struct { - BackupId types.Int64 `tfsdk:"backup_id"` - CompletionTime types.String `tfsdk:"completion_time"` - Id types.Int64 `tfsdk:"id"` - InstanceId types.String `tfsdk:"instance_id"` - Name types.String `tfsdk:"name"` - ProjectId types.String `tfsdk:"project_id"` - Region types.String `tfsdk:"region"` - RetainedUntil types.String `tfsdk:"retained_until"` - Size types.Int64 `tfsdk:"size"` - Type types.String `tfsdk:"type"` -} diff --git a/stackit/internal/services/sqlserverflexalpha/backup/datasources_gen/backups_data_source_gen.go b/stackit/internal/services/sqlserverflexalpha/backup/datasources_gen/backups_data_source_gen.go deleted file mode 100644 index a7acde0c..00000000 --- a/stackit/internal/services/sqlserverflexalpha/backup/datasources_gen/backups_data_source_gen.go +++ /dev/null @@ -1,1735 +0,0 @@ -// 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 BackupsDataSourceSchema(ctx context.Context) schema.Schema { - return schema.Schema{ - Attributes: map[string]schema.Attribute{ - "backups": schema.ListNestedAttribute{ - NestedObject: schema.NestedAttributeObject{ - Attributes: map[string]schema.Attribute{ - "backups": schema.ListNestedAttribute{ - NestedObject: schema.NestedAttributeObject{ - Attributes: map[string]schema.Attribute{ - "completion_time": schema.StringAttribute{ - Computed: true, - Description: "The time when the backup was completed in RFC3339 format.", - MarkdownDescription: "The time when the backup was completed in RFC3339 format.", - }, - "id": schema.Int64Attribute{ - Computed: true, - Description: "The ID of the backup.", - MarkdownDescription: "The ID of the backup.", - }, - "name": schema.StringAttribute{ - Computed: true, - Description: "The name of the backup.", - MarkdownDescription: "The name of the backup.", - }, - "retained_until": schema.StringAttribute{ - Computed: true, - Description: "The time until the backup will be retained.", - MarkdownDescription: "The time until the backup will be retained.", - }, - "size": schema.Int64Attribute{ - Computed: true, - Description: "The size of the backup in bytes.", - MarkdownDescription: "The size of the backup in bytes.", - }, - "type": schema.StringAttribute{ - Computed: true, - Description: "The type of the backup, which can be automated or manual triggered.", - MarkdownDescription: "The type of the backup, which can be automated or manual triggered.", - }, - }, - CustomType: BackupsType{ - ObjectType: types.ObjectType{ - AttrTypes: BackupsValue{}.AttributeTypes(ctx), - }, - }, - }, - Computed: true, - Description: "List of the backups beloning to that database", - MarkdownDescription: "List of the backups beloning to that database", - }, - "database_name": schema.StringAttribute{ - Computed: true, - Description: "Name of the database the backups belong to", - MarkdownDescription: "Name of the database the backups belong to", - }, - }, - CustomType: BackupsType{ - ObjectType: types.ObjectType{ - AttrTypes: BackupsValue{}.AttributeTypes(ctx), - }, - }, - }, - Computed: true, - Description: "The list containing the information about the backups.", - MarkdownDescription: "The list containing the information about the backups.", - }, - "instance_id": schema.StringAttribute{ - Required: true, - Description: "The ID of the instance.", - MarkdownDescription: "The ID of the instance.", - }, - "page": schema.Int64Attribute{ - Optional: true, - Computed: true, - Description: "Number of the page of items list to be returned.", - MarkdownDescription: "Number of the page of items list to be returned.", - }, - "pagination": schema.SingleNestedAttribute{ - Attributes: map[string]schema.Attribute{ - "page": schema.Int64Attribute{ - Computed: true, - }, - "size": schema.Int64Attribute{ - Computed: true, - }, - "sort": schema.StringAttribute{ - Computed: true, - }, - "total_pages": schema.Int64Attribute{ - Computed: true, - }, - "total_rows": schema.Int64Attribute{ - Computed: true, - }, - }, - CustomType: PaginationType{ - ObjectType: types.ObjectType{ - AttrTypes: PaginationValue{}.AttributeTypes(ctx), - }, - }, - Computed: true, - }, - "project_id": schema.StringAttribute{ - Required: true, - Description: "The STACKIT project ID.", - MarkdownDescription: "The STACKIT project ID.", - }, - "region": schema.StringAttribute{ - Required: true, - Description: "The region which should be addressed", - MarkdownDescription: "The region which should be addressed", - Validators: []validator.String{ - stringvalidator.OneOf( - "eu01", - ), - }, - }, - "size": schema.Int64Attribute{ - Optional: true, - Computed: true, - Description: "Number of items to be returned on each page.", - MarkdownDescription: "Number of items to be returned on each page.", - }, - "sort": schema.StringAttribute{ - Optional: true, - Computed: true, - Description: "Sorting of the backups to be returned on each page.", - MarkdownDescription: "Sorting of the backups to be returned on each page.", - Validators: []validator.String{ - stringvalidator.OneOf( - "end_time.desc", - "end_time.asc", - "index.desc", - "index.asc", - "name.desc", - "name.asc", - "retained_until.desc", - "retained_until.asc", - "size.desc", - "size.asc", - "type.desc", - "type.asc", - ), - }, - }, - }, - } -} - -type BackupsModel struct { - Backups types.List `tfsdk:"backups"` - InstanceId types.String `tfsdk:"instance_id"` - Page types.Int64 `tfsdk:"page"` - Pagination PaginationValue `tfsdk:"pagination"` - ProjectId types.String `tfsdk:"project_id"` - Region types.String `tfsdk:"region"` - Size types.Int64 `tfsdk:"size"` - Sort types.String `tfsdk:"sort"` -} - -var _ basetypes.ObjectTypable = BackupsType{} - -type BackupsType struct { - basetypes.ObjectType -} - -func (t BackupsType) Equal(o attr.Type) bool { - other, ok := o.(BackupsType) - - if !ok { - return false - } - - return t.ObjectType.Equal(other.ObjectType) -} - -func (t BackupsType) String() string { - return "BackupsType" -} - -func (t BackupsType) ValueFromObject(ctx context.Context, in basetypes.ObjectValue) (basetypes.ObjectValuable, diag.Diagnostics) { - var diags diag.Diagnostics - - attributes := in.Attributes() - - backupsAttribute, ok := attributes["backups"] - - if !ok { - diags.AddError( - "Attribute Missing", - `backups is missing from object`) - - return nil, diags - } - - backupsVal, ok := backupsAttribute.(basetypes.ListValue) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`backups expected to be basetypes.ListValue, was: %T`, backupsAttribute)) - } - - databaseNameAttribute, ok := attributes["database_name"] - - if !ok { - diags.AddError( - "Attribute Missing", - `database_name is missing from object`) - - return nil, diags - } - - databaseNameVal, ok := databaseNameAttribute.(basetypes.StringValue) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`database_name expected to be basetypes.StringValue, was: %T`, databaseNameAttribute)) - } - - if diags.HasError() { - return nil, diags - } - - return BackupsValue{ - Backups: backupsVal, - DatabaseName: databaseNameVal, - state: attr.ValueStateKnown, - }, diags -} - -func NewBackupsValueNull() BackupsValue { - return BackupsValue{ - state: attr.ValueStateNull, - } -} - -func NewBackupsValueUnknown() BackupsValue { - return BackupsValue{ - state: attr.ValueStateUnknown, - } -} - -func NewBackupsValue(attributeTypes map[string]attr.Type, attributes map[string]attr.Value) (BackupsValue, 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 BackupsValue Attribute Value", - "While creating a BackupsValue value, a missing attribute value was detected. "+ - "A BackupsValue 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("BackupsValue Attribute Name (%s) Expected Type: %s", name, attributeType.String()), - ) - - continue - } - - if !attributeType.Equal(attribute.Type(ctx)) { - diags.AddError( - "Invalid BackupsValue Attribute Type", - "While creating a BackupsValue value, an invalid attribute value was detected. "+ - "A BackupsValue 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("BackupsValue Attribute Name (%s) Expected Type: %s\n", name, attributeType.String())+ - fmt.Sprintf("BackupsValue Attribute Name (%s) Given Type: %s", name, attribute.Type(ctx)), - ) - } - } - - for name := range attributes { - _, ok := attributeTypes[name] - - if !ok { - diags.AddError( - "Extra BackupsValue Attribute Value", - "While creating a BackupsValue value, an extra attribute value was detected. "+ - "A BackupsValue 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 BackupsValue Attribute Name: %s", name), - ) - } - } - - if diags.HasError() { - return NewBackupsValueUnknown(), diags - } - - backupsAttribute, ok := attributes["backups"] - - if !ok { - diags.AddError( - "Attribute Missing", - `backups is missing from object`) - - return NewBackupsValueUnknown(), diags - } - - backupsVal, ok := backupsAttribute.(basetypes.ListValue) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`backups expected to be basetypes.ListValue, was: %T`, backupsAttribute)) - } - - databaseNameAttribute, ok := attributes["database_name"] - - if !ok { - diags.AddError( - "Attribute Missing", - `database_name is missing from object`) - - return NewBackupsValueUnknown(), diags - } - - databaseNameVal, ok := databaseNameAttribute.(basetypes.StringValue) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`database_name expected to be basetypes.StringValue, was: %T`, databaseNameAttribute)) - } - - if diags.HasError() { - return NewBackupsValueUnknown(), diags - } - - return BackupsValue{ - Backups: backupsVal, - DatabaseName: databaseNameVal, - state: attr.ValueStateKnown, - }, diags -} - -func NewBackupsValueMust(attributeTypes map[string]attr.Type, attributes map[string]attr.Value) BackupsValue { - object, diags := NewBackupsValue(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("NewBackupsValueMust received error(s): " + strings.Join(diagsStrings, "\n")) - } - - return object -} - -func (t BackupsType) ValueFromTerraform(ctx context.Context, in tftypes.Value) (attr.Value, error) { - if in.Type() == nil { - return NewBackupsValueNull(), 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 NewBackupsValueUnknown(), nil - } - - if in.IsNull() { - return NewBackupsValueNull(), 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 NewBackupsValueMust(BackupsValue{}.AttributeTypes(ctx), attributes), nil -} - -func (t BackupsType) ValueType(ctx context.Context) attr.Value { - return BackupsValue{} -} - -var _ basetypes.ObjectValuable = BackupsValue{} - -type BackupsValue struct { - Backups basetypes.ListValue `tfsdk:"backups"` - DatabaseName basetypes.StringValue `tfsdk:"database_name"` - state attr.ValueState -} - -func (v BackupsValue) ToTerraformValue(ctx context.Context) (tftypes.Value, error) { - attrTypes := make(map[string]tftypes.Type, 2) - - var val tftypes.Value - var err error - - attrTypes["backups"] = basetypes.ListType{ - ElemType: BackupsValue{}.Type(ctx), - }.TerraformType(ctx) - attrTypes["database_name"] = 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.Backups.ToTerraformValue(ctx) - - if err != nil { - return tftypes.NewValue(objectType, tftypes.UnknownValue), err - } - - vals["backups"] = val - - val, err = v.DatabaseName.ToTerraformValue(ctx) - - if err != nil { - return tftypes.NewValue(objectType, tftypes.UnknownValue), err - } - - vals["database_name"] = 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 BackupsValue) IsNull() bool { - return v.state == attr.ValueStateNull -} - -func (v BackupsValue) IsUnknown() bool { - return v.state == attr.ValueStateUnknown -} - -func (v BackupsValue) String() string { - return "BackupsValue" -} - -func (v BackupsValue) ToObjectValue(ctx context.Context) (basetypes.ObjectValue, diag.Diagnostics) { - var diags diag.Diagnostics - - backups := types.ListValueMust( - BackupsType{ - basetypes.ObjectType{ - AttrTypes: BackupsValue{}.AttributeTypes(ctx), - }, - }, - v.Backups.Elements(), - ) - - if v.Backups.IsNull() { - backups = types.ListNull( - BackupsType{ - basetypes.ObjectType{ - AttrTypes: BackupsValue{}.AttributeTypes(ctx), - }, - }, - ) - } - - if v.Backups.IsUnknown() { - backups = types.ListUnknown( - BackupsType{ - basetypes.ObjectType{ - AttrTypes: BackupsValue{}.AttributeTypes(ctx), - }, - }, - ) - } - - attributeTypes := map[string]attr.Type{ - "backups": basetypes.ListType{ - ElemType: BackupsValue{}.Type(ctx), - }, - "database_name": 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{ - "backups": backups, - "database_name": v.DatabaseName, - }) - - return objVal, diags -} - -func (v BackupsValue) Equal(o attr.Value) bool { - other, ok := o.(BackupsValue) - - if !ok { - return false - } - - if v.state != other.state { - return false - } - - if v.state != attr.ValueStateKnown { - return true - } - - if !v.Backups.Equal(other.Backups) { - return false - } - - if !v.DatabaseName.Equal(other.DatabaseName) { - return false - } - - return true -} - -func (v BackupsValue) Type(ctx context.Context) attr.Type { - return BackupsType{ - basetypes.ObjectType{ - AttrTypes: v.AttributeTypes(ctx), - }, - } -} - -func (v BackupsValue) AttributeTypes(ctx context.Context) map[string]attr.Type { - return map[string]attr.Type{ - "backups": basetypes.ListType{ - ElemType: BackupsValue{}.Type(ctx), - }, - "database_name": basetypes.StringType{}, - } -} - -var _ basetypes.ObjectTypable = BackupsType{} - -type BackupsType struct { - basetypes.ObjectType -} - -func (t BackupsType) Equal(o attr.Type) bool { - other, ok := o.(BackupsType) - - if !ok { - return false - } - - return t.ObjectType.Equal(other.ObjectType) -} - -func (t BackupsType) String() string { - return "BackupsType" -} - -func (t BackupsType) ValueFromObject(ctx context.Context, in basetypes.ObjectValue) (basetypes.ObjectValuable, diag.Diagnostics) { - var diags diag.Diagnostics - - attributes := in.Attributes() - - completionTimeAttribute, ok := attributes["completion_time"] - - if !ok { - diags.AddError( - "Attribute Missing", - `completion_time is missing from object`) - - return nil, diags - } - - completionTimeVal, ok := completionTimeAttribute.(basetypes.StringValue) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`completion_time expected to be basetypes.StringValue, was: %T`, completionTimeAttribute)) - } - - idAttribute, ok := attributes["id"] - - if !ok { - diags.AddError( - "Attribute Missing", - `id is missing from object`) - - return nil, diags - } - - idVal, ok := idAttribute.(basetypes.Int64Value) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`id expected to be basetypes.Int64Value, was: %T`, idAttribute)) - } - - nameAttribute, ok := attributes["name"] - - if !ok { - diags.AddError( - "Attribute Missing", - `name is missing from object`) - - return nil, diags - } - - nameVal, ok := nameAttribute.(basetypes.StringValue) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`name expected to be basetypes.StringValue, was: %T`, nameAttribute)) - } - - retainedUntilAttribute, ok := attributes["retained_until"] - - if !ok { - diags.AddError( - "Attribute Missing", - `retained_until is missing from object`) - - return nil, diags - } - - retainedUntilVal, ok := retainedUntilAttribute.(basetypes.StringValue) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`retained_until expected to be basetypes.StringValue, was: %T`, retainedUntilAttribute)) - } - - sizeAttribute, ok := attributes["size"] - - if !ok { - diags.AddError( - "Attribute Missing", - `size is missing from object`) - - return nil, diags - } - - sizeVal, ok := sizeAttribute.(basetypes.Int64Value) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`size expected to be basetypes.Int64Value, was: %T`, sizeAttribute)) - } - - typeAttribute, ok := attributes["type"] - - if !ok { - diags.AddError( - "Attribute Missing", - `type is missing from object`) - - return nil, diags - } - - typeVal, ok := typeAttribute.(basetypes.StringValue) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`type expected to be basetypes.StringValue, was: %T`, typeAttribute)) - } - - if diags.HasError() { - return nil, diags - } - - return BackupsValue{ - CompletionTime: completionTimeVal, - Id: idVal, - Name: nameVal, - RetainedUntil: retainedUntilVal, - Size: sizeVal, - BackupsType: typeVal, - state: attr.ValueStateKnown, - }, diags -} - -func NewBackupsValueNull() BackupsValue { - return BackupsValue{ - state: attr.ValueStateNull, - } -} - -func NewBackupsValueUnknown() BackupsValue { - return BackupsValue{ - state: attr.ValueStateUnknown, - } -} - -func NewBackupsValue(attributeTypes map[string]attr.Type, attributes map[string]attr.Value) (BackupsValue, 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 BackupsValue Attribute Value", - "While creating a BackupsValue value, a missing attribute value was detected. "+ - "A BackupsValue 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("BackupsValue Attribute Name (%s) Expected Type: %s", name, attributeType.String()), - ) - - continue - } - - if !attributeType.Equal(attribute.Type(ctx)) { - diags.AddError( - "Invalid BackupsValue Attribute Type", - "While creating a BackupsValue value, an invalid attribute value was detected. "+ - "A BackupsValue 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("BackupsValue Attribute Name (%s) Expected Type: %s\n", name, attributeType.String())+ - fmt.Sprintf("BackupsValue Attribute Name (%s) Given Type: %s", name, attribute.Type(ctx)), - ) - } - } - - for name := range attributes { - _, ok := attributeTypes[name] - - if !ok { - diags.AddError( - "Extra BackupsValue Attribute Value", - "While creating a BackupsValue value, an extra attribute value was detected. "+ - "A BackupsValue 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 BackupsValue Attribute Name: %s", name), - ) - } - } - - if diags.HasError() { - return NewBackupsValueUnknown(), diags - } - - completionTimeAttribute, ok := attributes["completion_time"] - - if !ok { - diags.AddError( - "Attribute Missing", - `completion_time is missing from object`) - - return NewBackupsValueUnknown(), diags - } - - completionTimeVal, ok := completionTimeAttribute.(basetypes.StringValue) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`completion_time expected to be basetypes.StringValue, was: %T`, completionTimeAttribute)) - } - - idAttribute, ok := attributes["id"] - - if !ok { - diags.AddError( - "Attribute Missing", - `id is missing from object`) - - return NewBackupsValueUnknown(), diags - } - - idVal, ok := idAttribute.(basetypes.Int64Value) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`id expected to be basetypes.Int64Value, was: %T`, idAttribute)) - } - - nameAttribute, ok := attributes["name"] - - if !ok { - diags.AddError( - "Attribute Missing", - `name is missing from object`) - - return NewBackupsValueUnknown(), diags - } - - nameVal, ok := nameAttribute.(basetypes.StringValue) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`name expected to be basetypes.StringValue, was: %T`, nameAttribute)) - } - - retainedUntilAttribute, ok := attributes["retained_until"] - - if !ok { - diags.AddError( - "Attribute Missing", - `retained_until is missing from object`) - - return NewBackupsValueUnknown(), diags - } - - retainedUntilVal, ok := retainedUntilAttribute.(basetypes.StringValue) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`retained_until expected to be basetypes.StringValue, was: %T`, retainedUntilAttribute)) - } - - sizeAttribute, ok := attributes["size"] - - if !ok { - diags.AddError( - "Attribute Missing", - `size is missing from object`) - - return NewBackupsValueUnknown(), diags - } - - sizeVal, ok := sizeAttribute.(basetypes.Int64Value) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`size expected to be basetypes.Int64Value, was: %T`, sizeAttribute)) - } - - typeAttribute, ok := attributes["type"] - - if !ok { - diags.AddError( - "Attribute Missing", - `type is missing from object`) - - return NewBackupsValueUnknown(), diags - } - - typeVal, ok := typeAttribute.(basetypes.StringValue) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`type expected to be basetypes.StringValue, was: %T`, typeAttribute)) - } - - if diags.HasError() { - return NewBackupsValueUnknown(), diags - } - - return BackupsValue{ - CompletionTime: completionTimeVal, - Id: idVal, - Name: nameVal, - RetainedUntil: retainedUntilVal, - Size: sizeVal, - BackupsType: typeVal, - state: attr.ValueStateKnown, - }, diags -} - -func NewBackupsValueMust(attributeTypes map[string]attr.Type, attributes map[string]attr.Value) BackupsValue { - object, diags := NewBackupsValue(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("NewBackupsValueMust received error(s): " + strings.Join(diagsStrings, "\n")) - } - - return object -} - -func (t BackupsType) ValueFromTerraform(ctx context.Context, in tftypes.Value) (attr.Value, error) { - if in.Type() == nil { - return NewBackupsValueNull(), 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 NewBackupsValueUnknown(), nil - } - - if in.IsNull() { - return NewBackupsValueNull(), 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 NewBackupsValueMust(BackupsValue{}.AttributeTypes(ctx), attributes), nil -} - -func (t BackupsType) ValueType(ctx context.Context) attr.Value { - return BackupsValue{} -} - -var _ basetypes.ObjectValuable = BackupsValue{} - -type BackupsValue struct { - CompletionTime basetypes.StringValue `tfsdk:"completion_time"` - Id basetypes.Int64Value `tfsdk:"id"` - Name basetypes.StringValue `tfsdk:"name"` - RetainedUntil basetypes.StringValue `tfsdk:"retained_until"` - Size basetypes.Int64Value `tfsdk:"size"` - BackupsType basetypes.StringValue `tfsdk:"type"` - state attr.ValueState -} - -func (v BackupsValue) ToTerraformValue(ctx context.Context) (tftypes.Value, error) { - attrTypes := make(map[string]tftypes.Type, 6) - - var val tftypes.Value - var err error - - attrTypes["completion_time"] = basetypes.StringType{}.TerraformType(ctx) - attrTypes["id"] = basetypes.Int64Type{}.TerraformType(ctx) - attrTypes["name"] = basetypes.StringType{}.TerraformType(ctx) - attrTypes["retained_until"] = basetypes.StringType{}.TerraformType(ctx) - attrTypes["size"] = basetypes.Int64Type{}.TerraformType(ctx) - attrTypes["type"] = basetypes.StringType{}.TerraformType(ctx) - - objectType := tftypes.Object{AttributeTypes: attrTypes} - - switch v.state { - case attr.ValueStateKnown: - vals := make(map[string]tftypes.Value, 6) - - val, err = v.CompletionTime.ToTerraformValue(ctx) - - if err != nil { - return tftypes.NewValue(objectType, tftypes.UnknownValue), err - } - - vals["completion_time"] = val - - val, err = v.Id.ToTerraformValue(ctx) - - if err != nil { - return tftypes.NewValue(objectType, tftypes.UnknownValue), err - } - - vals["id"] = val - - val, err = v.Name.ToTerraformValue(ctx) - - if err != nil { - return tftypes.NewValue(objectType, tftypes.UnknownValue), err - } - - vals["name"] = val - - val, err = v.RetainedUntil.ToTerraformValue(ctx) - - if err != nil { - return tftypes.NewValue(objectType, tftypes.UnknownValue), err - } - - vals["retained_until"] = val - - val, err = v.Size.ToTerraformValue(ctx) - - if err != nil { - return tftypes.NewValue(objectType, tftypes.UnknownValue), err - } - - vals["size"] = val - - val, err = v.BackupsType.ToTerraformValue(ctx) - - if err != nil { - return tftypes.NewValue(objectType, tftypes.UnknownValue), err - } - - vals["type"] = 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 BackupsValue) IsNull() bool { - return v.state == attr.ValueStateNull -} - -func (v BackupsValue) IsUnknown() bool { - return v.state == attr.ValueStateUnknown -} - -func (v BackupsValue) String() string { - return "BackupsValue" -} - -func (v BackupsValue) ToObjectValue(ctx context.Context) (basetypes.ObjectValue, diag.Diagnostics) { - var diags diag.Diagnostics - - attributeTypes := map[string]attr.Type{ - "completion_time": basetypes.StringType{}, - "id": basetypes.Int64Type{}, - "name": basetypes.StringType{}, - "retained_until": basetypes.StringType{}, - "size": basetypes.Int64Type{}, - "type": 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{ - "completion_time": v.CompletionTime, - "id": v.Id, - "name": v.Name, - "retained_until": v.RetainedUntil, - "size": v.Size, - "type": v.BackupsType, - }) - - return objVal, diags -} - -func (v BackupsValue) Equal(o attr.Value) bool { - other, ok := o.(BackupsValue) - - if !ok { - return false - } - - if v.state != other.state { - return false - } - - if v.state != attr.ValueStateKnown { - return true - } - - if !v.CompletionTime.Equal(other.CompletionTime) { - return false - } - - if !v.Id.Equal(other.Id) { - return false - } - - if !v.Name.Equal(other.Name) { - return false - } - - if !v.RetainedUntil.Equal(other.RetainedUntil) { - return false - } - - if !v.Size.Equal(other.Size) { - return false - } - - if !v.BackupsType.Equal(other.BackupsType) { - return false - } - - return true -} - -func (v BackupsValue) Type(ctx context.Context) attr.Type { - return BackupsType{ - basetypes.ObjectType{ - AttrTypes: v.AttributeTypes(ctx), - }, - } -} - -func (v BackupsValue) AttributeTypes(ctx context.Context) map[string]attr.Type { - return map[string]attr.Type{ - "completion_time": basetypes.StringType{}, - "id": basetypes.Int64Type{}, - "name": basetypes.StringType{}, - "retained_until": basetypes.StringType{}, - "size": basetypes.Int64Type{}, - "type": basetypes.StringType{}, - } -} - -var _ basetypes.ObjectTypable = PaginationType{} - -type PaginationType struct { - basetypes.ObjectType -} - -func (t PaginationType) Equal(o attr.Type) bool { - other, ok := o.(PaginationType) - - if !ok { - return false - } - - return t.ObjectType.Equal(other.ObjectType) -} - -func (t PaginationType) String() string { - return "PaginationType" -} - -func (t PaginationType) ValueFromObject(ctx context.Context, in basetypes.ObjectValue) (basetypes.ObjectValuable, diag.Diagnostics) { - var diags diag.Diagnostics - - attributes := in.Attributes() - - pageAttribute, ok := attributes["page"] - - if !ok { - diags.AddError( - "Attribute Missing", - `page is missing from object`) - - return nil, diags - } - - pageVal, ok := pageAttribute.(basetypes.Int64Value) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`page expected to be basetypes.Int64Value, was: %T`, pageAttribute)) - } - - sizeAttribute, ok := attributes["size"] - - if !ok { - diags.AddError( - "Attribute Missing", - `size is missing from object`) - - return nil, diags - } - - sizeVal, ok := sizeAttribute.(basetypes.Int64Value) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`size expected to be basetypes.Int64Value, was: %T`, sizeAttribute)) - } - - sortAttribute, ok := attributes["sort"] - - if !ok { - diags.AddError( - "Attribute Missing", - `sort is missing from object`) - - return nil, diags - } - - sortVal, ok := sortAttribute.(basetypes.StringValue) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`sort expected to be basetypes.StringValue, was: %T`, sortAttribute)) - } - - totalPagesAttribute, ok := attributes["total_pages"] - - if !ok { - diags.AddError( - "Attribute Missing", - `total_pages is missing from object`) - - return nil, diags - } - - totalPagesVal, ok := totalPagesAttribute.(basetypes.Int64Value) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`total_pages expected to be basetypes.Int64Value, was: %T`, totalPagesAttribute)) - } - - totalRowsAttribute, ok := attributes["total_rows"] - - if !ok { - diags.AddError( - "Attribute Missing", - `total_rows is missing from object`) - - return nil, diags - } - - totalRowsVal, ok := totalRowsAttribute.(basetypes.Int64Value) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`total_rows expected to be basetypes.Int64Value, was: %T`, totalRowsAttribute)) - } - - if diags.HasError() { - return nil, diags - } - - return PaginationValue{ - Page: pageVal, - Size: sizeVal, - Sort: sortVal, - TotalPages: totalPagesVal, - TotalRows: totalRowsVal, - state: attr.ValueStateKnown, - }, diags -} - -func NewPaginationValueNull() PaginationValue { - return PaginationValue{ - state: attr.ValueStateNull, - } -} - -func NewPaginationValueUnknown() PaginationValue { - return PaginationValue{ - state: attr.ValueStateUnknown, - } -} - -func NewPaginationValue(attributeTypes map[string]attr.Type, attributes map[string]attr.Value) (PaginationValue, 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 PaginationValue Attribute Value", - "While creating a PaginationValue value, a missing attribute value was detected. "+ - "A PaginationValue 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("PaginationValue Attribute Name (%s) Expected Type: %s", name, attributeType.String()), - ) - - continue - } - - if !attributeType.Equal(attribute.Type(ctx)) { - diags.AddError( - "Invalid PaginationValue Attribute Type", - "While creating a PaginationValue value, an invalid attribute value was detected. "+ - "A PaginationValue 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("PaginationValue Attribute Name (%s) Expected Type: %s\n", name, attributeType.String())+ - fmt.Sprintf("PaginationValue Attribute Name (%s) Given Type: %s", name, attribute.Type(ctx)), - ) - } - } - - for name := range attributes { - _, ok := attributeTypes[name] - - if !ok { - diags.AddError( - "Extra PaginationValue Attribute Value", - "While creating a PaginationValue value, an extra attribute value was detected. "+ - "A PaginationValue 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 PaginationValue Attribute Name: %s", name), - ) - } - } - - if diags.HasError() { - return NewPaginationValueUnknown(), diags - } - - pageAttribute, ok := attributes["page"] - - if !ok { - diags.AddError( - "Attribute Missing", - `page is missing from object`) - - return NewPaginationValueUnknown(), diags - } - - pageVal, ok := pageAttribute.(basetypes.Int64Value) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`page expected to be basetypes.Int64Value, was: %T`, pageAttribute)) - } - - sizeAttribute, ok := attributes["size"] - - if !ok { - diags.AddError( - "Attribute Missing", - `size is missing from object`) - - return NewPaginationValueUnknown(), diags - } - - sizeVal, ok := sizeAttribute.(basetypes.Int64Value) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`size expected to be basetypes.Int64Value, was: %T`, sizeAttribute)) - } - - sortAttribute, ok := attributes["sort"] - - if !ok { - diags.AddError( - "Attribute Missing", - `sort is missing from object`) - - return NewPaginationValueUnknown(), diags - } - - sortVal, ok := sortAttribute.(basetypes.StringValue) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`sort expected to be basetypes.StringValue, was: %T`, sortAttribute)) - } - - totalPagesAttribute, ok := attributes["total_pages"] - - if !ok { - diags.AddError( - "Attribute Missing", - `total_pages is missing from object`) - - return NewPaginationValueUnknown(), diags - } - - totalPagesVal, ok := totalPagesAttribute.(basetypes.Int64Value) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`total_pages expected to be basetypes.Int64Value, was: %T`, totalPagesAttribute)) - } - - totalRowsAttribute, ok := attributes["total_rows"] - - if !ok { - diags.AddError( - "Attribute Missing", - `total_rows is missing from object`) - - return NewPaginationValueUnknown(), diags - } - - totalRowsVal, ok := totalRowsAttribute.(basetypes.Int64Value) - - if !ok { - diags.AddError( - "Attribute Wrong Type", - fmt.Sprintf(`total_rows expected to be basetypes.Int64Value, was: %T`, totalRowsAttribute)) - } - - if diags.HasError() { - return NewPaginationValueUnknown(), diags - } - - return PaginationValue{ - Page: pageVal, - Size: sizeVal, - Sort: sortVal, - TotalPages: totalPagesVal, - TotalRows: totalRowsVal, - state: attr.ValueStateKnown, - }, diags -} - -func NewPaginationValueMust(attributeTypes map[string]attr.Type, attributes map[string]attr.Value) PaginationValue { - object, diags := NewPaginationValue(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("NewPaginationValueMust received error(s): " + strings.Join(diagsStrings, "\n")) - } - - return object -} - -func (t PaginationType) ValueFromTerraform(ctx context.Context, in tftypes.Value) (attr.Value, error) { - if in.Type() == nil { - return NewPaginationValueNull(), 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 NewPaginationValueUnknown(), nil - } - - if in.IsNull() { - return NewPaginationValueNull(), 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 NewPaginationValueMust(PaginationValue{}.AttributeTypes(ctx), attributes), nil -} - -func (t PaginationType) ValueType(ctx context.Context) attr.Value { - return PaginationValue{} -} - -var _ basetypes.ObjectValuable = PaginationValue{} - -type PaginationValue struct { - Page basetypes.Int64Value `tfsdk:"page"` - Size basetypes.Int64Value `tfsdk:"size"` - Sort basetypes.StringValue `tfsdk:"sort"` - TotalPages basetypes.Int64Value `tfsdk:"total_pages"` - TotalRows basetypes.Int64Value `tfsdk:"total_rows"` - state attr.ValueState -} - -func (v PaginationValue) ToTerraformValue(ctx context.Context) (tftypes.Value, error) { - attrTypes := make(map[string]tftypes.Type, 5) - - var val tftypes.Value - var err error - - attrTypes["page"] = basetypes.Int64Type{}.TerraformType(ctx) - attrTypes["size"] = basetypes.Int64Type{}.TerraformType(ctx) - attrTypes["sort"] = basetypes.StringType{}.TerraformType(ctx) - attrTypes["total_pages"] = basetypes.Int64Type{}.TerraformType(ctx) - attrTypes["total_rows"] = basetypes.Int64Type{}.TerraformType(ctx) - - objectType := tftypes.Object{AttributeTypes: attrTypes} - - switch v.state { - case attr.ValueStateKnown: - vals := make(map[string]tftypes.Value, 5) - - val, err = v.Page.ToTerraformValue(ctx) - - if err != nil { - return tftypes.NewValue(objectType, tftypes.UnknownValue), err - } - - vals["page"] = val - - val, err = v.Size.ToTerraformValue(ctx) - - if err != nil { - return tftypes.NewValue(objectType, tftypes.UnknownValue), err - } - - vals["size"] = val - - val, err = v.Sort.ToTerraformValue(ctx) - - if err != nil { - return tftypes.NewValue(objectType, tftypes.UnknownValue), err - } - - vals["sort"] = val - - val, err = v.TotalPages.ToTerraformValue(ctx) - - if err != nil { - return tftypes.NewValue(objectType, tftypes.UnknownValue), err - } - - vals["total_pages"] = val - - val, err = v.TotalRows.ToTerraformValue(ctx) - - if err != nil { - return tftypes.NewValue(objectType, tftypes.UnknownValue), err - } - - vals["total_rows"] = 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 PaginationValue) IsNull() bool { - return v.state == attr.ValueStateNull -} - -func (v PaginationValue) IsUnknown() bool { - return v.state == attr.ValueStateUnknown -} - -func (v PaginationValue) String() string { - return "PaginationValue" -} - -func (v PaginationValue) ToObjectValue(ctx context.Context) (basetypes.ObjectValue, diag.Diagnostics) { - var diags diag.Diagnostics - - attributeTypes := map[string]attr.Type{ - "page": basetypes.Int64Type{}, - "size": basetypes.Int64Type{}, - "sort": basetypes.StringType{}, - "total_pages": basetypes.Int64Type{}, - "total_rows": basetypes.Int64Type{}, - } - - 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{ - "page": v.Page, - "size": v.Size, - "sort": v.Sort, - "total_pages": v.TotalPages, - "total_rows": v.TotalRows, - }) - - return objVal, diags -} - -func (v PaginationValue) Equal(o attr.Value) bool { - other, ok := o.(PaginationValue) - - if !ok { - return false - } - - if v.state != other.state { - return false - } - - if v.state != attr.ValueStateKnown { - return true - } - - if !v.Page.Equal(other.Page) { - return false - } - - if !v.Size.Equal(other.Size) { - return false - } - - if !v.Sort.Equal(other.Sort) { - return false - } - - if !v.TotalPages.Equal(other.TotalPages) { - return false - } - - if !v.TotalRows.Equal(other.TotalRows) { - return false - } - - return true -} - -func (v PaginationValue) Type(ctx context.Context) attr.Type { - return PaginationType{ - basetypes.ObjectType{ - AttrTypes: v.AttributeTypes(ctx), - }, - } -} - -func (v PaginationValue) AttributeTypes(ctx context.Context) map[string]attr.Type { - return map[string]attr.Type{ - "page": basetypes.Int64Type{}, - "size": basetypes.Int64Type{}, - "sort": basetypes.StringType{}, - "total_pages": basetypes.Int64Type{}, - "total_rows": basetypes.Int64Type{}, - } -} diff --git a/stackit/internal/services/sqlserverflexalpha/collation/datasource.go b/stackit/internal/services/sqlserverflexalpha/collation/datasource.go deleted file mode 100644 index f55291c6..00000000 --- a/stackit/internal/services/sqlserverflexalpha/collation/datasource.go +++ /dev/null @@ -1,48 +0,0 @@ -package sqlserverflexalpha - -import ( - "context" - - "github.com/hashicorp/terraform-plugin-framework/datasource" - "github.com/hashicorp/terraform-plugin-framework/datasource/schema" - "github.com/hashicorp/terraform-plugin-framework/types" -) - -var _ datasource.DataSource = (*collationDataSource)(nil) - -func NewCollationDataSource() datasource.DataSource { - return &collationDataSource{} -} - -type collationDataSource struct{} - -type collationDataSourceModel struct { - Id types.String `tfsdk:"id"` -} - -func (d *collationDataSource) Metadata(ctx context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { - resp.TypeName = req.ProviderTypeName + "sqlserverflexalpha_collation" -} - -func (d *collationDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { - resp.Schema = sqlserverflexalphaGen.CollationDataSourceSchema(ctx) -} - -func (d *collationDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { - var data sqlserverflexalphaGen.collationDataSourceModel - - // Read Terraform configuration data into the model - resp.Diagnostics.Append(req.Config.Get(ctx, &data)...) - - if resp.Diagnostics.HasError() { - return - } - - // Todo: Read API call logic - - // Example data value setting - data.Id = types.StringValue("example-id") - - // Save data into Terraform state - resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) -} diff --git a/stackit/internal/services/sqlserverflexalpha/collation/datasources_gen/collation_data_source_gen.go b/stackit/internal/services/sqlserverflexalpha/collation/datasources_gen/collation_data_source_gen.go deleted file mode 100644 index 5f6460c6..00000000 --- a/stackit/internal/services/sqlserverflexalpha/collation/datasources_gen/collation_data_source_gen.go +++ /dev/null @@ -1,451 +0,0 @@ -// 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 CollationDataSourceSchema(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{ - Required: true, - Description: "The region which should be addressed", - MarkdownDescription: "The region which should be addressed", - Validators: []validator.String{ - stringvalidator.OneOf( - "eu01", - ), - }, - }, - }, - } -} - -type CollationModel 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/database/datasource.go b/stackit/internal/services/sqlserverflexalpha/database/datasource.go index 6cca0141..c1a7c43b 100644 --- a/stackit/internal/services/sqlserverflexalpha/database/datasource.go +++ b/stackit/internal/services/sqlserverflexalpha/database/datasource.go @@ -1,12 +1,18 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package sqlserverflexalpha import ( "context" "github.com/hashicorp/terraform-plugin-framework/datasource" - "github.com/hashicorp/terraform-plugin-framework/types" - + "github.com/hashicorp/terraform-plugin-log/tflog" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/pkg/sqlserverflexalpha" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/conversion" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/core" sqlserverflexalphaGen "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/database/datasources_gen" + sqlserverflexUtils "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/utils" ) var _ datasource.DataSource = (*databaseDataSource)(nil) @@ -15,20 +21,35 @@ func NewDatabaseDataSource() datasource.DataSource { return &databaseDataSource{} } -type databaseDataSource struct{} - -type databaseDataSourceModel struct { - Id types.String `tfsdk:"id"` +type databaseDataSource struct { + client *sqlserverflexalpha.APIClient + providerData core.ProviderData } -func (d *databaseDataSource) Metadata(ctx context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { +func (d *databaseDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { resp.TypeName = req.ProviderTypeName + "_sqlserverflexalpha_database" } -func (d *databaseDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { +func (d *databaseDataSource) Schema(ctx context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) { resp.Schema = sqlserverflexalphaGen.DatabaseDataSourceSchema(ctx) } +// Configure adds the provider configured client to the data source. +func (d *databaseDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { + var ok bool + d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + if !ok { + return + } + + apiClient := sqlserverflexUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) + if resp.Diagnostics.HasError() { + return + } + d.client = apiClient + tflog.Info(ctx, "SQL SERVER Flex database client configured") +} + func (d *databaseDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { var data sqlserverflexalphaGen.DatabaseModel diff --git a/stackit/internal/services/sqlserverflexalpha/database/resource.go b/stackit/internal/services/sqlserverflexalpha/database/resource.go index 3a073f82..6bfcd07b 100644 --- a/stackit/internal/services/sqlserverflexalpha/database/resource.go +++ b/stackit/internal/services/sqlserverflexalpha/database/resource.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package sqlserverflexalpha import ( @@ -34,11 +37,11 @@ type databaseResource struct { providerData core.ProviderData } -func (r *databaseResource) Metadata(ctx context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) { +func (r *databaseResource) Metadata(_ context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) { resp.TypeName = req.ProviderTypeName + "_sqlserverflexalpha_database" } -func (r *databaseResource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) { +func (r *databaseResource) Schema(ctx context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { resp.Schema = sqlserverflexalphaGen.DatabaseResourceSchema(ctx) } @@ -88,7 +91,7 @@ func (r *databaseResource) Create(ctx context.Context, req resource.CreateReques // TODO: Create API call logic // Example data value setting - //data.DatabaseId = types.StringValue("id-from-response") + // data.DatabaseId = types.StringValue("id-from-response") // Save data into Terraform state resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) diff --git a/stackit/internal/services/sqlserverflexalpha/flavor/datasource.go b/stackit/internal/services/sqlserverflexalpha/flavor/datasource.go index 46ad0387..5b9290dc 100644 --- a/stackit/internal/services/sqlserverflexalpha/flavor/datasource.go +++ b/stackit/internal/services/sqlserverflexalpha/flavor/datasource.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package sqlserverFlexAlphaFlavor import ( @@ -5,24 +8,25 @@ import ( "fmt" "github.com/hashicorp/terraform-plugin-framework/attr" + "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-framework/types/basetypes" + "github.com/hashicorp/terraform-plugin-log/tflog" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/pkg/sqlserverflexalpha" "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/conversion" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/core" "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/utils" - sqlserverflex "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha" + sqlserverflexalphaGen "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/flavor/datasources_gen" sqlserverflexUtils "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/utils" - - "github.com/hashicorp/terraform-plugin-framework/datasource" - "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/core" ) // Ensure the implementation satisfies the expected interfaces. var ( - _ datasource.DataSource = &flavorDataSource{} + _ datasource.DataSource = &flavorDataSource{} + _ datasource.DataSourceWithConfigure = &flavorDataSource{} ) type FlavorModel struct { @@ -144,9 +148,9 @@ func (r *flavorDataSource) Schema(ctx context.Context, _ datasource.SchemaReques Computed: true, }, }, - CustomType: sqlserverflex.StorageClassesType{ + CustomType: sqlserverflexalphaGen.StorageClassesType{ ObjectType: types.ObjectType{ - AttrTypes: sqlserverflex.StorageClassesValue{}.AttributeTypes(ctx), + AttrTypes: sqlserverflexalphaGen.StorageClassesValue{}.AttributeTypes(ctx), }, }, }, @@ -211,9 +215,9 @@ func (r *flavorDataSource) Read(ctx context.Context, req datasource.ReadRequest, model.MinGb = types.Int64Value(*f.MinGB) if f.StorageClasses == nil { - model.StorageClasses = types.ListNull(sqlserverflex.StorageClassesType{ + model.StorageClasses = types.ListNull(sqlserverflexalphaGen.StorageClassesType{ ObjectType: basetypes.ObjectType{ - AttrTypes: sqlserverflex.StorageClassesValue{}.AttributeTypes(ctx), + AttrTypes: sqlserverflexalphaGen.StorageClassesValue{}.AttributeTypes(ctx), }, }) } else { @@ -221,8 +225,8 @@ func (r *flavorDataSource) Read(ctx context.Context, req datasource.ReadRequest, for _, sc := range *f.StorageClasses { scList = append( scList, - sqlserverflex.NewStorageClassesValueMust( - sqlserverflex.StorageClassesValue{}.AttributeTypes(ctx), + sqlserverflexalphaGen.NewStorageClassesValueMust( + sqlserverflexalphaGen.StorageClassesValue{}.AttributeTypes(ctx), map[string]attr.Value{ "class": types.StringValue(*sc.Class), "max_io_per_sec": types.Int64Value(*sc.MaxIoPerSec), @@ -232,9 +236,9 @@ func (r *flavorDataSource) Read(ctx context.Context, req datasource.ReadRequest, ) } storageClassesList := types.ListValueMust( - sqlserverflex.StorageClassesType{ + sqlserverflexalphaGen.StorageClassesType{ ObjectType: basetypes.ObjectType{ - AttrTypes: sqlserverflex.StorageClassesValue{}.AttributeTypes(ctx), + AttrTypes: sqlserverflexalphaGen.StorageClassesValue{}.AttributeTypes(ctx), }, }, scList, diff --git a/stackit/internal/services/sqlserverflexalpha/flavor/functions.go b/stackit/internal/services/sqlserverflexalpha/flavor/functions.go index 44fbba28..a4f738ac 100644 --- a/stackit/internal/services/sqlserverflexalpha/flavor/functions.go +++ b/stackit/internal/services/sqlserverflexalpha/flavor/functions.go @@ -1,198 +1,68 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package sqlserverFlexAlphaFlavor import ( "context" "fmt" - sqlserverflex "github.com/mhenselin/terraform-provider-stackitprivatepreview/pkg/sqlserverflexalpha" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/pkg/sqlserverflexalpha" ) -type flavorsClient interface { - GetFlavorsRequestExecute(ctx context.Context, projectId, region string) (*sqlserverflex.GetFlavorsResponse, error) - GetFlavorsRequest(ctx context.Context, projectId, region string) sqlserverflex.ApiGetFlavorsRequestRequest +type flavorsClientReader interface { + GetFlavorsRequest( + ctx context.Context, + projectId, region string, + ) sqlserverflexalpha.ApiGetFlavorsRequestRequest } -// func loadFlavorId(ctx context.Context, client flavorsClient, model *Model, flavor *flavorModel, storage *storageModel) error { -// if model == nil { -// return fmt.Errorf("nil model") -// } -// if flavor == nil { -// return fmt.Errorf("nil flavor") -// } -// cpu := flavor.CPU.ValueInt64() -// if cpu == 0 { -// return fmt.Errorf("nil CPU") -// } -// ram := flavor.RAM.ValueInt64() -// if ram == 0 { -// return fmt.Errorf("nil RAM") -// } -// -// nodeType := flavor.NodeType.ValueString() -// if nodeType == "" { -// if model.Replicas.IsNull() || model.Replicas.IsUnknown() { -// return fmt.Errorf("nil NodeType") -// } -// switch model.Replicas.ValueInt64() { -// case 1: -// nodeType = "Single" -// case 3: -// nodeType = "Replica" -// default: -// return fmt.Errorf("unknown Replicas value: %d", model.Replicas.ValueInt64()) -// } -// } -// -// storageClass := conversion.StringValueToPointer(storage.Class) -// if storageClass == nil { -// return fmt.Errorf("nil StorageClass") -// } -// storageSize := conversion.Int64ValueToPointer(storage.Size) -// if storageSize == nil { -// return fmt.Errorf("nil StorageSize") -// } -// -// projectId := model.ProjectId.ValueString() -// region := model.Region.ValueString() -// -// flavorList, err := getAllFlavors(ctx, client, projectId, region) -// if err != nil { -// return err -// } -// -// avl := "" -// foundFlavorCount := 0 -// var foundFlavors []string -// for _, f := range flavorList { -// if f.Id == nil || f.Cpu == nil || f.Memory == nil { -// continue -// } -// if !strings.EqualFold(*f.NodeType, nodeType) { -// continue -// } -// if *f.Cpu == cpu && *f.Memory == ram { -// var useSc *sqlserverflex.FlavorStorageClassesStorageClass -// for _, sc := range *f.StorageClasses { -// if *sc.Class != *storageClass { -// continue -// } -// if *storageSize < *f.MinGB || *storageSize > *f.MaxGB { -// return fmt.Errorf("storage size %d out of bounds (min: %d - max: %d)", *storageSize, *f.MinGB, *f.MaxGB) -// } -// useSc = &sc -// } -// if useSc == nil { -// return fmt.Errorf("no storage class found for %s", *storageClass) -// } -// -// flavor.Id = types.StringValue(*f.Id) -// flavor.Description = types.StringValue(*f.Description) -// foundFlavors = append(foundFlavors, fmt.Sprintf("%s (%d/%d - %s)", *f.Id, *f.Cpu, *f.Memory, *f.NodeType)) -// foundFlavorCount++ -// } -// for _, cls := range *f.StorageClasses { -// avl = fmt.Sprintf("%s\n- %d CPU, %d GB RAM, storage %s (min: %d - max: %d)", avl, *f.Cpu, *f.Memory, *cls.Class, *f.MinGB, *f.MaxGB) -// } -// } -// if foundFlavorCount > 1 { -// return fmt.Errorf( -// "number of flavors returned: %d\nmultiple flavors found: %d flavors\n %s", -// len(flavorList), -// foundFlavorCount, -// strings.Join(foundFlavors, "\n "), -// ) -// } -// if flavor.Id.ValueString() == "" { -// return fmt.Errorf("couldn't find flavor, available specs are:%s", avl) -// } -// -// return nil -//} - -func getAllFlavors(ctx context.Context, client flavorsClient, projectId, region string) ( - []sqlserverflex.ListFlavors, +func getAllFlavors(ctx context.Context, client flavorsClientReader, projectId, region string) ( + []sqlserverflexalpha.ListFlavors, error, ) { - if projectId == "" || region == "" { - return nil, fmt.Errorf("listing sqlserverflex flavors: projectId and region are required") - } - var flavorList []sqlserverflex.ListFlavors - - var page int64 = 1 - counter := 0 - for { - res, err := client.GetFlavorsRequest(ctx, projectId, region).Page(page).Execute() - if err != nil { - return nil, fmt.Errorf("listing sqlserverflex flavors: %w", err) - } - if res.Flavors == nil { - return nil, fmt.Errorf("finding flavors for project %s", projectId) - } - pagination := res.GetPagination() - flavors := res.GetFlavors() - flavorList = append(flavorList, flavors...) - - if *pagination.TotalRows < int64(len(flavorList)) { - return nil, fmt.Errorf("total rows is smaller than current accumulated list - that should not happen") - } - if *pagination.TotalRows == int64(len(flavorList)) { - break - } - page++ - - if page > *pagination.TotalPages { - break - } - - // implement a breakpoint - counter++ - if counter > 1000 { - panic("too many pagination results") - } + getAllFilter := func(_ sqlserverflexalpha.ListFlavors) bool { return true } + flavorList, err := getFlavorsByFilter(ctx, client, projectId, region, getAllFilter) + if err != nil { + return nil, err } return flavorList, nil } -// func getFlavorModelById(ctx context.Context, client flavorsClient, model *Model, flavor *flavorModel) error { -// if model == nil { -// return fmt.Errorf("nil model") -// } -// if flavor == nil { -// return fmt.Errorf("nil flavor") -// } -// id := conversion.StringValueToPointer(flavor.Id) -// if id == nil { -// return fmt.Errorf("nil flavor ID") -// } -// -// flavor.Id = types.StringValue("") -// -// projectId := model.ProjectId.ValueString() -// region := model.Region.ValueString() -// -// flavorList, err := getAllFlavors(ctx, client, projectId, region) -// if err != nil { -// return err -// } -// -// avl := "" -// for _, f := range flavorList { -// if f.Id == nil || f.Cpu == nil || f.Memory == nil { -// continue -// } -// if *f.Id == *id { -// flavor.Id = types.StringValue(*f.Id) -// flavor.Description = types.StringValue(*f.Description) -// flavor.CPU = types.Int64Value(*f.Cpu) -// flavor.RAM = types.Int64Value(*f.Memory) -// flavor.NodeType = types.StringValue(*f.NodeType) -// break -// } -// avl = fmt.Sprintf("%s\n- %d CPU, %d GB RAM", avl, *f.Cpu, *f.Memory) -// } -// if flavor.Id.ValueString() == "" { -// return fmt.Errorf("couldn't find flavor, available specs are: %s", avl) -// } -// -// return 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 sqlserverflexalpha.ListFlavors) bool, +) ([]sqlserverflexalpha.ListFlavors, error) { + if projectId == "" || region == "" { + return nil, fmt.Errorf("listing sqlserverflexalpha flavors: projectId and region are required") + } + + const pageSize = 25 + + var result = make([]sqlserverflexalpha.ListFlavors, 0) + + for page := int64(1); ; page++ { + res, err := client.GetFlavorsRequest(ctx, projectId, region). + Page(page).Size(pageSize).Sort(sqlserverflexalpha.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 res.Flavors == nil || 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/sqlserverflexalpha/flavor/functions_test.go b/stackit/internal/services/sqlserverflexalpha/flavor/functions_test.go new file mode 100644 index 00000000..2c31a876 --- /dev/null +++ b/stackit/internal/services/sqlserverflexalpha/flavor/functions_test.go @@ -0,0 +1,137 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + +package sqlserverFlexAlphaFlavor + +import ( + "context" + "testing" + + "github.com/mhenselin/terraform-provider-stackitprivatepreview/pkg/sqlserverflexalpha" + "github.com/stackitcloud/stackit-sdk-go/core/utils" +) + +type mockRequest struct { + executeFunc func() (*sqlserverflexalpha.GetFlavorsResponse, error) +} + +func (m *mockRequest) Page(_ int64) sqlserverflexalpha.ApiGetFlavorsRequestRequest { return m } +func (m *mockRequest) Size(_ int64) sqlserverflexalpha.ApiGetFlavorsRequestRequest { return m } +func (m *mockRequest) Sort(_ sqlserverflexalpha.FlavorSort) sqlserverflexalpha.ApiGetFlavorsRequestRequest { + return m +} +func (m *mockRequest) Execute() (*sqlserverflexalpha.GetFlavorsResponse, error) { + return m.executeFunc() +} + +type mockFlavorsClient struct { + executeRequest func() sqlserverflexalpha.ApiGetFlavorsRequestRequest +} + +func (m *mockFlavorsClient) GetFlavorsRequest(_ context.Context, _, _ string) sqlserverflexalpha.ApiGetFlavorsRequestRequest { + return m.executeRequest() +} + +var mockResp = func(page int64) (*sqlserverflexalpha.GetFlavorsResponse, error) { + if page == 1 { + return &sqlserverflexalpha.GetFlavorsResponse{ + Flavors: &[]sqlserverflexalpha.ListFlavors{ + {Id: utils.Ptr("flavor-1"), Description: utils.Ptr("first")}, + {Id: utils.Ptr("flavor-2"), Description: utils.Ptr("second")}, + }, + }, nil + } + if page == 2 { + return &sqlserverflexalpha.GetFlavorsResponse{ + Flavors: &[]sqlserverflexalpha.ListFlavors{ + {Id: utils.Ptr("flavor-3"), Description: utils.Ptr("three")}, + }, + }, nil + } + + return &sqlserverflexalpha.GetFlavorsResponse{ + Flavors: &[]sqlserverflexalpha.ListFlavors{}, + }, nil +} + +func TestGetFlavorsByFilter(t *testing.T) { + tests := []struct { + description string + projectId string + region string + mockErr error + filter func(sqlserverflexalpha.ListFlavors) bool + wantCount int + wantErr bool + }{ + { + description: "Success - Get all flavors (2 pages)", + projectId: "pid", region: "reg", + filter: func(_ sqlserverflexalpha.ListFlavors) bool { return true }, + wantCount: 3, + wantErr: false, + }, + { + description: "Success - Filter flavors by description", + projectId: "pid", region: "reg", + filter: func(f sqlserverflexalpha.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 int64 + client := &mockFlavorsClient{ + executeRequest: func() sqlserverflexalpha.ApiGetFlavorsRequestRequest { + return &mockRequest{ + executeFunc: func() (*sqlserverflexalpha.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 int64 + client := &mockFlavorsClient{ + executeRequest: func() sqlserverflexalpha.ApiGetFlavorsRequestRequest { + return &mockRequest{ + executeFunc: func() (*sqlserverflexalpha.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/sqlserverflexalpha/flavor/list_datasource.go.bak b/stackit/internal/services/sqlserverflexalpha/flavor/list_datasource.go.bak deleted file mode 100644 index 9c035504..00000000 --- a/stackit/internal/services/sqlserverflexalpha/flavor/list_datasource.go.bak +++ /dev/null @@ -1,79 +0,0 @@ -package postgresFlexAlphaFlavor - -import ( - "context" - - "github.com/mhenselin/terraform-provider-stackitprivatepreview/pkg/postgresflexalpha" - "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/conversion" - "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha" - postgresflexUtils "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/utils" - - "github.com/hashicorp/terraform-plugin-framework/datasource" - "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/core" -) - -// Ensure the implementation satisfies the expected interfaces. -var ( - _ datasource.DataSource = &flavorListDataSource{} -) - -// NewFlavorListDataSource is a helper function to simplify the provider implementation. -func NewFlavorListDataSource() datasource.DataSource { - return &flavorListDataSource{} -} - -// flavorDataSource is the data source implementation. -type flavorListDataSource struct { - client *postgresflexalpha.APIClient - providerData core.ProviderData -} - -// Metadata returns the data source type name. -func (r *flavorListDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { - resp.TypeName = req.ProviderTypeName + "_postgresflexalpha_flavorlist" -} - -// Configure adds the provider configured client to the data source. -func (r *flavorListDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) - if !ok { - return - } - - apiClient := postgresflexUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient - tflog.Info(ctx, "Postgres Flex flavors client configured") -} - -func (r *flavorListDataSource) Schema(ctx context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) { - resp.Schema = postgresflex.FlavorDataSourceSchema(ctx) -} - -func (r *flavorListDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { - var model postgresflex.FlavorModel - diags := req.Config.Get(ctx, &model) - resp.Diagnostics.Append(diags...) - if resp.Diagnostics.HasError() { - return - } - - ctx = core.InitProviderContext(ctx) - - projectId := model.ProjectId.ValueString() - region := r.providerData.GetRegionWithOverride(model.Region) - ctx = tflog.SetField(ctx, "project_id", projectId) - ctx = tflog.SetField(ctx, "region", region) - - // Set refreshed state - diags = resp.State.Set(ctx, model) - resp.Diagnostics.Append(diags...) - if resp.Diagnostics.HasError() { - return - } - tflog.Info(ctx, "Postgres Flex flavors read") -} diff --git a/stackit/internal/services/sqlserverflexalpha/flavors/datasource.go b/stackit/internal/services/sqlserverflexalpha/flavors/datasource.go new file mode 100644 index 00000000..28c20d5c --- /dev/null +++ b/stackit/internal/services/sqlserverflexalpha/flavors/datasource.go @@ -0,0 +1,71 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + +package sqlserverflexalpha + +import ( + "context" + + "github.com/hashicorp/terraform-plugin-framework/datasource" + "github.com/hashicorp/terraform-plugin-log/tflog" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/pkg/sqlserverflexalpha" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/conversion" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/core" + sqlserverflexUtils "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/utils" + + sqlserverflexalphaGen "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/flavors/datasources_gen" +) + +var _ datasource.DataSource = (*flavorsDataSource)(nil) + +func NewFlavorsDataSource() datasource.DataSource { + return &flavorsDataSource{} +} + +type flavorsDataSource struct { + client *sqlserverflexalpha.APIClient + providerData core.ProviderData +} + +func (d *flavorsDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { + resp.TypeName = req.ProviderTypeName + "_sqlserverflexalpha_flavors" +} + +func (d *flavorsDataSource) Schema(ctx context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) { + resp.Schema = sqlserverflexalphaGen.FlavorsDataSourceSchema(ctx) +} + +// Configure adds the provider configured client to the data source. +func (d *flavorsDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { + var ok bool + d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + if !ok { + return + } + + apiClient := sqlserverflexUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) + if resp.Diagnostics.HasError() { + return + } + d.client = apiClient + tflog.Info(ctx, "SQL SERVER Flex flavors client configured") +} + +func (d *flavorsDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { + var data sqlserverflexalphaGen.FlavorsModel + + // Read Terraform configuration data into the model + resp.Diagnostics.Append(req.Config.Get(ctx, &data)...) + + if resp.Diagnostics.HasError() { + return + } + + // Todo: Read API call logic + + // Example data value setting + // data.Id = types.StringValue("example-id") + + // Save data into Terraform state + resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) +} diff --git a/stackit/internal/services/sqlserverflexalpha/flavor_data_source_gen.go b/stackit/internal/services/sqlserverflexalpha/flavors/datasources_gen/flavors_data_source_gen.go similarity index 97% rename from stackit/internal/services/sqlserverflexalpha/flavor_data_source_gen.go rename to stackit/internal/services/sqlserverflexalpha/flavors/datasources_gen/flavors_data_source_gen.go index d9e87331..43ac64f5 100644 --- a/stackit/internal/services/sqlserverflexalpha/flavor_data_source_gen.go +++ b/stackit/internal/services/sqlserverflexalpha/flavors/datasources_gen/flavors_data_source_gen.go @@ -1,12 +1,10 @@ // Code generated by terraform-plugin-framework-generator DO NOT EDIT. -package sqlserverflex +package sqlserverflexalpha import ( "context" "fmt" - "strings" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/diag" @@ -14,42 +12,18 @@ import ( "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 FlavorDataSourceSchema(ctx context.Context) schema.Schema { +func FlavorsDataSourceSchema(ctx context.Context) schema.Schema { return schema.Schema{ Attributes: map[string]schema.Attribute{ - "cpu": schema.Int64Attribute{ - Optional: true, - Computed: true, - //Description: "The cpu count of the instance.", - //MarkdownDescription: "The cpu count of the instance.", - }, - "ram": schema.Int64Attribute{ - Optional: true, - Computed: true, - //Description: "The cpu count of the instance.", - //MarkdownDescription: "The cpu count of the instance.", - }, - "node_type": schema.StringAttribute{ - Optional: true, - Computed: true, - //Description: "The cpu count of the instance.", - //MarkdownDescription: "The cpu count of the instance.", - }, - "storage_class": schema.StringAttribute{ - Optional: true, - Computed: true, - //Description: "The cpu count of the instance.", - //MarkdownDescription: "The cpu count of the instance.", - }, "flavors": schema.ListNestedAttribute{ NestedObject: schema.NestedAttributeObject{ Attributes: map[string]schema.Attribute{ "cpu": schema.Int64Attribute{ - Optional: true, Computed: true, Description: "The cpu count of the instance.", MarkdownDescription: "The cpu count of the instance.", @@ -70,7 +44,6 @@ func FlavorDataSourceSchema(ctx context.Context) schema.Schema { MarkdownDescription: "maximum storage which can be ordered for the flavor in Gigabyte.", }, "memory": schema.Int64Attribute{ - Optional: true, Computed: true, Description: "The memory of the instance in Gibibyte.", MarkdownDescription: "The memory of the instance in Gibibyte.", @@ -81,10 +54,9 @@ func FlavorDataSourceSchema(ctx context.Context) schema.Schema { MarkdownDescription: "minimum storage which is required to order in Gigabyte.", }, "node_type": schema.StringAttribute{ - Optional: true, Computed: true, - Description: "defines the nodeType it can be either single or replica", - MarkdownDescription: "defines the nodeType it can be either single or replica", + Description: "defines the nodeType it can be either single or HA", + MarkdownDescription: "defines the nodeType it can be either single or HA", }, "storage_classes": schema.ListNestedAttribute{ NestedObject: schema.NestedAttributeObject{ @@ -205,9 +177,6 @@ func FlavorDataSourceSchema(ctx context.Context) schema.Schema { } type FlavorsModel struct { - Cpu types.Int64 `tfsdk:"cpu"` - Ram types.Int64 `tfsdk:"ram"` - NodeType types.String `tfsdk:"node_type"` Flavors types.List `tfsdk:"flavors"` Page types.Int64 `tfsdk:"page"` Pagination PaginationValue `tfsdk:"pagination"` diff --git a/stackit/internal/services/sqlserverflexalpha/instance/functions.go b/stackit/internal/services/sqlserverflexalpha/instance/functions.go index 696edc44..310c6570 100644 --- a/stackit/internal/services/sqlserverflexalpha/instance/functions.go +++ b/stackit/internal/services/sqlserverflexalpha/instance/functions.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package sqlserverflex import ( diff --git a/stackit/internal/services/sqlserverflexalpha/main.go b/stackit/internal/services/sqlserverflexalpha/main.go new file mode 100644 index 00000000..120c0078 --- /dev/null +++ b/stackit/internal/services/sqlserverflexalpha/main.go @@ -0,0 +1,4 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + +package sqlserverflexalpha diff --git a/stackit/internal/services/sqlserverflexalpha/sqlserverflex_acc_test.go b/stackit/internal/services/sqlserverflexalpha/sqlserverflex_acc_test.go index c98de26f..e918223a 100644 --- a/stackit/internal/services/sqlserverflexalpha/sqlserverflex_acc_test.go +++ b/stackit/internal/services/sqlserverflexalpha/sqlserverflex_acc_test.go @@ -1,6 +1,6 @@ // Copyright (c) STACKIT -package sqlserverflex_test +package sqlserverflexalpha_test import ( "context" diff --git a/stackit/internal/services/sqlserverflexalpha/testdata/resource-max.tf b/stackit/internal/services/sqlserverflexalpha/testdata/resource-max.tf index a0cf700a..57e37671 100644 --- a/stackit/internal/services/sqlserverflexalpha/testdata/resource-max.tf +++ b/stackit/internal/services/sqlserverflexalpha/testdata/resource-max.tf @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + variable "project_id" {} variable "name" {} variable "acl1" {} diff --git a/stackit/internal/services/sqlserverflexalpha/testdata/resource-min.tf b/stackit/internal/services/sqlserverflexalpha/testdata/resource-min.tf index 3953ddf1..3b816acc 100644 --- a/stackit/internal/services/sqlserverflexalpha/testdata/resource-min.tf +++ b/stackit/internal/services/sqlserverflexalpha/testdata/resource-min.tf @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + variable "project_id" {} variable "name" {} variable "flavor_cpu" {} diff --git a/stackit/internal/services/sqlserverflexalpha/user/datasource.go b/stackit/internal/services/sqlserverflexalpha/user/datasource.go index 19af445d..d46f3324 100644 --- a/stackit/internal/services/sqlserverflexalpha/user/datasource.go +++ b/stackit/internal/services/sqlserverflexalpha/user/datasource.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package sqlserverflexalpha import ( diff --git a/stackit/internal/services/sqlserverflexalpha/user/datasource_test.go b/stackit/internal/services/sqlserverflexalpha/user/datasource_test.go index ad4f5484..625e8a3c 100644 --- a/stackit/internal/services/sqlserverflexalpha/user/datasource_test.go +++ b/stackit/internal/services/sqlserverflexalpha/user/datasource_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package sqlserverflexalpha import ( diff --git a/stackit/internal/services/sqlserverflexalpha/user/resource.go b/stackit/internal/services/sqlserverflexalpha/user/resource.go index 2980f31c..2afe66d2 100644 --- a/stackit/internal/services/sqlserverflexalpha/user/resource.go +++ b/stackit/internal/services/sqlserverflexalpha/user/resource.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package sqlserverflexalpha import ( diff --git a/stackit/internal/services/sqlserverflexalpha/user/resource_test.go b/stackit/internal/services/sqlserverflexalpha/user/resource_test.go index e62c9364..0d634d36 100644 --- a/stackit/internal/services/sqlserverflexalpha/user/resource_test.go +++ b/stackit/internal/services/sqlserverflexalpha/user/resource_test.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package sqlserverflexalpha import ( diff --git a/stackit/internal/services/sqlserverflexalpha/version/datasource.go b/stackit/internal/services/sqlserverflexalpha/version/datasource.go index 1fb9466b..3ba1e976 100644 --- a/stackit/internal/services/sqlserverflexalpha/version/datasource.go +++ b/stackit/internal/services/sqlserverflexalpha/version/datasource.go @@ -1,35 +1,61 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package sqlserverflexalpha import ( "context" "github.com/hashicorp/terraform-plugin-framework/datasource" - "github.com/hashicorp/terraform-plugin-framework/datasource/schema" - "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-log/tflog" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/pkg/sqlserverflexalpha" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/conversion" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/core" + sqlserverflexUtils "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/utils" + + sqlserverflexalphaGen "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/version/datasources_gen" ) -var _ datasource.DataSource = (*versionDataSource)(nil) +var ( + _ datasource.DataSource = (*versionDataSource)(nil) + _ datasource.DataSourceWithConfigure = (*versionDataSource)(nil) +) func NewVersionDataSource() datasource.DataSource { return &versionDataSource{} } -type versionDataSource struct{} - -type versionDataSourceModel struct { - Id types.String `tfsdk:"id"` +type versionDataSource struct { + client *sqlserverflexalpha.APIClient + providerData core.ProviderData } -func (d *versionDataSource) Metadata(ctx context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { - resp.TypeName = req.ProviderTypeName + "sqlserverflexalpha_version" +func (d *versionDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { + resp.TypeName = req.ProviderTypeName + "_sqlserverflexalpha_version" } -func (d *versionDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { +func (d *versionDataSource) Schema(ctx context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) { resp.Schema = sqlserverflexalphaGen.VersionDataSourceSchema(ctx) } +// Configure adds the provider configured client to the data source. +func (d *versionDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { + var ok bool + d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + if !ok { + return + } + + apiClient := sqlserverflexUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) + if resp.Diagnostics.HasError() { + return + } + d.client = apiClient + tflog.Info(ctx, "SQL SERVER Flex version client configured") +} + func (d *versionDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { - var data sqlserverflexalphaGen.versionDataSourceModel + var data sqlserverflexalphaGen.VersionModel // Read Terraform configuration data into the model resp.Diagnostics.Append(req.Config.Get(ctx, &data)...) @@ -41,7 +67,7 @@ func (d *versionDataSource) Read(ctx context.Context, req datasource.ReadRequest // Todo: Read API call logic // Example data value setting - data.Id = types.StringValue("example-id") + // data.Id = types.StringValue("example-id") // Save data into Terraform state resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) diff --git a/stackit/internal/wait/postgresflexalpha/wait.go b/stackit/internal/wait/postgresflexalpha/wait.go index f0a24e7e..0ab32156 100644 --- a/stackit/internal/wait/postgresflexalpha/wait.go +++ b/stackit/internal/wait/postgresflexalpha/wait.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package postgresflexalpha import ( @@ -53,6 +56,8 @@ func CreateInstanceWaitHandler( ) *wait.AsyncActionHandler[postgresflex.GetInstanceResponse] { instanceCreated := false var instanceGetResponse *postgresflex.GetInstanceResponse + maxWait := time.Minute * 30 + startTime := time.Now() handler := wait.New( func() (waitFinished bool, response *postgresflex.GetInstanceResponse, err error) { @@ -74,7 +79,20 @@ func CreateInstanceWaitHandler( case InstanceStateUnknown: return false, nil, nil case InstanceStateProgressing: - return false, nil, nil + if time.Since(startTime) < maxWait { + return false, nil, nil + } + tflog.Warn( + ctx, + fmt.Sprintf( + "Wait handler still got status %s after %v for instance: %s", + InstanceStateProgressing, + maxWait, + instanceId, + ), + ) + instanceCreated = true + instanceGetResponse = s case InstanceStateSuccess: if s.Network == nil || s.Network.InstanceAddress == nil { tflog.Info(ctx, "Waiting for instance_address") diff --git a/stackit/provider.go b/stackit/provider.go index ad8bd47d..34e7dc5c 100644 --- a/stackit/provider.go +++ b/stackit/provider.go @@ -20,12 +20,14 @@ import ( "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/features" postgresFlexAlphaDatabase "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/database" postgresFlexAlphaFlavor "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/flavor" + postgresflexalphaFlavors "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/flavors" postgresFlexAlphaInstance "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/instance" postgresFlexAlphaUser "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/user" - sqlserverflexalpha "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/database" + sqlserverflexalphaDatabase "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/database" sqlserverFlexAlphaFlavor "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/flavor" sqlServerFlexAlphaInstance "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/instance" sqlserverFlexAlphaUser "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/user" + sqlserverflexalphaVersion "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/version" sdkauth "github.com/stackitcloud/stackit-sdk-go/core/auth" "github.com/stackitcloud/stackit-sdk-go/core/config" ) @@ -496,11 +498,13 @@ func (p *Provider) DataSources(_ context.Context) []func() datasource.DataSource postgresFlexAlphaDatabase.NewDatabaseDataSource, postgresFlexAlphaInstance.NewInstanceDataSource, postgresFlexAlphaUser.NewUserDataSource, + postgresflexalphaFlavors.NewFlavorsDataSource, + sqlserverflexalphaVersion.NewVersionDataSource, sqlserverFlexAlphaFlavor.NewFlavorDataSource, sqlServerFlexAlphaInstance.NewInstanceDataSource, sqlserverFlexAlphaUser.NewUserDataSource, - sqlserverflexalpha.NewDatabaseDataSource, + sqlserverflexalphaDatabase.NewDatabaseDataSource, } } @@ -512,7 +516,7 @@ func (p *Provider) Resources(_ context.Context) []func() resource.Resource { postgresFlexAlphaUser.NewUserResource, sqlServerFlexAlphaInstance.NewInstanceResource, sqlserverFlexAlphaUser.NewUserResource, - sqlserverflexalpha.NewDatabaseResource, + sqlserverflexalphaDatabase.NewDatabaseResource, } return resources } diff --git a/stackit/testdata/provider-all-attributes.tf b/stackit/testdata/provider-all-attributes.tf index 895ea245..a8c4b508 100644 --- a/stackit/testdata/provider-all-attributes.tf +++ b/stackit/testdata/provider-all-attributes.tf @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + variable "project_id" {} variable "name" {} diff --git a/stackit/testdata/provider-credentials.tf b/stackit/testdata/provider-credentials.tf index 32c1d863..377899cb 100644 --- a/stackit/testdata/provider-credentials.tf +++ b/stackit/testdata/provider-credentials.tf @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + variable "project_id" {} variable "name" {} diff --git a/stackit/testdata/provider-invalid-attribute.tf b/stackit/testdata/provider-invalid-attribute.tf index d5a11a2c..4ed38812 100644 --- a/stackit/testdata/provider-invalid-attribute.tf +++ b/stackit/testdata/provider-invalid-attribute.tf @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: Apache-2.0 + variable "project_id" {} variable "name" {} diff --git a/tools/copy.go b/tools/copy.go index 8597f7ba..bcd8100a 100644 --- a/tools/copy.go +++ b/tools/copy.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package tools import ( @@ -33,7 +36,7 @@ func CopyDirectory(scrDir, dest string) error { switch fileInfo.Mode() & os.ModeType { case os.ModeDir: - if err := CreateIfNotExists(destPath, 0755); err != nil { + if err := CreateIfNotExists(destPath, 0o755); err != nil { return err } if err := CopyDirectory(sourcePath, destPath); err != nil { diff --git a/tools/formats.go b/tools/formats.go index 8b73a42a..e1fac07d 100644 --- a/tools/formats.go +++ b/tools/formats.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package tools import ( @@ -32,7 +35,7 @@ func ToPascalCase(in string) string { } return snakeLetters.ReplaceAllStringFunc(ucName, func(s string) string { - return strings.ToUpper(strings.Replace(s, "_", "", -1)) + return strings.ToUpper(strings.ReplaceAll(s, "_", "")) }) } diff --git a/tools/main.go b/tools/main.go index 3a0eef6b..e455c59d 100644 --- a/tools/main.go +++ b/tools/main.go @@ -1,3 +1,6 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: Apache-2.0 + package tools import ( @@ -65,20 +68,20 @@ func Build() error { slog.Info("Creating oas dir", "dir", fmt.Sprintf("%s/%s", *root, OAS_REPO_NAME)) repoDir, err := createRepoDir(genDir, OAS_REPO, OAS_REPO_NAME) if err != nil { - return fmt.Errorf(err.Error()) + return fmt.Errorf("%s", err.Error()) } slog.Info("Retrieving versions from subdirs") // TODO - major verMap, err := getVersions(repoDir) if err != nil { - return fmt.Errorf(err.Error()) + return fmt.Errorf("%s", err.Error()) } slog.Info("Reducing to only latest or highest") res, err := getOnlyLatest(verMap) if err != nil { - return fmt.Errorf(err.Error()) + return fmt.Errorf("%s", err.Error()) } slog.Info("Creating OAS dir") @@ -105,14 +108,14 @@ func Build() error { dstFile := path.Join(genDir, "oas", fmt.Sprintf("%s.json", service)) _, err = copyFile(srcFile, dstFile) if err != nil { - return fmt.Errorf(err.Error()) + return fmt.Errorf("%s", err.Error()) } } slog.Info("Cleaning up", "dir", repoDir) err = os.RemoveAll(filepath.Dir(repoDir)) if err != nil { - return fmt.Errorf(err.Error()) + return fmt.Errorf("%s", err.Error()) } slog.Info("Changing dir", "dir", genDir) @@ -128,7 +131,7 @@ func Build() error { cmd.Stderr = &stdErr if err = cmd.Start(); err != nil { - slog.Error("cmd.Start", err) + slog.Error("cmd.Start", "error", err) return err } @@ -136,8 +139,9 @@ func Build() error { var exitErr *exec.ExitError if errors.As(err, &exitErr) { slog.Error("cmd.Wait", "code", exitErr.ExitCode()) - return fmt.Errorf(stdErr.String()) - } else { + return fmt.Errorf("%s", stdErr.String()) + } + if err != nil { slog.Error("cmd.Wait", "err", err) return err } @@ -168,7 +172,7 @@ func Build() error { } slog.Info("Rearranging package directories") - err = os.MkdirAll(path.Join(*root, "pkg"), 0755) + err = os.MkdirAll(path.Join(*root, "pkg"), 0755) // noqa:gosec if err != nil { return err } @@ -283,10 +287,11 @@ func createBoilerplate(rootFolder, folder string) error { return err } - handleDS := false - handleRes := false - foundDS := false - foundRes := false + var handleDS bool + var handleRes bool + var foundDS bool + var foundRes bool + for _, res := range resources { if !res.IsDir() { continue @@ -436,6 +441,7 @@ func generateServiceFiles(rootDir, generatorDir string) error { // slog.Info("Generating openapi spec json") specFile := path.Join(rootDir, "generated", "specs", fmt.Sprintf("%s_%s_spec.json", scName, resource)) + // noqa:gosec cmd := exec.Command( "tfplugingen-openapi", "generate", @@ -459,6 +465,7 @@ func generateServiceFiles(rootDir, generatorDir string) error { } // slog.Info("Generating terraform service resource files") + // noqa:gosec cmd2 := exec.Command( "tfplugingen-framework", "generate", @@ -475,7 +482,7 @@ func generateServiceFiles(rootDir, generatorDir string) error { cmd2.Stderr = &stdErr if err = cmd2.Start(); err != nil { - slog.Error("cmd.Start", err) + slog.Error("cmd.Start", "error", err) return err } @@ -483,8 +490,9 @@ func generateServiceFiles(rootDir, generatorDir string) error { var exitErr *exec.ExitError if errors.As(err, &exitErr) { slog.Error("cmd.Wait", "code", exitErr.ExitCode()) - return fmt.Errorf(stdErr.String()) - } else { + return fmt.Errorf("%s", stdErr.String()) + } + if err != nil { slog.Error("cmd.Wait", "err", err) return err } @@ -498,6 +506,8 @@ func generateServiceFiles(rootDir, generatorDir string) error { } // slog.Info("Generating terraform service resource files") + + // noqa:gosec cmd3 := exec.Command( "tfplugingen-framework", "generate", @@ -514,7 +524,7 @@ func generateServiceFiles(rootDir, generatorDir string) error { cmd3.Stderr = &stdErr3 if err = cmd3.Start(); err != nil { - slog.Error("cmd.Start", err) + slog.Error("cmd.Start", "error", err) return err } @@ -522,8 +532,9 @@ func generateServiceFiles(rootDir, generatorDir string) error { var exitErr *exec.ExitError if errors.As(err, &exitErr) { slog.Error("cmd.Wait", "code", exitErr.ExitCode()) - return fmt.Errorf(stdErr.String()) - } else { + return fmt.Errorf("%s", stdErr.String()) + } + if err != nil { slog.Error("cmd.Wait", "err", err) return err } @@ -537,11 +548,10 @@ func generateServiceFiles(rootDir, generatorDir string) error { func checkCommands(commands []string) error { for _, commandName := range commands { - if commandExists(commandName) { - slog.Info("found", "command", commandName) - } else { - return fmt.Errorf("missing command %s\n", commandName) + if !commandExists(commandName) { + return fmt.Errorf("missing command %s", commandName) } + slog.Info("found", "command", commandName) } return nil } diff --git a/tools/templates/data_source_scaffold.gotmpl b/tools/templates/data_source_scaffold.gotmpl index bcfb65ac..38986c9f 100644 --- a/tools/templates/data_source_scaffold.gotmpl +++ b/tools/templates/data_source_scaffold.gotmpl @@ -7,6 +7,8 @@ import ( "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/pkg/{{.PackageName}}" + {{.PackageName}}Gen "github.com/mhenselin/terraform-provider-stackitprivatepreview/stackit/internal/services/{{.PackageName}}/{{.NameSnake}}/datasources_gen" ) @@ -21,11 +23,11 @@ type {{.NameCamel}}DataSource struct{ providerData core.ProviderData } -func (d *{{.NameCamel}}DataSource) Metadata(ctx context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { +func (d *{{.NameCamel}}DataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { resp.TypeName = req.ProviderTypeName + "_{{.PackageName}}_{{.NameSnake}}" } -func (d *{{.NameCamel}}DataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { +func (d *{{.NameCamel}}DataSource) Schema(ctx context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) { resp.Schema = {{.PackageName}}Gen.{{.NamePascal}}DataSourceSchema(ctx) }