From c938f03b6e78158587ebaff0542cef14f89ac60d Mon Sep 17 00:00:00 2001 From: Mikhail Smolin Date: Wed, 15 May 2024 13:28:07 +0000 Subject: [PATCH] Pull request #1233: change project structure in yandex-framework pkg \ remove utils package \ change yandex-framework test structure Merge in CLOUD/terraform-provider-yandex-mirror from terraform-provider-framework-resources-refactor to master Squashed commit of the following: commit 9a8260d50c024a197d7a60102df6994349c5f7f5 Author: Mikhail Smolin Date: Mon May 13 15:52:42 2024 +0200 add todo for min func commit 74b531c010aca4e24e910925b5f6afb6edb428bd Author: Mikhail Smolin Date: Mon Apr 29 19:19:34 2024 +0200 change project structure in yandex-framework pkg \ remove utils package \ change yandex-framework test structure --- .golangci.yml | 1 - main.go | 6 +- yandex-framework/math/math.go | 9 + .../config}/config.go | 6 +- yandex-framework/{ => provider}/provider.go | 48 +++--- yandex-framework/resourceid/id.go | 21 +++ yandex-framework/retry/retry.go | 44 +++++ .../billing}/data_source.go | 5 +- .../billing}/resource.go | 5 +- .../billing}/util.go | 2 +- .../datasphere}/community/data_source.go | 5 +- .../datasphere}/community/iam_binding.go | 4 +- .../datasphere}/community/iam_updater.go | 30 ++-- .../datasphere}/community/models.go | 2 +- .../datasphere}/community/resource.go | 14 +- .../datasphere}/community/utils.go | 7 +- .../services/datasphere/consts.go | 5 + .../datasphere}/iam/iam_binding.go | 3 +- .../datasphere}/iam/resource_updater.go | 1 + .../{ => services/datasphere}/iam/utils.go | 3 +- .../datasphere}/project/data_source.go | 5 +- .../datasphere}/project/iam_binding.go | 4 +- .../datasphere}/project/iam_updater.go | 30 ++-- .../datasphere}/project/models.go | 2 +- .../datasphere}/project/resource.go | 14 +- .../datasphere}/project/utils.go | 7 +- .../mdb/mongodb/database}/api.go | 8 +- .../mdb/mongodb/database}/data_source.go | 8 +- .../mdb/mongodb/database}/models.go | 2 +- .../mdb/mongodb/database}/resource.go | 12 +- .../mdb/mongodb/user}/api.go | 10 +- .../mdb/mongodb/user}/data_source.go | 8 +- .../mdb/mongodb/user}/models.go | 2 +- .../mdb/mongodb/user}/resource.go | 14 +- ..._billing_cloud_binding_data_source_test.go | 23 +-- ...dex_billing_cloud_binding_resource_test.go | 51 +++--- yandex-framework/test/datasphere/cases.go | 118 +++++++++++++ ...x_datasphere_community_data_source_test.go | 20 ++- ...ndex_datasphere_community_resource_test.go | 140 +++++----------- ...x_datasphere_community_iam_binding_test.go | 26 +-- ...dex_datasphere_project_iam_binding_test.go | 28 ++-- ...dex_datasphere_project_data_source_test.go | 20 ++- ...yandex_datasphere_project_resource_test.go | 155 ++++++------------ yandex-framework/test/env_helpers.go | 144 ++++++++-------- ...source_yandex_mdb_mongodb_database_test.go | 32 ++-- ...source_yandex_mdb_mongodb_database_test.go | 15 +- .../test/mdb/mongodb/templates.go | 11 ++ ...ata_source_yandex_mdb_mongodb_user_test.go | 22 +-- .../resource_yandex_mdb_mongodb_user_test.go | 17 +- yandex-framework/test/sweeper_helpers.go | 39 ++--- yandex-framework/test/sweeper_helpers_test.go | 6 +- yandex-framework/test/test_utils.go | 4 +- .../test/yandex_resoursemanager_cloud_test.go | 8 +- yandex-framework/timestamp/timestsamp.go | 16 ++ yandex-framework/utils/utils.go | 94 ----------- 55 files changed, 682 insertions(+), 654 deletions(-) create mode 100644 yandex-framework/math/math.go rename yandex-framework/{provider-config => provider/config}/config.go (99%) rename yandex-framework/{ => provider}/provider.go (84%) create mode 100644 yandex-framework/resourceid/id.go create mode 100644 yandex-framework/retry/retry.go rename yandex-framework/{yandex-billing-cloud-binding => services/billing}/data_source.go (95%) rename yandex-framework/{yandex-billing-cloud-binding => services/billing}/resource.go (98%) rename yandex-framework/{yandex-billing-cloud-binding => services/billing}/util.go (98%) rename yandex-framework/{yandex-datasphere => services/datasphere}/community/data_source.go (96%) rename yandex-framework/{yandex-datasphere => services/datasphere}/community/iam_binding.go (80%) rename yandex-framework/{yandex-datasphere => services/datasphere}/community/iam_updater.go (84%) rename yandex-framework/{yandex-datasphere => services/datasphere}/community/models.go (94%) rename yandex-framework/{yandex-datasphere => services/datasphere}/community/resource.go (97%) rename yandex-framework/{yandex-datasphere => services/datasphere}/community/utils.go (87%) create mode 100644 yandex-framework/services/datasphere/consts.go rename yandex-framework/{ => services/datasphere}/iam/iam_binding.go (99%) rename yandex-framework/{ => services/datasphere}/iam/resource_updater.go (99%) rename yandex-framework/{ => services/datasphere}/iam/utils.go (99%) rename yandex-framework/{yandex-datasphere => services/datasphere}/project/data_source.go (97%) rename yandex-framework/{yandex-datasphere => services/datasphere}/project/iam_binding.go (80%) rename yandex-framework/{yandex-datasphere => services/datasphere}/project/iam_updater.go (84%) rename yandex-framework/{yandex-datasphere => services/datasphere}/project/models.go (98%) rename yandex-framework/{yandex-datasphere => services/datasphere}/project/resource.go (98%) rename yandex-framework/{yandex-datasphere => services/datasphere}/project/utils.go (95%) rename yandex-framework/{yandex-mdb-mongodb-database => services/mdb/mongodb/database}/api.go (89%) rename yandex-framework/{yandex-mdb-mongodb-database => services/mdb/mongodb/database}/data_source.go (93%) rename yandex-framework/{yandex-mdb-mongodb-database => services/mdb/mongodb/database}/models.go (85%) rename yandex-framework/{yandex-mdb-mongodb-database => services/mdb/mongodb/database}/resource.go (93%) rename yandex-framework/{yandex-mdb-mongodb-user => services/mdb/mongodb/user}/api.go (88%) rename yandex-framework/{yandex-mdb-mongodb-user => services/mdb/mongodb/user}/data_source.go (94%) rename yandex-framework/{yandex-mdb-mongodb-user => services/mdb/mongodb/user}/models.go (98%) rename yandex-framework/{yandex-mdb-mongodb-user => services/mdb/mongodb/user}/resource.go (94%) rename yandex-framework/test/{ => billing}/yandex_billing_cloud_binding_data_source_test.go (83%) rename yandex-framework/test/{ => billing}/yandex_billing_cloud_binding_resource_test.go (88%) create mode 100644 yandex-framework/test/datasphere/cases.go rename yandex-framework/test/{ => datasphere/community}/yandex_datasphere_community_data_source_test.go (71%) rename yandex-framework/test/{ => datasphere/community}/yandex_datasphere_community_resource_test.go (51%) rename yandex-framework/test/{ => datasphere/iam}/yandex_datasphere_community_iam_binding_test.go (70%) rename yandex-framework/test/{ => datasphere/iam}/yandex_datasphere_project_iam_binding_test.go (70%) rename yandex-framework/test/{ => datasphere/project}/yandex_datasphere_project_data_source_test.go (64%) rename yandex-framework/test/{ => datasphere/project}/yandex_datasphere_project_resource_test.go (60%) rename yandex-framework/test/{ => mdb/mongodb/database}/data_source_yandex_mdb_mongodb_database_test.go (87%) rename yandex-framework/test/{ => mdb/mongodb/database}/resource_yandex_mdb_mongodb_database_test.go (88%) create mode 100644 yandex-framework/test/mdb/mongodb/templates.go rename yandex-framework/test/{ => mdb/mongodb/user}/data_source_yandex_mdb_mongodb_user_test.go (88%) rename yandex-framework/test/{ => mdb/mongodb/user}/resource_yandex_mdb_mongodb_user_test.go (92%) create mode 100644 yandex-framework/timestamp/timestsamp.go delete mode 100644 yandex-framework/utils/utils.go diff --git a/.golangci.yml b/.golangci.yml index ec90839ed..0addfd7c6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -38,7 +38,6 @@ linters-settings: issues: new-from-rev: master # Analyse only differense between master->${git branch git branch --show-current} - max-per-linter: 0 max-same-issues: 0 exclude-rules: - linters: diff --git a/main.go b/main.go index b88eb23d1..25986cbeb 100644 --- a/main.go +++ b/main.go @@ -3,14 +3,14 @@ package main import ( "context" "flag" + + "github.com/hashicorp/terraform-plugin-framework/providerserver" "github.com/hashicorp/terraform-plugin-go/tfprotov6" "github.com/hashicorp/terraform-plugin-go/tfprotov6/tf6server" "github.com/hashicorp/terraform-plugin-mux/tf5to6server" "github.com/hashicorp/terraform-plugin-mux/tf6muxserver" - - "github.com/hashicorp/terraform-plugin-framework/providerserver" "github.com/yandex-cloud/terraform-provider-yandex/yandex" - yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework" + yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider" ) func NewMuxProviderServer(ctx context.Context) (func() tfprotov6.ProviderServer, error) { diff --git a/yandex-framework/math/math.go b/yandex-framework/math/math.go new file mode 100644 index 000000000..29244d6b2 --- /dev/null +++ b/yandex-framework/math/math.go @@ -0,0 +1,9 @@ +package math + +// TODO (miksmolin) will have been replaced with function from std package after go 1.21 update +func Min(a, b int) int { + if a < b { + return a + } + return b +} diff --git a/yandex-framework/provider-config/config.go b/yandex-framework/provider/config/config.go similarity index 99% rename from yandex-framework/provider-config/config.go rename to yandex-framework/provider/config/config.go index 9d90a56ca..97e2e94cb 100644 --- a/yandex-framework/provider-config/config.go +++ b/yandex-framework/provider/config/config.go @@ -1,4 +1,4 @@ -package provider_config +package config import ( "context" @@ -30,6 +30,10 @@ import ( "github.com/yandex-cloud/terraform-provider-yandex/pkg/logging" ) +const ( + DefaultTimeout = 1 * time.Minute +) + const ( defaultExponentialBackoffBase = 50 * time.Millisecond defaultExponentialBackoffCap = 1 * time.Minute diff --git a/yandex-framework/provider.go b/yandex-framework/provider/provider.go similarity index 84% rename from yandex-framework/provider.go rename to yandex-framework/provider/provider.go index 7232ff3f4..38ceccc48 100644 --- a/yandex-framework/provider.go +++ b/yandex-framework/provider/provider.go @@ -1,4 +1,4 @@ -package yandex_framework +package provider import ( "context" @@ -7,11 +7,6 @@ import ( "os" "strconv" - yandex_datasphere_community "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/yandex-datasphere/community" - yandex_datasphere_project "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/yandex-datasphere/project" - yandex_mdb_mongodb_database "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/yandex-mdb-mongodb-database" - yandex_mdb_mongodb_user "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/yandex-mdb-mongodb-user" - "github.com/hashicorp/terraform-plugin-framework-validators/providervalidator" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/path" @@ -20,10 +15,13 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/yandex-cloud/terraform-provider-yandex/common" - provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" - yandex_billing_cloud_binding "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/yandex-billing-cloud-binding" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/services/billing" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/services/datasphere/community" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/services/datasphere/project" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/services/mdb/mongodb/database" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/services/mdb/mongodb/user" ) type saKeyValidator struct{} @@ -237,30 +235,30 @@ func (p *Provider) Configure(ctx context.Context, req provider.ConfigureRequest, func (p *Provider) Resources(_ context.Context) []func() resource.Resource { return []func() resource.Resource{ func() resource.Resource { - return yandex_billing_cloud_binding.NewResource( - yandex_billing_cloud_binding.BindingServiceInstanceCloudType, - yandex_billing_cloud_binding.BindingServiceInstanceCloudIdFieldName) + return billing.NewResource( + billing.BindingServiceInstanceCloudType, + billing.BindingServiceInstanceCloudIdFieldName) }, - yandex_datasphere_project.NewResource, - yandex_datasphere_project.NewIamBinding, - yandex_datasphere_community.NewResource, - yandex_datasphere_community.NewIamBinding, - yandex_mdb_mongodb_database.NewResource, - yandex_mdb_mongodb_user.NewResource, + project.NewResource, + project.NewIamBinding, + community.NewResource, + community.NewIamBinding, + database.NewResource, + user.NewResource, } } func (p *Provider) DataSources(_ context.Context) []func() datasource.DataSource { return []func() datasource.DataSource{ func() datasource.DataSource { - return yandex_billing_cloud_binding.NewDataSource( - yandex_billing_cloud_binding.BindingServiceInstanceCloudType, - yandex_billing_cloud_binding.BindingServiceInstanceCloudIdFieldName) + return billing.NewDataSource( + billing.BindingServiceInstanceCloudType, + billing.BindingServiceInstanceCloudIdFieldName) }, - yandex_datasphere_project.NewDataSource, - yandex_datasphere_community.NewDataSource, - yandex_mdb_mongodb_database.NewDataSource, - yandex_mdb_mongodb_user.NewDataSource, + project.NewDataSource, + community.NewDataSource, + database.NewDataSource, + user.NewDataSource, } } diff --git a/yandex-framework/resourceid/id.go b/yandex-framework/resourceid/id.go new file mode 100644 index 000000000..872556a98 --- /dev/null +++ b/yandex-framework/resourceid/id.go @@ -0,0 +1,21 @@ +package resourceid + +import ( + "fmt" + "strings" +) + +func Construct(clusterID string, resourceName string) string { + return fmt.Sprintf("%s:%s", clusterID, resourceName) +} + +func Deconstruct(resourceID string) (string, string, error) { + parts := strings.SplitN(resourceID, ":", 2) + if len(parts) != 2 { + return "", "", fmt.Errorf("Invalid resource id format: %q", resourceID) + } + + clusterID := parts[0] + resourceName := parts[1] + return clusterID, resourceName, nil +} diff --git a/yandex-framework/retry/retry.go b/yandex-framework/retry/retry.go new file mode 100644 index 000000000..8dd94d93e --- /dev/null +++ b/yandex-framework/retry/retry.go @@ -0,0 +1,44 @@ +package retry + +import ( + "context" + "fmt" + "regexp" + + "github.com/hashicorp/terraform-plugin-log/tflog" + "github.com/yandex-cloud/go-genproto/yandex/cloud/operation" + ycsdk "github.com/yandex-cloud/go-sdk" + sdkoperation "github.com/yandex-cloud/go-sdk/operation" + "google.golang.org/grpc/status" +) + +func ConflictingOperation(ctx context.Context, sdk *ycsdk.SDK, action func() (*operation.Operation, error)) (*sdkoperation.Operation, error) { + for { + op, err := sdk.WrapOperation(action()) + if err == nil { + return op, nil + } + + operationID := "" + message := status.Convert(err).Message() + submatchGoApi := regexp.MustCompile(`conflicting operation "(.+)" detected`).FindStringSubmatch(message) + submatchPyApi := regexp.MustCompile(`Conflicting operation (.+) detected`).FindStringSubmatch(message) + if len(submatchGoApi) > 0 { + operationID = submatchGoApi[1] + } else if len(submatchPyApi) > 0 { + operationID = submatchPyApi[1] + } else { + return op, err + } + + tflog.Debug(ctx, fmt.Sprintf("Waiting for conflicting operation %q to complete", operationID)) + req := &operation.GetOperationRequest{OperationId: operationID} + op, err = sdk.WrapOperation(sdk.Operation().Get(ctx, req)) + if err != nil { + return nil, err + } + + _ = op.Wait(ctx) + tflog.Debug(ctx, fmt.Sprintf("Conflicting operation %q has completed. Going to retry initial action.", operationID)) + } +} diff --git a/yandex-framework/yandex-billing-cloud-binding/data_source.go b/yandex-framework/services/billing/data_source.go similarity index 95% rename from yandex-framework/yandex-billing-cloud-binding/data_source.go rename to yandex-framework/services/billing/data_source.go index c9dd2a250..902b04ae7 100644 --- a/yandex-framework/yandex-billing-cloud-binding/data_source.go +++ b/yandex-framework/services/billing/data_source.go @@ -1,4 +1,4 @@ -package yandex_billing_cloud_binding +package billing import ( "context" @@ -6,8 +6,7 @@ import ( "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" - - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" ) type bindingDataSource struct { diff --git a/yandex-framework/yandex-billing-cloud-binding/resource.go b/yandex-framework/services/billing/resource.go similarity index 98% rename from yandex-framework/yandex-billing-cloud-binding/resource.go rename to yandex-framework/services/billing/resource.go index cf4759fa5..8f0ad6f81 100644 --- a/yandex-framework/yandex-billing-cloud-binding/resource.go +++ b/yandex-framework/services/billing/resource.go @@ -1,4 +1,4 @@ -package yandex_billing_cloud_binding +package billing import ( "context" @@ -11,9 +11,8 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/yandex-cloud/go-genproto/yandex/cloud/billing/v1" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" "google.golang.org/protobuf/encoding/protojson" - - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" ) type bindingResource struct { diff --git a/yandex-framework/yandex-billing-cloud-binding/util.go b/yandex-framework/services/billing/util.go similarity index 98% rename from yandex-framework/yandex-billing-cloud-binding/util.go rename to yandex-framework/services/billing/util.go index 318f9f760..ab3300123 100644 --- a/yandex-framework/yandex-billing-cloud-binding/util.go +++ b/yandex-framework/services/billing/util.go @@ -1,4 +1,4 @@ -package yandex_billing_cloud_binding +package billing import ( "context" diff --git a/yandex-framework/yandex-datasphere/community/data_source.go b/yandex-framework/services/datasphere/community/data_source.go similarity index 96% rename from yandex-framework/yandex-datasphere/community/data_source.go rename to yandex-framework/services/datasphere/community/data_source.go index dae4d7bd4..a92f1c924 100644 --- a/yandex-framework/yandex-datasphere/community/data_source.go +++ b/yandex-framework/services/datasphere/community/data_source.go @@ -1,15 +1,16 @@ -package yandex_datasphere_community +package community import ( "context" "fmt" + "github.com/hashicorp/terraform-plugin-framework-timeouts/resource/timeouts" "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/yandex-cloud/go-genproto/yandex/cloud/datasphere/v2" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" ) type communityDataSource struct { diff --git a/yandex-framework/yandex-datasphere/community/iam_binding.go b/yandex-framework/services/datasphere/community/iam_binding.go similarity index 80% rename from yandex-framework/yandex-datasphere/community/iam_binding.go rename to yandex-framework/services/datasphere/community/iam_binding.go index 76c6ca7b5..9b1f4af25 100644 --- a/yandex-framework/yandex-datasphere/community/iam_binding.go +++ b/yandex-framework/services/datasphere/community/iam_binding.go @@ -1,8 +1,8 @@ -package yandex_datasphere_community +package community import ( "github.com/hashicorp/terraform-plugin-framework/resource" - iam_binding "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/iam" + iam_binding "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/services/datasphere/iam" ) func NewIamBinding() resource.Resource { diff --git a/yandex-framework/yandex-datasphere/community/iam_updater.go b/yandex-framework/services/datasphere/community/iam_updater.go similarity index 84% rename from yandex-framework/yandex-datasphere/community/iam_updater.go rename to yandex-framework/services/datasphere/community/iam_updater.go index 6a4f78d8a..69765f301 100644 --- a/yandex-framework/yandex-datasphere/community/iam_updater.go +++ b/yandex-framework/services/datasphere/community/iam_updater.go @@ -1,17 +1,19 @@ -package yandex_datasphere_community +package community import ( "context" "fmt" + "github.com/hashicorp/terraform-plugin-framework/diag" "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/types" "github.com/yandex-cloud/go-genproto/yandex/cloud/access" - iam_binging "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/iam" - provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/utils" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/math" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/services/datasphere" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/services/datasphere/iam" ) type CommunityIAMUpdater struct { @@ -19,7 +21,7 @@ type CommunityIAMUpdater struct { ProviderConfig *provider_config.Config } -func newCommunityIamUpdater() iam_binging.ResourceIamUpdater { +func newCommunityIamUpdater() iam.ResourceIamUpdater { return &CommunityIAMUpdater{} } @@ -59,27 +61,27 @@ func (u *CommunityIAMUpdater) Configure(_ context.Context, req resource.Configur u.ProviderConfig = providerConfig } -func (u *CommunityIAMUpdater) Initialize(ctx context.Context, state iam_binging.Extractable, diag *diag.Diagnostics) { +func (u *CommunityIAMUpdater) Initialize(ctx context.Context, state iam.Extractable, diag *diag.Diagnostics) { var id types.String diag.Append(state.GetAttribute(ctx, path.Root("community_id"), &id)...) u.CommunityId = id.ValueString() } -func (u *CommunityIAMUpdater) GetResourceIamPolicy(ctx context.Context) (*iam_binging.Policy, error) { +func (u *CommunityIAMUpdater) GetResourceIamPolicy(ctx context.Context) (*iam.Policy, error) { bindings, err := u.GeAccessBindings(ctx, u.CommunityId) if err != nil { return nil, err } - return &iam_binging.Policy{Bindings: bindings}, nil + return &iam.Policy{Bindings: bindings}, nil } -func (u *CommunityIAMUpdater) SetResourceIamPolicy(ctx context.Context, policy *iam_binging.Policy) error { +func (u *CommunityIAMUpdater) SetResourceIamPolicy(ctx context.Context, policy *iam.Policy) error { req := &access.SetAccessBindingsRequest{ ResourceId: u.CommunityId, AccessBindings: policy.Bindings, } - ctx, cancel := context.WithTimeout(ctx, utils.DefaultTimeout) + ctx, cancel := context.WithTimeout(ctx, provider_config.DefaultTimeout) defer cancel() op, err := u.ProviderConfig.SDK.WrapOperation( @@ -97,15 +99,15 @@ func (u *CommunityIAMUpdater) SetResourceIamPolicy(ctx context.Context, policy * return nil } -func (u *CommunityIAMUpdater) UpdateResourceIamPolicy(ctx context.Context, policy *iam_binging.PolicyDelta) error { +func (u *CommunityIAMUpdater) UpdateResourceIamPolicy(ctx context.Context, policy *iam.PolicyDelta) error { bSize := 1000 deltas := policy.Deltas dLen := len(deltas) - for i := 0; i < iam_binging.CountBatches(dLen, bSize); i++ { + for i := 0; i < iam.CountBatches(dLen, bSize); i++ { req := &access.UpdateAccessBindingsRequest{ ResourceId: u.CommunityId, - AccessBindingDeltas: deltas[i*bSize : utils.Min((i+1)*bSize, dLen)], + AccessBindingDeltas: deltas[i*bSize : math.Min((i+1)*bSize, dLen)], } op, err := u.ProviderConfig.SDK.WrapOperation( @@ -141,7 +143,7 @@ func (u *CommunityIAMUpdater) GeAccessBindings(ctx context.Context, id string) ( ctx, &access.ListAccessBindingsRequest{ ResourceId: id, - PageSize: utils.DefaultPageSize, + PageSize: datasphere.DefaultPageSize, PageToken: pageToken, }, ) diff --git a/yandex-framework/yandex-datasphere/community/models.go b/yandex-framework/services/datasphere/community/models.go similarity index 94% rename from yandex-framework/yandex-datasphere/community/models.go rename to yandex-framework/services/datasphere/community/models.go index 90afd1bf0..ff7afd5af 100644 --- a/yandex-framework/yandex-datasphere/community/models.go +++ b/yandex-framework/services/datasphere/community/models.go @@ -1,4 +1,4 @@ -package yandex_datasphere_community +package community import ( "github.com/hashicorp/terraform-plugin-framework-timeouts/resource/timeouts" diff --git a/yandex-framework/yandex-datasphere/community/resource.go b/yandex-framework/services/datasphere/community/resource.go similarity index 97% rename from yandex-framework/yandex-datasphere/community/resource.go rename to yandex-framework/services/datasphere/community/resource.go index 68bac8855..0ea8fe649 100644 --- a/yandex-framework/yandex-datasphere/community/resource.go +++ b/yandex-framework/services/datasphere/community/resource.go @@ -1,8 +1,10 @@ -package yandex_datasphere_community +package community import ( "context" "fmt" + "regexp" + "github.com/hashicorp/terraform-plugin-framework-timeouts/resource/timeouts" "github.com/hashicorp/terraform-plugin-framework-validators/mapvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" @@ -15,10 +17,8 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" "github.com/yandex-cloud/go-genproto/yandex/cloud/datasphere/v2" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/utils" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" "google.golang.org/genproto/protobuf/field_mask" - "regexp" ) type communityResource struct { @@ -46,7 +46,7 @@ func (r *communityResource) Create(ctx context.Context, req resource.CreateReque } } - createTimeout, timeoutInitError := plannedCommunity.Timeouts.Create(ctx, utils.DefaultTimeout) + createTimeout, timeoutInitError := plannedCommunity.Timeouts.Create(ctx, provider_config.DefaultTimeout) if timeoutInitError != nil { resp.Diagnostics.Append(timeoutInitError...) return @@ -168,7 +168,7 @@ func (r *communityResource) Update(ctx context.Context, req resource.UpdateReque resp.Diagnostics.Append(req.Plan.Get(ctx, &plannedCommunity)...) resp.Diagnostics.Append(req.State.Get(ctx, &stateCommunity)...) - updateTimeout, timeoutInitError := plannedCommunity.Timeouts.Update(ctx, utils.DefaultTimeout) + updateTimeout, timeoutInitError := plannedCommunity.Timeouts.Update(ctx, provider_config.DefaultTimeout) if timeoutInitError != nil { resp.Diagnostics.Append(timeoutInitError...) return @@ -271,7 +271,7 @@ func (r *communityResource) Delete(ctx context.Context, req resource.DeleteReque resp.Diagnostics.Append(req.State.Get(ctx, &stateCommunity)...) - removeTimeout, timeoutInitError := stateCommunity.Timeouts.Delete(ctx, utils.DefaultTimeout) + removeTimeout, timeoutInitError := stateCommunity.Timeouts.Delete(ctx, provider_config.DefaultTimeout) if timeoutInitError != nil { resp.Diagnostics.Append(timeoutInitError...) return diff --git a/yandex-framework/yandex-datasphere/community/utils.go b/yandex-framework/services/datasphere/community/utils.go similarity index 87% rename from yandex-framework/yandex-datasphere/community/utils.go rename to yandex-framework/services/datasphere/community/utils.go index d3893ee6e..f9fc33739 100644 --- a/yandex-framework/yandex-datasphere/community/utils.go +++ b/yandex-framework/services/datasphere/community/utils.go @@ -1,18 +1,19 @@ -package yandex_datasphere_community +package community import ( "context" + "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/yandex-cloud/go-genproto/yandex/cloud/datasphere/v2" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/utils" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/timestamp" ) // convertToTerraformModel Convert from the Proto community data model to the Terraform community data model // and refresh any attribute values. func convertToTerraformModel(ctx context.Context, terraformModel *communityDataModel, grpcModel *datasphere.Community, diag *diag.Diagnostics) { terraformModel.Name = types.StringValue(grpcModel.Name) - terraformModel.CreatedAt = types.StringValue(utils.GetTimestamp(grpcModel.CreatedAt)) + terraformModel.CreatedAt = types.StringValue(timestamp.Get(grpcModel.CreatedAt)) terraformModel.Description = types.StringValue(grpcModel.Description) terraformModel.CreatedBy = types.StringValue(grpcModel.CreatedById) terraformModel.OrganizationId = types.StringValue(grpcModel.OrganizationId) diff --git a/yandex-framework/services/datasphere/consts.go b/yandex-framework/services/datasphere/consts.go new file mode 100644 index 000000000..55ee1ebfd --- /dev/null +++ b/yandex-framework/services/datasphere/consts.go @@ -0,0 +1,5 @@ +package datasphere + +const ( + DefaultPageSize = 1000 +) diff --git a/yandex-framework/iam/iam_binding.go b/yandex-framework/services/datasphere/iam/iam_binding.go similarity index 99% rename from yandex-framework/iam/iam_binding.go rename to yandex-framework/services/datasphere/iam/iam_binding.go index eebc4f42d..b0b9b9d34 100644 --- a/yandex-framework/iam/iam_binding.go +++ b/yandex-framework/services/datasphere/iam/iam_binding.go @@ -11,9 +11,8 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" - "golang.org/x/exp/maps" - "github.com/yandex-cloud/go-genproto/yandex/cloud/access" + "golang.org/x/exp/maps" ) type bindingResource struct { diff --git a/yandex-framework/iam/resource_updater.go b/yandex-framework/services/datasphere/iam/resource_updater.go similarity index 99% rename from yandex-framework/iam/resource_updater.go rename to yandex-framework/services/datasphere/iam/resource_updater.go index 82bbbc09f..b6ca2db12 100644 --- a/yandex-framework/iam/resource_updater.go +++ b/yandex-framework/services/datasphere/iam/resource_updater.go @@ -3,6 +3,7 @@ package iam import ( "context" "fmt" + "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/resource" diff --git a/yandex-framework/iam/utils.go b/yandex-framework/services/datasphere/iam/utils.go similarity index 99% rename from yandex-framework/iam/utils.go rename to yandex-framework/services/datasphere/iam/utils.go index 88655918b..4ff5e6801 100644 --- a/yandex-framework/iam/utils.go +++ b/yandex-framework/services/datasphere/iam/utils.go @@ -2,8 +2,9 @@ package iam import ( "fmt" - "github.com/yandex-cloud/go-genproto/yandex/cloud/access" "strings" + + "github.com/yandex-cloud/go-genproto/yandex/cloud/access" ) func roleMemberToAccessBinding(role, member string) *access.AccessBinding { diff --git a/yandex-framework/yandex-datasphere/project/data_source.go b/yandex-framework/services/datasphere/project/data_source.go similarity index 97% rename from yandex-framework/yandex-datasphere/project/data_source.go rename to yandex-framework/services/datasphere/project/data_source.go index 8ba9e39da..c475dfca4 100644 --- a/yandex-framework/yandex-datasphere/project/data_source.go +++ b/yandex-framework/services/datasphere/project/data_source.go @@ -1,15 +1,16 @@ -package yandex_datasphere_project +package project import ( "context" "fmt" + "github.com/hashicorp/terraform-plugin-framework-timeouts/resource/timeouts" "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/yandex-cloud/go-genproto/yandex/cloud/datasphere/v2" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" ) type projectDataSource struct { diff --git a/yandex-framework/yandex-datasphere/project/iam_binding.go b/yandex-framework/services/datasphere/project/iam_binding.go similarity index 80% rename from yandex-framework/yandex-datasphere/project/iam_binding.go rename to yandex-framework/services/datasphere/project/iam_binding.go index 6f70ffdd2..f2c255f4b 100644 --- a/yandex-framework/yandex-datasphere/project/iam_binding.go +++ b/yandex-framework/services/datasphere/project/iam_binding.go @@ -1,8 +1,8 @@ -package yandex_datasphere_project +package project import ( "github.com/hashicorp/terraform-plugin-framework/resource" - iam_binding "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/iam" + iam_binding "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/services/datasphere/iam" ) func NewIamBinding() resource.Resource { diff --git a/yandex-framework/yandex-datasphere/project/iam_updater.go b/yandex-framework/services/datasphere/project/iam_updater.go similarity index 84% rename from yandex-framework/yandex-datasphere/project/iam_updater.go rename to yandex-framework/services/datasphere/project/iam_updater.go index 768b1e7b2..5cd222f9b 100644 --- a/yandex-framework/yandex-datasphere/project/iam_updater.go +++ b/yandex-framework/services/datasphere/project/iam_updater.go @@ -1,17 +1,19 @@ -package yandex_datasphere_project +package project import ( "context" "fmt" + "github.com/hashicorp/terraform-plugin-framework/diag" "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/types" "github.com/yandex-cloud/go-genproto/yandex/cloud/access" - iam_binging "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/iam" - provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/utils" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/math" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/services/datasphere" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/services/datasphere/iam" ) type ProjectIAMUpdater struct { @@ -19,7 +21,7 @@ type ProjectIAMUpdater struct { ProviderConfig *provider_config.Config } -func newProjectIamUpdater() iam_binging.ResourceIamUpdater { +func newProjectIamUpdater() iam.ResourceIamUpdater { return &ProjectIAMUpdater{} } @@ -59,27 +61,27 @@ func (u *ProjectIAMUpdater) Configure(_ context.Context, req resource.ConfigureR u.ProviderConfig = providerConfig } -func (u *ProjectIAMUpdater) Initialize(ctx context.Context, state iam_binging.Extractable, diag *diag.Diagnostics) { +func (u *ProjectIAMUpdater) Initialize(ctx context.Context, state iam.Extractable, diag *diag.Diagnostics) { var id types.String diag.Append(state.GetAttribute(ctx, path.Root("project_id"), &id)...) u.ProjectId = id.ValueString() } -func (u *ProjectIAMUpdater) GetResourceIamPolicy(ctx context.Context) (*iam_binging.Policy, error) { +func (u *ProjectIAMUpdater) GetResourceIamPolicy(ctx context.Context) (*iam.Policy, error) { bindings, err := u.GeAccessBindings(ctx, u.ProjectId) if err != nil { return nil, err } - return &iam_binging.Policy{Bindings: bindings}, nil + return &iam.Policy{Bindings: bindings}, nil } -func (u *ProjectIAMUpdater) SetResourceIamPolicy(ctx context.Context, policy *iam_binging.Policy) error { +func (u *ProjectIAMUpdater) SetResourceIamPolicy(ctx context.Context, policy *iam.Policy) error { req := &access.SetAccessBindingsRequest{ ResourceId: u.ProjectId, AccessBindings: policy.Bindings, } - ctx, cancel := context.WithTimeout(ctx, utils.DefaultTimeout) + ctx, cancel := context.WithTimeout(ctx, provider_config.DefaultTimeout) defer cancel() op, err := u.ProviderConfig.SDK.WrapOperation(u.ProviderConfig.SDK.Datasphere().Project().SetAccessBindings(ctx, req)) @@ -95,15 +97,15 @@ func (u *ProjectIAMUpdater) SetResourceIamPolicy(ctx context.Context, policy *ia return nil } -func (u *ProjectIAMUpdater) UpdateResourceIamPolicy(ctx context.Context, policy *iam_binging.PolicyDelta) error { +func (u *ProjectIAMUpdater) UpdateResourceIamPolicy(ctx context.Context, policy *iam.PolicyDelta) error { bSize := 1000 deltas := policy.Deltas dLen := len(deltas) - for i := 0; i < iam_binging.CountBatches(dLen, bSize); i++ { + for i := 0; i < iam.CountBatches(dLen, bSize); i++ { req := &access.UpdateAccessBindingsRequest{ ResourceId: u.ProjectId, - AccessBindingDeltas: deltas[i*bSize : utils.Min((i+1)*bSize, dLen)], + AccessBindingDeltas: deltas[i*bSize : math.Min((i+1)*bSize, dLen)], } op, err := u.ProviderConfig.SDK.WrapOperation(u.ProviderConfig.SDK.Datasphere().Project().UpdateAccessBindings(ctx, req)) @@ -135,7 +137,7 @@ func (u *ProjectIAMUpdater) GeAccessBindings(ctx context.Context, id string) ([] for { resp, err := u.ProviderConfig.SDK.Datasphere().Project().ListAccessBindings(ctx, &access.ListAccessBindingsRequest{ ResourceId: id, - PageSize: utils.DefaultPageSize, + PageSize: datasphere.DefaultPageSize, PageToken: pageToken, }) if err != nil { diff --git a/yandex-framework/yandex-datasphere/project/models.go b/yandex-framework/services/datasphere/project/models.go similarity index 98% rename from yandex-framework/yandex-datasphere/project/models.go rename to yandex-framework/services/datasphere/project/models.go index 68591e9a7..9572a9cdb 100644 --- a/yandex-framework/yandex-datasphere/project/models.go +++ b/yandex-framework/services/datasphere/project/models.go @@ -1,4 +1,4 @@ -package yandex_datasphere_project +package project import ( "github.com/hashicorp/terraform-plugin-framework-timeouts/resource/timeouts" diff --git a/yandex-framework/yandex-datasphere/project/resource.go b/yandex-framework/services/datasphere/project/resource.go similarity index 98% rename from yandex-framework/yandex-datasphere/project/resource.go rename to yandex-framework/services/datasphere/project/resource.go index a7a1dd5ec..88d6334e7 100644 --- a/yandex-framework/yandex-datasphere/project/resource.go +++ b/yandex-framework/services/datasphere/project/resource.go @@ -1,8 +1,10 @@ -package yandex_datasphere_project +package project import ( "context" "fmt" + "regexp" + "github.com/hashicorp/terraform-plugin-framework-timeouts/resource/timeouts" "github.com/hashicorp/terraform-plugin-framework-validators/mapvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" @@ -18,11 +20,9 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types/basetypes" "github.com/hashicorp/terraform-plugin-log/tflog" "github.com/yandex-cloud/go-genproto/yandex/cloud/datasphere/v2" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/utils" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" "google.golang.org/genproto/protobuf/field_mask" "google.golang.org/protobuf/types/known/wrapperspb" - "regexp" ) type projectResource struct { @@ -40,7 +40,7 @@ func (r *projectResource) Create(ctx context.Context, req resource.CreateRequest resp.Diagnostics.Append(req.Plan.Get(ctx, &plannedProject)...) - createTimeout, timeoutInitError := plannedProject.Timeouts.Create(ctx, utils.DefaultTimeout) + createTimeout, timeoutInitError := plannedProject.Timeouts.Create(ctx, provider_config.DefaultTimeout) if timeoutInitError != nil { resp.Diagnostics.Append(timeoutInitError...) return @@ -245,7 +245,7 @@ func (r *projectResource) Update(ctx context.Context, req resource.UpdateRequest var planProject, stateProject projectDataModel - updateTimeout, timeoutInitError := planProject.Timeouts.Update(ctx, utils.DefaultTimeout) + updateTimeout, timeoutInitError := planProject.Timeouts.Update(ctx, provider_config.DefaultTimeout) if timeoutInitError != nil { resp.Diagnostics.Append(timeoutInitError...) return @@ -458,7 +458,7 @@ func (r *projectResource) Delete(ctx context.Context, req resource.DeleteRequest resp.Diagnostics.Append(req.State.Get(ctx, &stateProject)...) - removeTimeout, timeoutInitError := stateProject.Timeouts.Delete(ctx, utils.DefaultTimeout) + removeTimeout, timeoutInitError := stateProject.Timeouts.Delete(ctx, provider_config.DefaultTimeout) if timeoutInitError != nil { resp.Diagnostics.Append(timeoutInitError...) return diff --git a/yandex-framework/yandex-datasphere/project/utils.go b/yandex-framework/services/datasphere/project/utils.go similarity index 95% rename from yandex-framework/yandex-datasphere/project/utils.go rename to yandex-framework/services/datasphere/project/utils.go index 7d28a3ab5..5ad503412 100644 --- a/yandex-framework/yandex-datasphere/project/utils.go +++ b/yandex-framework/services/datasphere/project/utils.go @@ -1,11 +1,12 @@ -package yandex_datasphere_project +package project import ( "context" + "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/yandex-cloud/go-genproto/yandex/cloud/datasphere/v2" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/utils" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/timestamp" "google.golang.org/protobuf/types/known/wrapperspb" ) @@ -13,7 +14,7 @@ import ( // and refresh any attribute values. func convertToTerraformModel(ctx context.Context, terraformModel *projectDataModel, grpcModel *datasphere.Project, diag *diag.Diagnostics, balance *wrapperspb.Int64Value) { terraformModel.Name = types.StringValue(grpcModel.Name) - terraformModel.CreatedAt = types.StringValue(utils.GetTimestamp(grpcModel.CreatedAt)) + terraformModel.CreatedAt = types.StringValue(timestamp.Get(grpcModel.CreatedAt)) terraformModel.Description = types.StringValue(grpcModel.Description) terraformModel.CreatedBy = types.StringValue(grpcModel.CreatedById) terraformModel.CommunityId = types.StringValue(grpcModel.CommunityId) diff --git a/yandex-framework/yandex-mdb-mongodb-database/api.go b/yandex-framework/services/mdb/mongodb/database/api.go similarity index 89% rename from yandex-framework/yandex-mdb-mongodb-database/api.go rename to yandex-framework/services/mdb/mongodb/database/api.go index b0804e9ce..326f3fea0 100644 --- a/yandex-framework/yandex-mdb-mongodb-database/api.go +++ b/yandex-framework/services/mdb/mongodb/database/api.go @@ -1,4 +1,4 @@ -package yandex_mdb_mongodb_database +package database import ( "context" @@ -7,7 +7,7 @@ import ( "github.com/yandex-cloud/go-genproto/yandex/cloud/mdb/mongodb/v1" "github.com/yandex-cloud/go-genproto/yandex/cloud/operation" ycsdk "github.com/yandex-cloud/go-sdk" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/utils" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/retry" ) func readDatabase(ctx context.Context, sdk *ycsdk.SDK, diag *diag.Diagnostics, cid string, dbName string) *mongodb.Database { @@ -27,7 +27,7 @@ func readDatabase(ctx context.Context, sdk *ycsdk.SDK, diag *diag.Diagnostics, c } func createDatabase(ctx context.Context, sdk *ycsdk.SDK, diag *diag.Diagnostics, cid, dbName string) { - op, err := utils.RetryConflictingOperation(ctx, sdk, func() (*operation.Operation, error) { + op, err := retry.ConflictingOperation(ctx, sdk, func() (*operation.Operation, error) { return sdk.MDB().MongoDB().Database().Create(ctx, &mongodb.CreateDatabaseRequest{ ClusterId: cid, DatabaseSpec: &mongodb.DatabaseSpec{ @@ -53,7 +53,7 @@ func createDatabase(ctx context.Context, sdk *ycsdk.SDK, diag *diag.Diagnostics, } func deleteDatabase(ctx context.Context, sdk *ycsdk.SDK, diag *diag.Diagnostics, cid string, dbName string) { - op, err := utils.RetryConflictingOperation(ctx, sdk, func() (*operation.Operation, error) { + op, err := retry.ConflictingOperation(ctx, sdk, func() (*operation.Operation, error) { return sdk.MDB().MongoDB().Database().Delete(ctx, &mongodb.DeleteDatabaseRequest{ ClusterId: cid, DatabaseName: dbName, diff --git a/yandex-framework/yandex-mdb-mongodb-database/data_source.go b/yandex-framework/services/mdb/mongodb/database/data_source.go similarity index 93% rename from yandex-framework/yandex-mdb-mongodb-database/data_source.go rename to yandex-framework/services/mdb/mongodb/database/data_source.go index e42f1cd53..424680527 100644 --- a/yandex-framework/yandex-mdb-mongodb-database/data_source.go +++ b/yandex-framework/services/mdb/mongodb/database/data_source.go @@ -1,4 +1,4 @@ -package yandex_mdb_mongodb_database +package database import ( "context" @@ -7,8 +7,8 @@ import ( "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/types" - provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/utils" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/resourceid" ) type bindingDataSource struct { @@ -71,6 +71,6 @@ func (d *bindingDataSource) Read(ctx context.Context, req datasource.ReadRequest } state.ClusterID = types.StringValue(db.ClusterId) state.Name = types.StringValue(db.Name) - state.Id = types.StringValue(utils.ConstructResourceId(cid, dbName)) + state.Id = types.StringValue(resourceid.Construct(cid, dbName)) resp.Diagnostics.Append(resp.State.Set(ctx, &state)...) } diff --git a/yandex-framework/yandex-mdb-mongodb-database/models.go b/yandex-framework/services/mdb/mongodb/database/models.go similarity index 85% rename from yandex-framework/yandex-mdb-mongodb-database/models.go rename to yandex-framework/services/mdb/mongodb/database/models.go index c8e854ed9..476fe0a5b 100644 --- a/yandex-framework/yandex-mdb-mongodb-database/models.go +++ b/yandex-framework/services/mdb/mongodb/database/models.go @@ -1,4 +1,4 @@ -package yandex_mdb_mongodb_database +package database import "github.com/hashicorp/terraform-plugin-framework/types" diff --git a/yandex-framework/yandex-mdb-mongodb-database/resource.go b/yandex-framework/services/mdb/mongodb/database/resource.go similarity index 93% rename from yandex-framework/yandex-mdb-mongodb-database/resource.go rename to yandex-framework/services/mdb/mongodb/database/resource.go index 8aaf59157..5f3cf3ceb 100644 --- a/yandex-framework/yandex-mdb-mongodb-database/resource.go +++ b/yandex-framework/services/mdb/mongodb/database/resource.go @@ -1,4 +1,4 @@ -package yandex_mdb_mongodb_database +package database import ( "context" @@ -9,8 +9,8 @@ import ( "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" - provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/utils" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/resourceid" ) type bindingResource struct { @@ -86,7 +86,7 @@ func (r *bindingResource) Read(ctx context.Context, req resource.ReadRequest, re state.ClusterID = types.StringValue(db.ClusterId) state.Name = types.StringValue(db.Name) - state.Id = types.StringValue(utils.ConstructResourceId(cid, dbName)) + state.Id = types.StringValue(resourceid.Construct(cid, dbName)) diags = resp.State.Set(ctx, &state) resp.Diagnostics.Append(diags...) } @@ -106,7 +106,7 @@ func (r *bindingResource) Create(ctx context.Context, req resource.CreateRequest return } - plan.Id = types.StringValue(utils.ConstructResourceId(cid, dbName)) + plan.Id = types.StringValue(resourceid.Construct(cid, dbName)) diags = resp.State.Set(ctx, plan) resp.Diagnostics.Append(diags...) } @@ -130,7 +130,7 @@ func (r *bindingResource) Delete(ctx context.Context, req resource.DeleteRequest } func (r *bindingResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { - clusterId, dbName, err := utils.DeconstructResourceId(req.ID) + clusterId, dbName, err := resourceid.Deconstruct(req.ID) if err != nil { resp.Diagnostics.AddError( "Unexpected Import Identifier", diff --git a/yandex-framework/yandex-mdb-mongodb-user/api.go b/yandex-framework/services/mdb/mongodb/user/api.go similarity index 88% rename from yandex-framework/yandex-mdb-mongodb-user/api.go rename to yandex-framework/services/mdb/mongodb/user/api.go index 2c3c00fb1..a74c472e2 100644 --- a/yandex-framework/yandex-mdb-mongodb-user/api.go +++ b/yandex-framework/services/mdb/mongodb/user/api.go @@ -1,4 +1,4 @@ -package yandex_mdb_mongodb_user +package user import ( "context" @@ -7,7 +7,7 @@ import ( "github.com/yandex-cloud/go-genproto/yandex/cloud/mdb/mongodb/v1" "github.com/yandex-cloud/go-genproto/yandex/cloud/operation" ycsdk "github.com/yandex-cloud/go-sdk" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/utils" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/retry" "google.golang.org/protobuf/types/known/fieldmaskpb" ) @@ -28,7 +28,7 @@ func readUser(ctx context.Context, sdk *ycsdk.SDK, diag *diag.Diagnostics, cid s } func createUser(ctx context.Context, sdk *ycsdk.SDK, diag *diag.Diagnostics, cid string, user *mongodb.UserSpec) { - op, err := utils.RetryConflictingOperation(ctx, sdk, func() (*operation.Operation, error) { + op, err := retry.ConflictingOperation(ctx, sdk, func() (*operation.Operation, error) { return sdk.MDB().MongoDB().User().Create(ctx, &mongodb.CreateUserRequest{ ClusterId: cid, UserSpec: user, @@ -52,7 +52,7 @@ func createUser(ctx context.Context, sdk *ycsdk.SDK, diag *diag.Diagnostics, cid } func updateUser(ctx context.Context, sdk *ycsdk.SDK, diag *diag.Diagnostics, cid string, user *mongodb.UserSpec, updatePaths []string) { - op, err := utils.RetryConflictingOperation(ctx, sdk, func() (*operation.Operation, error) { + op, err := retry.ConflictingOperation(ctx, sdk, func() (*operation.Operation, error) { return sdk.MDB().MongoDB().User().Update(ctx, &mongodb.UpdateUserRequest{ ClusterId: cid, UserName: user.Name, @@ -79,7 +79,7 @@ func updateUser(ctx context.Context, sdk *ycsdk.SDK, diag *diag.Diagnostics, cid } func deleteUser(ctx context.Context, sdk *ycsdk.SDK, diag *diag.Diagnostics, cid, userName string) { - op, err := utils.RetryConflictingOperation(ctx, sdk, func() (*operation.Operation, error) { + op, err := retry.ConflictingOperation(ctx, sdk, func() (*operation.Operation, error) { return sdk.MDB().MongoDB().User().Delete(ctx, &mongodb.DeleteUserRequest{ ClusterId: cid, UserName: userName, diff --git a/yandex-framework/yandex-mdb-mongodb-user/data_source.go b/yandex-framework/services/mdb/mongodb/user/data_source.go similarity index 94% rename from yandex-framework/yandex-mdb-mongodb-user/data_source.go rename to yandex-framework/services/mdb/mongodb/user/data_source.go index 264da1229..c6c17eab5 100644 --- a/yandex-framework/yandex-mdb-mongodb-user/data_source.go +++ b/yandex-framework/services/mdb/mongodb/user/data_source.go @@ -1,4 +1,4 @@ -package yandex_mdb_mongodb_user +package user import ( "context" @@ -8,8 +8,8 @@ import ( "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-framework/types/basetypes" - provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/utils" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/resourceid" ) type bindingDataSource struct { @@ -89,7 +89,7 @@ func (d *bindingDataSource) Read(ctx context.Context, req datasource.ReadRequest if resp.Diagnostics.HasError() { return } - state.Id = types.StringValue(utils.ConstructResourceId(cid, userName)) + state.Id = types.StringValue(resourceid.Construct(cid, userName)) resp.Diagnostics.Append(userToState(user, &state)...) if resp.Diagnostics.HasError() { diff --git a/yandex-framework/yandex-mdb-mongodb-user/models.go b/yandex-framework/services/mdb/mongodb/user/models.go similarity index 98% rename from yandex-framework/yandex-mdb-mongodb-user/models.go rename to yandex-framework/services/mdb/mongodb/user/models.go index 02e49b1f7..85d0d47ad 100644 --- a/yandex-framework/yandex-mdb-mongodb-user/models.go +++ b/yandex-framework/services/mdb/mongodb/user/models.go @@ -1,4 +1,4 @@ -package yandex_mdb_mongodb_user +package user import ( "context" diff --git a/yandex-framework/yandex-mdb-mongodb-user/resource.go b/yandex-framework/services/mdb/mongodb/user/resource.go similarity index 94% rename from yandex-framework/yandex-mdb-mongodb-user/resource.go rename to yandex-framework/services/mdb/mongodb/user/resource.go index 943f471a5..44d446963 100644 --- a/yandex-framework/yandex-mdb-mongodb-user/resource.go +++ b/yandex-framework/services/mdb/mongodb/user/resource.go @@ -1,4 +1,4 @@ -package yandex_mdb_mongodb_user +package user import ( "context" @@ -11,8 +11,8 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-framework/types/basetypes" "github.com/yandex-cloud/go-genproto/yandex/cloud/mdb/mongodb/v1" - provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/utils" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/resourceid" ) type bindingResource struct { @@ -108,7 +108,7 @@ func (r *bindingResource) Read(ctx context.Context, req resource.ReadRequest, re return } - state.Id = types.StringValue(utils.ConstructResourceId(cid, userName)) + state.Id = types.StringValue(resourceid.Construct(cid, userName)) diags = resp.State.Set(ctx, &state) resp.Diagnostics.Append(diags...) } @@ -133,7 +133,7 @@ func (r *bindingResource) Create(ctx context.Context, req resource.CreateRequest return } - plan.Id = types.StringValue(utils.ConstructResourceId(cid, userPlan.Name)) + plan.Id = types.StringValue(resourceid.Construct(cid, userPlan.Name)) diags = resp.State.Set(ctx, plan) resp.Diagnostics.Append(diags...) } @@ -175,7 +175,7 @@ func (r *bindingResource) Update(ctx context.Context, req resource.UpdateRequest return } - state.Id = types.StringValue(utils.ConstructResourceId(cid, userPlan.Name)) + state.Id = types.StringValue(resourceid.Construct(cid, userPlan.Name)) diags = resp.State.Set(ctx, plan) resp.Diagnostics.Append(diags...) } @@ -194,7 +194,7 @@ func (r *bindingResource) Delete(ctx context.Context, req resource.DeleteRequest } func (r *bindingResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { - clusterId, userName, err := utils.DeconstructResourceId(req.ID) + clusterId, userName, err := resourceid.Deconstruct(req.ID) if err != nil { resp.Diagnostics.AddError( "Unexpected Import Identifier", diff --git a/yandex-framework/test/yandex_billing_cloud_binding_data_source_test.go b/yandex-framework/test/billing/yandex_billing_cloud_binding_data_source_test.go similarity index 83% rename from yandex-framework/test/yandex_billing_cloud_binding_data_source_test.go rename to yandex-framework/test/billing/yandex_billing_cloud_binding_data_source_test.go index 7913561c7..9eef11292 100644 --- a/yandex-framework/test/yandex_billing_cloud_binding_data_source_test.go +++ b/yandex-framework/test/billing/yandex_billing_cloud_binding_data_source_test.go @@ -1,4 +1,4 @@ -package test +package billing import ( "fmt" @@ -8,6 +8,7 @@ import ( "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test" ) const billingCloudBindingBindingDataSource = "data.yandex_billing_cloud_binding.test_cloud_binding_data_binding" @@ -15,11 +16,11 @@ const billingCloudBindingBindingDataSource = "data.yandex_billing_cloud_binding. func TestAccDataSourceBillingCloudBinding_BindExistingCloudToExistingBillingAccountThenCheckData(t *testing.T) { firstBillingAccountId := billingInstanceTestFirstBillingAccountId() secondBillingAccountId := billingInstanceTestSecondBillingAccountId() - cloudId := getExampleCloudID() + cloudId := test.GetExampleCloudID() resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, CheckDestroy: func(state *terraform.State) error { return testAccCheckBillingCloudBindingDestroy(state) }, @@ -43,11 +44,11 @@ func TestAccDataSourceBillingCloudBinding_BindExistingCloudToExistingBillingAcco func TestAccDataSourceBillingCloudBinding_CheckNonExistingBillingAccountData(t *testing.T) { billingAccountId := fmt.Sprintf("non-existing-billing-account-id-%s", acctest.RandString(10)) - cloudId := getExampleCloudID() + cloudId := test.GetExampleCloudID() resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, Steps: []resource.TestStep{ { Config: testAccDataSourceBillingCloudBindingGetDataSource(billingAccountId, cloudId), @@ -62,8 +63,8 @@ func TestAccDataSourceBillingCloudBinding_CheckNonExistingCloudData(t *testing.T cloudId := fmt.Sprintf("non-existing-cloud-id-%s", acctest.RandString(10)) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, Steps: []resource.TestStep{ { Config: testAccDataSourceBillingCloudBindingGetDataSource(billingAccountId, cloudId), @@ -78,8 +79,8 @@ func TestAccDataSourceBillingCloudBinding_CheckNonExistingBillingAccountNonExist cloudId := fmt.Sprintf("non-existing-cloud-id-%s", acctest.RandString(10)) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, Steps: []resource.TestStep{ { Config: testAccDataSourceBillingCloudBindingGetDataSource(billingAccountId, cloudId), diff --git a/yandex-framework/test/yandex_billing_cloud_binding_resource_test.go b/yandex-framework/test/billing/yandex_billing_cloud_binding_resource_test.go similarity index 88% rename from yandex-framework/test/yandex_billing_cloud_binding_resource_test.go rename to yandex-framework/test/billing/yandex_billing_cloud_binding_resource_test.go index d1eeb9559..acbf5a977 100644 --- a/yandex-framework/test/yandex_billing_cloud_binding_resource_test.go +++ b/yandex-framework/test/billing/yandex_billing_cloud_binding_resource_test.go @@ -1,4 +1,4 @@ -package test +package billing import ( "context" @@ -8,16 +8,15 @@ import ( "testing" "time" - "github.com/yandex-cloud/go-genproto/yandex/cloud/billing/v1" - yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework" - provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" - yandex_billing_cloud_binding "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/yandex-billing-cloud-binding" - "github.com/hashicorp/go-multierror" - "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" + "github.com/yandex-cloud/go-genproto/yandex/cloud/billing/v1" + yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" + yandex_billing_cloud_binding "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/services/billing" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test" ) const billingCloudBindingBindingResource = "yandex_billing_cloud_binding.test_cloud_binding_resource_binding" @@ -43,13 +42,13 @@ func init() { } func testSweepBillingCloudBinding(_ string) error { - conf, err := configForSweepers() + conf, err := test.ConfigForSweepers() if err != nil { return fmt.Errorf("error getting client: %s", err) } if !isAllNeedleEnvsAvailable() { - debugLog("yandex_billing_cloud_binding sweeper was skeeped") + test.DebugLog("yandex_billing_cloud_binding sweeper was skeeped") return nil } @@ -84,7 +83,7 @@ func isAllNeedleEnvsAvailable() bool { } func sweepBillingCloudBinding(conf *provider_config.Config, cloudId string) bool { - return sweepWithRetry(sweepBillingCloudBindingOnce, conf, "Billing Cloud Binding", cloudId) + return test.SweepWithRetry(sweepBillingCloudBindingOnce, conf, "Billing Cloud Binding", cloudId) } func sweepBillingCloudBindingOnce(conf *provider_config.Config, instanceId string) error { @@ -100,17 +99,17 @@ func sweepBillingCloudBindingOnce(conf *provider_config.Config, instanceId strin BillableObject: billableObject, } op, err := conf.SDK.Billing().BillingAccount().BindBillableObject(ctx, req) - return handleSweepOperation(ctx, conf, op, err) + return test.HandleSweepOperation(ctx, conf, op, err) } func TestAccResourceBillingCloudBinding_BindExistingCloudToExistingBillingAccount(t *testing.T) { firstBillingAccountId := billingInstanceTestFirstBillingAccountId() secondBillingAccountId := billingInstanceTestSecondBillingAccountId() - cloudId := getExampleCloudID() + cloudId := test.GetExampleCloudID() resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, CheckDestroy: testAccCheckBillingCloudBindingDestroy, Steps: []resource.TestStep{ { @@ -141,11 +140,11 @@ func TestAccResourceBillingCloudBinding_BindExistingCloudToExistingBillingAccoun func TestAccResourceBillingCloudBinding_BindExistingCloudToExistingBillingAccountWithSelfBind(t *testing.T) { firstBillingAccountId := billingInstanceTestFirstBillingAccountId() secondBillingAccountId := billingInstanceTestSecondBillingAccountId() - cloudId := getExampleCloudID() + cloudId := test.GetExampleCloudID() resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, CheckDestroy: testAccCheckBillingCloudBindingDestroy, Steps: []resource.TestStep{ { @@ -183,11 +182,11 @@ func TestAccResourceBillingCloudBinding_BindExistingCloudToExistingBillingAccoun func TestAccResourceBillingCloudBinding_BindNonExistingCloudToExistingBillingAccount(t *testing.T) { nonExistingBillingAccountId := fmt.Sprintf("non-existing-billing-account-id-%s", acctest.RandString(10)) - cloudId := getExampleCloudID() + cloudId := test.GetExampleCloudID() resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, CheckDestroy: testAccCheckBillingCloudBindingDestroy, Steps: []resource.TestStep{ { @@ -203,8 +202,8 @@ func TestAccResourceBillingCloudBinding_BindExistingCloudToNonExistingBillingAcc cloudId := fmt.Sprintf("non-existing-cloud-id-%s", acctest.RandString(10)) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, CheckDestroy: testAccCheckBillingCloudBindingDestroy, Steps: []resource.TestStep{ { @@ -220,8 +219,8 @@ func TestAccResourceBillingCloudBinding_BindNonExistingCloudToNonExistingBilling cloudId := fmt.Sprintf("non-existing-cloud-id-%s", acctest.RandString(10)) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, CheckDestroy: testAccCheckBillingCloudBindingDestroy, Steps: []resource.TestStep{ { @@ -233,7 +232,7 @@ func TestAccResourceBillingCloudBinding_BindNonExistingCloudToNonExistingBilling } func testAccCheckBillingCloudBindingDestroy(s *terraform.State) error { - config := testAccProvider.(*yandex_framework.Provider).GetConfig() + config := test.AccProvider.(*yandex_framework.Provider).GetConfig() for _, rs := range s.RootModule().Resources { if rs.Type != "yandex_billing_cloud_binding" { @@ -281,7 +280,7 @@ func testAccCheckBillingCloudBindingExists(name string) resource.TestCheckFunc { return err } - config := testAccProvider.(*yandex_framework.Provider).GetConfig() + config := test.AccProvider.(*yandex_framework.Provider).GetConfig() it := config.SDK.Billing().BillingAccount().BillingAccountBillableObjectBindingsIterator( context.Background(), diff --git a/yandex-framework/test/datasphere/cases.go b/yandex-framework/test/datasphere/cases.go new file mode 100644 index 000000000..3dc13e7ea --- /dev/null +++ b/yandex-framework/test/datasphere/cases.go @@ -0,0 +1,118 @@ +package dataspheretest + +import ( + "context" + "fmt" + + "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/hashicorp/terraform-plugin-testing/terraform" + "github.com/yandex-cloud/go-genproto/yandex/cloud/datasphere/v2" + yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test" +) + +const ( + CommunityResourceName = "yandex_datasphere_community.test-community" + ProjectResourceName = "yandex_datasphere_project.test-project" +) + +func ProjectExists(name string) resource.TestCheckFunc { + return func(s *terraform.State) error { + config := test.AccProvider.(*yandex_framework.Provider).GetConfig() + + rs, ok := s.RootModule().Resources[name] + if !ok { + return fmt.Errorf("not found: %s", name) + } + + if rs.Primary.ID == "" { + return fmt.Errorf("no ID is set") + } + + id := rs.Primary.ID + + found, err := config.SDK.Datasphere().Project().Get(context.Background(), &datasphere.GetProjectRequest{ + ProjectId: id, + }) + if err != nil { + return err + } + + if found.Id != rs.Primary.ID { + return fmt.Errorf("project not found") + } + + return nil + } +} + +func AccCheckProjectDestroy(s *terraform.State) error { + config := test.AccProvider.(*yandex_framework.Provider).GetConfig() + + for _, rs := range s.RootModule().Resources { + if rs.Type != "yandex_project_project" { + continue + } + id := rs.Primary.ID + + _, err := config.SDK.Datasphere().Project().Get(context.Background(), &datasphere.GetProjectRequest{ + ProjectId: id, + }) + if err == nil { + return fmt.Errorf("project still exists") + } + } + + return nil +} + +func CommunityExists(name string) resource.TestCheckFunc { + return func(s *terraform.State) error { + config := test.AccProvider.(*yandex_framework.Provider).GetConfig() + a := s.RootModule().Resources + fmt.Printf("%s", a) + rs, ok := s.RootModule().Resources[name] + if !ok { + return fmt.Errorf("not found: %s", name) + } + + if rs.Primary.ID == "" { + return fmt.Errorf("no ID is set") + } + + id := rs.Primary.ID + + found, err := config.SDK.Datasphere().Community().Get(context.Background(), &datasphere.GetCommunityRequest{ + CommunityId: id, + }) + if err != nil { + return err + } + + if found.Id != rs.Primary.ID { + return fmt.Errorf("community not found") + } + + return nil + } +} + +func AccCheckCommunityDestroy(s *terraform.State) error { + config := test.AccProvider.(*yandex_framework.Provider).GetConfig() + + for _, rs := range s.RootModule().Resources { + if rs.Type != "yandex_datasphere_community" { + continue + } + id := rs.Primary.ID + + _, err := config.SDK.Datasphere().Community().Get(context.Background(), &datasphere.GetCommunityRequest{ + CommunityId: id, + }) + if err == nil { + return fmt.Errorf("community still exists") + } + } + + return nil +} diff --git a/yandex-framework/test/yandex_datasphere_community_data_source_test.go b/yandex-framework/test/datasphere/community/yandex_datasphere_community_data_source_test.go similarity index 71% rename from yandex-framework/test/yandex_datasphere_community_data_source_test.go rename to yandex-framework/test/datasphere/community/yandex_datasphere_community_data_source_test.go index 3cbe08d7d..f9ed8c26a 100644 --- a/yandex-framework/test/yandex_datasphere_community_data_source_test.go +++ b/yandex-framework/test/datasphere/community/yandex_datasphere_community_data_source_test.go @@ -1,4 +1,4 @@ -package test +package community import ( "fmt" @@ -6,34 +6,36 @@ import ( "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test" + dataspheretest "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test/datasphere" ) const testCommunityDataSourceName = "data.yandex_datasphere_community.test-community-data" func TestAccDatasphereCommunityDataSource(t *testing.T) { var ( - communityName = testResourseName(63) + communityName = test.ResourceName(63) communityDesc = acctest.RandStringFromCharSet(256, acctest.CharSetAlpha) labelKey = acctest.RandStringFromCharSet(63, acctest.CharSetAlpha) labelValue = acctest.RandStringFromCharSet(63, acctest.CharSetAlphaNum) ) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckCommunityDestroy, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, + CheckDestroy: dataspheretest.AccCheckCommunityDestroy, Steps: []resource.TestStep{ { Config: testCommunityDataConfig(communityName, communityDesc, labelKey, labelValue), Check: resource.ComposeTestCheckFunc( - testCommunityExists(testCommunityDataSourceName), + dataspheretest.CommunityExists(testCommunityDataSourceName), resource.TestCheckResourceAttr(testCommunityDataSourceName, "name", communityName), resource.TestCheckResourceAttr(testCommunityDataSourceName, "description", communityDesc), resource.TestCheckResourceAttr(testCommunityDataSourceName, fmt.Sprintf("labels.%s", labelKey), labelValue), resource.TestCheckResourceAttrSet(testCommunityDataSourceName, "created_at"), resource.TestCheckResourceAttrSet(testCommunityDataSourceName, "created_by"), - resource.TestCheckResourceAttr(testCommunityDataSourceName, "organization_id", getExampleOrganizationID()), - testAccCheckCreatedAtAttr(testCommunityDataSourceName), + resource.TestCheckResourceAttr(testCommunityDataSourceName, "organization_id", test.GetExampleOrganizationID()), + test.AccCheckCreatedAtAttr(testCommunityDataSourceName), ), }, }, @@ -54,5 +56,5 @@ resource "yandex_datasphere_community" "test-community" { "%s": "%s" } organization_id = "%s" -}`, name, desc, getBillingAccountId(), labelKey, labelValue, getExampleOrganizationID()) +}`, name, desc, test.GetBillingAccountId(), labelKey, labelValue, test.GetExampleOrganizationID()) } diff --git a/yandex-framework/test/yandex_datasphere_community_resource_test.go b/yandex-framework/test/datasphere/community/yandex_datasphere_community_resource_test.go similarity index 51% rename from yandex-framework/test/yandex_datasphere_community_resource_test.go rename to yandex-framework/test/datasphere/community/yandex_datasphere_community_resource_test.go index bf338612c..a243c50e7 100644 --- a/yandex-framework/test/yandex_datasphere_community_resource_test.go +++ b/yandex-framework/test/datasphere/community/yandex_datasphere_community_resource_test.go @@ -1,4 +1,4 @@ -package test +package community import ( "context" @@ -8,16 +8,11 @@ import ( "github.com/hashicorp/go-multierror" "github.com/hashicorp/terraform-plugin-testing/helper/acctest" - "github.com/yandex-cloud/go-genproto/yandex/cloud/datasphere/v2" - yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework" - provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" - "github.com/hashicorp/terraform-plugin-testing/helper/resource" - "github.com/hashicorp/terraform-plugin-testing/terraform" -) - -const ( - testCommunityResourceName = "yandex_datasphere_community.test-community" + "github.com/yandex-cloud/go-genproto/yandex/cloud/datasphere/v2" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test" + dataspheretest "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test/datasphere" ) func init() { @@ -29,20 +24,20 @@ func init() { } func testSweepCommunity(_ string) error { - conf, err := configForSweepers() + conf, err := test.ConfigForSweepers() if err != nil { return fmt.Errorf("error getting client: %s", err) } it := conf.SDK.Datasphere().Community().CommunityIterator( context.Background(), - &datasphere.ListCommunitiesRequest{OrganizationId: getExampleOrganizationID()}, + &datasphere.ListCommunitiesRequest{OrganizationId: test.GetExampleOrganizationID()}, ) result := &multierror.Error{} for it.Next() { communityId := it.Value().GetId() - if !isTestResourseName(it.Value().GetName()) { + if !test.IsTestResourceName(it.Value().GetName()) { continue } if !sweepCommunity(conf, communityId) { @@ -64,7 +59,7 @@ func testSweepCommunity(_ string) error { } func sweepCommunity(conf *provider_config.Config, cloudId string) bool { - return sweepWithRetry(sweepCommunityOnce, conf, "yandex_datasphere_community", cloudId) + return test.SweepWithRetry(sweepCommunityOnce, conf, "yandex_datasphere_community", cloudId) } func sweepCommunityOnce(conf *provider_config.Config, id string) error { @@ -74,12 +69,12 @@ func sweepCommunityOnce(conf *provider_config.Config, id string) error { op, err := conf.SDK.Datasphere().Community().Delete(ctx, &datasphere.DeleteCommunityRequest{ CommunityId: id, }) - return handleSweepOperation(ctx, conf, op, err) + return test.HandleSweepOperation(ctx, conf, op, err) } func TestAccDatasphereCommunityResource_basic(t *testing.T) { var ( - communityName = testResourseName(63) + communityName = test.ResourceName(63) communityDesc = acctest.RandStringFromCharSet(256, acctest.CharSetAlpha) labelKey = acctest.RandStringFromCharSet(63, acctest.CharSetAlpha) @@ -87,9 +82,9 @@ func TestAccDatasphereCommunityResource_basic(t *testing.T) { ) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckCommunityDestroy, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, + CheckDestroy: dataspheretest.AccCheckCommunityDestroy, Steps: []resource.TestStep{ basicCommunityTestStep(communityName, communityDesc, labelKey, labelValue), communityImportTestStep(), @@ -99,24 +94,24 @@ func TestAccDatasphereCommunityResource_basic(t *testing.T) { func TestAccDatasphereCommunityResource_minimalDataCreation(t *testing.T) { var ( - communityName = testResourseName(63) + communityName = test.ResourceName(63) ) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckCommunityDestroy, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, + CheckDestroy: dataspheretest.AccCheckCommunityDestroy, Steps: []resource.TestStep{ { Config: testCommunityConfigMinimalData(communityName), Check: resource.ComposeTestCheckFunc( - testCommunityExists(testCommunityResourceName), - resource.TestCheckResourceAttr(testCommunityResourceName, "name", communityName), - resource.TestCheckResourceAttr(testCommunityResourceName, "description", ""), - resource.TestCheckResourceAttrSet(testCommunityResourceName, "created_at"), - resource.TestCheckResourceAttrSet(testCommunityResourceName, "created_by"), - resource.TestCheckResourceAttr(testCommunityResourceName, "organization_id", getExampleOrganizationID()), - testAccCheckCreatedAtAttr(testCommunityResourceName), + dataspheretest.CommunityExists(dataspheretest.CommunityResourceName), + resource.TestCheckResourceAttr(dataspheretest.CommunityResourceName, "name", communityName), + resource.TestCheckResourceAttr(dataspheretest.CommunityResourceName, "description", ""), + resource.TestCheckResourceAttrSet(dataspheretest.CommunityResourceName, "created_at"), + resource.TestCheckResourceAttrSet(dataspheretest.CommunityResourceName, "created_by"), + resource.TestCheckResourceAttr(dataspheretest.CommunityResourceName, "organization_id", test.GetExampleOrganizationID()), + test.AccCheckCreatedAtAttr(dataspheretest.CommunityResourceName), ), }, communityImportTestStep(), @@ -126,21 +121,21 @@ func TestAccDatasphereCommunityResource_minimalDataCreation(t *testing.T) { func TestAccDatasphereCommunityResource_update(t *testing.T) { var ( - communityName = testResourseName(63) + communityName = test.ResourceName(63) communityDesc = acctest.RandStringFromCharSet(256, acctest.CharSetAlpha) labelKey = acctest.RandStringFromCharSet(63, acctest.CharSetAlpha) labelValue = acctest.RandStringFromCharSet(63, acctest.CharSetAlphaNum) - communityNameUpdated = testResourseName(63) + communityNameUpdated = test.ResourceName(63) communityDescUpdated = acctest.RandStringFromCharSet(256, acctest.CharSetAlpha) labelKeyUpdated = acctest.RandStringFromCharSet(63, acctest.CharSetAlpha) labelValueUpdated = acctest.RandStringFromCharSet(63, acctest.CharSetAlphaNum) ) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckCommunityDestroy, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, + CheckDestroy: dataspheretest.AccCheckCommunityDestroy, Steps: []resource.TestStep{ basicCommunityTestStep(communityName, communityDesc, labelKey, labelValue), communityImportTestStep(), @@ -152,7 +147,7 @@ func TestAccDatasphereCommunityResource_update(t *testing.T) { func communityImportTestStep() resource.TestStep { return resource.TestStep{ - ResourceName: testCommunityResourceName, + ResourceName: dataspheretest.CommunityResourceName, ImportState: true, ImportStateVerify: true, ImportStateVerifyIgnore: []string{ @@ -161,74 +156,23 @@ func communityImportTestStep() resource.TestStep { } } -func testAccCheckCommunityDestroy(s *terraform.State) error { - config := testAccProvider.(*yandex_framework.Provider).GetConfig() - - for _, rs := range s.RootModule().Resources { - if rs.Type != "yandex_datasphere_community" { - continue - } - id := rs.Primary.ID - - _, err := config.SDK.Datasphere().Community().Get(context.Background(), &datasphere.GetCommunityRequest{ - CommunityId: id, - }) - if err == nil { - return fmt.Errorf("community still exists") - } - } - - return nil -} - func basicCommunityTestStep(communityName, communityDesc, labelKey, labelValue string) resource.TestStep { return resource.TestStep{ Config: testCommunityBasic(communityName, communityDesc, labelKey, labelValue), Check: resource.ComposeTestCheckFunc( - testCommunityExists(testCommunityResourceName), - resource.TestCheckResourceAttr(testCommunityResourceName, "name", communityName), - resource.TestCheckResourceAttr(testCommunityResourceName, "description", communityDesc), - resource.TestCheckResourceAttr(testCommunityResourceName, fmt.Sprintf("labels.%s", labelKey), labelValue), - resource.TestCheckResourceAttrSet(testCommunityResourceName, "created_at"), - resource.TestCheckResourceAttrSet(testCommunityResourceName, "created_by"), - resource.TestCheckResourceAttr(testCommunityResourceName, "organization_id", getExampleOrganizationID()), - resource.TestCheckResourceAttr(testCommunityResourceName, "billing_account_id", getBillingAccountId()), - testAccCheckCreatedAtAttr(testCommunityResourceName), + dataspheretest.CommunityExists(dataspheretest.CommunityResourceName), + resource.TestCheckResourceAttr(dataspheretest.CommunityResourceName, "name", communityName), + resource.TestCheckResourceAttr(dataspheretest.CommunityResourceName, "description", communityDesc), + resource.TestCheckResourceAttr(dataspheretest.CommunityResourceName, fmt.Sprintf("labels.%s", labelKey), labelValue), + resource.TestCheckResourceAttrSet(dataspheretest.CommunityResourceName, "created_at"), + resource.TestCheckResourceAttrSet(dataspheretest.CommunityResourceName, "created_by"), + resource.TestCheckResourceAttr(dataspheretest.CommunityResourceName, "organization_id", test.GetExampleOrganizationID()), + resource.TestCheckResourceAttr(dataspheretest.CommunityResourceName, "billing_account_id", test.GetBillingAccountId()), + test.AccCheckCreatedAtAttr(dataspheretest.CommunityResourceName), ), } } -func testCommunityExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - config := testAccProvider.(*yandex_framework.Provider).GetConfig() - a := s.RootModule().Resources - fmt.Printf("%s", a) - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("not found: %s", name) - } - - if rs.Primary.ID == "" { - return fmt.Errorf("no ID is set") - } - - id := rs.Primary.ID - - found, err := config.SDK.Datasphere().Community().Get(context.Background(), &datasphere.GetCommunityRequest{ - CommunityId: id, - }) - if err != nil { - return err - } - - if found.Id != rs.Primary.ID { - return fmt.Errorf("community not found") - } - - return nil - } -} - func testCommunityBasic(name string, desc string, labelKey string, labelValue string) string { return fmt.Sprintf(` resource "yandex_datasphere_community" "test-community" { @@ -240,7 +184,7 @@ resource "yandex_datasphere_community" "test-community" { } organization_id = "%s" } -`, name, desc, getBillingAccountId(), labelKey, labelValue, getExampleOrganizationID()) +`, name, desc, test.GetBillingAccountId(), labelKey, labelValue, test.GetExampleOrganizationID()) } func testCommunityConfigMinimalData(name string) string { @@ -249,5 +193,5 @@ resource "yandex_datasphere_community" "test-community" { name = "%s" organization_id = "%s" } -`, name, getExampleOrganizationID()) +`, name, test.GetExampleOrganizationID()) } diff --git a/yandex-framework/test/yandex_datasphere_community_iam_binding_test.go b/yandex-framework/test/datasphere/iam/yandex_datasphere_community_iam_binding_test.go similarity index 70% rename from yandex-framework/test/yandex_datasphere_community_iam_binding_test.go rename to yandex-framework/test/datasphere/iam/yandex_datasphere_community_iam_binding_test.go index b40b53ba4..12072e22c 100644 --- a/yandex-framework/test/yandex_datasphere_community_iam_binding_test.go +++ b/yandex-framework/test/datasphere/iam/yandex_datasphere_community_iam_binding_test.go @@ -1,4 +1,4 @@ -package test +package iam import ( "context" @@ -9,33 +9,35 @@ import ( "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" - yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework" - yandex_datasphere_community "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/yandex-datasphere/community" + yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider" + yandex_datasphere_community "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/services/datasphere/community" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test" + dataspheretest "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test/datasphere" ) func TestAccDatasphereCommunityResourceIamBinding(t *testing.T) { var ( - communityName = testResourseName(63) + communityName = test.ResourceName(63) userID = "allUsers" role = "datasphere.community-projects.viewer" ) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckCommunityDestroy, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, + CheckDestroy: dataspheretest.AccCheckCommunityDestroy, Steps: []resource.TestStep{ { Config: testAccCommunityIamBindingConfig(communityName, role, userID), Check: resource.ComposeTestCheckFunc( - testCommunityExists(testCommunityResourceName), - testAccCheckCommunityIam(testCommunityResourceName, role, []string{"system:" + userID}), + dataspheretest.CommunityExists(dataspheretest.CommunityResourceName), + testAccCheckCommunityIam(dataspheretest.CommunityResourceName, role, []string{"system:" + userID}), ), }, { ResourceName: "yandex_datasphere_community_iam_binding.test-community-binding", - ImportStateIdFunc: importIamBindingIdFunc(testCommunityResourceName, role), + ImportStateIdFunc: test.ImportIamBindingIdFunc(dataspheretest.CommunityResourceName, role), ImportState: true, ImportStateVerifyIdentifierAttribute: "community_id", }, @@ -56,12 +58,12 @@ resource "yandex_datasphere_community_iam_binding" "test-community-binding" { members = ["system:%s"] community_id = yandex_datasphere_community.test-community.id } -`, name, getBillingAccountId(), getExampleOrganizationID(), role, userID) +`, name, test.GetBillingAccountId(), test.GetExampleOrganizationID(), role, userID) } func testAccCheckCommunityIam(resourceName, role string, members []string) resource.TestCheckFunc { return func(s *terraform.State) error { - config := testAccProvider.(*yandex_framework.Provider).GetConfig() + config := test.AccProvider.(*yandex_framework.Provider).GetConfig() rs, ok := s.RootModule().Resources[resourceName] if !ok { diff --git a/yandex-framework/test/yandex_datasphere_project_iam_binding_test.go b/yandex-framework/test/datasphere/iam/yandex_datasphere_project_iam_binding_test.go similarity index 70% rename from yandex-framework/test/yandex_datasphere_project_iam_binding_test.go rename to yandex-framework/test/datasphere/iam/yandex_datasphere_project_iam_binding_test.go index 61d51a736..67d0af78c 100644 --- a/yandex-framework/test/yandex_datasphere_project_iam_binding_test.go +++ b/yandex-framework/test/datasphere/iam/yandex_datasphere_project_iam_binding_test.go @@ -1,4 +1,4 @@ -package test +package iam import ( "context" @@ -9,34 +9,36 @@ import ( "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" - yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework" - yandex_datasphere_project "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/yandex-datasphere/project" + yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider" + yandex_datasphere_project "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/services/datasphere/project" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test" + dataspheretest "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test/datasphere" ) func TestAccDatasphereProjectResourceIamBinding(t *testing.T) { var ( - communityName = testResourseName(63) - projectName = testResourseName(63) + communityName = test.ResourceName(63) + projectName = test.ResourceName(63) userID = "allUsers" role = "datasphere.community-projects.viewer" ) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckProjectDestroy, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, + CheckDestroy: dataspheretest.AccCheckProjectDestroy, Steps: []resource.TestStep{ { Config: testAccDatasphereProjectIamBindingConfig(communityName, projectName, role, userID), Check: resource.ComposeTestCheckFunc( - testDatasphereProjectExists(testProjectResourceName), - testAccCheckDatasphereProjectIam(testProjectResourceName, role, []string{"system:" + userID}), + dataspheretest.ProjectExists(dataspheretest.ProjectResourceName), + testAccCheckDatasphereProjectIam(dataspheretest.ProjectResourceName, role, []string{"system:" + userID}), ), }, { ResourceName: "yandex_datasphere_project_iam_binding.test-project-binding", - ImportStateIdFunc: importIamBindingIdFunc(testProjectResourceName, role), + ImportStateIdFunc: test.ImportIamBindingIdFunc(dataspheretest.ProjectResourceName, role), ImportState: true, ImportStateVerifyIdentifierAttribute: "project_id", }, @@ -62,12 +64,12 @@ resource "yandex_datasphere_project" "test-project" { name = "%s" community_id = yandex_datasphere_community.test-community.id } -`, communityName, getBillingAccountId(), getExampleOrganizationID(), role, userID, projectName) +`, communityName, test.GetBillingAccountId(), test.GetExampleOrganizationID(), role, userID, projectName) } func testAccCheckDatasphereProjectIam(resourceName, role string, members []string) resource.TestCheckFunc { return func(s *terraform.State) error { - config := testAccProvider.(*yandex_framework.Provider).GetConfig() + config := test.AccProvider.(*yandex_framework.Provider).GetConfig() rs, ok := s.RootModule().Resources[resourceName] if !ok { diff --git a/yandex-framework/test/yandex_datasphere_project_data_source_test.go b/yandex-framework/test/datasphere/project/yandex_datasphere_project_data_source_test.go similarity index 64% rename from yandex-framework/test/yandex_datasphere_project_data_source_test.go rename to yandex-framework/test/datasphere/project/yandex_datasphere_project_data_source_test.go index 727131636..4bb257680 100644 --- a/yandex-framework/test/yandex_datasphere_project_data_source_test.go +++ b/yandex-framework/test/datasphere/project/yandex_datasphere_project_data_source_test.go @@ -1,10 +1,12 @@ -package test +package project import ( "fmt" "testing" "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test" + dataspheretest "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test/datasphere" ) const testProjectDataSourceName = "data.yandex_datasphere_project.test-project-data" @@ -12,23 +14,23 @@ const testProjectDataSourceName = "data.yandex_datasphere_project.test-project-d func TestAccDatasphereProjectDataSource(t *testing.T) { var ( - projectName = testResourseName(63) - communityName = testResourseName(63) + projectName = test.ResourceName(63) + communityName = test.ResourceName(63) ) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckProjectDestroy, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, + CheckDestroy: dataspheretest.AccCheckProjectDestroy, Steps: []resource.TestStep{ { Config: testDatasphereProjectDataSourceConfig(communityName, projectName), Check: resource.ComposeTestCheckFunc( - testDatasphereProjectExists(testProjectDataSourceName), + dataspheretest.ProjectExists(testProjectDataSourceName), resource.TestCheckResourceAttr(testProjectDataSourceName, "name", projectName), resource.TestCheckResourceAttrSet(testProjectDataSourceName, "created_at"), resource.TestCheckResourceAttrSet(testProjectDataSourceName, "created_by"), - testAccCheckCreatedAtAttr(testProjectDataSourceName), + test.AccCheckCreatedAtAttr(testProjectDataSourceName), ), }, }, @@ -51,5 +53,5 @@ resource "yandex_datasphere_project" "test-project" { name = "%s" community_id = yandex_datasphere_community.test-community.id } -`, communityName, getExampleOrganizationID(), getBillingAccountId(), projectName) +`, communityName, test.GetExampleOrganizationID(), test.GetBillingAccountId(), projectName) } diff --git a/yandex-framework/test/yandex_datasphere_project_resource_test.go b/yandex-framework/test/datasphere/project/yandex_datasphere_project_resource_test.go similarity index 60% rename from yandex-framework/test/yandex_datasphere_project_resource_test.go rename to yandex-framework/test/datasphere/project/yandex_datasphere_project_resource_test.go index 11e3231ff..f2a805b8d 100644 --- a/yandex-framework/test/yandex_datasphere_project_resource_test.go +++ b/yandex-framework/test/datasphere/project/yandex_datasphere_project_resource_test.go @@ -1,4 +1,4 @@ -package test +package project import ( "context" @@ -8,17 +8,14 @@ import ( "github.com/hashicorp/go-multierror" "github.com/hashicorp/terraform-plugin-testing/helper/acctest" + "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/yandex-cloud/go-genproto/yandex/cloud/datasphere/v2" - yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework" - provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test" + dataspheretest "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test/datasphere" "google.golang.org/grpc/codes" - - "github.com/hashicorp/terraform-plugin-testing/helper/resource" - "github.com/hashicorp/terraform-plugin-testing/terraform" ) -const testProjectResourceName = "yandex_datasphere_project.test-project" - func init() { resource.AddTestSweepers("yandex_datasphere_project", &resource.Sweeper{ Name: "yandex_datasphere_project", @@ -28,7 +25,7 @@ func init() { } func testSweepProject(_ string) error { - conf, err := configForSweepers() + conf, err := test.ConfigForSweepers() if err != nil { return fmt.Errorf("error getting client: %w", err) } @@ -46,13 +43,13 @@ func testSweepProject(_ string) error { context.Background(), &datasphere.ListProjectsRequest{ CommunityId: communityID, - OwnedById: testAccTestsUser, + OwnedById: test.AccTestsUser, }, ) for it.Next() { projectId := it.Value().GetId() - if !isTestResourseName(it.Value().GetName()) { + if !test.IsTestResourceName(it.Value().GetName()) { continue } if !sweepProject(conf, projectId) { @@ -78,20 +75,20 @@ func getAllCommunityIDs(conf *provider_config.Config) ([]string, error) { var ( it = conf.SDK.Datasphere().Community().CommunityIterator( context.Background(), - &datasphere.ListCommunitiesRequest{OrganizationId: getExampleOrganizationID()}, + &datasphere.ListCommunitiesRequest{OrganizationId: test.GetExampleOrganizationID()}, ) ids []string ) for it.Next() { - if !isTestResourseName(it.Value().GetName()) { + if !test.IsTestResourceName(it.Value().GetName()) { continue } ids = append(ids, it.Value().GetId()) } if err := it.Error(); err != nil { - if isStatusWithCode(err, codes.NotFound) { + if test.IsStatusWithCode(err, codes.NotFound) { return nil, nil } return nil, fmt.Errorf("iterator err: %w", err) @@ -101,7 +98,7 @@ func getAllCommunityIDs(conf *provider_config.Config) ([]string, error) { } func sweepProject(conf *provider_config.Config, cloudId string) bool { - return sweepWithRetry(sweepProjectOnce, conf, "yandex_datasphere_project", cloudId) + return test.SweepWithRetry(sweepProjectOnce, conf, "yandex_datasphere_project", cloudId) } func sweepProjectOnce(conf *provider_config.Config, id string) error { @@ -112,23 +109,23 @@ func sweepProjectOnce(conf *provider_config.Config, id string) error { op, err := conf.SDK.Datasphere().Project().Delete(ctx, &datasphere.DeleteProjectRequest{ ProjectId: id, }) - return handleSweepOperation(ctx, conf, op, err) + return test.HandleSweepOperation(ctx, conf, op, err) } func TestAccDatasphereProjectResource_basic(t *testing.T) { var ( - communityName = testResourseName(63) + communityName = test.ResourceName(63) - projectName = testResourseName(63) + projectName = test.ResourceName(63) projectDesc = acctest.RandStringFromCharSet(256, acctest.CharSetAlpha) labelKey = acctest.RandStringFromCharSet(63, acctest.CharSetAlpha) labelValue = acctest.RandStringFromCharSet(63, acctest.CharSetAlphaNum) ) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckProjectDestroy, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, + CheckDestroy: dataspheretest.AccCheckProjectDestroy, Steps: []resource.TestStep{ basicDatasphereProjectTestStep(communityName, projectName, projectDesc, labelKey, labelValue), datasphereProjectImportTestStep(), @@ -138,33 +135,33 @@ func TestAccDatasphereProjectResource_basic(t *testing.T) { func TestAccDatasphereProjectResource_fullData(t *testing.T) { var ( - communityName = testResourseName(63) + communityName = test.ResourceName(63) - projectName = testResourseName(63) + projectName = test.ResourceName(63) projectDesc = acctest.RandStringFromCharSet(256, acctest.CharSetAlpha) saName = acctest.RandStringFromCharSet(63, acctest.CharSetAlpha) ) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckProjectDestroy, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, + CheckDestroy: dataspheretest.AccCheckProjectDestroy, Steps: []resource.TestStep{ { Config: testDatasphereProjectFullConfig(communityName, projectName, projectDesc, saName), Check: resource.ComposeTestCheckFunc( - testDatasphereProjectExists(testProjectResourceName), - resource.TestCheckResourceAttr(testProjectResourceName, "name", projectName), - resource.TestCheckResourceAttr(testProjectResourceName, "description", projectDesc), - resource.TestCheckResourceAttrSet(testProjectResourceName, "created_at"), - resource.TestCheckResourceAttrSet(testProjectResourceName, "created_by"), - resource.TestCheckResourceAttr(testProjectResourceName, "limits.max_units_per_hour", "10"), - resource.TestCheckResourceAttr(testProjectResourceName, "limits.max_units_per_execution", "10"), - resource.TestCheckResourceAttr(testProjectResourceName, "limits.balance", "10"), - resource.TestCheckResourceAttr(testProjectResourceName, "settings.commit_mode", "AUTO"), - resource.TestCheckResourceAttr(testProjectResourceName, "settings.ide", "JUPYTER_LAB"), - resource.TestCheckResourceAttr(testProjectResourceName, "settings.stale_exec_timeout_mode", "ONE_HOUR"), - testAccCheckCreatedAtAttr(testProjectResourceName), + dataspheretest.ProjectExists(dataspheretest.ProjectResourceName), + resource.TestCheckResourceAttr(dataspheretest.ProjectResourceName, "name", projectName), + resource.TestCheckResourceAttr(dataspheretest.ProjectResourceName, "description", projectDesc), + resource.TestCheckResourceAttrSet(dataspheretest.ProjectResourceName, "created_at"), + resource.TestCheckResourceAttrSet(dataspheretest.ProjectResourceName, "created_by"), + resource.TestCheckResourceAttr(dataspheretest.ProjectResourceName, "limits.max_units_per_hour", "10"), + resource.TestCheckResourceAttr(dataspheretest.ProjectResourceName, "limits.max_units_per_execution", "10"), + resource.TestCheckResourceAttr(dataspheretest.ProjectResourceName, "limits.balance", "10"), + resource.TestCheckResourceAttr(dataspheretest.ProjectResourceName, "settings.commit_mode", "AUTO"), + resource.TestCheckResourceAttr(dataspheretest.ProjectResourceName, "settings.ide", "JUPYTER_LAB"), + resource.TestCheckResourceAttr(dataspheretest.ProjectResourceName, "settings.stale_exec_timeout_mode", "ONE_HOUR"), + test.AccCheckCreatedAtAttr(dataspheretest.ProjectResourceName), ), }, datasphereProjectImportTestStep(), @@ -174,23 +171,23 @@ func TestAccDatasphereProjectResource_fullData(t *testing.T) { func TestAccDatasphereProjectResource_update(t *testing.T) { var ( - communityName = testResourseName(63) + communityName = test.ResourceName(63) - projectName = testResourseName(63) + projectName = test.ResourceName(63) projectDesc = acctest.RandStringFromCharSet(256, acctest.CharSetAlpha) labelKey = acctest.RandStringFromCharSet(63, acctest.CharSetAlpha) labelValue = acctest.RandStringFromCharSet(63, acctest.CharSetAlphaNum) - projectNameUpdated = testResourseName(63) + projectNameUpdated = test.ResourceName(63) projectDescUpdated = acctest.RandStringFromCharSet(256, acctest.CharSetAlpha) labelKeyUpdated = acctest.RandStringFromCharSet(63, acctest.CharSetAlpha) labelValueUpdated = acctest.RandStringFromCharSet(63, acctest.CharSetAlphaNum) ) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckProjectDestroy, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, + CheckDestroy: dataspheretest.AccCheckProjectDestroy, Steps: []resource.TestStep{ basicDatasphereProjectTestStep(communityName, projectName, projectDesc, labelKey, labelValue), datasphereProjectImportTestStep(), @@ -202,77 +199,27 @@ func TestAccDatasphereProjectResource_update(t *testing.T) { func datasphereProjectImportTestStep() resource.TestStep { return resource.TestStep{ - ResourceName: testProjectResourceName, + ResourceName: dataspheretest.ProjectResourceName, ImportState: true, ImportStateVerify: true, } } -func testAccCheckProjectDestroy(s *terraform.State) error { - config := testAccProvider.(*yandex_framework.Provider).GetConfig() - - for _, rs := range s.RootModule().Resources { - if rs.Type != "yandex_project_project" { - continue - } - id := rs.Primary.ID - - _, err := config.SDK.Datasphere().Project().Get(context.Background(), &datasphere.GetProjectRequest{ - ProjectId: id, - }) - if err == nil { - return fmt.Errorf("project still exists") - } - } - - return nil -} - func basicDatasphereProjectTestStep(communityName, projectName, projectDesc, labelKey, labelValue string) resource.TestStep { return resource.TestStep{ Config: testDatasphereProjectBasicConfig(communityName, projectName, projectDesc, labelKey, labelValue), Check: resource.ComposeTestCheckFunc( - testDatasphereProjectExists(testProjectResourceName), - resource.TestCheckResourceAttr(testProjectResourceName, "name", projectName), - resource.TestCheckResourceAttr(testProjectResourceName, "description", projectDesc), - resource.TestCheckResourceAttr(testProjectResourceName, fmt.Sprintf("labels.%s", labelKey), labelValue), - resource.TestCheckResourceAttrSet(testProjectResourceName, "created_at"), - resource.TestCheckResourceAttrSet(testProjectResourceName, "created_by"), - testAccCheckCreatedAtAttr(testProjectResourceName), + dataspheretest.ProjectExists(dataspheretest.ProjectResourceName), + resource.TestCheckResourceAttr(dataspheretest.ProjectResourceName, "name", projectName), + resource.TestCheckResourceAttr(dataspheretest.ProjectResourceName, "description", projectDesc), + resource.TestCheckResourceAttr(dataspheretest.ProjectResourceName, fmt.Sprintf("labels.%s", labelKey), labelValue), + resource.TestCheckResourceAttrSet(dataspheretest.ProjectResourceName, "created_at"), + resource.TestCheckResourceAttrSet(dataspheretest.ProjectResourceName, "created_by"), + test.AccCheckCreatedAtAttr(dataspheretest.ProjectResourceName), ), } } -func testDatasphereProjectExists(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - config := testAccProvider.(*yandex_framework.Provider).GetConfig() - - rs, ok := s.RootModule().Resources[name] - if !ok { - return fmt.Errorf("not found: %s", name) - } - - if rs.Primary.ID == "" { - return fmt.Errorf("no ID is set") - } - - id := rs.Primary.ID - - found, err := config.SDK.Datasphere().Project().Get(context.Background(), &datasphere.GetProjectRequest{ - ProjectId: id, - }) - if err != nil { - return err - } - - if found.Id != rs.Primary.ID { - return fmt.Errorf("project not found") - } - - return nil - } -} - func testDatasphereProjectBasicConfig(communityName, projectName, desc, labelKey, labelValue string) string { return fmt.Sprintf(` resource "yandex_datasphere_community" "test-community" { @@ -289,7 +236,7 @@ resource "yandex_datasphere_project" "test-project" { } community_id = yandex_datasphere_community.test-community.id } -`, communityName, getExampleOrganizationID(), getBillingAccountId(), projectName, desc, labelKey, labelValue) +`, communityName, test.GetExampleOrganizationID(), test.GetBillingAccountId(), projectName, desc, labelKey, labelValue) } func testDatasphereProjectFullConfig(communityName, projectName, desc, saName string) string { @@ -356,5 +303,5 @@ resource "yandex_resourcemanager_folder_iam_member" "test_account" { member = "serviceAccount:${yandex_iam_service_account.test-account.id}" role = "editor" } -`, communityName, getExampleOrganizationID(), getBillingAccountId(), saName, projectName, desc, getExampleFolderID(), getExampleFolderID()) +`, communityName, test.GetExampleOrganizationID(), test.GetBillingAccountId(), saName, projectName, desc, test.GetExampleFolderID(), test.GetExampleFolderID()) } diff --git a/yandex-framework/test/env_helpers.go b/yandex-framework/test/env_helpers.go index 3d42421dc..cc5f6754b 100644 --- a/yandex-framework/test/env_helpers.go +++ b/yandex-framework/test/env_helpers.go @@ -8,40 +8,36 @@ import ( "strings" "testing" - "github.com/hashicorp/terraform-plugin-go/tfprotov6" - "github.com/hashicorp/terraform-plugin-mux/tf5to6server" - "github.com/hashicorp/terraform-plugin-mux/tf6muxserver" - "github.com/yandex-cloud/terraform-provider-yandex/yandex" - yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework" + yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" "github.com/hashicorp/terraform-plugin-framework/provider" "github.com/hashicorp/terraform-plugin-framework/providerserver" "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-go/tfprotov6" + "github.com/hashicorp/terraform-plugin-mux/tf5to6server" + "github.com/hashicorp/terraform-plugin-mux/tf6muxserver" "github.com/yandex-cloud/go-genproto/yandex/cloud/iam/v1" "github.com/yandex-cloud/go-genproto/yandex/cloud/resourcemanager/v1" ycsdk "github.com/yandex-cloud/go-sdk" + "github.com/yandex-cloud/terraform-provider-yandex/yandex" "google.golang.org/genproto/googleapis/rpc/errdetails" "google.golang.org/grpc/status" "github.com/yandex-cloud/terraform-provider-yandex/common" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" ) -const providerDefaultValueInsecure = false -const providerDefaultValuePlaintext = false -const providerDefaultValueEndpoint = "api.cloud.yandex.net:443" - -var testAccProviders map[string]tfprotov6.ProviderServer -var testAccProviderFactories map[string]func() (tfprotov6.ProviderServer, error) +var AccProviders map[string]tfprotov6.ProviderServer +var AccProviderFactories map[string]func() (tfprotov6.ProviderServer, error) // WARNING!!!! do not use testAccProviderEmptyFolder in tests, that use testAccCheck***Destroy functions. // testAccCheck***Destroy functions tend to use static testAccProviderServer var testAccProviderEmptyFolder map[string]tfprotov6.ProviderServer var testAccProviderServer tfprotov6.ProviderServer -var testAccProvider provider.Provider +var AccProvider provider.Provider -var testAccEnvVars = []string{ +var AccEnvVars = []string{ "YC_FOLDER_ID", "YC_ZONE", "YC_LOGIN", @@ -50,22 +46,22 @@ var testAccEnvVars = []string{ "YC_MESSAGE_QUEUE_ENDPOINT", } -var testAccForAuthEnvVars = []string{ +var AccForAuthEnvVars = []string{ "YC_TOKEN", "YC_SERVICE_ACCOUNT_KEY_FILE", } -var testCloudID = "not initialized" -var testOrganizationID = "not initialized" -var testCloudName = "not initialized" -var testFolderID = "not initialized" -var testFolderName = "not initialized" -var testRoleID = "resource-manager.clouds.member" -var testUserLogin1 = "no user login" -var testUserLogin2 = "no user login" -var testUserID1 = "no user id" -var testUserID2 = "no user id" -var testStorageEndpoint = "no.storage.endpoint" +var cloudID = "not initialized" +var organizationID = "not initialized" +var cloudName = "not initialized" +var folderID = "not initialized" +var folderName = "not initialized" +var roleID = "resource-manager.clouds.member" +var userLogin1 = "no user login" +var userLogin2 = "no user login" +var userID1 = "no user id" +var userID2 = "no user id" +var storageEndpoint = "no.storage.endpoint" func NewFrameworkProviderServer(ctx context.Context) (func() tfprotov6.ProviderServer, error) { upgradedSdkProvider, _ := tf5to6server.UpgradeServer( @@ -73,7 +69,7 @@ func NewFrameworkProviderServer(ctx context.Context) (func() tfprotov6.ProviderS yandex.NewSDKProvider().GRPCProvider, ) providers := []func() tfprotov6.ProviderServer{ - providerserver.NewProtocol6(testAccProvider), + providerserver.NewProtocol6(AccProvider), func() tfprotov6.ProviderServer { return upgradedSdkProvider }, @@ -88,10 +84,10 @@ func NewFrameworkProviderServer(ctx context.Context) (func() tfprotov6.ProviderS } func init() { - testAccProvider = yandex_framework.NewFrameworkProvider() + AccProvider = yandex_framework.NewFrameworkProvider() testAccProviderFunc, _ := NewFrameworkProviderServer(context.Background()) testAccProviderServer = testAccProviderFunc() - testAccProviderFactories = map[string]func() (tfprotov6.ProviderServer, error){ + AccProviderFactories = map[string]func() (tfprotov6.ProviderServer, error){ "yandex": func() (tfprotov6.ProviderServer, error) { return testAccProviderServer, nil }, @@ -107,66 +103,66 @@ func init() { //} } -func testAccPreCheck(t *testing.T) { - for _, varName := range testAccEnvVars { +func AccPreCheck(t *testing.T) { + for _, varName := range AccEnvVars { if val := os.Getenv(varName); val == "" { t.Fatalf("%s must be set for acceptance tests", varName) } } - for _, varName := range testAccForAuthEnvVars { + for _, varName := range AccForAuthEnvVars { if val := os.Getenv(varName); val != "" { return } } - t.Fatalf("one of the variables: %s must be set for acceptance tests", strings.Join(testAccForAuthEnvVars, ", ")) + t.Fatalf("one of the variables: %s must be set for acceptance tests", strings.Join(AccForAuthEnvVars, ", ")) } -func getExampleFolderName() string { - return testFolderName +func GetExampleFolderName() string { + return folderName } -func getExampleCloudName() string { - return testCloudName +func GetExampleCloudName() string { + return cloudName } -func getExampleRoleID() string { - return testRoleID +func GetExampleRoleID() string { + return roleID } -func getExampleCloudID() string { - return testCloudID +func GetExampleCloudID() string { + return cloudID } -func getExampleOrganizationID() string { - return testOrganizationID +func GetExampleOrganizationID() string { + return organizationID } -func getExampleFolderID() string { - return testFolderID +func GetExampleFolderID() string { + return folderID } -func getExampleUserID1() string { - return testUserID1 +func GetExampleUserID1() string { + return userID1 } -func getExampleUserID2() string { - return testUserID2 +func GetExampleUserID2() string { + return userID2 } -func getExampleUserLogin1() string { - return testUserLogin1 +func GetExampleUserLogin1() string { + return userLogin1 } -func getExampleUserLogin2() string { - return testUserLogin2 +func GetExampleUserLogin2() string { + return userLogin2 } -func getExampleStorageEndpoint() string { - return testStorageEndpoint +func GetExampleStorageEndpoint() string { + return storageEndpoint } -func getBillingAccountId() string { +func GetBillingAccountId() string { return os.Getenv("YC_BILLING_TEST_ACCOUNT_ID_1") } @@ -178,8 +174,8 @@ func setTestIDs() error { } ctx := context.Background() - providerConfig := &provider_config.Config{ - ProviderState: provider_config.State{ + providerConfig := &config.Config{ + ProviderState: config.State{ Token: types.StringValue(os.Getenv("YC_TOKEN")), ServiceAccountKeyFileOrContent: types.StringValue(os.Getenv("YC_SERVICE_ACCOUNT_KEY_FILE")), }, @@ -200,30 +196,30 @@ func setTestIDs() error { } // setup example ID values for test cases - testCloudID = os.Getenv("YC_CLOUD_ID") - testOrganizationID = os.Getenv("YC_ORGANIZATION_ID") + cloudID = os.Getenv("YC_CLOUD_ID") + organizationID = os.Getenv("YC_ORGANIZATION_ID") - testFolderID = os.Getenv("YC_FOLDER_ID") - folder := getFolderByID(sdk, testFolderID) + folderID = os.Getenv("YC_FOLDER_ID") + folder := getFolderByID(sdk, folderID) if folder != nil { - testFolderName = folder.Name - if testCloudID == "" { - testCloudID = folder.CloudId - } else if testCloudID != folder.CloudId { - return fmt.Errorf("Invalid cloud id: %s != %s", testCloudID, folder.CloudId) + folderName = folder.Name + if cloudID == "" { + cloudID = folder.CloudId + } else if cloudID != folder.CloudId { + return fmt.Errorf("Invalid cloud id: %s != %s", cloudID, folder.CloudId) } } else { - testFolderName = "no folder name detected" + folderName = "no folder name detected" } - testCloudName = getCloudNameByID(sdk, testCloudID) + cloudName = getCloudNameByID(sdk, cloudID) - testUserLogin1 = os.Getenv("YC_LOGIN") - testUserLogin2 = os.Getenv("YC_LOGIN_2") + userLogin1 = os.Getenv("YC_LOGIN") + userLogin2 = os.Getenv("YC_LOGIN_2") - testUserID1 = loginToUserID(sdk, testUserLogin1) - testUserID2 = loginToUserID(sdk, testUserLogin2) + userID1 = loginToUserID(sdk, userLogin1) + userID2 = loginToUserID(sdk, userLogin2) - testStorageEndpoint = os.Getenv("YC_STORAGE_ENDPOINT_URL") + storageEndpoint = os.Getenv("YC_STORAGE_ENDPOINT_URL") return nil } diff --git a/yandex-framework/test/data_source_yandex_mdb_mongodb_database_test.go b/yandex-framework/test/mdb/mongodb/database/data_source_yandex_mdb_mongodb_database_test.go similarity index 87% rename from yandex-framework/test/data_source_yandex_mdb_mongodb_database_test.go rename to yandex-framework/test/mdb/mongodb/database/data_source_yandex_mdb_mongodb_database_test.go index a7b8b9e4a..421e4788b 100644 --- a/yandex-framework/test/data_source_yandex_mdb_mongodb_database_test.go +++ b/yandex-framework/test/mdb/mongodb/database/data_source_yandex_mdb_mongodb_database_test.go @@ -1,30 +1,20 @@ -package test +package database import ( "context" "fmt" "testing" - yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/utils" - "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" - "github.com/yandex-cloud/go-genproto/yandex/cloud/mdb/mongodb/v1" + yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/resourceid" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test" + mongodbtpl "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test/mdb/mongodb" ) -const mongodbVPCDependencies = ` -resource "yandex_vpc_network" "foo" {} - -resource "yandex_vpc_subnet" "foo" { - zone = "ru-central1-a" - network_id = yandex_vpc_network.foo.id - v4_cidr_blocks = ["10.1.0.0/24"] -} -` - func TestAccDataSourceMDBMongoDBDatabase_basic(t *testing.T) { t.Parallel() @@ -32,8 +22,8 @@ func TestAccDataSourceMDBMongoDBDatabase_basic(t *testing.T) { description := "MongoDB Database Terraform Datasource Test" resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, CheckDestroy: testAccCheckMDBMongoDBDatabaseDestroy, Steps: []resource.TestStep{ { @@ -119,7 +109,7 @@ func testAccDataSourceMDBMgDatabaseCheckResourceIDField(resourceName string) res return fmt.Errorf("No ID is set") } - expectedResourceId := utils.ConstructResourceId(rs.Primary.Attributes["cluster_id"], rs.Primary.Attributes["name"]) + expectedResourceId := resourceid.Construct(rs.Primary.Attributes["cluster_id"], rs.Primary.Attributes["name"]) if expectedResourceId != rs.Primary.ID { return fmt.Errorf("Wrong resource %s id. Expected %s, got %s", resourceName, expectedResourceId, rs.Primary.ID) @@ -130,7 +120,7 @@ func testAccDataSourceMDBMgDatabaseCheckResourceIDField(resourceName string) res } func testAccDataSourceMDBMongoDBDatabaseConfig(name string, description string) string { - return fmt.Sprintf(mongodbVPCDependencies+` + return fmt.Sprintf(mongodbtpl.VPCDependencies+` resource "yandex_mdb_mongodb_cluster" "foo" { name = "%s" description = "%s" @@ -165,14 +155,14 @@ data "yandex_mdb_mongodb_database" "bar" { } func testAccCheckMDBMongoDBDatabaseDestroy(s *terraform.State) error { - config := testAccProvider.(*yandex_framework.Provider).GetConfig() + config := test.AccProvider.(*yandex_framework.Provider).GetConfig() for _, rs := range s.RootModule().Resources { if rs.Type != "yandex_mdb_mongodb_database" { continue } - clusterId, dbname, err := utils.DeconstructResourceId(rs.Primary.ID) + clusterId, dbname, err := resourceid.Deconstruct(rs.Primary.ID) if err != nil { return err } diff --git a/yandex-framework/test/resource_yandex_mdb_mongodb_database_test.go b/yandex-framework/test/mdb/mongodb/database/resource_yandex_mdb_mongodb_database_test.go similarity index 88% rename from yandex-framework/test/resource_yandex_mdb_mongodb_database_test.go rename to yandex-framework/test/mdb/mongodb/database/resource_yandex_mdb_mongodb_database_test.go index 6685b42b1..23e7ab018 100644 --- a/yandex-framework/test/resource_yandex_mdb_mongodb_database_test.go +++ b/yandex-framework/test/mdb/mongodb/database/resource_yandex_mdb_mongodb_database_test.go @@ -1,4 +1,4 @@ -package test +package database import ( "context" @@ -10,13 +10,16 @@ import ( "github.com/hashicorp/terraform-plugin-testing/terraform" "github.com/stretchr/testify/assert" "github.com/yandex-cloud/go-genproto/yandex/cloud/mdb/mongodb/v1" - yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework" + yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test" + mongodbtpl "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test/mdb/mongodb" ) const ( mgDatabaseResourceName = "yandex_mdb_mongodb_database.testdb" mgDatabaseResourceName1 = "yandex_mdb_mongodb_database.testdb1" testMongoDBDatabasePrefix = "tf-mongodb-database" + mgClusterResourceName = "yandex_mdb_mongodb_cluster.foo" ) // Test that a MongoDB Database can be created, updated and destroyed @@ -24,8 +27,8 @@ func TestAccMDBMongoDBDatabase_full(t *testing.T) { t.Parallel() clusterName := acctest.RandomWithPrefix(testMongoDBDatabasePrefix) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, Steps: []resource.TestStep{ { Config: testAccMDBMongoDBDatabaseConfigStep1(clusterName), @@ -71,7 +74,7 @@ func testAccLoadMongoDBDatabase(s *terraform.State, dbname string) (*mongodb.Dat return nil, fmt.Errorf("no ID is set") } - config := testAccProvider.(*yandex_framework.Provider).GetConfig() + config := test.AccProvider.(*yandex_framework.Provider).GetConfig() return config.SDK.MDB().MongoDB().Database().Get(context.Background(), &mongodb.GetDatabaseRequest{ ClusterId: rs.Primary.ID, DatabaseName: dbname, @@ -90,7 +93,7 @@ func testAccCheckMDBMongoDBClusterHasDatabase(t *testing.T, dbname string) resou } func testAccMDBMongoDBDatabaseConfigStep0(name string) string { - return fmt.Sprintf(mongodbVPCDependencies+` + return fmt.Sprintf(mongodbtpl.VPCDependencies+` resource "yandex_mdb_mongodb_cluster" "foo" { name = "%s" description = "MongoDB User Terraform Test" diff --git a/yandex-framework/test/mdb/mongodb/templates.go b/yandex-framework/test/mdb/mongodb/templates.go new file mode 100644 index 000000000..842e6bb6d --- /dev/null +++ b/yandex-framework/test/mdb/mongodb/templates.go @@ -0,0 +1,11 @@ +package mongodb + +const VPCDependencies = ` +resource "yandex_vpc_network" "foo" {} + +resource "yandex_vpc_subnet" "foo" { + zone = "ru-central1-a" + network_id = yandex_vpc_network.foo.id + v4_cidr_blocks = ["10.1.0.0/24"] +} +` diff --git a/yandex-framework/test/data_source_yandex_mdb_mongodb_user_test.go b/yandex-framework/test/mdb/mongodb/user/data_source_yandex_mdb_mongodb_user_test.go similarity index 88% rename from yandex-framework/test/data_source_yandex_mdb_mongodb_user_test.go rename to yandex-framework/test/mdb/mongodb/user/data_source_yandex_mdb_mongodb_user_test.go index 9b03dac85..8c74b82cd 100644 --- a/yandex-framework/test/data_source_yandex_mdb_mongodb_user_test.go +++ b/yandex-framework/test/mdb/mongodb/user/data_source_yandex_mdb_mongodb_user_test.go @@ -1,18 +1,18 @@ -package test +package user import ( "context" "fmt" "testing" - yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework" - "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/utils" - "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" - "github.com/yandex-cloud/go-genproto/yandex/cloud/mdb/mongodb/v1" + yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/resourceid" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test" + mongodbtpl "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test/mdb/mongodb" ) func TestAccDataSourceMDBMongoDBUser_basic(t *testing.T) { @@ -22,8 +22,8 @@ func TestAccDataSourceMDBMongoDBUser_basic(t *testing.T) { description := "MongoDB User Terraform Datasource Test" resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, CheckDestroy: testAccCheckMDBMongoDBUserDestroy, Steps: []resource.TestStep{ { @@ -117,7 +117,7 @@ func testAccDataSourceMDBMgUserCheckResourceIDField(resourceName string) resourc return fmt.Errorf("No ID is set") } - expectedResourceId := utils.ConstructResourceId(rs.Primary.Attributes["cluster_id"], rs.Primary.Attributes["name"]) + expectedResourceId := resourceid.Construct(rs.Primary.Attributes["cluster_id"], rs.Primary.Attributes["name"]) if expectedResourceId != rs.Primary.ID { return fmt.Errorf("Wrong resource %s id. Expected %s, got %s", resourceName, expectedResourceId, rs.Primary.ID) @@ -128,7 +128,7 @@ func testAccDataSourceMDBMgUserCheckResourceIDField(resourceName string) resourc } func testAccDataSourceMDBMongoDBUserConfig(name string, description string) string { - return fmt.Sprintf(mongodbVPCDependencies+` + return fmt.Sprintf(mongodbtpl.VPCDependencies+` resource "yandex_mdb_mongodb_cluster" "foo" { name = "%s" description = "%s" @@ -173,14 +173,14 @@ data "yandex_mdb_mongodb_user" "bar" { } func testAccCheckMDBMongoDBUserDestroy(s *terraform.State) error { - config := testAccProvider.(*yandex_framework.Provider).GetConfig() + config := test.AccProvider.(*yandex_framework.Provider).GetConfig() for _, rs := range s.RootModule().Resources { if rs.Type != "yandex_mdb_mongodb_user" { continue } - clusterId, userName, err := utils.DeconstructResourceId(rs.Primary.ID) + clusterId, userName, err := resourceid.Deconstruct(rs.Primary.ID) if err != nil { return err } diff --git a/yandex-framework/test/resource_yandex_mdb_mongodb_user_test.go b/yandex-framework/test/mdb/mongodb/user/resource_yandex_mdb_mongodb_user_test.go similarity index 92% rename from yandex-framework/test/resource_yandex_mdb_mongodb_user_test.go rename to yandex-framework/test/mdb/mongodb/user/resource_yandex_mdb_mongodb_user_test.go index d94ba60cf..e36aaa4c4 100644 --- a/yandex-framework/test/resource_yandex_mdb_mongodb_user_test.go +++ b/yandex-framework/test/mdb/mongodb/user/resource_yandex_mdb_mongodb_user_test.go @@ -1,18 +1,19 @@ -package test +package user import ( "context" "fmt" "testing" - yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework" - "golang.org/x/exp/slices" - "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" "github.com/stretchr/testify/assert" "github.com/yandex-cloud/go-genproto/yandex/cloud/mdb/mongodb/v1" + yandex_framework "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider" + "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test" + mongodbtpl "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/test/mdb/mongodb" + "golang.org/x/exp/slices" ) const ( @@ -31,8 +32,8 @@ func TestAccMDBMongoDBUser_full(t *testing.T) { t.Parallel() clusterName := acctest.RandomWithPrefix("tf-mongodb-user") resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProviderFactories, + PreCheck: func() { test.AccPreCheck(t) }, + ProtoV6ProviderFactories: test.AccProviderFactories, Steps: []resource.TestStep{ { Config: testAccMDBMongoDBUserConfigStep1(clusterName), @@ -86,7 +87,7 @@ func testAccLoadMongoDBUser(s *terraform.State, username string) (*mongodb.User, return nil, fmt.Errorf("no ID is set") } - config := testAccProvider.(*yandex_framework.Provider).GetConfig() + config := test.AccProvider.(*yandex_framework.Provider).GetConfig() return config.SDK.MDB().MongoDB().User().Get(context.Background(), &mongodb.GetUserRequest{ ClusterId: rs.Primary.ID, UserName: username, @@ -126,7 +127,7 @@ func testAccCheckMDBMongoDBUserHasPermission(t *testing.T, username string, expe } func testAccMDBMongoDBUserConfigStep0(name string) string { - return fmt.Sprintf(mongodbVPCDependencies+` + return fmt.Sprintf(mongodbtpl.VPCDependencies+` resource "yandex_mdb_mongodb_cluster" "foo" { name = "%s" description = "MongoDB User Terraform Test" diff --git a/yandex-framework/test/sweeper_helpers.go b/yandex-framework/test/sweeper_helpers.go index b560e615e..e1e05330d 100644 --- a/yandex-framework/test/sweeper_helpers.go +++ b/yandex-framework/test/sweeper_helpers.go @@ -8,24 +8,25 @@ import ( "strconv" "strings" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" + "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/yandex-cloud/go-genproto/yandex/cloud/operation" "github.com/yandex-cloud/terraform-provider-yandex/common" - provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) const ( defaultZoneForSweepers = "ru-central1-a" - testAccTestsUser = "yc.terraform.acctest-sa" - testResourseNamePrefix = "yc-tf-acc-tests" + AccTestsUser = "yc.terraform.acctest-sa" + testResourceNamePrefix = "yc-tf-acc-tests" ) type sweeperFunc func(*provider_config.Config, string) error -func configForSweepers() (*provider_config.Config, error) { +func ConfigForSweepers() (*provider_config.Config, error) { token, saKeyFile := os.Getenv("YC_TOKEN"), os.Getenv("YC_SERVICE_ACCOUNT_KEY_FILE") if token == "" && saKeyFile == "" { return nil, fmt.Errorf("environmental variables YC_TOKEN or YC_SERVICE_ACCOUNT_KEY_FILE must be set") @@ -72,32 +73,32 @@ func configForSweepers() (*provider_config.Config, error) { return conf, nil } -func sweepWithRetry(sf sweeperFunc, conf *provider_config.Config, resource, id string) bool { +func SweepWithRetry(sf sweeperFunc, conf *provider_config.Config, resource, id string) bool { return sweepWithRetryByFunc(conf, fmt.Sprintf("%s '%s'", resource, id), func(conf *provider_config.Config) error { return sf(conf, id) }) } func sweepWithRetryByFunc(conf *provider_config.Config, message string, sf func(conf *provider_config.Config) error) bool { - debugLog("started sweeping %s", message) + DebugLog("started sweeping %s", message) for i := 1; i <= int(conf.ProviderState.MaxRetries.ValueInt64()); i++ { err := sf(conf) if err != nil { - debugLog("[%s] delete try #%d: %v", message, i, err) + DebugLog("[%s] delete try #%d: %v", message, i, err) } else { - debugLog("[%s] delete try #%d: deleted", message, i) + DebugLog("[%s] delete try #%d: deleted", message, i) return true } } - debugLog("failed to sweep %s", message) + DebugLog("failed to sweep %s", message) return false } -func handleSweepOperation(ctx context.Context, conf *provider_config.Config, op *operation.Operation, err error) error { +func HandleSweepOperation(ctx context.Context, conf *provider_config.Config, op *operation.Operation, err error) error { sdkop, err := conf.SDK.WrapOperation(op, err) if err != nil { - if isStatusWithCode(err, codes.NotFound) { + if IsStatusWithCode(err, codes.NotFound) { return nil } return err @@ -112,25 +113,25 @@ func handleSweepOperation(ctx context.Context, conf *provider_config.Config, op return err } -func debugLog(format string, v ...interface{}) { +func DebugLog(format string, v ...interface{}) { log.Printf("[DEBUG] "+format, v...) } -func isStatusWithCode(err error, code codes.Code) bool { +func IsStatusWithCode(err error, code codes.Code) bool { grpcStatus, ok := status.FromError(err) return ok && grpcStatus.Code() == code } -func isTestResourseName(name string) bool { - return strings.HasPrefix(name, testResourseNamePrefix) +func IsTestResourceName(name string) bool { + return strings.HasPrefix(name, testResourceNamePrefix) } -// testResourseName - return randomized name for resourse with common preffix -func testResourseName(length int) string { - saltLen := length - len(testResourseNamePrefix) - 1 +// ResourceName - return randomized name for resource with common prefix +func ResourceName(length int) string { + saltLen := length - len(testResourceNamePrefix) - 1 return fmt.Sprintf( "%s-%s", - testResourseNamePrefix, + testResourceNamePrefix, acctest.RandStringFromCharSet(saltLen, acctest.CharSetAlpha), ) } diff --git a/yandex-framework/test/sweeper_helpers_test.go b/yandex-framework/test/sweeper_helpers_test.go index 59a9bf5f5..896631b29 100644 --- a/yandex-framework/test/sweeper_helpers_test.go +++ b/yandex-framework/test/sweeper_helpers_test.go @@ -2,7 +2,7 @@ package test import "testing" -func Test_testResourseName(t *testing.T) { +func Test_testResourceName(t *testing.T) { t.Parallel() type args struct { @@ -21,8 +21,8 @@ func Test_testResourseName(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := len(testResourseName(tt.args.length)); got != tt.wantLen { - t.Errorf("testResourseName() = %v, want %v", got, tt.wantLen) + if got := len(ResourceName(tt.args.length)); got != tt.wantLen { + t.Errorf("ResourceName() = %v, want %v", got, tt.wantLen) } }) } diff --git a/yandex-framework/test/test_utils.go b/yandex-framework/test/test_utils.go index e2197b293..9ae96c0c0 100644 --- a/yandex-framework/test/test_utils.go +++ b/yandex-framework/test/test_utils.go @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/terraform-plugin-testing/terraform" ) -func testAccCheckCreatedAtAttr(resourceName string) resource.TestCheckFunc { +func AccCheckCreatedAtAttr(resourceName string) resource.TestCheckFunc { return func(s *terraform.State) error { const createdAtAttrName = "created_at" rs, ok := s.RootModule().Resources[resourceName] @@ -30,7 +30,7 @@ func testAccCheckCreatedAtAttr(resourceName string) resource.TestCheckFunc { } } -func importIamBindingIdFunc(resourceName, role string) func(*terraform.State) (string, error) { +func ImportIamBindingIdFunc(resourceName, role string) func(*terraform.State) (string, error) { return func(s *terraform.State) (string, error) { rs, ok := s.RootModule().Resources[resourceName] if !ok { diff --git a/yandex-framework/test/yandex_resoursemanager_cloud_test.go b/yandex-framework/test/yandex_resoursemanager_cloud_test.go index 9025ac959..6a47a0374 100644 --- a/yandex-framework/test/yandex_resoursemanager_cloud_test.go +++ b/yandex-framework/test/yandex_resoursemanager_cloud_test.go @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/go-multierror" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/yandex-cloud/go-genproto/yandex/cloud/resourcemanager/v1" - provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider-config" + provider_config "github.com/yandex-cloud/terraform-provider-yandex/yandex-framework/provider/config" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -34,7 +34,7 @@ func testSweepClouds(string) error { return nil } - conf, err := configForSweepers() + conf, err := ConfigForSweepers() if err != nil { return fmt.Errorf("error getting client: %s", err) } @@ -53,7 +53,7 @@ func testSweepClouds(string) error { } id := it.Value().GetId() - if !sweepWithRetry(sweepCloudOnce, conf, "Cloud", id) { + if !SweepWithRetry(sweepCloudOnce, conf, "Cloud", id) { result = multierror.Append(result, fmt.Errorf("failed to sweep Cloud %q", id)) } } @@ -77,5 +77,5 @@ func sweepCloudOnce(conf *provider_config.Config, id string) error { DeleteAfter: timestamppb.Now(), }) - return handleSweepOperation(ctx, conf, op, err) + return HandleSweepOperation(ctx, conf, op, err) } diff --git a/yandex-framework/timestamp/timestsamp.go b/yandex-framework/timestamp/timestsamp.go new file mode 100644 index 000000000..811bd0a47 --- /dev/null +++ b/yandex-framework/timestamp/timestsamp.go @@ -0,0 +1,16 @@ +package timestamp + +import ( + "time" + + "google.golang.org/protobuf/types/known/timestamppb" +) + +func Get(ts *timestamppb.Timestamp) string { + const defaultTimeFormat = time.RFC3339 + + if ts == nil { + return "" + } + return ts.AsTime().Format(defaultTimeFormat) +} diff --git a/yandex-framework/utils/utils.go b/yandex-framework/utils/utils.go deleted file mode 100644 index cb2fe6d73..000000000 --- a/yandex-framework/utils/utils.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "errors" - "fmt" - "regexp" - "strings" - "time" - - "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/yandex-cloud/go-genproto/yandex/cloud/operation" - ycsdk "github.com/yandex-cloud/go-sdk" - sdkoperation "github.com/yandex-cloud/go-sdk/operation" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/timestamppb" -) - -const DefaultTimeout = 1 * time.Minute -const DefaultPageSize = 1000 -const defaultTimeFormat = time.RFC3339 - -func Min(a, b int) int { - if a < b { - return a - } - return b -} - -func GetTimestamp(timestamp *timestamppb.Timestamp) string { - if timestamp == nil { - return "" - } - return timestamp.AsTime().Format(defaultTimeFormat) -} - -func RetryConflictingOperation(ctx context.Context, sdk *ycsdk.SDK, action func() (*operation.Operation, error)) (*sdkoperation.Operation, error) { - for { - op, err := sdk.WrapOperation(action()) - if err == nil { - return op, nil - } - - operationID := "" - message := status.Convert(err).Message() - submatchGoApi := regexp.MustCompile(`conflicting operation "(.+)" detected`).FindStringSubmatch(message) - submatchPyApi := regexp.MustCompile(`Conflicting operation (.+) detected`).FindStringSubmatch(message) - if len(submatchGoApi) > 0 { - operationID = submatchGoApi[1] - } else if len(submatchPyApi) > 0 { - operationID = submatchPyApi[1] - } else { - return op, err - } - - tflog.Debug(ctx, fmt.Sprintf("Waiting for conflicting operation %q to complete", operationID)) - req := &operation.GetOperationRequest{OperationId: operationID} - op, err = sdk.WrapOperation(sdk.Operation().Get(ctx, req)) - if err != nil { - return nil, err - } - - _ = op.Wait(ctx) - tflog.Debug(ctx, fmt.Sprintf("Conflicting operation %q has completed. Going to retry initial action.", operationID)) - } -} - -// isStatusWithCode checks if any nested error matches provided code -func IsStatusWithCode(err error, code codes.Code) bool { - grpcStatus, ok := status.FromError(err) - check := ok && grpcStatus.Code() == code - - nestedErr := errors.Unwrap(err) - if nestedErr != nil { - return IsStatusWithCode(nestedErr, code) || check - } - return check -} - -func ConstructResourceId(clusterID string, resourceName string) string { - return fmt.Sprintf("%s:%s", clusterID, resourceName) -} - -func DeconstructResourceId(resourceID string) (string, string, error) { - parts := strings.SplitN(resourceID, ":", 2) - if len(parts) != 2 { - return "", "", fmt.Errorf("Invalid resource id format: %q", resourceID) - } - - clusterID := parts[0] - resourceName := parts[1] - return clusterID, resourceName, nil -}