diff --git a/.github/docs/contribution-guide/resource.go b/.github/docs/contribution-guide/resource.go index f80500047..a537f7066 100644 --- a/.github/docs/contribution-guide/resource.go +++ b/.github/docs/contribution-guide/resource.go @@ -96,7 +96,7 @@ func (r *barResource) ModifyPlan(ctx context.Context, req resource.ModifyPlanReq // Configure adds the provider configured client to the resource. func (r *barResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } diff --git a/stackit/internal/conversion/conversion.go b/stackit/internal/conversion/conversion.go index 724eb7f35..8df2c1da4 100644 --- a/stackit/internal/conversion/conversion.go +++ b/stackit/internal/conversion/conversion.go @@ -251,34 +251,6 @@ func ToJSONMapPartialUpdatePayload(ctx context.Context, current, desired types.M return mapPayload, nil } -func ParseProviderData(ctx context.Context, providerData any, diags *diag.Diagnostics) (core.ProviderData, bool) { - // Prevent panic if the provider has not been configured. - if providerData == nil { - return core.ProviderData{}, false - } - - stackitProviderData, ok := providerData.(core.ProviderData) - if !ok { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Expected configure type core.ProviderData, got %T", providerData)) - return core.ProviderData{}, false - } - return stackitProviderData, true -} - -func ParseEphemeralProviderData(ctx context.Context, providerData any, diags *diag.Diagnostics) (core.EphemeralProviderData, bool) { - // Prevent panic if the provider has not been configured. - if providerData == nil { - return core.EphemeralProviderData{}, false - } - - stackitProviderData, ok := providerData.(core.EphemeralProviderData) - if !ok { - core.LogAndAddError(ctx, diags, "Error configuring API client", "Expected configure type core.EphemeralProviderData") - return core.EphemeralProviderData{}, false - } - return stackitProviderData, true -} - // StringListToSet safely converts a Go slice of strings into a Terraform framework types.Set. // // By accepting a pointer to diag.Diagnostics, it enables clean, inline assignments within diff --git a/stackit/internal/conversion/conversion_test.go b/stackit/internal/conversion/conversion_test.go index 05b6d3c59..06e942bcf 100644 --- a/stackit/internal/conversion/conversion_test.go +++ b/stackit/internal/conversion/conversion_test.go @@ -2,16 +2,12 @@ package conversion import ( "context" - "crypto/tls" - "net/http" "reflect" "testing" "github.com/hashicorp/terraform-plugin-framework/diag" opensearch "github.com/stackitcloud/stackit-sdk-go/services/opensearch/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/google/go-cmp/cmp" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/types" @@ -225,177 +221,6 @@ func TestToJSONMapUpdatePayload(t *testing.T) { } } -func TestParseProviderData(t *testing.T) { - type args struct { - providerData any - } - type want struct { - ok bool - providerData core.ProviderData - } - tests := []struct { - name string - args args - want want - wantErr bool - }{ - { - name: "provider has not been configured", - args: args{ - providerData: nil, - }, - want: want{ - ok: false, - }, - wantErr: false, - }, - { - name: "invalid provider data", - args: args{ - providerData: struct{}{}, - }, - want: want{ - ok: false, - }, - wantErr: true, - }, - { - name: "valid provider data 1", - args: args{ - providerData: core.ProviderData{}, - }, - want: want{ - ok: true, - providerData: core.ProviderData{}, - }, - wantErr: false, - }, - { - name: "valid provider data 2", - args: args{ - providerData: core.ProviderData{ - DefaultRegion: "eu02", - RabbitMQCustomEndpoint: "https://rabbitmq-custom-endpoint.api.stackit.cloud", - Version: "1.2.3", - }, - }, - want: want{ - ok: true, - providerData: core.ProviderData{ - DefaultRegion: "eu02", - RabbitMQCustomEndpoint: "https://rabbitmq-custom-endpoint.api.stackit.cloud", - Version: "1.2.3", - }, - }, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual, ok := ParseProviderData(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - if ok != tt.want.ok { - t.Errorf("ParseProviderData() got = %v, want %v", ok, tt.want.ok) - } - if !reflect.DeepEqual(actual, tt.want.providerData) { - t.Errorf("ParseProviderData() got = %v, want %v", actual, tt.want) - } - }) - } -} - -func TestParseEphemeralProviderData(t *testing.T) { - var randomRoundTripper http.RoundTripper = &http.Transport{ - TLSClientConfig: &tls.Config{MinVersion: tls.VersionTLS13}, - } - type args struct { - providerData any - } - type want struct { - ok bool - providerData core.EphemeralProviderData - } - tests := []struct { - name string - args args - want want - wantErr bool - }{ - { - name: "provider has not been configured", - args: args{ - providerData: nil, - }, - want: want{ - ok: false, - }, - wantErr: false, - }, - { - name: "invalid provider data", - args: args{ - providerData: struct{}{}, - }, - want: want{ - ok: false, - }, - wantErr: true, - }, - { - name: "valid provider data 1", - args: args{ - providerData: core.EphemeralProviderData{}, - }, - want: want{ - ok: true, - providerData: core.EphemeralProviderData{}, - }, - wantErr: false, - }, - { - name: "valid provider data 2", - args: args{ - providerData: core.EphemeralProviderData{ - ProviderData: core.ProviderData{ - RoundTripper: randomRoundTripper, - }, - }, - }, - want: want{ - ok: true, - providerData: core.EphemeralProviderData{ - ProviderData: core.ProviderData{ - RoundTripper: randomRoundTripper, - }, - }, - }, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual, ok := ParseEphemeralProviderData(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - if ok != tt.want.ok { - t.Errorf("ParseProviderData() got = %v, want %v", ok, tt.want.ok) - } - if !reflect.DeepEqual(actual, tt.want.providerData) { - t.Errorf("ParseProviderData() got = %v, want %v", actual, tt.want) - } - }) - } -} - func TestStringSetToSlice(t *testing.T) { t.Parallel() tests := []struct { diff --git a/stackit/internal/core/clienttestutils.go b/stackit/internal/core/clienttestutils.go new file mode 100644 index 000000000..99c82edf4 --- /dev/null +++ b/stackit/internal/core/clienttestutils.go @@ -0,0 +1,409 @@ +package core + +import ( + albSdk "github.com/stackitcloud/stackit-sdk-go/services/alb/v2api" + albWaf "github.com/stackitcloud/stackit-sdk-go/services/albwaf/v1api" + authorization "github.com/stackitcloud/stackit-sdk-go/services/authorization/v2api" + cdnSdk "github.com/stackitcloud/stackit-sdk-go/services/cdn/v1api" + certificates "github.com/stackitcloud/stackit-sdk-go/services/certificates/v2api" + dns "github.com/stackitcloud/stackit-sdk-go/services/dns/v1api" + dremioSdk "github.com/stackitcloud/stackit-sdk-go/services/dremio/v1betaapi" + edge "github.com/stackitcloud/stackit-sdk-go/services/edge/v1beta1api" + git "github.com/stackitcloud/stackit-sdk-go/services/git/v1betaapi" + iaasV2Alpha "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2alpha1api" + iaasV2 "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" + intake "github.com/stackitcloud/stackit-sdk-go/services/intake/v1betaapi" + kms "github.com/stackitcloud/stackit-sdk-go/services/kms/v1api" + loadbalancer "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer/v2api" + logmeSdk "github.com/stackitcloud/stackit-sdk-go/services/logme/v2api" + logs "github.com/stackitcloud/stackit-sdk-go/services/logs/v1api" + mariadb "github.com/stackitcloud/stackit-sdk-go/services/mariadb/v2api" + modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" + modelserving "github.com/stackitcloud/stackit-sdk-go/services/modelserving/v1api" + mongodbflex "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex/v2api" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" + observabilitySdk "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" + opensearch "github.com/stackitcloud/stackit-sdk-go/services/opensearch/v2api" + postgresflex "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3api" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" + redis "github.com/stackitcloud/stackit-sdk-go/services/redis/v2api" + resourcemanager "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager/v0api" + scf "github.com/stackitcloud/stackit-sdk-go/services/scf/v1api" + secretsmanagerV1Alpha "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager/v1alphaapi" + secretsmanager "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager/v1api" + serverbackup "github.com/stackitcloud/stackit-sdk-go/services/serverbackup/v2api" + serverupdate "github.com/stackitcloud/stackit-sdk-go/services/serverupdate/v2api" + serviceaccount "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount/v2api" + serviceenablementV2 "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement/v2api" + sfs "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" + telemetrylink "github.com/stackitcloud/stackit-sdk-go/services/telemetrylink/v1api" + telemetryrouter "github.com/stackitcloud/stackit-sdk-go/services/telemetryrouter/v1api" + vpn "github.com/stackitcloud/stackit-sdk-go/services/vpn/v1api" +) + +var _ ClientFactory = &MockClientFactory{} + +type MockClientFactory struct { + AlbCertificatesV2ClientMock certificates.DefaultAPI + AlbV2ClientMock albSdk.DefaultAPI + AlbWafV1ClientMock albWaf.DefaultAPI + AuthorizationV2ClientMock authorization.DefaultAPI + CdnV1ClientMock cdnSdk.DefaultAPI + DnsV1ClientMock dns.DefaultAPI + DremioV2BetaClientMock dremioSdk.DefaultAPI + EdgeV1ClientMock edge.DefaultAPI + GitV1BetaClientMock git.DefaultAPI + IaaSV2ClientMock iaasV2.DefaultAPI + IaasV2AlphaClientMock iaasV2Alpha.DefaultAPI + IntakeV1BetaClientMock intake.DefaultAPI + KmsV1ClientMock kms.DefaultAPI + LoadbalancerV2ClientMock loadbalancer.DefaultAPI + LogmeV2ClientMock logmeSdk.DefaultAPI + LogsV1ClientMock logs.DefaultAPI + MariadbV2ClientMock mariadb.DefaultAPI + ModelExperimentsV1ClientMock modelexperiments.DefaultAPI + ModelServerV1ClientMock modelserving.DefaultAPI + MongoDbFlexV2ClientMock mongodbflex.DefaultAPI + ObjectStorageV2ClientMock objectstorage.DefaultAPI + ObservabilityV1ClientMock observabilitySdk.DefaultAPI + OpensearchV2ClientMock opensearch.DefaultAPI + PostgresflexV3ClientMock postgresflex.DefaultAPI + RabbitMqV2ClientMock rabbitmq.DefaultAPI + RedisV2ClientMock redis.DefaultAPI + ResourceManagerClientMock resourcemanager.DefaultAPI + ScfV1ClientMock scf.DefaultAPI + SecretsManagerV1AlphaClientMock secretsmanagerV1Alpha.DefaultAPI + SecretsManagerV1ClientMock secretsmanager.DefaultAPI + ServerBackupV2ClientMock serverbackup.DefaultAPI + ServerUpdateV2ClientMock serverupdate.DefaultAPI + ServiceAccountV2ClientMock serviceaccount.DefaultAPI + ServiceEnablementV2ClientMock serviceenablementV2.DefaultAPI + SfsV1ClientMock sfs.DefaultAPI + SkeV2ClientMock ske.DefaultAPI + SqlServerFlexV3ClientMock sqlserverflex.DefaultAPI + TelemetryLinkV1ClientMock telemetrylink.DefaultAPI + TelemetryRouterV1ClientMock telemetryrouter.DefaultAPI + VpnV1ClientMock vpn.DefaultAPI +} + +func (m *MockClientFactory) newAlbV2Client() (albSdk.DefaultAPI, error) { + if m.AlbV2ClientMock != nil { + return m.AlbV2ClientMock, nil + } + + return albSdk.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newDremioV1BetaClient() (dremioSdk.DefaultAPI, error) { + if m.DremioV2BetaClientMock != nil { + return m.DremioV2BetaClientMock, nil + } + + return dremioSdk.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newGitV1BetaClient() (git.DefaultAPI, error) { + if m.GitV1BetaClientMock != nil { + return m.GitV1BetaClientMock, nil + } + + return git.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newIntakeV1BetaClient() (intake.DefaultAPI, error) { + if m.IntakeV1BetaClientMock != nil { + return m.IntakeV1BetaClientMock, nil + } + + return intake.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newKmsV1Client() (kms.DefaultAPI, error) { + if m.KmsV1ClientMock != nil { + return m.KmsV1ClientMock, nil + } + + return kms.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newLoadbalancerV2Client() (loadbalancer.DefaultAPI, error) { + if m.LoadbalancerV2ClientMock != nil { + return m.LoadbalancerV2ClientMock, nil + } + + return loadbalancer.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newLogmeV2Client() (logmeSdk.DefaultAPI, error) { + if m.LogmeV2ClientMock != nil { + return m.LogmeV2ClientMock, nil + } + + return logmeSdk.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newMariadbV2Client() (mariadb.DefaultAPI, error) { + if m.MariadbV2ClientMock != nil { + return m.MariadbV2ClientMock, nil + } + + return mariadb.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newModelServingV1Client() (modelserving.DefaultAPI, error) { + if m.ModelServerV1ClientMock != nil { + return m.ModelServerV1ClientMock, nil + } + + return modelserving.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newMongoDbFlexV2Client() (mongodbflex.DefaultAPI, error) { + if m.MongoDbFlexV2ClientMock != nil { + return m.MongoDbFlexV2ClientMock, nil + } + + return mongodbflex.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newObjectStorageV2Client() (objectstorage.DefaultAPI, error) { + if m.ObjectStorageV2ClientMock != nil { + return m.ObjectStorageV2ClientMock, nil + } + + return objectstorage.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newObservabilityV1Client() (observabilitySdk.DefaultAPI, error) { + if m.ObservabilityV1ClientMock != nil { + return m.ObservabilityV1ClientMock, nil + } + + return observabilitySdk.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newOpensearchV2Client() (opensearch.DefaultAPI, error) { + if m.OpensearchV2ClientMock != nil { + return m.OpensearchV2ClientMock, nil + } + + return opensearch.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newRabbitMqV2Client() (rabbitmq.DefaultAPI, error) { + if m.RabbitMqV2ClientMock != nil { + return m.RabbitMqV2ClientMock, nil + } + + return rabbitmq.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newRedisV2Client() (redis.DefaultAPI, error) { + if m.RedisV2ClientMock != nil { + return m.RedisV2ClientMock, nil + } + + return redis.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newScfV1Client() (scf.DefaultAPI, error) { + if m.ScfV1ClientMock != nil { + return m.ScfV1ClientMock, nil + } + + return scf.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newSecretsManagerV1AlphaClient() (secretsmanagerV1Alpha.DefaultAPI, error) { + if m.SecretsManagerV1AlphaClientMock != nil { + return m.SecretsManagerV1AlphaClientMock, nil + } + + return secretsmanagerV1Alpha.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newSecretsManagerV1Client() (secretsmanager.DefaultAPI, error) { + if m.SecretsManagerV1ClientMock != nil { + return m.SecretsManagerV1ClientMock, nil + } + + return secretsmanager.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newServerUpdateV2Client() (serverupdate.DefaultAPI, error) { + if m.ServerUpdateV2ClientMock != nil { + return m.ServerUpdateV2ClientMock, nil + } + + return serverupdate.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newServiceAccountV2Client() (serviceaccount.DefaultAPI, error) { + if m.ServiceAccountV2ClientMock != nil { + return m.ServiceAccountV2ClientMock, nil + } + + return serviceaccount.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newSfsV1Client() (sfs.DefaultAPI, error) { + if m.SfsV1ClientMock != nil { + return m.SfsV1ClientMock, nil + } + + return sfs.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newSkeV2Client() (ske.DefaultAPI, error) { + if m.SkeV2ClientMock != nil { + return m.SkeV2ClientMock, nil + } + + return ske.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newSqlServerFlexV3Client() (sqlserverflex.DefaultAPI, error) { + if m.SqlServerFlexV3ClientMock != nil { + return m.SqlServerFlexV3ClientMock, nil + } + + return sqlserverflex.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newTelemetryLinkV1Client() (telemetrylink.DefaultAPI, error) { + if m.TelemetryLinkV1ClientMock != nil { + return m.TelemetryLinkV1ClientMock, nil + } + + return telemetrylink.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newTelemetryRouterV1Client() (telemetryrouter.DefaultAPI, error) { + if m.TelemetryRouterV1ClientMock != nil { + return m.TelemetryRouterV1ClientMock, nil + } + + return telemetryrouter.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newAlbCertificatesV2Client() (certificates.DefaultAPI, error) { + if m.AlbCertificatesV2ClientMock != nil { + return m.AlbCertificatesV2ClientMock, nil + } + + return certificates.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newCdnV1Client() (cdnSdk.DefaultAPI, error) { + if m.CdnV1ClientMock != nil { + return m.CdnV1ClientMock, nil + } + + return cdnSdk.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newIaaSV2AlphaClient() (iaasV2Alpha.DefaultAPI, error) { + if m.IaaSV2ClientMock != nil { + return m.IaasV2AlphaClientMock, nil + } + + return iaasV2Alpha.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newEdgeV1Client() (edge.DefaultAPI, error) { + if m.EdgeV1ClientMock != nil { + return m.EdgeV1ClientMock, nil + } + + return edge.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newAlbWafV1Client() (albWaf.DefaultAPI, error) { + if m.AlbWafV1ClientMock != nil { + return m.AlbWafV1ClientMock, nil + } + + return albWaf.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newAuthorizationV2Client() (authorization.DefaultAPI, error) { + if m.AuthorizationV2ClientMock != nil { + return m.AuthorizationV2ClientMock, nil + } + + return authorization.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newDnsV1Client() (dns.DefaultAPI, error) { + if m.DnsV1ClientMock != nil { + return m.DnsV1ClientMock, nil + } + + return dns.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newLogsV1Client() (logs.DefaultAPI, error) { + if m.LogsV1ClientMock != nil { + return m.LogsV1ClientMock, nil + } + + return logs.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newPostgresflexV3Client() (postgresflex.DefaultAPI, error) { + if m.PostgresflexV3ClientMock != nil { + return m.PostgresflexV3ClientMock, nil + } + + return postgresflex.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newServerBackupV2Client() (serverbackup.DefaultAPI, error) { + if m.ServerBackupV2ClientMock != nil { + return m.ServerBackupV2ClientMock, nil + } + + return serverbackup.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newVpnV1Client() (vpn.DefaultAPI, error) { + if m.VpnV1ClientMock != nil { + return m.VpnV1ClientMock, nil + } + + return vpn.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newServiceEnablementV2Client() (serviceenablementV2.DefaultAPI, error) { + if m.ServiceEnablementV2ClientMock != nil { + return m.ServiceEnablementV2ClientMock, nil + } + + return serviceenablementV2.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newIaaSV2Client() (iaasV2.DefaultAPI, error) { + if m.IaaSV2ClientMock != nil { + return m.IaaSV2ClientMock, nil + } + + return iaasV2.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newResourceManagerClient() (resourcemanager.DefaultAPI, error) { + if m.ResourceManagerClientMock != nil { + return m.ResourceManagerClientMock, nil + } + + return resourcemanager.DefaultAPIServiceMock{}, nil +} + +func (m *MockClientFactory) newModelExperimentsV1Client() (modelexperiments.DefaultAPI, error) { + if m.ModelExperimentsV1ClientMock != nil { + return m.ModelExperimentsV1ClientMock, nil + } + + return modelexperiments.DefaultAPIServiceMock{}, nil +} diff --git a/stackit/internal/core/clientutils.go b/stackit/internal/core/clientutils.go new file mode 100644 index 000000000..7da52b7ad --- /dev/null +++ b/stackit/internal/core/clientutils.go @@ -0,0 +1,688 @@ +package core + +import ( + "fmt" + "net/http" + + "github.com/stackitcloud/stackit-sdk-go/core/config" + alb "github.com/stackitcloud/stackit-sdk-go/services/alb/v2api" + albwaf "github.com/stackitcloud/stackit-sdk-go/services/albwaf/v1api" + authorization "github.com/stackitcloud/stackit-sdk-go/services/authorization/v2api" + cdn "github.com/stackitcloud/stackit-sdk-go/services/cdn/v1api" + certificates "github.com/stackitcloud/stackit-sdk-go/services/certificates/v2api" + dns "github.com/stackitcloud/stackit-sdk-go/services/dns/v1api" + dremio "github.com/stackitcloud/stackit-sdk-go/services/dremio/v1betaapi" + edge "github.com/stackitcloud/stackit-sdk-go/services/edge/v1beta1api" + git "github.com/stackitcloud/stackit-sdk-go/services/git/v1betaapi" + iaasV2Alpha "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2alpha1api" + iaasV2 "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" + intake "github.com/stackitcloud/stackit-sdk-go/services/intake/v1betaapi" + kms "github.com/stackitcloud/stackit-sdk-go/services/kms/v1api" + loadbalancer "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer/v2api" + logme "github.com/stackitcloud/stackit-sdk-go/services/logme/v2api" + logs "github.com/stackitcloud/stackit-sdk-go/services/logs/v1api" + mariadb "github.com/stackitcloud/stackit-sdk-go/services/mariadb/v2api" + modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" + modelserving "github.com/stackitcloud/stackit-sdk-go/services/modelserving/v1api" + mongodbflex "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex/v2api" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" + opensearch "github.com/stackitcloud/stackit-sdk-go/services/opensearch/v2api" + postgresflex "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3api" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" + redis "github.com/stackitcloud/stackit-sdk-go/services/redis/v2api" + resourcemanager "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager/v0api" + scf "github.com/stackitcloud/stackit-sdk-go/services/scf/v1api" + secretsmanagerV1Alpha "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager/v1alphaapi" + secretsmanager "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager/v1api" + serverbackup "github.com/stackitcloud/stackit-sdk-go/services/serverbackup/v2api" + serverupdate "github.com/stackitcloud/stackit-sdk-go/services/serverupdate/v2api" + serviceaccount "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount/v2api" + serviceenablementV2 "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement/v2api" + sfs "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" + telemetrylink "github.com/stackitcloud/stackit-sdk-go/services/telemetrylink/v1api" + telemetryrouter "github.com/stackitcloud/stackit-sdk-go/services/telemetryrouter/v1api" + vpn "github.com/stackitcloud/stackit-sdk-go/services/vpn/v1api" + "golang.org/x/sync/errgroup" +) + +type ClientFactory interface { + // methods are having the API versions in them here so we can still mix & match API versions just as we need + + newAlbCertificatesV2Client() (certificates.DefaultAPI, error) + newAlbV2Client() (alb.DefaultAPI, error) + newAlbWafV1Client() (albwaf.DefaultAPI, error) + newAuthorizationV2Client() (authorization.DefaultAPI, error) + newCdnV1Client() (cdn.DefaultAPI, error) + newDnsV1Client() (dns.DefaultAPI, error) + newDremioV1BetaClient() (dremio.DefaultAPI, error) + newEdgeV1Client() (edge.DefaultAPI, error) + newGitV1BetaClient() (git.DefaultAPI, error) + newIaaSV2AlphaClient() (iaasV2Alpha.DefaultAPI, error) + newIaaSV2Client() (iaasV2.DefaultAPI, error) + newIntakeV1BetaClient() (intake.DefaultAPI, error) + newKmsV1Client() (kms.DefaultAPI, error) + newLoadbalancerV2Client() (loadbalancer.DefaultAPI, error) + newLogmeV2Client() (logme.DefaultAPI, error) + newLogsV1Client() (logs.DefaultAPI, error) + newMariadbV2Client() (mariadb.DefaultAPI, error) + newModelExperimentsV1Client() (modelexperiments.DefaultAPI, error) + newModelServingV1Client() (modelserving.DefaultAPI, error) + newMongoDbFlexV2Client() (mongodbflex.DefaultAPI, error) + newObjectStorageV2Client() (objectstorage.DefaultAPI, error) + newObservabilityV1Client() (observability.DefaultAPI, error) + newOpensearchV2Client() (opensearch.DefaultAPI, error) + newPostgresflexV3Client() (postgresflex.DefaultAPI, error) + newRabbitMqV2Client() (rabbitmq.DefaultAPI, error) + newRedisV2Client() (redis.DefaultAPI, error) + newResourceManagerClient() (resourcemanager.DefaultAPI, error) + newScfV1Client() (scf.DefaultAPI, error) + newSecretsManagerV1AlphaClient() (secretsmanagerV1Alpha.DefaultAPI, error) + newSecretsManagerV1Client() (secretsmanager.DefaultAPI, error) + newServerBackupV2Client() (serverbackup.DefaultAPI, error) + newServerUpdateV2Client() (serverupdate.DefaultAPI, error) + newServiceAccountV2Client() (serviceaccount.DefaultAPI, error) + newServiceEnablementV2Client() (serviceenablementV2.DefaultAPI, error) + newSfsV1Client() (sfs.DefaultAPI, error) + newSkeV2Client() (ske.DefaultAPI, error) + newSqlServerFlexV3Client() (sqlserverflex.DefaultAPI, error) + newTelemetryLinkV1Client() (telemetrylink.DefaultAPI, error) + newTelemetryRouterV1Client() (telemetryrouter.DefaultAPI, error) + newVpnV1Client() (vpn.DefaultAPI, error) +} + +func initClientCollection(clientFactory ClientFactory) (*clientCollection, error) { + var g errgroup.Group + cc := &clientCollection{} + + // initialize clients in parallel + g.Go(func() (err error) { cc.IaaSv2Client, err = clientFactory.newIaaSV2Client(); return err }) + g.Go(func() (err error) { cc.EdgeV1Client, err = clientFactory.newEdgeV1Client(); return err }) + g.Go(func() (err error) { cc.DnsV1Client, err = clientFactory.newDnsV1Client(); return err }) + g.Go(func() (err error) { cc.ServerBackupV2Client, err = clientFactory.newServerBackupV2Client(); return err }) + g.Go(func() (err error) { cc.AlbWafV1CLient, err = clientFactory.newAlbWafV1Client(); return err }) + g.Go(func() (err error) { cc.LogsV1Client, err = clientFactory.newLogsV1Client(); return err }) + g.Go(func() (err error) { cc.VpnV1Client, err = clientFactory.newVpnV1Client(); return err }) + g.Go(func() (err error) { cc.IaaSv2AlphaClient, err = clientFactory.newIaaSV2AlphaClient(); return err }) + g.Go(func() (err error) { cc.CdnV1Client, err = clientFactory.newCdnV1Client(); return err }) + g.Go(func() (err error) { cc.PostgresflexV3Client, err = clientFactory.newPostgresflexV3Client(); return err }) + g.Go(func() (err error) { cc.AlbV2Client, err = clientFactory.newAlbV2Client(); return err }) + g.Go(func() (err error) { cc.SkeV2Client, err = clientFactory.newSkeV2Client(); return err }) + g.Go(func() (err error) { cc.ModelservingV1Client, err = clientFactory.newModelServingV1Client(); return err }) + g.Go(func() (err error) { cc.LogmeV2Client, err = clientFactory.newLogmeV2Client(); return err }) + g.Go(func() (err error) { cc.OpensearchV2Client, err = clientFactory.newOpensearchV2Client(); return err }) + g.Go(func() (err error) { cc.GitV1BetaClient, err = clientFactory.newGitV1BetaClient(); return err }) + g.Go(func() (err error) { cc.RedisV2Client, err = clientFactory.newRedisV2Client(); return err }) + g.Go(func() (err error) { cc.ServerUpdateV2Client, err = clientFactory.newServerUpdateV2Client(); return err }) + g.Go(func() (err error) { cc.KmsV1Client, err = clientFactory.newKmsV1Client(); return err }) + g.Go(func() (err error) { cc.SfsV1Client, err = clientFactory.newSfsV1Client(); return err }) + g.Go(func() (err error) { cc.RabbitMqV2Client, err = clientFactory.newRabbitMqV2Client(); return err }) + g.Go(func() (err error) { cc.MongoDbFlexV2Client, err = clientFactory.newMongoDbFlexV2Client(); return err }) + g.Go(func() (err error) { cc.MariadbV2Client, err = clientFactory.newMariadbV2Client(); return err }) + g.Go(func() (err error) { cc.ScfV1Client, err = clientFactory.newScfV1Client(); return err }) + g.Go(func() (err error) { cc.LoadbalancerV2Client, err = clientFactory.newLoadbalancerV2Client(); return err }) + g.Go(func() (err error) { cc.IntakeV1BetaClient, err = clientFactory.newIntakeV1BetaClient(); return err }) + g.Go(func() (err error) { cc.DremioV1BetaClient, err = clientFactory.newDremioV1BetaClient(); return err }) + g.Go(func() (err error) { + cc.ResourceManagerClient, err = clientFactory.newResourceManagerClient() + return err + }) + g.Go(func() (err error) { + cc.ModelExperimentsV1Client, err = clientFactory.newModelExperimentsV1Client() + return err + }) + g.Go(func() (err error) { + cc.ServiceEnablementV2Client, err = clientFactory.newServiceEnablementV2Client() + return err + }) + g.Go(func() (err error) { + cc.AlbCertificatesV2Client, err = clientFactory.newAlbCertificatesV2Client() + return err + }) + g.Go(func() (err error) { + cc.AuthorizationV2Client, err = clientFactory.newAuthorizationV2Client() + return err + }) + g.Go(func() (err error) { + cc.SqlServerFlexV3Client, err = clientFactory.newSqlServerFlexV3Client() + return err + }) + g.Go(func() (err error) { + cc.TelemetryRouterV1Client, err = clientFactory.newTelemetryRouterV1Client() + return err + }) + g.Go(func() (err error) { + cc.TelemetryLinkV1Client, err = clientFactory.newTelemetryLinkV1Client() + return err + }) + g.Go(func() (err error) { + cc.ServiceAccountV2Client, err = clientFactory.newServiceAccountV2Client() + return err + }) + g.Go(func() (err error) { + cc.ServiceAccountV2Client, err = clientFactory.newServiceAccountV2Client() + return err + }) + g.Go(func() (err error) { + cc.ObjectStorageV2Client, err = clientFactory.newObjectStorageV2Client() + return err + }) + g.Go(func() (err error) { + cc.SecretsmanagerV1Client, err = clientFactory.newSecretsManagerV1Client() + return err + }) + g.Go(func() (err error) { + cc.SecretsmanagerV1AlphaClient, err = clientFactory.newSecretsManagerV1AlphaClient() + return err + }) + g.Go(func() (err error) { + cc.ObservabilityV1Client, err = clientFactory.newObservabilityV1Client() + return err + }) + + // wait for initialization of all clients, handle errors + if err := g.Wait(); err != nil { + return nil, err + } + + return cc, nil +} + +var _ ClientFactory = &DefaultClientFactory{} + +type DefaultClientFactory struct { + RoundTripper http.RoundTripper + UserAgent string + CustomEndpoints CustomEndpointConfig + + // Deprecated: This should be only used for legacy implementations, not for new ones! + ProviderDefaultRegion string +} + +func (f *DefaultClientFactory) defaultConfigOptions(customEndpoint string) []config.ConfigurationOption { + apiClientConfigOptions := []config.ConfigurationOption{ + config.WithCustomAuth(f.RoundTripper), + config.WithUserAgent(f.UserAgent), + } + + if customEndpoint != "" { + apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(customEndpoint)) + } + + return apiClientConfigOptions +} + +func (f *DefaultClientFactory) newAlbV2Client() (alb.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.ALBCustomEndpoint) + + apiClient, err := alb.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newGitV1BetaClient() (git.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.GitCustomEndpoint) + + apiClient, err := git.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newIntakeV1BetaClient() (intake.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.IntakeCustomEndpoint) + + apiClient, err := intake.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newKmsV1Client() (kms.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.KMSCustomEndpoint) + + apiClient, err := kms.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newLoadbalancerV2Client() (loadbalancer.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.LoadBalancerCustomEndpoint) + + apiClient, err := loadbalancer.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newLogmeV2Client() (logme.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.LogMeCustomEndpoint) + + apiClient, err := logme.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newMariadbV2Client() (mariadb.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.MariaDBCustomEndpoint) + + apiClient, err := mariadb.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newModelServingV1Client() (modelserving.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.ModelServingCustomEndpoint) + + apiClient, err := modelserving.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newMongoDbFlexV2Client() (mongodbflex.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.MongoDBFlexCustomEndpoint) + + apiClient, err := mongodbflex.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newObjectStorageV2Client() (objectstorage.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.ObjectStorageCustomEndpoint) + + apiClient, err := objectstorage.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newOpensearchV2Client() (opensearch.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.OpenSearchCustomEndpoint) + + apiClient, err := opensearch.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newRabbitMqV2Client() (rabbitmq.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.RabbitMQCustomEndpoint) + + apiClient, err := rabbitmq.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newRedisV2Client() (redis.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.RedisCustomEndpoint) + + apiClient, err := redis.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newScfV1Client() (scf.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.ScfCustomEndpoint) + + apiClient, err := scf.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newServerUpdateV2Client() (serverupdate.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.ServerUpdateCustomEndpoint) + + apiClient, err := serverupdate.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newServiceAccountV2Client() (serviceaccount.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.ServiceAccountCustomEndpoint) + + apiClient, err := serviceaccount.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newSfsV1Client() (sfs.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.SfsCustomEndpoint) + + apiClient, err := sfs.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newSkeV2Client() (ske.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.SKECustomEndpoint) + + apiClient, err := ske.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newSqlServerFlexV3Client() (sqlserverflex.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.SQLServerFlexCustomEndpoint) + + apiClient, err := sqlserverflex.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newTelemetryLinkV1Client() (telemetrylink.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.TelemetryLinkCustomEndpoint) + + apiClient, err := telemetrylink.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newTelemetryRouterV1Client() (telemetryrouter.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.TelemetryRouterCustomEndpoint) + + apiClient, err := telemetryrouter.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newAlbCertificatesV2Client() (certificates.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.ALBCertificatesCustomEndpoint) + + apiClient, err := certificates.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newCdnV1Client() (cdn.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.CdnCustomEndpoint) + + apiClient, err := cdn.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newIaaSV2AlphaClient() (iaasV2Alpha.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.IaaSCustomEndpoint) + + apiClient, err := iaasV2Alpha.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newEdgeV1Client() (edge.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.EdgeCloudCustomEndpoint) + + apiClient, err := edge.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newAlbWafV1Client() (albwaf.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.AlbWafCustomEndpoint) + + apiClient, err := albwaf.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newAuthorizationV2Client() (authorization.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.AuthorizationCustomEndpoint) + + apiClient, err := authorization.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newDnsV1Client() (dns.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.DnsCustomEndpoint) + + apiClient, err := dns.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newLogsV1Client() (logs.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.LogsCustomEndpoint) + + apiClient, err := logs.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newPostgresflexV3Client() (postgresflex.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.PostgresFlexCustomEndpoint) + + apiClient, err := postgresflex.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newServerBackupV2Client() (serverbackup.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.ServerBackupCustomEndpoint) + + apiClient, err := serverbackup.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newVpnV1Client() (vpn.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.VpnCustomEndpoint) + + apiClient, err := vpn.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newServiceEnablementV2Client() (serviceenablementV2.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.ServiceEnablementCustomEndpoint) + + apiClient, err := serviceenablementV2.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newIaaSV2Client() (iaasV2.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.IaaSCustomEndpoint) + + apiClient, err := iaasV2.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newResourceManagerClient() (resourcemanager.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.ResourceManagerCustomEndpoint) + + apiClient, err := resourcemanager.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newModelExperimentsV1Client() (modelexperiments.DefaultAPI, error) { + apiClientConfigOptions := f.defaultConfigOptions(f.CustomEndpoints.ModelExperimentsCustomEndpoint) + + apiClient, err := modelexperiments.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newDremioV1BetaClient() (dremio.DefaultAPI, error) { + apiClientConfigOptions := []config.ConfigurationOption{ + config.WithCustomAuth(f.RoundTripper), + config.WithUserAgent(f.UserAgent), + config.WithRegion(f.ProviderDefaultRegion), + } + if f.CustomEndpoints.DremioCustomEndpoint != "" { + apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(f.CustomEndpoints.DremioCustomEndpoint)) + } + apiClient, err := dremio.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newSecretsManagerV1Client() (secretsmanager.DefaultAPI, error) { + apiClientConfigOptions := []config.ConfigurationOption{ + config.WithCustomAuth(f.RoundTripper), + config.WithUserAgent(f.UserAgent), + } + + if f.CustomEndpoints.SecretsManagerCustomEndpoint != "" { + apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(f.CustomEndpoints.SecretsManagerCustomEndpoint)) + } else { + apiClientConfigOptions = append(apiClientConfigOptions, config.WithRegion(f.ProviderDefaultRegion)) + } + + apiClient, err := secretsmanager.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newSecretsManagerV1AlphaClient() (secretsmanagerV1Alpha.DefaultAPI, error) { + apiClientConfigOptions := []config.ConfigurationOption{ + config.WithCustomAuth(f.RoundTripper), + config.WithUserAgent(f.UserAgent), + } + + if f.CustomEndpoints.SecretsManagerCustomEndpoint != "" { + apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(f.CustomEndpoints.SecretsManagerCustomEndpoint)) + } else { + apiClientConfigOptions = append(apiClientConfigOptions, config.WithRegion(f.ProviderDefaultRegion)) + } + + apiClient, err := secretsmanagerV1Alpha.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} + +func (f *DefaultClientFactory) newObservabilityV1Client() (observability.DefaultAPI, error) { + apiClientConfigOptions := []config.ConfigurationOption{ + config.WithCustomAuth(f.RoundTripper), + config.WithUserAgent(f.UserAgent), + } + + if f.CustomEndpoints.ObservabilityCustomEndpoint != "" { + apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(f.CustomEndpoints.ObservabilityCustomEndpoint)) + } else { + apiClientConfigOptions = append(apiClientConfigOptions, config.WithRegion(f.ProviderDefaultRegion)) + } + + apiClient, err := observability.NewAPIClient(apiClientConfigOptions...) + if err != nil { + return nil, fmt.Errorf("configuring client: %w. This is an error related to the provider configuration, not to the resource configuration", err) + } + + return apiClient.DefaultAPI, nil +} diff --git a/stackit/internal/core/clientutils_test.go b/stackit/internal/core/clientutils_test.go new file mode 100644 index 000000000..ce4cec616 --- /dev/null +++ b/stackit/internal/core/clientutils_test.go @@ -0,0 +1,61 @@ +package core + +import ( + "reflect" + "testing" +) + +func Test_initClientCollection(t *testing.T) { + type args struct { + clientFactory ClientFactory + } + tests := []struct { + name string + args args + want *clientCollection + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := initClientCollection(tt.args.clientFactory) + if (err != nil) != tt.wantErr { + t.Errorf("initClientCollection() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("initClientCollection() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestInitClientCollection_NoNilFields(t *testing.T) { + // This test case makes sure that all fields in the client collection are initialized after initializing it + // using a client factory. It uses reflection to make sure all fields are covered, also new ones which got added. + // A regular unit test without reflection couldn't cover this. + + mockFactory := &MockClientFactory{} + + cc, err := initClientCollection(mockFactory) + if err != nil { + t.Fatalf("unexpected error during initialization: %v", err) + } + + if cc == nil { + t.Fatal("expected clientCollection pointer to be non-nil") + } + + val := reflect.ValueOf(*cc) + typ := val.Type() + + for i := 0; i < val.NumField(); i++ { + fieldVal := val.Field(i) + fieldName := typ.Field(i).Name + + if fieldVal.IsZero() { + t.Errorf("field %q is nil or uninitialized", fieldName) + } + } +} diff --git a/stackit/internal/core/core.go b/stackit/internal/core/core.go index 90ea4c0bf..6cd285830 100644 --- a/stackit/internal/core/core.go +++ b/stackit/internal/core/core.go @@ -11,6 +11,46 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" "github.com/stackitcloud/stackit-sdk-go/core/runtime" + alb "github.com/stackitcloud/stackit-sdk-go/services/alb/v2api" + albwaf "github.com/stackitcloud/stackit-sdk-go/services/albwaf/v1api" + authorization "github.com/stackitcloud/stackit-sdk-go/services/authorization/v2api" + cdn "github.com/stackitcloud/stackit-sdk-go/services/cdn/v1api" + certSdk "github.com/stackitcloud/stackit-sdk-go/services/certificates/v2api" + dns "github.com/stackitcloud/stackit-sdk-go/services/dns/v1api" + dremio "github.com/stackitcloud/stackit-sdk-go/services/dremio/v1betaapi" + edge "github.com/stackitcloud/stackit-sdk-go/services/edge/v1beta1api" + git "github.com/stackitcloud/stackit-sdk-go/services/git/v1betaapi" + iaasv2alpha "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2alpha1api" + iaasv2 "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" + intake "github.com/stackitcloud/stackit-sdk-go/services/intake/v1betaapi" + kms "github.com/stackitcloud/stackit-sdk-go/services/kms/v1api" + loadbalancer "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer/v2api" + logme "github.com/stackitcloud/stackit-sdk-go/services/logme/v2api" + logs "github.com/stackitcloud/stackit-sdk-go/services/logs/v1api" + mariadb "github.com/stackitcloud/stackit-sdk-go/services/mariadb/v2api" + modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" + modelserving "github.com/stackitcloud/stackit-sdk-go/services/modelserving/v1api" + mongodbflex "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex/v2api" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" + observability "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" + opensearch "github.com/stackitcloud/stackit-sdk-go/services/opensearch/v2api" + postgresflex "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3api" + rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" + redis "github.com/stackitcloud/stackit-sdk-go/services/redis/v2api" + resourcemanager "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager/v0api" + scf "github.com/stackitcloud/stackit-sdk-go/services/scf/v1api" + secretsmanagerV1Alpha "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager/v1alphaapi" + secretsmanager "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager/v1api" + serverbackup "github.com/stackitcloud/stackit-sdk-go/services/serverbackup/v2api" + serverupdate "github.com/stackitcloud/stackit-sdk-go/services/serverupdate/v2api" + serviceaccount "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount/v2api" + serviceenablement "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement/v2api" + sfs "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" + telemetrylink "github.com/stackitcloud/stackit-sdk-go/services/telemetrylink/v1api" + telemetryrouter "github.com/stackitcloud/stackit-sdk-go/services/telemetryrouter/v1api" + vpn "github.com/stackitcloud/stackit-sdk-go/services/vpn/v1api" ) type ResourceType string @@ -32,12 +72,10 @@ var DefaultOperationTimeout = 30 * time.Minute type EphemeralProviderData struct { ProviderData + RoundTripper http.RoundTripper } -type ProviderData struct { - RoundTripper http.RoundTripper - ServiceAccountEmail string - DefaultRegion string +type CustomEndpointConfig struct { ALBCertificatesCustomEndpoint string ALBCustomEndpoint string AlbWafCustomEndpoint string @@ -76,10 +114,104 @@ type ProviderData struct { TelemetryLinkCustomEndpoint string TelemetryRouterCustomEndpoint string VpnCustomEndpoint string - EnableBetaResources bool - Experiments []string +} + +func NewProviderDataInternal(providerData ProviderData, clientFactory ClientFactory) (providerDataInternal, error) { + clients, err := initClientCollection(clientFactory) + if err != nil { + return providerDataInternal{}, err + } + + return providerDataInternal{ + clients: *clients, + providerData: providerData, + }, nil +} + +type providerDataInternal struct { + // providerData is the public provider data + providerData ProviderData + clients clientCollection +} + +type RoleBindingClientCollection = clientCollection + +type clientCollection struct { + IaaSv2Client iaasv2.DefaultAPI + IaaSv2AlphaClient iaasv2alpha.DefaultAPI + ResourceManagerClient resourcemanager.DefaultAPI + ModelExperimentsV1Client modelexperiments.DefaultAPI + EdgeV1Client edge.DefaultAPI + DnsV1Client dns.DefaultAPI + CdnV1Client cdn.DefaultAPI + ServerBackupV2Client serverbackup.DefaultAPI + AlbCertificatesV2Client certSdk.DefaultAPI + ServiceEnablementV2Client serviceenablement.DefaultAPI + AlbWafV1CLient albwaf.DefaultAPI + LogsV1Client logs.DefaultAPI + VpnV1Client vpn.DefaultAPI + AuthorizationV2Client authorization.DefaultAPI + PostgresflexV3Client postgresflex.DefaultAPI + AlbV2Client alb.DefaultAPI + SkeV2Client ske.DefaultAPI + SqlServerFlexV3Client sqlserverflex.DefaultAPI + ModelservingV1Client modelserving.DefaultAPI + LogmeV2Client logme.DefaultAPI + OpensearchV2Client opensearch.DefaultAPI + GitV1BetaClient git.DefaultAPI + RedisV2Client redis.DefaultAPI + TelemetryRouterV1Client telemetryrouter.DefaultAPI + TelemetryLinkV1Client telemetrylink.DefaultAPI + ServerUpdateV2Client serverupdate.DefaultAPI + KmsV1Client kms.DefaultAPI + SfsV1Client sfs.DefaultAPI + ServiceAccountV2Client serviceaccount.DefaultAPI + RabbitMqV2Client rabbitmq.DefaultAPI + MongoDbFlexV2Client mongodbflex.DefaultAPI + ObjectStorageV2Client objectstorage.DefaultAPI + MariadbV2Client mariadb.DefaultAPI + ScfV1Client scf.DefaultAPI + LoadbalancerV2Client loadbalancer.DefaultAPI + IntakeV1BetaClient intake.DefaultAPI + DremioV1BetaClient dremio.DefaultAPI + SecretsmanagerV1Client secretsmanager.DefaultAPI + SecretsmanagerV1AlphaClient secretsmanagerV1Alpha.DefaultAPI + ObservabilityV1Client observability.DefaultAPI +} - Version string // version of the STACKIT Terraform provider +func ParseProviderData(ctx context.Context, providerData any, diags *diag.Diagnostics) (ProviderData, clientCollection, bool) { + // Prevent panic if the provider has not been configured. + if providerData == nil { + return ProviderData{}, clientCollection{}, false + } + + stackitProviderDataInternal, ok := providerData.(providerDataInternal) + if !ok { + LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Expected configure type core.providerDataInternal, got %T", providerData)) + return ProviderData{}, clientCollection{}, false + } + return stackitProviderDataInternal.providerData, stackitProviderDataInternal.clients, true +} + +func ParseEphemeralProviderData(ctx context.Context, providerData any, diags *diag.Diagnostics) (EphemeralProviderData, bool) { + // Prevent panic if the provider has not been configured. + if providerData == nil { + return EphemeralProviderData{}, false + } + + stackitProviderData, ok := providerData.(EphemeralProviderData) + if !ok { + LogAndAddError(ctx, diags, "Error configuring API client", "Expected configure type core.EphemeralProviderData") + return EphemeralProviderData{}, false + } + return stackitProviderData, true +} + +type ProviderData struct { + ServiceAccountEmail string + DefaultRegion string + EnableBetaResources bool + Experiments []string } // GetRegion returns the effective region for the provider, falling back to the deprecated _region_ attribute diff --git a/stackit/internal/core/core_test.go b/stackit/internal/core/core_test.go index d94671641..2c8bba396 100644 --- a/stackit/internal/core/core_test.go +++ b/stackit/internal/core/core_test.go @@ -1,8 +1,13 @@ package core import ( + "context" + "crypto/tls" + "net/http" + "reflect" "testing" + "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/types" ) @@ -83,3 +88,91 @@ func TestProviderData_GetRegion(t *testing.T) { }) } } + +func TestParseEphemeralProviderData(t *testing.T) { + var randomRoundTripper http.RoundTripper = &http.Transport{ + TLSClientConfig: &tls.Config{MinVersion: tls.VersionTLS13}, + } + + type args struct { + providerData any + } + + type want struct { + ok bool + providerData EphemeralProviderData + } + + tests := []struct { + name string + args args + want want + wantErr bool + }{ + { + name: "provider has not been configured", + args: args{ + providerData: nil, + }, + want: want{ + ok: false, + }, + wantErr: false, + }, + { + name: "invalid provider data", + args: args{ + providerData: struct{}{}, + }, + want: want{ + ok: false, + }, + wantErr: true, + }, + { + name: "valid provider data 1", + args: args{ + providerData: EphemeralProviderData{}, + }, + want: want{ + ok: true, + providerData: EphemeralProviderData{}, + }, + wantErr: false, + }, + { + name: "valid provider data 2", + args: args{ + providerData: EphemeralProviderData{ + ProviderData: ProviderData{}, + RoundTripper: randomRoundTripper, + }, + }, + want: want{ + ok: true, + providerData: EphemeralProviderData{ + ProviderData: ProviderData{}, + RoundTripper: randomRoundTripper, + }, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx := context.Background() + diags := diag.Diagnostics{} + + actual, ok := ParseEphemeralProviderData(ctx, tt.args.providerData, &diags) + if diags.HasError() != tt.wantErr { + t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) + } + if ok != tt.want.ok { + t.Errorf("ParseProviderData() got = %v, want %v", ok, tt.want.ok) + } + if !reflect.DeepEqual(actual, tt.want.providerData) { + t.Errorf("ParseProviderData() got = %v, want %v", actual, tt.want) + } + }) + } +} diff --git a/stackit/internal/services/access_token/ephemeral_resource.go b/stackit/internal/services/access_token/ephemeral_resource.go index f980becd7..0d7feedf3 100644 --- a/stackit/internal/services/access_token/ephemeral_resource.go +++ b/stackit/internal/services/access_token/ephemeral_resource.go @@ -10,7 +10,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" ) @@ -29,7 +28,7 @@ type accessTokenEphemeralResource struct { } func (e *accessTokenEphemeralResource) Configure(ctx context.Context, req ephemeral.ConfigureRequest, resp *ephemeral.ConfigureResponse) { - ephemeralProviderData, ok := conversion.ParseEphemeralProviderData(ctx, req.ProviderData, &resp.Diagnostics) + ephemeralProviderData, ok := core.ParseEphemeralProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } diff --git a/stackit/internal/services/alb/applicationloadbalancer/datasource.go b/stackit/internal/services/alb/applicationloadbalancer/datasource.go index 95cd1cca6..0a201acf2 100644 --- a/stackit/internal/services/alb/applicationloadbalancer/datasource.go +++ b/stackit/internal/services/alb/applicationloadbalancer/datasource.go @@ -7,9 +7,6 @@ import ( sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - albUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/alb/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/types" @@ -32,7 +29,7 @@ func NewApplicationLoadBalancerDataSource() datasource.DataSource { // albDataSource is the data source implementation. type albDataSource struct { - client *albSdk.APIClient + client albSdk.DefaultAPI providerData core.ProviderData } @@ -44,16 +41,14 @@ func (r *albDataSource) Metadata(_ context.Context, req datasource.MetadataReque // Configure adds the provider configured client to the data source. func (r *albDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := albUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.AlbV2Client + tflog.Info(ctx, "Application Load Balancer client configured") } @@ -557,7 +552,7 @@ func (r *albDataSource) Read(ctx context.Context, req datasource.ReadRequest, re ctx = tflog.SetField(ctx, "name", name) ctx = tflog.SetField(ctx, "region", region) - albResp, err := r.client.DefaultAPI.GetLoadBalancer(ctx, projectId, region, name).Execute() + albResp, err := r.client.GetLoadBalancer(ctx, projectId, region, name).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/alb/applicationloadbalancer/resource.go b/stackit/internal/services/alb/applicationloadbalancer/resource.go index 3fd1a0f76..7dd5d5afc 100644 --- a/stackit/internal/services/alb/applicationloadbalancer/resource.go +++ b/stackit/internal/services/alb/applicationloadbalancer/resource.go @@ -37,7 +37,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - albUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/alb/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -332,7 +331,7 @@ func NewApplicationLoadBalancerResource() resource.Resource { // applicationLoadBalancerResource is the resource implementation. type applicationLoadBalancerResource struct { - client *albSdk.APIClient + client albSdk.DefaultAPI providerData core.ProviderData } @@ -373,17 +372,14 @@ func (r *applicationLoadBalancerResource) ModifyPlan(ctx context.Context, req re // Configure adds the provider configured client to the resource. func (r *applicationLoadBalancerResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := albUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.AlbV2Client + tflog.Info(ctx, "Application Load Balancer client configured") } @@ -1165,7 +1161,7 @@ func (r *applicationLoadBalancerResource) Create(ctx context.Context, req resour } // Create a new Application Load Balancer - createResp, err := r.client.DefaultAPI.CreateLoadBalancer(ctx, projectId, region).CreateLoadBalancerPayload(*payload).Execute() + createResp, err := r.client.CreateLoadBalancer(ctx, projectId, region).CreateLoadBalancerPayload(*payload).Execute() if err != nil { errStr := utils.PrettyApiErr(ctx, &resp.Diagnostics, err) core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating Application Load Balancer", fmt.Sprintf("Calling API for create: %v", errStr)) @@ -1183,7 +1179,7 @@ func (r *applicationLoadBalancerResource) Create(ctx context.Context, req resour return } - waitResp, err := wait.CreateOrUpdateLoadbalancerWaitHandler(ctx, r.client.DefaultAPI, projectId, region, *createResp.Name).SetTimeout(90 * time.Minute).WaitWithContext(ctx) + waitResp, err := wait.CreateOrUpdateLoadbalancerWaitHandler(ctx, r.client, projectId, region, *createResp.Name).SetTimeout(90 * time.Minute).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating Application Load Balancer", fmt.Sprintf("Application Load Balancer creation waiting: %v", err)) return @@ -1222,7 +1218,7 @@ func (r *applicationLoadBalancerResource) Read(ctx context.Context, req resource ctx = tflog.SetField(ctx, "name", name) ctx = tflog.SetField(ctx, "region", region) - lbResp, err := r.client.DefaultAPI.GetLoadBalancer(ctx, projectId, region, name).Execute() + lbResp, err := r.client.GetLoadBalancer(ctx, projectId, region, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) { @@ -1290,7 +1286,7 @@ func (r *applicationLoadBalancerResource) Update(ctx context.Context, req resour } // Update target pool - updateResp, err := r.client.DefaultAPI.UpdateLoadBalancer(ctx, projectId, region, name).UpdateLoadBalancerPayload(*payload).Execute() + updateResp, err := r.client.UpdateLoadBalancer(ctx, projectId, region, name).UpdateLoadBalancerPayload(*payload).Execute() if err != nil { errStr := utils.PrettyApiErr(ctx, &resp.Diagnostics, err) core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating Application Load Balancer", fmt.Sprintf("Calling API for update: %v", errStr)) @@ -1299,7 +1295,7 @@ func (r *applicationLoadBalancerResource) Update(ctx context.Context, req resour ctx = core.LogResponse(ctx) - waitResp, err := wait.CreateOrUpdateLoadbalancerWaitHandler(ctx, r.client.DefaultAPI, projectId, region, *updateResp.Name).SetTimeout(90 * time.Minute).WaitWithContext(ctx) + waitResp, err := wait.CreateOrUpdateLoadbalancerWaitHandler(ctx, r.client, projectId, region, *updateResp.Name).SetTimeout(90 * time.Minute).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating Application Load Balancer", fmt.Sprintf("Application Load Balancer update waiting: %v", err)) return @@ -1341,7 +1337,7 @@ func (r *applicationLoadBalancerResource) Delete(ctx context.Context, req resour ctx = tflog.SetField(ctx, "region", region) // Delete Application Load Balancer - _, err := r.client.DefaultAPI.DeleteLoadBalancer(ctx, projectId, region, name).Execute() + _, err := r.client.DeleteLoadBalancer(ctx, projectId, region, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -1355,7 +1351,7 @@ func (r *applicationLoadBalancerResource) Delete(ctx context.Context, req resour ctx = core.LogResponse(ctx) - _, err = wait.DeleteLoadbalancerWaitHandler(ctx, r.client.DefaultAPI, projectId, region, name).WaitWithContext(ctx) + _, err = wait.DeleteLoadbalancerWaitHandler(ctx, r.client, projectId, region, name).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting Application Load Balancer", fmt.Sprintf("Application Load Balancer deleting waiting: %v", err)) return diff --git a/stackit/internal/services/alb/utils/util.go b/stackit/internal/services/alb/utils/util.go deleted file mode 100644 index 39bf860be..000000000 --- a/stackit/internal/services/alb/utils/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - albSdk "github.com/stackitcloud/stackit-sdk-go/services/alb/v2api" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *albSdk.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.ALBCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.ALBCustomEndpoint)) - } - apiClient, err := albSdk.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/alb/utils/util_test.go b/stackit/internal/services/alb/utils/util_test.go deleted file mode 100644 index 39d47b86b..000000000 --- a/stackit/internal/services/alb/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - albSdk "github.com/stackitcloud/stackit-sdk-go/services/alb/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://alb-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *albSdk.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *albSdk.APIClient { - apiClient, err := albSdk.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - ALBCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *albSdk.APIClient { - apiClient, err := albSdk.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/albcertificates/certificate/datasource.go b/stackit/internal/services/albcertificates/certificate/datasource.go index 758c4e260..51101473d 100644 --- a/stackit/internal/services/albcertificates/certificate/datasource.go +++ b/stackit/internal/services/albcertificates/certificate/datasource.go @@ -10,9 +10,7 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" certSdk "github.com/stackitcloud/stackit-sdk-go/services/certificates/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - certUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/albcertificates/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) @@ -28,7 +26,7 @@ func NewCertificatesDataSource() datasource.DataSource { // certDataSource is the data source implementation. type certDataSource struct { - client *certSdk.APIClient + client certSdk.DefaultAPI providerData core.ProviderData } @@ -39,17 +37,14 @@ func (r *certDataSource) Metadata(_ context.Context, req datasource.MetadataRequ // Configure adds the provider configured client to the data source. func (r *certDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := certUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.AlbCertificatesV2Client + tflog.Info(ctx, "Certificate client configured") } @@ -117,7 +112,7 @@ func (r *certDataSource) Read(ctx context.Context, req datasource.ReadRequest, r ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "cert_id", certId) - certResp, err := r.client.DefaultAPI.GetCertificate(ctx, projectId, region, certId).Execute() + certResp, err := r.client.GetCertificate(ctx, projectId, region, certId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/albcertificates/certificate/resource.go b/stackit/internal/services/albcertificates/certificate/resource.go index 9ee04e457..e56a513d5 100644 --- a/stackit/internal/services/albcertificates/certificate/resource.go +++ b/stackit/internal/services/albcertificates/certificate/resource.go @@ -21,7 +21,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - certUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/albcertificates/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -57,7 +56,7 @@ func NewCertificatesResource() resource.Resource { // certificatesResource is the resource implementation. type certificatesResource struct { - client *certSdk.APIClient + client certSdk.DefaultAPI providerData core.ProviderData } @@ -99,16 +98,14 @@ func (r *certificatesResource) ModifyPlan(ctx context.Context, req resource.Modi // Configure adds the provider configured client to the resource. func (r *certificatesResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := certUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.AlbCertificatesV2Client + tflog.Info(ctx, "Certificate client configured") } @@ -228,7 +225,7 @@ func (r *certificatesResource) Create(ctx context.Context, req resource.CreateRe } // Create a new Certificate - createResp, err := r.client.DefaultAPI.CreateCertificate(ctx, projectId, region).CreateCertificatePayload(*payload).Execute() + createResp, err := r.client.CreateCertificate(ctx, projectId, region).CreateCertificatePayload(*payload).Execute() if err != nil { errStr := utils.PrettyApiErr(ctx, &resp.Diagnostics, err) core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating Certificate", fmt.Sprintf("Calling API for create: %v", errStr)) @@ -278,7 +275,7 @@ func (r *certificatesResource) Read(ctx context.Context, req resource.ReadReques ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "cert_id", certId) - readResp, err := r.client.DefaultAPI.GetCertificate(ctx, projectId, region, certId).Execute() + readResp, err := r.client.GetCertificate(ctx, projectId, region, certId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) { @@ -334,7 +331,7 @@ func (r *certificatesResource) Delete(ctx context.Context, req resource.DeleteRe ctx = tflog.SetField(ctx, "region", region) // Delete Certificate - _, err := r.client.DefaultAPI.DeleteCertificate(ctx, projectId, region, certId).Execute() + _, err := r.client.DeleteCertificate(ctx, projectId, region, certId).Execute() if err != nil { errStr := utils.PrettyApiErr(ctx, &resp.Diagnostics, err) core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting Certificate", fmt.Sprintf("Calling API for delete: %v", errStr)) diff --git a/stackit/internal/services/albcertificates/utils/util.go b/stackit/internal/services/albcertificates/utils/util.go deleted file mode 100644 index eab23b1b3..000000000 --- a/stackit/internal/services/albcertificates/utils/util.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - certSdk "github.com/stackitcloud/stackit-sdk-go/services/certificates/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *certSdk.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.ALBCertificatesCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.ALBCertificatesCustomEndpoint)) - } - apiClient, err := certSdk.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/albcertificates/utils/util_test.go b/stackit/internal/services/albcertificates/utils/util_test.go deleted file mode 100644 index 1d2eed48a..000000000 --- a/stackit/internal/services/albcertificates/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - certSdk "github.com/stackitcloud/stackit-sdk-go/services/certificates/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://alb-cert-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *certSdk.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *certSdk.APIClient { - apiClient, err := certSdk.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - ALBCertificatesCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *certSdk.APIClient { - apiClient, err := certSdk.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/albwaf/custom_rule_group/datasource.go b/stackit/internal/services/albwaf/custom_rule_group/datasource.go index 51649be50..c1db8d58b 100644 --- a/stackit/internal/services/albwaf/custom_rule_group/datasource.go +++ b/stackit/internal/services/albwaf/custom_rule_group/datasource.go @@ -16,10 +16,8 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" albWaf "github.com/stackitcloud/stackit-sdk-go/services/albwaf/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/albwaf/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -29,7 +27,7 @@ var ( ) type customRuleGroupDataSource struct { - client *albWaf.APIClient + client albWaf.DefaultAPI providerData core.ProviderData } @@ -38,22 +36,19 @@ func NewCustomRuleGroupDataSource() datasource.DataSource { } func (r *customRuleGroupDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.AlbWafV1CLient + features.CheckBetaResourcesEnabled(ctx, &r.providerData, &resp.Diagnostics, "stackit_alb_waf_custom_rule_group", core.Resource) if resp.Diagnostics.HasError() { return } - apiClient := utils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "ALB WAF client configured") } @@ -192,7 +187,7 @@ func (r *customRuleGroupDataSource) Read(ctx context.Context, req datasource.Rea ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "name", name) - customRuleGroupResp, err := r.client.DefaultAPI.GetCustomRuleGroup(ctx, projectId, region, name).Execute() + customRuleGroupResp, err := r.client.GetCustomRuleGroup(ctx, projectId, region, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/albwaf/custom_rule_group/resource.go b/stackit/internal/services/albwaf/custom_rule_group/resource.go index 76de82db0..d1f4363f7 100644 --- a/stackit/internal/services/albwaf/custom_rule_group/resource.go +++ b/stackit/internal/services/albwaf/custom_rule_group/resource.go @@ -27,7 +27,6 @@ import ( sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/albwaf/utils" @@ -118,7 +117,7 @@ var variableType = map[string]attr.Type{ } type customRuleGroupResource struct { - client *albWaf.APIClient + client albWaf.DefaultAPI providerData core.ProviderData } @@ -128,21 +127,19 @@ func NewCustomRuleGroupResource() resource.Resource { func (r *customRuleGroupResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.AlbWafV1CLient + features.CheckBetaResourcesEnabled(ctx, &r.providerData, &resp.Diagnostics, "stackit_alb_waf_custom_rule_group", core.Resource) if resp.Diagnostics.HasError() { return } - apiClient := utils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "ALB WAF client configured") } @@ -405,7 +402,7 @@ func (r *customRuleGroupResource) Create(ctx context.Context, req resource.Creat return } - createResp, err := r.client.DefaultAPI.CreateCustomRuleGroup(ctx, projectId, region).CreateCustomRuleGroupPayload(*payload).Execute() + createResp, err := r.client.CreateCustomRuleGroup(ctx, projectId, region).CreateCustomRuleGroupPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating ALB WAF Custom Rule Group", fmt.Sprintf("Calling API: %v", err)) return @@ -459,7 +456,7 @@ func (r *customRuleGroupResource) Update(ctx context.Context, req resource.Updat return } - updateResp, err := r.client.DefaultAPI.UpdateCustomRuleGroup(ctx, projectId, region, customRuleGroupName).UpdateCustomRuleGroupPayload(*payload).Execute() + updateResp, err := r.client.UpdateCustomRuleGroup(ctx, projectId, region, customRuleGroupName).UpdateCustomRuleGroupPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating ALB WAF Custom Rule Group", fmt.Sprintf("Calling API update endpoint: %v", err)) return @@ -500,7 +497,7 @@ func (r *customRuleGroupResource) Read(ctx context.Context, req resource.ReadReq ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "name", name) - customRuleGroupResp, err := r.client.DefaultAPI.GetCustomRuleGroup(ctx, projectId, region, name).Execute() + customRuleGroupResp, err := r.client.GetCustomRuleGroup(ctx, projectId, region, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -544,7 +541,7 @@ func (r *customRuleGroupResource) Delete(ctx context.Context, req resource.Delet ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "name", name) - _, err := r.client.DefaultAPI.DeleteCustomRuleGroup(ctx, projectId, region, name).Execute() + _, err := r.client.DeleteCustomRuleGroup(ctx, projectId, region, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/albwaf/managed_rule_set/datasource.go b/stackit/internal/services/albwaf/managed_rule_set/datasource.go index 66956272b..51c91a017 100644 --- a/stackit/internal/services/albwaf/managed_rule_set/datasource.go +++ b/stackit/internal/services/albwaf/managed_rule_set/datasource.go @@ -15,10 +15,8 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" albWaf "github.com/stackitcloud/stackit-sdk-go/services/albwaf/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/albwaf/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -28,7 +26,7 @@ var ( ) type managedRuleSetDataSource struct { - client *albWaf.APIClient + client albWaf.DefaultAPI providerData core.ProviderData } @@ -37,22 +35,19 @@ func NewManagedRuleSetDataSource() datasource.DataSource { } func (d *managedRuleSetDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.providerData = providerData + d.client = clients.AlbWafV1CLient + features.CheckBetaResourcesEnabled(ctx, &d.providerData, &resp.Diagnostics, "stackit_alb_waf_managed_rule_set", core.Datasource) if resp.Diagnostics.HasError() { return } - apiClient := utils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient tflog.Info(ctx, "ALB WAF client configured") } @@ -156,7 +151,7 @@ func (d *managedRuleSetDataSource) Read(ctx context.Context, req datasource.Read ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "name", name) - managedRuleSetResp, err := d.client.DefaultAPI.GetManagedRuleSet(ctx, projectId, region, name).Execute() + managedRuleSetResp, err := d.client.GetManagedRuleSet(ctx, projectId, region, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/albwaf/managed_rule_set/resource.go b/stackit/internal/services/albwaf/managed_rule_set/resource.go index 1bd9f4ab2..ff559f54b 100644 --- a/stackit/internal/services/albwaf/managed_rule_set/resource.go +++ b/stackit/internal/services/albwaf/managed_rule_set/resource.go @@ -21,7 +21,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" albWaf "github.com/stackitcloud/stackit-sdk-go/services/albwaf/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/albwaf/utils" @@ -73,7 +72,7 @@ var ruleType = map[string]attr.Type{ } type managedRuleSetResource struct { - client *albWaf.APIClient + client albWaf.DefaultAPI providerData core.ProviderData } @@ -83,21 +82,19 @@ func NewManagedRuleSetResource() resource.Resource { func (r *managedRuleSetResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.AlbWafV1CLient + features.CheckBetaResourcesEnabled(ctx, &r.providerData, &resp.Diagnostics, "stackit_alb_waf_managed_rule_set", core.Resource) if resp.Diagnostics.HasError() { return } - apiClient := utils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "ALB WAF client configured") } @@ -292,7 +289,7 @@ func (r *managedRuleSetResource) Create(ctx context.Context, req resource.Create return } - createResp, err := r.client.DefaultAPI.CreateManagedRuleSet(ctx, projectId, region).CreateManagedRuleSetPayload(*payload).Execute() + createResp, err := r.client.CreateManagedRuleSet(ctx, projectId, region).CreateManagedRuleSetPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating ALB WAF Managed Rule Set", fmt.Sprintf("Calling API: %v", err)) return @@ -344,7 +341,7 @@ func (r *managedRuleSetResource) Read(ctx context.Context, req resource.ReadRequ ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "name", name) - managedRuleSetResp, err := r.client.DefaultAPI.GetManagedRuleSet(ctx, projectId, region, name).Execute() + managedRuleSetResp, err := r.client.GetManagedRuleSet(ctx, projectId, region, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -388,7 +385,7 @@ func (r *managedRuleSetResource) Delete(ctx context.Context, req resource.Delete ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "name", name) - _, err := r.client.DefaultAPI.DeleteManagedRuleSet(ctx, projectId, region, name).Execute() + _, err := r.client.DeleteManagedRuleSet(ctx, projectId, region, name).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting ALB WAF Managed Rule Set", fmt.Sprintf("Calling API: %v", err)) return diff --git a/stackit/internal/services/albwaf/utils/util.go b/stackit/internal/services/albwaf/utils/util.go index 04ba1e585..28678e1b3 100644 --- a/stackit/internal/services/albwaf/utils/util.go +++ b/stackit/internal/services/albwaf/utils/util.go @@ -1,36 +1,14 @@ package utils import ( - "context" "fmt" "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/stackitcloud/stackit-sdk-go/core/config" - albWaf "github.com/stackitcloud/stackit-sdk-go/services/albwaf/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *albWaf.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.AlbWafCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.AlbWafCustomEndpoint)) - } - - apiClient, err := albWaf.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} - func WarnIfNameChanges(stateName, planName types.String, resourceLabel string, diags *diag.Diagnostics) { if utils.IsUndefined(stateName) { return diff --git a/stackit/internal/services/albwaf/utils/util_test.go b/stackit/internal/services/albwaf/utils/util_test.go deleted file mode 100644 index 171ab8ebe..000000000 --- a/stackit/internal/services/albwaf/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - albWaf "github.com/stackitcloud/stackit-sdk-go/services/albwaf/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://alb-waf-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *albWaf.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *albWaf.APIClient { - apiClient, err := albWaf.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - AlbWafCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *albWaf.APIClient { - apiClient, err := albWaf.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/albwaf/waf_configuration/datasource.go b/stackit/internal/services/albwaf/waf_configuration/datasource.go index 937f9d474..895bee877 100644 --- a/stackit/internal/services/albwaf/waf_configuration/datasource.go +++ b/stackit/internal/services/albwaf/waf_configuration/datasource.go @@ -16,10 +16,8 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - albwafUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/albwaf/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -29,7 +27,7 @@ var ( ) type wafDatasource struct { - client *albWaf.APIClient + client albWaf.DefaultAPI providerData core.ProviderData } @@ -38,21 +36,19 @@ func NewWafConfigurationDatasource() datasource.DataSource { } func (d *wafDatasource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { // nolint:gocritic // function signature required by Terraform - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.providerData = providerData + d.client = clients.AlbWafV1CLient + features.CheckBetaResourcesEnabled(ctx, &d.providerData, &resp.Diagnostics, "stackit_alb_waf_configuration", core.Datasource) if resp.Diagnostics.HasError() { return } - d.client = albwafUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } tflog.Info(ctx, "ALB WAF client configured") } @@ -119,7 +115,7 @@ func (d *wafDatasource) Read(ctx context.Context, req datasource.ReadRequest, re ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "name", name) - foundWAF, err := d.client.DefaultAPI.GetWAF(ctx, projectId, region, name).Execute() + foundWAF, err := d.client.GetWAF(ctx, projectId, region, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/albwaf/waf_configuration/resource.go b/stackit/internal/services/albwaf/waf_configuration/resource.go index 481c0d18e..90b87305a 100644 --- a/stackit/internal/services/albwaf/waf_configuration/resource.go +++ b/stackit/internal/services/albwaf/waf_configuration/resource.go @@ -20,7 +20,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" albWaf "github.com/stackitcloud/stackit-sdk-go/services/albwaf/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" albwafUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/albwaf/utils" @@ -56,7 +55,7 @@ type ItemsModel struct { } type wafResource struct { - client *albWaf.APIClient + client albWaf.DefaultAPI providerData core.ProviderData } @@ -103,19 +102,19 @@ func (r *wafResource) ModifyPlan(ctx context.Context, req resource.ModifyPlanReq func (r *wafResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + + r.providerData = providerData + r.client = clients.AlbWafV1CLient + features.CheckBetaResourcesEnabled(ctx, &r.providerData, &resp.Diagnostics, "stackit_alb_waf_configuration", core.Resource) if resp.Diagnostics.HasError() { return } - apiClient := albwafUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + tflog.Info(ctx, "albwaf client configured") } @@ -229,7 +228,7 @@ func (r *wafResource) Create(ctx context.Context, req resource.CreateRequest, re core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating ALB WAF Configuration", fmt.Sprint("Creating API payload: %w", err)) return } - createResp, err := r.client.DefaultAPI.CreateWAF(ctx, projectId, region).CreateWAFPayload(*payload).Execute() + createResp, err := r.client.CreateWAF(ctx, projectId, region).CreateWAFPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating ALB WAF Configuration", fmt.Sprintf("Calling API: %v", err)) return @@ -275,7 +274,7 @@ func (r *wafResource) Delete(ctx context.Context, req resource.DeleteRequest, re ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "name", name) - _, err := r.client.DefaultAPI.DeleteWAF(ctx, projectId, region, name).Execute() + _, err := r.client.DeleteWAF(ctx, projectId, region, name).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting ALB WAF Configuration", fmt.Sprintf("Calling API: %v", err)) return @@ -306,7 +305,7 @@ func (r *wafResource) Read(ctx context.Context, req resource.ReadRequest, resp * ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "name", name) - response, err := r.client.DefaultAPI.GetWAF(ctx, projectId, region, name).Execute() + response, err := r.client.GetWAF(ctx, projectId, region, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -361,7 +360,7 @@ func (r *wafResource) Update(ctx context.Context, req resource.UpdateRequest, re core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating ALB WAF Configuration", fmt.Sprint("Creating API payload: %w", err)) return } - updateResp, err := r.client.DefaultAPI.UpdateWAF(ctx, projectId, region, name).UpdateWAFPayload(*payload).Execute() + updateResp, err := r.client.UpdateWAF(ctx, projectId, region, name).UpdateWAFPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating ALB WAF Configuration", fmt.Sprintf("Calling API: %v", err)) return diff --git a/stackit/internal/services/authorization/customrole/datasource.go b/stackit/internal/services/authorization/customrole/datasource.go index 544f9a305..9dd4c9e69 100644 --- a/stackit/internal/services/authorization/customrole/datasource.go +++ b/stackit/internal/services/authorization/customrole/datasource.go @@ -14,9 +14,7 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" authorization "github.com/stackitcloud/stackit-sdk-go/services/authorization/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - authorizationUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/authorization/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -48,23 +46,17 @@ func NewCustomRoleDataSources() []func() datasource.DataSource { // customRoleDataSource is the datasource implementation. type customRoleDataSource struct { resourceType string - client *authorization.APIClient + client authorization.DefaultAPI } // Configure sets up the API client for the authorization customrole resource. func (d *customRoleDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := authorizationUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - - if resp.Diagnostics.HasError() { - return - } - - d.client = apiClient + d.client = clients.AuthorizationV2Client tflog.Info(ctx, "authorization client configured") } @@ -132,7 +124,7 @@ func (d *customRoleDataSource) Read(ctx context.Context, req datasource.ReadRequ ctx = tflog.SetField(ctx, "resource_id", resourceId) ctx = tflog.SetField(ctx, "role_id", roleId) - roleResp, err := d.client.DefaultAPI.GetRole(ctx, d.resourceType, resourceId, roleId).Execute() + roleResp, err := d.client.GetRole(ctx, d.resourceType, resourceId, roleId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError diff --git a/stackit/internal/services/authorization/customrole/resource.go b/stackit/internal/services/authorization/customrole/resource.go index 4be32aff8..3fda503fa 100644 --- a/stackit/internal/services/authorization/customrole/resource.go +++ b/stackit/internal/services/authorization/customrole/resource.go @@ -54,7 +54,7 @@ type Model struct { // customRoleResource is the resource implementation. type customRoleResource struct { resourceType string - client *authorization.APIClient + client authorization.DefaultAPI } // NewProjectRoleAssignmentResources is a helper function generate custom role @@ -86,18 +86,12 @@ var descriptions = map[string]string{ // Configure adds the provider configured client to the resource. func (r *customRoleResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := authorizationUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - - if resp.Diagnostics.HasError() { - return - } - - r.client = apiClient + r.client = clients.AuthorizationV2Client tflog.Info(ctx, "authorization client configured") } @@ -177,7 +171,7 @@ func (r *customRoleResource) Create(ctx context.Context, req resource.CreateRequ return } - createResp, err := r.client.DefaultAPI.AddRole(ctx, r.resourceType, model.ResourceId.ValueString()).AddRolePayload(*payload).Execute() + createResp, err := r.client.AddRole(ctx, r.resourceType, model.ResourceId.ValueString()).AddRolePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating custom role", fmt.Sprintf("Calling API: %v", err)) return @@ -222,7 +216,7 @@ func (r *customRoleResource) Read(ctx context.Context, req resource.ReadRequest, return } - roleResp, err := r.client.DefaultAPI.GetRole(ctx, r.resourceType, model.ResourceId.ValueString(), roleId).Execute() + roleResp, err := r.client.GetRole(ctx, r.resourceType, model.ResourceId.ValueString(), roleId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError @@ -273,7 +267,7 @@ func (r *customRoleResource) Update(ctx context.Context, req resource.UpdateRequ } // Update existing custom role - roleResp, err := r.client.DefaultAPI.UpdateRole(ctx, r.resourceType, model.ResourceId.ValueString(), model.RoleId.ValueString()).UpdateRolePayload(*payload).Execute() + roleResp, err := r.client.UpdateRole(ctx, r.resourceType, model.ResourceId.ValueString(), model.RoleId.ValueString()).UpdateRolePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating custom role", fmt.Sprintf("Calling API: %v", err)) return @@ -311,7 +305,7 @@ func (r *customRoleResource) Delete(ctx context.Context, req resource.DeleteRequ ctx = r.annotateLogger(ctx, &model) - _, err := r.client.DefaultAPI.DeleteRole(ctx, r.resourceType, model.ResourceId.ValueString(), model.RoleId.ValueString()).Execute() + _, err := r.client.DeleteRole(ctx, r.resourceType, model.ResourceId.ValueString(), model.RoleId.ValueString()).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/authorization/roleassignments/resource.go b/stackit/internal/services/authorization/roleassignments/resource.go index bb95299ea..62999ca50 100644 --- a/stackit/internal/services/authorization/roleassignments/resource.go +++ b/stackit/internal/services/authorization/roleassignments/resource.go @@ -19,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" authorization "github.com/stackitcloud/stackit-sdk-go/services/authorization/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" authorizationUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/authorization/utils" @@ -67,7 +66,7 @@ func NewRoleAssignmentResources() []func() resource.Resource { // roleAssignmentResource is the resource implementation. type roleAssignmentResource struct { - authorizationClient *authorization.APIClient + authorizationClient authorization.DefaultAPI apiName string } @@ -78,7 +77,7 @@ func (r *roleAssignmentResource) Metadata(_ context.Context, req resource.Metada // Configure adds the provider configured client to the resource. func (r *roleAssignmentResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } @@ -88,11 +87,8 @@ func (r *roleAssignmentResource) Configure(ctx context.Context, req resource.Con return } - apiClient := authorizationUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.authorizationClient = apiClient + r.authorizationClient = clients.AuthorizationV2Client + tflog.Info(ctx, fmt.Sprintf("Resource Manager %s Role Assignment client configured", r.apiName)) } @@ -192,7 +188,7 @@ func (r *roleAssignmentResource) Create(ctx context.Context, req resource.Create unlock := authorizationUtils.LockAssignment(lockKey) defer unlock() - listMemberResp, err := r.authorizationClient.DefaultAPI.ListMembers(ctx, r.apiName, model.ResourceId.ValueString()).Subject(model.Subject.ValueString()).Execute() + listMemberResp, err := r.authorizationClient.ListMembers(ctx, r.apiName, model.ResourceId.ValueString()).Subject(model.Subject.ValueString()).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error listing current resource members", fmt.Sprintf("Calling API: %v", err)) return @@ -210,7 +206,7 @@ func (r *roleAssignmentResource) Create(ctx context.Context, req resource.Create return } - createResp, err := r.authorizationClient.DefaultAPI.AddMembers(ctx, model.ResourceId.ValueString()).AddMembersPayload(*payload).Execute() + createResp, err := r.authorizationClient.AddMembers(ctx, model.ResourceId.ValueString()).AddMembersPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, fmt.Sprintf("Error creating %s role assignment", r.apiName), fmt.Sprintf("Calling API: %v", err)) return @@ -257,7 +253,7 @@ func (r *roleAssignmentResource) Read(ctx context.Context, req resource.ReadRequ ctx = tflog.SetField(ctx, "resource_type", r.apiName) ctx = tflog.SetField(ctx, "resource_id", model.ResourceId.ValueString()) - listResp, err := r.authorizationClient.DefaultAPI.ListMembers(ctx, r.apiName, model.ResourceId.ValueString()).Subject(model.Subject.ValueString()).Execute() + listResp, err := r.authorizationClient.ListMembers(ctx, r.apiName, model.ResourceId.ValueString()).Subject(model.Subject.ValueString()).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading authorizations", fmt.Sprintf("Calling API: %v", err)) return @@ -316,7 +312,7 @@ func (r *roleAssignmentResource) Delete(ctx context.Context, req resource.Delete } // Delete existing project role assignment - _, err := r.authorizationClient.DefaultAPI.RemoveMembers(ctx, model.ResourceId.ValueString()).RemoveMembersPayload(payload).Execute() + _, err := r.authorizationClient.RemoveMembers(ctx, model.ResourceId.ValueString()).RemoveMembersPayload(payload).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/authorization/utils/util.go b/stackit/internal/services/authorization/utils/util.go index 60d1db43c..b1f618b5b 100644 --- a/stackit/internal/services/authorization/utils/util.go +++ b/stackit/internal/services/authorization/utils/util.go @@ -1,37 +1,10 @@ package utils import ( - "context" "encoding/json" - "fmt" "sync" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - authorization "github.com/stackitcloud/stackit-sdk-go/services/authorization/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) -// ConfigureClient configures an API-Client to communicate with the authorization API -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *authorization.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.AuthorizationCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.AuthorizationCustomEndpoint)) - } - apiClient, err := authorization.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} - // TypeConverter converts objects with equal JSON tags func TypeConverter[R any](data any) (*R, error) { var result R diff --git a/stackit/internal/services/authorization/utils/util_test.go b/stackit/internal/services/authorization/utils/util_test.go index 2c14a38b0..07208400f 100644 --- a/stackit/internal/services/authorization/utils/util_test.go +++ b/stackit/internal/services/authorization/utils/util_test.go @@ -1,101 +1,15 @@ package utils import ( - "context" - "os" "reflect" "sync" "testing" "time" "github.com/google/go-cmp/cmp" - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" authorization "github.com/stackitcloud/stackit-sdk-go/services/authorization/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://authorization-custom-endpoint.api.stackit.cloud" ) -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *authorization.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *authorization.APIClient { - apiClient, err := authorization.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - AuthorizationCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *authorization.APIClient { - apiClient, err := authorization.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} - func TestTypeConverter(t *testing.T) { tests := []struct { name string diff --git a/stackit/internal/services/cdn/customdomain/datasource.go b/stackit/internal/services/cdn/customdomain/datasource.go index d57fd0d19..a9cec1f91 100644 --- a/stackit/internal/services/cdn/customdomain/datasource.go +++ b/stackit/internal/services/cdn/customdomain/datasource.go @@ -6,8 +6,6 @@ import ( cdnSdk "github.com/stackitcloud/stackit-sdk-go/services/cdn/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - cdnUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/cdn/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/hashicorp/terraform-plugin-framework/attr" @@ -33,7 +31,7 @@ var certificateDataSourceTypes = map[string]attr.Type{ } type customDomainDataSource struct { - client *cdnSdk.APIClient + client cdnSdk.DefaultAPI } func NewCustomDomainDataSource() datasource.DataSource { @@ -51,7 +49,7 @@ type customDomainDataSourceModel struct { } func (d *customDomainDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } @@ -61,11 +59,8 @@ func (d *customDomainDataSource) Configure(ctx context.Context, req datasource.C return } - apiClient := cdnUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.client = clients.CdnV1Client + tflog.Info(ctx, "CDN client configured") } @@ -135,7 +130,7 @@ func (r *customDomainDataSource) Read(ctx context.Context, req datasource.ReadRe name := model.Name.ValueString() ctx = tflog.SetField(ctx, "name", name) - customDomainResp, err := r.client.DefaultAPI.GetCustomDomain(ctx, projectId, distributionId, name).Execute() + customDomainResp, err := r.client.GetCustomDomain(ctx, projectId, distributionId, name).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/cdn/customdomain/resource.go b/stackit/internal/services/cdn/customdomain/resource.go index 97863fda3..6a2d75e8c 100644 --- a/stackit/internal/services/cdn/customdomain/resource.go +++ b/stackit/internal/services/cdn/customdomain/resource.go @@ -13,9 +13,6 @@ import ( cdnSdk "github.com/stackitcloud/stackit-sdk-go/services/cdn/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - cdnUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/cdn/utils" - "github.com/google/uuid" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/resource" @@ -79,7 +76,7 @@ type CustomDomainModel struct { } type customDomainResource struct { - client *cdnSdk.APIClient + client cdnSdk.DefaultAPI } func NewCustomDomainResource() resource.Resource { @@ -92,7 +89,7 @@ type Certificate struct { } func (r *customDomainResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } @@ -102,11 +99,8 @@ func (r *customDomainResource) Configure(ctx context.Context, req resource.Confi return } - apiClient := cdnUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.CdnV1Client + tflog.Info(ctx, "CDN client configured") } @@ -207,7 +201,7 @@ func (r *customDomainResource) Create(ctx context.Context, req resource.CreateRe IntentId: new(uuid.NewString()), Certificate: certificate, } - _, err = r.client.DefaultAPI.PutCustomDomain(ctx, projectId, distributionId, name).PutCustomDomainPayload(payload).Execute() + _, err = r.client.PutCustomDomain(ctx, projectId, distributionId, name).PutCustomDomainPayload(payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating CDN custom domain", fmt.Sprintf("Calling API: %v", err)) return @@ -224,13 +218,13 @@ func (r *customDomainResource) Create(ctx context.Context, req resource.CreateRe return } - _, err = wait.CreateCDNCustomDomainWaitHandler(ctx, r.client.DefaultAPI, projectId, distributionId, name).SetTimeout(5 * time.Minute).WaitWithContext(ctx) + _, err = wait.CreateCDNCustomDomainWaitHandler(ctx, r.client, projectId, distributionId, name).SetTimeout(5 * time.Minute).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating CDN custom domain", fmt.Sprintf("Waiting for create: %v", err)) return } - respCustomDomain, err := r.client.DefaultAPI.GetCustomDomain(ctx, projectId, distributionId, name).Execute() + respCustomDomain, err := r.client.GetCustomDomain(ctx, projectId, distributionId, name).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating CDN custom domain", fmt.Sprintf("Calling API: %v", err)) return @@ -266,7 +260,7 @@ func (r *customDomainResource) Read(ctx context.Context, req resource.ReadReques name := model.Name.ValueString() ctx = tflog.SetField(ctx, "name", name) - customDomainResp, err := r.client.DefaultAPI.GetCustomDomain(ctx, projectId, distributionId, name).Execute() + customDomainResp, err := r.client.GetCustomDomain(ctx, projectId, distributionId, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError // n.b. err is caught here if of type *oapierror.GenericOpenAPIError, which the stackit SDK client returns @@ -323,7 +317,7 @@ func (r *customDomainResource) Update(ctx context.Context, req resource.UpdateRe IntentId: new(uuid.NewString()), Certificate: certificate, } - _, err = r.client.DefaultAPI.PutCustomDomain(ctx, projectId, distributionId, name).PutCustomDomainPayload(payload).Execute() + _, err = r.client.PutCustomDomain(ctx, projectId, distributionId, name).PutCustomDomainPayload(payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating CDN custom domain certificate", fmt.Sprintf("Calling API: %v", err)) return @@ -331,13 +325,13 @@ func (r *customDomainResource) Update(ctx context.Context, req resource.UpdateRe ctx = core.LogResponse(ctx) - _, err = wait.CreateCDNCustomDomainWaitHandler(ctx, r.client.DefaultAPI, projectId, distributionId, name).SetTimeout(5 * time.Minute).WaitWithContext(ctx) + _, err = wait.CreateCDNCustomDomainWaitHandler(ctx, r.client, projectId, distributionId, name).SetTimeout(5 * time.Minute).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating CDN custom domain certificate", fmt.Sprintf("Waiting for update: %v", err)) return } - respCustomDomain, err := r.client.DefaultAPI.GetCustomDomain(ctx, projectId, distributionId, name).Execute() + respCustomDomain, err := r.client.GetCustomDomain(ctx, projectId, distributionId, name).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating CDN custom domain certificate", fmt.Sprintf("Calling API to read final state: %v", err)) return @@ -372,7 +366,7 @@ func (r *customDomainResource) Delete(ctx context.Context, req resource.DeleteRe name := model.Name.ValueString() ctx = tflog.SetField(ctx, "name", name) - _, err := r.client.DefaultAPI.DeleteCustomDomain(ctx, projectId, distributionId, name).Execute() + _, err := r.client.DeleteCustomDomain(ctx, projectId, distributionId, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -385,7 +379,7 @@ func (r *customDomainResource) Delete(ctx context.Context, req resource.DeleteRe ctx = core.LogResponse(ctx) - _, err = wait.DeleteCDNCustomDomainWaitHandler(ctx, r.client.DefaultAPI, projectId, distributionId, name).WaitWithContext(ctx) + _, err = wait.DeleteCDNCustomDomainWaitHandler(ctx, r.client, projectId, distributionId, name).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Delete CDN custom domain", fmt.Sprintf("Waiting for deletion: %v", err)) return diff --git a/stackit/internal/services/cdn/distribution/datasource.go b/stackit/internal/services/cdn/distribution/datasource.go index d3d6680f0..43bee44e8 100644 --- a/stackit/internal/services/cdn/distribution/datasource.go +++ b/stackit/internal/services/cdn/distribution/datasource.go @@ -7,7 +7,6 @@ import ( cdnSdk "github.com/stackitcloud/stackit-sdk-go/services/cdn/v1api" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - cdnUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/cdn/utils" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/datasource" @@ -57,7 +56,7 @@ var dataSourceConfigTypes = map[string]attr.Type{ } type distributionDataSource struct { - client *cdnSdk.APIClient + client cdnSdk.DefaultAPI } // Ensure the implementation satisfies the expected interfaces. @@ -70,7 +69,7 @@ func NewDistributionDataSource() datasource.DataSource { } func (d *distributionDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } @@ -80,11 +79,8 @@ func (d *distributionDataSource) Configure(ctx context.Context, req datasource.C return } - apiClient := cdnUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.client = clients.CdnV1Client + tflog.Info(ctx, "Service Account client configured") } @@ -397,7 +393,7 @@ func (r *distributionDataSource) Read(ctx context.Context, req datasource.ReadRe projectId := model.ProjectId.ValueString() distributionId := model.DistributionId.ValueString() - distributionResp, err := r.client.DefaultAPI.GetDistribution(ctx, projectId, distributionId).Execute() + distributionResp, err := r.client.GetDistribution(ctx, projectId, distributionId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/cdn/distribution/resource.go b/stackit/internal/services/cdn/distribution/resource.go index fbd41ff8d..e49c862e1 100644 --- a/stackit/internal/services/cdn/distribution/resource.go +++ b/stackit/internal/services/cdn/distribution/resource.go @@ -38,7 +38,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - cdnUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/cdn/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -302,7 +301,7 @@ var domainTypes = map[string]attr.Type{ } type distributionResource struct { - client *cdnSdk.APIClient + client cdnSdk.DefaultAPI providerData core.ProviderData } @@ -311,22 +310,19 @@ func NewDistributionResource() resource.Resource { } func (r *distributionResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.CdnV1Client + features.CheckBetaResourcesEnabled(ctx, &r.providerData, &resp.Diagnostics, "stackit_cdn_distribution", "resource") if resp.Diagnostics.HasError() { return } - apiClient := cdnUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "CDN client configured") } @@ -802,7 +798,7 @@ func (r *distributionResource) Create(ctx context.Context, req resource.CreateRe return } - createResp, err := r.client.DefaultAPI.CreateDistribution(ctx, projectId).CreateDistributionPayload(*payload).Execute() + createResp, err := r.client.CreateDistribution(ctx, projectId).CreateDistributionPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating CDN distribution", fmt.Sprintf("Calling API: %v", err)) return @@ -824,7 +820,7 @@ func (r *distributionResource) Create(ctx context.Context, req resource.CreateRe return } - waitResp, err := wait.CreateDistributionPoolWaitHandler(ctx, r.client.DefaultAPI, projectId, createResp.Distribution.Id).SetTimeout(5 * time.Minute).WaitWithContext(ctx) + waitResp, err := wait.CreateDistributionPoolWaitHandler(ctx, r.client, projectId, createResp.Distribution.Id).SetTimeout(5 * time.Minute).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating CDN distribution", fmt.Sprintf("Waiting for create: %v", err)) return @@ -864,7 +860,7 @@ func (r *distributionResource) Read(ctx context.Context, req resource.ReadReques ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "distribution_id", distributionId) - cdnResp, err := r.client.DefaultAPI.GetDistribution(ctx, projectId, distributionId).Execute() + cdnResp, err := r.client.GetDistribution(ctx, projectId, distributionId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError // n.b. err is caught here if of type *oapierror.GenericOpenAPIError, which the stackit SDK client returns @@ -1088,7 +1084,7 @@ func (r *distributionResource) Update(ctx context.Context, req resource.UpdateRe configPatch.Optimizer = optimizer } - _, err := r.client.DefaultAPI.PatchDistribution(ctx, projectId, distributionId).PatchDistributionPayload(cdnSdk.PatchDistributionPayload{ + _, err := r.client.PatchDistribution(ctx, projectId, distributionId).PatchDistributionPayload(cdnSdk.PatchDistributionPayload{ Config: configPatch, IntentId: new(uuid.NewString()), }).Execute() @@ -1099,7 +1095,7 @@ func (r *distributionResource) Update(ctx context.Context, req resource.UpdateRe ctx = core.LogResponse(ctx) - waitResp, err := wait.UpdateDistributionWaitHandler(ctx, r.client.DefaultAPI, projectId, distributionId).WaitWithContext(ctx) + waitResp, err := wait.UpdateDistributionWaitHandler(ctx, r.client, projectId, distributionId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Update CDN distribution", fmt.Sprintf("Waiting for update: %v", err)) return @@ -1134,14 +1130,14 @@ func (r *distributionResource) Delete(ctx context.Context, req resource.DeleteRe ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "distribution_id", distributionId) - _, err := r.client.DefaultAPI.DeleteDistribution(ctx, projectId, distributionId).Execute() + _, err := r.client.DeleteDistribution(ctx, projectId, distributionId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Delete CDN distribution", fmt.Sprintf("Delete distribution: %v", err)) } ctx = core.LogResponse(ctx) - _, err = wait.DeleteDistributionWaitHandler(ctx, r.client.DefaultAPI, projectId, distributionId).WaitWithContext(ctx) + _, err = wait.DeleteDistributionWaitHandler(ctx, r.client, projectId, distributionId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Delete CDN distribution", fmt.Sprintf("Waiting for deletion: %v", err)) return diff --git a/stackit/internal/services/cdn/utils/util.go b/stackit/internal/services/cdn/utils/util.go deleted file mode 100644 index fc721c715..000000000 --- a/stackit/internal/services/cdn/utils/util.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - cdnSdk "github.com/stackitcloud/stackit-sdk-go/services/cdn/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *cdnSdk.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.CdnCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.CdnCustomEndpoint)) - } - apiClient, err := cdnSdk.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/cdn/utils/util_test.go b/stackit/internal/services/cdn/utils/util_test.go deleted file mode 100644 index 8ae9ffe75..000000000 --- a/stackit/internal/services/cdn/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - cdnSdk "github.com/stackitcloud/stackit-sdk-go/services/cdn/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://cdn-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *cdnSdk.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *cdnSdk.APIClient { - apiClient, err := cdnSdk.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - CdnCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *cdnSdk.APIClient { - apiClient, err := cdnSdk.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/dns/recordset/datasource.go b/stackit/internal/services/dns/recordset/datasource.go index c967bef3d..6d7e4c232 100644 --- a/stackit/internal/services/dns/recordset/datasource.go +++ b/stackit/internal/services/dns/recordset/datasource.go @@ -7,9 +7,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework-timeouts/datasource/timeouts" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - dnsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/dns/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -39,7 +36,7 @@ func NewRecordSetDataSource() datasource.DataSource { // recordSetDataSource is the data source implementation. type recordSetDataSource struct { - client *dns.APIClient + client dns.DefaultAPI } // Metadata returns the data source type name. @@ -49,16 +46,13 @@ func (d *recordSetDataSource) Metadata(_ context.Context, req datasource.Metadat // Configure adds the provider configured client to the data source. func (d *recordSetDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := dnsUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.client = clients.DnsV1Client + tflog.Info(ctx, "DNS record set client configured") } @@ -162,7 +156,7 @@ func (d *recordSetDataSource) Read(ctx context.Context, req datasource.ReadReque ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "zone_id", zoneId) ctx = tflog.SetField(ctx, "record_set_id", recordSetId) - recordSetResp, err := d.client.DefaultAPI.GetRecordSet(ctx, projectId, zoneId, recordSetId).Execute() + recordSetResp, err := d.client.GetRecordSet(ctx, projectId, zoneId, recordSetId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/dns/recordset/resource.go b/stackit/internal/services/dns/recordset/resource.go index 6e1baa3d1..047a49223 100644 --- a/stackit/internal/services/dns/recordset/resource.go +++ b/stackit/internal/services/dns/recordset/resource.go @@ -25,7 +25,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - dnsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/dns/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -65,7 +64,7 @@ func NewRecordSetResource() resource.Resource { // recordSetResource is the resource implementation. type recordSetResource struct { - client *dns.APIClient + client dns.DefaultAPI } // Metadata returns the resource type name. @@ -75,16 +74,13 @@ func (r *recordSetResource) Metadata(_ context.Context, req resource.MetadataReq // Configure adds the provider configured client to the resource. func (r *recordSetResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := dnsUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.DnsV1Client + tflog.Info(ctx, "DNS record set client configured") } @@ -211,7 +207,7 @@ func (r *recordSetResource) Create(ctx context.Context, req resource.CreateReque return } - waiterTimeout := wait.CreateRecordSetWaitHandler(ctx, r.client.DefaultAPI, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := wait.CreateRecordSetWaitHandler(ctx, r.client, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value createTimeout, diags := model.Timeouts.Create(ctx, waiterTimeout+core.DefaultTimeoutMargin) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -234,7 +230,7 @@ func (r *recordSetResource) Create(ctx context.Context, req resource.CreateReque return } // Create new recordset - recordSetResp, err := r.client.DefaultAPI.CreateRecordSet(ctx, projectId, zoneId).CreateRecordSetPayload(*payload).Execute() + recordSetResp, err := r.client.CreateRecordSet(ctx, projectId, zoneId).CreateRecordSetPayload(*payload).Execute() if err != nil || recordSetResp.Rrset.Id == "" { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating record set", fmt.Sprintf("Calling API: %v", err)) return @@ -252,7 +248,7 @@ func (r *recordSetResource) Create(ctx context.Context, req resource.CreateReque return } - waitResp, err := wait.CreateRecordSetWaitHandler(ctx, r.client.DefaultAPI, projectId, zoneId, recordSetResp.Rrset.Id).WaitWithContext(ctx) + waitResp, err := wait.CreateRecordSetWaitHandler(ctx, r.client, projectId, zoneId, recordSetResp.Rrset.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating record set", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -304,7 +300,7 @@ func (r *recordSetResource) Read(ctx context.Context, req resource.ReadRequest, ctx = tflog.SetField(ctx, "zone_id", zoneId) ctx = tflog.SetField(ctx, "record_set_id", recordSetId) - recordSetResp, err := r.client.DefaultAPI.GetRecordSet(ctx, projectId, zoneId, recordSetId).Execute() + recordSetResp, err := r.client.GetRecordSet(ctx, projectId, zoneId, recordSetId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -347,7 +343,7 @@ func (r *recordSetResource) Update(ctx context.Context, req resource.UpdateReque return } - waiterTimeout := wait.PartialUpdateRecordSetWaitHandler(ctx, r.client.DefaultAPI, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := wait.PartialUpdateRecordSetWaitHandler(ctx, r.client, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value updateTimeout, diags := model.Timeouts.Update(ctx, waiterTimeout+core.DefaultTimeoutMargin) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -372,7 +368,7 @@ func (r *recordSetResource) Update(ctx context.Context, req resource.UpdateReque return } // Update recordset - _, err = r.client.DefaultAPI.PartialUpdateRecordSet(ctx, projectId, zoneId, recordSetId).PartialUpdateRecordSetPayload(*payload).Execute() + _, err = r.client.PartialUpdateRecordSet(ctx, projectId, zoneId, recordSetId).PartialUpdateRecordSetPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating record set", err.Error()) return @@ -380,7 +376,7 @@ func (r *recordSetResource) Update(ctx context.Context, req resource.UpdateReque ctx = core.LogResponse(ctx) - waitResp, err := wait.PartialUpdateRecordSetWaitHandler(ctx, r.client.DefaultAPI, projectId, zoneId, recordSetId).WaitWithContext(ctx) + waitResp, err := wait.PartialUpdateRecordSetWaitHandler(ctx, r.client, projectId, zoneId, recordSetId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating record set", fmt.Sprintf("Instance update waiting: %v", err)) return @@ -409,7 +405,7 @@ func (r *recordSetResource) Delete(ctx context.Context, req resource.DeleteReque return } - waiterTimeout := wait.DeleteRecordSetWaitHandler(ctx, r.client.DefaultAPI, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := wait.DeleteRecordSetWaitHandler(ctx, r.client, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value deleteTimeout, diags := model.Timeouts.Delete(ctx, waiterTimeout+core.DefaultTimeoutMargin) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -428,7 +424,7 @@ func (r *recordSetResource) Delete(ctx context.Context, req resource.DeleteReque ctx = tflog.SetField(ctx, "record_set_id", recordSetId) // Delete existing record set - _, err := r.client.DefaultAPI.DeleteRecordSet(ctx, projectId, zoneId, recordSetId).Execute() + _, err := r.client.DeleteRecordSet(ctx, projectId, zoneId, recordSetId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -440,7 +436,7 @@ func (r *recordSetResource) Delete(ctx context.Context, req resource.DeleteReque ctx = core.LogResponse(ctx) - _, err = wait.DeleteRecordSetWaitHandler(ctx, r.client.DefaultAPI, projectId, zoneId, recordSetId).WaitWithContext(ctx) + _, err = wait.DeleteRecordSetWaitHandler(ctx, r.client, projectId, zoneId, recordSetId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting record set", fmt.Sprintf("Instance deletion waiting: %v", err)) return diff --git a/stackit/internal/services/dns/utils/util.go b/stackit/internal/services/dns/utils/util.go deleted file mode 100644 index 00d0383b0..000000000 --- a/stackit/internal/services/dns/utils/util.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - dns "github.com/stackitcloud/stackit-sdk-go/services/dns/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *dns.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.DnsCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.DnsCustomEndpoint)) - } - apiClient, err := dns.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/dns/utils/util_test.go b/stackit/internal/services/dns/utils/util_test.go deleted file mode 100644 index e39700abc..000000000 --- a/stackit/internal/services/dns/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - dns "github.com/stackitcloud/stackit-sdk-go/services/dns/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://dns-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *dns.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *dns.APIClient { - apiClient, err := dns.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - DnsCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *dns.APIClient { - apiClient, err := dns.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/dns/zone/datasource.go b/stackit/internal/services/dns/zone/datasource.go index 7e58a7ec7..b39854f74 100644 --- a/stackit/internal/services/dns/zone/datasource.go +++ b/stackit/internal/services/dns/zone/datasource.go @@ -10,9 +10,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/path" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - dnsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/dns/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -42,7 +39,7 @@ func NewZoneDataSource() datasource.DataSource { // zoneDataSource is the data source implementation. type zoneDataSource struct { - client *dns.APIClient + client dns.DefaultAPI } // Metadata returns the data source type name. @@ -61,16 +58,13 @@ func (d *zoneDataSource) ConfigValidators(_ context.Context) []datasource.Config } func (d *zoneDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := dnsUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.client = clients.DnsV1Client + tflog.Info(ctx, "DNS zone client configured") } @@ -219,7 +213,7 @@ func (d *zoneDataSource) Read(ctx context.Context, req datasource.ReadRequest, r var err error if zoneId != "" { - zoneResp, err = d.client.DefaultAPI.GetZone(ctx, projectId, zoneId).Execute() + zoneResp, err = d.client.GetZone(ctx, projectId, zoneId).Execute() if err != nil { utils.LogError( ctx, @@ -237,7 +231,7 @@ func (d *zoneDataSource) Read(ctx context.Context, req datasource.ReadRequest, r ctx = core.LogResponse(ctx) } else { - listZoneResp, err := d.client.DefaultAPI.ListZones(ctx, projectId). + listZoneResp, err := d.client.ListZones(ctx, projectId). DnsNameEq(dnsName). ActiveEq(true). Execute() diff --git a/stackit/internal/services/dns/zone/resource.go b/stackit/internal/services/dns/zone/resource.go index a31b660c2..a8e86c0dd 100644 --- a/stackit/internal/services/dns/zone/resource.go +++ b/stackit/internal/services/dns/zone/resource.go @@ -12,8 +12,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework-timeouts/resource/timeouts" "github.com/hashicorp/terraform-plugin-framework-validators/int32validator" - dnsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/dns/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/resource" @@ -83,7 +81,7 @@ func NewZoneResource() resource.Resource { // zoneResource is the resource implementation. type zoneResource struct { - client *dns.APIClient + client dns.DefaultAPI } // Metadata returns the resource type name. @@ -93,16 +91,13 @@ func (r *zoneResource) Metadata(_ context.Context, req resource.MetadataRequest, // Configure adds the provider configured client to the resource. func (r *zoneResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := dnsUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.DnsV1Client + tflog.Info(ctx, "DNS zone client configured") } @@ -304,7 +299,7 @@ func (r *zoneResource) Create(ctx context.Context, req resource.CreateRequest, r return } - waiterTimeout := wait.CreateZoneWaitHandler(ctx, r.client.DefaultAPI, "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := wait.CreateZoneWaitHandler(ctx, r.client, "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value createTimeout, diags := model.Timeouts.Create(ctx, waiterTimeout+core.DefaultTimeoutMargin) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -325,7 +320,7 @@ func (r *zoneResource) Create(ctx context.Context, req resource.CreateRequest, r return } // Create new zone - createResp, err := r.client.DefaultAPI.CreateZone(ctx, projectId).CreateZonePayload(*payload).Execute() + createResp, err := r.client.CreateZone(ctx, projectId).CreateZonePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating zone", fmt.Sprintf("Calling API: %v", err)) return @@ -343,7 +338,7 @@ func (r *zoneResource) Create(ctx context.Context, req resource.CreateRequest, r return } - waitResp, err := wait.CreateZoneWaitHandler(ctx, r.client.DefaultAPI, projectId, zoneId).WaitWithContext(ctx) + waitResp, err := wait.CreateZoneWaitHandler(ctx, r.client, projectId, zoneId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating zone", fmt.Sprintf("Zone creation waiting: %v", err)) return @@ -392,7 +387,7 @@ func (r *zoneResource) Read(ctx context.Context, req resource.ReadRequest, resp ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "zone_id", zoneId) - zoneResp, err := r.client.DefaultAPI.GetZone(ctx, projectId, zoneId).Execute() + zoneResp, err := r.client.GetZone(ctx, projectId, zoneId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -435,7 +430,7 @@ func (r *zoneResource) Update(ctx context.Context, req resource.UpdateRequest, r return } - waiterTimeout := wait.PartialUpdateZoneWaitHandler(ctx, r.client.DefaultAPI, "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := wait.PartialUpdateZoneWaitHandler(ctx, r.client, "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value updateTimeout, diags := model.Timeouts.Update(ctx, waiterTimeout+core.DefaultTimeoutMargin) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -458,7 +453,7 @@ func (r *zoneResource) Update(ctx context.Context, req resource.UpdateRequest, r return } // Update existing zone - _, err = r.client.DefaultAPI.PartialUpdateZone(ctx, projectId, zoneId).PartialUpdateZonePayload(*payload).Execute() + _, err = r.client.PartialUpdateZone(ctx, projectId, zoneId).PartialUpdateZonePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating zone", fmt.Sprintf("Calling API: %v", err)) return @@ -466,7 +461,7 @@ func (r *zoneResource) Update(ctx context.Context, req resource.UpdateRequest, r ctx = core.LogResponse(ctx) - waitResp, err := wait.PartialUpdateZoneWaitHandler(ctx, r.client.DefaultAPI, projectId, zoneId).WaitWithContext(ctx) + waitResp, err := wait.PartialUpdateZoneWaitHandler(ctx, r.client, projectId, zoneId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating zone", fmt.Sprintf("Zone update waiting: %v", err)) return @@ -495,7 +490,7 @@ func (r *zoneResource) Delete(ctx context.Context, req resource.DeleteRequest, r return } - waiterTimeout := wait.DeleteZoneWaitHandler(ctx, r.client.DefaultAPI, "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := wait.DeleteZoneWaitHandler(ctx, r.client, "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value deleteTimeout, diags := model.Timeouts.Delete(ctx, waiterTimeout+core.DefaultTimeoutMargin) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -512,7 +507,7 @@ func (r *zoneResource) Delete(ctx context.Context, req resource.DeleteRequest, r ctx = tflog.SetField(ctx, "zone_id", zoneId) // Delete existing zone - _, err := r.client.DefaultAPI.DeleteZone(ctx, projectId, zoneId).Execute() + _, err := r.client.DeleteZone(ctx, projectId, zoneId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -525,7 +520,7 @@ func (r *zoneResource) Delete(ctx context.Context, req resource.DeleteRequest, r ctx = core.LogResponse(ctx) - _, err = wait.DeleteZoneWaitHandler(ctx, r.client.DefaultAPI, projectId, zoneId).WaitWithContext(ctx) + _, err = wait.DeleteZoneWaitHandler(ctx, r.client, projectId, zoneId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting zone", fmt.Sprintf("Zone deletion waiting: %v", err)) return diff --git a/stackit/internal/services/dremio/instance/datasource.go b/stackit/internal/services/dremio/instance/datasource.go index a77ca3e33..0c5b49b8f 100644 --- a/stackit/internal/services/dremio/instance/datasource.go +++ b/stackit/internal/services/dremio/instance/datasource.go @@ -10,14 +10,11 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" dremioSdk "github.com/stackitcloud/stackit-sdk-go/services/dremio/v1betaapi" - - dremioUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/dremio/utils" ) var ( @@ -64,7 +61,7 @@ type OAuthDatasourceModel struct { } type instanceDataSource struct { - client *dremioSdk.APIClient + client dremioSdk.DefaultAPI providerData core.ProviderData } @@ -81,7 +78,7 @@ func (d *instanceDataSource) Metadata(_ context.Context, req datasource.Metadata // provider-defined DataSource type. It is separately executed for each // ReadDataSource RPC. func (d *instanceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } @@ -91,11 +88,8 @@ func (d *instanceDataSource) Configure(ctx context.Context, req datasource.Confi return } - apiClient := dremioUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.client = clients.DremioV1BetaClient + tflog.Info(ctx, "Dremio instance client configured for data source") } @@ -326,7 +320,7 @@ func (d *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceId) - instanceResp, err := d.client.DefaultAPI.GetDremioInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := d.client.GetDremioInstance(ctx, projectId, region, instanceId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/dremio/instance/resource.go b/stackit/internal/services/dremio/instance/resource.go index 425b1d435..fed50bd50 100644 --- a/stackit/internal/services/dremio/instance/resource.go +++ b/stackit/internal/services/dremio/instance/resource.go @@ -20,7 +20,6 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" @@ -28,8 +27,6 @@ import ( dremioSdk "github.com/stackitcloud/stackit-sdk-go/services/dremio/v1betaapi" dremioWaiter "github.com/stackitcloud/stackit-sdk-go/services/dremio/v1betaapi/wait" - - dremioUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/dremio/utils" ) var ( @@ -158,7 +155,7 @@ func NewInstanceResource() resource.Resource { } type instanceResource struct { - client *dremioSdk.APIClient + client dremioSdk.DefaultAPI providerData core.ProviderData } @@ -195,7 +192,7 @@ func (r *instanceResource) ModifyPlan(ctx context.Context, req resource.ModifyPl } func (r *instanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } @@ -205,11 +202,8 @@ func (r *instanceResource) Configure(ctx context.Context, req resource.Configure return } - apiClient := dremioUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.DremioV1BetaClient + tflog.Info(ctx, "Dremio instance client configured") } @@ -396,7 +390,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } - waiterTimeout := dremioWaiter.CreateDremioWaitHandler(ctx, r.client.DefaultAPI, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := dremioWaiter.CreateDremioWaitHandler(ctx, r.client, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value createTimeout, diags := model.Timeouts.Create(ctx, waiterTimeout+core.DefaultTimeoutMargin) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -420,7 +414,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques } // Create new Dremio instance - instanceResp, err := r.client.DefaultAPI.CreateDremioInstance(ctx, projectId, region).CreateDremioInstancePayload(*payload).Execute() + instanceResp, err := r.client.CreateDremioInstance(ctx, projectId, region).CreateDremioInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -441,7 +435,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } - _, err = dremioWaiter.CreateDremioWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceResp.Id).WaitWithContext(ctx) + _, err = dremioWaiter.CreateDremioWaitHandler(ctx, r.client, projectId, region, instanceResp.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating Dremio instance", fmt.Sprintf("Dremio instance creation waiting: %v", err)) return @@ -488,7 +482,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceId) - instanceResp, err := r.client.DefaultAPI.GetDremioInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetDremioInstance(ctx, projectId, region, instanceId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -521,7 +515,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques return } - waiterTimeout := dremioWaiter.UpdateDremioWaitHandler(ctx, r.client.DefaultAPI, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := dremioWaiter.UpdateDremioWaitHandler(ctx, r.client, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value updateTimeout, diags := model.Timeouts.Update(ctx, waiterTimeout+core.DefaultTimeoutMargin) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -544,7 +538,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques } instanceId := state.InstanceId.ValueString() - instanceResp, err := r.client.DefaultAPI.UpdateDremioInstance(ctx, projectId, region, instanceId).UpdateDremioInstancePayload(*payload).Execute() + instanceResp, err := r.client.UpdateDremioInstance(ctx, projectId, region, instanceId).UpdateDremioInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -565,7 +559,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques return } - _, err = dremioWaiter.UpdateDremioWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceResp.Id).WaitWithContext(ctx) + _, err = dremioWaiter.UpdateDremioWaitHandler(ctx, r.client, projectId, region, instanceResp.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating Dremio instance", fmt.Sprintf("Dremio instance updating waiting: %v", err)) return @@ -592,7 +586,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques return } - waiterTimeout := dremioWaiter.DeleteDremioWaitHandler(ctx, r.client.DefaultAPI, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := dremioWaiter.DeleteDremioWaitHandler(ctx, r.client, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value deleteTimeout, diags := model.Timeouts.Delete(ctx, waiterTimeout+core.DefaultTimeoutMargin) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -610,7 +604,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceId) - err := r.client.DefaultAPI.DeleteDremioInstance(ctx, projectId, region, instanceId).Execute() + err := r.client.DeleteDremioInstance(ctx, projectId, region, instanceId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -621,7 +615,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = core.LogResponse(ctx) - _, err = dremioWaiter.DeleteDremioWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + _, err = dremioWaiter.DeleteDremioWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting Dremio instance", fmt.Sprintf("Dremio instance deletion waiting: %v", err)) return diff --git a/stackit/internal/services/dremio/user/datasource.go b/stackit/internal/services/dremio/user/datasource.go index 7595e5358..02ed3eac1 100644 --- a/stackit/internal/services/dremio/user/datasource.go +++ b/stackit/internal/services/dremio/user/datasource.go @@ -9,14 +9,11 @@ import ( "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" dremioSdk "github.com/stackitcloud/stackit-sdk-go/services/dremio/v1betaapi" - - dremioUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/dremio/utils" ) var ( @@ -29,7 +26,7 @@ type UserDataSourceModel struct { } type userDataSource struct { - client *dremioSdk.APIClient + client dremioSdk.DefaultAPI providerData core.ProviderData } @@ -46,7 +43,7 @@ func (d *userDataSource) Metadata(_ context.Context, req datasource.MetadataRequ // provider-defined DataSource type. It is separately executed for each // ReadDataSource RPC. func (d *userDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } @@ -56,11 +53,8 @@ func (d *userDataSource) Configure(ctx context.Context, req datasource.Configure return } - apiClient := dremioUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.client = clients.DremioV1BetaClient + tflog.Info(ctx, "Dremio user client configured for data source") } @@ -135,7 +129,7 @@ func (d *userDataSource) Read(ctx context.Context, req datasource.ReadRequest, r ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "user_id", userId) - userResp, err := d.client.DefaultAPI.GetDremioUser(ctx, projectId, region, instanceId, userId).Execute() + userResp, err := d.client.GetDremioUser(ctx, projectId, region, instanceId, userId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/dremio/user/resource.go b/stackit/internal/services/dremio/user/resource.go index 8cd0bca0b..31f7e877c 100644 --- a/stackit/internal/services/dremio/user/resource.go +++ b/stackit/internal/services/dremio/user/resource.go @@ -17,7 +17,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" @@ -26,8 +25,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" dremioSdk "github.com/stackitcloud/stackit-sdk-go/services/dremio/v1betaapi" - dremioUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/dremio/utils" - dremioWaiter "github.com/stackitcloud/stackit-sdk-go/services/dremio/v1betaapi/wait" ) @@ -81,7 +78,7 @@ var descriptions = map[string]string{ } type userResource struct { - client *dremioSdk.APIClient + client dremioSdk.DefaultAPI providerData core.ProviderData } @@ -122,7 +119,7 @@ func (r *userResource) ModifyPlan(ctx context.Context, req resource.ModifyPlanRe } func (r *userResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } @@ -132,11 +129,8 @@ func (r *userResource) Configure(ctx context.Context, req resource.ConfigureRequ return } - apiClient := dremioUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.DremioV1BetaClient + tflog.Info(ctx, "Dremio user client configured") } @@ -243,7 +237,7 @@ func (r *userResource) Create(ctx context.Context, req resource.CreateRequest, r return } - waiterTimeout := dremioWaiter.CreateDremioUserWaitHandler(ctx, r.client.DefaultAPI, "", "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := dremioWaiter.CreateDremioUserWaitHandler(ctx, r.client, "", "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value createTimeout, diags := model.Timeouts.Create(ctx, waiterTimeout+core.DefaultTimeoutMargin) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -269,7 +263,7 @@ func (r *userResource) Create(ctx context.Context, req resource.CreateRequest, r } // Create new Dremio user - userResp, err := r.client.DefaultAPI.CreateDremioUser(ctx, projectId, region, instanceId).CreateDremioUserPayload(*payload).Execute() + userResp, err := r.client.CreateDremioUser(ctx, projectId, region, instanceId).CreateDremioUserPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating user", fmt.Sprintf("Calling API: %v", err)) return @@ -290,7 +284,7 @@ func (r *userResource) Create(ctx context.Context, req resource.CreateRequest, r return } - _, err = dremioWaiter.CreateDremioUserWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, userResp.Id).WaitWithContext(ctx) + _, err = dremioWaiter.CreateDremioUserWaitHandler(ctx, r.client, projectId, region, instanceId, userResp.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating Dremio user", fmt.Sprintf("Dremio user creation waiting: %v", err)) return @@ -339,7 +333,7 @@ func (r *userResource) Read(ctx context.Context, req resource.ReadRequest, resp ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "user_id", userId) - userResp, err := r.client.DefaultAPI.GetDremioUser(ctx, projectId, region, instanceId, userId).Execute() + userResp, err := r.client.GetDremioUser(ctx, projectId, region, instanceId, userId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -376,7 +370,7 @@ func (r *userResource) Delete(ctx context.Context, req resource.DeleteRequest, r return } - waiterTimeout := dremioWaiter.DeleteDremioUserWaitHandler(ctx, r.client.DefaultAPI, "", "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := dremioWaiter.DeleteDremioUserWaitHandler(ctx, r.client, "", "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value deleteTimeout, diags := model.Timeouts.Delete(ctx, waiterTimeout+core.DefaultTimeoutMargin) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -396,7 +390,7 @@ func (r *userResource) Delete(ctx context.Context, req resource.DeleteRequest, r ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "user_id", userId) - err := r.client.DefaultAPI.DeleteDremioUser(ctx, projectId, region, instanceId, userId).Execute() + err := r.client.DeleteDremioUser(ctx, projectId, region, instanceId, userId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -407,7 +401,7 @@ func (r *userResource) Delete(ctx context.Context, req resource.DeleteRequest, r ctx = core.LogResponse(ctx) - _, err = dremioWaiter.DeleteDremioUserWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, userId).WaitWithContext(ctx) + _, err = dremioWaiter.DeleteDremioUserWaitHandler(ctx, r.client, projectId, region, instanceId, userId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting Dremio user", fmt.Sprintf("Dremio user deletion waiting: %v", err)) return diff --git a/stackit/internal/services/dremio/utils/util.go b/stackit/internal/services/dremio/utils/util.go deleted file mode 100644 index b55b39f08..000000000 --- a/stackit/internal/services/dremio/utils/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - dremio "github.com/stackitcloud/stackit-sdk-go/services/dremio/v1betaapi" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *dremio.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - config.WithRegion(providerData.DefaultRegion), - } - if providerData.DremioCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.DremioCustomEndpoint)) - } - apiClient, err := dremio.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/edgecloud/instance/resource.go b/stackit/internal/services/edgecloud/instance/resource.go index eda8ba19c..c9a248978 100644 --- a/stackit/internal/services/edgecloud/instance/resource.go +++ b/stackit/internal/services/edgecloud/instance/resource.go @@ -23,11 +23,9 @@ import ( serviceenablement "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement/v2api" enablementWait "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement/v2api/wait" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" edgeutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/edgecloud/utils" - serviceenablementUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serviceenablement/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -61,8 +59,8 @@ func NewInstanceResource() resource.Resource { // instanceResource implements the resource interface for Edge Cloud instances. type instanceResource struct { - client *edge.APIClient - enablementClient *serviceenablement.APIClient + client edge.DefaultAPI + enablementClient serviceenablement.DefaultAPI providerData core.ProviderData } @@ -110,25 +108,20 @@ var descriptions = map[string]string{ // Configure sets up the API client for the Edge Cloud instance resource. func (i *instanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - i.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + + i.providerData = providerData + i.client = clients.EdgeV1Client + i.enablementClient = clients.ServiceEnablementV2Client + features.CheckBetaResourcesEnabled(ctx, &i.providerData, &resp.Diagnostics, "stackit_edgecloud_instance", "resource") if resp.Diagnostics.HasError() { return } - apiClient := edgeutils.ConfigureClient(ctx, &i.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - serviceEnablementClient := serviceenablementUtils.ConfigureClient(ctx, &i.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - i.client = apiClient - i.enablementClient = serviceEnablementClient + tflog.Info(ctx, "edge client configured") } @@ -251,13 +244,13 @@ func (i *instanceResource) Create(ctx context.Context, req resource.CreateReques ctx = tflog.SetField(ctx, "region", region) // If the service edge-cloud is not enabled, enable it - err := i.enablementClient.DefaultAPI.EnableServiceRegional(ctx, region, projectId, utils.EdgecloudServiceId).Execute() + err := i.enablementClient.EnableServiceRegional(ctx, region, projectId, utils.EdgecloudServiceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API to enable edge-cloud: %v", err)) return } - _, err = enablementWait.EnableServiceWaitHandler(ctx, i.enablementClient.DefaultAPI, region, projectId, utils.EdgecloudServiceId).WaitWithContext(ctx) + _, err = enablementWait.EnableServiceWaitHandler(ctx, i.enablementClient, region, projectId, utils.EdgecloudServiceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Wait for edge-cloud enablement: %v", err)) return @@ -265,7 +258,7 @@ func (i *instanceResource) Create(ctx context.Context, req resource.CreateReques tflog.Info(ctx, "Creating new Edge Cloud instance") payload := toCreatePayload(&model) - createResp, err := i.client.DefaultAPI.CreateInstance(ctx, projectId, region).CreateInstancePayload(payload).Execute() + createResp, err := i.client.CreateInstance(ctx, projectId, region).CreateInstancePayload(payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -288,7 +281,7 @@ func (i *instanceResource) Create(ctx context.Context, req resource.CreateReques return } - waitResp, err := edgewait.CreateOrUpdateInstanceWaitHandler(ctx, i.client.DefaultAPI, projectId, region, createResp.Id).WaitWithContext(ctx) + waitResp, err := edgewait.CreateOrUpdateInstanceWaitHandler(ctx, i.client, projectId, region, createResp.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Instance waiting: %v", err)) return @@ -330,7 +323,7 @@ func (i *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "region", region) - edgeCloudInstanceResp, err := i.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + edgeCloudInstanceResp, err := i.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) @@ -373,7 +366,7 @@ func (i *instanceResource) Update(ctx context.Context, req resource.UpdateReques tflog.Info(ctx, "Updating Edge Cloud instance", map[string]any{"instance_id": instanceId}) payload := toUpdatePayload(&model) - err := i.client.DefaultAPI.UpdateInstance(ctx, projectId, region, instanceId).UpdateInstancePayload(payload).Execute() + err := i.client.UpdateInstance(ctx, projectId, region, instanceId).UpdateInstancePayload(payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -381,7 +374,7 @@ func (i *instanceResource) Update(ctx context.Context, req resource.UpdateReques ctx = core.LogResponse(ctx) - waitResp, err := edgewait.CreateOrUpdateInstanceWaitHandler(ctx, i.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + waitResp, err := edgewait.CreateOrUpdateInstanceWaitHandler(ctx, i.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Instance waiting: %v", err)) return @@ -415,7 +408,7 @@ func (i *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "region", region) - err := i.client.DefaultAPI.DeleteInstance(ctx, projectId, region, instanceId).Execute() + err := i.client.DeleteInstance(ctx, projectId, region, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -427,7 +420,7 @@ func (i *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = core.LogResponse(ctx) - _, err = edgewait.DeleteInstanceWaitHandler(ctx, i.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + _, err = edgewait.DeleteInstanceWaitHandler(ctx, i.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting instance", fmt.Sprintf("Instance deletion waiting: %v", err)) return diff --git a/stackit/internal/services/edgecloud/instances/datasource.go b/stackit/internal/services/edgecloud/instances/datasource.go index 28596add5..e78deb260 100644 --- a/stackit/internal/services/edgecloud/instances/datasource.go +++ b/stackit/internal/services/edgecloud/instances/datasource.go @@ -14,10 +14,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" edge "github.com/stackitcloud/stackit-sdk-go/services/edge/v1beta1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - edgeutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/edgecloud/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -54,28 +52,25 @@ func NewInstancesDataSource() datasource.DataSource { // instancesDataSource is the data source implementation. type instancesDataSource struct { - client *edge.APIClient + client edge.DefaultAPI providerData core.ProviderData } // Configure sets up the API client for the Edge Cloud instance data source. func (d *instancesDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.providerData = providerData + d.client = clients.EdgeV1Client + features.CheckBetaResourcesEnabled(ctx, &d.providerData, &resp.Diagnostics, "stackit_edgecloud_instances", "datasource") if resp.Diagnostics.HasError() { return } - apiClient := edgeutils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient tflog.Info(ctx, "edge cloud client configured") } @@ -167,7 +162,7 @@ func (d *instancesDataSource) Read(ctx context.Context, req datasource.ReadReque ctx = tflog.SetField(ctx, "region", region) // Fetch all instances for the project and region - instancesResp, err := d.client.DefaultAPI.ListInstances(ctx, projectId, region).Execute() + instancesResp, err := d.client.ListInstances(ctx, projectId, region).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/edgecloud/kubeconfig/resource.go b/stackit/internal/services/edgecloud/kubeconfig/resource.go index 816d2a1a8..7f89afa45 100644 --- a/stackit/internal/services/edgecloud/kubeconfig/resource.go +++ b/stackit/internal/services/edgecloud/kubeconfig/resource.go @@ -19,7 +19,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -77,7 +76,7 @@ func NewKubeconfigResource() resource.Resource { // kubeconfigResource is the resource implementation. type kubeconfigResource struct { - client *edgeCloud.APIClient + client edgeCloud.DefaultAPI providerData core.ProviderData } @@ -88,21 +87,19 @@ func (r *kubeconfigResource) Metadata(_ context.Context, req resource.MetadataRe // Configure adds the provider configured client to the resource. func (r *kubeconfigResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + + r.providerData = providerData + r.client = clients.EdgeV1Client + features.CheckBetaResourcesEnabled(ctx, &r.providerData, &resp.Diagnostics, "stackit_edgecloud_kubeconfig", "resource") if resp.Diagnostics.HasError() { return } - apiClient := edgeCloudUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "Edge Cloud kubeconfig client configured") } @@ -310,7 +307,7 @@ func (r *kubeconfigResource) Create(ctx context.Context, req resource.CreateRequ if !model.InstanceId.IsNull() { instanceId := model.InstanceId.ValueString() ctx = tflog.SetField(ctx, "instance_id", model.InstanceId) - kubeconfigResp, err = edgeCloudWait.KubeconfigWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, &expirationSeconds).WaitWithContext(ctx) //nolint:tfwriteid // see above + kubeconfigResp, err = edgeCloudWait.KubeconfigWaitHandler(ctx, r.client, projectId, region, instanceId, &expirationSeconds).WaitWithContext(ctx) //nolint:tfwriteid // see above if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating kubeconfig", fmt.Sprintf("Kubeconfig creation waiting: %v", err)) return @@ -319,7 +316,7 @@ func (r *kubeconfigResource) Create(ctx context.Context, req resource.CreateRequ } else if !model.InstanceName.IsNull() { instanceName := model.InstanceName.ValueString() ctx = tflog.SetField(ctx, "instance_name", model.InstanceName) - kubeconfigResp, err = edgeCloudWait.KubeconfigByInstanceNameWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceName, &expirationSeconds).WaitWithContext(ctx) //nolint:tfwriteid // see above + kubeconfigResp, err = edgeCloudWait.KubeconfigByInstanceNameWaitHandler(ctx, r.client, projectId, region, instanceName, &expirationSeconds).WaitWithContext(ctx) //nolint:tfwriteid // see above if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating kubeconfig", fmt.Sprintf("Kubeconfig creation waiting: %v", err)) return diff --git a/stackit/internal/services/edgecloud/plans/datasource.go b/stackit/internal/services/edgecloud/plans/datasource.go index 7d90e8b42..660dc4e1e 100644 --- a/stackit/internal/services/edgecloud/plans/datasource.go +++ b/stackit/internal/services/edgecloud/plans/datasource.go @@ -13,10 +13,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" edge "github.com/stackitcloud/stackit-sdk-go/services/edge/v1beta1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - edgeutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/edgecloud/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -49,25 +47,23 @@ func NewPlansDataSource() datasource.DataSource { // plansDataSource is the datasource implementation. type plansDataSource struct { - client *edge.APIClient + client edge.DefaultAPI } // Configure sets up the API client for the Edge Cloud plans data source. func (d *plansDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.client = clients.EdgeV1Client + features.CheckBetaResourcesEnabled(ctx, &providerData, &resp.Diagnostics, "stackit_edgecloud_plans", "datasource") if resp.Diagnostics.HasError() { return } - d.client = edgeutils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } tflog.Info(ctx, "edge cloud client configured") } @@ -141,7 +137,7 @@ func (d *plansDataSource) Read(ctx context.Context, req datasource.ReadRequest, ctx = tflog.SetField(ctx, "project_id", projectId) // Fetch all Plans for the project - plansResp, err := d.client.DefaultAPI.ListPlansProject(ctx, projectId).Execute() + plansResp, err := d.client.ListPlansProject(ctx, projectId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/edgecloud/token/resource.go b/stackit/internal/services/edgecloud/token/resource.go index a8ec23550..a012339aa 100644 --- a/stackit/internal/services/edgecloud/token/resource.go +++ b/stackit/internal/services/edgecloud/token/resource.go @@ -18,7 +18,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -75,7 +74,7 @@ func NewTokenResource() resource.Resource { // tokenResource is the resource implementation. type tokenResource struct { - client *edgeCloud.APIClient + client edgeCloud.DefaultAPI providerData core.ProviderData } @@ -86,21 +85,19 @@ func (r *tokenResource) Metadata(_ context.Context, req resource.MetadataRequest // Configure adds the provider configured client to the resource. func (r *tokenResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + + r.providerData = providerData + r.client = clients.EdgeV1Client + features.CheckBetaResourcesEnabled(ctx, &r.providerData, &resp.Diagnostics, "stackit_edgecloud_token", "resource") if resp.Diagnostics.HasError() { return } - apiClient := edgeCloudUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "Edge Cloud token client configured") } @@ -308,7 +305,7 @@ func (r *tokenResource) Create(ctx context.Context, req resource.CreateRequest, if !model.InstanceId.IsNull() { instanceId := model.InstanceId.ValueString() ctx = tflog.SetField(ctx, "instance_id", model.InstanceId) - tokenResp, err = edgeCloudWait.TokenWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, &expirationSeconds).WaitWithContext(ctx) //nolint:tfwriteid // see above + tokenResp, err = edgeCloudWait.TokenWaitHandler(ctx, r.client, projectId, region, instanceId, &expirationSeconds).WaitWithContext(ctx) //nolint:tfwriteid // see above if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating token", fmt.Sprintf("token waiting: %v", err)) return @@ -317,7 +314,7 @@ func (r *tokenResource) Create(ctx context.Context, req resource.CreateRequest, } else if !model.InstanceName.IsNull() { instanceName := model.InstanceName.ValueString() ctx = tflog.SetField(ctx, "instance_name", model.InstanceName) - tokenResp, err = edgeCloudWait.TokenByInstanceNameWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceName, &expirationSeconds).WaitWithContext(ctx) //nolint:tfwriteid // see above + tokenResp, err = edgeCloudWait.TokenByInstanceNameWaitHandler(ctx, r.client, projectId, region, instanceName, &expirationSeconds).WaitWithContext(ctx) //nolint:tfwriteid // see above if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating token", fmt.Sprintf("token waiting: %v", err)) return diff --git a/stackit/internal/services/edgecloud/utils/util.go b/stackit/internal/services/edgecloud/utils/util.go index a1f83fc2c..570a03bc9 100644 --- a/stackit/internal/services/edgecloud/utils/util.go +++ b/stackit/internal/services/edgecloud/utils/util.go @@ -1,17 +1,10 @@ package utils import ( - "context" "fmt" "time" - "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/stackitcloud/stackit-sdk-go/core/config" - edge "github.com/stackitcloud/stackit-sdk-go/services/edge/v1beta1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) const ( @@ -22,23 +15,6 @@ const ( TokenMaxDuration = 15552000 ) -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *edge.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.EdgeCloudCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.EdgeCloudCustomEndpoint)) - } - apiClient, err := edge.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} - func CheckExpiration(expiresAt types.String, recreateBefore types.Int64, currentTime time.Time) (bool, error) { if expiresAt.IsNull() { return true, nil diff --git a/stackit/internal/services/edgecloud/utils/util_test.go b/stackit/internal/services/edgecloud/utils/util_test.go index e974ca689..151cd8008 100644 --- a/stackit/internal/services/edgecloud/utils/util_test.go +++ b/stackit/internal/services/edgecloud/utils/util_test.go @@ -1,99 +1,12 @@ package utils import ( - "context" - "os" "testing" "time" - "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/types" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - edge "github.com/stackitcloud/stackit-sdk-go/services/edge/v1beta1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://edge-custom-endpoint.api.stackit.cloud" ) -func TestConfigureClient(t *testing.T) { - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *edge.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *edge.APIClient { - apiClient, err := edge.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - EdgeCloudCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *edge.APIClient { - apiClient, err := edge.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - // Verify that a client was successfully created - if actual == nil && !tt.wantErr { - t.Errorf("ConfigureClient() returned nil client, expected non-nil") - } - }) - } -} - func TestCheckExpiration(t *testing.T) { // Reference time for testing now := time.Date(2025, 10, 26, 12, 0, 0, 0, time.UTC) diff --git a/stackit/internal/services/git/instance/datasource.go b/stackit/internal/services/git/instance/datasource.go index b45fdcf27..6ca3fd1c0 100644 --- a/stackit/internal/services/git/instance/datasource.go +++ b/stackit/internal/services/git/instance/datasource.go @@ -6,9 +6,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - gitUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/git/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -34,12 +31,12 @@ func NewGitDataSource() datasource.DataSource { // gitDataSource is the datasource implementation. type gitDataSource struct { - client *git.APIClient + client git.DefaultAPI } // Configure sets up the API client for the git instance resource. func (g *gitDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } @@ -49,11 +46,8 @@ func (g *gitDataSource) Configure(ctx context.Context, req datasource.ConfigureR return } - apiClient := gitUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - g.client = apiClient + g.client = clients.GitV1BetaClient + tflog.Info(ctx, "git client configured") } @@ -140,7 +134,7 @@ func (g *gitDataSource) Read(ctx context.Context, req datasource.ReadRequest, re instanceId := model.InstanceId.ValueString() // Read the current git instance via id - gitInstanceResp, err := g.client.DefaultAPI.GetInstance(ctx, projectId, instanceId).Execute() + gitInstanceResp, err := g.client.GetInstance(ctx, projectId, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) diff --git a/stackit/internal/services/git/instance/resource.go b/stackit/internal/services/git/instance/resource.go index ba71a8ba8..796928828 100644 --- a/stackit/internal/services/git/instance/resource.go +++ b/stackit/internal/services/git/instance/resource.go @@ -24,7 +24,7 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - gitUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/git/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -58,7 +58,7 @@ func NewGitResource() resource.Resource { // gitResource implements the resource interface for git instances. type gitResource struct { - client *git.APIClient + client git.DefaultAPI } // descriptions for the attributes in the Schema @@ -78,7 +78,7 @@ var descriptions = map[string]string{ // Configure sets up the API client for the git instance resource. func (g *gitResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } @@ -88,11 +88,8 @@ func (g *gitResource) Configure(ctx context.Context, req resource.ConfigureReque return } - apiClient := gitUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - g.client = apiClient + g.client = clients.GitV1BetaClient + tflog.Info(ctx, "git client configured") } @@ -210,7 +207,7 @@ func (g *gitResource) Create(ctx context.Context, req resource.CreateRequest, re } // Create the new git instance via the API client. - gitInstanceResp, err := g.client.DefaultAPI.CreateInstance(ctx, projectId). + gitInstanceResp, err := g.client.CreateInstance(ctx, projectId). CreateInstancePayload(payload). Execute() if err != nil { @@ -230,7 +227,7 @@ func (g *gitResource) Create(ctx context.Context, req resource.CreateRequest, re return } - _, err = wait.CreateGitInstanceWaitHandler(ctx, g.client.DefaultAPI, projectId, gitInstanceId).WaitWithContext(ctx) + _, err = wait.CreateGitInstanceWaitHandler(ctx, g.client, projectId, gitInstanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating git instance", fmt.Sprintf("Git instance creation waiting: %v", err)) return @@ -273,7 +270,7 @@ func (g *gitResource) Read(ctx context.Context, req resource.ReadRequest, resp * } // Read the current git instance via id - gitInstanceResp, err := g.client.DefaultAPI.GetInstance(ctx, projectId, instanceId).Execute() + gitInstanceResp, err := g.client.GetInstance(ctx, projectId, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) @@ -328,7 +325,7 @@ func (g *gitResource) Delete(ctx context.Context, req resource.DeleteRequest, re ctx = tflog.SetField(ctx, "instance_id", instanceId) // Call API to delete the existing git instance. - err := g.client.DefaultAPI.DeleteInstance(ctx, projectId, instanceId).Execute() + err := g.client.DeleteInstance(ctx, projectId, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -340,7 +337,7 @@ func (g *gitResource) Delete(ctx context.Context, req resource.DeleteRequest, re ctx = core.LogResponse(ctx) - _, err = wait.DeleteGitInstanceWaitHandler(ctx, g.client.DefaultAPI, projectId, instanceId).WaitWithContext(ctx) + _, err = wait.DeleteGitInstanceWaitHandler(ctx, g.client, projectId, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error waiting for instance deletion", fmt.Sprintf("Instance deletion waiting: %v", err)) return diff --git a/stackit/internal/services/git/utils/util.go b/stackit/internal/services/git/utils/util.go deleted file mode 100644 index 7ad07a32c..000000000 --- a/stackit/internal/services/git/utils/util.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - git "github.com/stackitcloud/stackit-sdk-go/services/git/v1betaapi" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *git.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.GitCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.GitCustomEndpoint)) - } - apiClient, err := git.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/git/utils/util_test.go b/stackit/internal/services/git/utils/util_test.go deleted file mode 100644 index f3dda2f15..000000000 --- a/stackit/internal/services/git/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - git "github.com/stackitcloud/stackit-sdk-go/services/git/v1betaapi" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://git-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *git.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *git.APIClient { - apiClient, err := git.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - GitCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *git.APIClient { - apiClient, err := git.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/iaas/affinitygroup/datasource.go b/stackit/internal/services/iaas/affinitygroup/datasource.go index 937f6a43e..3cb3b0372 100644 --- a/stackit/internal/services/iaas/affinitygroup/datasource.go +++ b/stackit/internal/services/iaas/affinitygroup/datasource.go @@ -6,9 +6,6 @@ import ( "net/http" "regexp" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -33,22 +30,19 @@ func NewAffinityGroupDatasource() datasource.DataSource { } type affinityGroupDatasource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } func (d *affinityGroupDatasource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -133,7 +127,7 @@ func (d *affinityGroupDatasource) Read(ctx context.Context, req datasource.ReadR ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "affinity_group_id", affinityGroupId) - affinityGroupResp, err := d.client.DefaultAPI.GetAffinityGroup(ctx, projectId, region, affinityGroupId).Execute() + affinityGroupResp, err := d.client.GetAffinityGroup(ctx, projectId, region, affinityGroupId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/affinitygroup/resource.go b/stackit/internal/services/iaas/affinitygroup/resource.go index 5b48672b3..6ee74dc17 100644 --- a/stackit/internal/services/iaas/affinitygroup/resource.go +++ b/stackit/internal/services/iaas/affinitygroup/resource.go @@ -8,12 +8,8 @@ import ( "regexp" "strings" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" @@ -53,7 +49,7 @@ func NewAffinityGroupResource() resource.Resource { // affinityGroupResource is the resource implementation. type affinityGroupResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -94,17 +90,14 @@ func (r *affinityGroupResource) ModifyPlan(ctx context.Context, req resource.Mod // Configure adds the provider configured client to the resource. func (r *affinityGroupResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -210,7 +203,7 @@ func (r *affinityGroupResource) Create(ctx context.Context, req resource.CreateR core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating affinity group", fmt.Sprintf("Creating API payload: %v", err)) return } - affinityGroupResp, err := r.client.DefaultAPI.CreateAffinityGroup(ctx, projectId, region).CreateAffinityGroupPayload(*payload).Execute() + affinityGroupResp, err := r.client.CreateAffinityGroup(ctx, projectId, region).CreateAffinityGroupPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating affinity group", fmt.Sprintf("Calling API: %v", err)) return @@ -258,7 +251,7 @@ func (r *affinityGroupResource) Read(ctx context.Context, req resource.ReadReque ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "affinity_group_id", affinityGroupId) - affinityGroupResp, err := r.client.DefaultAPI.GetAffinityGroup(ctx, projectId, region, affinityGroupId).Execute() + affinityGroupResp, err := r.client.GetAffinityGroup(ctx, projectId, region, affinityGroupId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -309,7 +302,7 @@ func (r *affinityGroupResource) Delete(ctx context.Context, req resource.DeleteR ctx = tflog.SetField(ctx, "affinity_group_id", affinityGroupId) // Delete existing affinity group - err := r.client.DefaultAPI.DeleteAffinityGroup(ctx, projectId, region, affinityGroupId).Execute() + err := r.client.DeleteAffinityGroup(ctx, projectId, region, affinityGroupId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/iaas/image/datasource.go b/stackit/internal/services/iaas/image/datasource.go index d224eb6f7..1fdf72ae9 100644 --- a/stackit/internal/services/iaas/image/datasource.go +++ b/stackit/internal/services/iaas/image/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" @@ -18,6 +15,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" + iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -51,7 +50,7 @@ func NewImageDataSource() datasource.DataSource { // imageDataSource is the data source implementation. type imageDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -61,17 +60,14 @@ func (d *imageDataSource) Metadata(_ context.Context, req datasource.MetadataReq } func (d *imageDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -231,7 +227,7 @@ func (d *imageDataSource) Read(ctx context.Context, req datasource.ReadRequest, ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "image_id", imageId) - imageResp, err := d.client.DefaultAPI.GetImage(ctx, projectId, region, imageId).Execute() + imageResp, err := d.client.GetImage(ctx, projectId, region, imageId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/image/resource.go b/stackit/internal/services/iaas/image/resource.go index 2441818b4..9805b0d1d 100644 --- a/stackit/internal/services/iaas/image/resource.go +++ b/stackit/internal/services/iaas/image/resource.go @@ -10,9 +10,8 @@ import ( "strings" "time" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/diag" @@ -114,7 +113,7 @@ func NewImageResource() resource.Resource { // imageResource is the resource implementation. type imageResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -155,17 +154,14 @@ func (r *imageResource) ModifyPlan(ctx context.Context, req resource.ModifyPlanR // Configure adds the provider configured client to the resource. func (r *imageResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -436,7 +432,7 @@ func (r *imageResource) Create(ctx context.Context, req resource.CreateRequest, } // Create new image - imageCreateResp, err := r.client.DefaultAPI.CreateImage(ctx, projectId, region).CreateImagePayload(*payload).Execute() + imageCreateResp, err := r.client.CreateImage(ctx, projectId, region).CreateImagePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating image", fmt.Sprintf("Calling API: %v", err)) return @@ -447,7 +443,7 @@ func (r *imageResource) Create(ctx context.Context, req resource.CreateRequest, ctx = tflog.SetField(ctx, "image_id", imageCreateResp.Id) // Get the image object, as the creation response does not contain all fields - image, err := r.client.DefaultAPI.GetImage(ctx, projectId, region, imageCreateResp.Id).Execute() + image, err := r.client.GetImage(ctx, projectId, region, imageCreateResp.Id).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating image", fmt.Sprintf("Calling API: %v", err)) return @@ -475,8 +471,8 @@ func (r *imageResource) Create(ctx context.Context, req resource.CreateRequest, } // Wait for image to become available - waiter := wait.UploadImageWaitHandler(ctx, r.client.DefaultAPI, projectId, region, imageCreateResp.Id) //nolint:tfwriteid // false positive - id fields are actually stored already using the mapFields() call above - waiter = waiter.SetTimeout(7 * 24 * time.Hour) // Set timeout to one week, to make the timeout useless + waiter := wait.UploadImageWaitHandler(ctx, r.client, projectId, region, imageCreateResp.Id) //nolint:tfwriteid // false positive - id fields are actually stored already using the mapFields() call above + waiter = waiter.SetTimeout(7 * 24 * time.Hour) // Set timeout to one week, to make the timeout useless waitResp, err := waiter.WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating image", fmt.Sprintf("Waiting for image to become available: %v", err)) @@ -523,7 +519,7 @@ func (r *imageResource) Read(ctx context.Context, req resource.ReadRequest, resp ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "image_id", imageId) - imageResp, err := r.client.DefaultAPI.GetImage(ctx, projectId, region, imageId).Execute() + imageResp, err := r.client.GetImage(ctx, projectId, region, imageId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -586,7 +582,7 @@ func (r *imageResource) Update(ctx context.Context, req resource.UpdateRequest, return } // Update existing image - updatedImage, err := r.client.DefaultAPI.UpdateImage(ctx, projectId, region, imageId).UpdateImagePayload(*payload).Execute() + updatedImage, err := r.client.UpdateImage(ctx, projectId, region, imageId).UpdateImagePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating image", fmt.Sprintf("Calling API: %v", err)) return @@ -627,7 +623,7 @@ func (r *imageResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = core.InitProviderContext(ctx) // Delete existing image - err := r.client.DefaultAPI.DeleteImage(ctx, projectId, region, imageId).Execute() + err := r.client.DeleteImage(ctx, projectId, region, imageId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -640,7 +636,7 @@ func (r *imageResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = core.LogResponse(ctx) - _, err = wait.DeleteImageWaitHandler(ctx, r.client.DefaultAPI, projectId, region, imageId).WaitWithContext(ctx) + _, err = wait.DeleteImageWaitHandler(ctx, r.client, projectId, region, imageId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting image", fmt.Sprintf("image deletion waiting: %v", err)) return diff --git a/stackit/internal/services/iaas/imagev2/datasource.go b/stackit/internal/services/iaas/imagev2/datasource.go index 1ea0b0d06..14258ee1f 100644 --- a/stackit/internal/services/iaas/imagev2/datasource.go +++ b/stackit/internal/services/iaas/imagev2/datasource.go @@ -11,7 +11,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/path" iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" @@ -115,7 +114,7 @@ func NewImageV2DataSource() datasource.DataSource { // imageDataV2Source is the data source implementation. type imageDataV2Source struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -125,23 +124,19 @@ func (d *imageDataV2Source) Metadata(_ context.Context, req datasource.MetadataR } func (d *imageDataV2Source) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - features.CheckBetaResourcesEnabled(ctx, &d.providerData, &resp.Diagnostics, "stackit_image_v2", "datasource") - if resp.Diagnostics.HasError() { - return - } + d.providerData = providerData + d.client = clients.IaaSv2Client - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) + features.CheckBetaResourcesEnabled(ctx, &d.providerData, &resp.Diagnostics, "stackit_image_v2", "datasource") if resp.Diagnostics.HasError() { return } - d.client = apiClient tflog.Info(ctx, "iaas client configured") } @@ -394,7 +389,7 @@ func (d *imageDataV2Source) Read(ctx context.Context, req datasource.ReadRequest // Case 1: Direct lookup by image ID if imageID != "" { - imageResp, err = d.client.DefaultAPI.GetImage(ctx, projectID, region, imageID).Execute() + imageResp, err = d.client.GetImage(ctx, projectID, region, imageID).Execute() if err != nil { utils.LogError(ctx, &resp.Diagnostics, err, "Reading image", fmt.Sprintf("Image with ID %q does not exist in project %q.", imageID, projectID), @@ -420,7 +415,7 @@ func (d *imageDataV2Source) Read(ctx context.Context, req datasource.ReadRequest } // Fetch all available images - imageList, err := d.client.DefaultAPI.ListImages(ctx, projectID, region).Execute() + imageList, err := d.client.ListImages(ctx, projectID, region).Execute() if err != nil { utils.LogError(ctx, &resp.Diagnostics, err, "List images", "Unable to fetch images", nil) return diff --git a/stackit/internal/services/iaas/keypair/datasource.go b/stackit/internal/services/iaas/keypair/datasource.go index 556a9e69b..7940ce730 100644 --- a/stackit/internal/services/iaas/keypair/datasource.go +++ b/stackit/internal/services/iaas/keypair/datasource.go @@ -4,9 +4,6 @@ import ( "context" "fmt" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/types" @@ -29,7 +26,7 @@ func NewKeyPairDataSource() datasource.DataSource { // keyPairDataSource is the data source implementation. type keyPairDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI } // Metadata returns the data source type name. @@ -38,16 +35,13 @@ func (d *keyPairDataSource) Metadata(_ context.Context, req datasource.MetadataR } func (d *keyPairDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -98,7 +92,7 @@ func (d *keyPairDataSource) Read(ctx context.Context, req datasource.ReadRequest ctx = tflog.SetField(ctx, "name", name) - keypairResp, err := d.client.DefaultAPI.GetKeyPair(ctx, name).Execute() + keypairResp, err := d.client.GetKeyPair(ctx, name).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/keypair/resource.go b/stackit/internal/services/iaas/keypair/resource.go index d943c0863..6b8330214 100644 --- a/stackit/internal/services/iaas/keypair/resource.go +++ b/stackit/internal/services/iaas/keypair/resource.go @@ -45,7 +45,7 @@ func NewKeyPairResource() resource.Resource { // keyPairResource is the resource implementation. type keyPairResource struct { - client *iaas.APIClient + client iaas.DefaultAPI } // Metadata returns the resource type name. @@ -55,16 +55,13 @@ func (r *keyPairResource) Metadata(_ context.Context, req resource.MetadataReque // Configure adds the provider configured client to the resource. func (r *keyPairResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -162,7 +159,7 @@ func (r *keyPairResource) Create(ctx context.Context, req resource.CreateRequest // Create new key pair - keyPair, err := r.client.DefaultAPI.CreateKeyPair(ctx).CreateKeyPairPayload(*payload).Execute() + keyPair, err := r.client.CreateKeyPair(ctx).CreateKeyPairPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating key pair", fmt.Sprintf("Calling API: %v", err)) return @@ -199,7 +196,7 @@ func (r *keyPairResource) Read(ctx context.Context, req resource.ReadRequest, re ctx = tflog.SetField(ctx, "name", name) - keyPairResp, err := r.client.DefaultAPI.GetKeyPair(ctx, name).Execute() + keyPairResp, err := r.client.GetKeyPair(ctx, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -257,7 +254,7 @@ func (r *keyPairResource) Update(ctx context.Context, req resource.UpdateRequest return } // Update existing key pair - updatedKeyPair, err := r.client.DefaultAPI.UpdateKeyPair(ctx, name).UpdateKeyPairPayload(*payload).Execute() + updatedKeyPair, err := r.client.UpdateKeyPair(ctx, name).UpdateKeyPairPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating key pair", fmt.Sprintf("Calling API: %v", err)) return @@ -295,7 +292,7 @@ func (r *keyPairResource) Delete(ctx context.Context, req resource.DeleteRequest ctx = tflog.SetField(ctx, "name", name) // Delete existing key pair - err := r.client.DefaultAPI.DeleteKeyPair(ctx, name).Execute() + err := r.client.DeleteKeyPair(ctx, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/iaas/machinetype/datasource.go b/stackit/internal/services/iaas/machinetype/datasource.go index ba0904acf..c54976cde 100644 --- a/stackit/internal/services/iaas/machinetype/datasource.go +++ b/stackit/internal/services/iaas/machinetype/datasource.go @@ -18,10 +18,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) @@ -48,7 +46,7 @@ func NewMachineTypeDataSource() datasource.DataSource { } type machineTypeDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -57,22 +55,18 @@ func (d *machineTypeDataSource) Metadata(_ context.Context, req datasource.Metad } func (d *machineTypeDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - features.CheckBetaResourcesEnabled(ctx, &d.providerData, &resp.Diagnostics, "stackit_machine_type", "datasource") - if resp.Diagnostics.HasError() { - return - } + d.providerData = providerData + d.client = clients.IaaSv2Client - client := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) + features.CheckBetaResourcesEnabled(ctx, &d.providerData, &resp.Diagnostics, "stackit_machine_type", "datasource") if resp.Diagnostics.HasError() { return } - d.client = client tflog.Info(ctx, "IAAS client configured") } @@ -163,7 +157,7 @@ func (d *machineTypeDataSource) Read(ctx context.Context, req datasource.ReadReq ctx = tflog.SetField(ctx, "filter_is_null", model.Filter.IsNull()) ctx = tflog.SetField(ctx, "filter_is_unknown", model.Filter.IsUnknown()) - listMachineTypeReq := d.client.DefaultAPI.ListMachineTypes(ctx, projectId, region) + listMachineTypeReq := d.client.ListMachineTypes(ctx, projectId, region) if !model.Filter.IsNull() && !model.Filter.IsUnknown() && strings.TrimSpace(model.Filter.ValueString()) != "" { listMachineTypeReq = listMachineTypeReq.Filter(strings.TrimSpace(model.Filter.ValueString())) diff --git a/stackit/internal/services/iaas/network/datasource.go b/stackit/internal/services/iaas/network/datasource.go index c130e3484..227927131 100644 --- a/stackit/internal/services/iaas/network/datasource.go +++ b/stackit/internal/services/iaas/network/datasource.go @@ -6,8 +6,6 @@ import ( "net" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" @@ -16,7 +14,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -60,7 +59,7 @@ func NewNetworkDataSource() datasource.DataSource { // networkDataSource is the data source implementation. type networkDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -70,17 +69,14 @@ func (d *networkDataSource) Metadata(_ context.Context, req datasource.MetadataR } func (d *networkDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.IaaSv2Client + tflog.Info(ctx, "IaaS client configured") } @@ -238,7 +234,7 @@ func (d *networkDataSource) Read(ctx context.Context, req datasource.ReadRequest ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "network_id", networkId) - networkResp, err := d.client.DefaultAPI.GetNetwork(ctx, projectId, region, networkId).Execute() + networkResp, err := d.client.GetNetwork(ctx, projectId, region, networkId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/network/resource.go b/stackit/internal/services/iaas/network/resource.go index 844bb53a9..d2ea0ccf3 100644 --- a/stackit/internal/services/iaas/network/resource.go +++ b/stackit/internal/services/iaas/network/resource.go @@ -86,7 +86,7 @@ func NewNetworkResource() resource.Resource { // networkResource is the resource implementation. type networkResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -97,17 +97,14 @@ func (r *networkResource) Metadata(_ context.Context, req resource.MetadataReque // Configure adds the provider configured client to the resource. func (r *networkResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IaaSv2Client + tflog.Info(ctx, "IaaS client configured") } @@ -480,7 +477,7 @@ func (r *networkResource) Create(ctx context.Context, req resource.CreateRequest // Create new network - network, err := r.client.DefaultAPI.CreateNetwork(ctx, projectId, region).CreateNetworkPayload(*payload).Execute() + network, err := r.client.CreateNetwork(ctx, projectId, region).CreateNetworkPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating network", fmt.Sprintf("Calling API: %v", err)) return @@ -499,7 +496,7 @@ func (r *networkResource) Create(ctx context.Context, req resource.CreateRequest return } - network, err = wait.CreateNetworkWaitHandler(ctx, r.client.DefaultAPI, projectId, region, networkId).WaitWithContext(ctx) + network, err = wait.CreateNetworkWaitHandler(ctx, r.client, projectId, region, networkId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating network", fmt.Sprintf("Network creation waiting: %v", err)) return @@ -543,7 +540,7 @@ func (r *networkResource) Read(ctx context.Context, req resource.ReadRequest, re ctx = tflog.SetField(ctx, "network_id", networkId) ctx = tflog.SetField(ctx, "region", region) - networkResp, err := r.client.DefaultAPI.GetNetwork(ctx, projectId, region, networkId).Execute() + networkResp, err := r.client.GetNetwork(ctx, projectId, region, networkId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -606,13 +603,13 @@ func (r *networkResource) Update(ctx context.Context, req resource.UpdateRequest } // Update existing network - err = r.client.DefaultAPI.PartialUpdateNetwork(ctx, projectId, region, networkId).PartialUpdateNetworkPayload(*payload).Execute() + err = r.client.PartialUpdateNetwork(ctx, projectId, region, networkId).PartialUpdateNetworkPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating network", fmt.Sprintf("Calling API: %v", err)) return } - waitResp, err := wait.UpdateNetworkWaitHandler(ctx, r.client.DefaultAPI, projectId, region, networkId).WaitWithContext(ctx) + waitResp, err := wait.UpdateNetworkWaitHandler(ctx, r.client, projectId, region, networkId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating network", fmt.Sprintf("Network update waiting: %v", err)) return @@ -653,7 +650,7 @@ func (r *networkResource) Delete(ctx context.Context, req resource.DeleteRequest ctx = core.InitProviderContext(ctx) // Delete existing network - err := r.client.DefaultAPI.DeleteNetwork(ctx, projectId, region, networkId).Execute() + err := r.client.DeleteNetwork(ctx, projectId, region, networkId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -666,7 +663,7 @@ func (r *networkResource) Delete(ctx context.Context, req resource.DeleteRequest ctx = core.LogResponse(ctx) - _, err = wait.DeleteNetworkWaitHandler(ctx, r.client.DefaultAPI, projectId, region, networkId).WaitWithContext(ctx) + _, err = wait.DeleteNetworkWaitHandler(ctx, r.client, projectId, region, networkId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting network", fmt.Sprintf("Network deletion waiting: %v", err)) return diff --git a/stackit/internal/services/iaas/networkarea/datasource.go b/stackit/internal/services/iaas/networkarea/datasource.go index f8e7d9de4..4064c6f05 100644 --- a/stackit/internal/services/iaas/networkarea/datasource.go +++ b/stackit/internal/services/iaas/networkarea/datasource.go @@ -8,9 +8,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/int64validator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/datasource" @@ -35,7 +32,7 @@ func NewNetworkAreaDataSource() datasource.DataSource { // networkDataSource is the data source implementation. type networkAreaDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI } // Metadata returns the data source type name. @@ -44,16 +41,13 @@ func (d *networkAreaDataSource) Metadata(_ context.Context, req datasource.Metad } func (d *networkAreaDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.client = clients.IaaSv2Client + tflog.Info(ctx, "IaaS client configured") } @@ -125,7 +119,7 @@ func (d *networkAreaDataSource) Read(ctx context.Context, req datasource.ReadReq ctx = tflog.SetField(ctx, "organization_id", organizationId) ctx = tflog.SetField(ctx, "network_area_id", networkAreaId) - networkAreaResp, err := d.client.DefaultAPI.GetNetworkArea(ctx, organizationId, networkAreaId).Execute() + networkAreaResp, err := d.client.GetNetworkArea(ctx, organizationId, networkAreaId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/networkarea/resource.go b/stackit/internal/services/iaas/networkarea/resource.go index 5307fdc62..edbeab03d 100644 --- a/stackit/internal/services/iaas/networkarea/resource.go +++ b/stackit/internal/services/iaas/networkarea/resource.go @@ -10,7 +10,6 @@ import ( resourcemanager "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager/v0api" iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - resourcemanagerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/resourcemanager/utils" "github.com/hashicorp/terraform-plugin-framework-validators/int64validator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" @@ -55,8 +54,8 @@ func NewNetworkAreaResource() resource.Resource { // networkResource is the resource implementation. type networkAreaResource struct { - client *iaas.APIClient - resourceManagerClient *resourcemanager.APIClient + client iaas.DefaultAPI + resourceManagerClient resourcemanager.DefaultAPI } // Metadata returns the resource type name. @@ -66,20 +65,13 @@ func (r *networkAreaResource) Metadata(_ context.Context, req resource.MetadataR // Configure adds the provider configured client to the resource. func (r *networkAreaResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - r.client = iaasUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - - r.resourceManagerClient = resourcemanagerUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + r.client = clients.IaaSv2Client + r.resourceManagerClient = clients.ResourceManagerClient tflog.Info(ctx, "IaaS client configured") } @@ -168,7 +160,7 @@ func (r *networkAreaResource) Create(ctx context.Context, req resource.CreateReq } // Create new network area - networkArea, err := r.client.DefaultAPI.CreateNetworkArea(ctx, organizationId).CreateNetworkAreaPayload(*payload).Execute() + networkArea, err := r.client.CreateNetworkArea(ctx, organizationId).CreateNetworkAreaPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating network area", fmt.Sprintf("Calling API: %v", err)) return @@ -215,7 +207,7 @@ func (r *networkAreaResource) Read(ctx context.Context, req resource.ReadRequest ctx = tflog.SetField(ctx, "organization_id", organizationId) ctx = tflog.SetField(ctx, "network_area_id", networkAreaId) - networkAreaResp, err := r.client.DefaultAPI.GetNetworkArea(ctx, organizationId, networkAreaId).Execute() + networkAreaResp, err := r.client.GetNetworkArea(ctx, organizationId, networkAreaId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -274,7 +266,7 @@ func (r *networkAreaResource) Update(ctx context.Context, req resource.UpdateReq return } // Update existing network - networkAreaUpdateResp, err := r.client.DefaultAPI.PartialUpdateNetworkArea(ctx, organizationId, networkAreaId).PartialUpdateNetworkAreaPayload(*payload).Execute() + networkAreaUpdateResp, err := r.client.PartialUpdateNetworkArea(ctx, organizationId, networkAreaId).PartialUpdateNetworkAreaPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating network area", fmt.Sprintf("Calling API: %v", err)) return @@ -313,7 +305,7 @@ func (r *networkAreaResource) Delete(ctx context.Context, req resource.DeleteReq ctx = tflog.SetField(ctx, "organization_id", organizationId) ctx = tflog.SetField(ctx, "network_area_id", networkAreaId) - _, err := wait.ReadyForNetworkAreaDeletionWaitHandler(ctx, r.client.DefaultAPI, r.resourceManagerClient.DefaultAPI, organizationId, networkAreaId).WaitWithContext(ctx) + _, err := wait.ReadyForNetworkAreaDeletionWaitHandler(ctx, r.client, r.resourceManagerClient, organizationId, networkAreaId).WaitWithContext(ctx) if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -325,7 +317,7 @@ func (r *networkAreaResource) Delete(ctx context.Context, req resource.DeleteReq } // Get all configured regions so we can delete them one by one before deleting the network area - regionsListResp, err := r.client.DefaultAPI.ListNetworkAreaRegions(ctx, organizationId, networkAreaId).Execute() + regionsListResp, err := r.client.ListNetworkAreaRegions(ctx, organizationId, networkAreaId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -338,7 +330,7 @@ func (r *networkAreaResource) Delete(ctx context.Context, req resource.DeleteReq // Delete network region configurations for region := range regionsListResp.Regions { - err = r.client.DefaultAPI.DeleteNetworkAreaRegion(ctx, organizationId, networkAreaId, region).Execute() + err = r.client.DeleteNetworkAreaRegion(ctx, organizationId, networkAreaId, region).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && (oapiErr.StatusCode == http.StatusNotFound || oapiErr.StatusCode == http.StatusBadRequest) { // TODO: iaas api returns http 400 in case network area region is not found @@ -348,7 +340,7 @@ func (r *networkAreaResource) Delete(ctx context.Context, req resource.DeleteReq return } - _, err = wait.DeleteNetworkAreaRegionWaitHandler(ctx, r.client.DefaultAPI, organizationId, networkAreaId, region).WaitWithContext(ctx) + _, err = wait.DeleteNetworkAreaRegionWaitHandler(ctx, r.client, organizationId, networkAreaId, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting network area region", fmt.Sprintf("Waiting for networea deletion: %v", err)) return @@ -356,7 +348,7 @@ func (r *networkAreaResource) Delete(ctx context.Context, req resource.DeleteReq } // Delete existing network area - err = r.client.DefaultAPI.DeleteNetworkArea(ctx, organizationId, networkAreaId).Execute() + err = r.client.DeleteNetworkArea(ctx, organizationId, networkAreaId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/iaas/networkarearegion/datasource.go b/stackit/internal/services/iaas/networkarearegion/datasource.go index 8dea6f51f..68b54ba2a 100644 --- a/stackit/internal/services/iaas/networkarearegion/datasource.go +++ b/stackit/internal/services/iaas/networkarearegion/datasource.go @@ -9,9 +9,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/types" @@ -34,7 +31,7 @@ func NewNetworkAreaRegionDataSource() datasource.DataSource { // networkAreaRegionDataSource is the data source implementation. type networkAreaRegionDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -44,17 +41,14 @@ func (d *networkAreaRegionDataSource) Metadata(_ context.Context, req datasource } func (d *networkAreaRegionDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -163,7 +157,7 @@ func (d *networkAreaRegionDataSource) Read(ctx context.Context, req datasource.R ctx = core.InitProviderContext(ctx) - networkAreaRegionResp, err := d.client.DefaultAPI.GetNetworkAreaRegion(ctx, organizationId, networkAreaId, region).Execute() + networkAreaRegionResp, err := d.client.GetNetworkAreaRegion(ctx, organizationId, networkAreaId, region).Execute() if err != nil { utils.LogError(ctx, &resp.Diagnostics, err, "Reading network area region", fmt.Sprintf("Region configuration for %q for network area %q does not exist.", region, networkAreaId), nil) resp.State.RemoveResource(ctx) diff --git a/stackit/internal/services/iaas/networkarearegion/resource.go b/stackit/internal/services/iaas/networkarearegion/resource.go index 8856175c0..aa1305ef2 100644 --- a/stackit/internal/services/iaas/networkarearegion/resource.go +++ b/stackit/internal/services/iaas/networkarearegion/resource.go @@ -9,8 +9,6 @@ import ( resourcemanager "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager/v0api" - resourcemanagerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/resourcemanager/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/int64validator" "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" "github.com/hashicorp/terraform-plugin-framework/resource/schema/int64default" @@ -20,8 +18,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" @@ -74,8 +70,8 @@ func NewNetworkAreaRegionResource() resource.Resource { // networkAreaRegionResource is the resource implementation. type networkAreaRegionResource struct { - client *iaas.APIClient - resourceManagerClient *resourcemanager.APIClient + client iaas.DefaultAPI + resourceManagerClient resourcemanager.DefaultAPI providerData core.ProviderData } @@ -116,21 +112,14 @@ func (r *networkAreaRegionResource) ModifyPlan(ctx context.Context, req resource // Configure adds the provider configured client to the resource. func (r *networkAreaRegionResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - r.client = iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - - r.resourceManagerClient = resourcemanagerUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + r.providerData = providerData + r.client = clients.IaaSv2Client + r.resourceManagerClient = clients.ResourceManagerClient tflog.Info(ctx, "iaas client configured") } @@ -282,7 +271,7 @@ func (r *networkAreaRegionResource) Create(ctx context.Context, req resource.Cre } // Create new network area region configuration - networkAreaRegion, err := r.client.DefaultAPI.CreateNetworkAreaRegion(ctx, organizationId, networkAreaId, region).CreateNetworkAreaRegionPayload(*payload).Execute() + networkAreaRegion, err := r.client.CreateNetworkAreaRegion(ctx, organizationId, networkAreaId, region).CreateNetworkAreaRegionPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating network area region", fmt.Sprintf("Calling API: %v", err)) return @@ -298,7 +287,7 @@ func (r *networkAreaRegionResource) Create(ctx context.Context, req resource.Cre }) // wait for creation of network area region to complete - _, err = wait.CreateNetworkAreaRegionWaitHandler(ctx, r.client.DefaultAPI, organizationId, networkAreaId, region).WaitWithContext(ctx) + _, err = wait.CreateNetworkAreaRegionWaitHandler(ctx, r.client, organizationId, networkAreaId, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating server", fmt.Sprintf("server creation waiting: %v", err)) return @@ -341,7 +330,7 @@ func (r *networkAreaRegionResource) Read(ctx context.Context, req resource.ReadR ctx = core.InitProviderContext(ctx) - networkAreaRegionResp, err := r.client.DefaultAPI.GetNetworkAreaRegion(ctx, organizationId, networkAreaId, region).Execute() + networkAreaRegionResp, err := r.client.GetNetworkAreaRegion(ctx, organizationId, networkAreaId, region).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -402,7 +391,7 @@ func (r *networkAreaRegionResource) Update(ctx context.Context, req resource.Upd } // Update existing network area region configuration - _, err = r.client.DefaultAPI.UpdateNetworkAreaRegion(ctx, organizationId, networkAreaId, region).UpdateNetworkAreaRegionPayload(*payload).Execute() + _, err = r.client.UpdateNetworkAreaRegion(ctx, organizationId, networkAreaId, region).UpdateNetworkAreaRegionPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating network area region", fmt.Sprintf("Calling API: %v", err)) return @@ -410,13 +399,13 @@ func (r *networkAreaRegionResource) Update(ctx context.Context, req resource.Upd ctx = core.LogResponse(ctx) - err = updateIpv4NetworkRanges(ctx, organizationId, networkAreaId, model.Ipv4.NetworkRanges, r.client.DefaultAPI, region) + err = updateIpv4NetworkRanges(ctx, organizationId, networkAreaId, model.Ipv4.NetworkRanges, r.client, region) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating network area region", fmt.Sprintf("Updating Network ranges: %v", err)) return } - updatedNetworkAreaRegion, err := r.client.DefaultAPI.GetNetworkAreaRegion(ctx, organizationId, networkAreaId, region).Execute() + updatedNetworkAreaRegion, err := r.client.GetNetworkAreaRegion(ctx, organizationId, networkAreaId, region).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating network area region", fmt.Sprintf("Calling API: %v", err)) return @@ -453,14 +442,14 @@ func (r *networkAreaRegionResource) Delete(ctx context.Context, req resource.Del ctx = core.InitProviderContext(ctx) - _, err := wait.ReadyForNetworkAreaDeletionWaitHandler(ctx, r.client.DefaultAPI, r.resourceManagerClient.DefaultAPI, organizationId, networkAreaId).WaitWithContext(ctx) + _, err := wait.ReadyForNetworkAreaDeletionWaitHandler(ctx, r.client, r.resourceManagerClient, organizationId, networkAreaId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting network area region", fmt.Sprintf("Network area ready for deletion waiting: %v", err)) return } // Delete network area region configuration - err = r.client.DefaultAPI.DeleteNetworkAreaRegion(ctx, organizationId, networkAreaId, region).Execute() + err = r.client.DeleteNetworkAreaRegion(ctx, organizationId, networkAreaId, region).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -472,7 +461,7 @@ func (r *networkAreaRegionResource) Delete(ctx context.Context, req resource.Del ctx = core.LogResponse(ctx) - _, err = wait.DeleteNetworkAreaRegionWaitHandler(ctx, r.client.DefaultAPI, organizationId, networkAreaId, region).WaitWithContext(ctx) + _, err = wait.DeleteNetworkAreaRegionWaitHandler(ctx, r.client, organizationId, networkAreaId, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting network area region", fmt.Sprintf("network area deletion waiting: %v", err)) return diff --git a/stackit/internal/services/iaas/networkarearoute/datasource.go b/stackit/internal/services/iaas/networkarearoute/datasource.go index 4fa92165b..3fa6bc825 100644 --- a/stackit/internal/services/iaas/networkarearoute/datasource.go +++ b/stackit/internal/services/iaas/networkarearoute/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -32,7 +29,7 @@ func NewNetworkAreaRouteDataSource() datasource.DataSource { // networkDataSource is the data source implementation. type networkAreaRouteDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -42,17 +39,14 @@ func (d *networkAreaRouteDataSource) Metadata(_ context.Context, req datasource. } func (d *networkAreaRouteDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.IaaSv2Client + tflog.Info(ctx, "IaaS client configured") } @@ -155,7 +149,7 @@ func (d *networkAreaRouteDataSource) Read(ctx context.Context, req datasource.Re ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "network_area_route_id", networkAreaRouteId) - networkAreaRouteResp, err := d.client.DefaultAPI.GetNetworkAreaRoute(ctx, organizationId, networkAreaId, region, networkAreaRouteId).Execute() + networkAreaRouteResp, err := d.client.GetNetworkAreaRoute(ctx, organizationId, networkAreaId, region, networkAreaRouteId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/networkarearoute/resource.go b/stackit/internal/services/iaas/networkarearoute/resource.go index b3789d378..2b59d01ee 100644 --- a/stackit/internal/services/iaas/networkarearoute/resource.go +++ b/stackit/internal/services/iaas/networkarearoute/resource.go @@ -7,9 +7,8 @@ import ( "net/http" "strings" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" @@ -77,7 +76,7 @@ func NewNetworkAreaRouteResource() resource.Resource { // networkResource is the resource implementation. type networkAreaRouteResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -119,16 +118,14 @@ func (r *networkAreaRouteResource) ModifyPlan(ctx context.Context, req resource. // Configure adds the provider configured client to the resource. func (r *networkAreaRouteResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IaaSv2Client + tflog.Info(ctx, "IaaS client configured") } @@ -355,7 +352,7 @@ func (r *networkAreaRouteResource) Create(ctx context.Context, req resource.Crea } // Create new network area route - routes, err := r.client.DefaultAPI.CreateNetworkAreaRoute(ctx, organizationId, networkAreaId, region).CreateNetworkAreaRoutePayload(*payload).Execute() + routes, err := r.client.CreateNetworkAreaRoute(ctx, organizationId, networkAreaId, region).CreateNetworkAreaRoutePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating network area route", fmt.Sprintf("Calling API: %v", err)) return @@ -420,7 +417,7 @@ func (r *networkAreaRouteResource) Read(ctx context.Context, req resource.ReadRe ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "network_area_route_id", networkAreaRouteId) - networkAreaRouteResp, err := r.client.DefaultAPI.GetNetworkAreaRoute(ctx, organizationId, networkAreaId, region, networkAreaRouteId).Execute() + networkAreaRouteResp, err := r.client.GetNetworkAreaRoute(ctx, organizationId, networkAreaId, region, networkAreaRouteId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -471,7 +468,7 @@ func (r *networkAreaRouteResource) Delete(ctx context.Context, req resource.Dele ctx = tflog.SetField(ctx, "network_area_route_id", networkAreaRouteId) // Delete existing network - err := r.client.DefaultAPI.DeleteNetworkAreaRoute(ctx, organizationId, networkAreaId, region, networkAreaRouteId).Execute() + err := r.client.DeleteNetworkAreaRoute(ctx, organizationId, networkAreaId, region, networkAreaRouteId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -523,7 +520,7 @@ func (r *networkAreaRouteResource) Update(ctx context.Context, req resource.Upda return } // Update existing network area route - networkAreaRouteResp, err := r.client.DefaultAPI.UpdateNetworkAreaRoute(ctx, organizationId, networkAreaId, region, networkAreaRouteId).UpdateNetworkAreaRoutePayload(*payload).Execute() + networkAreaRouteResp, err := r.client.UpdateNetworkAreaRoute(ctx, organizationId, networkAreaId, region, networkAreaRouteId).UpdateNetworkAreaRoutePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating network area route", fmt.Sprintf("Calling API: %v", err)) return diff --git a/stackit/internal/services/iaas/networkinterface/datasource.go b/stackit/internal/services/iaas/networkinterface/datasource.go index b3a44e019..1a5876d9d 100644 --- a/stackit/internal/services/iaas/networkinterface/datasource.go +++ b/stackit/internal/services/iaas/networkinterface/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -32,7 +29,7 @@ func NewNetworkInterfaceDataSource() datasource.DataSource { // networkInterfaceDataSource is the data source implementation. type networkInterfaceDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -42,17 +39,14 @@ func (d *networkInterfaceDataSource) Metadata(_ context.Context, req datasource. } func (d *networkInterfaceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.IaaSv2Client + tflog.Info(ctx, "IaaS client configured") } @@ -162,7 +156,7 @@ func (d *networkInterfaceDataSource) Read(ctx context.Context, req datasource.Re ctx = tflog.SetField(ctx, "network_id", networkId) ctx = tflog.SetField(ctx, "network_interface_id", networkInterfaceId) - networkInterfaceResp, err := d.client.DefaultAPI.GetNic(ctx, projectId, region, networkId, networkInterfaceId).Execute() + networkInterfaceResp, err := d.client.GetNic(ctx, projectId, region, networkId, networkInterfaceId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/networkinterface/resource.go b/stackit/internal/services/iaas/networkinterface/resource.go index 5fce1bc74..69bbb4808 100644 --- a/stackit/internal/services/iaas/networkinterface/resource.go +++ b/stackit/internal/services/iaas/networkinterface/resource.go @@ -8,8 +8,6 @@ import ( "regexp" "strings" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/diag" @@ -24,6 +22,8 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" + iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" @@ -62,7 +62,7 @@ func NewNetworkInterfaceResource() resource.Resource { // networkResource is the resource implementation. type networkInterfaceResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -116,17 +116,14 @@ func (r *networkInterfaceResource) Metadata(_ context.Context, req resource.Meta // Configure adds the provider configured client to the resource. func (r *networkInterfaceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -299,7 +296,7 @@ func (r *networkInterfaceResource) Create(ctx context.Context, req resource.Crea } // Create new network interface - networkInterface, err := r.client.DefaultAPI.CreateNic(ctx, projectId, region, networkId).CreateNicPayload(*payload).Execute() + networkInterface, err := r.client.CreateNic(ctx, projectId, region, networkId).CreateNicPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating network interface", fmt.Sprintf("Calling API: %v", err)) return @@ -351,7 +348,7 @@ func (r *networkInterfaceResource) Read(ctx context.Context, req resource.ReadRe ctx = tflog.SetField(ctx, "network_id", networkId) ctx = tflog.SetField(ctx, "network_interface_id", networkInterfaceId) - networkInterfaceResp, err := r.client.DefaultAPI.GetNic(ctx, projectId, region, networkId, networkInterfaceId).Execute() + networkInterfaceResp, err := r.client.GetNic(ctx, projectId, region, networkId, networkInterfaceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -415,7 +412,7 @@ func (r *networkInterfaceResource) Update(ctx context.Context, req resource.Upda return } // Update existing network - nicResp, err := r.client.DefaultAPI.UpdateNic(ctx, projectId, region, networkId, networkInterfaceId).UpdateNicPayload(*payload).Execute() + nicResp, err := r.client.UpdateNic(ctx, projectId, region, networkId, networkInterfaceId).UpdateNicPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating network interface", fmt.Sprintf("Calling API: %v", err)) return @@ -459,7 +456,7 @@ func (r *networkInterfaceResource) Delete(ctx context.Context, req resource.Dele ctx = tflog.SetField(ctx, "network_interface_id", networkInterfaceId) // Delete existing network interface - err := r.client.DefaultAPI.DeleteNic(ctx, projectId, region, networkId, networkInterfaceId).Execute() + err := r.client.DeleteNic(ctx, projectId, region, networkId, networkInterfaceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/iaas/networkinterfaceattach/resource.go b/stackit/internal/services/iaas/networkinterfaceattach/resource.go index 4275fd159..6f103bbb1 100644 --- a/stackit/internal/services/iaas/networkinterfaceattach/resource.go +++ b/stackit/internal/services/iaas/networkinterfaceattach/resource.go @@ -9,9 +9,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" @@ -49,7 +46,7 @@ func NewNetworkInterfaceAttachResource() resource.Resource { // networkInterfaceAttachResource is the resource implementation. type networkInterfaceAttachResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -90,17 +87,14 @@ func (r *networkInterfaceAttachResource) ModifyPlan(ctx context.Context, req res // Configure adds the provider configured client to the resource. func (r *networkInterfaceAttachResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -186,7 +180,7 @@ func (r *networkInterfaceAttachResource) Create(ctx context.Context, req resourc ctx = tflog.SetField(ctx, "network_interface_id", networkInterfaceId) // Create new network interface attachment - err := r.client.DefaultAPI.AddNicToServer(ctx, projectId, region, serverId, networkInterfaceId).Execute() + err := r.client.AddNicToServer(ctx, projectId, region, serverId, networkInterfaceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error attaching network interface to server", fmt.Sprintf("Calling API: %v", err)) return @@ -225,7 +219,7 @@ func (r *networkInterfaceAttachResource) Read(ctx context.Context, req resource. ctx = tflog.SetField(ctx, "server_id", serverId) ctx = tflog.SetField(ctx, "network_interface_id", networkInterfaceId) - nics, err := r.client.DefaultAPI.ListServerNICs(ctx, projectId, region, serverId).Execute() + nics, err := r.client.ListServerNICs(ctx, projectId, region, serverId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -293,7 +287,7 @@ func (r *networkInterfaceAttachResource) Delete(ctx context.Context, req resourc ctx = tflog.SetField(ctx, "network_interface_id", network_interfaceId) // Remove network_interface from server - err := r.client.DefaultAPI.RemoveNicFromServer(ctx, projectId, region, serverId, network_interfaceId).Execute() + err := r.client.RemoveNicFromServer(ctx, projectId, region, serverId, network_interfaceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/iaas/project/datasource.go b/stackit/internal/services/iaas/project/datasource.go index 91ef3d25f..228b7403d 100644 --- a/stackit/internal/services/iaas/project/datasource.go +++ b/stackit/internal/services/iaas/project/datasource.go @@ -11,11 +11,9 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-framework/types/basetypes" "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" //nolint:staticcheck // TODO: will be done within STACKITTPR-713 + iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -44,20 +42,17 @@ func NewProjectDataSource() datasource.DataSource { // projectDatasource is the data source implementation. type projectDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI } func (d *projectDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClientLegacy(ctx, &providerData, &resp.Diagnostics) //nolint:staticcheck // TODO: will be done within STACKITTPR-713 - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -138,7 +133,7 @@ func (d *projectDataSource) Read(ctx context.Context, req datasource.ReadRequest ctx = tflog.SetField(ctx, "project_id", projectId) - projectResp, err := d.client.GetProjectDetailsExecute(ctx, projectId) //nolint:staticcheck // TODO: will be done within STACKITTPR-713 + projectResp, err := d.client.GetProjectDetails(ctx, projectId).Execute() if err != nil { utils.LogError( ctx, @@ -180,8 +175,8 @@ func mapDataSourceFields(projectResp *iaas.Project, model *DatasourceModel) erro var projectId string if model.ProjectId.ValueString() != "" { projectId = model.ProjectId.ValueString() - } else if projectResp.Id != nil { - projectId = *projectResp.Id + } else if projectResp.Id != "" { + projectId = projectResp.Id } else { return fmt.Errorf("project id is not present") } @@ -190,12 +185,10 @@ func mapDataSourceFields(projectResp *iaas.Project, model *DatasourceModel) erro model.ProjectId = types.StringValue(projectId) var areaId basetypes.StringValue - if projectResp.AreaId != nil { - if projectResp.AreaId.String != nil { - areaId = types.StringPointerValue(projectResp.AreaId.String) - } else if projectResp.AreaId.StaticAreaID != nil { - areaId = types.StringValue(string(*projectResp.AreaId.StaticAreaID)) - } + if projectResp.AreaId.String != nil { + areaId = types.StringPointerValue(projectResp.AreaId.String) + } else if projectResp.AreaId.StaticAreaID != nil { + areaId = types.StringValue(string(*projectResp.AreaId.StaticAreaID)) } var createdAt basetypes.StringValue @@ -212,8 +205,8 @@ func mapDataSourceFields(projectResp *iaas.Project, model *DatasourceModel) erro model.AreaId = areaId model.InternetAccess = types.BoolPointerValue(projectResp.InternetAccess) - model.State = types.StringPointerValue(projectResp.Status) - model.Status = types.StringPointerValue(projectResp.Status) + model.State = types.StringValue(projectResp.Status) + model.Status = types.StringValue(projectResp.Status) model.CreatedAt = createdAt model.UpdatedAt = updatedAt return nil diff --git a/stackit/internal/services/iaas/project/datasource_test.go b/stackit/internal/services/iaas/project/datasource_test.go index 74481b378..449be0790 100644 --- a/stackit/internal/services/iaas/project/datasource_test.go +++ b/stackit/internal/services/iaas/project/datasource_test.go @@ -6,8 +6,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/stackitcloud/stackit-sdk-go/core/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" //nolint:staticcheck // TODO: will be done within STACKITTPR-713 + iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" ) const ( @@ -34,11 +33,14 @@ func TestMapDataSourceFields(t *testing.T) { ProjectId: types.StringValue(projectId), }, input: &iaas.Project{ - Id: utils.Ptr(projectId), + Id: projectId, + Status: "CREATED", }, expected: &DatasourceModel{ Id: types.StringValue(projectId), ProjectId: types.StringValue(projectId), + State: types.StringValue("CREATED"), + Status: types.StringValue("CREATED"), }, isValid: true, }, @@ -48,11 +50,11 @@ func TestMapDataSourceFields(t *testing.T) { ProjectId: types.StringValue(projectId), }, input: &iaas.Project{ - AreaId: new(iaas.AreaId{String: new("aid")}), + AreaId: iaas.AreaId{String: new("aid")}, CreatedAt: new(testTimestamp()), InternetAccess: new(true), - Id: utils.Ptr(projectId), - Status: new("CREATED"), + Id: projectId, + Status: "CREATED", UpdatedAt: new(testTimestamp()), }, expected: &DatasourceModel{ @@ -73,15 +75,18 @@ func TestMapDataSourceFields(t *testing.T) { ProjectId: types.StringValue(projectId), }, input: &iaas.Project{ - AreaId: new(iaas.AreaId{ + AreaId: iaas.AreaId{ StaticAreaID: iaas.STATICAREAID_PUBLIC.Ptr(), //nolint:staticcheck // TODO: will be done within STACKITTPR-713 - }), - Id: utils.Ptr(projectId), + }, + Id: projectId, + Status: "CREATED", }, expected: &DatasourceModel{ Id: types.StringValue(projectId), ProjectId: types.StringValue(projectId), AreaId: types.StringValue("PUBLIC"), + State: types.StringValue("CREATED"), + Status: types.StringValue("CREATED"), }, isValid: true, }, diff --git a/stackit/internal/services/iaas/publicip/datasource.go b/stackit/internal/services/iaas/publicip/datasource.go index 2acf98f05..d8978c903 100644 --- a/stackit/internal/services/iaas/publicip/datasource.go +++ b/stackit/internal/services/iaas/publicip/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -32,7 +29,7 @@ func NewPublicIpDataSource() datasource.DataSource { // publicIpDataSource is the data source implementation. type publicIpDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -42,17 +39,14 @@ func (d *publicIpDataSource) Metadata(_ context.Context, req datasource.Metadata } func (d *publicIpDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -127,7 +121,7 @@ func (d *publicIpDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "public_ip_id", publicIpId) - publicIpResp, err := d.client.DefaultAPI.GetPublicIP(ctx, projectId, region, publicIpId).Execute() + publicIpResp, err := d.client.GetPublicIP(ctx, projectId, region, publicIpId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/publicip/resource.go b/stackit/internal/services/iaas/publicip/resource.go index 507a182f8..864c0f4d3 100644 --- a/stackit/internal/services/iaas/publicip/resource.go +++ b/stackit/internal/services/iaas/publicip/resource.go @@ -51,7 +51,7 @@ func NewPublicIpResource() resource.Resource { // publicIpResource is the resource implementation. type publicIpResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -93,16 +93,14 @@ func (r *publicIpResource) ModifyPlan(ctx context.Context, req resource.ModifyPl // Configure adds the provider configured client to the resource. func (r *publicIpResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -205,7 +203,7 @@ func (r *publicIpResource) Create(ctx context.Context, req resource.CreateReques // Create new public IP - publicIp, err := r.client.DefaultAPI.CreatePublicIP(ctx, projectId, region).CreatePublicIPPayload(*payload).Execute() + publicIp, err := r.client.CreatePublicIP(ctx, projectId, region).CreatePublicIPPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating public IP", fmt.Sprintf("Calling API: %v", err)) return @@ -253,7 +251,7 @@ func (r *publicIpResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "public_ip_id", publicIpId) - publicIpResp, err := r.client.DefaultAPI.GetPublicIP(ctx, projectId, region, publicIpId).Execute() + publicIpResp, err := r.client.GetPublicIP(ctx, projectId, region, publicIpId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -315,7 +313,7 @@ func (r *publicIpResource) Update(ctx context.Context, req resource.UpdateReques return } // Update existing public IP - updatedPublicIp, err := r.client.DefaultAPI.UpdatePublicIP(ctx, projectId, region, publicIpId).UpdatePublicIPPayload(*payload).Execute() + updatedPublicIp, err := r.client.UpdatePublicIP(ctx, projectId, region, publicIpId).UpdatePublicIPPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating public IP", fmt.Sprintf("Calling API: %v", err)) return @@ -357,7 +355,7 @@ func (r *publicIpResource) Delete(ctx context.Context, req resource.DeleteReques ctx = tflog.SetField(ctx, "public_ip_id", publicIpId) // Delete existing publicIp - err := r.client.DefaultAPI.DeletePublicIP(ctx, projectId, region, publicIpId).Execute() + err := r.client.DeletePublicIP(ctx, projectId, region, publicIpId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/iaas/publicipassociate/resource.go b/stackit/internal/services/iaas/publicipassociate/resource.go index 216f11647..33bd6bd06 100644 --- a/stackit/internal/services/iaas/publicipassociate/resource.go +++ b/stackit/internal/services/iaas/publicipassociate/resource.go @@ -9,8 +9,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" @@ -50,7 +48,7 @@ func NewPublicIpAssociateResource() resource.Resource { // publicIpAssociateResource is the resource implementation. type publicIpAssociateResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -91,21 +89,17 @@ func (r *publicIpAssociateResource) ModifyPlan(ctx context.Context, req resource // Configure adds the provider configured client to the resource. func (r *publicIpAssociateResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + r.providerData = providerData + r.client = clients.IaaSv2Client core.LogAndAddWarning(ctx, &resp.Diagnostics, "The `stackit_public_ip_associate` resource should not be used together with the `stackit_public_ip` resource for the same public IP or for the same network interface.", "Using both resources together for the same public IP or network interface WILL lead to conflicts, as they both have control of the public IP and network interface association.") - r.client = apiClient tflog.Info(ctx, "iaas client configured") } @@ -213,7 +207,7 @@ func (r *publicIpAssociateResource) Create(ctx context.Context, req resource.Cre return } // Update existing public IP - updatedPublicIp, err := r.client.DefaultAPI.UpdatePublicIP(ctx, projectId, region, publicIpId).UpdatePublicIPPayload(*payload).Execute() + updatedPublicIp, err := r.client.UpdatePublicIP(ctx, projectId, region, publicIpId).UpdatePublicIPPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error associating public IP to network interface", fmt.Sprintf("Calling API: %v", err)) return @@ -254,7 +248,7 @@ func (r *publicIpAssociateResource) Read(ctx context.Context, req resource.ReadR ctx = tflog.SetField(ctx, "public_ip_id", publicIpId) ctx = tflog.SetField(ctx, "network_interface_id", networkInterfaceId) - publicIpResp, err := r.client.DefaultAPI.GetPublicIP(ctx, projectId, region, publicIpId).Execute() + publicIpResp, err := r.client.GetPublicIP(ctx, projectId, region, publicIpId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -313,7 +307,7 @@ func (r *publicIpAssociateResource) Delete(ctx context.Context, req resource.Del NetworkInterface: *iaas.NewNullableString(nil), } - _, err := r.client.DefaultAPI.UpdatePublicIP(ctx, projectId, region, publicIpId).UpdatePublicIPPayload(*payload).Execute() + _, err := r.client.UpdatePublicIP(ctx, projectId, region, publicIpId).UpdatePublicIPPayload(*payload).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/iaas/publicipranges/datasource.go b/stackit/internal/services/iaas/publicipranges/datasource.go index 826f89ff9..2a375c012 100644 --- a/stackit/internal/services/iaas/publicipranges/datasource.go +++ b/stackit/internal/services/iaas/publicipranges/datasource.go @@ -6,9 +6,6 @@ import ( "net/http" "sort" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" @@ -36,7 +33,7 @@ func NewPublicIpRangesDataSource() datasource.DataSource { // publicIpRangesDataSource is the data source implementation. type publicIpRangesDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI } type Model struct { @@ -55,16 +52,13 @@ func (d *publicIpRangesDataSource) Metadata(_ context.Context, req datasource.Me } func (d *publicIpRangesDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -119,7 +113,7 @@ func (d *publicIpRangesDataSource) Read(ctx context.Context, req datasource.Read ctx = core.InitProviderContext(ctx) - publicIpRangeResp, err := d.client.DefaultAPI.ListPublicIPRanges(ctx).Execute() + publicIpRangeResp, err := d.client.ListPublicIPRanges(ctx).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/routingtable/route/datasource.go b/stackit/internal/services/iaas/routingtable/route/datasource.go index 9c68b670d..95c70943d 100644 --- a/stackit/internal/services/iaas/routingtable/route/datasource.go +++ b/stackit/internal/services/iaas/routingtable/route/datasource.go @@ -10,11 +10,9 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" shared "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/routingtable/shared" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) @@ -30,7 +28,7 @@ func NewRoutingTableRouteDataSource() datasource.DataSource { // routingTableRouteDataSource is the data source implementation. type routingTableRouteDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -40,22 +38,19 @@ func (d *routingTableRouteDataSource) Metadata(_ context.Context, req datasource } func (d *routingTableRouteDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.providerData = providerData + d.client = clients.IaaSv2Client + features.CheckExperimentEnabled(ctx, &d.providerData, features.RoutingTablesExperiment, "stackit_routing_table_route", core.Datasource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient tflog.Info(ctx, "IaaS client configured") } @@ -92,7 +87,7 @@ func (d *routingTableRouteDataSource) Read(ctx context.Context, req datasource.R ctx = tflog.SetField(ctx, "network_area_id", networkAreaId) ctx = tflog.SetField(ctx, "route_id", routeId) - routeResp, err := d.client.DefaultAPI.GetRouteOfRoutingTable(ctx, organizationId, networkAreaId, region, routingTableId, routeId).Execute() + routeResp, err := d.client.GetRouteOfRoutingTable(ctx, organizationId, networkAreaId, region, routingTableId, routeId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, err.Error(), err.Error()) utils.LogError( diff --git a/stackit/internal/services/iaas/routingtable/route/resource.go b/stackit/internal/services/iaas/routingtable/route/resource.go index 66a60d77d..870b0494f 100644 --- a/stackit/internal/services/iaas/routingtable/route/resource.go +++ b/stackit/internal/services/iaas/routingtable/route/resource.go @@ -10,9 +10,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/routingtable/shared" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" @@ -23,6 +20,8 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types/basetypes" "github.com/hashicorp/terraform-plugin-log/tflog" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/routingtable/shared" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" @@ -45,7 +44,7 @@ func NewRoutingTableRouteResource() resource.Resource { // routeResource is the resource implementation. type routeResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -57,21 +56,19 @@ func (r *routeResource) Metadata(_ context.Context, req resource.MetadataRequest // Configure adds the provider configured client to the resource. func (r *routeResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.IaaSv2Client + features.CheckExperimentEnabled(ctx, &r.providerData, features.RoutingTablesExperiment, "stackit_routing_table_route", core.Resource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "IaaS alpha client configured") } @@ -267,7 +264,7 @@ func (r *routeResource) Create(ctx context.Context, req resource.CreateRequest, return } - routeResp, err := r.client.DefaultAPI.AddRoutesToRoutingTable(ctx, organizationId, networkAreaId, region, routingTableId).AddRoutesToRoutingTablePayload(*payload).Execute() + routeResp, err := r.client.AddRoutesToRoutingTable(ctx, organizationId, networkAreaId, region, routingTableId).AddRoutesToRoutingTablePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating routing table route", fmt.Sprintf("Calling API: %v", err)) return @@ -319,7 +316,7 @@ func (r *routeResource) Read(ctx context.Context, req resource.ReadRequest, resp ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "route_id", routeId) - routeResp, err := r.client.DefaultAPI.GetRouteOfRoutingTable(ctx, organizationId, networkAreaId, region, routingTableId, routeId).Execute() + routeResp, err := r.client.GetRouteOfRoutingTable(ctx, organizationId, networkAreaId, region, routingTableId, routeId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -387,7 +384,7 @@ func (r *routeResource) Update(ctx context.Context, req resource.UpdateRequest, return } - route, err := r.client.DefaultAPI.UpdateRouteOfRoutingTable(ctx, organizationId, networkAreaId, region, routingTableId, routeId).UpdateRouteOfRoutingTablePayload(*payload).Execute() + route, err := r.client.UpdateRouteOfRoutingTable(ctx, organizationId, networkAreaId, region, routingTableId, routeId).UpdateRouteOfRoutingTablePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating routing table route", fmt.Sprintf("Calling API: %v", err)) return @@ -434,7 +431,7 @@ func (r *routeResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = tflog.SetField(ctx, "region", region) // Delete existing routing table route - err := r.client.DefaultAPI.DeleteRouteFromRoutingTable(ctx, organizationId, networkAreaId, region, routingTableId, routeId).Execute() + err := r.client.DeleteRouteFromRoutingTable(ctx, organizationId, networkAreaId, region, routingTableId, routeId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/iaas/routingtable/routes/datasource.go b/stackit/internal/services/iaas/routingtable/routes/datasource.go index e54290cac..78babf78b 100644 --- a/stackit/internal/services/iaas/routingtable/routes/datasource.go +++ b/stackit/internal/services/iaas/routingtable/routes/datasource.go @@ -13,11 +13,9 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" shared "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/routingtable/shared" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) @@ -42,7 +40,7 @@ func NewRoutingTableRoutesDataSource() datasource.DataSource { // routingTableDataSource is the data source implementation. type routingTableRoutesDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -52,22 +50,19 @@ func (d *routingTableRoutesDataSource) Metadata(_ context.Context, req datasourc } func (d *routingTableRoutesDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.providerData = providerData + d.client = clients.IaaSv2Client + features.CheckExperimentEnabled(ctx, &d.providerData, features.RoutingTablesExperiment, "stackit_routing_table_routes", core.Datasource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient tflog.Info(ctx, "IaaS client configured") } @@ -102,7 +97,7 @@ func (d *routingTableRoutesDataSource) Read(ctx context.Context, req datasource. ctx = tflog.SetField(ctx, "network_area_id", networkAreaId) ctx = tflog.SetField(ctx, "routing_table_id", routingTableId) - routesResp, err := d.client.DefaultAPI.ListRoutesOfRoutingTable(ctx, organizationId, networkAreaId, region, routingTableId).Execute() + routesResp, err := d.client.ListRoutesOfRoutingTable(ctx, organizationId, networkAreaId, region, routingTableId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/routingtable/table/datasource.go b/stackit/internal/services/iaas/routingtable/table/datasource.go index e720885ec..75f3861d9 100644 --- a/stackit/internal/services/iaas/routingtable/table/datasource.go +++ b/stackit/internal/services/iaas/routingtable/table/datasource.go @@ -9,15 +9,12 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/routingtable/shared" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" @@ -35,7 +32,7 @@ func NewRoutingTableDataSource() datasource.DataSource { // routingTableDataSource is the data source implementation. type routingTableDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -45,22 +42,19 @@ func (d *routingTableDataSource) Metadata(_ context.Context, req datasource.Meta } func (d *routingTableDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.providerData = providerData + d.client = clients.IaaSv2Client + features.CheckExperimentEnabled(ctx, &d.providerData, features.RoutingTablesExperiment, "stackit_routing_table", core.Datasource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient tflog.Info(ctx, "IaaS client configured") } @@ -95,7 +89,7 @@ func (d *routingTableDataSource) Read(ctx context.Context, req datasource.ReadRe ctx = tflog.SetField(ctx, "routing_table_id", routingTableId) ctx = tflog.SetField(ctx, "network_area_id", networkAreaId) - routingTableResp, err := d.client.DefaultAPI.GetRoutingTableOfArea(ctx, organizationId, networkAreaId, region, routingTableId).Execute() + routingTableResp, err := d.client.GetRoutingTableOfArea(ctx, organizationId, networkAreaId, region, routingTableId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/routingtable/table/resource.go b/stackit/internal/services/iaas/routingtable/table/resource.go index f63fcefeb..5f8ee84a0 100644 --- a/stackit/internal/services/iaas/routingtable/table/resource.go +++ b/stackit/internal/services/iaas/routingtable/table/resource.go @@ -61,7 +61,7 @@ func NewRoutingTableResource() resource.Resource { // routingTableResource is the resource implementation. type routingTableResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -72,22 +72,19 @@ func (r *routingTableResource) Metadata(_ context.Context, req resource.Metadata // Configure adds the provider configured client to the resource. func (r *routingTableResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.IaaSv2Client + features.CheckExperimentEnabled(ctx, &r.providerData, features.RoutingTablesExperiment, "stackit_routing_table", core.Resource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "IaaS alpha client configured") } @@ -251,7 +248,7 @@ func (r *routingTableResource) Create(ctx context.Context, req resource.CreateRe return } - routingTable, err := r.client.DefaultAPI.AddRoutingTableToArea(ctx, organizationId, networkAreaId, region).AddRoutingTableToAreaPayload(*payload).Execute() + routingTable, err := r.client.AddRoutingTableToArea(ctx, organizationId, networkAreaId, region).AddRoutingTableToAreaPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating routing table", fmt.Sprintf("Calling API: %v", err)) return @@ -300,7 +297,7 @@ func (r *routingTableResource) Read(ctx context.Context, req resource.ReadReques ctx = tflog.SetField(ctx, "routing_table_id", routingTableId) ctx = tflog.SetField(ctx, "network_area_id", networkAreaId) - routingTableResp, err := r.client.DefaultAPI.GetRoutingTableOfArea(ctx, organizationId, networkAreaId, region, routingTableId).Execute() + routingTableResp, err := r.client.GetRoutingTableOfArea(ctx, organizationId, networkAreaId, region, routingTableId).Execute() if err != nil { utils.LogError( ctx, @@ -370,7 +367,7 @@ func (r *routingTableResource) Update(ctx context.Context, req resource.UpdateRe return } - routingTable, err := r.client.DefaultAPI.UpdateRoutingTableOfArea(ctx, organizationId, networkAreaId, region, routingTableId).UpdateRoutingTableOfAreaPayload(*payload).Execute() + routingTable, err := r.client.UpdateRoutingTableOfArea(ctx, organizationId, networkAreaId, region, routingTableId).UpdateRoutingTableOfAreaPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating routing table", fmt.Sprintf("Calling API: %v", err)) return @@ -415,7 +412,7 @@ func (r *routingTableResource) Delete(ctx context.Context, req resource.DeleteRe ctx = tflog.SetField(ctx, "network_area_id", networkAreaId) // Delete existing routing table - err := r.client.DefaultAPI.DeleteRoutingTableFromArea(ctx, organizationId, networkAreaId, region, routingTableId).Execute() + err := r.client.DeleteRoutingTableFromArea(ctx, organizationId, networkAreaId, region, routingTableId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/iaas/routingtable/tables/datasource.go b/stackit/internal/services/iaas/routingtable/tables/datasource.go index 4c3c03733..e4b82d7c4 100644 --- a/stackit/internal/services/iaas/routingtable/tables/datasource.go +++ b/stackit/internal/services/iaas/routingtable/tables/datasource.go @@ -7,9 +7,6 @@ import ( iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/routingtable/shared" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" @@ -17,7 +14,8 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/routingtable/shared" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" @@ -44,7 +42,7 @@ func NewRoutingTablesDataSource() datasource.DataSource { // routingTableDataSource is the data source implementation. type routingTablesDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -54,22 +52,19 @@ func (d *routingTablesDataSource) Metadata(_ context.Context, req datasource.Met } func (d *routingTablesDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.providerData = providerData + d.client = clients.IaaSv2Client + features.CheckExperimentEnabled(ctx, &d.providerData, features.RoutingTablesExperiment, "stackit_routing_tables", core.Datasource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient tflog.Info(ctx, "IaaS client configured") } @@ -135,7 +130,7 @@ func (d *routingTablesDataSource) Read(ctx context.Context, req datasource.ReadR ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "network_area_id", networkAreaId) - routingTablesResp, err := d.client.DefaultAPI.ListRoutingTablesOfArea(ctx, organizationId, networkAreaId, region).Execute() + routingTablesResp, err := d.client.ListRoutingTablesOfArea(ctx, organizationId, networkAreaId, region).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/securitygroup/datasource.go b/stackit/internal/services/iaas/securitygroup/datasource.go index 71e1209a0..74f0cf7d9 100644 --- a/stackit/internal/services/iaas/securitygroup/datasource.go +++ b/stackit/internal/services/iaas/securitygroup/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -32,7 +29,7 @@ func NewSecurityGroupDataSource() datasource.DataSource { // securityGroupDataSource is the data source implementation. type securityGroupDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -42,17 +39,14 @@ func (d *securityGroupDataSource) Metadata(_ context.Context, req datasource.Met } func (d *securityGroupDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -127,7 +121,7 @@ func (d *securityGroupDataSource) Read(ctx context.Context, req datasource.ReadR ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "security_group_id", securityGroupId) - securityGroupResp, err := d.client.DefaultAPI.GetSecurityGroup(ctx, projectId, region, securityGroupId).Execute() + securityGroupResp, err := d.client.GetSecurityGroup(ctx, projectId, region, securityGroupId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/securitygroup/resource.go b/stackit/internal/services/iaas/securitygroup/resource.go index ae7afb505..9d008532b 100644 --- a/stackit/internal/services/iaas/securitygroup/resource.go +++ b/stackit/internal/services/iaas/securitygroup/resource.go @@ -55,7 +55,7 @@ func NewSecurityGroupResource() resource.Resource { // securityGroupResource is the resource implementation. type securityGroupResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -96,17 +96,14 @@ func (r *securityGroupResource) ModifyPlan(ctx context.Context, req resource.Mod // Configure adds the provider configured client to the resource. func (r *securityGroupResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -222,7 +219,7 @@ func (r *securityGroupResource) Create(ctx context.Context, req resource.CreateR // Create new security group - securityGroup, err := r.client.DefaultAPI.CreateSecurityGroup(ctx, projectId, region).CreateSecurityGroupPayload(*payload).Execute() + securityGroup, err := r.client.CreateSecurityGroup(ctx, projectId, region).CreateSecurityGroupPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating security group", fmt.Sprintf("Calling API: %v", err)) return @@ -272,7 +269,7 @@ func (r *securityGroupResource) Read(ctx context.Context, req resource.ReadReque ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "security_id", securityGroupId) - securityGroupResp, err := r.client.DefaultAPI.GetSecurityGroup(ctx, projectId, region, securityGroupId).Execute() + securityGroupResp, err := r.client.GetSecurityGroup(ctx, projectId, region, securityGroupId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -334,7 +331,7 @@ func (r *securityGroupResource) Update(ctx context.Context, req resource.UpdateR return } // Update existing security group - updatedSecurityGroup, err := r.client.DefaultAPI.UpdateSecurityGroup(ctx, projectId, region, securityGroupId).UpdateSecurityGroupPayload(*payload).Execute() + updatedSecurityGroup, err := r.client.UpdateSecurityGroup(ctx, projectId, region, securityGroupId).UpdateSecurityGroupPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating security group", fmt.Sprintf("Calling API: %v", err)) return @@ -376,7 +373,7 @@ func (r *securityGroupResource) Delete(ctx context.Context, req resource.DeleteR ctx = tflog.SetField(ctx, "security_group_id", securityGroupId) // Delete existing security group - err := r.client.DefaultAPI.DeleteSecurityGroup(ctx, projectId, region, securityGroupId).Execute() + err := r.client.DeleteSecurityGroup(ctx, projectId, region, securityGroupId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/iaas/securitygrouprule/datasource.go b/stackit/internal/services/iaas/securitygrouprule/datasource.go index 0093525e8..76438867a 100644 --- a/stackit/internal/services/iaas/securitygrouprule/datasource.go +++ b/stackit/internal/services/iaas/securitygrouprule/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -31,7 +28,7 @@ func NewSecurityGroupRuleDataSource() datasource.DataSource { // securityGroupRuleDataSource is the data source implementation. type securityGroupRuleDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -41,17 +38,14 @@ func (d *securityGroupRuleDataSource) Metadata(_ context.Context, req datasource } func (d *securityGroupRuleDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -183,7 +177,7 @@ func (d *securityGroupRuleDataSource) Read(ctx context.Context, req datasource.R ctx = tflog.SetField(ctx, "security_group_id", securityGroupId) ctx = tflog.SetField(ctx, "security_group_rule_id", securityGroupRuleId) - securityGroupRuleResp, err := d.client.DefaultAPI.GetSecurityGroupRule(ctx, projectId, region, securityGroupId, securityGroupRuleId).Execute() + securityGroupRuleResp, err := d.client.GetSecurityGroupRule(ctx, projectId, region, securityGroupId, securityGroupRuleId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/securitygrouprule/resource.go b/stackit/internal/services/iaas/securitygrouprule/resource.go index 70982b74c..74a07e078 100644 --- a/stackit/internal/services/iaas/securitygrouprule/resource.go +++ b/stackit/internal/services/iaas/securitygrouprule/resource.go @@ -9,8 +9,6 @@ import ( "slices" "strings" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/int64validator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/attr" @@ -104,7 +102,7 @@ func NewSecurityGroupRuleResource() resource.Resource { // securityGroupRuleResource is the resource implementation. type securityGroupRuleResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -145,17 +143,14 @@ func (r *securityGroupRuleResource) ModifyPlan(ctx context.Context, req resource // Configure adds the provider configured client to the resource. func (r *securityGroupRuleResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -482,7 +477,7 @@ func (r *securityGroupRuleResource) Create(ctx context.Context, req resource.Cre } // Create new security group rule - securityGroupRule, err := r.client.DefaultAPI.CreateSecurityGroupRule(ctx, projectId, region, securityGroupId).CreateSecurityGroupRulePayload(*payload).Execute() + securityGroupRule, err := r.client.CreateSecurityGroupRule(ctx, projectId, region, securityGroupId).CreateSecurityGroupRulePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating security group rule", fmt.Sprintf("Calling API: %v", err)) return @@ -532,7 +527,7 @@ func (r *securityGroupRuleResource) Read(ctx context.Context, req resource.ReadR ctx = tflog.SetField(ctx, "security_group_id", securityGroupId) ctx = tflog.SetField(ctx, "security_group_rule_id", securityGroupRuleId) - securityGroupRuleResp, err := r.client.DefaultAPI.GetSecurityGroupRule(ctx, projectId, region, securityGroupId, securityGroupRuleId).Execute() + securityGroupRuleResp, err := r.client.GetSecurityGroupRule(ctx, projectId, region, securityGroupId, securityGroupRuleId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -589,7 +584,7 @@ func (r *securityGroupRuleResource) Delete(ctx context.Context, req resource.Del ctx = tflog.SetField(ctx, "security_group_rule_id", securityGroupRuleId) // Delete existing security group rule - err := r.client.DefaultAPI.DeleteSecurityGroupRule(ctx, projectId, region, securityGroupId, securityGroupRuleId).Execute() + err := r.client.DeleteSecurityGroupRule(ctx, projectId, region, securityGroupId, securityGroupRuleId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/iaas/server/datasource.go b/stackit/internal/services/iaas/server/datasource.go index 032bebc9c..e15cf3c68 100644 --- a/stackit/internal/services/iaas/server/datasource.go +++ b/stackit/internal/services/iaas/server/datasource.go @@ -7,7 +7,6 @@ import ( "net/http" "time" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" "github.com/hashicorp/terraform-plugin-framework/attr" @@ -66,7 +65,7 @@ func NewServerDataSource() datasource.DataSource { // serverDataSource is the data source implementation. type serverDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -76,17 +75,14 @@ func (d *serverDataSource) Metadata(_ context.Context, req datasource.MetadataRe } func (d *serverDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -218,7 +214,7 @@ func (d *serverDataSource) Read(ctx context.Context, req datasource.ReadRequest, ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "server_id", serverId) - serverReq := d.client.DefaultAPI.GetServer(ctx, projectId, region, serverId) + serverReq := d.client.GetServer(ctx, projectId, region, serverId) serverReq = serverReq.Details(true) serverResp, err := serverReq.Execute() if err != nil { diff --git a/stackit/internal/services/iaas/server/resource.go b/stackit/internal/services/iaas/server/resource.go index 552126f88..6b9a78cf4 100644 --- a/stackit/internal/services/iaas/server/resource.go +++ b/stackit/internal/services/iaas/server/resource.go @@ -120,7 +120,7 @@ func NewServerResource() resource.Resource { // serverResource is the resource implementation. type serverResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -202,17 +202,14 @@ func (r *serverResource) ConfigValidators(_ context.Context) []resource.ConfigVa // Configure adds the provider configured client to the resource. func (r *serverResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -541,7 +538,7 @@ func (r *serverResource) Create(ctx context.Context, req resource.CreateRequest, // Create new server - server, err := r.client.DefaultAPI.CreateServer(ctx, projectId, region).CreateServerPayload(*payload).Execute() + server, err := r.client.CreateServer(ctx, projectId, region).CreateServerPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating server", fmt.Sprintf("Calling API: %v", err)) return @@ -564,14 +561,14 @@ func (r *serverResource) Create(ctx context.Context, req resource.CreateRequest, return } - _, err = wait.CreateServerWaitHandler(ctx, r.client.DefaultAPI, projectId, region, serverId).WaitWithContext(ctx) + _, err = wait.CreateServerWaitHandler(ctx, r.client, projectId, region, serverId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating server", fmt.Sprintf("server creation waiting: %v", err)) return } // Get Server with details - serverReq := r.client.DefaultAPI.GetServer(ctx, projectId, region, serverId) + serverReq := r.client.GetServer(ctx, projectId, region, serverId) serverReq = serverReq.Details(true) server, err = serverReq.Execute() if err != nil { @@ -585,7 +582,7 @@ func (r *serverResource) Create(ctx context.Context, req resource.CreateRequest, return } - if err := updateServerStatus(ctx, r.client.DefaultAPI, server.Status, &model, region); err != nil { + if err := updateServerStatus(ctx, r.client, server.Status, &model, region); err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating server", fmt.Sprintf("update server state: %v", err)) return } @@ -724,7 +721,7 @@ func (r *serverResource) Read(ctx context.Context, req resource.ReadRequest, res ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "server_id", serverId) - serverReq := r.client.DefaultAPI.GetServer(ctx, projectId, region, serverId) + serverReq := r.client.GetServer(ctx, projectId, region, serverId) serverReq = serverReq.Details(true) serverResp, err := serverReq.Execute() if err != nil { @@ -765,7 +762,7 @@ func (r *serverResource) updateServerAttributes(ctx context.Context, model, stat var updatedServer *iaas.Server // Update existing server - updatedServer, err = r.client.DefaultAPI.UpdateServer(ctx, projectId, region, serverId).UpdateServerPayload(*payload).Execute() + updatedServer, err = r.client.UpdateServer(ctx, projectId, region, serverId).UpdateServerPayload(*payload).Execute() if err != nil { return nil, fmt.Errorf("calling API: %w", err) } @@ -776,12 +773,12 @@ func (r *serverResource) updateServerAttributes(ctx context.Context, model, stat payload := iaas.ResizeServerPayload{ MachineType: *modelMachineType, } - err := r.client.DefaultAPI.ResizeServer(ctx, projectId, region, serverId).ResizeServerPayload(payload).Execute() + err := r.client.ResizeServer(ctx, projectId, region, serverId).ResizeServerPayload(payload).Execute() if err != nil { return nil, fmt.Errorf("resizing the server, calling API: %w", err) } - _, err = wait.ResizeServerWaitHandler(ctx, r.client.DefaultAPI, projectId, region, serverId).WaitWithContext(ctx) + _, err = wait.ResizeServerWaitHandler(ctx, r.client, projectId, region, serverId).WaitWithContext(ctx) if err != nil { return nil, fmt.Errorf("server resize waiting: %w", err) } @@ -822,7 +819,7 @@ func (r *serverResource) Update(ctx context.Context, req resource.UpdateRequest, server *iaas.Server err error ) - if server, err = r.client.DefaultAPI.GetServer(ctx, projectId, region, serverId).Execute(); err != nil { + if server, err = r.client.GetServer(ctx, projectId, region, serverId).Execute(); err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error retrieving server state", fmt.Sprintf("Getting server state: %v", err)) } @@ -837,13 +834,13 @@ func (r *serverResource) Update(ctx context.Context, req resource.UpdateRequest, ctx = core.LogResponse(ctx) - if err := updateServerStatus(ctx, r.client.DefaultAPI, server.Status, &model, region); err != nil { + if err := updateServerStatus(ctx, r.client, server.Status, &model, region); err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating server", err.Error()) return } } else { // potentially unfreeze first and update afterwards - if err := updateServerStatus(ctx, r.client.DefaultAPI, server.Status, &model, region); err != nil { + if err := updateServerStatus(ctx, r.client, server.Status, &model, region); err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating server", err.Error()) return } @@ -858,7 +855,7 @@ func (r *serverResource) Update(ctx context.Context, req resource.UpdateRequest, } // Re-fetch the server data, to get the details values. - serverReq := r.client.DefaultAPI.GetServer(ctx, projectId, region, serverId) + serverReq := r.client.GetServer(ctx, projectId, region, serverId) serverReq = serverReq.Details(true) updatedServer, err := serverReq.Execute() if err != nil { @@ -901,7 +898,7 @@ func (r *serverResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = tflog.SetField(ctx, "server_id", serverId) // Delete existing server - err := r.client.DefaultAPI.DeleteServer(ctx, projectId, region, serverId).Execute() + err := r.client.DeleteServer(ctx, projectId, region, serverId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -914,7 +911,7 @@ func (r *serverResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = core.LogResponse(ctx) - _, err = wait.DeleteServerWaitHandler(ctx, r.client.DefaultAPI, projectId, region, serverId).WaitWithContext(ctx) + _, err = wait.DeleteServerWaitHandler(ctx, r.client, projectId, region, serverId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting server", fmt.Sprintf("server deletion waiting: %v", err)) return diff --git a/stackit/internal/services/iaas/serviceaccountattach/resource.go b/stackit/internal/services/iaas/serviceaccountattach/resource.go index d2cceddee..8872d3ddd 100644 --- a/stackit/internal/services/iaas/serviceaccountattach/resource.go +++ b/stackit/internal/services/iaas/serviceaccountattach/resource.go @@ -9,9 +9,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" @@ -49,7 +46,7 @@ func NewServiceAccountAttachResource() resource.Resource { // serviceAccountAttachResource is the resource implementation. type serviceAccountAttachResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -90,17 +87,14 @@ func (r *serviceAccountAttachResource) ModifyPlan(ctx context.Context, req resou // Configure adds the provider configured client to the resource. func (r *serviceAccountAttachResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -182,7 +176,7 @@ func (r *serviceAccountAttachResource) Create(ctx context.Context, req resource. ctx = tflog.SetField(ctx, "service_account_email", serviceAccountEmail) // Create new service account attachment - _, err := r.client.DefaultAPI.AddServiceAccountToServer(ctx, projectId, region, serverId, serviceAccountEmail).Execute() + _, err := r.client.AddServiceAccountToServer(ctx, projectId, region, serverId, serviceAccountEmail).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error attaching service account to server", fmt.Sprintf("Calling API: %v", err)) return @@ -222,7 +216,7 @@ func (r *serviceAccountAttachResource) Read(ctx context.Context, req resource.Re ctx = tflog.SetField(ctx, "server_id", serverId) ctx = tflog.SetField(ctx, "service_account_email", serviceAccountEmail) - serviceAccounts, err := r.client.DefaultAPI.ListServerServiceAccounts(ctx, projectId, region, serverId).Execute() + serviceAccounts, err := r.client.ListServerServiceAccounts(ctx, projectId, region, serverId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -290,7 +284,7 @@ func (r *serviceAccountAttachResource) Delete(ctx context.Context, req resource. ctx = tflog.SetField(ctx, "service_account_email", service_accountId) // Remove service_account from server - _, err := r.client.DefaultAPI.RemoveServiceAccountFromServer(ctx, projectId, region, serverId, service_accountId).Execute() + _, err := r.client.RemoveServiceAccountFromServer(ctx, projectId, region, serverId, service_accountId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/iaas/utils/util.go b/stackit/internal/services/iaas/utils/util.go index a5f846de2..b52327ff3 100644 --- a/stackit/internal/services/iaas/utils/util.go +++ b/stackit/internal/services/iaas/utils/util.go @@ -11,50 +11,12 @@ import ( "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/stackitcloud/stackit-sdk-go/core/config" - iaasLegacy "github.com/stackitcloud/stackit-sdk-go/services/iaas" //nolint:staticcheck // TODO: will be done within STACKITTPR-713 - iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" + + //nolint:staticcheck // TODO: will be done within STACKITTPR-713 "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *iaas.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.IaaSCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.IaaSCustomEndpoint)) - } - - apiClient, err := iaas.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} - -// Deprecated: Use ConfigureClient instead -func ConfigureClientLegacy(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *iaasLegacy.APIClient { //nolint:staticcheck // TODO: will be done within STACKITTPR-713 - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.IaaSCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.IaaSCustomEndpoint)) - } - - apiClient, err := iaasLegacy.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} - func MapLabels(ctx context.Context, responseLabels map[string]any, currentLabels types.Map) (basetypes.MapValue, error) { //nolint:gocritic // Linter wants to have a non-pointer type for the map, but this would mean a nil check has to be done before every usage of this func. labelsTF, diags := types.MapValueFrom(ctx, types.StringType, map[string]any{}) if diags.HasError() { diff --git a/stackit/internal/services/iaas/utils/util_test.go b/stackit/internal/services/iaas/utils/util_test.go index c1adfbe79..029260d83 100644 --- a/stackit/internal/services/iaas/utils/util_test.go +++ b/stackit/internal/services/iaas/utils/util_test.go @@ -3,176 +3,16 @@ package utils import ( "context" "net/http" - "os" "reflect" "testing" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-framework/types/basetypes" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api/wait" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" "github.com/stackitcloud/stackit-sdk-go/core/config" - iaasLegacy "github.com/stackitcloud/stackit-sdk-go/services/iaas" //nolint:staticcheck // TODO: will be done within STACKITTPR-713 - iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://iaas-custom-endpoint.api.stackit.cloud" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api/wait" ) -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *iaas.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *iaas.APIClient { - apiClient, err := iaas.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - IaaSCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *iaas.APIClient { - apiClient, err := iaas.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} - -func TestConfigureClientLegacy(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *iaasLegacy.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *iaasLegacy.APIClient { - apiClient, err := iaasLegacy.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - IaaSCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *iaasLegacy.APIClient { - apiClient, err := iaasLegacy.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClientLegacy(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} - func TestMapLabels(t *testing.T) { type args struct { responseLabels map[string]any diff --git a/stackit/internal/services/iaas/volume/datasource.go b/stackit/internal/services/iaas/volume/datasource.go index f276a8bf4..df175890a 100644 --- a/stackit/internal/services/iaas/volume/datasource.go +++ b/stackit/internal/services/iaas/volume/datasource.go @@ -9,7 +9,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/types/basetypes" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" "github.com/hashicorp/terraform-plugin-framework/datasource" @@ -53,7 +52,7 @@ func NewVolumeDataSource() datasource.DataSource { // volumeDataSource is the data source implementation. type volumeDataSource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -63,17 +62,14 @@ func (d *volumeDataSource) Metadata(_ context.Context, req datasource.MetadataRe } func (d *volumeDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -182,7 +178,7 @@ func (d *volumeDataSource) Read(ctx context.Context, req datasource.ReadRequest, ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "volume_id", volumeId) - volumeResp, err := d.client.DefaultAPI.GetVolume(ctx, projectId, region, volumeId).Execute() + volumeResp, err := d.client.GetVolume(ctx, projectId, region, volumeId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaas/volume/resource.go b/stackit/internal/services/iaas/volume/resource.go index 4fe39e8b1..64a8ee882 100644 --- a/stackit/internal/services/iaas/volume/resource.go +++ b/stackit/internal/services/iaas/volume/resource.go @@ -94,7 +94,7 @@ func NewVolumeResource() resource.Resource { // volumeResource is the resource implementation. type volumeResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -146,16 +146,14 @@ func (r *volumeResource) ConfigValidators(_ context.Context) []resource.ConfigVa // Configure adds the provider configured client to the resource. func (r *volumeResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -458,7 +456,7 @@ func (r *volumeResource) Create(ctx context.Context, req resource.CreateRequest, // Create new volume - volume, err := r.client.DefaultAPI.CreateVolume(ctx, projectId, region).CreateVolumePayload(*payload).Execute() + volume, err := r.client.CreateVolume(ctx, projectId, region).CreateVolumePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating volume", fmt.Sprintf("Calling API: %v", err)) return @@ -481,7 +479,7 @@ func (r *volumeResource) Create(ctx context.Context, req resource.CreateRequest, return } - volume, err = wait.CreateVolumeWaitHandler(ctx, r.client.DefaultAPI, projectId, region, volumeId).WaitWithContext(ctx) + volume, err = wait.CreateVolumeWaitHandler(ctx, r.client, projectId, region, volumeId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating volume", fmt.Sprintf("volume creation waiting: %v", err)) return @@ -526,7 +524,7 @@ func (r *volumeResource) Read(ctx context.Context, req resource.ReadRequest, res ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "volume_id", volumeId) - volumeResp, err := r.client.DefaultAPI.GetVolume(ctx, projectId, region, volumeId).Execute() + volumeResp, err := r.client.GetVolume(ctx, projectId, region, volumeId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -588,7 +586,7 @@ func (r *volumeResource) Update(ctx context.Context, req resource.UpdateRequest, return } // Update existing volume - updatedVolume, err := r.client.DefaultAPI.UpdateVolume(ctx, projectId, region, volumeId).UpdateVolumePayload(*payload).Execute() + updatedVolume, err := r.client.UpdateVolume(ctx, projectId, region, volumeId).UpdateVolumePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating volume", fmt.Sprintf("Calling API: %v", err)) return @@ -606,7 +604,7 @@ func (r *volumeResource) Update(ctx context.Context, req resource.UpdateRequest, resizePayload := iaas.ResizeVolumePayload{ Size: *modelSize, } - err = r.client.DefaultAPI.ResizeVolume(ctx, projectId, region, volumeId).ResizeVolumePayload(resizePayload).Execute() + err = r.client.ResizeVolume(ctx, projectId, region, volumeId).ResizeVolumePayload(resizePayload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating volume", fmt.Sprintf("Resizing the volume, calling API: %v", err)) } @@ -648,7 +646,7 @@ func (r *volumeResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = tflog.SetField(ctx, "volume_id", volumeId) // Delete existing volume - err := r.client.DefaultAPI.DeleteVolume(ctx, projectId, region, volumeId).Execute() + err := r.client.DeleteVolume(ctx, projectId, region, volumeId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -661,7 +659,7 @@ func (r *volumeResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = core.LogResponse(ctx) - _, err = wait.DeleteVolumeWaitHandler(ctx, r.client.DefaultAPI, projectId, region, volumeId).WaitWithContext(ctx) + _, err = wait.DeleteVolumeWaitHandler(ctx, r.client, projectId, region, volumeId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting volume", fmt.Sprintf("volume deletion waiting: %v", err)) return diff --git a/stackit/internal/services/iaas/volume/resource_test.go b/stackit/internal/services/iaas/volume/resource_test.go index 511a2a2fd..2ba7c5086 100644 --- a/stackit/internal/services/iaas/volume/resource_test.go +++ b/stackit/internal/services/iaas/volume/resource_test.go @@ -2,6 +2,7 @@ package volume import ( "context" + _ "embed" "testing" "github.com/google/go-cmp/cmp" diff --git a/stackit/internal/services/iaas/volume/unittest/resource_test.go b/stackit/internal/services/iaas/volume/unittest/resource_test.go new file mode 100644 index 000000000..f9e177c40 --- /dev/null +++ b/stackit/internal/services/iaas/volume/unittest/resource_test.go @@ -0,0 +1,89 @@ +package unittest + +import ( + _ "embed" + "net/http" + "testing" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-testing/config" + "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/stackitcloud/stackit-sdk-go/core/oapierror" + iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api" + + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" + + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/testutil" +) + +//go:embed testdata/resource.tf +var tfConfig string + +func TestVolumeResource(t *testing.T) { + projectId := uuid.NewString() + volumeId := uuid.NewString() + + variables := func(mods ...func(variables config.Variables)) config.Variables { + vars := config.Variables{ + "project_id": config.StringVariable(projectId), + "availability_zone": config.StringVariable("eu01-1"), + "size": config.IntegerVariable(64), + } + + for _, mod := range mods { + mod(vars) + } + + return vars + } + + getCallCounter := new(-1) + mockClient := iaas.DefaultAPIServiceMock{ + CreateVolumeExecuteMock: new(func(_ iaas.ApiCreateVolumeRequest) (*iaas.Volume, error) { + return &iaas.Volume{ + Id: new(volumeId), + }, nil + }), + GetVolumeExecuteMock: new(func(_ iaas.ApiGetVolumeRequest) (*iaas.Volume, error) { + *getCallCounter++ + + switch *getCallCounter { + case 0: + // creation wait handler + return &iaas.Volume{ + Id: new(volumeId), + Status: new("AVAILABLE"), + Size: new(int64(64)), + AvailabilityZone: "eu01-1", + }, nil + case 1: + // read request of deletion test step + return &iaas.Volume{ + Id: new(volumeId), + Status: new("AVAILABLE"), + Size: new(int64(64)), + AvailabilityZone: "eu01-1", + }, nil + case 2: + // deletion wait handler + return nil, oapierror.NewError(http.StatusNotFound, "") + } + + panic("should be unreachable") + }), + } + + resource.UnitTest(t, resource.TestCase{ + ProtoV6ProviderFactories: testutil.NewTestUnitV6ProviderFactories(&core.MockClientFactory{ + IaaSV2ClientMock: mockClient, + }), + Steps: []resource.TestStep{ + { + Config: tfConfig, + ConfigVariables: variables(), + }, + // Note that Terraform automatically adds a step below which deletes all resources used in the unit test. + // This means we also have to mock the delete request and the deletion wait handler. + }, + }) +} diff --git a/stackit/internal/services/iaas/volume/unittest/testdata/resource.tf b/stackit/internal/services/iaas/volume/unittest/testdata/resource.tf new file mode 100644 index 000000000..5c7f30da8 --- /dev/null +++ b/stackit/internal/services/iaas/volume/unittest/testdata/resource.tf @@ -0,0 +1,13 @@ +provider "stackit" { + service_account_token = "mock-server-needs-no-auth" +} + +variable "project_id" {} +variable "availability_zone" {} +variable "size" {} + +resource "stackit_volume" "volume" { + project_id = var.project_id + availability_zone = var.availability_zone + size = var.size +} \ No newline at end of file diff --git a/stackit/internal/services/iaas/volumeattach/resource.go b/stackit/internal/services/iaas/volumeattach/resource.go index 97cda061a..f956a167b 100644 --- a/stackit/internal/services/iaas/volumeattach/resource.go +++ b/stackit/internal/services/iaas/volumeattach/resource.go @@ -9,7 +9,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" "github.com/hashicorp/terraform-plugin-framework/resource" @@ -50,7 +49,7 @@ func NewVolumeAttachResource() resource.Resource { // volumeAttachResource is the resource implementation. type volumeAttachResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -92,16 +91,14 @@ func (r *volumeAttachResource) ModifyPlan(ctx context.Context, req resource.Modi // Configure adds the provider configured client to the resource. func (r *volumeAttachResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := iaasUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IaaSv2Client + tflog.Info(ctx, "iaas client configured") } @@ -191,7 +188,7 @@ func (r *volumeAttachResource) Create(ctx context.Context, req resource.CreateRe payload := iaas.AddVolumeToServerPayload{ DeleteOnTermination: new(false), } - _, err := r.client.DefaultAPI.AddVolumeToServer(ctx, projectId, region, serverId, volumeId).AddVolumeToServerPayload(payload).Execute() + _, err := r.client.AddVolumeToServer(ctx, projectId, region, serverId, volumeId).AddVolumeToServerPayload(payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error attaching volume to server", fmt.Sprintf("Calling API: %v", err)) return @@ -214,7 +211,7 @@ func (r *volumeAttachResource) Create(ctx context.Context, req resource.CreateRe core.LogAndAddError(ctx, &resp.Diagnostics, "Error attaching volume to server", fmt.Sprintf("Reading x-request-ID: %v", err)) return } - _, err = wait.ProjectRequestWaitHandler(ctx, r.client.DefaultAPI, projectId, region, requestId).WaitWithContext(ctx) + _, err = wait.ProjectRequestWaitHandler(ctx, r.client, projectId, region, requestId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error attaching volume to server", fmt.Sprintf("volume attachment waiting: %v", err)) return @@ -252,7 +249,7 @@ func (r *volumeAttachResource) Read(ctx context.Context, req resource.ReadReques ctx = tflog.SetField(ctx, "server_id", serverId) ctx = tflog.SetField(ctx, "volume_id", volumeId) - _, err := r.client.DefaultAPI.GetAttachedVolume(ctx, projectId, region, serverId, volumeId).Execute() + _, err := r.client.GetAttachedVolume(ctx, projectId, region, serverId, volumeId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -305,7 +302,7 @@ func (r *volumeAttachResource) Delete(ctx context.Context, req resource.DeleteRe ctx = tflog.SetField(ctx, "volume_id", volumeId) // Remove volume from server - err := r.client.DefaultAPI.RemoveVolumeFromServer(ctx, projectId, region, serverId, volumeId).Execute() + err := r.client.RemoveVolumeFromServer(ctx, projectId, region, serverId, volumeId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -322,7 +319,7 @@ func (r *volumeAttachResource) Delete(ctx context.Context, req resource.DeleteRe core.LogAndAddError(ctx, &resp.Diagnostics, "Error attaching volume to server", fmt.Sprintf("Reading x-request-ID: %v", err)) return } - _, err = wait.ProjectRequestWaitHandler(ctx, r.client.DefaultAPI, projectId, region, requestId).WaitWithContext(ctx) + _, err = wait.ProjectRequestWaitHandler(ctx, r.client, projectId, region, requestId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error removing volume from server", fmt.Sprintf("volume removal waiting: %v", err)) return diff --git a/stackit/internal/services/iaasalpha/utils/util.go b/stackit/internal/services/iaasalpha/utils/util.go deleted file mode 100644 index 6d214f4f3..000000000 --- a/stackit/internal/services/iaasalpha/utils/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2alpha1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *iaas.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.IaaSCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.IaaSCustomEndpoint)) - } - - apiClient, err := iaas.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/iaasalpha/utils/util_test.go b/stackit/internal/services/iaasalpha/utils/util_test.go deleted file mode 100644 index 21ea49659..000000000 --- a/stackit/internal/services/iaasalpha/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2alpha1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://iaas-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *iaas.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *iaas.APIClient { - apiClient, err := iaas.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - IaaSCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *iaas.APIClient { - apiClient, err := iaas.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/iaasalpha/vpc/datasource.go b/stackit/internal/services/iaasalpha/vpc/datasource.go index b0eb7a612..f0426f350 100644 --- a/stackit/internal/services/iaasalpha/vpc/datasource.go +++ b/stackit/internal/services/iaasalpha/vpc/datasource.go @@ -16,10 +16,8 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - iaasAlphaUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaasalpha/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -41,7 +39,7 @@ func NewVPCDatasource() datasource.DataSource { // vpcDatasource is the datasource implementation. type vpcDatasource struct { - client *iaas.APIClient + client iaas.DefaultAPI } // Metadata returns the datasource type name. @@ -51,17 +49,14 @@ func (r *vpcDatasource) Metadata(_ context.Context, req datasource.MetadataReque // Configure adds the provider configured client to the datasource. func (r *vpcDatasource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - features.CheckExperimentEnabled(ctx, &providerData, features.VpcExperiment, "stackit_vpc", core.Resource, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + r.client = clients.IaaSv2AlphaClient - r.client = iaasAlphaUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) + features.CheckExperimentEnabled(ctx, &providerData, features.VpcExperiment, "stackit_vpc", core.Resource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } @@ -144,7 +139,7 @@ func (r *vpcDatasource) Read(ctx context.Context, req datasource.ReadRequest, re ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "vpc_id", vpcId) - vpcResp, err := r.client.DefaultAPI.GetVPC(ctx, projectId, vpcId).Execute() + vpcResp, err := r.client.GetVPC(ctx, projectId, vpcId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaasalpha/vpc/resource.go b/stackit/internal/services/iaasalpha/vpc/resource.go index dd1497f33..71fa4ff98 100644 --- a/stackit/internal/services/iaasalpha/vpc/resource.go +++ b/stackit/internal/services/iaasalpha/vpc/resource.go @@ -23,7 +23,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - iaasAlphaUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaasalpha/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -57,7 +56,7 @@ func NewVPCResource() resource.Resource { // networkResource is the resource implementation. type vpcResource struct { - client *iaas.APIClient + client iaas.DefaultAPI } // Metadata returns the resource type name. @@ -67,17 +66,14 @@ func (r *vpcResource) Metadata(_ context.Context, req resource.MetadataRequest, // Configure adds the provider configured client to the resource. func (r *vpcResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - features.CheckExperimentEnabled(ctx, &providerData, features.VpcExperiment, "stackit_vpc", core.Resource, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + r.client = clients.IaaSv2AlphaClient - r.client = iaasAlphaUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) + features.CheckExperimentEnabled(ctx, &providerData, features.VpcExperiment, "stackit_vpc", core.Resource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } @@ -175,7 +171,7 @@ func (r *vpcResource) Create(ctx context.Context, req resource.CreateRequest, re } // Create new vpc - vpc, err := r.client.DefaultAPI.CreateVPC(ctx, projectId).CreateVPCPayload(*payload).Execute() + vpc, err := r.client.CreateVPC(ctx, projectId).CreateVPCPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating vpc", fmt.Sprintf("Calling API: %v", err)) return @@ -241,7 +237,7 @@ func (r *vpcResource) Read(ctx context.Context, req resource.ReadRequest, resp * ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "vpc_id", vpcId) - vpcResp, err := r.client.DefaultAPI.GetVPC(ctx, projectId, vpcId).Execute() + vpcResp, err := r.client.GetVPC(ctx, projectId, vpcId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -307,7 +303,7 @@ func (r *vpcResource) Update(ctx context.Context, req resource.UpdateRequest, re return } // Update existing network - vpcResp, err := r.client.DefaultAPI.PartialUpdateVPC(ctx, projectId, vpcId).PartialUpdateVPCPayload(*payload).Execute() + vpcResp, err := r.client.PartialUpdateVPC(ctx, projectId, vpcId).PartialUpdateVPCPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating vpc", fmt.Sprintf("Calling API: %v", err)) return @@ -355,7 +351,7 @@ func (r *vpcResource) Delete(ctx context.Context, req resource.DeleteRequest, re ctx = tflog.SetField(ctx, "vpc_id", vpcId) // Delete existing vpc - err := r.client.DefaultAPI.DeleteVPC(ctx, projectId, vpcId).Execute() + err := r.client.DeleteVPC(ctx, projectId, vpcId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) diff --git a/stackit/internal/services/iaasalpha/vpcnetworkrange/datasource.go b/stackit/internal/services/iaasalpha/vpcnetworkrange/datasource.go index 2a7215cc8..50ab61b20 100644 --- a/stackit/internal/services/iaasalpha/vpcnetworkrange/datasource.go +++ b/stackit/internal/services/iaasalpha/vpcnetworkrange/datasource.go @@ -13,10 +13,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2alpha1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - iaasAlphaUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaasalpha/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -39,7 +37,7 @@ type DatasourceModel struct { // vpcNetworkRangeDatasource is the datasource implementation. type vpcNetworkRangeDatasource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -50,18 +48,15 @@ func (r *vpcNetworkRangeDatasource) Metadata(_ context.Context, req datasource.M // Configure adds the provider configured client to the datasource. func (r *vpcNetworkRangeDatasource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - features.CheckExperimentEnabled(ctx, &r.providerData, features.VpcExperiment, "stackit_vpc_network_range", core.Datasource, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + r.providerData = providerData + r.client = clients.IaaSv2AlphaClient - r.client = iaasAlphaUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) + features.CheckExperimentEnabled(ctx, &r.providerData, features.VpcExperiment, "stackit_vpc_network_range", core.Datasource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } @@ -180,7 +175,7 @@ func (r *vpcNetworkRangeDatasource) Read(ctx context.Context, req datasource.Rea ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "network_range_id", networkRangeId) - networkRangeResp, err := r.client.DefaultAPI.GetVPCNetworkRange(ctx, projectId, vpcId, region, networkRangeId).Execute() + networkRangeResp, err := r.client.GetVPCNetworkRange(ctx, projectId, vpcId, region, networkRangeId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaasalpha/vpcnetworkrange/resource.go b/stackit/internal/services/iaasalpha/vpcnetworkrange/resource.go index 664763760..69a4b1171 100644 --- a/stackit/internal/services/iaasalpha/vpcnetworkrange/resource.go +++ b/stackit/internal/services/iaasalpha/vpcnetworkrange/resource.go @@ -28,7 +28,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - iaasAlphaUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaasalpha/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -70,7 +69,7 @@ func NewVpcNetworkRangeResource() resource.Resource { // networkResource is the resource implementation. type vpcNetworkRangeResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -81,18 +80,15 @@ func (r *vpcNetworkRangeResource) Metadata(_ context.Context, req resource.Metad // Configure adds the provider configured client to the resource. func (r *vpcNetworkRangeResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - features.CheckExperimentEnabled(ctx, &r.providerData, features.VpcExperiment, "stackit_vpc_network_range", core.Resource, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + r.providerData = providerData + r.client = clients.IaaSv2AlphaClient - r.client = iaasAlphaUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) + features.CheckExperimentEnabled(ctx, &r.providerData, features.VpcExperiment, "stackit_vpc_network_range", core.Resource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } @@ -256,7 +252,7 @@ func (r *vpcNetworkRangeResource) Create(ctx context.Context, req resource.Creat return } - waiterTimeout := wait.CreateVPCNetworkRangeWaitHandler(ctx, r.client.DefaultAPI, "", "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := wait.CreateVPCNetworkRangeWaitHandler(ctx, r.client, "", "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value createTimeout, diags := model.Timeouts.Create(ctx, waiterTimeout+core.DefaultTimeoutMargin) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -282,7 +278,7 @@ func (r *vpcNetworkRangeResource) Create(ctx context.Context, req resource.Creat } // Create new network range - networkRange, err := r.client.DefaultAPI.CreateVPCNetworkRange(ctx, projectId, vpcId, region).CreateVPCNetworkRangePayload(*payload).Execute() + networkRange, err := r.client.CreateVPCNetworkRange(ctx, projectId, vpcId, region).CreateVPCNetworkRangePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating network range", fmt.Sprintf("Calling API: %v", err)) return @@ -306,7 +302,7 @@ func (r *vpcNetworkRangeResource) Create(ctx context.Context, req resource.Creat return } - waitResp, err := wait.CreateVPCNetworkRangeWaitHandler(ctx, r.client.DefaultAPI, projectId, vpcId, region, *networkRange.VPCNetworkRangeIPv4.Id).WaitWithContext(ctx) + waitResp, err := wait.CreateVPCNetworkRangeWaitHandler(ctx, r.client, projectId, vpcId, region, *networkRange.VPCNetworkRangeIPv4.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating network range", fmt.Sprintf("Waiting for network range become ready: %v", err)) return @@ -360,7 +356,7 @@ func (r *vpcNetworkRangeResource) Read(ctx context.Context, req resource.ReadReq ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "network_range_id", networkRangeId) - networkRangeResp, err := r.client.DefaultAPI.GetVPCNetworkRange(ctx, projectId, vpcId, region, networkRangeId).Execute() + networkRangeResp, err := r.client.GetVPCNetworkRange(ctx, projectId, vpcId, region, networkRangeId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -396,7 +392,7 @@ func (r *vpcNetworkRangeResource) Update(ctx context.Context, req resource.Updat return } - waiterTimeout := wait.UpdateVPCNetworkRangeWaitHandler(ctx, r.client.DefaultAPI, "", "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := wait.UpdateVPCNetworkRangeWaitHandler(ctx, r.client, "", "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value updateTimeout, diags := model.Timeouts.Update(ctx, waiterTimeout+core.DefaultTimeoutMargin) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -431,7 +427,7 @@ func (r *vpcNetworkRangeResource) Update(ctx context.Context, req resource.Updat return } // Update existing network - _, err = r.client.DefaultAPI.UpdateVPCNetworkRange(ctx, projectId, vpcId, region, networkRangeId).UpdateVPCNetworkRangePayload(*payload).Execute() + _, err = r.client.UpdateVPCNetworkRange(ctx, projectId, vpcId, region, networkRangeId).UpdateVPCNetworkRangePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating network range", fmt.Sprintf("Calling API: %v", err)) return @@ -439,7 +435,7 @@ func (r *vpcNetworkRangeResource) Update(ctx context.Context, req resource.Updat ctx = core.LogResponse(ctx) - waitResp, err := wait.UpdateVPCNetworkRangeWaitHandler(ctx, r.client.DefaultAPI, projectId, vpcId, region, networkRangeId).WaitWithContext(ctx) + waitResp, err := wait.UpdateVPCNetworkRangeWaitHandler(ctx, r.client, projectId, vpcId, region, networkRangeId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error update network range", fmt.Sprintf("Waiting for network range become ready: %v", err)) return @@ -468,7 +464,7 @@ func (r *vpcNetworkRangeResource) Delete(ctx context.Context, req resource.Delet return } - waiterTimeout := wait.DeleteVPCNetworkRangeWaitHandler(ctx, r.client.DefaultAPI, "", "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := wait.DeleteVPCNetworkRangeWaitHandler(ctx, r.client, "", "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value updateTimeout, diags := model.Timeouts.Delete(ctx, waiterTimeout+core.DefaultTimeoutMargin) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { @@ -490,7 +486,7 @@ func (r *vpcNetworkRangeResource) Delete(ctx context.Context, req resource.Delet ctx = tflog.SetField(ctx, "network_range_id", networkRangeId) // Delete existing vpc - err := r.client.DefaultAPI.DeleteVPCNetworkRange(ctx, projectId, vpcId, region, networkRangeId).Execute() + err := r.client.DeleteVPCNetworkRange(ctx, projectId, vpcId, region, networkRangeId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -502,7 +498,7 @@ func (r *vpcNetworkRangeResource) Delete(ctx context.Context, req resource.Delet ctx = core.LogResponse(ctx) - _, err = wait.DeleteVPCNetworkRangeWaitHandler(ctx, r.client.DefaultAPI, projectId, vpcId, region, networkRangeId).WaitWithContext(ctx) + _, err = wait.DeleteVPCNetworkRangeWaitHandler(ctx, r.client, projectId, vpcId, region, networkRangeId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting network range", fmt.Sprintf("Waiting for network range become deleted: %v", err)) return diff --git a/stackit/internal/services/iaasalpha/vpcregion/datasource.go b/stackit/internal/services/iaasalpha/vpcregion/datasource.go index c527452c6..5a267aaf8 100644 --- a/stackit/internal/services/iaasalpha/vpcregion/datasource.go +++ b/stackit/internal/services/iaasalpha/vpcregion/datasource.go @@ -13,10 +13,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - iaasAlphaUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaasalpha/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2alpha1api" @@ -32,7 +30,7 @@ func NewVPCRegionDatasource() datasource.DataSource { } type vpcRegionDatasource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -42,17 +40,15 @@ type DatasourceModel struct { } func (v *vpcRegionDatasource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - features.CheckExperimentEnabled(ctx, &providerData, features.VpcExperiment, "stackit_vpc_region", core.Resource, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + v.providerData = providerData + v.client = clients.IaaSv2AlphaClient - v.client = iaasAlphaUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) + features.CheckExperimentEnabled(ctx, &providerData, features.VpcExperiment, "stackit_vpc_region", core.Resource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } @@ -122,7 +118,7 @@ func (v *vpcRegionDatasource) Read(ctx context.Context, req datasource.ReadReque ctx = tflog.SetField(ctx, "vpc_id", vpcId) ctx = tflog.SetField(ctx, "region", region) - regionalVPC, err := v.client.DefaultAPI.GetVPCRegion(ctx, projectId, vpcId, region).Execute() + regionalVPC, err := v.client.GetVPCRegion(ctx, projectId, vpcId, region).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) diff --git a/stackit/internal/services/iaasalpha/vpcregion/resource.go b/stackit/internal/services/iaasalpha/vpcregion/resource.go index 505256fa3..9ccaacce3 100644 --- a/stackit/internal/services/iaasalpha/vpcregion/resource.go +++ b/stackit/internal/services/iaasalpha/vpcregion/resource.go @@ -17,10 +17,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - iaasAlphaUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaasalpha/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -56,7 +54,7 @@ func NewVPCRegion() resource.Resource { } type vpcRegion struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -65,18 +63,15 @@ func (v *vpcRegion) Metadata(_ context.Context, request resource.MetadataRequest } func (v *vpcRegion) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - v.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - features.CheckExperimentEnabled(ctx, &v.providerData, features.VpcExperiment, "stackit_vpc_region", core.Resource, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + v.providerData = providerData + v.client = clients.IaaSv2AlphaClient - v.client = iaasAlphaUtils.ConfigureClient(ctx, &v.providerData, &resp.Diagnostics) + features.CheckExperimentEnabled(ctx, &v.providerData, features.VpcExperiment, "stackit_vpc_region", core.Resource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } @@ -166,7 +161,7 @@ func (v *vpcRegion) Create(ctx context.Context, request resource.CreateRequest, return } - waiterTimeout := wait.CreateVPCRegionWaitHandler(ctx, v.client.DefaultAPI, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := wait.CreateVPCRegionWaitHandler(ctx, v.client, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value createTimeout, diags := model.Timeouts.Create(ctx, waiterTimeout+core.DefaultTimeoutMargin) response.Diagnostics.Append(diags...) if response.Diagnostics.HasError() { @@ -190,7 +185,7 @@ func (v *vpcRegion) Create(ctx context.Context, request resource.CreateRequest, return } - regionalVPC, err := v.client.DefaultAPI.CreateVPCRegion(ctx, projectId, vpcId, region).CreateVPCRegionPayload(*payload).Execute() + regionalVPC, err := v.client.CreateVPCRegion(ctx, projectId, vpcId, region).CreateVPCRegionPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &response.Diagnostics, "Error creating VPC region", fmt.Sprintf("Calling API: %v", err)) return @@ -204,7 +199,7 @@ func (v *vpcRegion) Create(ctx context.Context, request resource.CreateRequest, "region": region, }) - _, err = wait.CreateVPCRegionWaitHandler(ctx, v.client.DefaultAPI, projectId, vpcId, region).WaitWithContext(ctx) + _, err = wait.CreateVPCRegionWaitHandler(ctx, v.client, projectId, vpcId, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &response.Diagnostics, "Error creating VPC region", fmt.Sprintf("VPC region creation waiting: %v", err)) return @@ -246,7 +241,7 @@ func (v *vpcRegion) Read(ctx context.Context, request resource.ReadRequest, resp ctx = tflog.SetField(ctx, "vpc_id", vpcId) ctx = tflog.SetField(ctx, "region", region) - regionalVPC, err := v.client.DefaultAPI.GetVPCRegion(ctx, projectId, vpcId, region).Execute() + regionalVPC, err := v.client.GetVPCRegion(ctx, projectId, vpcId, region).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { response.State.RemoveResource(ctx) @@ -302,7 +297,7 @@ func (v *vpcRegion) Update(ctx context.Context, request resource.UpdateRequest, return } - regionalVPC, err := v.client.DefaultAPI.UpdateVPCRegion(ctx, projectId, vpcId, region).UpdateVPCRegionPayload(payload).Execute() + regionalVPC, err := v.client.UpdateVPCRegion(ctx, projectId, vpcId, region).UpdateVPCRegionPayload(payload).Execute() if err != nil { core.LogAndAddError(ctx, &response.Diagnostics, "Error updating VPC region", fmt.Sprintf("Calling API: %v", err)) return @@ -331,7 +326,7 @@ func (v *vpcRegion) Delete(ctx context.Context, request resource.DeleteRequest, return } - waiterTimeout := wait.DeleteVPCRegionWaitHandler(ctx, v.client.DefaultAPI, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value + waiterTimeout := wait.DeleteVPCRegionWaitHandler(ctx, v.client, "", "", "").GetTimeout() //nolint:tfctxinit,tfwriteid // false positive - only called to get default wait handler timeout value deleteTimeout, diags := model.Timeouts.Delete(ctx, waiterTimeout+core.DefaultTimeoutMargin) response.Diagnostics.Append(diags...) if response.Diagnostics.HasError() { @@ -349,7 +344,7 @@ func (v *vpcRegion) Delete(ctx context.Context, request resource.DeleteRequest, ctx = tflog.SetField(ctx, "vpc_id", vpcId) ctx = tflog.SetField(ctx, "region", region) - err := v.client.DefaultAPI.DeleteVPCRegion(ctx, projectId, vpcId, region).Execute() + err := v.client.DeleteVPCRegion(ctx, projectId, vpcId, region).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { response.State.RemoveResource(ctx) @@ -361,7 +356,7 @@ func (v *vpcRegion) Delete(ctx context.Context, request resource.DeleteRequest, ctx = core.LogResponse(ctx) - _, err = wait.DeleteVPCRegionWaitHandler(ctx, v.client.DefaultAPI, projectId, vpcId, region).WaitWithContext(ctx) + _, err = wait.DeleteVPCRegionWaitHandler(ctx, v.client, projectId, vpcId, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &response.Diagnostics, "Error deleting VPC region", fmt.Sprintf("VPC region deletion waiting: %v", err)) return diff --git a/stackit/internal/services/iaasalpha/vpcroutingtable/datasource.go b/stackit/internal/services/iaasalpha/vpcroutingtable/datasource.go index 5b648f92a..d9a4050f4 100644 --- a/stackit/internal/services/iaasalpha/vpcroutingtable/datasource.go +++ b/stackit/internal/services/iaasalpha/vpcroutingtable/datasource.go @@ -13,10 +13,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2alpha1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - iaasAlphaUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaasalpha/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -34,7 +32,7 @@ func NewVpcRoutingTableDatasource() datasource.DataSource { // vpcRoutingTableDatasource is the datasource implementation. type vpcRoutingTableDatasource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -45,22 +43,19 @@ func (r *vpcRoutingTableDatasource) Metadata(_ context.Context, req datasource.M // Configure adds the provider configured client to the datasource. func (r *vpcRoutingTableDatasource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.IaaSv2AlphaClient + features.CheckExperimentEnabled(ctx, &r.providerData, features.VpcExperiment, "stackit_vpc_routing_table", core.Datasource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } - apiClient := iaasAlphaUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "IaaS v2alpha client configured") } @@ -159,7 +154,7 @@ func (r *vpcRoutingTableDatasource) Read(ctx context.Context, req datasource.Rea ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "routing_table_id", routingTableId) - routingTableResp, err := r.client.DefaultAPI.GetVPCRoutingTable(ctx, projectId, vpcId, region, routingTableId).Execute() + routingTableResp, err := r.client.GetVPCRoutingTable(ctx, projectId, vpcId, region, routingTableId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/iaasalpha/vpcroutingtable/resource.go b/stackit/internal/services/iaasalpha/vpcroutingtable/resource.go index cdb223af5..4773ee6de 100644 --- a/stackit/internal/services/iaasalpha/vpcroutingtable/resource.go +++ b/stackit/internal/services/iaasalpha/vpcroutingtable/resource.go @@ -23,7 +23,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" iaasUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaas/utils" - iaasAlphaUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaasalpha/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -70,7 +69,7 @@ func NewVpcRoutingTableResource() resource.Resource { // vpcRoutingTableResource is the resource implementation. type vpcRoutingTableResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -82,21 +81,19 @@ func (r *vpcRoutingTableResource) Metadata(_ context.Context, req resource.Metad // Configure adds the provider configured client to the resource. func (r *vpcRoutingTableResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.IaaSv2AlphaClient + features.CheckExperimentEnabled(ctx, &r.providerData, features.VpcExperiment, "stackit_vpc_routing_table", core.Resource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } - apiClient := iaasAlphaUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "IaaS v2alpha client configured") } @@ -248,7 +245,7 @@ func (r *vpcRoutingTableResource) Create(ctx context.Context, req resource.Creat return } - routingTable, err := r.client.DefaultAPI.AddVPCRoutingTable(ctx, projectId, vpcId, region).AddVPCRoutingTablePayload(*payload).Execute() + routingTable, err := r.client.AddVPCRoutingTable(ctx, projectId, vpcId, region).AddVPCRoutingTablePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating vpc routing table", fmt.Sprintf("Calling API: %v", err)) return @@ -309,7 +306,7 @@ func (r *vpcRoutingTableResource) Read(ctx context.Context, req resource.ReadReq ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "routing_table_id", routingTableId) - routingTableResp, err := r.client.DefaultAPI.GetVPCRoutingTable(ctx, projectId, vpcId, region, routingTableId).Execute() + routingTableResp, err := r.client.GetVPCRoutingTable(ctx, projectId, vpcId, region, routingTableId).Execute() if err != nil { utils.LogError( ctx, @@ -379,7 +376,7 @@ func (r *vpcRoutingTableResource) Update(ctx context.Context, req resource.Updat return } - routingTable, err := r.client.DefaultAPI.UpdateVPCRoutingTable(ctx, projectId, vpcId, region, routingTableId).UpdateVPCRoutingTablePayload(*payload).Execute() + routingTable, err := r.client.UpdateVPCRoutingTable(ctx, projectId, vpcId, region, routingTableId).UpdateVPCRoutingTablePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating vpc routing table", fmt.Sprintf("Calling API: %v", err)) return @@ -425,7 +422,7 @@ func (r *vpcRoutingTableResource) Delete(ctx context.Context, req resource.Delet ctx = tflog.SetField(ctx, "routing_table_id", routingTableId) // Delete existing routing table - err := r.client.DefaultAPI.DeleteVPCRoutingTable(ctx, projectId, vpcId, region, routingTableId).Execute() + err := r.client.DeleteVPCRoutingTable(ctx, projectId, vpcId, region, routingTableId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) diff --git a/stackit/internal/services/iaasalpha/vpcroutingtable/staticroute/datasource.go b/stackit/internal/services/iaasalpha/vpcroutingtable/staticroute/datasource.go index cf58b8656..3ee015106 100644 --- a/stackit/internal/services/iaasalpha/vpcroutingtable/staticroute/datasource.go +++ b/stackit/internal/services/iaasalpha/vpcroutingtable/staticroute/datasource.go @@ -15,10 +15,8 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - iaasAlphaUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaasalpha/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -37,7 +35,7 @@ func NewStaticRouteDatasource() datasource.DataSource { } type staticRouteDatasource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -46,22 +44,19 @@ func (r *staticRouteDatasource) Metadata(_ context.Context, req datasource.Metad } func (r *staticRouteDatasource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.IaaSv2AlphaClient + features.CheckExperimentEnabled(ctx, &r.providerData, features.VpcExperiment, "stackit_vpc_routing_table_static_route", core.Datasource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } - apiClient := iaasAlphaUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "IaaS v2alpha client configured") } @@ -162,7 +157,7 @@ func (r *staticRouteDatasource) Read(ctx context.Context, req datasource.ReadReq ctx = tflog.SetField(ctx, "routing_table_id", routingTableId) ctx = tflog.SetField(ctx, "route_id", routeId) - route, err := r.client.DefaultAPI.GetVPCStaticRoute(ctx, projectId, vpcId, region, routingTableId, routeId).Execute() + route, err := r.client.GetVPCStaticRoute(ctx, projectId, vpcId, region, routingTableId, routeId).Execute() if err != nil { utils.LogError(ctx, &resp.Diagnostics, err, "Error reading vpc static route", fmt.Sprintf("Calling API: %v", err), map[int]string{ diff --git a/stackit/internal/services/iaasalpha/vpcroutingtable/staticroute/resource.go b/stackit/internal/services/iaasalpha/vpcroutingtable/staticroute/resource.go index c081a7c3a..e68682a2e 100644 --- a/stackit/internal/services/iaasalpha/vpcroutingtable/staticroute/resource.go +++ b/stackit/internal/services/iaasalpha/vpcroutingtable/staticroute/resource.go @@ -25,7 +25,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - iaasAlphaUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iaasalpha/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -79,7 +78,7 @@ func NewStaticRouteResource() resource.Resource { } type staticRouteResource struct { - client *iaas.APIClient + client iaas.DefaultAPI providerData core.ProviderData } @@ -88,22 +87,19 @@ func (r *staticRouteResource) Metadata(_ context.Context, req resource.MetadataR } func (r *staticRouteResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.IaaSv2AlphaClient + features.CheckExperimentEnabled(ctx, &r.providerData, features.VpcExperiment, "stackit_vpc_routing_table_static_route", core.Resource, &resp.Diagnostics) if resp.Diagnostics.HasError() { return } - apiClient := iaasAlphaUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "IaaS v2alpha client configured") } @@ -280,7 +276,7 @@ func (r *staticRouteResource) Create(ctx context.Context, req resource.CreateReq return } - route, err := r.client.DefaultAPI.AddVPCStaticRoute(ctx, projectId, vpcId, region, routingTableId).AddVPCStaticRoutePayload(*payload).Execute() + route, err := r.client.AddVPCStaticRoute(ctx, projectId, vpcId, region, routingTableId).AddVPCStaticRoutePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating static route", fmt.Sprintf("Calling API: %v", err)) return @@ -339,7 +335,7 @@ func (r *staticRouteResource) Read(ctx context.Context, req resource.ReadRequest ctx = tflog.SetField(ctx, "routing_table_id", routingTableId) ctx = tflog.SetField(ctx, "route_id", routeId) - route, err := r.client.DefaultAPI.GetVPCStaticRoute(ctx, projectId, vpcId, region, routingTableId, routeId).Execute() + route, err := r.client.GetVPCStaticRoute(ctx, projectId, vpcId, region, routingTableId, routeId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -409,7 +405,7 @@ func (r *staticRouteResource) Update(ctx context.Context, req resource.UpdateReq return } - route, err := r.client.DefaultAPI.UpdateVPCStaticRoute(ctx, projectId, vpcId, region, routingTableId, routeId).UpdateVPCStaticRoutePayload(payload).Execute() + route, err := r.client.UpdateVPCStaticRoute(ctx, projectId, vpcId, region, routingTableId, routeId).UpdateVPCStaticRoutePayload(payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating vpc static route", fmt.Sprintf("Calling API: %v", err)) return @@ -462,7 +458,7 @@ func (r *staticRouteResource) Delete(ctx context.Context, req resource.DeleteReq ctx = tflog.SetField(ctx, "routing_table_id", routingTableId) ctx = tflog.SetField(ctx, "route_id", routeId) - err := r.client.DefaultAPI.DeleteVPCStaticRoute(ctx, projectId, vpcId, region, routingTableId, routeId).Execute() + err := r.client.DeleteVPCStaticRoute(ctx, projectId, vpcId, region, routingTableId, routeId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) diff --git a/stackit/internal/services/iam/rolebindings/v1/generic/datasource.go b/stackit/internal/services/iam/rolebindings/v1/generic/datasource.go index efaf75984..0e5bdc022 100644 --- a/stackit/internal/services/iam/rolebindings/v1/generic/datasource.go +++ b/stackit/internal/services/iam/rolebindings/v1/generic/datasource.go @@ -6,12 +6,10 @@ import ( "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" - "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" secretsmanagerV1Alpha "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager/v1alphaapi" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" @@ -37,14 +35,14 @@ type nestedRoleBinding struct { // RoleBindingDatasource is the resource implementation. type RoleBindingDatasource[C any] struct { providerData core.ProviderData - apiClient *C + apiClient C ApiName string // e.g. "iaas", "secretsmanager", ... ResourceType string // e.g. "instance", ... // callbacks for lifecyle handling - ApiClientFactory func(context.Context, *core.ProviderData, *diag.Diagnostics) *C - ExecReadRequest func(ctx context.Context, client *C, region, resourceId string) ([]GenericRoleBindingResponse, error) + ApiClientExtractor func(clientCollection core.RoleBindingClientCollection) C + ExecReadRequest func(ctx context.Context, client C, region, resourceId string) ([]GenericRoleBindingResponse, error) } // Metadata returns the resource type name. @@ -54,7 +52,7 @@ func (r *RoleBindingDatasource[C]) Metadata(_ context.Context, req datasource.Me // Configure adds the provider configured client to the resource. func (r *RoleBindingDatasource[C]) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clientCollection, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } @@ -64,10 +62,8 @@ func (r *RoleBindingDatasource[C]) Configure(ctx context.Context, req datasource return } - r.apiClient = r.ApiClientFactory(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + r.apiClient = r.ApiClientExtractor(clientCollection) + tflog.Info(ctx, fmt.Sprintf("%s %s client configured", r.ApiName, r.ResourceType)) } diff --git a/stackit/internal/services/iam/rolebindings/v1/generic/resource.go b/stackit/internal/services/iam/rolebindings/v1/generic/resource.go index afca49dc4..18afc68e7 100644 --- a/stackit/internal/services/iam/rolebindings/v1/generic/resource.go +++ b/stackit/internal/services/iam/rolebindings/v1/generic/resource.go @@ -6,7 +6,6 @@ import ( "strings" "time" - "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" @@ -15,7 +14,6 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" secretsmanagerV1Alpha "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager/v1alphaapi" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" @@ -44,17 +42,17 @@ type GenericRoleBindingResponse interface { // RoleBindingResource is the resource implementation. type RoleBindingResource[C any] struct { providerData core.ProviderData - apiClient *C + apiClient C ApiName string // e.g. "iaas", "secretsmanager", ... ResourceType string // e.g. "instance", ... // callbacks for lifecyle handling - ApiClientFactory func(context.Context, *core.ProviderData, *diag.Diagnostics) *C - ExecReadRequest func(ctx context.Context, client *C, region, resourceId, role, subject string) (GenericRoleBindingResponse, error) - ExecCreateRequest func(ctx context.Context, client *C, region, resourceId, role, subject string) (GenericRoleBindingResponse, error) - ExecUpdateRequest func(ctx context.Context, client *C, region, resourceId, role, subject string) (GenericRoleBindingResponse, error) - ExecDeleteRequest func(ctx context.Context, client *C, region, resourceId, role, subject string) error + ApiClientExtractor func(clientCollection core.RoleBindingClientCollection) C + ExecReadRequest func(ctx context.Context, client C, region, resourceId, role, subject string) (GenericRoleBindingResponse, error) + ExecCreateRequest func(ctx context.Context, client C, region, resourceId, role, subject string) (GenericRoleBindingResponse, error) + ExecUpdateRequest func(ctx context.Context, client C, region, resourceId, role, subject string) (GenericRoleBindingResponse, error) + ExecDeleteRequest func(ctx context.Context, client C, region, resourceId, role, subject string) error } // Metadata returns the resource type name. @@ -64,7 +62,7 @@ func (r *RoleBindingResource[C]) Metadata(_ context.Context, req resource.Metada // Configure adds the provider configured client to the resource. func (r *RoleBindingResource[C]) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clientCollection, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } @@ -74,10 +72,8 @@ func (r *RoleBindingResource[C]) Configure(ctx context.Context, req resource.Con return } - r.apiClient = r.ApiClientFactory(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + r.apiClient = r.ApiClientExtractor(clientCollection) + tflog.Info(ctx, fmt.Sprintf("%s %s client configured", r.ApiName, r.ResourceType)) } diff --git a/stackit/internal/services/iam/rolebindings/v1/services/secretsmanager/instance.go b/stackit/internal/services/iam/rolebindings/v1/services/secretsmanager/instance.go index e32e83026..19ab971bd 100644 --- a/stackit/internal/services/iam/rolebindings/v1/services/secretsmanager/instance.go +++ b/stackit/internal/services/iam/rolebindings/v1/services/secretsmanager/instance.go @@ -7,60 +7,64 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource" secretsmanagerV1Alpha "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager/v1alphaapi" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iam/rolebindings/v1/generic" - - secretsmanagerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/secretsmanager/utils" ) func NewSecretsmanagerInstanceRoleBindingResource() resource.Resource { - return &generic.RoleBindingResource[secretsmanagerV1Alpha.APIClient]{ - ApiName: "secretsmanager", - ResourceType: "instance", - ApiClientFactory: secretsmanagerUtils.ConfigureV1AlphaClient, - ExecCreateRequest: func(ctx context.Context, client *secretsmanagerV1Alpha.APIClient, region, resourceId, role, subject string) (generic.GenericRoleBindingResponse, error) { + return &generic.RoleBindingResource[secretsmanagerV1Alpha.DefaultAPI]{ + ApiName: "secretsmanager", + ResourceType: "instance", + ApiClientExtractor: func(clientCollection core.RoleBindingClientCollection) secretsmanagerV1Alpha.DefaultAPI { + return clientCollection.SecretsmanagerV1AlphaClient + }, + ExecCreateRequest: func(ctx context.Context, client secretsmanagerV1Alpha.DefaultAPI, region, resourceId, role, subject string) (generic.GenericRoleBindingResponse, error) { payload := secretsmanagerV1Alpha.AddInstanceRoleBindingsPayload{ Role: role, Subject: subject, } - return client.DefaultAPI.AddInstanceRoleBindings(ctx, region, resourceId).AddInstanceRoleBindingsPayload(payload).Execute() + return client.AddInstanceRoleBindings(ctx, region, resourceId).AddInstanceRoleBindingsPayload(payload).Execute() }, - ExecReadRequest: func(ctx context.Context, client *secretsmanagerV1Alpha.APIClient, region, resourceId, role, subject string) (generic.GenericRoleBindingResponse, error) { + ExecReadRequest: func(ctx context.Context, client secretsmanagerV1Alpha.DefaultAPI, region, resourceId, role, subject string) (generic.GenericRoleBindingResponse, error) { payload := secretsmanagerV1Alpha.GetInstanceRoleBindingsPayload{ Role: role, Subject: subject, } - return client.DefaultAPI.GetInstanceRoleBindings(ctx, region, resourceId).GetInstanceRoleBindingsPayload(payload).Execute() + return client.GetInstanceRoleBindings(ctx, region, resourceId).GetInstanceRoleBindingsPayload(payload).Execute() }, - ExecUpdateRequest: func(ctx context.Context, client *secretsmanagerV1Alpha.APIClient, region, resourceId, role, subject string) (generic.GenericRoleBindingResponse, error) { + ExecUpdateRequest: func(ctx context.Context, client secretsmanagerV1Alpha.DefaultAPI, region, resourceId, role, subject string) (generic.GenericRoleBindingResponse, error) { payload := secretsmanagerV1Alpha.EditInstanceRoleBindingsPayload{ Role: role, Subject: subject, } - return client.DefaultAPI.EditInstanceRoleBindings(ctx, region, resourceId).EditInstanceRoleBindingsPayload(payload).Execute() + return client.EditInstanceRoleBindings(ctx, region, resourceId).EditInstanceRoleBindingsPayload(payload).Execute() }, - ExecDeleteRequest: func(ctx context.Context, client *secretsmanagerV1Alpha.APIClient, region, resourceId, role, subject string) error { + ExecDeleteRequest: func(ctx context.Context, client secretsmanagerV1Alpha.DefaultAPI, region, resourceId, role, subject string) error { payload := secretsmanagerV1Alpha.RemoveInstanceRoleBindingsPayload{ Role: role, Subject: subject, } - return client.DefaultAPI.RemoveInstanceRoleBindings(ctx, region, resourceId).RemoveInstanceRoleBindingsPayload(payload).Execute() + return client.RemoveInstanceRoleBindings(ctx, region, resourceId).RemoveInstanceRoleBindingsPayload(payload).Execute() }, } } func NewSecretsmanagerInstanceRoleBindingsDatasource() datasource.DataSource { - return &generic.RoleBindingDatasource[secretsmanagerV1Alpha.APIClient]{ - ApiName: "secretsmanager", - ResourceType: "instance", - ApiClientFactory: secretsmanagerUtils.ConfigureV1AlphaClient, - ExecReadRequest: func(ctx context.Context, client *secretsmanagerV1Alpha.APIClient, region, resourceId string) ([]generic.GenericRoleBindingResponse, error) { - resp, err := client.DefaultAPI.ListInstanceRoleBindings(ctx, region, resourceId).Execute() + return &generic.RoleBindingDatasource[secretsmanagerV1Alpha.DefaultAPI]{ + ApiName: "secretsmanager", + ResourceType: "instance", + ApiClientExtractor: func(clientCollection core.RoleBindingClientCollection) secretsmanagerV1Alpha.DefaultAPI { + return clientCollection.SecretsmanagerV1AlphaClient + }, + ExecReadRequest: func(ctx context.Context, client secretsmanagerV1Alpha.DefaultAPI, region, resourceId string) ([]generic.GenericRoleBindingResponse, error) { + resp, err := client.ListInstanceRoleBindings(ctx, region, resourceId).Execute() if err != nil { return nil, err } diff --git a/stackit/internal/services/iam/rolebindings/v1/services/secretsmanager/secret_group.go b/stackit/internal/services/iam/rolebindings/v1/services/secretsmanager/secret_group.go index 329811926..2bbe8ef70 100644 --- a/stackit/internal/services/iam/rolebindings/v1/services/secretsmanager/secret_group.go +++ b/stackit/internal/services/iam/rolebindings/v1/services/secretsmanager/secret_group.go @@ -7,60 +7,64 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource" secretsmanagerV1Alpha "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager/v1alphaapi" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/iam/rolebindings/v1/generic" - - secretsmanagerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/secretsmanager/utils" ) func NewSecretsmanagerSecretGroupRoleBindingResource() resource.Resource { - return &generic.RoleBindingResource[secretsmanagerV1Alpha.APIClient]{ - ApiName: "secretsmanager", - ResourceType: "secret_group", - ApiClientFactory: secretsmanagerUtils.ConfigureV1AlphaClient, - ExecCreateRequest: func(ctx context.Context, client *secretsmanagerV1Alpha.APIClient, region, resourceId, role, subject string) (generic.GenericRoleBindingResponse, error) { + return &generic.RoleBindingResource[secretsmanagerV1Alpha.DefaultAPI]{ + ApiName: "secretsmanager", + ResourceType: "secret_group", + ApiClientExtractor: func(clientCollection core.RoleBindingClientCollection) secretsmanagerV1Alpha.DefaultAPI { + return clientCollection.SecretsmanagerV1AlphaClient + }, + ExecCreateRequest: func(ctx context.Context, client secretsmanagerV1Alpha.DefaultAPI, region, resourceId, role, subject string) (generic.GenericRoleBindingResponse, error) { payload := secretsmanagerV1Alpha.AddSecretGroupRoleBindingsPayload{ Role: role, Subject: subject, } - return client.DefaultAPI.AddSecretGroupRoleBindings(ctx, region, resourceId).AddSecretGroupRoleBindingsPayload(payload).Execute() + return client.AddSecretGroupRoleBindings(ctx, region, resourceId).AddSecretGroupRoleBindingsPayload(payload).Execute() }, - ExecReadRequest: func(ctx context.Context, client *secretsmanagerV1Alpha.APIClient, region, resourceId, role, subject string) (generic.GenericRoleBindingResponse, error) { + ExecReadRequest: func(ctx context.Context, client secretsmanagerV1Alpha.DefaultAPI, region, resourceId, role, subject string) (generic.GenericRoleBindingResponse, error) { payload := secretsmanagerV1Alpha.GetSecretGroupRoleBindingsPayload{ Role: role, Subject: subject, } - return client.DefaultAPI.GetSecretGroupRoleBindings(ctx, region, resourceId).GetSecretGroupRoleBindingsPayload(payload).Execute() + return client.GetSecretGroupRoleBindings(ctx, region, resourceId).GetSecretGroupRoleBindingsPayload(payload).Execute() }, - ExecUpdateRequest: func(ctx context.Context, client *secretsmanagerV1Alpha.APIClient, region, resourceId, role, subject string) (generic.GenericRoleBindingResponse, error) { + ExecUpdateRequest: func(ctx context.Context, client secretsmanagerV1Alpha.DefaultAPI, region, resourceId, role, subject string) (generic.GenericRoleBindingResponse, error) { payload := secretsmanagerV1Alpha.EditSecretGroupRoleBindingsPayload{ Role: role, Subject: subject, } - return client.DefaultAPI.EditSecretGroupRoleBindings(ctx, region, resourceId).EditSecretGroupRoleBindingsPayload(payload).Execute() + return client.EditSecretGroupRoleBindings(ctx, region, resourceId).EditSecretGroupRoleBindingsPayload(payload).Execute() }, - ExecDeleteRequest: func(ctx context.Context, client *secretsmanagerV1Alpha.APIClient, region, resourceId, role, subject string) error { + ExecDeleteRequest: func(ctx context.Context, client secretsmanagerV1Alpha.DefaultAPI, region, resourceId, role, subject string) error { payload := secretsmanagerV1Alpha.RemoveSecretGroupRoleBindingsPayload{ Role: role, Subject: subject, } - return client.DefaultAPI.RemoveSecretGroupRoleBindings(ctx, region, resourceId).RemoveSecretGroupRoleBindingsPayload(payload).Execute() + return client.RemoveSecretGroupRoleBindings(ctx, region, resourceId).RemoveSecretGroupRoleBindingsPayload(payload).Execute() }, } } func NewSecretsmanagerSecretGroupRoleBindingsDatasource() datasource.DataSource { - return &generic.RoleBindingDatasource[secretsmanagerV1Alpha.APIClient]{ - ApiName: "secretsmanager", - ResourceType: "secret_group", - ApiClientFactory: secretsmanagerUtils.ConfigureV1AlphaClient, - ExecReadRequest: func(ctx context.Context, client *secretsmanagerV1Alpha.APIClient, region, resourceId string) ([]generic.GenericRoleBindingResponse, error) { - resp, err := client.DefaultAPI.ListSecretGroupRoleBindings(ctx, region, resourceId).Execute() + return &generic.RoleBindingDatasource[secretsmanagerV1Alpha.DefaultAPI]{ + ApiName: "secretsmanager", + ResourceType: "secret_group", + ApiClientExtractor: func(clientCollection core.RoleBindingClientCollection) secretsmanagerV1Alpha.DefaultAPI { + return clientCollection.SecretsmanagerV1AlphaClient + }, + ExecReadRequest: func(ctx context.Context, client secretsmanagerV1Alpha.DefaultAPI, region, resourceId string) ([]generic.GenericRoleBindingResponse, error) { + resp, err := client.ListSecretGroupRoleBindings(ctx, region, resourceId).Execute() if err != nil { return nil, err } diff --git a/stackit/internal/services/intake/runner/datasource.go b/stackit/internal/services/intake/runner/datasource.go index 3e7d202d4..24ef6d8df 100644 --- a/stackit/internal/services/intake/runner/datasource.go +++ b/stackit/internal/services/intake/runner/datasource.go @@ -13,9 +13,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - intakeUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/intake/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" intake "github.com/stackitcloud/stackit-sdk-go/services/intake/v1betaapi" @@ -32,7 +31,7 @@ func NewRunnerDataSource() datasource.DataSource { } type runnerDataSource struct { - client *intake.APIClient + client intake.DefaultAPI providerData core.ProviderData } @@ -42,17 +41,14 @@ func (r *runnerDataSource) Metadata(_ context.Context, req datasource.MetadataRe // Configure adds the provider configured client to the data source func (r *runnerDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := intakeUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IntakeV1BetaClient + tflog.Info(ctx, "Intake runner client configured for data source") } @@ -150,7 +146,7 @@ func (r *runnerDataSource) Read(ctx context.Context, req datasource.ReadRequest, ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "runner_id", runnerId) - runnerResp, err := r.client.DefaultAPI.GetIntakeRunner(ctx, projectId, region, runnerId).Execute() + runnerResp, err := r.client.GetIntakeRunner(ctx, projectId, region, runnerId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) { diff --git a/stackit/internal/services/intake/runner/resource.go b/stackit/internal/services/intake/runner/resource.go index 53738c288..15cd00e08 100644 --- a/stackit/internal/services/intake/runner/resource.go +++ b/stackit/internal/services/intake/runner/resource.go @@ -20,7 +20,7 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - intakeUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/intake/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -58,7 +58,7 @@ func NewRunnerResource() resource.Resource { // runnerResource is the resource implementation. type runnerResource struct { - client *intake.APIClient + client intake.DefaultAPI providerData core.ProviderData } @@ -69,16 +69,14 @@ func (r *runnerResource) Metadata(_ context.Context, req resource.MetadataReques // Configure adds the provider configured client to the resource. func (r *runnerResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := intakeUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.IntakeV1BetaClient + tflog.Info(ctx, "Intake runner client configured") } @@ -234,7 +232,7 @@ func (r *runnerResource) Create(ctx context.Context, req resource.CreateRequest, } // Create new runner - runnerResp, err := r.client.DefaultAPI.CreateIntakeRunner(ctx, projectId, region).CreateIntakeRunnerPayload(*payload).Execute() + runnerResp, err := r.client.CreateIntakeRunner(ctx, projectId, region).CreateIntakeRunnerPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating runner", fmt.Sprintf("Calling API: %v", err)) return @@ -252,7 +250,7 @@ func (r *runnerResource) Create(ctx context.Context, req resource.CreateRequest, } // Wait for creation of intake runner - _, err = wait.CreateIntakeWaitHandler(ctx, r.client.DefaultAPI, projectId, region, runnerResp.GetId()).WaitWithContext(ctx) + _, err = wait.CreateIntakeWaitHandler(ctx, r.client, projectId, region, runnerResp.GetId()).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating runner", fmt.Sprintf("Intake runner creation waiting: %v", err)) return @@ -287,7 +285,7 @@ func (r *runnerResource) Read(ctx context.Context, req resource.ReadRequest, res ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "runner_id", runnerId) - runnerResp, err := r.client.DefaultAPI.GetIntakeRunner(ctx, projectId, region, runnerId).Execute() + runnerResp, err := r.client.GetIntakeRunner(ctx, projectId, region, runnerId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) { @@ -342,7 +340,7 @@ func (r *runnerResource) Update(ctx context.Context, req resource.UpdateRequest, } // Update runner - runnerResp, err := r.client.DefaultAPI.UpdateIntakeRunner(ctx, projectId, region, runnerId).UpdateIntakeRunnerPayload(*payload).Execute() + runnerResp, err := r.client.UpdateIntakeRunner(ctx, projectId, region, runnerId).UpdateIntakeRunnerPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating runner", fmt.Sprintf("Calling API: %v", err)) return @@ -351,7 +349,7 @@ func (r *runnerResource) Update(ctx context.Context, req resource.UpdateRequest, ctx = core.LogResponse(ctx) // Wait for update - _, err = wait.UpdateIntakeWaitHandler(ctx, r.client.DefaultAPI, projectId, region, runnerId).WaitWithContext(ctx) + _, err = wait.UpdateIntakeWaitHandler(ctx, r.client, projectId, region, runnerId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating runner", fmt.Sprintf("Runner update waiting: %v", err)) return @@ -390,7 +388,7 @@ func (r *runnerResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = tflog.SetField(ctx, "runner_id", runnerId) // Delete existing runner - err := r.client.DefaultAPI.DeleteIntakeRunner(ctx, projectId, region, runnerId).Execute() + err := r.client.DeleteIntakeRunner(ctx, projectId, region, runnerId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -404,7 +402,7 @@ func (r *runnerResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = core.LogResponse(ctx) // Wait for the delete operation to complete - _, err = wait.DeleteIntakeRunnerWaitHandler(ctx, r.client.DefaultAPI, projectId, region, runnerId).WaitWithContext(ctx) + _, err = wait.DeleteIntakeRunnerWaitHandler(ctx, r.client, projectId, region, runnerId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting runner", fmt.Sprintf("Runner deletion waiting: %v", err)) return diff --git a/stackit/internal/services/intake/utils/utils.go b/stackit/internal/services/intake/utils/utils.go deleted file mode 100644 index 87d1fd648..000000000 --- a/stackit/internal/services/intake/utils/utils.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - intake "github.com/stackitcloud/stackit-sdk-go/services/intake/v1betaapi" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *intake.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.IntakeCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.IntakeCustomEndpoint)) - } - apiClient, err := intake.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/kms/key/datasource.go b/stackit/internal/services/kms/key/datasource.go index 802bd0a3d..d049a14ee 100644 --- a/stackit/internal/services/kms/key/datasource.go +++ b/stackit/internal/services/kms/key/datasource.go @@ -13,9 +13,8 @@ import ( sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" kms "github.com/stackitcloud/stackit-sdk-go/services/kms/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - kmsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/kms/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -29,7 +28,7 @@ func NewKeyDataSource() datasource.DataSource { } type keyDataSource struct { - client *kms.APIClient + client kms.DefaultAPI providerData core.ProviderData } @@ -38,16 +37,13 @@ func (k *keyDataSource) Metadata(_ context.Context, req datasource.MetadataReque } func (k *keyDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - k.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - k.client = kmsUtils.ConfigureClient(ctx, &k.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + k.providerData = providerData + k.client = clients.KmsV1Client tflog.Info(ctx, "KMS client configured") } @@ -160,7 +156,7 @@ func (k *keyDataSource) Read(ctx context.Context, req datasource.ReadRequest, re ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "key_id", keyId) - keyResponse, err := k.client.DefaultAPI.GetKey(ctx, projectId, region, keyRingId, keyId).Execute() + keyResponse, err := k.client.GetKey(ctx, projectId, region, keyRingId, keyId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/kms/key/resource.go b/stackit/internal/services/kms/key/resource.go index 52d9da100..3a6a34429 100644 --- a/stackit/internal/services/kms/key/resource.go +++ b/stackit/internal/services/kms/key/resource.go @@ -24,7 +24,7 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - kmsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/kms/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -60,7 +60,7 @@ func NewKeyResource() resource.Resource { } type keyResource struct { - client *kms.APIClient + client kms.DefaultAPI providerData core.ProviderData } @@ -69,16 +69,13 @@ func (r *keyResource) Metadata(_ context.Context, req resource.MetadataRequest, } func (r *keyResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - r.client = kmsUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + r.providerData = providerData + r.client = clients.KmsV1Client tflog.Info(ctx, "KMS client configured") } @@ -260,7 +257,7 @@ func (r *keyResource) Create(ctx context.Context, req resource.CreateRequest, re return } - createResponse, err := r.client.DefaultAPI.CreateKey(ctx, projectId, region, keyRingId).CreateKeyPayload(*payload).Execute() + createResponse, err := r.client.CreateKey(ctx, projectId, region, keyRingId).CreateKeyPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating key", fmt.Sprintf("Calling API: %v", err)) return @@ -281,7 +278,7 @@ func (r *keyResource) Create(ctx context.Context, req resource.CreateRequest, re "key_id": createResponse.Id, }) - waitHandlerResp, err := wait.CreateOrUpdateKeyWaitHandler(ctx, r.client.DefaultAPI, projectId, region, keyRingId, createResponse.Id).WaitWithContext(ctx) + waitHandlerResp, err := wait.CreateOrUpdateKeyWaitHandler(ctx, r.client, projectId, region, keyRingId, createResponse.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error waiting for key creation", fmt.Sprintf("Calling API: %v", err)) return @@ -326,7 +323,7 @@ func (r *keyResource) Read(ctx context.Context, req resource.ReadRequest, resp * ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "key_id", keyId) - keyResponse, err := r.client.DefaultAPI.GetKey(ctx, projectId, region, keyRingId, keyId).Execute() + keyResponse, err := r.client.GetKey(ctx, projectId, region, keyRingId, keyId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -372,7 +369,7 @@ func (r *keyResource) Delete(ctx context.Context, req resource.DeleteRequest, re region := r.providerData.GetRegionWithOverride(model.Region) keyId := model.KeyId.ValueString() - err := r.client.DefaultAPI.DeleteKey(ctx, projectId, region, keyRingId, keyId).Execute() + err := r.client.DeleteKey(ctx, projectId, region, keyRingId, keyId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/kms/keyring/datasource.go b/stackit/internal/services/kms/keyring/datasource.go index 5fa9c84a3..f19852c41 100644 --- a/stackit/internal/services/kms/keyring/datasource.go +++ b/stackit/internal/services/kms/keyring/datasource.go @@ -11,9 +11,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" kms "github.com/stackitcloud/stackit-sdk-go/services/kms/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - kmsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/kms/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -27,7 +26,7 @@ func NewKeyRingDataSource() datasource.DataSource { } type keyRingDataSource struct { - client *kms.APIClient + client kms.DefaultAPI providerData core.ProviderData } @@ -36,18 +35,14 @@ func (k *keyRingDataSource) Metadata(_ context.Context, request datasource.Metad } func (k *keyRingDataSource) Configure(ctx context.Context, request datasource.ConfigureRequest, response *datasource.ConfigureResponse) { - var ok bool - k.providerData, ok = conversion.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) if !ok { return } - apiClient := kmsUtils.ConfigureClient(ctx, &k.providerData, &response.Diagnostics) - if response.Diagnostics.HasError() { - return - } + k.providerData = providerData + k.client = clients.KmsV1Client - k.client = apiClient tflog.Info(ctx, "KMS client configured") } @@ -112,7 +107,7 @@ func (k *keyRingDataSource) Read(ctx context.Context, request datasource.ReadReq ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "region", region) - keyRingResponse, err := k.client.DefaultAPI.GetKeyRing(ctx, projectId, region, keyRingId).Execute() + keyRingResponse, err := k.client.GetKeyRing(ctx, projectId, region, keyRingId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/kms/keyring/resource.go b/stackit/internal/services/kms/keyring/resource.go index 432d50642..6c08d3ad9 100644 --- a/stackit/internal/services/kms/keyring/resource.go +++ b/stackit/internal/services/kms/keyring/resource.go @@ -22,7 +22,7 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - kmsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/kms/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -52,7 +52,7 @@ func NewKeyRingResource() resource.Resource { } type keyRingResource struct { - client *kms.APIClient + client kms.DefaultAPI providerData core.ProviderData } @@ -61,16 +61,13 @@ func (r *keyRingResource) Metadata(_ context.Context, request resource.MetadataR } func (r *keyRingResource) Configure(ctx context.Context, request resource.ConfigureRequest, response *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) if !ok { return } - r.client = kmsUtils.ConfigureClient(ctx, &r.providerData, &response.Diagnostics) - if response.Diagnostics.HasError() { - return - } + r.providerData = providerData + r.client = clients.KmsV1Client tflog.Info(ctx, "KMS client configured") } @@ -192,7 +189,7 @@ func (r *keyRingResource) Create(ctx context.Context, req resource.CreateRequest core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating keyring", fmt.Sprintf("Creating API payload: %v", err)) return } - createResponse, err := r.client.DefaultAPI.CreateKeyRing(ctx, projectId, region).CreateKeyRingPayload(*payload).Execute() + createResponse, err := r.client.CreateKeyRing(ctx, projectId, region).CreateKeyRingPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating keyring", fmt.Sprintf("Calling API: %v", err)) return @@ -213,7 +210,7 @@ func (r *keyRingResource) Create(ctx context.Context, req resource.CreateRequest "keyring_id": keyRingId, }) - waitResp, err := wait.CreateKeyRingWaitHandler(ctx, r.client.DefaultAPI, projectId, region, keyRingId).SetSleepBeforeWait(5 * time.Second).WaitWithContext(ctx) + waitResp, err := wait.CreateKeyRingWaitHandler(ctx, r.client, projectId, region, keyRingId).SetSleepBeforeWait(5 * time.Second).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating keyring", fmt.Sprintf("Key Ring creation waiting: %v", err)) return @@ -256,7 +253,7 @@ func (r *keyRingResource) Read(ctx context.Context, req resource.ReadRequest, re ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "region", region) - keyRingResponse, err := r.client.DefaultAPI.GetKeyRing(ctx, projectId, region, keyRingId).Execute() + keyRingResponse, err := r.client.GetKeyRing(ctx, projectId, region, keyRingId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) diff --git a/stackit/internal/services/kms/utils/util.go b/stackit/internal/services/kms/utils/util.go deleted file mode 100644 index c3338b824..000000000 --- a/stackit/internal/services/kms/utils/util.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - kms "github.com/stackitcloud/stackit-sdk-go/services/kms/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *kms.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.KMSCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.KMSCustomEndpoint)) - } - apiClient, err := kms.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/kms/wrapping-key/datasource.go b/stackit/internal/services/kms/wrapping-key/datasource.go index 937c71224..c00345e87 100644 --- a/stackit/internal/services/kms/wrapping-key/datasource.go +++ b/stackit/internal/services/kms/wrapping-key/datasource.go @@ -12,9 +12,8 @@ import ( sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" kms "github.com/stackitcloud/stackit-sdk-go/services/kms/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - kmsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/kms/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -28,7 +27,7 @@ func NewWrappingKeyDataSource() datasource.DataSource { } type wrappingKeyDataSource struct { - client *kms.APIClient + client kms.DefaultAPI providerData core.ProviderData } @@ -37,16 +36,13 @@ func (w *wrappingKeyDataSource) Metadata(_ context.Context, request datasource.M } func (w *wrappingKeyDataSource) Configure(ctx context.Context, request datasource.ConfigureRequest, response *datasource.ConfigureResponse) { - var ok bool - w.providerData, ok = conversion.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) if !ok { return } - w.client = kmsUtils.ConfigureClient(ctx, &w.providerData, &response.Diagnostics) - if response.Diagnostics.HasError() { - return - } + w.providerData = providerData + w.client = clients.KmsV1Client tflog.Info(ctx, "KMS client configured") } @@ -148,7 +144,7 @@ func (w *wrappingKeyDataSource) Read(ctx context.Context, request datasource.Rea ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "wrapping_key_id", wrappingKeyId) - wrappingKeyResponse, err := w.client.DefaultAPI.GetWrappingKey(ctx, projectId, region, keyRingId, wrappingKeyId).Execute() + wrappingKeyResponse, err := w.client.GetWrappingKey(ctx, projectId, region, keyRingId, wrappingKeyId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/kms/wrapping-key/resource.go b/stackit/internal/services/kms/wrapping-key/resource.go index 767be11d8..245a905c0 100644 --- a/stackit/internal/services/kms/wrapping-key/resource.go +++ b/stackit/internal/services/kms/wrapping-key/resource.go @@ -26,7 +26,7 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - kmsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/kms/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -60,7 +60,7 @@ func NewWrappingKeyResource() resource.Resource { } type wrappingKeyResource struct { - client *kms.APIClient + client kms.DefaultAPI providerData core.ProviderData } @@ -69,16 +69,13 @@ func (r *wrappingKeyResource) Metadata(_ context.Context, request resource.Metad } func (r *wrappingKeyResource) Configure(ctx context.Context, request resource.ConfigureRequest, response *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) if !ok { return } - r.client = kmsUtils.ConfigureClient(ctx, &r.providerData, &response.Diagnostics) - if response.Diagnostics.HasError() { - return - } + r.providerData = providerData + r.client = clients.KmsV1Client tflog.Info(ctx, "KMS client configured") } @@ -265,7 +262,7 @@ func (r *wrappingKeyResource) Create(ctx context.Context, req resource.CreateReq return } - createWrappingKeyResp, err := r.client.DefaultAPI.CreateWrappingKey(ctx, projectId, region, keyRingId).CreateWrappingKeyPayload(*payload).Execute() + createWrappingKeyResp, err := r.client.CreateWrappingKey(ctx, projectId, region, keyRingId).CreateWrappingKeyPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating wrapping key", fmt.Sprintf("Calling API: %v", err)) return @@ -288,7 +285,7 @@ func (r *wrappingKeyResource) Create(ctx context.Context, req resource.CreateReq "wrapping_key_id": wrappingKeyId, }) - wrappingKey, err := wait.CreateWrappingKeyWaitHandler(ctx, r.client.DefaultAPI, projectId, region, keyRingId, wrappingKeyId).WaitWithContext(ctx) + wrappingKey, err := wait.CreateWrappingKeyWaitHandler(ctx, r.client, projectId, region, keyRingId, wrappingKeyId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error waiting for wrapping key creation", fmt.Sprintf("Calling API: %v", err)) return @@ -333,7 +330,7 @@ func (r *wrappingKeyResource) Read(ctx context.Context, request resource.ReadReq ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "wrapping_key_id", wrappingKeyId) - wrappingKeyResponse, err := r.client.DefaultAPI.GetWrappingKey(ctx, projectId, region, keyRingId, wrappingKeyId).Execute() + wrappingKeyResponse, err := r.client.GetWrappingKey(ctx, projectId, region, keyRingId, wrappingKeyId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -379,7 +376,7 @@ func (r *wrappingKeyResource) Delete(ctx context.Context, request resource.Delet region := r.providerData.GetRegionWithOverride(model.Region) wrappingKeyId := model.WrappingKeyId.ValueString() - err := r.client.DefaultAPI.DeleteWrappingKey(ctx, projectId, region, keyRingId, wrappingKeyId).Execute() + err := r.client.DeleteWrappingKey(ctx, projectId, region, keyRingId, wrappingKeyId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/loadbalancer/loadbalancer/datasource.go b/stackit/internal/services/loadbalancer/loadbalancer/datasource.go index 83cfc6401..a693a9baf 100644 --- a/stackit/internal/services/loadbalancer/loadbalancer/datasource.go +++ b/stackit/internal/services/loadbalancer/loadbalancer/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - loadbalancerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/loadbalancer/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/setvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" @@ -36,7 +33,7 @@ func NewLoadBalancerDataSource() datasource.DataSource { // loadBalancerDataSource is the data source implementation. type loadBalancerDataSource struct { - client *loadbalancer.APIClient + client loadbalancer.DefaultAPI providerData core.ProviderData } @@ -47,17 +44,14 @@ func (r *loadBalancerDataSource) Metadata(_ context.Context, req datasource.Meta // Configure adds the provider configured client to the data source. func (r *loadBalancerDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := loadbalancerUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.LoadbalancerV2Client + tflog.Info(ctx, "Load balancer client configured") } @@ -405,7 +399,7 @@ func (r *loadBalancerDataSource) Read(ctx context.Context, req datasource.ReadRe ctx = tflog.SetField(ctx, "name", name) ctx = tflog.SetField(ctx, "region", region) - lbResp, err := r.client.DefaultAPI.GetLoadBalancer(ctx, projectId, region, name).Execute() + lbResp, err := r.client.GetLoadBalancer(ctx, projectId, region, name).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/loadbalancer/loadbalancer/resource.go b/stackit/internal/services/loadbalancer/loadbalancer/resource.go index bc640ebd9..c8cb70fec 100644 --- a/stackit/internal/services/loadbalancer/loadbalancer/resource.go +++ b/stackit/internal/services/loadbalancer/loadbalancer/resource.go @@ -12,8 +12,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema/booldefault" "github.com/hashicorp/terraform-plugin-framework/resource/schema/int32planmodifier" - loadbalancerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/loadbalancer/utils" - "github.com/google/uuid" "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/setvalidator" @@ -227,7 +225,7 @@ func NewLoadBalancerResource() resource.Resource { // loadBalancerResource is the resource implementation. type loadBalancerResource struct { - client *loadbalancer.APIClient + client loadbalancer.DefaultAPI providerData core.ProviderData } @@ -305,17 +303,14 @@ func validateConfig(ctx context.Context, diags *diag.Diagnostics, model *Model) // Configure adds the provider configured client to the resource. func (r *loadBalancerResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := loadbalancerUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.LoadbalancerV2Client + tflog.Info(ctx, "Load Balancer client configured") } @@ -774,7 +769,7 @@ func (r *loadBalancerResource) Create(ctx context.Context, req resource.CreateRe } // Create a new load balancer - createResp, err := r.client.DefaultAPI.CreateLoadBalancer(ctx, projectId, region).CreateLoadBalancerPayload(*payload).XRequestID(uuid.NewString()).Execute() + createResp, err := r.client.CreateLoadBalancer(ctx, projectId, region).CreateLoadBalancerPayload(*payload).XRequestID(uuid.NewString()).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating load balancer", fmt.Sprintf("Calling API: %v", err)) return @@ -797,7 +792,7 @@ func (r *loadBalancerResource) Create(ctx context.Context, req resource.CreateRe return } - waitResp, err := wait.CreateLoadBalancerWaitHandler(ctx, r.client.DefaultAPI, projectId, region, *createResp.Name).SetTimeout(90 * time.Minute).WaitWithContext(ctx) + waitResp, err := wait.CreateLoadBalancerWaitHandler(ctx, r.client, projectId, region, *createResp.Name).SetTimeout(90 * time.Minute).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating load balancer", fmt.Sprintf("Load balancer creation waiting: %v", err)) return @@ -839,7 +834,7 @@ func (r *loadBalancerResource) Read(ctx context.Context, req resource.ReadReques ctx = tflog.SetField(ctx, "name", name) ctx = tflog.SetField(ctx, "region", region) - lbResp, err := r.client.DefaultAPI.GetLoadBalancer(ctx, projectId, region, name).Execute() + lbResp, err := r.client.GetLoadBalancer(ctx, projectId, region, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -902,7 +897,7 @@ func (r *loadBalancerResource) Update(ctx context.Context, req resource.UpdateRe return } - loadBalancer, err := r.client.DefaultAPI.UpdateLoadBalancer(ctx, projectId, region, name).UpdateLoadBalancerPayload(*payload).Execute() + loadBalancer, err := r.client.UpdateLoadBalancer(ctx, projectId, region, name).UpdateLoadBalancerPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating load balancer", fmt.Sprintf("Calling API: %v", utils.PrettyApiErr(ctx, &resp.Diagnostics, err))) return @@ -946,7 +941,7 @@ func (r *loadBalancerResource) Delete(ctx context.Context, req resource.DeleteRe ctx = tflog.SetField(ctx, "region", region) // Delete load balancer - _, err := r.client.DefaultAPI.DeleteLoadBalancer(ctx, projectId, region, name).Execute() + _, err := r.client.DeleteLoadBalancer(ctx, projectId, region, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -959,7 +954,7 @@ func (r *loadBalancerResource) Delete(ctx context.Context, req resource.DeleteRe ctx = core.LogResponse(ctx) - _, err = wait.DeleteLoadBalancerWaitHandler(ctx, r.client.DefaultAPI, projectId, region, name).WaitWithContext(ctx) + _, err = wait.DeleteLoadBalancerWaitHandler(ctx, r.client, projectId, region, name).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting load balancer", fmt.Sprintf("Load balancer deleting waiting: %v", err)) return diff --git a/stackit/internal/services/loadbalancer/observability-credential/resource.go b/stackit/internal/services/loadbalancer/observability-credential/resource.go index 2cfc8de52..19f246a14 100644 --- a/stackit/internal/services/loadbalancer/observability-credential/resource.go +++ b/stackit/internal/services/loadbalancer/observability-credential/resource.go @@ -7,8 +7,6 @@ import ( "net/http" "strings" - loadbalancerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/loadbalancer/utils" - "github.com/google/uuid" "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/resource" @@ -52,7 +50,7 @@ func NewObservabilityCredentialResource() resource.Resource { // observabilityCredentialResource is the resource implementation. type observabilityCredentialResource struct { - client *loadbalancer.APIClient + client loadbalancer.DefaultAPI providerData core.ProviderData } @@ -93,17 +91,14 @@ func (r *observabilityCredentialResource) ModifyPlan(ctx context.Context, req re // Configure adds the provider configured client to the resource. func (r *observabilityCredentialResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := loadbalancerUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.LoadbalancerV2Client + tflog.Info(ctx, "Load Balancer client configured") } @@ -206,7 +201,7 @@ func (r *observabilityCredentialResource) Create(ctx context.Context, req resour } // Create new observability credentials - createResp, err := r.client.DefaultAPI.CreateCredentials(ctx, projectId, region).CreateCredentialsPayload(*payload).XRequestID(uuid.NewString()).Execute() + createResp, err := r.client.CreateCredentials(ctx, projectId, region).CreateCredentialsPayload(*payload).XRequestID(uuid.NewString()).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating observability credential", fmt.Sprintf("Calling API: %v", err)) return @@ -258,7 +253,7 @@ func (r *observabilityCredentialResource) Read(ctx context.Context, req resource } // Get credentials - credResp, err := r.client.DefaultAPI.GetCredentials(ctx, projectId, region, credentialsRef).Execute() + credResp, err := r.client.GetCredentials(ctx, projectId, region, credentialsRef).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -311,7 +306,7 @@ func (r *observabilityCredentialResource) Delete(ctx context.Context, req resour ctx = tflog.SetField(ctx, "region", region) // Delete credentials - _, err := r.client.DefaultAPI.DeleteCredentials(ctx, projectId, region, credentialsRef).Execute() + _, err := r.client.DeleteCredentials(ctx, projectId, region, credentialsRef).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/loadbalancer/utils/util.go b/stackit/internal/services/loadbalancer/utils/util.go deleted file mode 100644 index 74d3f8de6..000000000 --- a/stackit/internal/services/loadbalancer/utils/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - loadbalancer "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer/v2api" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *loadbalancer.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.LoadBalancerCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.LoadBalancerCustomEndpoint)) - } - apiClient, err := loadbalancer.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/loadbalancer/utils/util_test.go b/stackit/internal/services/loadbalancer/utils/util_test.go deleted file mode 100644 index 713ad4587..000000000 --- a/stackit/internal/services/loadbalancer/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - loadbalancer "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://loadbalancer-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *loadbalancer.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *loadbalancer.APIClient { - apiClient, err := loadbalancer.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - LoadBalancerCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *loadbalancer.APIClient { - apiClient, err := loadbalancer.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/logme/credential/datasource.go b/stackit/internal/services/logme/credential/datasource.go index 519d67321..258b50b9d 100644 --- a/stackit/internal/services/logme/credential/datasource.go +++ b/stackit/internal/services/logme/credential/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - logmeUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/logme/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -32,7 +29,7 @@ func NewCredentialDataSource() datasource.DataSource { // credentialDataSource is the data source implementation. type credentialDataSource struct { - client *logmeSdk.APIClient + client logmeSdk.DefaultAPI providerData core.ProviderData } @@ -43,17 +40,14 @@ func (d *credentialDataSource) Metadata(_ context.Context, req datasource.Metada // Configure adds the provider configured client to the data source. func (d *credentialDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := logmeUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.LogmeV2Client + tflog.Info(ctx, "LogMe credential client configured") } @@ -146,7 +140,7 @@ func (d *credentialDataSource) Read(ctx context.Context, req datasource.ReadRequ ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "credential_id", credentialId) - recordSetResp, err := d.client.DefaultAPI.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + recordSetResp, err := d.client.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/logme/credential/resource.go b/stackit/internal/services/logme/credential/resource.go index 298398bbd..45c10ec74 100644 --- a/stackit/internal/services/logme/credential/resource.go +++ b/stackit/internal/services/logme/credential/resource.go @@ -9,9 +9,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - logmeUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/logme/utils" - "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -57,7 +54,7 @@ func NewCredentialResource() resource.Resource { // credentialResource is the resource implementation. type credentialResource struct { - client *logmeSdk.APIClient + client logmeSdk.DefaultAPI providerData core.ProviderData } @@ -69,16 +66,14 @@ func (r *credentialResource) Metadata(_ context.Context, req resource.MetadataRe // Configure adds the provider configured client to the resource. func (r *credentialResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := logmeUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.LogmeV2Client + tflog.Info(ctx, "LogMe credential client configured") } @@ -217,7 +212,7 @@ func (r *credentialResource) Create(ctx context.Context, req resource.CreateRequ ctx = tflog.SetField(ctx, "instance_id", instanceId) // Create new recordset - credentialsResp, err := r.client.DefaultAPI.CreateCredentials(ctx, projectId, region, instanceId).Execute() + credentialsResp, err := r.client.CreateCredentials(ctx, projectId, region, instanceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating credential", fmt.Sprintf("Calling API: %v", err)) return @@ -237,7 +232,7 @@ func (r *credentialResource) Create(ctx context.Context, req resource.CreateRequ return } - waitResp, err := wait.CreateCredentialsWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, credentialId).WaitWithContext(ctx) + waitResp, err := wait.CreateCredentialsWaitHandler(ctx, r.client, projectId, region, instanceId, credentialId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating credential", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -282,7 +277,7 @@ func (r *credentialResource) Read(ctx context.Context, req resource.ReadRequest, ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "credential_id", credentialId) - recordSetResp, err := r.client.DefaultAPI.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + recordSetResp, err := r.client.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -338,7 +333,7 @@ func (r *credentialResource) Delete(ctx context.Context, req resource.DeleteRequ ctx = tflog.SetField(ctx, "credential_id", credentialId) // Delete existing record set - err := r.client.DefaultAPI.DeleteCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + err := r.client.DeleteCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -350,7 +345,7 @@ func (r *credentialResource) Delete(ctx context.Context, req resource.DeleteRequ ctx = core.LogResponse(ctx) - _, err = wait.DeleteCredentialsWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, credentialId).WaitWithContext(ctx) + _, err = wait.DeleteCredentialsWaitHandler(ctx, r.client, projectId, region, instanceId, credentialId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting credential", fmt.Sprintf("Instance deletion waiting: %v", err)) return diff --git a/stackit/internal/services/logme/instance/datasource.go b/stackit/internal/services/logme/instance/datasource.go index 0e14166fb..eba795344 100644 --- a/stackit/internal/services/logme/instance/datasource.go +++ b/stackit/internal/services/logme/instance/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - logmeUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/logme/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types" @@ -33,7 +30,7 @@ func NewInstanceDataSource() datasource.DataSource { // instanceDataSource is the data source implementation. type instanceDataSource struct { - client *logmeSdk.APIClient + client logmeSdk.DefaultAPI providerData core.ProviderData } @@ -44,17 +41,14 @@ func (d *instanceDataSource) Metadata(_ context.Context, req datasource.Metadata // Configure adds the provider configured client to the data source. func (d *instanceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := logmeUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.LogmeV2Client + tflog.Info(ctx, "LogMe instance client configured") } @@ -266,7 +260,7 @@ func (d *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceId) - instanceResp, err := d.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := d.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/logme/instance/resource.go b/stackit/internal/services/logme/instance/resource.go index cef9a517b..5639ea686 100644 --- a/stackit/internal/services/logme/instance/resource.go +++ b/stackit/internal/services/logme/instance/resource.go @@ -12,8 +12,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - logmeUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/logme/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -119,7 +117,7 @@ func NewInstanceResource() resource.Resource { // instanceResource is the resource implementation. type instanceResource struct { - client *logmeSdk.APIClient + client logmeSdk.DefaultAPI providerData core.ProviderData } @@ -130,17 +128,14 @@ func (r *instanceResource) Metadata(_ context.Context, req resource.MetadataRequ // Configure adds the provider configured client to the resource. func (r *instanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := logmeUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.LogmeV2Client + tflog.Info(ctx, "LogMe instance client configured") } @@ -467,7 +462,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } // Create new instance - createResp, err := r.client.DefaultAPI.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() + createResp, err := r.client.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -486,7 +481,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } - waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).SetTimeout(90 * time.Minute).WaitWithContext(ctx) + waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).SetTimeout(90 * time.Minute).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -531,7 +526,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceId) - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && (oapiErr.StatusCode == http.StatusNotFound || oapiErr.StatusCode == http.StatusGone) { @@ -608,7 +603,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques return } // Update existing instance - err = r.client.DefaultAPI.PartialUpdateInstance(ctx, projectId, region, instanceId).PartialUpdateInstancePayload(*payload).Execute() + err = r.client.PartialUpdateInstance(ctx, projectId, region, instanceId).PartialUpdateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -616,7 +611,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques ctx = core.LogResponse(ctx) - waitResp, err := wait.PartialUpdateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + waitResp, err := wait.PartialUpdateInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Instance update waiting: %v", err)) return @@ -657,7 +652,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = tflog.SetField(ctx, "instance_id", instanceId) // Delete existing instance - err := r.client.DefaultAPI.DeleteInstance(ctx, projectId, region, instanceId).Execute() + err := r.client.DeleteInstance(ctx, projectId, region, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -670,7 +665,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = core.LogResponse(ctx) - _, err = wait.DeleteInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + _, err = wait.DeleteInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting instance", fmt.Sprintf("Instance deletion waiting: %v", err)) return @@ -969,7 +964,7 @@ func toInstanceParams(parameters *parametersModel) (*logmeSdk.InstanceParameters func (r *instanceResource) loadPlanId(ctx context.Context, model *Model, region string) error { projectId := model.ProjectId.ValueString() - res, err := r.client.DefaultAPI.ListOfferings(ctx, projectId, region).Execute() + res, err := r.client.ListOfferings(ctx, projectId, region).Execute() if err != nil { return fmt.Errorf("getting LogMe offerings: %w", err) } @@ -1004,10 +999,10 @@ func (r *instanceResource) loadPlanId(ctx context.Context, model *Model, region return fmt.Errorf("couldn't find plan_name '%s' for version %s, available names are: %s", planName, version, availablePlanNames) } -func loadPlanNameAndVersion(ctx context.Context, client *logmeSdk.APIClient, model *Model, region string) error { +func loadPlanNameAndVersion(ctx context.Context, client logmeSdk.DefaultAPI, model *Model, region string) error { projectId := model.ProjectId.ValueString() planId := model.PlanId.ValueString() - res, err := client.DefaultAPI.ListOfferings(ctx, projectId, region).Execute() + res, err := client.ListOfferings(ctx, projectId, region).Execute() if err != nil { return fmt.Errorf("getting LogMe offerings: %w", err) } diff --git a/stackit/internal/services/logme/utils/util.go b/stackit/internal/services/logme/utils/util.go deleted file mode 100644 index c4b34b4f6..000000000 --- a/stackit/internal/services/logme/utils/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - logmeSdk "github.com/stackitcloud/stackit-sdk-go/services/logme/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *logmeSdk.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.LogMeCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.LogMeCustomEndpoint)) - } - - apiClient, err := logmeSdk.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/logme/utils/util_test.go b/stackit/internal/services/logme/utils/util_test.go deleted file mode 100644 index 9bb38397a..000000000 --- a/stackit/internal/services/logme/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - logmeSdk "github.com/stackitcloud/stackit-sdk-go/services/logme/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://logme-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *logmeSdk.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *logmeSdk.APIClient { - apiClient, err := logmeSdk.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - LogMeCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *logmeSdk.APIClient { - apiClient, err := logmeSdk.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/logs/accesstoken/datasource.go b/stackit/internal/services/logs/accesstoken/datasource.go index f39f5602b..428c50c02 100644 --- a/stackit/internal/services/logs/accesstoken/datasource.go +++ b/stackit/internal/services/logs/accesstoken/datasource.go @@ -15,9 +15,7 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" logs "github.com/stackitcloud/stackit-sdk-go/services/logs/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/logs/utils" tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -47,7 +45,7 @@ func NewLogsAccessTokenDataSource() datasource.DataSource { } type logsAccessTokenDataSource struct { - client *logs.APIClient + client logs.DefaultAPI providerData core.ProviderData } @@ -56,17 +54,14 @@ func (d *logsAccessTokenDataSource) Metadata(_ context.Context, req datasource.M } func (d *logsAccessTokenDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.providerData = providerData + d.client = clients.LogsV1Client - apiClient := utils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient tflog.Info(ctx, "Logs client configured") } @@ -161,7 +156,7 @@ func (d *logsAccessTokenDataSource) Read(ctx context.Context, req datasource.Rea ctx = tflog.SetField(ctx, "instance_id", instanceID) ctx = tflog.SetField(ctx, "access_token_id", accessTokenID) - accessTokenResponse, err := d.client.DefaultAPI.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute() + accessTokenResponse, err := d.client.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute() if err != nil { tfutils.LogError( ctx, diff --git a/stackit/internal/services/logs/accesstoken/resource.go b/stackit/internal/services/logs/accesstoken/resource.go index c7223ef59..b818491fe 100644 --- a/stackit/internal/services/logs/accesstoken/resource.go +++ b/stackit/internal/services/logs/accesstoken/resource.go @@ -24,8 +24,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" logs "github.com/stackitcloud/stackit-sdk-go/services/logs/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/logs/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" @@ -82,7 +80,7 @@ type Model struct { } type logsAccessTokenResource struct { - client *logs.APIClient + client logs.DefaultAPI providerData core.ProviderData } @@ -91,16 +89,14 @@ func NewLogsAccessTokenResource() resource.Resource { } func (r *logsAccessTokenResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - r.client = utils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + r.providerData = providerData + r.client = clients.LogsV1Client + tflog.Info(ctx, "Logs client configured") } @@ -279,7 +275,7 @@ func (r *logsAccessTokenResource) Create(ctx context.Context, req resource.Creat return } - createResp, err := r.client.DefaultAPI.CreateAccessToken(ctx, projectId, region, instanceId).CreateAccessTokenPayload(*payload).Execute() + createResp, err := r.client.CreateAccessToken(ctx, projectId, region, instanceId).CreateAccessTokenPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating Logs access token", fmt.Sprintf("Calling API: %v", err)) return @@ -327,7 +323,7 @@ func (r *logsAccessTokenResource) Read(ctx context.Context, req resource.ReadReq ctx = tflog.SetField(ctx, "instance_id", instanceID) ctx = tflog.SetField(ctx, "access_token_id", accessTokenID) - accessTokenResponse, err := r.client.DefaultAPI.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute() + accessTokenResponse, err := r.client.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) @@ -381,7 +377,7 @@ func (r *logsAccessTokenResource) Update(ctx context.Context, req resource.Updat return } - err = r.client.DefaultAPI.UpdateAccessToken(ctx, projectID, region, instanceID, accessTokenID).UpdateAccessTokenPayload(*payload).Execute() + err = r.client.UpdateAccessToken(ctx, projectID, region, instanceID, accessTokenID).UpdateAccessTokenPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating Logs access token", fmt.Sprintf("Calling API: %v", err)) return @@ -389,7 +385,7 @@ func (r *logsAccessTokenResource) Update(ctx context.Context, req resource.Updat ctx = core.LogResponse(ctx) - accessTokenResponse, err := r.client.DefaultAPI.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute() + accessTokenResponse, err := r.client.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating Logs access token", fmt.Sprintf("Calling API: %v", err)) return @@ -431,7 +427,7 @@ func (r *logsAccessTokenResource) Delete(ctx context.Context, req resource.Delet ctx = tflog.SetField(ctx, "instance_id", instanceID) ctx = tflog.SetField(ctx, "access_token_id", accessTokenID) - err := r.client.DefaultAPI.DeleteAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute() + err := r.client.DeleteAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/logs/instance/datasource.go b/stackit/internal/services/logs/instance/datasource.go index c81d0e445..4152d46d3 100644 --- a/stackit/internal/services/logs/instance/datasource.go +++ b/stackit/internal/services/logs/instance/datasource.go @@ -15,9 +15,7 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" logs "github.com/stackitcloud/stackit-sdk-go/services/logs/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/logs/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -30,7 +28,7 @@ func NewLogsInstanceDataSource() datasource.DataSource { } type logsInstanceDataSource struct { - client *logs.APIClient + client logs.DefaultAPI providerData core.ProviderData } @@ -39,17 +37,14 @@ func (d *logsInstanceDataSource) Metadata(_ context.Context, req datasource.Meta } func (d *logsInstanceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.providerData = providerData + d.client = clients.LogsV1Client - apiClient := utils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient tflog.Info(ctx, "Logs client configured") } @@ -150,7 +145,7 @@ func (d *logsInstanceDataSource) Read(ctx context.Context, req datasource.ReadRe ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceID) - instanceResponse, err := d.client.DefaultAPI.GetLogsInstance(ctx, projectID, region, instanceID).Execute() + instanceResponse, err := d.client.GetLogsInstance(ctx, projectID, region, instanceID).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) diff --git a/stackit/internal/services/logs/instance/resource.go b/stackit/internal/services/logs/instance/resource.go index 32d1fc6ba..99c0fb2e8 100644 --- a/stackit/internal/services/logs/instance/resource.go +++ b/stackit/internal/services/logs/instance/resource.go @@ -21,7 +21,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/logs/utils" tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -73,7 +72,7 @@ type Model struct { } type logsInstanceResource struct { - client *logs.APIClient + client logs.DefaultAPI providerData core.ProviderData } @@ -82,17 +81,14 @@ func NewLogsInstanceResource() resource.Resource { } func (r *logsInstanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := utils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient r.providerData = providerData + r.client = clients.LogsV1Client + tflog.Info(ctx, "Logs client configured") } @@ -241,7 +237,7 @@ func (r *logsInstanceResource) Create(ctx context.Context, req resource.CreateRe regionId := r.providerData.GetRegionWithOverride(model.Region) ctx = tflog.SetField(ctx, "region", regionId) - createResp, err := r.client.DefaultAPI.CreateLogsInstance(ctx, projectId, regionId).CreateLogsInstancePayload(*payload).Execute() + createResp, err := r.client.CreateLogsInstance(ctx, projectId, regionId).CreateLogsInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating Logs Instance", fmt.Sprintf("Calling API: %v", err)) return @@ -264,7 +260,7 @@ func (r *logsInstanceResource) Create(ctx context.Context, req resource.CreateRe return } - waitResp, err := wait.CreateLogsInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, regionId, createResp.Id).WaitWithContext(ctx) + waitResp, err := wait.CreateLogsInstanceWaitHandler(ctx, r.client, projectId, regionId, createResp.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating Logs Instance", fmt.Sprintf("Waiting for Logs Instance to become active: %v", err)) return @@ -306,7 +302,7 @@ func (r *logsInstanceResource) Read(ctx context.Context, req resource.ReadReques ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceID) - instanceResponse, err := r.client.DefaultAPI.GetLogsInstance(ctx, projectID, region, instanceID).Execute() + instanceResponse, err := r.client.GetLogsInstance(ctx, projectID, region, instanceID).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) @@ -358,7 +354,7 @@ func (r *logsInstanceResource) Update(ctx context.Context, req resource.UpdateRe return } - updateResp, err := r.client.DefaultAPI.UpdateLogsInstance(ctx, projectID, region, instanceID).UpdateLogsInstancePayload(*payload).Execute() + updateResp, err := r.client.UpdateLogsInstance(ctx, projectID, region, instanceID).UpdateLogsInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating Logs Instance", fmt.Sprintf("Calling API: %v", err)) return @@ -400,7 +396,7 @@ func (r *logsInstanceResource) Delete(ctx context.Context, req resource.DeleteRe ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceID) - err := r.client.DefaultAPI.DeleteLogsInstance(ctx, projectID, region, instanceID).Execute() + err := r.client.DeleteLogsInstance(ctx, projectID, region, instanceID).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -412,7 +408,7 @@ func (r *logsInstanceResource) Delete(ctx context.Context, req resource.DeleteRe ctx = core.LogResponse(ctx) - _, err = wait.DeleteLogsInstanceWaitHandler(ctx, r.client.DefaultAPI, projectID, region, instanceID).WaitWithContext(ctx) + _, err = wait.DeleteLogsInstanceWaitHandler(ctx, r.client, projectID, region, instanceID).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting Logs Instance", fmt.Sprintf("Waiting for Logs Instance to be deleted: %v", err)) return diff --git a/stackit/internal/services/logs/utils/utils.go b/stackit/internal/services/logs/utils/utils.go deleted file mode 100644 index aa1042590..000000000 --- a/stackit/internal/services/logs/utils/utils.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - logs "github.com/stackitcloud/stackit-sdk-go/services/logs/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *logs.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.LogsCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.LogsCustomEndpoint)) - } - apiClient, err := logs.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/logs/utils/utils_test.go b/stackit/internal/services/logs/utils/utils_test.go deleted file mode 100644 index 943327de0..000000000 --- a/stackit/internal/services/logs/utils/utils_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - logs "github.com/stackitcloud/stackit-sdk-go/services/logs/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://logs-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *logs.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *logs.APIClient { - apiClient, err := logs.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - LogsCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *logs.APIClient { - apiClient, err := logs.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/mariadb/credential/datasource.go b/stackit/internal/services/mariadb/credential/datasource.go index a2f3505f1..4f44e9eb8 100644 --- a/stackit/internal/services/mariadb/credential/datasource.go +++ b/stackit/internal/services/mariadb/credential/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - mariadbUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/mariadb/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -49,7 +46,7 @@ func NewCredentialDataSource() datasource.DataSource { // credentialDataSource is the data source implementation. type credentialDataSource struct { - client *mariadb.APIClient + client mariadb.DefaultAPI providerData core.ProviderData } @@ -60,17 +57,14 @@ func (d *credentialDataSource) Metadata(_ context.Context, req datasource.Metada // Configure adds the provider configured client to the data source. func (d *credentialDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := mariadbUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.MariadbV2Client + tflog.Info(ctx, "mariadb credential client configured") } @@ -170,7 +164,7 @@ func (d *credentialDataSource) Read(ctx context.Context, req datasource.ReadRequ ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "credential_id", credentialId) - recordSetResp, err := d.client.DefaultAPI.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + recordSetResp, err := d.client.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/mariadb/credential/resource.go b/stackit/internal/services/mariadb/credential/resource.go index 90f322a34..a9acdbc07 100644 --- a/stackit/internal/services/mariadb/credential/resource.go +++ b/stackit/internal/services/mariadb/credential/resource.go @@ -9,9 +9,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema/mapplanmodifier" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - mariadbUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/mariadb/utils" - "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -64,7 +61,7 @@ func NewCredentialResource() resource.Resource { // credentialResource is the resource implementation. type credentialResource struct { - client *mariadb.APIClient + client mariadb.DefaultAPI providerData core.ProviderData } @@ -75,17 +72,14 @@ func (r *credentialResource) Metadata(_ context.Context, req resource.MetadataRe // Configure adds the provider configured client to the resource. func (r *credentialResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := mariadbUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.MariadbV2Client + tflog.Info(ctx, "MariaDB credential client configured") } @@ -243,7 +237,7 @@ func (r *credentialResource) Create(ctx context.Context, req resource.CreateRequ ctx = tflog.SetField(ctx, "instance_id", instanceId) // Create new recordset - credentialsResp, err := r.client.DefaultAPI.CreateCredentials(ctx, projectId, region, instanceId).Execute() + credentialsResp, err := r.client.CreateCredentials(ctx, projectId, region, instanceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating credential", fmt.Sprintf("Calling API: %v", err)) return @@ -263,7 +257,7 @@ func (r *credentialResource) Create(ctx context.Context, req resource.CreateRequ return } - waitResp, err := wait.CreateCredentialsWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, credentialId).WaitWithContext(ctx) + waitResp, err := wait.CreateCredentialsWaitHandler(ctx, r.client, projectId, region, instanceId, credentialId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating credential", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -308,7 +302,7 @@ func (r *credentialResource) Read(ctx context.Context, req resource.ReadRequest, ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "credential_id", credentialId) - recordSetResp, err := r.client.DefaultAPI.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + recordSetResp, err := r.client.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -364,7 +358,7 @@ func (r *credentialResource) Delete(ctx context.Context, req resource.DeleteRequ ctx = tflog.SetField(ctx, "credential_id", credentialId) // Delete existing record set - err := r.client.DefaultAPI.DeleteCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + err := r.client.DeleteCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -376,7 +370,7 @@ func (r *credentialResource) Delete(ctx context.Context, req resource.DeleteRequ ctx = core.LogResponse(ctx) - _, err = wait.DeleteCredentialsWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, credentialId).WaitWithContext(ctx) + _, err = wait.DeleteCredentialsWaitHandler(ctx, r.client, projectId, region, instanceId, credentialId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting credential", fmt.Sprintf("Instance deletion waiting: %v", err)) return diff --git a/stackit/internal/services/mariadb/instance/datasource.go b/stackit/internal/services/mariadb/instance/datasource.go index 381982ffa..4c39e29c0 100644 --- a/stackit/internal/services/mariadb/instance/datasource.go +++ b/stackit/internal/services/mariadb/instance/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - mariadbUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/mariadb/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types" @@ -33,7 +30,7 @@ func NewInstanceDataSource() datasource.DataSource { // instanceDataSource is the data source implementation. type instanceDataSource struct { - client *mariadb.APIClient + client mariadb.DefaultAPI providerData core.ProviderData } @@ -44,17 +41,14 @@ func (d *instanceDataSource) Metadata(_ context.Context, req datasource.Metadata // Configure adds the provider configured client to the data source. func (d *instanceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := mariadbUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.MariadbV2Client + tflog.Info(ctx, "MariaDB instance client configured") } @@ -202,7 +196,7 @@ func (d *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceId) - instanceResp, err := d.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := d.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/mariadb/instance/resource.go b/stackit/internal/services/mariadb/instance/resource.go index 5de676dfc..32f714a13 100644 --- a/stackit/internal/services/mariadb/instance/resource.go +++ b/stackit/internal/services/mariadb/instance/resource.go @@ -9,8 +9,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - mariadbUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/mariadb/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -87,7 +85,7 @@ func NewInstanceResource() resource.Resource { // instanceResource is the resource implementation. type instanceResource struct { - client *mariadb.APIClient + client mariadb.DefaultAPI providerData core.ProviderData } @@ -98,17 +96,14 @@ func (r *instanceResource) Metadata(_ context.Context, req resource.MetadataRequ // Configure adds the provider configured client to the resource. func (r *instanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := mariadbUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.MariadbV2Client + tflog.Info(ctx, "MariaDB instance client configured") } @@ -358,7 +353,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } // Create new instance - createResp, err := r.client.DefaultAPI.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() + createResp, err := r.client.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -383,7 +378,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques } ctx = tflog.SetField(ctx, "instance_id", instanceId) - waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -428,7 +423,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceId) - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && (oapiErr.StatusCode == http.StatusNotFound || oapiErr.StatusCode == http.StatusGone) { @@ -505,7 +500,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques return } // Update existing instance - err = r.client.DefaultAPI.PartialUpdateInstance(ctx, projectId, region, instanceId).PartialUpdateInstancePayload(*payload).Execute() + err = r.client.PartialUpdateInstance(ctx, projectId, region, instanceId).PartialUpdateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -513,7 +508,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques ctx = core.LogResponse(ctx) - waitResp, err := wait.PartialUpdateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + waitResp, err := wait.PartialUpdateInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Instance update waiting: %v", err)) return @@ -554,7 +549,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = tflog.SetField(ctx, "instance_id", instanceId) // Delete existing instance - err := r.client.DefaultAPI.DeleteInstance(ctx, projectId, region, instanceId).Execute() + err := r.client.DeleteInstance(ctx, projectId, region, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -567,7 +562,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = core.LogResponse(ctx) - _, err = wait.DeleteInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + _, err = wait.DeleteInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting instance", fmt.Sprintf("Instance deletion waiting: %v", err)) return @@ -781,7 +776,7 @@ func toInstanceParams(parameters *parametersModel) (*mariadb.InstanceParameters, func (r *instanceResource) loadPlanId(ctx context.Context, model *Model, region string) error { projectId := model.ProjectId.ValueString() - res, err := r.client.DefaultAPI.ListOfferings(ctx, projectId, region).Execute() + res, err := r.client.ListOfferings(ctx, projectId, region).Execute() if err != nil { return fmt.Errorf("getting MariaDB offerings: %w", err) } @@ -816,10 +811,10 @@ func (r *instanceResource) loadPlanId(ctx context.Context, model *Model, region return fmt.Errorf("couldn't find plan_name '%s' for version %s, available names are: %s", planName, version, availablePlanNames) } -func loadPlanNameAndVersion(ctx context.Context, client *mariadb.APIClient, model *Model, region string) error { +func loadPlanNameAndVersion(ctx context.Context, client mariadb.DefaultAPI, model *Model, region string) error { projectId := model.ProjectId.ValueString() planId := model.PlanId.ValueString() - res, err := client.DefaultAPI.ListOfferings(ctx, projectId, region).Execute() + res, err := client.ListOfferings(ctx, projectId, region).Execute() if err != nil { return fmt.Errorf("getting MariaDB offerings: %w", err) } diff --git a/stackit/internal/services/mariadb/utils/util.go b/stackit/internal/services/mariadb/utils/util.go deleted file mode 100644 index f0217eb0a..000000000 --- a/stackit/internal/services/mariadb/utils/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - mariadb "github.com/stackitcloud/stackit-sdk-go/services/mariadb/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *mariadb.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.MariaDBCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.MariaDBCustomEndpoint)) - } - - apiClient, err := mariadb.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/mariadb/utils/util_test.go b/stackit/internal/services/mariadb/utils/util_test.go deleted file mode 100644 index 3d3223c2f..000000000 --- a/stackit/internal/services/mariadb/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - mariadb "github.com/stackitcloud/stackit-sdk-go/services/mariadb/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://mariadb-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *mariadb.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *mariadb.APIClient { - apiClient, err := mariadb.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - MariaDBCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *mariadb.APIClient { - apiClient, err := mariadb.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/modelexperiments/instance/datasource.go b/stackit/internal/services/modelexperiments/instance/datasource.go index 6be9a16cc..0f1cedabc 100644 --- a/stackit/internal/services/modelexperiments/instance/datasource.go +++ b/stackit/internal/services/modelexperiments/instance/datasource.go @@ -11,9 +11,7 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - modelexperimentsutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) @@ -40,17 +38,14 @@ func (i *instanceDataSource) Metadata(_ context.Context, req datasource.Metadata // provider-defined DataSource type. It is separately executed for each // ReadDataSource RPC. func (i *instanceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - i.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := modelexperimentsutils.ConfigureClient(ctx, &i.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - i.client = apiClient.DefaultAPI + i.providerData = providerData + i.client = clients.ModelExperimentsV1Client + tflog.Info(ctx, "Model Experiments instance client configured for data source") } diff --git a/stackit/internal/services/modelexperiments/instance/mock/instance.go b/stackit/internal/services/modelexperiments/instance/mock/instance.go deleted file mode 100644 index 9c42629b0..000000000 --- a/stackit/internal/services/modelexperiments/instance/mock/instance.go +++ /dev/null @@ -1,332 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api (interfaces: DefaultAPI) -// -// Generated by this command: -// -// mockgen -destination=./mock/instance.go -package=mock_instance github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api DefaultAPI -// - -// Package mock_instance is a generated GoMock package. -package mock_instance - -import ( - context "context" - reflect "reflect" - - v1api "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" - gomock "go.uber.org/mock/gomock" -) - -// MockDefaultAPI is a mock of DefaultAPI interface. -type MockDefaultAPI struct { - ctrl *gomock.Controller - recorder *MockDefaultAPIMockRecorder - isgomock struct{} -} - -// MockDefaultAPIMockRecorder is the mock recorder for MockDefaultAPI. -type MockDefaultAPIMockRecorder struct { - mock *MockDefaultAPI -} - -// NewMockDefaultAPI creates a new mock instance. -func NewMockDefaultAPI(ctrl *gomock.Controller) *MockDefaultAPI { - mock := &MockDefaultAPI{ctrl: ctrl} - mock.recorder = &MockDefaultAPIMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockDefaultAPI) EXPECT() *MockDefaultAPIMockRecorder { - return m.recorder -} - -// CreateInstance mocks base method. -func (m *MockDefaultAPI) CreateInstance(ctx context.Context, projectId, regionId string) v1api.ApiCreateInstanceRequest { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateInstance", ctx, projectId, regionId) - ret0, _ := ret[0].(v1api.ApiCreateInstanceRequest) - return ret0 -} - -// CreateInstance indicates an expected call of CreateInstance. -func (mr *MockDefaultAPIMockRecorder) CreateInstance(ctx, projectId, regionId any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateInstance", reflect.TypeOf((*MockDefaultAPI)(nil).CreateInstance), ctx, projectId, regionId) -} - -// CreateInstanceExecute mocks base method. -func (m *MockDefaultAPI) CreateInstanceExecute(r v1api.ApiCreateInstanceRequest) (*v1api.CreateInstanceResponse, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateInstanceExecute", r) - ret0, _ := ret[0].(*v1api.CreateInstanceResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// CreateInstanceExecute indicates an expected call of CreateInstanceExecute. -func (mr *MockDefaultAPIMockRecorder) CreateInstanceExecute(r any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateInstanceExecute", reflect.TypeOf((*MockDefaultAPI)(nil).CreateInstanceExecute), r) -} - -// CreateInstanceToken mocks base method. -func (m *MockDefaultAPI) CreateInstanceToken(ctx context.Context, projectId, regionId, instanceId string) v1api.ApiCreateInstanceTokenRequest { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateInstanceToken", ctx, projectId, regionId, instanceId) - ret0, _ := ret[0].(v1api.ApiCreateInstanceTokenRequest) - return ret0 -} - -// CreateInstanceToken indicates an expected call of CreateInstanceToken. -func (mr *MockDefaultAPIMockRecorder) CreateInstanceToken(ctx, projectId, regionId, instanceId any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateInstanceToken", reflect.TypeOf((*MockDefaultAPI)(nil).CreateInstanceToken), ctx, projectId, regionId, instanceId) -} - -// CreateInstanceTokenExecute mocks base method. -func (m *MockDefaultAPI) CreateInstanceTokenExecute(r v1api.ApiCreateInstanceTokenRequest) (*v1api.CreateInstanceTokenResponse, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateInstanceTokenExecute", r) - ret0, _ := ret[0].(*v1api.CreateInstanceTokenResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// CreateInstanceTokenExecute indicates an expected call of CreateInstanceTokenExecute. -func (mr *MockDefaultAPIMockRecorder) CreateInstanceTokenExecute(r any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateInstanceTokenExecute", reflect.TypeOf((*MockDefaultAPI)(nil).CreateInstanceTokenExecute), r) -} - -// DeleteInstance mocks base method. -func (m *MockDefaultAPI) DeleteInstance(ctx context.Context, projectId, regionId, instanceId string) v1api.ApiDeleteInstanceRequest { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteInstance", ctx, projectId, regionId, instanceId) - ret0, _ := ret[0].(v1api.ApiDeleteInstanceRequest) - return ret0 -} - -// DeleteInstance indicates an expected call of DeleteInstance. -func (mr *MockDefaultAPIMockRecorder) DeleteInstance(ctx, projectId, regionId, instanceId any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteInstance", reflect.TypeOf((*MockDefaultAPI)(nil).DeleteInstance), ctx, projectId, regionId, instanceId) -} - -// DeleteInstanceExecute mocks base method. -func (m *MockDefaultAPI) DeleteInstanceExecute(r v1api.ApiDeleteInstanceRequest) (*v1api.DeleteInstanceResponse, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteInstanceExecute", r) - ret0, _ := ret[0].(*v1api.DeleteInstanceResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DeleteInstanceExecute indicates an expected call of DeleteInstanceExecute. -func (mr *MockDefaultAPIMockRecorder) DeleteInstanceExecute(r any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteInstanceExecute", reflect.TypeOf((*MockDefaultAPI)(nil).DeleteInstanceExecute), r) -} - -// DeleteInstanceToken mocks base method. -func (m *MockDefaultAPI) DeleteInstanceToken(ctx context.Context, projectId, regionId, tokenId, instanceId string) v1api.ApiDeleteInstanceTokenRequest { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteInstanceToken", ctx, projectId, regionId, tokenId, instanceId) - ret0, _ := ret[0].(v1api.ApiDeleteInstanceTokenRequest) - return ret0 -} - -// DeleteInstanceToken indicates an expected call of DeleteInstanceToken. -func (mr *MockDefaultAPIMockRecorder) DeleteInstanceToken(ctx, projectId, regionId, tokenId, instanceId any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteInstanceToken", reflect.TypeOf((*MockDefaultAPI)(nil).DeleteInstanceToken), ctx, projectId, regionId, tokenId, instanceId) -} - -// DeleteInstanceTokenExecute mocks base method. -func (m *MockDefaultAPI) DeleteInstanceTokenExecute(r v1api.ApiDeleteInstanceTokenRequest) (*v1api.DeleteInstanceTokenResponse, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteInstanceTokenExecute", r) - ret0, _ := ret[0].(*v1api.DeleteInstanceTokenResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DeleteInstanceTokenExecute indicates an expected call of DeleteInstanceTokenExecute. -func (mr *MockDefaultAPIMockRecorder) DeleteInstanceTokenExecute(r any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteInstanceTokenExecute", reflect.TypeOf((*MockDefaultAPI)(nil).DeleteInstanceTokenExecute), r) -} - -// GetInstance mocks base method. -func (m *MockDefaultAPI) GetInstance(ctx context.Context, projectId, regionId, instanceId string) v1api.ApiGetInstanceRequest { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetInstance", ctx, projectId, regionId, instanceId) - ret0, _ := ret[0].(v1api.ApiGetInstanceRequest) - return ret0 -} - -// GetInstance indicates an expected call of GetInstance. -func (mr *MockDefaultAPIMockRecorder) GetInstance(ctx, projectId, regionId, instanceId any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetInstance", reflect.TypeOf((*MockDefaultAPI)(nil).GetInstance), ctx, projectId, regionId, instanceId) -} - -// GetInstanceExecute mocks base method. -func (m *MockDefaultAPI) GetInstanceExecute(r v1api.ApiGetInstanceRequest) (*v1api.GetInstanceResponse, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetInstanceExecute", r) - ret0, _ := ret[0].(*v1api.GetInstanceResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetInstanceExecute indicates an expected call of GetInstanceExecute. -func (mr *MockDefaultAPIMockRecorder) GetInstanceExecute(r any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetInstanceExecute", reflect.TypeOf((*MockDefaultAPI)(nil).GetInstanceExecute), r) -} - -// GetInstanceToken mocks base method. -func (m *MockDefaultAPI) GetInstanceToken(ctx context.Context, projectId, regionId, tokenId, instanceId string) v1api.ApiGetInstanceTokenRequest { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetInstanceToken", ctx, projectId, regionId, tokenId, instanceId) - ret0, _ := ret[0].(v1api.ApiGetInstanceTokenRequest) - return ret0 -} - -// GetInstanceToken indicates an expected call of GetInstanceToken. -func (mr *MockDefaultAPIMockRecorder) GetInstanceToken(ctx, projectId, regionId, tokenId, instanceId any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetInstanceToken", reflect.TypeOf((*MockDefaultAPI)(nil).GetInstanceToken), ctx, projectId, regionId, tokenId, instanceId) -} - -// GetInstanceTokenExecute mocks base method. -func (m *MockDefaultAPI) GetInstanceTokenExecute(r v1api.ApiGetInstanceTokenRequest) (*v1api.GetInstanceTokenResponse, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetInstanceTokenExecute", r) - ret0, _ := ret[0].(*v1api.GetInstanceTokenResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetInstanceTokenExecute indicates an expected call of GetInstanceTokenExecute. -func (mr *MockDefaultAPIMockRecorder) GetInstanceTokenExecute(r any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetInstanceTokenExecute", reflect.TypeOf((*MockDefaultAPI)(nil).GetInstanceTokenExecute), r) -} - -// ListInstanceTokens mocks base method. -func (m *MockDefaultAPI) ListInstanceTokens(ctx context.Context, projectId, regionId, instanceId string) v1api.ApiListInstanceTokensRequest { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListInstanceTokens", ctx, projectId, regionId, instanceId) - ret0, _ := ret[0].(v1api.ApiListInstanceTokensRequest) - return ret0 -} - -// ListInstanceTokens indicates an expected call of ListInstanceTokens. -func (mr *MockDefaultAPIMockRecorder) ListInstanceTokens(ctx, projectId, regionId, instanceId any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListInstanceTokens", reflect.TypeOf((*MockDefaultAPI)(nil).ListInstanceTokens), ctx, projectId, regionId, instanceId) -} - -// ListInstanceTokensExecute mocks base method. -func (m *MockDefaultAPI) ListInstanceTokensExecute(r v1api.ApiListInstanceTokensRequest) (*v1api.ListInstanceTokensResponse, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListInstanceTokensExecute", r) - ret0, _ := ret[0].(*v1api.ListInstanceTokensResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListInstanceTokensExecute indicates an expected call of ListInstanceTokensExecute. -func (mr *MockDefaultAPIMockRecorder) ListInstanceTokensExecute(r any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListInstanceTokensExecute", reflect.TypeOf((*MockDefaultAPI)(nil).ListInstanceTokensExecute), r) -} - -// ListInstances mocks base method. -func (m *MockDefaultAPI) ListInstances(ctx context.Context, projectId, regionId string) v1api.ApiListInstancesRequest { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListInstances", ctx, projectId, regionId) - ret0, _ := ret[0].(v1api.ApiListInstancesRequest) - return ret0 -} - -// ListInstances indicates an expected call of ListInstances. -func (mr *MockDefaultAPIMockRecorder) ListInstances(ctx, projectId, regionId any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListInstances", reflect.TypeOf((*MockDefaultAPI)(nil).ListInstances), ctx, projectId, regionId) -} - -// ListInstancesExecute mocks base method. -func (m *MockDefaultAPI) ListInstancesExecute(r v1api.ApiListInstancesRequest) (*v1api.ListInstancesResponse, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListInstancesExecute", r) - ret0, _ := ret[0].(*v1api.ListInstancesResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListInstancesExecute indicates an expected call of ListInstancesExecute. -func (mr *MockDefaultAPIMockRecorder) ListInstancesExecute(r any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListInstancesExecute", reflect.TypeOf((*MockDefaultAPI)(nil).ListInstancesExecute), r) -} - -// PartialUpdateInstance mocks base method. -func (m *MockDefaultAPI) PartialUpdateInstance(ctx context.Context, projectId, regionId, instanceId string) v1api.ApiPartialUpdateInstanceRequest { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "PartialUpdateInstance", ctx, projectId, regionId, instanceId) - ret0, _ := ret[0].(v1api.ApiPartialUpdateInstanceRequest) - return ret0 -} - -// PartialUpdateInstance indicates an expected call of PartialUpdateInstance. -func (mr *MockDefaultAPIMockRecorder) PartialUpdateInstance(ctx, projectId, regionId, instanceId any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PartialUpdateInstance", reflect.TypeOf((*MockDefaultAPI)(nil).PartialUpdateInstance), ctx, projectId, regionId, instanceId) -} - -// PartialUpdateInstanceExecute mocks base method. -func (m *MockDefaultAPI) PartialUpdateInstanceExecute(r v1api.ApiPartialUpdateInstanceRequest) (*v1api.PartialUpdateInstanceResponse, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "PartialUpdateInstanceExecute", r) - ret0, _ := ret[0].(*v1api.PartialUpdateInstanceResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// PartialUpdateInstanceExecute indicates an expected call of PartialUpdateInstanceExecute. -func (mr *MockDefaultAPIMockRecorder) PartialUpdateInstanceExecute(r any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PartialUpdateInstanceExecute", reflect.TypeOf((*MockDefaultAPI)(nil).PartialUpdateInstanceExecute), r) -} - -// PartialUpdateInstanceToken mocks base method. -func (m *MockDefaultAPI) PartialUpdateInstanceToken(ctx context.Context, projectId, regionId, tokenId, instanceId string) v1api.ApiPartialUpdateInstanceTokenRequest { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "PartialUpdateInstanceToken", ctx, projectId, regionId, tokenId, instanceId) - ret0, _ := ret[0].(v1api.ApiPartialUpdateInstanceTokenRequest) - return ret0 -} - -// PartialUpdateInstanceToken indicates an expected call of PartialUpdateInstanceToken. -func (mr *MockDefaultAPIMockRecorder) PartialUpdateInstanceToken(ctx, projectId, regionId, tokenId, instanceId any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PartialUpdateInstanceToken", reflect.TypeOf((*MockDefaultAPI)(nil).PartialUpdateInstanceToken), ctx, projectId, regionId, tokenId, instanceId) -} - -// PartialUpdateInstanceTokenExecute mocks base method. -func (m *MockDefaultAPI) PartialUpdateInstanceTokenExecute(r v1api.ApiPartialUpdateInstanceTokenRequest) (*v1api.PartialUpdateInstanceTokenResponse, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "PartialUpdateInstanceTokenExecute", r) - ret0, _ := ret[0].(*v1api.PartialUpdateInstanceTokenResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// PartialUpdateInstanceTokenExecute indicates an expected call of PartialUpdateInstanceTokenExecute. -func (mr *MockDefaultAPIMockRecorder) PartialUpdateInstanceTokenExecute(r any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PartialUpdateInstanceTokenExecute", reflect.TypeOf((*MockDefaultAPI)(nil).PartialUpdateInstanceTokenExecute), r) -} diff --git a/stackit/internal/services/modelexperiments/instance/resource.go b/stackit/internal/services/modelexperiments/instance/resource.go index 592a2b3bf..07ca4dc38 100644 --- a/stackit/internal/services/modelexperiments/instance/resource.go +++ b/stackit/internal/services/modelexperiments/instance/resource.go @@ -23,8 +23,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - modelexperimentsutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/utils" - serviceEnablementUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serviceenablement/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -91,22 +89,15 @@ func (i *instanceResource) Metadata(_ context.Context, req resource.MetadataRequ // Configure adds the provider configured client to the resource. func (i *instanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - i.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := modelexperimentsutils.ConfigureClient(ctx, &i.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - serviceEnablementClient := serviceEnablementUtils.ConfigureClient(ctx, &i.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - i.client = apiClient.DefaultAPI - i.serviceEnablementClient = serviceEnablementClient.DefaultAPI + i.providerData = providerData + i.client = clients.ModelExperimentsV1Client + i.serviceEnablementClient = clients.ServiceEnablementV2Client + tflog.Info(ctx, "Model Experiments client configured") } diff --git a/stackit/internal/services/modelexperiments/instance/resource_create_test.go b/stackit/internal/services/modelexperiments/instance/resource_create_test.go deleted file mode 100644 index 284494409..000000000 --- a/stackit/internal/services/modelexperiments/instance/resource_create_test.go +++ /dev/null @@ -1,342 +0,0 @@ -package instance_test - -import ( - "fmt" - "net/http" - "testing" - - "github.com/google/uuid" - "github.com/hashicorp/terraform-plugin-framework/resource" - "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" - serviceenablement "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement/v2api" - "go.uber.org/mock/gomock" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/instance" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/testutils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -// NOTE: These tests will be refactored. -// Please DO NOT use this file as a pattern or reference for writing new tests. -func TestCreate_Success(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - instanceName := "test" - description := "description" - region := "eu01" - instanceId := uuid.New() - url := "url" - bucketName := "bucket" - deletetExpRetention := "1m" - tfId := utils.BuildInternalTerraformId(projectId.String(), region, instanceId.String()) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - Version: "1.0.0", - } - - instanceRes := instance.NewInstanceResource(tc.MockInstanceCLient, tc.MockServiceEnablementClient, providerData) - - tc.MockServiceEnablementClient.EXPECT().EnableServiceRegional(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(serviceenablement.ApiEnableServiceRegionalRequest{ - ApiService: tc.MockServiceEnablementClient, - }) - tc.MockServiceEnablementClient.EXPECT().EnableServiceRegionalExecute(gomock.Any()).Return(nil) - - serviceEnablementResp := &serviceenablement.ServiceStatus{ - State: serviceenablement.SERVICESTATUSSTATE_ENABLED.Ptr(), - } - tc.MockServiceEnablementClient.EXPECT().GetServiceStatusRegional(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(serviceenablement.ApiGetServiceStatusRegionalRequest{ - ApiService: tc.MockServiceEnablementClient, - }) - tc.MockServiceEnablementClient.EXPECT().GetServiceStatusRegionalExecute(gomock.Any()).Return(serviceEnablementResp, nil) - - createResp := &modelexperiments.CreateInstanceResponse{ - Instance: modelexperiments.Instance{ - DeletedExperimentRetention: &deletetExpRetention, - Description: &description, - Name: instanceName, - Region: ®ion, - Url: url, - Id: instanceId.String(), - State: "pending", - }, - } - tc.MockInstanceCLient.EXPECT().CreateInstance(gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiCreateInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().CreateInstanceExecute(gomock.Any()).Return(createResp, nil) - - getResp := &modelexperiments.GetInstanceResponse{ - Instance: modelexperiments.Instance{ - DeletedExperimentRetention: &deletetExpRetention, - BucketName: &bucketName, - Description: &description, - Name: instanceName, - Region: ®ion, - Url: url, - Id: instanceId.String(), - State: "active", - }, - } - - tc.MockInstanceCLient.EXPECT().GetInstance(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiGetInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().GetInstanceExecute(gomock.Any()).Return(getResp, nil) - - schemaResp := resource.SchemaResponse{} - instanceRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - model := testutils.CreateInstanceTestModel(projectId.String(), region, instanceName, description) - req := testutils.CreateInstanceRequest(tc.Ctx, schemaResp, model) - resp := testutils.CreateResponse(schemaResp) - - instanceRes.Create(tc.Ctx, req, resp) - - if resp.Diagnostics.HasError() { - t.Fatalf("Create should succeed, but got errors: %v", resp.Diagnostics.Errors()) - } - - var stateAfterCreate instance.Model - diags := resp.State.Get(tc.Ctx, &stateAfterCreate) - if diags.HasError() { - t.Fatalf("Failed to get state: %v", diags.Errors()) - } - - // state should be created correctly - if tfId != stateAfterCreate.Id { - t.Fatalf("expected %v, got %v", tfId.String(), stateAfterCreate.Id.ValueString()) - } - if instanceId.String() != stateAfterCreate.InstanceId.ValueString() { - t.Fatalf("expected %v, got %v", instanceId.String(), stateAfterCreate.InstanceId.ValueString()) - } - if projectId.String() != stateAfterCreate.ProjectId.ValueString() { - t.Fatalf("expected %v, got %v", projectId.String(), stateAfterCreate.ProjectId.ValueString()) - } - if instanceName != stateAfterCreate.Name.ValueString() { - t.Fatalf("expected %v, got %v", instanceName, stateAfterCreate.Name.ValueString()) - } - if description != stateAfterCreate.Description.ValueString() { - t.Fatalf("expected %v, got %v", description, stateAfterCreate.Description.ValueString()) - } - if url != stateAfterCreate.Url.ValueString() { - t.Fatalf("expected %v, got %v", url, stateAfterCreate.Url.ValueString()) - } - if region != stateAfterCreate.Region.ValueString() { - t.Fatalf("expected %v, got %v", region, stateAfterCreate.Region.ValueString()) - } - if stateAfterCreate.BucketName.ValueString() != "" { - t.Fatalf("expected %v, got %v", "", stateAfterCreate.BucketName.ValueString()) - } - if deletetExpRetention != stateAfterCreate.DeletedExperimentRetention.ValueString() { - t.Fatalf("expected %v, got %v", deletetExpRetention, stateAfterCreate.DeletedExperimentRetention.ValueString()) - } -} - -func TestCreate_ServiceEnablementFailure(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - instanceName := "test" - description := "description" - region := "eu01" - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - Version: "1.0.0", - } - - instanceRes := instance.NewInstanceResource(tc.MockInstanceCLient, tc.MockServiceEnablementClient, providerData) - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: http.StatusNotFound, - } - tc.MockServiceEnablementClient.EXPECT().EnableServiceRegional(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(serviceenablement.ApiEnableServiceRegionalRequest{ - ApiService: tc.MockServiceEnablementClient, - }) - tc.MockServiceEnablementClient.EXPECT().EnableServiceRegionalExecute(gomock.Any()).Return(oapiErr) - - schemaResp := resource.SchemaResponse{} - instanceRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - model := testutils.CreateInstanceTestModel(projectId.String(), region, instanceName, description) - req := testutils.CreateInstanceRequest(tc.Ctx, schemaResp, model) - resp := testutils.CreateResponse(schemaResp) - - instanceRes.Create(tc.Ctx, req, resp) - - if !resp.Diagnostics.HasError() { - t.Fatalf("Create should not succeed, but got no errors") - } - - // state should not be created - var stateAfterCreate *instance.Model - diags := resp.State.Get(tc.Ctx, &stateAfterCreate) - if diags.HasError() { - t.Fatalf("Failed to get state: %v", diags.Errors()) - } - if stateAfterCreate != nil { - t.Fatalf("State not nil") - } -} - -func TestCreate_GetInstanceFailure(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - instanceName := "test" - description := "description" - region := "eu01" - instanceId := uuid.New() - url := "url" - deletetExpRetention := "1m" - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - Version: "1.0.0", - } - - instanceRes := instance.NewInstanceResource(tc.MockInstanceCLient, tc.MockServiceEnablementClient, providerData) - - tc.MockServiceEnablementClient.EXPECT().EnableServiceRegional(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(serviceenablement.ApiEnableServiceRegionalRequest{ - ApiService: tc.MockServiceEnablementClient, - }) - tc.MockServiceEnablementClient.EXPECT().EnableServiceRegionalExecute(gomock.Any()).Return(nil) - - serviceEnablementResp := &serviceenablement.ServiceStatus{ - State: serviceenablement.SERVICESTATUSSTATE_ENABLED.Ptr(), - } - tc.MockServiceEnablementClient.EXPECT().GetServiceStatusRegional(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(serviceenablement.ApiGetServiceStatusRegionalRequest{ - ApiService: tc.MockServiceEnablementClient, - }) - tc.MockServiceEnablementClient.EXPECT().GetServiceStatusRegionalExecute(gomock.Any()).Return(serviceEnablementResp, nil) - - createResp := &modelexperiments.CreateInstanceResponse{ - Instance: modelexperiments.Instance{ - DeletedExperimentRetention: &deletetExpRetention, - Description: &description, - Name: instanceName, - Region: ®ion, - Url: url, - Id: instanceId.String(), - State: "pending", - }, - } - tc.MockInstanceCLient.EXPECT().CreateInstance(gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiCreateInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().CreateInstanceExecute(gomock.Any()).Return(createResp, nil) - - tc.MockInstanceCLient.EXPECT().GetInstance(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiGetInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().GetInstanceExecute(gomock.Any()).Return(nil, fmt.Errorf("server error")) - - schemaResp := resource.SchemaResponse{} - instanceRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - model := testutils.CreateInstanceTestModel(projectId.String(), region, instanceName, description) - req := testutils.CreateInstanceRequest(tc.Ctx, schemaResp, model) - resp := testutils.CreateResponse(schemaResp) - - instanceRes.Create(tc.Ctx, req, resp) - - if !resp.Diagnostics.HasError() { - t.Fatalf("Create should succeed with errors") - } - - var stateAfterCreate instance.Model - diags := resp.State.Get(tc.Ctx, &stateAfterCreate) - if diags.HasError() { - t.Fatalf("Failed to get state: %v", diags.Errors()) - } - - // minimal state should be created - if stateAfterCreate.Id.ValueString() != "" { - t.Fatalf("expected %v, got %v", "", stateAfterCreate.Id.ValueString()) - } - if instanceId.String() != stateAfterCreate.InstanceId.ValueString() { - t.Fatalf("expected %v, got %v", instanceId.String(), stateAfterCreate.InstanceId.ValueString()) - } - if projectId.String() != stateAfterCreate.ProjectId.ValueString() { - t.Fatalf("expected %v, got %v", projectId.String(), stateAfterCreate.ProjectId.ValueString()) - } - if stateAfterCreate.Name.ValueString() != "" { - t.Fatalf("expected %v, got %v", "", stateAfterCreate.Name.ValueString()) - } - if stateAfterCreate.Description.ValueString() != "" { - t.Fatalf("expected %v, got %v", "", stateAfterCreate.Description.ValueString()) - } - if stateAfterCreate.Url.ValueString() != "" { - t.Fatalf("expected %v, got %v", "", stateAfterCreate.Url.ValueString()) - } - if region != stateAfterCreate.Region.ValueString() { - t.Fatalf("expected %v, got %v", region, stateAfterCreate.Region.ValueString()) - } - if stateAfterCreate.BucketName.ValueString() != "" { - t.Fatalf("expected %v, got %v", "", stateAfterCreate.BucketName.ValueString()) - } - if stateAfterCreate.DeletedExperimentRetention.ValueString() != "" { - t.Fatalf("expected %v, got %v", "", stateAfterCreate.DeletedExperimentRetention.ValueString()) - } -} - -func TestCreate_InstanceCreateFailure(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - instanceName := "test" - description := "description" - region := "eu01" - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - Version: "1.0.0", - } - - instanceRes := instance.NewInstanceResource(tc.MockInstanceCLient, tc.MockServiceEnablementClient, providerData) - - tc.MockServiceEnablementClient.EXPECT().EnableServiceRegional(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(serviceenablement.ApiEnableServiceRegionalRequest{ - ApiService: tc.MockServiceEnablementClient, - }) - tc.MockServiceEnablementClient.EXPECT().EnableServiceRegionalExecute(gomock.Any()).Return(nil) - - serviceEnablementResp := &serviceenablement.ServiceStatus{ - State: serviceenablement.SERVICESTATUSSTATE_ENABLED.Ptr(), - } - tc.MockServiceEnablementClient.EXPECT().GetServiceStatusRegional(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(serviceenablement.ApiGetServiceStatusRegionalRequest{ - ApiService: tc.MockServiceEnablementClient, - }) - tc.MockServiceEnablementClient.EXPECT().GetServiceStatusRegionalExecute(gomock.Any()).Return(serviceEnablementResp, nil) - - tc.MockInstanceCLient.EXPECT().CreateInstance(gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiCreateInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().CreateInstanceExecute(gomock.Any()).Return(nil, fmt.Errorf("server error")) - - schemaResp := resource.SchemaResponse{} - instanceRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - model := testutils.CreateInstanceTestModel(projectId.String(), region, instanceName, description) - req := testutils.CreateInstanceRequest(tc.Ctx, schemaResp, model) - resp := testutils.CreateResponse(schemaResp) - - instanceRes.Create(tc.Ctx, req, resp) - - if !resp.Diagnostics.HasError() { - t.Fatalf("Create should not succeed, but got no errors") - } - - // no state should be created - var stateAfterCreate *instance.Model - diags := resp.State.Get(tc.Ctx, &stateAfterCreate) - if diags.HasError() { - t.Fatalf("Failed to get state: %v", diags.Errors()) - } - if stateAfterCreate != nil { - t.Fatalf("State not nil") - } -} diff --git a/stackit/internal/services/modelexperiments/instance/resource_delete_test.go b/stackit/internal/services/modelexperiments/instance/resource_delete_test.go deleted file mode 100644 index 12608802b..000000000 --- a/stackit/internal/services/modelexperiments/instance/resource_delete_test.go +++ /dev/null @@ -1,225 +0,0 @@ -package instance_test - -import ( - "net/http" - "testing" - - "github.com/google/uuid" - "github.com/hashicorp/terraform-plugin-framework/resource" - "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" - "go.uber.org/mock/gomock" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/instance" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/testutils" -) - -// NOTE: These tests will be refactored. -// Please DO NOT use this file as a pattern or reference for writing new tests. -func TestDelete_Success(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - instanceName := "test" - region := "eu01" - instanceId := uuid.New() - - tc.MockInstanceCLient.EXPECT().DeleteInstance(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiDeleteInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().DeleteInstanceExecute(gomock.Any()).Return(nil, nil) - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: http.StatusNotFound, - } - tc.MockInstanceCLient.EXPECT().GetInstance(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiGetInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().GetInstanceExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - instanceRes := instance.NewInstanceResource(tc.MockInstanceCLient, nil, providerData) - - schemaResp := resource.SchemaResponse{} - instanceRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - state := instance.Model{ - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Region: types.StringValue(region), - Name: types.StringValue(instanceName), - Labels: types.MapNull(types.StringType), - } - - req := testutils.DeleteInstanceRequest(tc.Ctx, schemaResp, state) - resp := testutils.DeleteInstanceResponse(tc.Ctx, schemaResp, &state) - - instanceRes.Delete(tc.Ctx, req, resp) - if resp.Diagnostics.HasError() { - t.Fatalf("Delete should succeed, but got errors: %v", resp.Diagnostics.Errors()) - } -} - -func TestDelete_DeleteInstanceFailed(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - instanceName := "test" - region := "eu01" - instanceId := uuid.New() - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: http.StatusInternalServerError, - } - tc.MockInstanceCLient.EXPECT().DeleteInstance(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiDeleteInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().DeleteInstanceExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - instanceRes := instance.NewInstanceResource(tc.MockInstanceCLient, nil, providerData) - - schemaResp := resource.SchemaResponse{} - instanceRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - state := instance.Model{ - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Region: types.StringValue(region), - Name: types.StringValue(instanceName), - Labels: types.MapNull(types.StringType), - } - - req := testutils.DeleteInstanceRequest(tc.Ctx, schemaResp, state) - resp := testutils.DeleteInstanceResponse(tc.Ctx, schemaResp, &state) - - instanceRes.Delete(tc.Ctx, req, resp) - if !resp.Diagnostics.HasError() { - t.Fatalf("Delete should not succeed, but got no errors") - } - - // state should not be removed - var finalState instance.Model - diags := resp.State.Get(tc.Ctx, &finalState) - if diags.HasError() { - t.Fatalf("Failed to get state: %v", diags.Errors()) - } - - if instanceId.String() != finalState.InstanceId.ValueString() { - t.Fatalf("state should not have been deleted - expected %v, got %v", instanceId.String(), finalState.InstanceId.ValueString()) - } -} - -func TestDelete_InstanceAlreadyDeleted(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - instanceName := "test" - region := "eu01" - instanceId := uuid.New() - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: http.StatusNotFound, - } - tc.MockInstanceCLient.EXPECT().DeleteInstance(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiDeleteInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().DeleteInstanceExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - instanceRes := instance.NewInstanceResource(tc.MockInstanceCLient, nil, providerData) - - schemaResp := resource.SchemaResponse{} - instanceRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - state := instance.Model{ - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Region: types.StringValue(region), - Name: types.StringValue(instanceName), - Labels: types.MapNull(types.StringType), - } - - req := testutils.DeleteInstanceRequest(tc.Ctx, schemaResp, state) - resp := testutils.DeleteInstanceResponse(tc.Ctx, schemaResp, &state) - - instanceRes.Delete(tc.Ctx, req, resp) - if resp.Diagnostics.HasError() { - t.Fatalf("Delete should succeed, but got errors: %v", resp.Diagnostics.Errors()) - } - - // state should be removed - var finalState *instance.Model - diags := resp.State.Get(tc.Ctx, &finalState) - if diags.HasError() { - t.Fatalf("Failed to get state: %v", diags.Errors()) - } - if finalState != nil { - t.Fatalf("state should have been deleted - got %v", finalState) - } -} - -func TestDelete_GetInstanceFailed(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - instanceName := "test" - region := "eu01" - instanceId := uuid.New() - - tc.MockInstanceCLient.EXPECT().DeleteInstance(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiDeleteInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().DeleteInstanceExecute(gomock.Any()).Return(nil, nil) - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: http.StatusInternalServerError, - } - tc.MockInstanceCLient.EXPECT().GetInstance(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiGetInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().GetInstanceExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - instanceRes := instance.NewInstanceResource(tc.MockInstanceCLient, nil, providerData) - - schemaResp := resource.SchemaResponse{} - instanceRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - state := instance.Model{ - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Region: types.StringValue(region), - Name: types.StringValue(instanceName), - Labels: types.MapNull(types.StringType), - } - - req := testutils.DeleteInstanceRequest(tc.Ctx, schemaResp, state) - resp := testutils.DeleteInstanceResponse(tc.Ctx, schemaResp, &state) - - instanceRes.Delete(tc.Ctx, req, resp) - if !resp.Diagnostics.HasError() { - t.Fatalf("Delete should not succeed, but got no errors") - } - - // state should not be removed - var finalState instance.Model - diags := resp.State.Get(tc.Ctx, &finalState) - if diags.HasError() { - t.Fatalf("Failed to get state: %v", diags.Errors()) - } - - if instanceId.String() != finalState.InstanceId.ValueString() { - t.Fatalf("state should not have been deleted - expected %v, got %v", instanceId.String(), state.InstanceId.ValueString()) - } -} diff --git a/stackit/internal/services/modelexperiments/instance/resource_read_test.go b/stackit/internal/services/modelexperiments/instance/resource_read_test.go deleted file mode 100644 index 9045d6c5e..000000000 --- a/stackit/internal/services/modelexperiments/instance/resource_read_test.go +++ /dev/null @@ -1,270 +0,0 @@ -package instance_test - -import ( - "testing" - - "github.com/google/uuid" - "github.com/hashicorp/terraform-plugin-framework/resource" - "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" - "go.uber.org/mock/gomock" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/instance" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/testutils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -// NOTE: These tests will be refactored. -// Please DO NOT use this file as a pattern or reference for writing new tests. -func TestRead_Success(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - instanceName := "test" - description := "description" - region := "eu01" - instanceId := uuid.New() - url := "url" - instanceNameUpdated := "updatedName" - bucketName := "bucket" - deletetExpRetention := "1m" - tfId := utils.BuildInternalTerraformId(projectId.String(), region, instanceId.String()) - - getResp := &modelexperiments.GetInstanceResponse{ - Instance: modelexperiments.Instance{ - DeletedExperimentRetention: &deletetExpRetention, - BucketName: &bucketName, - Description: &description, - Name: instanceNameUpdated, - Region: ®ion, - Url: url, - Id: instanceId.String(), - State: "active", - }, - } - tc.MockInstanceCLient.EXPECT().GetInstance(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiGetInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().GetInstanceExecute(gomock.Any()).Return(getResp, nil) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - instanceRes := instance.NewInstanceResource(tc.MockInstanceCLient, nil, providerData) - - schemaResp := resource.SchemaResponse{} - instanceRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - currentState := instance.Model{ - Id: tfId, - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Name: types.StringValue(instanceName), - Region: types.StringValue(region), - Description: types.StringValue(description), - Labels: types.MapNull(types.StringType), - DeletedExperimentRetention: types.StringValue(deletetExpRetention), - BucketName: types.StringValue(bucketName), - Url: types.StringValue(url), - } - - req := testutils.ReadInstanceRequest(tc.Ctx, schemaResp, currentState) - resp := testutils.ReadInstanceResponse(tc.Ctx, schemaResp, nil) - - instanceRes.Read(tc.Ctx, req, resp) - - if resp.Diagnostics.HasError() { - t.Fatalf("Get should succeed, but got errors: %v", resp.Diagnostics.Errors()) - } - - var refreshedState instance.Model - diags := resp.State.Get(tc.Ctx, &refreshedState) - if diags.HasError() { - t.Fatalf("Failed to get state: %v", diags.Errors()) - } - - // state should be written according to GetInstance Response - if tfId != refreshedState.Id { - t.Fatalf("expected %v, got %v", tfId.String(), refreshedState.Id.ValueString()) - } - if instanceId.String() != refreshedState.InstanceId.ValueString() { - t.Fatalf("expected %v, got %v", instanceId.String(), refreshedState.InstanceId.ValueString()) - } - if projectId.String() != refreshedState.ProjectId.ValueString() { - t.Fatalf("expected %v, got %v", projectId.String(), refreshedState.ProjectId.ValueString()) - } - if instanceNameUpdated != refreshedState.Name.ValueString() { - t.Fatalf("expected %v, got %v", instanceNameUpdated, refreshedState.Name.ValueString()) - } - if description != refreshedState.Description.ValueString() { - t.Fatalf("expected %v, got %v", description, refreshedState.Description.ValueString()) - } - if url != refreshedState.Url.ValueString() { - t.Fatalf("expected %v, got %v", url, refreshedState.Url.ValueString()) - } - if region != refreshedState.Region.ValueString() { - t.Fatalf("expected %v, got %v", region, refreshedState.Region.ValueString()) - } - if bucketName != refreshedState.BucketName.ValueString() { - t.Fatalf("expected %v, got %v", bucketName, refreshedState.BucketName.ValueString()) - } - if deletetExpRetention != refreshedState.DeletedExperimentRetention.ValueString() { - t.Fatalf("expected %v, got %v", deletetExpRetention, refreshedState.DeletedExperimentRetention.ValueString()) - } -} - -func TestRead_InstanceIdEmptyFailure(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - instanceName := "test" - region := "eu01" - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - instanceRes := instance.NewInstanceResource(tc.MockInstanceCLient, nil, providerData) - - schemaResp := resource.SchemaResponse{} - instanceRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - state := instance.Model{ - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(""), - Region: types.StringValue(region), - Name: types.StringValue(instanceName), - } - - req := testutils.ReadInstanceRequest(tc.Ctx, schemaResp, state) - resp := testutils.ReadInstanceResponse(tc.Ctx, schemaResp, &state) - - instanceRes.Read(tc.Ctx, req, resp) - if !resp.Diagnostics.HasError() { - t.Fatalf("Get should not succeed, but got no errors") - } - - // state should be removed - var refreshedState *instance.Model - diags := resp.State.Get(tc.Ctx, &refreshedState) - if diags.HasError() { - t.Fatalf("Failed to get state: %v", diags.Errors()) - } - if refreshedState != nil { - t.Fatalf("State not nil") - } -} - -func TestRead_InstanceNotFound(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - instanceId := uuid.New() - instanceName := "test" - region := "eu01" - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: 404, - } - tc.MockInstanceCLient.EXPECT().GetInstance(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiGetInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().GetInstanceExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - instanceRes := instance.NewInstanceResource(tc.MockInstanceCLient, nil, providerData) - - schemaResp := resource.SchemaResponse{} - instanceRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - state := instance.Model{ - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Region: types.StringValue(region), - Name: types.StringValue(instanceName), - Labels: types.MapNull(types.StringType), - } - - req := testutils.ReadInstanceRequest(tc.Ctx, schemaResp, state) - resp := testutils.ReadInstanceResponse(tc.Ctx, schemaResp, &state) - - instanceRes.Read(tc.Ctx, req, resp) - if resp.Diagnostics.HasError() { - t.Fatalf("Get should succeed, but got errors: %v", resp.Diagnostics.Errors()) - } - - // state should be removed - var refreshedState *instance.Model - diags := resp.State.Get(tc.Ctx, &refreshedState) - if diags.HasError() { - t.Fatalf("Failed to get state: %v", diags.Errors()) - } - if refreshedState != nil { - t.Fatalf("State not nil") - } -} - -func TestRead_GetRequestFailed(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - instanceName := "test" - description := "description" - region := "eu01" - instanceId := uuid.New() - url := "url" - bucketName := "bucket" - deletetExpRetention := "1m" - tfId := utils.BuildInternalTerraformId(projectId.String(), region, instanceId.String()) - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: 400, - } - tc.MockInstanceCLient.EXPECT().GetInstance(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiGetInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().GetInstanceExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - instanceRes := instance.NewInstanceResource(tc.MockInstanceCLient, nil, providerData) - - schemaResp := resource.SchemaResponse{} - instanceRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - currentState := instance.Model{ - Id: tfId, - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Name: types.StringValue(instanceName), - Region: types.StringValue(region), - Description: types.StringValue(description), - Labels: types.MapNull(types.StringType), - DeletedExperimentRetention: types.StringValue(deletetExpRetention), - BucketName: types.StringValue(bucketName), - Url: types.StringValue(url), - } - - req := testutils.ReadInstanceRequest(tc.Ctx, schemaResp, currentState) - resp := testutils.ReadInstanceResponse(tc.Ctx, schemaResp, nil) - - instanceRes.Read(tc.Ctx, req, resp) - if !resp.Diagnostics.HasError() { - t.Fatalf("Get should not succeed") - } - - // resp state should not be set - var refreshedState *instance.Model - diags := resp.State.Get(tc.Ctx, &refreshedState) - if diags.HasError() { - t.Fatalf("Failed to get state: %v", diags.Errors()) - } - - if refreshedState != nil { - t.Fatalf("State not nil") - } -} diff --git a/stackit/internal/services/modelexperiments/instance/resource_update_test.go b/stackit/internal/services/modelexperiments/instance/resource_update_test.go deleted file mode 100644 index 3147783e4..000000000 --- a/stackit/internal/services/modelexperiments/instance/resource_update_test.go +++ /dev/null @@ -1,221 +0,0 @@ -package instance_test - -import ( - "fmt" - "testing" - - "github.com/google/uuid" - "github.com/hashicorp/terraform-plugin-framework/resource" - "github.com/hashicorp/terraform-plugin-framework/types" - modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" - "go.uber.org/mock/gomock" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/instance" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/testutils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -// NOTE: These tests will be refactored. -// Please DO NOT use this file as a pattern or reference for writing new tests. -func TestUpdate_Success(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - instanceName := "test" - instanceNameUpdated := "update name" - description := "description" - descriptionUpdated := "description updated" - region := "eu01" - instanceId := uuid.New() - url := "url" - tfId := utils.BuildInternalTerraformId(projectId.String(), region, instanceId.String()) - bucketName := "bucket" - deletetExpRetention := "1m" - - updateResp := &modelexperiments.PartialUpdateInstanceResponse{ - Instance: modelexperiments.Instance{ - DeletedExperimentRetention: &deletetExpRetention, - BucketName: &bucketName, - Description: &descriptionUpdated, - Name: instanceNameUpdated, - Region: ®ion, - Url: url, - Id: instanceId.String(), - State: "active", - }, - } - - tc.MockInstanceCLient.EXPECT().PartialUpdateInstance(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiPartialUpdateInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().PartialUpdateInstanceExecute(gomock.Any()).Return(updateResp, nil) - - providerData := core.ProviderData{ - DefaultRegion: region, - } - instanceRes := instance.NewInstanceResource(tc.MockInstanceCLient, nil, providerData) - - schemaResp := resource.SchemaResponse{} - instanceRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - currentState := instance.Model{ - Id: tfId, - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Name: types.StringValue(instanceName), - Region: types.StringValue(region), - Description: types.StringValue(description), - Labels: types.MapNull(types.StringType), - DeletedExperimentRetention: types.StringValue(deletetExpRetention), - BucketName: types.StringValue(bucketName), - Url: types.StringValue(url), - } - - plannedState := instance.Model{ - ProjectId: types.StringValue(projectId.String()), - Region: types.StringValue(region), - Name: types.StringValue(instanceNameUpdated), - Description: types.StringValue(descriptionUpdated), - Labels: types.MapNull(types.StringType), - } - - req := testutils.UpdateInstanceRequest(tc.Ctx, schemaResp, currentState, plannedState) - resp := testutils.UpdateInstanceResponse(tc.Ctx, schemaResp, ¤tState) - - // Execute Update - instanceRes.Update(tc.Ctx, req, resp) - - if resp.Diagnostics.HasError() { - t.Fatalf("Update should succeed, but got errors: %v", resp.Diagnostics.Errors()) - } - - // state should be updated - var finalState instance.Model - diags := resp.State.Get(tc.Ctx, &finalState) - if diags.HasError() { - t.Fatalf("Failed to get state: %v", diags.Errors()) - } - - if tfId != finalState.Id { - t.Fatalf("expected %v, got %v", tfId.String(), finalState.Id.ValueString()) - } - if instanceId.String() != finalState.InstanceId.ValueString() { - t.Fatalf("expected %v, got %v", instanceId.String(), finalState.InstanceId.ValueString()) - } - if projectId.String() != finalState.ProjectId.ValueString() { - t.Fatalf("expected %v, got %v", projectId.String(), finalState.ProjectId.ValueString()) - } - if instanceNameUpdated != finalState.Name.ValueString() { - t.Fatalf("expected %v, got %v", instanceNameUpdated, finalState.Name.ValueString()) - } - if descriptionUpdated != finalState.Description.ValueString() { - t.Fatalf("expected %v, got %v", descriptionUpdated, finalState.Description.ValueString()) - } - if url != finalState.Url.ValueString() { - t.Fatalf("expected %v, got %v", url, finalState.Url.ValueString()) - } - if region != finalState.Region.ValueString() { - t.Fatalf("expected %v, got %v", region, finalState.Region.ValueString()) - } - if bucketName != finalState.BucketName.ValueString() { - t.Fatalf("expected %v, got %v", bucketName, finalState.BucketName.ValueString()) - } - if deletetExpRetention != finalState.DeletedExperimentRetention.ValueString() { - t.Fatalf("expected %v, got %v", deletetExpRetention, finalState.DeletedExperimentRetention.ValueString()) - } -} - -func TestUpdate_InstanceUpdateError(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - instanceName := "test" - instanceNameUpdated := "update name" - description := "description" - descriptionUpdated := "description updated" - region := "eu01" - instanceId := uuid.New() - url := "url" - tfId := utils.BuildInternalTerraformId(projectId.String(), region, instanceId.String()) - bucketName := "bucket" - deletetExpRetention := "1m" - - tc.MockInstanceCLient.EXPECT().PartialUpdateInstance(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiPartialUpdateInstanceRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().PartialUpdateInstanceExecute(gomock.Any()).Return(nil, fmt.Errorf("server error")) - - providerData := core.ProviderData{ - DefaultRegion: region, - } - instanceRes := instance.NewInstanceResource(tc.MockInstanceCLient, nil, providerData) - - schemaResp := resource.SchemaResponse{} - instanceRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - currentState := instance.Model{ - Id: tfId, - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Name: types.StringValue(instanceName), - Region: types.StringValue(region), - Description: types.StringValue(description), - Labels: types.MapNull(types.StringType), - DeletedExperimentRetention: types.StringValue(deletetExpRetention), - BucketName: types.StringValue(bucketName), - Url: types.StringValue(url), - } - - plannedState := instance.Model{ - ProjectId: types.StringValue(projectId.String()), - Region: types.StringValue(region), - Name: types.StringValue(instanceNameUpdated), - Description: types.StringValue(descriptionUpdated), - Labels: types.MapNull(types.StringType), - } - - req := testutils.UpdateInstanceRequest(tc.Ctx, schemaResp, currentState, plannedState) - resp := testutils.UpdateInstanceResponse(tc.Ctx, schemaResp, ¤tState) - - // Execute Update - instanceRes.Update(tc.Ctx, req, resp) - if !resp.Diagnostics.HasError() { - t.Fatalf("Update should not succeed, but got no errors") - } - - // state should not be updated - var finalState instance.Model - diags := resp.State.Get(tc.Ctx, &finalState) - if diags.HasError() { - t.Fatalf("Failed to get state: %v", diags.Errors()) - } - - if tfId != finalState.Id { - t.Fatalf("expected %v, got %v", tfId.String(), finalState.Id.ValueString()) - } - if instanceId.String() != finalState.InstanceId.ValueString() { - t.Fatalf("expected %v, got %v", instanceId.String(), finalState.InstanceId.ValueString()) - } - if projectId.String() != finalState.ProjectId.ValueString() { - t.Fatalf("expected %v, got %v", projectId.String(), finalState.ProjectId.ValueString()) - } - if instanceName != finalState.Name.ValueString() { - t.Fatalf("expected %v, got %v", instanceName, finalState.Name.ValueString()) - } - if description != finalState.Description.ValueString() { - t.Fatalf("expected %v, got %v", description, finalState.Description.ValueString()) - } - if url != finalState.Url.ValueString() { - t.Fatalf("expected %v, got %v", url, finalState.Url.ValueString()) - } - if region != finalState.Region.ValueString() { - t.Fatalf("expected %v, got %v", region, finalState.Region.ValueString()) - } - if bucketName != finalState.BucketName.ValueString() { - t.Fatalf("expected %v, got %v", bucketName, finalState.BucketName.ValueString()) - } - if deletetExpRetention != finalState.DeletedExperimentRetention.ValueString() { - t.Fatalf("expected %v, got %v", deletetExpRetention, finalState.DeletedExperimentRetention.ValueString()) - } -} diff --git a/stackit/internal/services/modelexperiments/testutils/test_utils.go b/stackit/internal/services/modelexperiments/testutils/test_utils.go deleted file mode 100644 index 610e2ae1d..000000000 --- a/stackit/internal/services/modelexperiments/testutils/test_utils.go +++ /dev/null @@ -1,238 +0,0 @@ -package testutils - -import ( - "context" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/resource" - "github.com/hashicorp/terraform-plugin-framework/tfsdk" - "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/hashicorp/terraform-plugin-go/tftypes" - "go.uber.org/mock/gomock" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/instance" - mock_instance "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/instance/mock" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/token" - mock_serviceenablement "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/utils/mock" -) - -type TestContext struct { - T *testing.T - MockCtrl *gomock.Controller - MockInstanceCLient *mock_instance.MockDefaultAPI - MockServiceEnablementClient *mock_serviceenablement.MockDefaultAPI - Ctx context.Context -} - -func NewTestContext(t *testing.T) *TestContext { - ctrl := gomock.NewController(t) - mockClient := mock_instance.NewMockDefaultAPI(ctrl) - mockServiceClient := mock_serviceenablement.NewMockDefaultAPI(ctrl) - return &TestContext{ - T: t, - MockCtrl: ctrl, - MockInstanceCLient: mockClient, - MockServiceEnablementClient: mockServiceClient, - Ctx: context.Background(), - } -} - -func CreateInstanceTestModel(projectId, region, name, description string) instance.Model { - return instance.Model{ - ProjectId: types.StringValue(projectId), - Region: types.StringValue(region), - Name: types.StringValue(name), - Description: types.StringValue(description), - Labels: types.MapNull(types.StringType), - } -} - -func CreateInstanceRequest(ctx context.Context, schema resource.SchemaResponse, model instance.Model) resource.CreateRequest { //nolint:gocritic - req := resource.CreateRequest{} - req.Plan = tfsdk.Plan{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - req.Plan.Set(ctx, model) - return req -} - -func CreateInstanceTokenRequest(ctx context.Context, schema resource.SchemaResponse, model token.Model) resource.CreateRequest { //nolint:gocritic - req := resource.CreateRequest{} - req.Plan = tfsdk.Plan{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - req.Plan.Set(ctx, model) - return req -} - -func CreateResponse(schema resource.SchemaResponse) *resource.CreateResponse { //nolint:gocritic - resp := &resource.CreateResponse{} - resp.State = tfsdk.State{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - return resp -} - -func UpdateInstanceRequest(ctx context.Context, schema resource.SchemaResponse, currentState, plannedState instance.Model) resource.UpdateRequest { //nolint:gocritic - req := resource.UpdateRequest{} - req.State = tfsdk.State{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - req.Plan = tfsdk.Plan{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - req.State.Set(ctx, currentState) - req.Plan.Set(ctx, plannedState) - return req -} - -func UpdateTokenRequest(ctx context.Context, schema resource.SchemaResponse, currentState, plannedState token.Model) resource.UpdateRequest { //nolint:gocritic - req := resource.UpdateRequest{} - req.State = tfsdk.State{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - req.Plan = tfsdk.Plan{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - req.State.Set(ctx, currentState) - req.Plan.Set(ctx, plannedState) - return req -} - -// UpdateInstanceResponse creates a test Update response -// Optionally initialize with current state to simulate Terraform framework behavior -func UpdateInstanceResponse(ctx context.Context, schema resource.SchemaResponse, currentState *instance.Model) *resource.UpdateResponse { //nolint:gocritic - resp := &resource.UpdateResponse{} - resp.State = tfsdk.State{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - // Initialize with current state to simulate framework behavior - // When Update errors without calling State.Set(), this state is preserved - if currentState != nil { - resp.State.Set(ctx, *currentState) - } - return resp -} - -func UpdateTokenResponse(ctx context.Context, schema resource.SchemaResponse, currentState *token.Model) *resource.UpdateResponse { //nolint:gocritic - resp := &resource.UpdateResponse{} - resp.State = tfsdk.State{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - // Initialize with current state to simulate framework behavior - // When Update errors without calling State.Set(), this state is preserved - if currentState != nil { - resp.State.Set(ctx, *currentState) - } - return resp -} - -// DeleteInstanceRequest creates a test Delete request -func DeleteInstanceRequest(ctx context.Context, schema resource.SchemaResponse, state instance.Model) resource.DeleteRequest { //nolint:gocritic - req := resource.DeleteRequest{} - req.State = tfsdk.State{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - req.State.Set(ctx, state) - return req -} - -func DeleteTokenRequest(ctx context.Context, schema resource.SchemaResponse, state token.Model) resource.DeleteRequest { //nolint:gocritic - req := resource.DeleteRequest{} - req.State = tfsdk.State{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - req.State.Set(ctx, state) - return req -} - -// DeleteInstanceResponse creates a test Delete response -// Optionally initialize with current state to simulate Terraform framework behavior -func DeleteInstanceResponse(ctx context.Context, schema resource.SchemaResponse, currentState *instance.Model) *resource.DeleteResponse { //nolint:gocritic - resp := &resource.DeleteResponse{} - resp.State = tfsdk.State{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - // Initialize with current state to simulate framework behavior - // When Delete errors without calling State.RemoveResource(), this state is preserved - if currentState != nil { - resp.State.Set(ctx, *currentState) - } - return resp -} - -func DeleteTokenResponse(ctx context.Context, schema resource.SchemaResponse, currentState *token.Model) *resource.DeleteResponse { //nolint:gocritic - resp := &resource.DeleteResponse{} - resp.State = tfsdk.State{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - // Initialize with current state to simulate framework behavior - // When Delete errors without calling State.RemoveResource(), this state is preserved - if currentState != nil { - resp.State.Set(ctx, *currentState) - } - return resp -} - -// ReadInstanceRequest creates a test Read request -func ReadInstanceRequest(ctx context.Context, schema resource.SchemaResponse, state instance.Model) resource.ReadRequest { //nolint:gocritic - req := resource.ReadRequest{} - req.State = tfsdk.State{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - req.State.Set(ctx, state) - return req -} - -func ReadTokenRequest(ctx context.Context, schema resource.SchemaResponse, state token.Model) resource.ReadRequest { //nolint:gocritic - req := resource.ReadRequest{} - req.State = tfsdk.State{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - req.State.Set(ctx, state) - return req -} - -// ReadInstanceResponse creates a test Read response -func ReadInstanceResponse(ctx context.Context, schema resource.SchemaResponse, currentState *instance.Model) *resource.ReadResponse { //nolint:gocritic - resp := &resource.ReadResponse{} - resp.State = tfsdk.State{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - // Initialize with current state to simulate framework behavior - // When Delete errors without calling State.RemoveResource(), this state is preserved - if currentState != nil { - resp.State.Set(ctx, *currentState) - } - return resp -} - -func ReadTokenResponse(ctx context.Context, schema resource.SchemaResponse, currentState *token.Model) *resource.ReadResponse { //nolint:gocritic - resp := &resource.ReadResponse{} - resp.State = tfsdk.State{ - Schema: schema.Schema, - Raw: tftypes.NewValue(tftypes.DynamicPseudoType, nil), - } - // Initialize with current state to simulate framework behavior - // When Delete errors without calling State.RemoveResource(), this state is preserved - if currentState != nil { - resp.State.Set(ctx, *currentState) - } - return resp -} diff --git a/stackit/internal/services/modelexperiments/token/datasource.go b/stackit/internal/services/modelexperiments/token/datasource.go index e8cb6db4d..26798ca20 100644 --- a/stackit/internal/services/modelexperiments/token/datasource.go +++ b/stackit/internal/services/modelexperiments/token/datasource.go @@ -12,9 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - modelexperimentsutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) @@ -53,17 +51,14 @@ func (i *instanceTokenDataSource) Metadata(_ context.Context, req datasource.Met // provider-defined DataSource type. It is separately executed for each // ReadDataSource RPC. func (i *instanceTokenDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - i.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := modelexperimentsutils.ConfigureClient(ctx, &i.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - i.client = apiClient.DefaultAPI + i.providerData = providerData + i.client = clients.ModelExperimentsV1Client + tflog.Info(ctx, "Model Experiments instance token client configured for data source") } diff --git a/stackit/internal/services/modelexperiments/token/resource.go b/stackit/internal/services/modelexperiments/token/resource.go index bb169c7d2..b843fdf54 100644 --- a/stackit/internal/services/modelexperiments/token/resource.go +++ b/stackit/internal/services/modelexperiments/token/resource.go @@ -23,7 +23,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - modelexperimentsutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -96,17 +95,14 @@ func (i *tokenResource) Metadata(_ context.Context, req resource.MetadataRequest // Configure adds the provider configured client to the resource. func (i *tokenResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - i.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := modelexperimentsutils.ConfigureClient(ctx, &i.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - i.client = apiClient.DefaultAPI + i.providerData = providerData + i.client = clients.ModelExperimentsV1Client + tflog.Info(ctx, "Model Experiments client configured") } diff --git a/stackit/internal/services/modelexperiments/token/resource_create_test.go b/stackit/internal/services/modelexperiments/token/resource_create_test.go deleted file mode 100644 index 271ef7852..000000000 --- a/stackit/internal/services/modelexperiments/token/resource_create_test.go +++ /dev/null @@ -1,334 +0,0 @@ -package token_test - -import ( - "testing" - "time" - - "github.com/google/uuid" - "github.com/hashicorp/terraform-plugin-framework/resource" - "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" - "go.uber.org/mock/gomock" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/testutils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/token" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -// NOTE: These tests will be refactored. -// Please DO NOT use this file as a pattern or reference for writing new tests. -func TestCreate_Success(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - name := "token" - region := "eu01" - description := "token description" - instanceId := uuid.New() - tokenId := uuid.New() - validUntil := time.Date(2099, 1, 1, 0, 0, 0, 0, time.UTC) - content := "token" - tfId := utils.BuildInternalTerraformId(projectId.String(), region, instanceId.String(), tokenId.String()) - - createTokenResp := &modelexperiments.CreateInstanceTokenResponse{ - Token: modelexperiments.Token{ - Content: content, - Description: &description, - Id: tokenId.String(), - Name: name, - Region: region, - State: "creating", - ValidUntil: validUntil, - }, - } - tc.MockInstanceCLient.EXPECT().CreateInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiCreateInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().CreateInstanceTokenExecute(gomock.Any()).Return(createTokenResp, nil) - - getTokenResp := &modelexperiments.GetInstanceTokenResponse{ - Token: modelexperiments.TokenMetadata{ - Description: &description, - Id: tokenId.String(), - Name: name, - Region: region, - State: "active", - ValidUntil: validUntil, - }, - } - tc.MockInstanceCLient.EXPECT().GetInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiGetInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().GetInstanceTokenExecute(gomock.Any()).Return(getTokenResp, nil) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - tokenRes := token.NewInstanceTokenResource(tc.MockInstanceCLient, providerData) - - schemaResp := resource.SchemaResponse{} - tokenRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - model := token.Model{ - ProjectId: types.StringValue(projectId.String()), - Name: types.StringValue(name), - Region: types.StringValue(region), - Description: types.StringValue(description), - InstanceId: types.StringValue(instanceId.String()), - Labels: types.MapNull(types.StringType), - RotateWhenChanged: types.MapNull(types.StringType), - } - - req := testutils.CreateInstanceTokenRequest(tc.Ctx, schemaResp, model) - resp := testutils.CreateResponse(schemaResp) - - tokenRes.Create(tc.Ctx, req, resp) - if resp.Diagnostics.HasError() { - t.Fatalf("Create should succeed, but got errors: %v", resp.Diagnostics.Errors()) - } - - var createdState token.Model - diags := resp.State.Get(tc.Ctx, &createdState) - if diags.HasError() { - t.Fatalf("failed to get state") - } - - if createdState.ProjectId.ValueString() != projectId.String() { - t.Fatalf("ProjectId mismatch: got %v, want %v", createdState.ProjectId.ValueString(), projectId.String()) - } - if createdState.Region.ValueString() != region { - t.Fatalf("Region mismatch: got %v, want %v", createdState.Region.ValueString(), region) - } - if createdState.Name.ValueString() != name { - t.Fatalf("Name mismatch: got %v, want %v", createdState.Name.ValueString(), name) - } - if createdState.Description.ValueString() != description { - t.Fatalf("Description mismatch: got %v, want %v", createdState.Description.ValueString(), description) - } - if createdState.InstanceId.ValueString() != instanceId.String() { - t.Fatalf("InstanceId mismatch: got %v, want %v", createdState.InstanceId.ValueString(), instanceId.String()) - } - if createdState.TokenId.ValueString() != tokenId.String() { - t.Fatalf("TokenId mismatch: got %v, want %v", createdState.TokenId.ValueString(), tokenId.String()) - } - if createdState.Id != tfId { - t.Fatalf("Id mismatch: got %v, want %v", createdState.Id.ValueString(), tfId) - } - if createdState.ValidUntil.ValueString() != "2099-01-01T00:00:00Z" { - t.Fatalf("ValidUntil mismatch: got %v, want 2099-01-01T00:00:00Z", createdState.ValidUntil.ValueString()) - } - if !createdState.Labels.IsNull() { - t.Fatalf("Labels should be null") - } - if createdState.Token.ValueString() != content { - t.Fatalf("Token mismatch: got %v, want %v", createdState.Token.ValueString(), content) - } -} - -func TestCreate_TokenResponseEmpty(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - name := "token" - region := "eu01" - description := "token description" - instanceId := uuid.New() - - tc.MockInstanceCLient.EXPECT().CreateInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiCreateInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().CreateInstanceTokenExecute(gomock.Any()).Return(nil, nil) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - tokenRes := token.NewInstanceTokenResource(tc.MockInstanceCLient, providerData) - - schemaResp := resource.SchemaResponse{} - tokenRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - model := token.Model{ - ProjectId: types.StringValue(projectId.String()), - Name: types.StringValue(name), - Region: types.StringValue(region), - Description: types.StringValue(description), - InstanceId: types.StringValue(instanceId.String()), - Labels: types.MapNull(types.StringType), - RotateWhenChanged: types.MapNull(types.StringType), - } - - req := testutils.CreateInstanceTokenRequest(tc.Ctx, schemaResp, model) - resp := testutils.CreateResponse(schemaResp) - - tokenRes.Create(tc.Ctx, req, resp) - if !resp.Diagnostics.HasError() { - t.Fatalf("Create should not succeed but got no errors") - } - - // state should not be created - var createdState *token.Model - diags := resp.State.Get(tc.Ctx, &createdState) - if diags.HasError() { - t.Fatalf("failed to get state") - } - if createdState != nil { - t.Fatalf("expected nil, got %v", createdState) - } -} - -func TestCreate_CreateTokenFailure(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - name := "token" - region := "eu01" - description := "token description" - instanceId := uuid.New() - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: 400, - } - tc.MockInstanceCLient.EXPECT().CreateInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiCreateInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().CreateInstanceTokenExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - tokenRes := token.NewInstanceTokenResource(tc.MockInstanceCLient, providerData) - - schemaResp := resource.SchemaResponse{} - tokenRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - model := token.Model{ - ProjectId: types.StringValue(projectId.String()), - Name: types.StringValue(name), - Region: types.StringValue(region), - Description: types.StringValue(description), - InstanceId: types.StringValue(instanceId.String()), - Labels: types.MapNull(types.StringType), - RotateWhenChanged: types.MapNull(types.StringType), - } - - req := testutils.CreateInstanceTokenRequest(tc.Ctx, schemaResp, model) - resp := testutils.CreateResponse(schemaResp) - - tokenRes.Create(tc.Ctx, req, resp) - if !resp.Diagnostics.HasError() { - t.Fatalf("Create should not succeed but got no errors") - } - - // state should not be created - var createdState *token.Model - diags := resp.State.Get(tc.Ctx, &createdState) - if diags.HasError() { - t.Fatalf("failed to get state") - } - if createdState != nil { - t.Fatalf("expected nil, got %v", createdState) - } -} - -func TestCreate_GetTokenFailure(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - name := "token" - region := "eu01" - description := "token description" - instanceId := uuid.New() - tokenId := uuid.New() - validUntil := time.Date(2099, 1, 1, 0, 0, 0, 0, time.UTC) - content := "token" - - createTokenResp := &modelexperiments.CreateInstanceTokenResponse{ - Token: modelexperiments.Token{ - Content: content, - Description: &description, - Id: tokenId.String(), - Name: name, - Region: region, - State: "creating", - ValidUntil: validUntil, - }, - } - tc.MockInstanceCLient.EXPECT().CreateInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiCreateInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().CreateInstanceTokenExecute(gomock.Any()).Return(createTokenResp, nil) - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: 404, - } - tc.MockInstanceCLient.EXPECT().GetInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiGetInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().GetInstanceTokenExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - tokenRes := token.NewInstanceTokenResource(tc.MockInstanceCLient, providerData) - - schemaResp := resource.SchemaResponse{} - tokenRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - model := token.Model{ - ProjectId: types.StringValue(projectId.String()), - Name: types.StringValue(name), - Region: types.StringValue(region), - Description: types.StringValue(description), - InstanceId: types.StringValue(instanceId.String()), - Labels: types.MapNull(types.StringType), - RotateWhenChanged: types.MapNull(types.StringType), - } - - req := testutils.CreateInstanceTokenRequest(tc.Ctx, schemaResp, model) - resp := testutils.CreateResponse(schemaResp) - - tokenRes.Create(tc.Ctx, req, resp) - if !resp.Diagnostics.HasError() { - t.Fatalf("Create should not succeed but got no errors") - } - - // state should be created - var createdState token.Model - diags := resp.State.Get(tc.Ctx, &createdState) - if diags.HasError() { - t.Fatalf("failed to get state") - } - - if createdState.ProjectId.ValueString() != projectId.String() { - t.Fatalf("ProjectId mismatch: got %v, want %v", createdState.ProjectId.ValueString(), projectId.String()) - } - if createdState.Region.ValueString() != region { - t.Fatalf("Region mismatch: got %v, want %v", createdState.Region.ValueString(), region) - } - if createdState.Name.ValueString() != "" { - t.Fatalf("Name mismatch: got %v, want %v", createdState.Name.ValueString(), "") - } - if createdState.Description.ValueString() != "" { - t.Fatalf("Description mismatch: got %v, want %v", createdState.Description.ValueString(), "") - } - if createdState.InstanceId.ValueString() != instanceId.String() { - t.Fatalf("InstanceId mismatch: got %v, want %v", createdState.InstanceId.ValueString(), instanceId.String()) - } - if createdState.TokenId.ValueString() != tokenId.String() { - t.Fatalf("TokenId mismatch: got %v, want %v", createdState.TokenId.ValueString(), tokenId.String()) - } - if createdState.Id.ValueString() != "" { - t.Fatalf("Id mismatch: got %v, want %v", createdState.Id.ValueString(), "") - } - if createdState.ValidUntil.ValueString() != "" { - t.Fatalf("ValidUntil mismatch: got %v, want %v", createdState.ValidUntil.ValueString(), "") - } - if !createdState.Labels.IsNull() { - t.Fatalf("Labels should be null") - } - if createdState.Token.ValueString() != "" { - t.Fatalf("Token mismatch: got %v, want %v", createdState.Token.ValueString(), "") - } -} diff --git a/stackit/internal/services/modelexperiments/token/resource_delete_test.go b/stackit/internal/services/modelexperiments/token/resource_delete_test.go deleted file mode 100644 index bc40658d0..000000000 --- a/stackit/internal/services/modelexperiments/token/resource_delete_test.go +++ /dev/null @@ -1,237 +0,0 @@ -package token_test - -import ( - "net/http" - "testing" - - "github.com/google/uuid" - "github.com/hashicorp/terraform-plugin-framework/resource" - "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" - "go.uber.org/mock/gomock" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/testutils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/token" -) - -// NOTE: These tests will be refactored. -// Please DO NOT use this file as a pattern or reference for writing new tests. -func TestDelete_Success(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - name := "token" - region := "eu01" - instanceId := uuid.New() - tokenId := uuid.New() - - tc.MockInstanceCLient.EXPECT().DeleteInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiDeleteInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().DeleteInstanceTokenExecute(gomock.Any()).Return(nil, nil) - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: http.StatusNotFound, - } - tc.MockInstanceCLient.EXPECT().GetInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiGetInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().GetInstanceTokenExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - tokenRes := token.NewInstanceTokenResource(tc.MockInstanceCLient, providerData) - - schemaResp := resource.SchemaResponse{} - tokenRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - state := token.Model{ - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Region: types.StringValue(region), - Name: types.StringValue(name), - TokenId: types.StringValue(tokenId.String()), - Labels: types.MapNull(types.StringType), - RotateWhenChanged: types.MapNull(types.StringType), - } - - req := testutils.DeleteTokenRequest(tc.Ctx, schemaResp, state) - resp := testutils.DeleteTokenResponse(tc.Ctx, schemaResp, nil) - - tokenRes.Delete(tc.Ctx, req, resp) - if resp.Diagnostics.HasError() { - t.Fatalf("Delete should succeed, but got errors: %v", resp.Diagnostics.Errors()) - } -} - -func TestDelete_DeleteTokenFailed(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - name := "token" - region := "eu01" - instanceId := uuid.New() - tokenId := uuid.New() - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: http.StatusInternalServerError, - } - tc.MockInstanceCLient.EXPECT().DeleteInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiDeleteInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().DeleteInstanceTokenExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - tokenRes := token.NewInstanceTokenResource(tc.MockInstanceCLient, providerData) - - schemaResp := resource.SchemaResponse{} - tokenRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - state := token.Model{ - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Region: types.StringValue(region), - Name: types.StringValue(name), - TokenId: types.StringValue(tokenId.String()), - Labels: types.MapNull(types.StringType), - RotateWhenChanged: types.MapNull(types.StringType), - } - - req := testutils.DeleteTokenRequest(tc.Ctx, schemaResp, state) - resp := testutils.DeleteTokenResponse(tc.Ctx, schemaResp, &state) - - tokenRes.Delete(tc.Ctx, req, resp) - if !resp.Diagnostics.HasError() { - t.Fatalf("Delete should not succeed") - } - - // state should not be removed - var deletedState token.Model - diags := resp.State.Get(tc.Ctx, &deletedState) - if diags.HasError() { - t.Fatalf("failed to get state") - } - - if instanceId.String() != deletedState.InstanceId.ValueString() { - t.Fatalf("expected %v, got %v", instanceId.String(), deletedState.InstanceId.ValueString()) - } -} - -func TestDelete_TokenNotFound(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - name := "token" - region := "eu01" - instanceId := uuid.New() - tokenId := uuid.New() - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: http.StatusNotFound, - } - tc.MockInstanceCLient.EXPECT().DeleteInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiDeleteInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().DeleteInstanceTokenExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - tokenRes := token.NewInstanceTokenResource(tc.MockInstanceCLient, providerData) - - schemaResp := resource.SchemaResponse{} - tokenRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - state := token.Model{ - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Region: types.StringValue(region), - Name: types.StringValue(name), - TokenId: types.StringValue(tokenId.String()), - Labels: types.MapNull(types.StringType), - RotateWhenChanged: types.MapNull(types.StringType), - } - - req := testutils.DeleteTokenRequest(tc.Ctx, schemaResp, state) - resp := testutils.DeleteTokenResponse(tc.Ctx, schemaResp, &state) - - tokenRes.Delete(tc.Ctx, req, resp) - if resp.Diagnostics.HasError() { - t.Fatalf("Delete should succeed, but got errors: %v", resp.Diagnostics.Errors()) - } - - // state should be removed - var deletedState *token.Model - diags := resp.State.Get(tc.Ctx, &deletedState) - if diags.HasError() { - t.Fatalf("failed to get state") - } - if deletedState != nil { - t.Fatalf("should be nil") - } -} - -func TestDelete_GetTokenFailed(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - name := "token" - region := "eu01" - instanceId := uuid.New() - tokenId := uuid.New() - - tc.MockInstanceCLient.EXPECT().DeleteInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiDeleteInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().DeleteInstanceTokenExecute(gomock.Any()).Return(nil, nil) - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: http.StatusInternalServerError, - } - tc.MockInstanceCLient.EXPECT().GetInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiGetInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().GetInstanceTokenExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - tokenRes := token.NewInstanceTokenResource(tc.MockInstanceCLient, providerData) - - schemaResp := resource.SchemaResponse{} - tokenRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - state := token.Model{ - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Region: types.StringValue(region), - Name: types.StringValue(name), - TokenId: types.StringValue(tokenId.String()), - Labels: types.MapNull(types.StringType), - RotateWhenChanged: types.MapNull(types.StringType), - } - - req := testutils.DeleteTokenRequest(tc.Ctx, schemaResp, state) - resp := testutils.DeleteTokenResponse(tc.Ctx, schemaResp, &state) - - tokenRes.Delete(tc.Ctx, req, resp) - if !resp.Diagnostics.HasError() { - t.Fatalf("Delete should not succeed") - } - - // state should not be removed - var deletedState token.Model - diags := resp.State.Get(tc.Ctx, &deletedState) - if diags.HasError() { - t.Fatalf("failed to get state") - } - - if instanceId.String() != deletedState.InstanceId.ValueString() { - t.Fatalf("expected %v, got %v", instanceId.String(), deletedState.InstanceId.ValueString()) - } -} diff --git a/stackit/internal/services/modelexperiments/token/resource_read_test.go b/stackit/internal/services/modelexperiments/token/resource_read_test.go deleted file mode 100644 index cca242d4c..000000000 --- a/stackit/internal/services/modelexperiments/token/resource_read_test.go +++ /dev/null @@ -1,262 +0,0 @@ -package token_test - -import ( - "net/http" - "testing" - "time" - - "github.com/google/uuid" - "github.com/hashicorp/terraform-plugin-framework/resource" - "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" - "go.uber.org/mock/gomock" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/testutils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/token" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -// NOTE: These tests will be refactored. -// Please DO NOT use this file as a pattern or reference for writing new tests. -func TestRead_Success(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - name := "token" - newName := "new token name" - region := "eu01" - description := "token description" - instanceId := uuid.New() - tokenId := uuid.New() - validUntil := time.Date(2099, 1, 1, 0, 0, 0, 0, time.UTC) - tokenContent := "token" - id := utils.BuildInternalTerraformId(projectId.String(), region, instanceId.String(), tokenId.String()) - - getTokenResp := &modelexperiments.GetInstanceTokenResponse{ - Token: modelexperiments.TokenMetadata{ - Description: &description, - Id: tokenId.String(), - Name: newName, - Region: region, - State: "active", - ValidUntil: validUntil, - }, - } - tc.MockInstanceCLient.EXPECT().GetInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiGetInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().GetInstanceTokenExecute(gomock.Any()).Return(getTokenResp, nil) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - tokenRes := token.NewInstanceTokenResource(tc.MockInstanceCLient, providerData) - - schemaResp := resource.SchemaResponse{} - tokenRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - model := token.Model{ - ProjectId: types.StringValue(projectId.String()), - Name: types.StringValue(name), - Region: types.StringValue(region), - Description: types.StringValue(description), - InstanceId: types.StringValue(instanceId.String()), - Labels: types.MapNull(types.StringType), - Token: types.StringValue(tokenContent), - TokenId: types.StringValue(tokenId.String()), - Id: id, - ValidUntil: types.StringValue("2099-01-01T00:00:00Z"), - RotateWhenChanged: types.MapNull(types.StringType), - } - - req := testutils.ReadTokenRequest(tc.Ctx, schemaResp, model) - resp := testutils.ReadTokenResponse(tc.Ctx, schemaResp, nil) - tokenRes.Read(tc.Ctx, req, resp) - if resp.Diagnostics.HasError() { - t.Fatalf("Get should succeed but got errors") - } - - // state should be written according to GetInstanceToken Response - var refreshedState token.Model - diags := resp.State.Get(tc.Ctx, &refreshedState) - if diags.HasError() { - t.Fatalf("failed to get state") - } - - if tokenId.String() != refreshedState.TokenId.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", tokenId.String(), refreshedState.TokenId.ValueString()) - } - if projectId.String() != refreshedState.ProjectId.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", projectId.String(), refreshedState.ProjectId.ValueString()) - } - if instanceId.String() != refreshedState.InstanceId.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", instanceId.String(), refreshedState.InstanceId.ValueString()) - } - if newName != refreshedState.Name.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", name, refreshedState.Name.ValueString()) - } - if description != refreshedState.Description.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", description, refreshedState.Description.ValueString()) - } - if tokenContent != refreshedState.Token.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", tokenContent, refreshedState.Token.ValueString()) - } - if id.ValueString() != refreshedState.Id.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", id.ValueString(), refreshedState.Id.ValueString()) - } - if region != refreshedState.Region.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", region, refreshedState.Region.ValueString()) - } - if refreshedState.ValidUntil.ValueString() != "2099-01-01T00:00:00Z" { - t.Fatalf("Should be equal - expected %v, got %v", "2099-01-01T00:00:00Z", refreshedState.ValidUntil.ValueString()) - } -} - -func TestRead_TokenNotFound(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - name := "token" - region := "eu01" - description := "token description" - instanceId := uuid.New() - tokenId := uuid.New() - tokenContent := "token" - id := utils.BuildInternalTerraformId(projectId.String(), region, tokenId.String()) - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: http.StatusNotFound, - } - tc.MockInstanceCLient.EXPECT().GetInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiGetInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().GetInstanceTokenExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - tokenRes := token.NewInstanceTokenResource(tc.MockInstanceCLient, providerData) - - schemaResp := resource.SchemaResponse{} - tokenRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - model := token.Model{ - ProjectId: types.StringValue(projectId.String()), - Name: types.StringValue(name), - Region: types.StringValue(region), - Description: types.StringValue(description), - InstanceId: types.StringValue(instanceId.String()), - Labels: types.MapNull(types.StringType), - Token: types.StringValue(tokenContent), - TokenId: types.StringValue(tokenId.String()), - Id: id, - ValidUntil: types.StringValue("2099-01-01T00:00:00Z"), - RotateWhenChanged: types.MapNull(types.StringType), - } - - req := testutils.ReadTokenRequest(tc.Ctx, schemaResp, model) - resp := testutils.ReadTokenResponse(tc.Ctx, schemaResp, &model) - - tokenRes.Read(tc.Ctx, req, resp) - if resp.Diagnostics.HasError() { - t.Fatalf("Get should succeed but got errors") - } - - // state should be removed - var refreshedState *token.Model - diags := resp.State.Get(tc.Ctx, &refreshedState) - if diags.HasError() { - t.Fatalf("failed to get state") - } - if refreshedState != nil { - t.Fatalf("should be nil") - } -} - -func TestRead_GetTokenRequestFailed(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - name := "token" - region := "eu01" - description := "token description" - instanceId := uuid.New() - tokenId := uuid.New() - tokenContent := "token" - id := utils.BuildInternalTerraformId(projectId.String(), region, tokenId.String()) - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: http.StatusInternalServerError, - } - tc.MockInstanceCLient.EXPECT().GetInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiGetInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().GetInstanceTokenExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: "eu01", - } - tokenRes := token.NewInstanceTokenResource(tc.MockInstanceCLient, providerData) - - schemaResp := resource.SchemaResponse{} - tokenRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - model := token.Model{ - ProjectId: types.StringValue(projectId.String()), - Name: types.StringValue(name), - Region: types.StringValue(region), - Description: types.StringValue(description), - InstanceId: types.StringValue(instanceId.String()), - Labels: types.MapNull(types.StringType), - Token: types.StringValue(tokenContent), - TokenId: types.StringValue(tokenId.String()), - Id: id, - ValidUntil: types.StringValue("2099-01-01T00:00:00Z"), - RotateWhenChanged: types.MapNull(types.StringType), - } - - req := testutils.ReadTokenRequest(tc.Ctx, schemaResp, model) - resp := testutils.ReadTokenResponse(tc.Ctx, schemaResp, &model) - - tokenRes.Read(tc.Ctx, req, resp) - if !resp.Diagnostics.HasError() { - t.Fatalf("Get should not succeed") - } - - // state should not be edited - var refreshedState token.Model - diags := resp.State.Get(tc.Ctx, &refreshedState) - if diags.HasError() { - t.Fatalf("failed to get state") - } - - if tokenId.String() != refreshedState.TokenId.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", tokenId.String(), refreshedState.TokenId.ValueString()) - } - if projectId.String() != refreshedState.ProjectId.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", projectId.String(), refreshedState.ProjectId.ValueString()) - } - if instanceId.String() != refreshedState.InstanceId.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", instanceId.String(), refreshedState.InstanceId.ValueString()) - } - if name != refreshedState.Name.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", name, refreshedState.Name.ValueString()) - } - if description != refreshedState.Description.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", description, refreshedState.Description.ValueString()) - } - if tokenContent != refreshedState.Token.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", tokenContent, refreshedState.Token.ValueString()) - } - if id.ValueString() != refreshedState.Id.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", id.ValueString(), refreshedState.Id.ValueString()) - } - if region != refreshedState.Region.ValueString() { - t.Fatalf("Should be equal - expected %v, got %v", region, refreshedState.Region.ValueString()) - } - if refreshedState.ValidUntil.ValueString() != "2099-01-01T00:00:00Z" { - t.Fatalf("Should be equal - expected %v, got %v", "2099-01-01T00:00:00Z", refreshedState.ValidUntil.ValueString()) - } -} diff --git a/stackit/internal/services/modelexperiments/token/resource_update_test.go b/stackit/internal/services/modelexperiments/token/resource_update_test.go deleted file mode 100644 index 5622031ed..000000000 --- a/stackit/internal/services/modelexperiments/token/resource_update_test.go +++ /dev/null @@ -1,234 +0,0 @@ -package token_test - -import ( - "net/http" - "testing" - "time" - - "github.com/google/uuid" - "github.com/hashicorp/terraform-plugin-framework/resource" - "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" - "go.uber.org/mock/gomock" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/testutils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelexperiments/token" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -// NOTE: These tests will be refactored. -// Please DO NOT use this file as a pattern or reference for writing new tests. -func TestUpdate_Success(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - name := "token" - nameUpdated := "token update" - region := "eu01" - description := "token description" - descriptionUpdated := "description" - instanceId := uuid.New() - tokenId := uuid.New() - validUntil := time.Date(2099, 1, 1, 0, 0, 0, 0, time.UTC) - tokenContent := "token" - tfId := utils.BuildInternalTerraformId(projectId.String(), region, instanceId.String(), tokenId.String()) - - updateTokenResp := &modelexperiments.PartialUpdateInstanceTokenResponse{ - Token: modelexperiments.TokenMetadata{ - Description: &descriptionUpdated, - Id: tokenId.String(), - Name: nameUpdated, - Region: region, - State: "active", - ValidUntil: validUntil, - }, - } - - tc.MockInstanceCLient.EXPECT().PartialUpdateInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiPartialUpdateInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().PartialUpdateInstanceTokenExecute(gomock.Any()).Return(updateTokenResp, nil) - - providerData := core.ProviderData{ - DefaultRegion: region, - } - tokenRes := token.NewInstanceTokenResource(tc.MockInstanceCLient, providerData) - - schemaResp := resource.SchemaResponse{} - tokenRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - currentState := token.Model{ - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Name: types.StringValue(name), - Region: types.StringValue(region), - Description: types.StringValue(description), - Labels: types.MapNull(types.StringType), - Token: types.StringValue(tokenContent), - TokenId: types.StringValue(tokenId.String()), - Id: tfId, - ValidUntil: types.StringValue("2099-01-01T00:00:00Z"), - RotateWhenChanged: types.MapNull(types.StringType), - } - - plannedState := token.Model{ - ProjectId: types.StringValue(projectId.String()), - Name: types.StringValue(nameUpdated), - Region: types.StringValue(region), - Description: types.StringValue(descriptionUpdated), - InstanceId: types.StringValue(instanceId.String()), - Labels: types.MapNull(types.StringType), - RotateWhenChanged: types.MapNull(types.StringType), - } - - req := testutils.UpdateTokenRequest(tc.Ctx, schemaResp, currentState, plannedState) - resp := testutils.UpdateTokenResponse(tc.Ctx, schemaResp, ¤tState) - - // Execute Update - tokenRes.Update(tc.Ctx, req, resp) - if resp.Diagnostics.HasError() { - t.Fatalf("update should succeed") - } - - // state should be updated - var updatedState token.Model - diags := resp.State.Get(tc.Ctx, &updatedState) - if diags.HasError() { - t.Fatalf("failed to get state") - } - - if updatedState.ProjectId.ValueString() != projectId.String() { - t.Fatalf("ProjectId mismatch: got %v, want %v", updatedState.ProjectId.ValueString(), projectId.String()) - } - if updatedState.Region.ValueString() != region { - t.Fatalf("Region mismatch: got %v, want %v", updatedState.Region.ValueString(), region) - } - if updatedState.Name.ValueString() != nameUpdated { - t.Fatalf("Name mismatch: got %v, want %v", updatedState.Name.ValueString(), nameUpdated) - } - if updatedState.Description.ValueString() != descriptionUpdated { - t.Fatalf("Description mismatch: got %v, want %v", updatedState.Description.ValueString(), descriptionUpdated) - } - if updatedState.InstanceId.ValueString() != instanceId.String() { - t.Fatalf("InstanceId mismatch: got %v, want %v", updatedState.InstanceId.ValueString(), instanceId.String()) - } - if updatedState.TokenId.ValueString() != tokenId.String() { - t.Fatalf("TokenId mismatch: got %v, want %v", updatedState.TokenId.ValueString(), tokenId.String()) - } - if updatedState.Id != tfId { - t.Fatalf("Id mismatch: got %v, want %v", updatedState.Id.ValueString(), tfId) - } - if updatedState.ValidUntil.ValueString() != "2099-01-01T00:00:00Z" { - t.Fatalf("ValidUntil mismatch: got %v, want 2099-01-01T00:00:00Z", updatedState.ValidUntil.ValueString()) - } - if !updatedState.Labels.IsNull() { - t.Fatalf("Labels should be null") - } - if updatedState.Token.ValueString() != tokenContent { - t.Fatalf("Token mismatch: got %v, want %v", updatedState.Token.ValueString(), tokenContent) - } -} - -func TestUpdate_TokenUpdateError(t *testing.T) { - tc := testutils.NewTestContext(t) - - projectId := uuid.New() - name := "token" - nameUpdated := "token update" - region := "eu01" - description := "token description" - descriptionUpdated := "description" - instanceId := uuid.New() - tokenId := uuid.New() - tokenContent := "token" - tfId := utils.BuildInternalTerraformId(projectId.String(), region, tokenId.String()) - - oapiErr := &oapierror.GenericOpenAPIError{ - StatusCode: http.StatusInternalServerError, - } - tc.MockInstanceCLient.EXPECT().PartialUpdateInstanceToken(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(modelexperiments.ApiPartialUpdateInstanceTokenRequest{ - ApiService: tc.MockInstanceCLient, - }) - tc.MockInstanceCLient.EXPECT().PartialUpdateInstanceTokenExecute(gomock.Any()).Return(nil, oapiErr) - - providerData := core.ProviderData{ - DefaultRegion: region, - } - tokenRes := token.NewInstanceTokenResource(tc.MockInstanceCLient, providerData) - - schemaResp := resource.SchemaResponse{} - tokenRes.Schema(tc.Ctx, resource.SchemaRequest{}, &schemaResp) - - currentState := token.Model{ - ProjectId: types.StringValue(projectId.String()), - InstanceId: types.StringValue(instanceId.String()), - Name: types.StringValue(name), - Region: types.StringValue(region), - Description: types.StringValue(description), - Labels: types.MapNull(types.StringType), - Token: types.StringValue(tokenContent), - TokenId: types.StringValue(tokenId.String()), - Id: tfId, - ValidUntil: types.StringValue("2099-01-01T00:00:00Z"), - RotateWhenChanged: types.MapNull(types.StringType), - } - - plannedState := token.Model{ - ProjectId: types.StringValue(projectId.String()), - Name: types.StringValue(nameUpdated), - Region: types.StringValue(region), - Description: types.StringValue(descriptionUpdated), - InstanceId: types.StringValue(instanceId.String()), - Labels: types.MapNull(types.StringType), - RotateWhenChanged: types.MapNull(types.StringType), - } - - req := testutils.UpdateTokenRequest(tc.Ctx, schemaResp, currentState, plannedState) - resp := testutils.UpdateTokenResponse(tc.Ctx, schemaResp, ¤tState) - - // Execute Update - tokenRes.Update(tc.Ctx, req, resp) - if !resp.Diagnostics.HasError() { - t.Fatalf("update should not succeed") - } - - // state should not be changed - var updatedState token.Model - diags := resp.State.Get(tc.Ctx, &updatedState) - if diags.HasError() { - t.Fatalf("failed to get state") - } - - if updatedState.ProjectId.ValueString() != projectId.String() { - t.Fatalf("ProjectId mismatch: got %v, want %v", updatedState.ProjectId.ValueString(), projectId.String()) - } - if updatedState.Region.ValueString() != region { - t.Fatalf("Region mismatch: got %v, want %v", updatedState.Region.ValueString(), region) - } - if updatedState.Name.ValueString() != name { - t.Fatalf("Name mismatch: got %v, want %v", updatedState.Name.ValueString(), name) - } - if updatedState.Description.ValueString() != description { - t.Fatalf("Description mismatch: got %v, want %v", updatedState.Description.ValueString(), description) - } - if updatedState.InstanceId.ValueString() != instanceId.String() { - t.Fatalf("InstanceId mismatch: got %v, want %v", updatedState.InstanceId.ValueString(), instanceId.String()) - } - if updatedState.TokenId.ValueString() != tokenId.String() { - t.Fatalf("TokenId mismatch: got %v, want %v", updatedState.TokenId.ValueString(), tokenId.String()) - } - if updatedState.Id != tfId { - t.Fatalf("Id mismatch: got %v, want %v", updatedState.Id.ValueString(), tfId) - } - if updatedState.ValidUntil.ValueString() != "2099-01-01T00:00:00Z" { - t.Fatalf("ValidUntil mismatch: got %v, want 2099-01-01T00:00:00Z", updatedState.ValidUntil.ValueString()) - } - if !updatedState.Labels.IsNull() { - t.Fatalf("Labels should be null") - } - if updatedState.Token.ValueString() != tokenContent { - t.Fatalf("Token mismatch: got %v, want %v", updatedState.Token.ValueString(), tokenContent) - } -} diff --git a/stackit/internal/services/modelexperiments/utils/util.go b/stackit/internal/services/modelexperiments/utils/util.go deleted file mode 100644 index 1df66edfb..000000000 --- a/stackit/internal/services/modelexperiments/utils/util.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - modelexperiment "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *modelexperiment.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.ModelExperimentsCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.ModelExperimentsCustomEndpoint)) - } - apiClient, err := modelexperiment.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/modelexperiments/utils/util_test.go b/stackit/internal/services/modelexperiments/utils/util_test.go deleted file mode 100644 index 1bbd7f242..000000000 --- a/stackit/internal/services/modelexperiments/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - modelexperiments "github.com/stackitcloud/stackit-sdk-go/services/modelexperiments/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://modelexperiments-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *modelexperiments.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *modelexperiments.APIClient { - apiClient, err := modelexperiments.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - ModelExperimentsCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *modelexperiments.APIClient { - apiClient, err := modelexperiments.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/modelserving/token/resource.go b/stackit/internal/services/modelserving/token/resource.go index f3e5a753f..306e1c1e8 100644 --- a/stackit/internal/services/modelserving/token/resource.go +++ b/stackit/internal/services/modelserving/token/resource.go @@ -8,9 +8,6 @@ import ( "net/http" "time" - modelservingUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/modelserving/utils" - serviceenablementUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serviceenablement/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" @@ -72,9 +69,9 @@ func NewTokenResource() resource.Resource { // tokenResource is the resource implementation. type tokenResource struct { - client *modelserving.APIClient + client modelserving.DefaultAPI providerData core.ProviderData - serviceEnablementClient *serviceenablement.APIClient + serviceEnablementClient serviceenablement.DefaultAPI } // Metadata returns the resource type name. @@ -84,22 +81,15 @@ func (r *tokenResource) Metadata(_ context.Context, req resource.MetadataRequest // Configure adds the provider configured client to the resource. func (r *tokenResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := modelservingUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - serviceEnablementClient := serviceenablementUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient - r.serviceEnablementClient = serviceEnablementClient + r.providerData = providerData + r.client = clients.ModelservingV1Client + r.serviceEnablementClient = clients.ServiceEnablementV2Client + tflog.Info(ctx, "Model-Serving auth token client configured") } @@ -248,7 +238,7 @@ func (r *tokenResource) Create(ctx context.Context, req resource.CreateRequest, ctx = tflog.SetField(ctx, "region", region) // If AI model serving is not enabled, enable it - err := r.serviceEnablementClient.DefaultAPI.EnableServiceRegional(ctx, region, projectId, utils.ModelServingServiceId). + err := r.serviceEnablementClient.EnableServiceRegional(ctx, region, projectId, utils.ModelServingServiceId). Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError @@ -269,7 +259,7 @@ func (r *tokenResource) Create(ctx context.Context, req resource.CreateRequest, return } - _, err = serviceEnablementWait.EnableServiceWaitHandler(ctx, r.serviceEnablementClient.DefaultAPI, region, projectId, utils.ModelServingServiceId). + _, err = serviceEnablementWait.EnableServiceWaitHandler(ctx, r.serviceEnablementClient, region, projectId, utils.ModelServingServiceId). WaitWithContext(ctx) if err != nil { core.LogAndAddError( @@ -289,7 +279,7 @@ func (r *tokenResource) Create(ctx context.Context, req resource.CreateRequest, } // Create new AI model serving auth token - createTokenResp, err := r.client.DefaultAPI.CreateToken(ctx, region, projectId). + createTokenResp, err := r.client.CreateToken(ctx, region, projectId). CreateTokenPayload(*payload). Execute() if err != nil { @@ -320,7 +310,7 @@ func (r *tokenResource) Create(ctx context.Context, req resource.CreateRequest, return } - waitResp, err := wait.CreateModelServingWaitHandler(ctx, r.client.DefaultAPI, region, projectId, tokenId).WaitWithContext(ctx) + waitResp, err := wait.CreateModelServingWaitHandler(ctx, r.client, region, projectId, tokenId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating AI model serving auth token", fmt.Sprintf("Waiting for token to be active: %v", err)) return @@ -367,7 +357,7 @@ func (r *tokenResource) Read(ctx context.Context, req resource.ReadRequest, resp ctx = tflog.SetField(ctx, "token_id", tokenId) ctx = tflog.SetField(ctx, "region", region) - getTokenResp, err := r.client.DefaultAPI.GetToken(ctx, region, projectId, tokenId). + getTokenResp, err := r.client.GetToken(ctx, region, projectId, tokenId). Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError @@ -445,7 +435,7 @@ func (r *tokenResource) Update(ctx context.Context, req resource.UpdateRequest, } // Update AI model serving auth token - updateTokenResp, err := r.client.DefaultAPI.PartialUpdateToken(ctx, region, projectId, tokenId).PartialUpdateTokenPayload(*payload).Execute() + updateTokenResp, err := r.client.PartialUpdateToken(ctx, region, projectId, tokenId).PartialUpdateTokenPayload(*payload).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) { @@ -479,7 +469,7 @@ func (r *tokenResource) Update(ctx context.Context, req resource.UpdateRequest, return } - waitResp, err := wait.UpdateModelServingWaitHandler(ctx, r.client.DefaultAPI, region, projectId, tokenId).WaitWithContext(ctx) + waitResp, err := wait.UpdateModelServingWaitHandler(ctx, r.client, region, projectId, tokenId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating AI model serving auth token", fmt.Sprintf("Waiting for token to be updated: %v", err)) return @@ -524,7 +514,7 @@ func (r *tokenResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = tflog.SetField(ctx, "region", region) // Delete existing AI model serving auth token. We will ignore the state 'deleting' for now. - _, err := r.client.DefaultAPI.DeleteToken(ctx, region, projectId, tokenId).Execute() + _, err := r.client.DeleteToken(ctx, region, projectId, tokenId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) { @@ -540,7 +530,7 @@ func (r *tokenResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = core.LogResponse(ctx) - _, err = wait.DeleteModelServingWaitHandler(ctx, r.client.DefaultAPI, region, projectId, tokenId). + _, err = wait.DeleteModelServingWaitHandler(ctx, r.client, region, projectId, tokenId). WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting AI model serving auth token", fmt.Sprintf("Waiting for token to be deleted: %v", err)) diff --git a/stackit/internal/services/modelserving/utils/util.go b/stackit/internal/services/modelserving/utils/util.go deleted file mode 100644 index 73ac62c8a..000000000 --- a/stackit/internal/services/modelserving/utils/util.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - modelserving "github.com/stackitcloud/stackit-sdk-go/services/modelserving/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *modelserving.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.ModelServingCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.ModelServingCustomEndpoint)) - } - apiClient, err := modelserving.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/modelserving/utils/util_test.go b/stackit/internal/services/modelserving/utils/util_test.go deleted file mode 100644 index ca1e97192..000000000 --- a/stackit/internal/services/modelserving/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - modelserving "github.com/stackitcloud/stackit-sdk-go/services/modelserving/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://modelserving-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *modelserving.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *modelserving.APIClient { - apiClient, err := modelserving.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - ModelServingCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *modelserving.APIClient { - apiClient, err := modelserving.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/mongodbflex/instance/datasource.go b/stackit/internal/services/mongodbflex/instance/datasource.go index 62dc2ecc0..d21255190 100644 --- a/stackit/internal/services/mongodbflex/instance/datasource.go +++ b/stackit/internal/services/mongodbflex/instance/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - mongodbflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/mongodbflex/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types/basetypes" @@ -34,7 +31,7 @@ func NewInstanceDataSource() datasource.DataSource { // instanceDataSource is the data source implementation. type instanceDataSource struct { - client *mongodbflex.APIClient + client mongodbflex.DefaultAPI providerData core.ProviderData } @@ -45,17 +42,14 @@ func (d *instanceDataSource) Metadata(_ context.Context, req datasource.Metadata // Configure adds the provider configured client to the data source. func (d *instanceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := mongodbflexUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.MongoDbFlexV2Client + tflog.Info(ctx, "MongoDB Flex instance client configured") } @@ -206,7 +200,7 @@ func (d *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceId) - instanceResp, err := d.client.DefaultAPI.GetInstance(ctx, projectId, instanceId, region).Execute() + instanceResp, err := d.client.GetInstance(ctx, projectId, instanceId, region).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/mongodbflex/instance/resource.go b/stackit/internal/services/mongodbflex/instance/resource.go index 4c8d6e1d7..9aa4fc3b3 100644 --- a/stackit/internal/services/mongodbflex/instance/resource.go +++ b/stackit/internal/services/mongodbflex/instance/resource.go @@ -12,7 +12,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema/int32planmodifier" - mongodbflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/mongodbflex/utils" stringplanmodifierCustom "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils/planmodifiers/stringplanmodifier" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" @@ -115,7 +114,7 @@ func NewInstanceResource() resource.Resource { // instanceResource is the resource implementation. type instanceResource struct { - client *mongodbflex.APIClient + client mongodbflex.DefaultAPI providerData core.ProviderData } @@ -126,17 +125,14 @@ func (r *instanceResource) Metadata(_ context.Context, req resource.MetadataRequ // Configure adds the provider configured client to the resource. func (r *instanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := mongodbflexUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.MongoDbFlexV2Client + tflog.Info(ctx, "MongoDB Flex instance client configured") } @@ -386,7 +382,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques if resp.Diagnostics.HasError() { return } - err := loadFlavorId(ctx, r.client.DefaultAPI, &model, flavor, region) + err := loadFlavorId(ctx, r.client, &model, flavor, region) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Loading flavor ID: %v", err)) return @@ -417,7 +413,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } // Create new instance - createResp, err := r.client.DefaultAPI.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() + createResp, err := r.client.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -442,7 +438,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques if resp.Diagnostics.HasError() { return } - waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, instanceId, region).WaitWithContext(ctx) + waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client, projectId, instanceId, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -466,7 +462,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Creating API payload: %v", err)) return } - backupScheduleOptions, err := r.client.DefaultAPI.UpdateBackupSchedule(ctx, projectId, instanceId, region).UpdateBackupSchedulePayload(*backupScheduleOptionsPayload).Execute() + backupScheduleOptions, err := r.client.UpdateBackupSchedule(ctx, projectId, instanceId, region).UpdateBackupSchedulePayload(*backupScheduleOptionsPayload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Updating options: %v", err)) return @@ -536,7 +532,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r } } - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, instanceId, region).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, instanceId, region).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -598,7 +594,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques if resp.Diagnostics.HasError() { return } - err := loadFlavorId(ctx, r.client.DefaultAPI, &model, flavor, region) + err := loadFlavorId(ctx, r.client, &model, flavor, region) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Loading flavor ID: %v", err)) return @@ -629,7 +625,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques return } // Update existing instance - _, err = r.client.DefaultAPI.PartialUpdateInstance(ctx, projectId, instanceId, region).PartialUpdateInstancePayload(*payload).Execute() + _, err = r.client.PartialUpdateInstance(ctx, projectId, instanceId, region).PartialUpdateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", err.Error()) return @@ -637,7 +633,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques ctx = core.LogResponse(ctx) - waitResp, err := wait.UpdateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, instanceId, region).WaitWithContext(ctx) + waitResp, err := wait.UpdateInstanceWaitHandler(ctx, r.client, projectId, instanceId, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Instance update waiting: %v", err)) return @@ -655,7 +651,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Creating API payload: %v", err)) return } - backupScheduleOptions, err := r.client.DefaultAPI.UpdateBackupSchedule(ctx, projectId, instanceId, region).UpdateBackupSchedulePayload(*backupScheduleOptionsPayload).Execute() + backupScheduleOptions, err := r.client.UpdateBackupSchedule(ctx, projectId, instanceId, region).UpdateBackupSchedulePayload(*backupScheduleOptionsPayload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Updating options: %v", err)) return @@ -695,7 +691,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = tflog.SetField(ctx, "instance_id", instanceId) // Delete existing instance - err := r.client.DefaultAPI.DeleteInstance(ctx, projectId, instanceId, region).Execute() + err := r.client.DeleteInstance(ctx, projectId, instanceId, region).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -708,7 +704,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = core.LogResponse(ctx) - _, err = wait.DeleteInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, instanceId, region).WaitWithContext(ctx) + _, err = wait.DeleteInstanceWaitHandler(ctx, r.client, projectId, instanceId, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting instance", fmt.Sprintf("Instance deletion waiting: %v", err)) return diff --git a/stackit/internal/services/mongodbflex/user/datasource.go b/stackit/internal/services/mongodbflex/user/datasource.go index 300f142c6..76da9fc92 100644 --- a/stackit/internal/services/mongodbflex/user/datasource.go +++ b/stackit/internal/services/mongodbflex/user/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - mongodbflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/mongodbflex/utils" - "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -47,7 +44,7 @@ func NewUserDataSource() datasource.DataSource { // userDataSource is the data source implementation. type userDataSource struct { - client *mongodbflex.APIClient + client mongodbflex.DefaultAPI providerData core.ProviderData } @@ -58,17 +55,14 @@ func (d *userDataSource) Metadata(_ context.Context, req datasource.MetadataRequ // Configure adds the provider configured client to the data source. func (d *userDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := mongodbflexUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.MongoDbFlexV2Client + tflog.Info(ctx, "MongoDB Flex user client configured") } @@ -159,7 +153,7 @@ func (d *userDataSource) Read(ctx context.Context, req datasource.ReadRequest, r ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "user_id", userId) - recordSetResp, err := d.client.DefaultAPI.GetUser(ctx, projectId, instanceId, userId, region).Execute() + recordSetResp, err := d.client.GetUser(ctx, projectId, instanceId, userId, region).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/mongodbflex/user/resource.go b/stackit/internal/services/mongodbflex/user/resource.go index e70253ecd..36db1c3df 100644 --- a/stackit/internal/services/mongodbflex/user/resource.go +++ b/stackit/internal/services/mongodbflex/user/resource.go @@ -13,8 +13,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - mongodbflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/mongodbflex/utils" - "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -67,7 +65,7 @@ func NewUserResource() resource.Resource { // userResource is the resource implementation. type userResource struct { - client *mongodbflex.APIClient + client mongodbflex.DefaultAPI providerData core.ProviderData } @@ -78,17 +76,14 @@ func (r *userResource) Metadata(_ context.Context, req resource.MetadataRequest, // Configure adds the provider configured client to the resource. func (r *userResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := mongodbflexUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.MongoDbFlexV2Client + tflog.Info(ctx, "MongoDB Flex user client configured") } @@ -276,7 +271,7 @@ func (r *userResource) Create(ctx context.Context, req resource.CreateRequest, r return } // Create new user - userResp, err := r.client.DefaultAPI.CreateUser(ctx, projectId, instanceId, region).CreateUserPayload(*payload).Execute() + userResp, err := r.client.CreateUser(ctx, projectId, instanceId, region).CreateUserPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating user", fmt.Sprintf("Calling API: %v", err)) return @@ -339,7 +334,7 @@ func (r *userResource) Read(ctx context.Context, req resource.ReadRequest, resp ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "user_id", userId) - recordSetResp, err := r.client.DefaultAPI.GetUser(ctx, projectId, instanceId, userId, region).Execute() + recordSetResp, err := r.client.GetUser(ctx, projectId, instanceId, userId, region).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -414,7 +409,7 @@ func (r *userResource) Update(ctx context.Context, req resource.UpdateRequest, r } // Update existing instance - err = r.client.DefaultAPI.UpdateUser(ctx, projectId, instanceId, userId, region).UpdateUserPayload(*payload).Execute() + err = r.client.UpdateUser(ctx, projectId, instanceId, userId, region).UpdateUserPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating user", err.Error()) return @@ -422,7 +417,7 @@ func (r *userResource) Update(ctx context.Context, req resource.UpdateRequest, r ctx = core.LogResponse(ctx) - userResp, err := r.client.DefaultAPI.GetUser(ctx, projectId, instanceId, userId, region).Execute() + userResp, err := r.client.GetUser(ctx, projectId, instanceId, userId, region).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating user", fmt.Sprintf("Calling API: %v", err)) return @@ -466,7 +461,7 @@ func (r *userResource) Delete(ctx context.Context, req resource.DeleteRequest, r ctx = tflog.SetField(ctx, "user_id", userId) // Delete user - err := r.client.DefaultAPI.DeleteUser(ctx, projectId, instanceId, userId, region).Execute() + err := r.client.DeleteUser(ctx, projectId, instanceId, userId, region).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/mongodbflex/utils/util.go b/stackit/internal/services/mongodbflex/utils/util.go deleted file mode 100644 index fec608da2..000000000 --- a/stackit/internal/services/mongodbflex/utils/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - mongodbflex "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *mongodbflex.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.MongoDBFlexCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.MongoDBFlexCustomEndpoint)) - } - - apiClient, err := mongodbflex.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/mongodbflex/utils/util_test.go b/stackit/internal/services/mongodbflex/utils/util_test.go deleted file mode 100644 index 30499c4aa..000000000 --- a/stackit/internal/services/mongodbflex/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - mongodbflex "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://mongodbflex-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *mongodbflex.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *mongodbflex.APIClient { - apiClient, err := mongodbflex.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - MongoDBFlexCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *mongodbflex.APIClient { - apiClient, err := mongodbflex.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/objectstorage/bucket/datasource.go b/stackit/internal/services/objectstorage/bucket/datasource.go index 9130ef6c9..8de09316d 100644 --- a/stackit/internal/services/objectstorage/bucket/datasource.go +++ b/stackit/internal/services/objectstorage/bucket/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - objectstorageUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/objectstorage/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -32,7 +29,7 @@ func NewBucketDataSource() datasource.DataSource { // bucketDataSource is the data source implementation. type bucketDataSource struct { - client *objectstorage.APIClient + client objectstorage.DefaultAPI providerData core.ProviderData } @@ -43,17 +40,14 @@ func (r *bucketDataSource) Metadata(_ context.Context, req datasource.MetadataRe // Configure adds the provider configured client to the data source. func (r *bucketDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := objectstorageUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ObjectStorageV2Client + tflog.Info(ctx, "ObjectStorage bucket client configured") } @@ -130,7 +124,7 @@ func (r *bucketDataSource) Read(ctx context.Context, req datasource.ReadRequest, ctx = tflog.SetField(ctx, "name", bucketName) ctx = tflog.SetField(ctx, "region", region) - bucketResp, err := r.client.DefaultAPI.GetBucket(ctx, projectId, region, bucketName).Execute() + bucketResp, err := r.client.GetBucket(ctx, projectId, region, bucketName).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/objectstorage/bucket/resource.go b/stackit/internal/services/objectstorage/bucket/resource.go index ccf9efa08..8787eea6d 100644 --- a/stackit/internal/services/objectstorage/bucket/resource.go +++ b/stackit/internal/services/objectstorage/bucket/resource.go @@ -10,9 +10,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema/booldefault" "github.com/hashicorp/terraform-plugin-framework/resource/schema/boolplanmodifier" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - objectstorageUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/objectstorage/utils" - "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -55,7 +52,7 @@ func NewBucketResource() resource.Resource { // bucketResource is the resource implementation. type bucketResource struct { - client *objectstorage.APIClient + client objectstorage.DefaultAPI providerData core.ProviderData } @@ -102,17 +99,14 @@ func (r *bucketResource) Metadata(_ context.Context, req resource.MetadataReques // Configure adds the provider configured client to the resource. func (r *bucketResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := objectstorageUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ObjectStorageV2Client + tflog.Info(ctx, "ObjectStorage bucket client configured") } @@ -211,14 +205,14 @@ func (r *bucketResource) Create(ctx context.Context, req resource.CreateRequest, ctx = tflog.SetField(ctx, "region", region) // Handle project init - err := enableProject(ctx, &model, region, r.client.DefaultAPI) + err := enableProject(ctx, &model, region, r.client) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating bucket", fmt.Sprintf("Enabling object storage project before creation: %v", err)) return } // Create new bucket - _, err = r.client.DefaultAPI.CreateBucket(ctx, projectId, region, bucketName).ObjectLockEnabled(model.ObjectLock.ValueBool()).Execute() + _, err = r.client.CreateBucket(ctx, projectId, region, bucketName).ObjectLockEnabled(model.ObjectLock.ValueBool()).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating bucket", fmt.Sprintf("Calling API: %v", err)) return @@ -236,7 +230,7 @@ func (r *bucketResource) Create(ctx context.Context, req resource.CreateRequest, return } - waitResp, err := wait.CreateBucketWaitHandler(ctx, r.client.DefaultAPI, projectId, region, bucketName).WaitWithContext(ctx) + waitResp, err := wait.CreateBucketWaitHandler(ctx, r.client, projectId, region, bucketName).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating bucket", fmt.Sprintf("Bucket creation waiting: %v", err)) return @@ -275,7 +269,7 @@ func (r *bucketResource) Read(ctx context.Context, req resource.ReadRequest, res ctx = tflog.SetField(ctx, "name", bucketName) ctx = tflog.SetField(ctx, "region", region) - bucketResp, err := r.client.DefaultAPI.GetBucket(ctx, projectId, region, bucketName).Execute() + bucketResp, err := r.client.GetBucket(ctx, projectId, region, bucketName).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -330,7 +324,7 @@ func (r *bucketResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = tflog.SetField(ctx, "region", region) // Delete existing bucket - _, err := r.client.DefaultAPI.DeleteBucket(ctx, projectId, region, bucketName).Execute() + _, err := r.client.DeleteBucket(ctx, projectId, region, bucketName).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) { @@ -348,7 +342,7 @@ func (r *bucketResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = core.LogResponse(ctx) - _, err = wait.DeleteBucketWaitHandler(ctx, r.client.DefaultAPI, projectId, region, bucketName).WaitWithContext(ctx) + _, err = wait.DeleteBucketWaitHandler(ctx, r.client, projectId, region, bucketName).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting bucket", fmt.Sprintf("Bucket deletion waiting: %v", err)) return diff --git a/stackit/internal/services/objectstorage/compliance-lock/datasource.go b/stackit/internal/services/objectstorage/compliance-lock/datasource.go index 55ea6dfd4..b70749574 100644 --- a/stackit/internal/services/objectstorage/compliance-lock/datasource.go +++ b/stackit/internal/services/objectstorage/compliance-lock/datasource.go @@ -11,9 +11,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - objectstorageUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/objectstorage/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -30,7 +29,7 @@ func NewComplianceLockDataSource() datasource.DataSource { // compliancelockDataSource is the data source implementation. type compliancelockDataSource struct { - client *objectstorage.APIClient + client objectstorage.DefaultAPI providerData core.ProviderData } @@ -41,17 +40,14 @@ func (d *compliancelockDataSource) Metadata(_ context.Context, req datasource.Me // Configure adds the provider configured client to the data source. func (d *compliancelockDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := objectstorageUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.ObjectStorageV2Client + tflog.Info(ctx, "ObjectStorage compliance lock client configured") } @@ -110,7 +106,7 @@ func (d *compliancelockDataSource) Read(ctx context.Context, req datasource.Read ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "region", region) - complianceResp, err := d.client.DefaultAPI.GetComplianceLock(ctx, projectId, region).Execute() + complianceResp, err := d.client.GetComplianceLock(ctx, projectId, region).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/objectstorage/compliance-lock/resource.go b/stackit/internal/services/objectstorage/compliance-lock/resource.go index be56edde9..a5f2b9bb7 100644 --- a/stackit/internal/services/objectstorage/compliance-lock/resource.go +++ b/stackit/internal/services/objectstorage/compliance-lock/resource.go @@ -8,7 +8,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema" - objectstorageUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/objectstorage/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" "github.com/hashicorp/terraform-plugin-framework/resource" @@ -20,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) @@ -45,7 +43,7 @@ func NewComplianceLockResource() resource.Resource { // compliancelockResource is the resource implementation. type compliancelockResource struct { - client *objectstorage.APIClient + client objectstorage.DefaultAPI providerData core.ProviderData } @@ -86,17 +84,14 @@ func (r *compliancelockResource) Metadata(_ context.Context, req resource.Metada // Configure adds the provider configured client to the resource. func (r *compliancelockResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := objectstorageUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ObjectStorageV2Client + tflog.Info(ctx, "ObjectStorage client configured") } @@ -165,7 +160,7 @@ func (r *compliancelockResource) Create(ctx context.Context, req resource.Create ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "region", region) - complianceResp, err := r.client.DefaultAPI.CreateComplianceLock(ctx, projectId, region).Execute() + complianceResp, err := r.client.CreateComplianceLock(ctx, projectId, region).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) @@ -176,7 +171,7 @@ func (r *compliancelockResource) Create(ctx context.Context, req resource.Create } tflog.Info(ctx, "Compliance lock is already enabled for this project. Please check duplicate resources.") - complianceResp, err = r.client.DefaultAPI.GetComplianceLock(ctx, projectId, region).Execute() + complianceResp, err = r.client.GetComplianceLock(ctx, projectId, region).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading compliance lock", fmt.Sprintf("Calling API: %v", err)) return @@ -216,7 +211,7 @@ func (r *compliancelockResource) Read(ctx context.Context, req resource.ReadRequ ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "region", region) - complianceResp, err := r.client.DefaultAPI.GetComplianceLock(ctx, projectId, region).Execute() + complianceResp, err := r.client.GetComplianceLock(ctx, projectId, region).Execute() if err != nil { oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped if ok && oapiErr.StatusCode == http.StatusNotFound { @@ -268,7 +263,7 @@ func (r *compliancelockResource) Delete(ctx context.Context, req resource.Delete ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "region", region) - _, err := r.client.DefaultAPI.DeleteComplianceLock(ctx, projectId, region).Execute() + _, err := r.client.DeleteComplianceLock(ctx, projectId, region).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting compliance lock", fmt.Sprintf("Calling API: %v", err)) return diff --git a/stackit/internal/services/objectstorage/credential/datasource.go b/stackit/internal/services/objectstorage/credential/datasource.go index 9d8b96a3b..1b3ed4079 100644 --- a/stackit/internal/services/objectstorage/credential/datasource.go +++ b/stackit/internal/services/objectstorage/credential/datasource.go @@ -6,9 +6,6 @@ import ( "net/http" "time" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - objectstorageUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/objectstorage/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -42,7 +39,7 @@ func NewCredentialDataSource() datasource.DataSource { // credentialDataSource is the resource implementation. type credentialDataSource struct { - client *objectstorage.APIClient + client objectstorage.DefaultAPI providerData core.ProviderData } @@ -53,17 +50,14 @@ func (r *credentialDataSource) Metadata(_ context.Context, req datasource.Metada // Configure adds the provider configured client to the datasource. func (r *credentialDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := objectstorageUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ObjectStorageV2Client + tflog.Info(ctx, "ObjectStorage credential client configured") } @@ -133,7 +127,7 @@ func (r *credentialDataSource) Read(ctx context.Context, req datasource.ReadRequ ctx = tflog.SetField(ctx, "credential_id", credentialId) ctx = tflog.SetField(ctx, "region", region) - credentialsGroupResp, err := r.client.DefaultAPI.ListAccessKeys(ctx, projectId, region).CredentialsGroup(credentialsGroupId).Execute() + credentialsGroupResp, err := r.client.ListAccessKeys(ctx, projectId, region).CredentialsGroup(credentialsGroupId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/objectstorage/credential/resource.go b/stackit/internal/services/objectstorage/credential/resource.go index 996e77fdc..bed42e032 100644 --- a/stackit/internal/services/objectstorage/credential/resource.go +++ b/stackit/internal/services/objectstorage/credential/resource.go @@ -10,8 +10,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema/mapplanmodifier" - objectstorageUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/objectstorage/utils" - "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -62,7 +60,7 @@ func NewCredentialResource() resource.Resource { // credentialResource is the resource implementation. type credentialResource struct { - client *objectstorage.APIClient + client objectstorage.DefaultAPI providerData core.ProviderData } @@ -143,17 +141,14 @@ func (r *credentialResource) Metadata(_ context.Context, req resource.MetadataRe // Configure adds the provider configured client to the resource. func (r *credentialResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := objectstorageUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ObjectStorageV2Client + tflog.Info(ctx, "ObjectStorage credential client configured") } @@ -281,7 +276,7 @@ func (r *credentialResource) Create(ctx context.Context, req resource.CreateRequ ctx = tflog.SetField(ctx, "region", region) // Handle project init - err := enableProject(ctx, &model, region, r.client.DefaultAPI) + err := enableProject(ctx, &model, region, r.client) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating credential", fmt.Sprintf("Enabling object storage project before creation: %v", err)) return @@ -294,7 +289,7 @@ func (r *credentialResource) Create(ctx context.Context, req resource.CreateRequ return } // Create new credential - credentialResp, err := r.client.DefaultAPI.CreateAccessKey(ctx, projectId, region).CredentialsGroup(credentialsGroupId).CreateAccessKeyPayload(*payload).Execute() + credentialResp, err := r.client.CreateAccessKey(ctx, projectId, region).CredentialsGroup(credentialsGroupId).CreateAccessKeyPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating credential", fmt.Sprintf("Calling API: %v", err)) return @@ -454,7 +449,7 @@ func (r *credentialResource) Delete(ctx context.Context, req resource.DeleteRequ ctx = tflog.SetField(ctx, "region", region) // Delete existing credential - _, err := r.client.DefaultAPI.DeleteAccessKey(ctx, projectId, region, credentialId).CredentialsGroup(credentialsGroupId).Execute() + _, err := r.client.DeleteAccessKey(ctx, projectId, region, credentialId).CredentialsGroup(credentialsGroupId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -567,12 +562,12 @@ func mapFields(credentialResp *objectstorage.CreateAccessKeyResponse, model *Mod // readCredentials gets all the existing credentials for the specified credentials group, // finds the credential that is being read and updates the state. // Returns True if the credential was found, False otherwise. -func readCredentials(ctx context.Context, model *Model, region string, client *objectstorage.APIClient) (bool, error) { +func readCredentials(ctx context.Context, model *Model, region string, client objectstorage.DefaultAPI) (bool, error) { projectId := model.ProjectId.ValueString() credentialsGroupId := model.CredentialsGroupId.ValueString() credentialId := model.CredentialId.ValueString() - credentialsGroupResp, err := client.DefaultAPI.ListAccessKeys(ctx, projectId, region).CredentialsGroup(credentialsGroupId).Execute() + credentialsGroupResp, err := client.ListAccessKeys(ctx, projectId, region).CredentialsGroup(credentialsGroupId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/objectstorage/credential/resource_test.go b/stackit/internal/services/objectstorage/credential/resource_test.go index 6d55d8f1f..b4ab3936b 100644 --- a/stackit/internal/services/objectstorage/credential/resource_test.go +++ b/stackit/internal/services/objectstorage/credential/resource_test.go @@ -446,7 +446,7 @@ func TestReadCredentials(t *testing.T) { CredentialId: tt.expectedModel.CredentialId, RotateWhenChanged: types.MapNull(types.StringType), } - found, err := readCredentials(context.Background(), model, "eu01", client) + found, err := readCredentials(context.Background(), model, "eu01", client.DefaultAPI) if !tt.isValid && err == nil { t.Fatalf("Should have failed") } diff --git a/stackit/internal/services/objectstorage/credentialsgroup/datasource.go b/stackit/internal/services/objectstorage/credentialsgroup/datasource.go index 18c952544..e0c61d714 100644 --- a/stackit/internal/services/objectstorage/credentialsgroup/datasource.go +++ b/stackit/internal/services/objectstorage/credentialsgroup/datasource.go @@ -4,9 +4,6 @@ import ( "context" "fmt" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - objectstorageUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/objectstorage/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types" @@ -31,7 +28,7 @@ func NewCredentialsGroupDataSource() datasource.DataSource { // credentialsGroupDataSource is the data source implementation. type credentialsGroupDataSource struct { - client *objectstorage.APIClient + client objectstorage.DefaultAPI providerData core.ProviderData } @@ -42,17 +39,14 @@ func (r *credentialsGroupDataSource) Metadata(_ context.Context, req datasource. // Configure adds the provider configured client to the data source. func (r *credentialsGroupDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := objectstorageUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ObjectStorageV2Client + tflog.Info(ctx, "ObjectStorage credentials group client configured") } @@ -123,7 +117,7 @@ func (r *credentialsGroupDataSource) Read(ctx context.Context, req datasource.Re ctx = tflog.SetField(ctx, "credentials_group_id", credentialsGroupId) ctx = tflog.SetField(ctx, "region", region) - found, err := readCredentialsGroups(ctx, &model, region, r.client.DefaultAPI) + found, err := readCredentialsGroups(ctx, &model, region, r.client) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading credentials group", fmt.Sprintf("getting credential group from list of credentials groups: %v", err)) return diff --git a/stackit/internal/services/objectstorage/credentialsgroup/resource.go b/stackit/internal/services/objectstorage/credentialsgroup/resource.go index 3a46711af..802eb9d95 100644 --- a/stackit/internal/services/objectstorage/credentialsgroup/resource.go +++ b/stackit/internal/services/objectstorage/credentialsgroup/resource.go @@ -7,9 +7,6 @@ import ( "net/http" "strings" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - objectstorageUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/objectstorage/utils" - "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -50,7 +47,7 @@ func NewCredentialsGroupResource() resource.Resource { // credentialsGroupResource is the resource implementation. type credentialsGroupResource struct { - client *objectstorage.APIClient + client objectstorage.DefaultAPI providerData core.ProviderData } @@ -91,17 +88,14 @@ func (r *credentialsGroupResource) Metadata(_ context.Context, req resource.Meta // Configure adds the provider configured client to the resource. func (r *credentialsGroupResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := objectstorageUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ObjectStorageV2Client + tflog.Info(ctx, "ObjectStorage credentials group client configured") } @@ -192,14 +186,14 @@ func (r *credentialsGroupResource) Create(ctx context.Context, req resource.Crea } // Handle project init - err := enableProject(ctx, &model, region, r.client.DefaultAPI) + err := enableProject(ctx, &model, region, r.client) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating credentials group", fmt.Sprintf("Enabling object storage project before creation: %v", err)) return } // Create new credentials group - got, err := r.client.DefaultAPI.CreateCredentialsGroup(ctx, projectId, region).CreateCredentialsGroupPayload(createCredentialsGroupPayload).Execute() + got, err := r.client.CreateCredentialsGroup(ctx, projectId, region).CreateCredentialsGroupPayload(createCredentialsGroupPayload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating credentials group", fmt.Sprintf("Calling API: %v", err)) return @@ -260,7 +254,7 @@ func (r *credentialsGroupResource) Read(ctx context.Context, req resource.ReadRe ctx = tflog.SetField(ctx, "credentials_group_id", credentialsGroupId) ctx = tflog.SetField(ctx, "region", region) - found, err := readCredentialsGroups(ctx, &model, region, r.client.DefaultAPI) + found, err := readCredentialsGroups(ctx, &model, region, r.client) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading credentialsGroup", fmt.Sprintf("getting credential group from list of credentials groups: %v", err)) return @@ -310,7 +304,7 @@ func (r *credentialsGroupResource) Delete(ctx context.Context, req resource.Dele ctx = tflog.SetField(ctx, "region", region) // Delete existing credentials group - _, err := r.client.DefaultAPI.DeleteCredentialsGroup(ctx, projectId, region, credentialsGroupId).Execute() + _, err := r.client.DeleteCredentialsGroup(ctx, projectId, region, credentialsGroupId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/objectstorage/default-retention/datasource.go b/stackit/internal/services/objectstorage/default-retention/datasource.go index 395c67b6e..e56d7fcb2 100644 --- a/stackit/internal/services/objectstorage/default-retention/datasource.go +++ b/stackit/internal/services/objectstorage/default-retention/datasource.go @@ -13,9 +13,8 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - objectstorageUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/objectstorage/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -28,22 +27,19 @@ func NewDefaultRetentionDataSource() datasource.DataSource { } type defaultRetentionDataSource struct { - client *objectstorage.APIClient + client objectstorage.DefaultAPI providerData core.ProviderData } func (r *defaultRetentionDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := objectstorageUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ObjectStorageV2Client + tflog.Info(ctx, "Bucket Default Retention configured") } @@ -110,7 +106,7 @@ func (d *defaultRetentionDataSource) Read(ctx context.Context, req datasource.Re ctx = tflog.SetField(ctx, "region", region) // Read default-retention - result, err := d.client.DefaultAPI.GetDefaultRetention(ctx, projectId, region, bucketName).Execute() + result, err := d.client.GetDefaultRetention(ctx, projectId, region, bucketName).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/objectstorage/default-retention/resource.go b/stackit/internal/services/objectstorage/default-retention/resource.go index abdd0afb0..7e2b43d39 100644 --- a/stackit/internal/services/objectstorage/default-retention/resource.go +++ b/stackit/internal/services/objectstorage/default-retention/resource.go @@ -19,9 +19,8 @@ import ( sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - objectstorageUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/objectstorage/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -49,7 +48,7 @@ func NewDefaultRetentionResource() resource.Resource { // defaultRetentionResource is the resource implementation. type defaultRetentionResource struct { - client *objectstorage.APIClient + client objectstorage.DefaultAPI providerData core.ProviderData } @@ -110,17 +109,14 @@ func (r *defaultRetentionResource) ImportState(ctx context.Context, req resource } func (r *defaultRetentionResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := objectstorageUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ObjectStorageV2Client + tflog.Info(ctx, "ObjectStorage bucket client configured") } @@ -203,7 +199,7 @@ func (r *defaultRetentionResource) Create(ctx context.Context, req resource.Crea ctx = tflog.SetField(ctx, "region", region) // Create default-retention - apiRequest, err := toSetDefaultRetentionRequest(ctx, r.client.DefaultAPI, &model, projectId, bucketName, region) + apiRequest, err := toSetDefaultRetentionRequest(ctx, r.client, &model, projectId, bucketName, region) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error setting default-retention", fmt.Sprintf("Parsing model: %v", err)) } @@ -248,7 +244,7 @@ func (r *defaultRetentionResource) Delete(ctx context.Context, req resource.Dele ctx = tflog.SetField(ctx, "region", region) // Delete default-retention - _, err := r.client.DefaultAPI.DeleteDefaultRetention(ctx, projectId, region, bucketName).Execute() + _, err := r.client.DeleteDefaultRetention(ctx, projectId, region, bucketName).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok { if oapiErr.StatusCode == http.StatusNotFound { @@ -287,7 +283,7 @@ func (r *defaultRetentionResource) Read(ctx context.Context, req resource.ReadRe ctx = tflog.SetField(ctx, "region", region) // Read default-retention - result, err := r.client.DefaultAPI.GetDefaultRetention(ctx, projectId, region, bucketName).Execute() + result, err := r.client.GetDefaultRetention(ctx, projectId, region, bucketName).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -333,7 +329,7 @@ func (r *defaultRetentionResource) Update(ctx context.Context, req resource.Upda ctx = tflog.SetField(ctx, "region", region) // Update default-retention - apiRequest, err := toSetDefaultRetentionRequest(ctx, r.client.DefaultAPI, &model, projectId, bucketName, region) + apiRequest, err := toSetDefaultRetentionRequest(ctx, r.client, &model, projectId, bucketName, region) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error setting default-retention", fmt.Sprintf("Parsing model: %v", err)) } diff --git a/stackit/internal/services/objectstorage/utils/util.go b/stackit/internal/services/objectstorage/utils/util.go deleted file mode 100644 index b107ced32..000000000 --- a/stackit/internal/services/objectstorage/utils/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *objectstorage.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.ObjectStorageCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.ObjectStorageCustomEndpoint)) - } - apiClient, err := objectstorage.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/objectstorage/utils/util_test.go b/stackit/internal/services/objectstorage/utils/util_test.go deleted file mode 100644 index 669241adb..000000000 --- a/stackit/internal/services/objectstorage/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://objectstorage-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *objectstorage.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *objectstorage.APIClient { - apiClient, err := objectstorage.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - ObjectStorageCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *objectstorage.APIClient { - apiClient, err := objectstorage.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/observability/alertgroup/datasource.go b/stackit/internal/services/observability/alertgroup/datasource.go index 195d70ab1..9e0f68e84 100644 --- a/stackit/internal/services/observability/alertgroup/datasource.go +++ b/stackit/internal/services/observability/alertgroup/datasource.go @@ -6,9 +6,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - observabilityUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/observability/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" @@ -34,31 +31,28 @@ func NewAlertGroupDataSource() datasource.DataSource { // alertGroupDataSource is the datasource implementation. type alertGroupDataSource struct { - client *observabilitySdk.APIClient + client observabilitySdk.DefaultAPI } // Configure adds the provider configured client to the resource. -func (a *alertGroupDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) +func (d *alertGroupDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := observabilityUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - a.client = apiClient + d.client = clients.ObservabilityV1Client + tflog.Info(ctx, "Observability alert group client configured") } // Metadata provides metadata for the alert group datasource. -func (a *alertGroupDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { +func (d *alertGroupDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { resp.TypeName = req.ProviderTypeName + "_observability_alertgroup" } // Schema defines the schema for the alert group data source. -func (a *alertGroupDataSource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) { +func (d *alertGroupDataSource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) { resp.Schema = schema.Schema{ Description: "Observability alert group datasource schema. Used to create alerts based on metrics (Thanos). Must have a `region` specified in the provider configuration.", Attributes: map[string]schema.Attribute{ @@ -135,7 +129,7 @@ func (a *alertGroupDataSource) Schema(_ context.Context, _ datasource.SchemaRequ } } -func (a *alertGroupDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { // nolint:gocritic // function signature required by Terraform +func (d *alertGroupDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { // nolint:gocritic // function signature required by Terraform var model Model diags := req.Config.Get(ctx, &model) resp.Diagnostics.Append(diags...) @@ -152,7 +146,7 @@ func (a *alertGroupDataSource) Read(ctx context.Context, req datasource.ReadRequ ctx = tflog.SetField(ctx, "alert_group_name", alertGroupName) ctx = tflog.SetField(ctx, "instance_id", instanceId) - readAlertGroupResp, err := a.client.DefaultAPI.GetAlertgroup(ctx, alertGroupName, instanceId, projectId).Execute() + readAlertGroupResp, err := d.client.GetAlertgroup(ctx, alertGroupName, instanceId, projectId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) diff --git a/stackit/internal/services/observability/alertgroup/resource.go b/stackit/internal/services/observability/alertgroup/resource.go index db2fe31fd..a7bb37cc6 100644 --- a/stackit/internal/services/observability/alertgroup/resource.go +++ b/stackit/internal/services/observability/alertgroup/resource.go @@ -8,8 +8,6 @@ import ( "regexp" "strings" - observabilityUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/observability/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/mapvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/attr" @@ -87,30 +85,27 @@ func NewAlertGroupResource() resource.Resource { // alertGroupResource is the resource implementation. type alertGroupResource struct { - client *observabilitySdk.APIClient + client observabilitySdk.DefaultAPI } // Metadata returns the resource type name. -func (a *alertGroupResource) Metadata(_ context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) { +func (r *alertGroupResource) Metadata(_ context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) { resp.TypeName = req.ProviderTypeName + "_observability_alertgroup" } // Configure adds the provider configured client to the resource. -func (a *alertGroupResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) +func (r *alertGroupResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := observabilityUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - a.client = apiClient + r.client = clients.ObservabilityV1Client + tflog.Info(ctx, "Observability alert group client configured") } -func (a *alertGroupResource) ValidateConfig(ctx context.Context, req resource.ValidateConfigRequest, resp *resource.ValidateConfigResponse) { +func (r *alertGroupResource) ValidateConfig(ctx context.Context, req resource.ValidateConfigRequest, resp *resource.ValidateConfigResponse) { var resourceModel Model resp.Diagnostics.Append(req.Config.Get(ctx, &resourceModel)...) if resp.Diagnostics.HasError() { @@ -149,7 +144,7 @@ func (a *alertGroupResource) ValidateConfig(ctx context.Context, req resource.Va } // Schema defines the schema for the resource. -func (a *alertGroupResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { +func (r *alertGroupResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { resp.Schema = schema.Schema{ Description: "Observability alert group resource schema. Used to create alerts based on metrics (Thanos). Must have a `region` specified in the provider configuration.", Attributes: map[string]schema.Attribute{ @@ -283,7 +278,7 @@ func (a *alertGroupResource) Schema(_ context.Context, _ resource.SchemaRequest, } // Create creates the resource and sets the initial Terraform state. -func (a *alertGroupResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { // nolint:gocritic // function signature required by Terraform +func (r *alertGroupResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { // nolint:gocritic // function signature required by Terraform // Retrieve values from plan var model Model diags := req.Plan.Get(ctx, &model) @@ -307,7 +302,7 @@ func (a *alertGroupResource) Create(ctx context.Context, req resource.CreateRequ return } - createAlertGroupResp, err := a.client.DefaultAPI.CreateAlertgroups(ctx, instanceId, projectId).CreateAlertgroupsPayload(*payload).Execute() + createAlertGroupResp, err := r.client.CreateAlertgroups(ctx, instanceId, projectId).CreateAlertgroupsPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating alertgroup", fmt.Sprintf("Creating API payload: %v", err)) return @@ -348,7 +343,7 @@ func (a *alertGroupResource) Create(ctx context.Context, req resource.CreateRequ } // Read refreshes the Terraform state with the latest data. -func (a *alertGroupResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { // nolint:gocritic // function signature required by Terraform +func (r *alertGroupResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { // nolint:gocritic // function signature required by Terraform var model Model diags := req.State.Get(ctx, &model) resp.Diagnostics.Append(diags...) @@ -365,7 +360,7 @@ func (a *alertGroupResource) Read(ctx context.Context, req resource.ReadRequest, ctx = tflog.SetField(ctx, "alert_group_name", alertGroupName) ctx = tflog.SetField(ctx, "instance_id", instanceId) - readAlertGroupResp, err := a.client.DefaultAPI.GetAlertgroup(ctx, alertGroupName, instanceId, projectId).Execute() + readAlertGroupResp, err := r.client.GetAlertgroup(ctx, alertGroupName, instanceId, projectId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -393,12 +388,12 @@ func (a *alertGroupResource) Read(ctx context.Context, req resource.ReadRequest, // The Update function is redundant since any modifications will // automatically trigger a resource recreation through Terraform's built-in // lifecycle management. -func (a *alertGroupResource) Update(ctx context.Context, _ resource.UpdateRequest, resp *resource.UpdateResponse) { // nolint:gocritic // function signature required by Terraform +func (r *alertGroupResource) Update(ctx context.Context, _ resource.UpdateRequest, resp *resource.UpdateResponse) { // nolint:gocritic // function signature required by Terraform core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating alert group", "Observability alert groups can't be updated") } // Delete deletes the resource and removes the Terraform state on success. -func (a *alertGroupResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { // nolint:gocritic // function signature required by Terraform +func (r *alertGroupResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { // nolint:gocritic // function signature required by Terraform // Retrieve values from state var model Model diags := req.State.Get(ctx, &model) @@ -416,7 +411,7 @@ func (a *alertGroupResource) Delete(ctx context.Context, req resource.DeleteRequ ctx = tflog.SetField(ctx, "alert_group_name", alertGroupName) ctx = tflog.SetField(ctx, "instance_id", instanceId) - _, err := a.client.DefaultAPI.DeleteAlertgroup(ctx, alertGroupName, instanceId, projectId).Execute() + _, err := r.client.DeleteAlertgroup(ctx, alertGroupName, instanceId, projectId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -434,7 +429,7 @@ func (a *alertGroupResource) Delete(ctx context.Context, req resource.DeleteRequ // ImportState imports a resource into the Terraform state on success. // The expected format of the resource import identifier is: project_id,instance_id,name -func (a *alertGroupResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { +func (r *alertGroupResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { idParts := strings.Split(req.ID, core.Separator) if len(idParts) != 3 || idParts[0] == "" || idParts[1] == "" || idParts[2] == "" { diff --git a/stackit/internal/services/observability/credential/resource.go b/stackit/internal/services/observability/credential/resource.go index 4215f6e21..c393f956a 100644 --- a/stackit/internal/services/observability/credential/resource.go +++ b/stackit/internal/services/observability/credential/resource.go @@ -8,9 +8,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema/mapplanmodifier" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - observabilityUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/observability/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" @@ -55,7 +52,7 @@ func NewCredentialResource() resource.Resource { // credentialResource is the resource implementation. type credentialResource struct { - client *observabilitySdk.APIClient + client observabilitySdk.DefaultAPI } // Metadata returns the resource type name. @@ -65,16 +62,13 @@ func (r *credentialResource) Metadata(_ context.Context, req resource.MetadataRe // Configure adds the provider configured client to the resource. func (r *credentialResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := observabilityUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.ObservabilityV1Client + tflog.Info(ctx, "Observability credential client configured") } @@ -165,7 +159,7 @@ func (r *credentialResource) Create(ctx context.Context, req resource.CreateRequ instanceId := model.InstanceId.ValueString() description := model.Description.ValueStringPointer() - got, err := r.client.DefaultAPI.CreateCredentials(ctx, instanceId, projectId).CreateCredentialsPayload( + got, err := r.client.CreateCredentials(ctx, instanceId, projectId).CreateCredentialsPayload( observabilitySdk.CreateCredentialsPayload{ Description: description, }, @@ -247,7 +241,7 @@ func (r *credentialResource) Read(ctx context.Context, req resource.ReadRequest, resp.State.RemoveResource(ctx) return } - _, err := r.client.DefaultAPI.GetCredentials(ctx, instanceId, projectId, userName).Execute() + _, err := r.client.GetCredentials(ctx, instanceId, projectId, userName).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -297,7 +291,7 @@ func (r *credentialResource) Delete(ctx context.Context, req resource.DeleteRequ projectId := model.ProjectId.ValueString() instanceId := model.InstanceId.ValueString() userName := model.Username.ValueString() - _, err := r.client.DefaultAPI.DeleteCredentials(ctx, instanceId, projectId, userName).Execute() + _, err := r.client.DeleteCredentials(ctx, instanceId, projectId, userName).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/observability/instance/datasource.go b/stackit/internal/services/observability/instance/datasource.go index 47e29c914..0b628470d 100644 --- a/stackit/internal/services/observability/instance/datasource.go +++ b/stackit/internal/services/observability/instance/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - observabilityUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/observability/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" @@ -33,7 +30,7 @@ func NewInstanceDataSource() datasource.DataSource { // instanceDataSource is the data source implementation. type instanceDataSource struct { - client *observabilitySdk.APIClient + client observabilitySdk.DefaultAPI } // Metadata returns the data source type name. @@ -42,16 +39,13 @@ func (d *instanceDataSource) Metadata(_ context.Context, req datasource.Metadata } func (d *instanceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := observabilityUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.client = clients.ObservabilityV1Client + tflog.Info(ctx, "Observability instance client configured") } @@ -406,7 +400,7 @@ func (d *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques projectId := model.ProjectId.ValueString() instanceId := model.InstanceId.ValueString() - instanceResp, err := d.client.DefaultAPI.GetInstance(ctx, instanceId, projectId).Execute() + instanceResp, err := d.client.GetInstance(ctx, instanceId, projectId).Execute() if err != nil { utils.LogError( ctx, @@ -430,7 +424,7 @@ func (d *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques return } - aclListResp, err := d.client.DefaultAPI.ListACL(ctx, instanceId, projectId).Execute() + aclListResp, err := d.client.ListACL(ctx, instanceId, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Calling API to list ACL data: %v", err)) return @@ -450,7 +444,7 @@ func (d *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques return } - plan, err := loadPlanId(ctx, *d.client, &model) + plan, err := loadPlanId(ctx, d.client, &model) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Loading service plan: %v", err)) return @@ -471,7 +465,7 @@ func (d *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques // There are some plans which does not offer storage e.g. like Observability-Metrics-Endpoint-100k-EU01 if plan.GetLogsStorage() != 0 && plan.GetTracesStorage() != 0 { - metricsRetentionResp, err := d.client.DefaultAPI.GetMetricsStorageRetention(ctx, instanceId, projectId).Execute() + metricsRetentionResp, err := d.client.GetMetricsStorageRetention(ctx, instanceId, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Calling API to get metrics retention: %v", err)) return @@ -490,7 +484,7 @@ func (d *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques } // Handle Logs Retentions - logsRetentionResp, err := d.client.DefaultAPI.GetLogsConfigs(ctx, instanceId, projectId).Execute() + logsRetentionResp, err := d.client.GetLogsConfigs(ctx, instanceId, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Calling API to get logs retention: %v", err)) return @@ -509,7 +503,7 @@ func (d *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques } // Handle Traces Retentions - tracesRetentionResp, err := d.client.DefaultAPI.GetTracesConfigs(ctx, instanceId, projectId).Execute() + tracesRetentionResp, err := d.client.GetTracesConfigs(ctx, instanceId, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Calling API to get traces retention: %v", err)) return @@ -530,7 +524,7 @@ func (d *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques // There are plans where no alert matchers and receivers are present e.g. like Observability-Metrics-Endpoint-100k-EU01 if plan.GetAlertMatchers() != 0 && plan.GetAlertReceivers() != 0 { - alertConfigResp, err := d.client.DefaultAPI.GetAlertConfigs(ctx, instanceId, projectId).Execute() + alertConfigResp, err := d.client.GetAlertConfigs(ctx, instanceId, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Calling API to get alert config: %v", err)) return diff --git a/stackit/internal/services/observability/instance/resource.go b/stackit/internal/services/observability/instance/resource.go index 95836f712..da92a3d90 100644 --- a/stackit/internal/services/observability/instance/resource.go +++ b/stackit/internal/services/observability/instance/resource.go @@ -14,8 +14,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils/planmodifiers/int32planmodifier" - observabilityUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/observability/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/setvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" @@ -385,7 +383,7 @@ func NewInstanceResource() resource.Resource { // instanceResource is the resource implementation. type instanceResource struct { - client *observabilitySdk.APIClient + client observabilitySdk.DefaultAPI } // Metadata returns the resource type name. @@ -395,16 +393,13 @@ func (r *instanceResource) Metadata(_ context.Context, req resource.MetadataRequ // Configure adds the provider configured client to the resource. func (r *instanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := observabilityUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.ObservabilityV1Client + tflog.Info(ctx, "Observability instance client configured") } @@ -932,7 +927,7 @@ func (r *instanceResource) ModifyPlan(ctx context.Context, req resource.ModifyPl return } - plan, err := loadPlanId(ctx, *r.client, &configModel) + plan, err := loadPlanId(ctx, r.client, &configModel) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error validating plan", fmt.Sprintf("Loading service plan: %v", err)) return @@ -1011,7 +1006,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques projectId := model.ProjectId.ValueString() ctx = tflog.SetField(ctx, "project_id", projectId) - plan, err := loadPlanId(ctx, *r.client, &model) + plan, err := loadPlanId(ctx, r.client, &model) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Loading service plan: %v", err)) return @@ -1022,7 +1017,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Creating API payload: %v", err)) return } - createResp, err := r.client.DefaultAPI.CreateInstance(ctx, projectId).CreateInstancePayload(*createPayload).Execute() + createResp, err := r.client.CreateInstance(ctx, projectId).CreateInstancePayload(*createPayload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -1040,7 +1035,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } - waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client.DefaultAPI, instanceId, projectId).WaitWithContext(ctx) + waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client, instanceId, projectId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -1066,7 +1061,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Creating ACL: %v", err)) return } - aclList, err := r.client.DefaultAPI.ListACL(ctx, instanceId, projectId).Execute() + aclList, err := r.client.ListACL(ctx, instanceId, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API to list ACL data: %v", err)) return @@ -1185,7 +1180,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "instance_id", instanceId) - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, instanceId, projectId).Execute() + instanceResp, err := r.client.GetInstance(ctx, instanceId, projectId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -1210,13 +1205,13 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r return } - plan, err := loadPlanId(ctx, *r.client, &model) + plan, err := loadPlanId(ctx, r.client, &model) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Loading service plan: %v", err)) return } - aclListResp, err := r.client.DefaultAPI.ListACL(ctx, instanceId, projectId).Execute() + aclListResp, err := r.client.ListACL(ctx, instanceId, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Calling API for ACL data: %v", err)) return @@ -1245,7 +1240,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r // There are some plans which does not offer to set or get the metrics retention e.g. like Observability-Metrics-Endpoint-100k-EU01 if plan.GetTotalMetricSamples() != 0 { - metricsRetentionResp, err := r.client.DefaultAPI.GetMetricsStorageRetention(ctx, instanceId, projectId).Execute() + metricsRetentionResp, err := r.client.GetMetricsStorageRetention(ctx, instanceId, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Calling API to get metrics retention: %v", err)) return @@ -1266,7 +1261,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r // There are some plans which does not offer storage e.g. like Observability-Metrics-Endpoint-100k-EU01 if plan.GetLogsStorage() != 0 && plan.GetTracesStorage() != 0 { - logsRetentionResp, err := r.client.DefaultAPI.GetLogsConfigs(ctx, instanceId, projectId).Execute() + logsRetentionResp, err := r.client.GetLogsConfigs(ctx, instanceId, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Calling API to get logs retention: %v", err)) return @@ -1284,7 +1279,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r return } - tracesRetentionResp, err := r.client.DefaultAPI.GetTracesConfigs(ctx, instanceId, projectId).Execute() + tracesRetentionResp, err := r.client.GetTracesConfigs(ctx, instanceId, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Calling API to get logs retention: %v", err)) return @@ -1305,7 +1300,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r // There are plans where no alert matchers and receivers are present e.g. like Observability-Metrics-Endpoint-100k-EU01 if plan.GetAlertMatchers() != 0 && plan.GetAlertReceivers() != 0 { - alertConfigResp, err := r.client.DefaultAPI.GetAlertConfigs(ctx, instanceId, projectId).Execute() + alertConfigResp, err := r.client.GetAlertConfigs(ctx, instanceId, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Calling API to get alert config: %v", err)) return @@ -1361,7 +1356,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques } } - plan, err := loadPlanId(ctx, *r.client, &model) + plan, err := loadPlanId(ctx, r.client, &model) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Loading service plan: %v", err)) return @@ -1388,7 +1383,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques // This check is required, because when values should be updated, that needs to be updated via a different endpoint, the waiter will run into a timeout if !cmp.Equal(previousStatePayload, payload) { // Update existing instance - _, err = r.client.DefaultAPI.UpdateInstance(ctx, instanceId, projectId).UpdateInstancePayload(*payload).Execute() + _, err = r.client.UpdateInstance(ctx, instanceId, projectId).UpdateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -1396,13 +1391,13 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques ctx = core.LogResponse(ctx) - instance, err = wait.UpdateInstanceWaitHandler(ctx, r.client.DefaultAPI, instanceId, projectId).WaitWithContext(ctx) + instance, err = wait.UpdateInstanceWaitHandler(ctx, r.client, instanceId, projectId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Instance update waiting: %v", err)) return } } else { - instance, err = r.client.DefaultAPI.GetInstance(ctx, instanceId, projectId).Execute() + instance, err = r.client.GetInstance(ctx, instanceId, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Instance read: %v", err)) return @@ -1426,7 +1421,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Updating ACL: %v", err)) return } - aclList, err := r.client.DefaultAPI.ListACL(ctx, instanceId, projectId).Execute() + aclList, err := r.client.ListACL(ctx, instanceId, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Calling API to list ACL data: %v", err)) return @@ -1538,7 +1533,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques instanceId := model.InstanceId.ValueString() // Delete existing instance - _, err := r.client.DefaultAPI.DeleteInstance(ctx, instanceId, projectId).Execute() + _, err := r.client.DeleteInstance(ctx, instanceId, projectId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -1551,7 +1546,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = core.LogResponse(ctx) - _, err = wait.DeleteInstanceWaitHandler(ctx, r.client.DefaultAPI, instanceId, projectId).WaitWithContext(ctx) + _, err = wait.DeleteInstanceWaitHandler(ctx, r.client, instanceId, projectId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting instance", fmt.Sprintf("Instance deletion waiting: %v", err)) return @@ -2246,12 +2241,12 @@ func toUpdateMetricsStorageRetentionPayload(retentionDaysRaw, retentionDays5m, r }, nil } -func updateACL(ctx context.Context, projectId, instanceId string, acl []string, client *observabilitySdk.APIClient) error { +func updateACL(ctx context.Context, projectId, instanceId string, acl []string, client observabilitySdk.DefaultAPI) error { payload := observabilitySdk.UpdateACLPayload{ Acl: acl, } - _, err := client.DefaultAPI.UpdateACL(ctx, instanceId, projectId).UpdateACLPayload(payload).Execute() + _, err := client.UpdateACL(ctx, instanceId, projectId).UpdateACLPayload(payload).Execute() if err != nil { return fmt.Errorf("updating ACL: %w", err) } @@ -2552,9 +2547,9 @@ func toGlobalConfigPayload(ctx context.Context, model *alertConfigModel) (*obser }, nil } -func loadPlanId(ctx context.Context, client observabilitySdk.APIClient, model *Model) (observabilitySdk.Plan, error) { +func loadPlanId(ctx context.Context, client observabilitySdk.DefaultAPI, model *Model) (observabilitySdk.Plan, error) { projectId := model.ProjectId.ValueString() - res, err := client.DefaultAPI.ListPlans(ctx, projectId).Execute() + res, err := client.ListPlans(ctx, projectId).Execute() if err != nil { return observabilitySdk.Plan{}, err } @@ -2597,13 +2592,13 @@ func (r *instanceResource) getAlertConfigs(ctx context.Context, alertConfig *ale } if alertConfigPayload != nil { - _, err = r.client.DefaultAPI.UpdateAlertConfigs(ctx, instanceId, projectId).UpdateAlertConfigsPayload(*alertConfigPayload).Execute() + _, err = r.client.UpdateAlertConfigs(ctx, instanceId, projectId).UpdateAlertConfigsPayload(*alertConfigPayload).Execute() if err != nil { return fmt.Errorf("setting alert config: %w", err) } } - alertConfigResp, err := r.client.DefaultAPI.GetAlertConfigs(ctx, instanceId, projectId).Execute() + alertConfigResp, err := r.client.GetAlertConfigs(ctx, instanceId, projectId).Execute() if err != nil { return fmt.Errorf("calling API to get alert config: %w", err) } @@ -2621,7 +2616,7 @@ func (r *instanceResource) getTracesRetention(ctx context.Context, model *Model) instanceId := model.InstanceId.ValueString() if tracesRetentionDays != nil { - tracesResp, err := r.client.DefaultAPI.GetTracesConfigs(ctx, instanceId, projectId).Execute() + tracesResp, err := r.client.GetTracesConfigs(ctx, instanceId, projectId).Execute() if err != nil { return fmt.Errorf("getting traces retention policy: %w", err) } @@ -2630,13 +2625,13 @@ func (r *instanceResource) getTracesRetention(ctx context.Context, model *Model) } retentionDays := fmt.Sprintf("%dh", *tracesRetentionDays*24) - _, err = r.client.DefaultAPI.UpdateTracesConfigs(ctx, instanceId, projectId).UpdateTracesConfigsPayload(observabilitySdk.UpdateTracesConfigsPayload{Retention: retentionDays}).Execute() + _, err = r.client.UpdateTracesConfigs(ctx, instanceId, projectId).UpdateTracesConfigsPayload(observabilitySdk.UpdateTracesConfigsPayload{Retention: retentionDays}).Execute() if err != nil { return fmt.Errorf("setting traces retention policy: %w", err) } } - tracesResp, err := r.client.DefaultAPI.GetTracesConfigs(ctx, instanceId, projectId).Execute() + tracesResp, err := r.client.GetTracesConfigs(ctx, instanceId, projectId).Execute() if err != nil { return fmt.Errorf("getting traces retention policy: %w", err) } @@ -2655,7 +2650,7 @@ func (r *instanceResource) getLogsRetention(ctx context.Context, model *Model) e instanceId := model.InstanceId.ValueString() if logsRetentionDays != nil { - logsResp, err := r.client.DefaultAPI.GetLogsConfigs(ctx, instanceId, projectId).Execute() + logsResp, err := r.client.GetLogsConfigs(ctx, instanceId, projectId).Execute() if err != nil { return fmt.Errorf("getting logs retention policy: %w", err) } @@ -2664,13 +2659,13 @@ func (r *instanceResource) getLogsRetention(ctx context.Context, model *Model) e } retentionDays := fmt.Sprintf("%dh", *logsRetentionDays*24) - _, err = r.client.DefaultAPI.UpdateLogsConfigs(ctx, instanceId, projectId).UpdateLogsConfigsPayload(observabilitySdk.UpdateLogsConfigsPayload{Retention: retentionDays}).Execute() + _, err = r.client.UpdateLogsConfigs(ctx, instanceId, projectId).UpdateLogsConfigsPayload(observabilitySdk.UpdateLogsConfigsPayload{Retention: retentionDays}).Execute() if err != nil { return fmt.Errorf("setting logs retention policy: %w", err) } } - logsResp, err := r.client.DefaultAPI.GetLogsConfigs(ctx, instanceId, projectId).Execute() + logsResp, err := r.client.GetLogsConfigs(ctx, instanceId, projectId).Execute() if err != nil { return fmt.Errorf("getting logs retention policy: %w", err) } @@ -2693,7 +2688,7 @@ func (r *instanceResource) getMetricsRetention(ctx context.Context, model *Model // If any of the metrics retention days are set, set the metrics retention policy if metricsRetentionDays != nil || metricsRetentionDays5mDownsampling != nil || metricsRetentionDays1hDownsampling != nil { // Need to get the metrics retention policy because update endpoint is a PUT and we need to send all fields - metricsResp, err := r.client.DefaultAPI.GetMetricsStorageRetention(ctx, instanceId, projectId).Execute() + metricsResp, err := r.client.GetMetricsStorageRetention(ctx, instanceId, projectId).Execute() if err != nil { return fmt.Errorf("getting metrics retention policy: %w", err) } @@ -2702,14 +2697,14 @@ func (r *instanceResource) getMetricsRetention(ctx context.Context, model *Model if err != nil { return fmt.Errorf("building metrics retention policy payload: %w", err) } - _, err = r.client.DefaultAPI.UpdateMetricsStorageRetention(ctx, instanceId, projectId).UpdateMetricsStorageRetentionPayload(*metricsRetentionPayload).Execute() + _, err = r.client.UpdateMetricsStorageRetention(ctx, instanceId, projectId).UpdateMetricsStorageRetentionPayload(*metricsRetentionPayload).Execute() if err != nil { return fmt.Errorf("setting metrics retention policy: %w", err) } } // Get metrics retention policy after update - metricsResp, err := r.client.DefaultAPI.GetMetricsStorageRetention(ctx, instanceId, projectId).Execute() + metricsResp, err := r.client.GetMetricsStorageRetention(ctx, instanceId, projectId).Execute() if err != nil { return fmt.Errorf("getting metrics retention policy: %w", err) } diff --git a/stackit/internal/services/observability/log-alertgroup/datasource.go b/stackit/internal/services/observability/log-alertgroup/datasource.go index 27a1b6c4f..9e84cc5a8 100644 --- a/stackit/internal/services/observability/log-alertgroup/datasource.go +++ b/stackit/internal/services/observability/log-alertgroup/datasource.go @@ -6,9 +6,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - observabilityUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/observability/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" @@ -34,31 +31,28 @@ func NewLogAlertGroupDataSource() datasource.DataSource { // alertGroupDataSource is the datasource implementation. type logAlertGroupDataSource struct { - client *observabilitySdk.APIClient + client observabilitySdk.DefaultAPI } // Configure adds the provider configured client to the resource. -func (l *logAlertGroupDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) +func (d *logAlertGroupDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := observabilityUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - l.client = apiClient + d.client = clients.ObservabilityV1Client + tflog.Info(ctx, "Observability log alert group client configured") } // Metadata provides metadata for the log alert group datasource. -func (l *logAlertGroupDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { +func (d *logAlertGroupDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { resp.TypeName = req.ProviderTypeName + "_observability_logalertgroup" } // Schema defines the schema for the log alert group data source. -func (l *logAlertGroupDataSource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) { +func (d *logAlertGroupDataSource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) { resp.Schema = schema.Schema{ Description: "Observability log alert group datasource schema. Used to create alerts based on logs (Loki). Must have a `region` specified in the provider configuration.", Attributes: map[string]schema.Attribute{ @@ -131,7 +125,7 @@ func (l *logAlertGroupDataSource) Schema(_ context.Context, _ datasource.SchemaR } } -func (l *logAlertGroupDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { // nolint:gocritic // function signature required by Terraform +func (d *logAlertGroupDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { // nolint:gocritic // function signature required by Terraform var model Model diags := req.Config.Get(ctx, &model) resp.Diagnostics.Append(diags...) @@ -148,7 +142,7 @@ func (l *logAlertGroupDataSource) Read(ctx context.Context, req datasource.ReadR ctx = tflog.SetField(ctx, "log_alert_group_name", alertGroupName) ctx = tflog.SetField(ctx, "instance_id", instanceId) - readAlertGroupResp, err := l.client.DefaultAPI.GetLogsAlertgroup(ctx, alertGroupName, instanceId, projectId).Execute() + readAlertGroupResp, err := d.client.GetLogsAlertgroup(ctx, alertGroupName, instanceId, projectId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) diff --git a/stackit/internal/services/observability/log-alertgroup/resource.go b/stackit/internal/services/observability/log-alertgroup/resource.go index 6cb917d99..3ce26a0fb 100644 --- a/stackit/internal/services/observability/log-alertgroup/resource.go +++ b/stackit/internal/services/observability/log-alertgroup/resource.go @@ -8,8 +8,6 @@ import ( "regexp" "strings" - observabilityUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/observability/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/mapvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/attr" @@ -84,31 +82,28 @@ func NewLogAlertGroupResource() resource.Resource { // alertGroupResource is the resource implementation. type logAlertGroupResource struct { - client *observabilitySdk.APIClient + client observabilitySdk.DefaultAPI } // Metadata returns the resource type name. -func (l *logAlertGroupResource) Metadata(_ context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) { +func (r *logAlertGroupResource) Metadata(_ context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) { resp.TypeName = req.ProviderTypeName + "_observability_logalertgroup" } // Configure adds the provider configured client to the resource. -func (l *logAlertGroupResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) +func (r *logAlertGroupResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := observabilityUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - l.client = apiClient + r.client = clients.ObservabilityV1Client + tflog.Info(ctx, "Observability log alert group client configured") } // Schema defines the schema for the resource. -func (l *logAlertGroupResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { +func (r *logAlertGroupResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { resp.Schema = schema.Schema{ Description: "Observability log alert group resource schema. Used to create alerts based on logs (Loki). Must have a `region` specified in the provider configuration.", Attributes: map[string]schema.Attribute{ @@ -230,7 +225,7 @@ func (l *logAlertGroupResource) Schema(_ context.Context, _ resource.SchemaReque } // Create creates the resource and sets the initial Terraform state. -func (l *logAlertGroupResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { // nolint:gocritic // function signature required by Terraform +func (r *logAlertGroupResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { // nolint:gocritic // function signature required by Terraform // Retrieve values from plan var model Model diags := req.Plan.Get(ctx, &model) @@ -254,7 +249,7 @@ func (l *logAlertGroupResource) Create(ctx context.Context, req resource.CreateR return } - createAlertGroupResp, err := l.client.DefaultAPI.CreateLogsAlertgroups(ctx, instanceId, projectId).CreateLogsAlertgroupsPayload(*payload).Execute() + createAlertGroupResp, err := r.client.CreateLogsAlertgroups(ctx, instanceId, projectId).CreateLogsAlertgroupsPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating alertgroup", fmt.Sprintf("Creating API payload: %v", err)) return @@ -295,7 +290,7 @@ func (l *logAlertGroupResource) Create(ctx context.Context, req resource.CreateR } // Read refreshes the Terraform state with the latest data. -func (l *logAlertGroupResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { // nolint:gocritic // function signature required by Terraform +func (r *logAlertGroupResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { // nolint:gocritic // function signature required by Terraform var model Model diags := req.State.Get(ctx, &model) resp.Diagnostics.Append(diags...) @@ -312,7 +307,7 @@ func (l *logAlertGroupResource) Read(ctx context.Context, req resource.ReadReque ctx = tflog.SetField(ctx, "log_alert_group_name", alertGroupName) ctx = tflog.SetField(ctx, "instance_id", instanceId) - readAlertGroupResp, err := l.client.DefaultAPI.GetLogsAlertgroup(ctx, alertGroupName, instanceId, projectId).Execute() + readAlertGroupResp, err := r.client.GetLogsAlertgroup(ctx, alertGroupName, instanceId, projectId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -340,12 +335,12 @@ func (l *logAlertGroupResource) Read(ctx context.Context, req resource.ReadReque // The Update function is redundant since any modifications will // automatically trigger a resource recreation through Terraform's built-in // lifecycle management. -func (l *logAlertGroupResource) Update(ctx context.Context, _ resource.UpdateRequest, resp *resource.UpdateResponse) { // nolint:gocritic // function signature required by Terraform +func (r *logAlertGroupResource) Update(ctx context.Context, _ resource.UpdateRequest, resp *resource.UpdateResponse) { // nolint:gocritic // function signature required by Terraform core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating log alert group", "Observability log alert groups can't be updated") } // Delete deletes the resource and removes the Terraform state on success. -func (l *logAlertGroupResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { // nolint:gocritic // function signature required by Terraform +func (r *logAlertGroupResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { // nolint:gocritic // function signature required by Terraform // Retrieve values from state var model Model diags := req.State.Get(ctx, &model) @@ -363,7 +358,7 @@ func (l *logAlertGroupResource) Delete(ctx context.Context, req resource.DeleteR ctx = tflog.SetField(ctx, "log_alert_group_name", alertGroupName) ctx = tflog.SetField(ctx, "instance_id", instanceId) - _, err := l.client.DefaultAPI.DeleteLogsAlertgroup(ctx, alertGroupName, instanceId, projectId).Execute() + _, err := r.client.DeleteLogsAlertgroup(ctx, alertGroupName, instanceId, projectId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -381,7 +376,7 @@ func (l *logAlertGroupResource) Delete(ctx context.Context, req resource.DeleteR // ImportState imports a resource into the Terraform state on success. // The expected format of the resource import identifier is: project_id,instance_id,name -func (l *logAlertGroupResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { +func (r *logAlertGroupResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { idParts := strings.Split(req.ID, core.Separator) if len(idParts) != 3 || idParts[0] == "" || idParts[1] == "" || idParts[2] == "" { diff --git a/stackit/internal/services/observability/scrapeconfig/datasource.go b/stackit/internal/services/observability/scrapeconfig/datasource.go index 7fe1e7b09..31c908e91 100644 --- a/stackit/internal/services/observability/scrapeconfig/datasource.go +++ b/stackit/internal/services/observability/scrapeconfig/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - observabilityUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/observability/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/int32validator" "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/mapvalidator" @@ -36,7 +33,7 @@ func NewScrapeConfigDataSource() datasource.DataSource { // scrapeConfigDataSource is the data source implementation. type scrapeConfigDataSource struct { - client *observabilitySdk.APIClient + client observabilitySdk.DefaultAPI } // Metadata returns the data source type name. @@ -45,16 +42,12 @@ func (d *scrapeConfigDataSource) Metadata(_ context.Context, req datasource.Meta } func (d *scrapeConfigDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := observabilityUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.client = clients.ObservabilityV1Client } // Schema defines the schema for the data source. @@ -198,7 +191,7 @@ func (d *scrapeConfigDataSource) Read(ctx context.Context, req datasource.ReadRe instanceId := model.InstanceId.ValueString() scName := model.Name.ValueString() - scResp, err := d.client.DefaultAPI.GetScrapeConfig(ctx, instanceId, scName, projectId).Execute() + scResp, err := d.client.GetScrapeConfig(ctx, instanceId, scName, projectId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/observability/scrapeconfig/resource.go b/stackit/internal/services/observability/scrapeconfig/resource.go index 937a7b5c0..a213f4852 100644 --- a/stackit/internal/services/observability/scrapeconfig/resource.go +++ b/stackit/internal/services/observability/scrapeconfig/resource.go @@ -10,8 +10,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - observabilityUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/observability/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/int32validator" "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/mapvalidator" @@ -109,7 +107,7 @@ func NewScrapeConfigResource() resource.Resource { // scrapeConfigResource is the resource implementation. type scrapeConfigResource struct { - client *observabilitySdk.APIClient + client observabilitySdk.DefaultAPI } // Metadata returns the resource type name. @@ -119,16 +117,13 @@ func (r *scrapeConfigResource) Metadata(_ context.Context, req resource.Metadata // Configure adds the provider configured client to the resource. func (r *scrapeConfigResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := observabilityUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.ObservabilityV1Client + tflog.Info(ctx, "Observability scrape config client configured") } @@ -344,7 +339,7 @@ func (r *scrapeConfigResource) Create(ctx context.Context, req resource.CreateRe core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating scrape config", fmt.Sprintf("Creating API payload: %v", err)) return } - _, err = r.client.DefaultAPI.CreateScrapeConfig(ctx, instanceId, projectId).CreateScrapeConfigPayload(*payload).Execute() + _, err = r.client.CreateScrapeConfig(ctx, instanceId, projectId).CreateScrapeConfigPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating scrape config", fmt.Sprintf("Calling API: %v", err)) return @@ -362,13 +357,13 @@ func (r *scrapeConfigResource) Create(ctx context.Context, req resource.CreateRe return } - _, err = wait.CreateScrapeConfigWaitHandler(ctx, r.client.DefaultAPI, instanceId, scName, projectId).WaitWithContext(ctx) + _, err = wait.CreateScrapeConfigWaitHandler(ctx, r.client, instanceId, scName, projectId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating scrape config", fmt.Sprintf("Scrape config creation waiting: %v", err)) return } - got, err := r.client.DefaultAPI.GetScrapeConfig(ctx, instanceId, scName, projectId).Execute() + got, err := r.client.GetScrapeConfig(ctx, instanceId, scName, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating scrape config", fmt.Sprintf("Calling API for updated data: %v", err)) return @@ -403,7 +398,7 @@ func (r *scrapeConfigResource) Read(ctx context.Context, req resource.ReadReques instanceId := model.InstanceId.ValueString() scName := model.Name.ValueString() - scResp, err := r.client.DefaultAPI.GetScrapeConfig(ctx, instanceId, scName, projectId).Execute() + scResp, err := r.client.GetScrapeConfig(ctx, instanceId, scName, projectId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -480,7 +475,7 @@ func (r *scrapeConfigResource) Update(ctx context.Context, req resource.UpdateRe core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating scrape config", fmt.Sprintf("Creating API payload: %v", err)) return } - _, err = r.client.DefaultAPI.UpdateScrapeConfig(ctx, instanceId, scName, projectId).UpdateScrapeConfigPayload(*payload).Execute() + _, err = r.client.UpdateScrapeConfig(ctx, instanceId, scName, projectId).UpdateScrapeConfigPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating scrape config", fmt.Sprintf("Calling API: %v", err)) return @@ -492,7 +487,7 @@ func (r *scrapeConfigResource) Update(ctx context.Context, req resource.UpdateRe time.Sleep(15 * time.Second) // Fetch updated ScrapeConfig - scResp, err := r.client.DefaultAPI.GetScrapeConfig(ctx, instanceId, scName, projectId).Execute() + scResp, err := r.client.GetScrapeConfig(ctx, instanceId, scName, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating scrape config", fmt.Sprintf("Calling API for updated data: %v", err)) return @@ -527,7 +522,7 @@ func (r *scrapeConfigResource) Delete(ctx context.Context, req resource.DeleteRe scName := model.Name.ValueString() // Delete existing ScrapeConfig - _, err := r.client.DefaultAPI.DeleteScrapeConfig(ctx, instanceId, scName, projectId).Execute() + _, err := r.client.DeleteScrapeConfig(ctx, instanceId, scName, projectId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -540,7 +535,7 @@ func (r *scrapeConfigResource) Delete(ctx context.Context, req resource.DeleteRe ctx = core.LogResponse(ctx) - _, err = wait.DeleteScrapeConfigWaitHandler(ctx, r.client.DefaultAPI, instanceId, scName, projectId).WaitWithContext(ctx) + _, err = wait.DeleteScrapeConfigWaitHandler(ctx, r.client, instanceId, scName, projectId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting scrape config", fmt.Sprintf("Scrape config deletion waiting: %v", err)) return diff --git a/stackit/internal/services/observability/utils/util.go b/stackit/internal/services/observability/utils/util.go deleted file mode 100644 index 4783be6bb..000000000 --- a/stackit/internal/services/observability/utils/util.go +++ /dev/null @@ -1,32 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - observabilitySdk "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *observabilitySdk.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.ObservabilityCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.ObservabilityCustomEndpoint)) - } else { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithRegion(providerData.GetRegion())) - } - apiClient, err := observabilitySdk.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/observability/utils/util_test.go b/stackit/internal/services/observability/utils/util_test.go deleted file mode 100644 index bf2cfd1ba..000000000 --- a/stackit/internal/services/observability/utils/util_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - observabilitySdk "github.com/stackitcloud/stackit-sdk-go/services/observability/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://observability-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *observabilitySdk.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *observabilitySdk.APIClient { - apiClient, err := observabilitySdk.NewAPIClient( - config.WithRegion("eu01"), - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - ObservabilityCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *observabilitySdk.APIClient { - apiClient, err := observabilitySdk.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/opensearch/credential/datasource.go b/stackit/internal/services/opensearch/credential/datasource.go index c64b4f405..7becc43c6 100644 --- a/stackit/internal/services/opensearch/credential/datasource.go +++ b/stackit/internal/services/opensearch/credential/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - opensearchUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/opensearch/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -48,7 +45,7 @@ func NewCredentialDataSource() datasource.DataSource { // credentialDataSource is the data source implementation. type credentialDataSource struct { - client *opensearch.APIClient + client opensearch.DefaultAPI providerData core.ProviderData } @@ -59,17 +56,14 @@ func (d *credentialDataSource) Metadata(_ context.Context, req datasource.Metada // Configure adds the provider configured client to the data source. func (d *credentialDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := opensearchUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.OpensearchV2Client + tflog.Info(ctx, "OpenSearch credential client configured") } @@ -169,7 +163,7 @@ func (d *credentialDataSource) Read(ctx context.Context, req datasource.ReadRequ ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "credential_id", credentialId) - recordSetResp, err := d.client.DefaultAPI.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + recordSetResp, err := d.client.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/opensearch/credential/resource.go b/stackit/internal/services/opensearch/credential/resource.go index 3a2e87b7e..d734ef2ca 100644 --- a/stackit/internal/services/opensearch/credential/resource.go +++ b/stackit/internal/services/opensearch/credential/resource.go @@ -9,9 +9,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema/mapplanmodifier" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - opensearchUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/opensearch/utils" - "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -64,7 +61,7 @@ func NewCredentialResource() resource.Resource { // credentialResource is the resource implementation. type credentialResource struct { - client *opensearch.APIClient + client opensearch.DefaultAPI providerData core.ProviderData } @@ -75,17 +72,14 @@ func (r *credentialResource) Metadata(_ context.Context, req resource.MetadataRe // Configure adds the provider configured client to the resource. func (r *credentialResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := opensearchUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.OpensearchV2Client + tflog.Info(ctx, "OpenSearch credential client configured") } @@ -243,7 +237,7 @@ func (r *credentialResource) Create(ctx context.Context, req resource.CreateRequ ctx = tflog.SetField(ctx, "instance_id", instanceId) // Create new recordset - credentialsResp, err := r.client.DefaultAPI.CreateCredentials(ctx, projectId, region, instanceId).Execute() + credentialsResp, err := r.client.CreateCredentials(ctx, projectId, region, instanceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating credential", fmt.Sprintf("Calling API: %v", err)) return @@ -259,7 +253,7 @@ func (r *credentialResource) Create(ctx context.Context, req resource.CreateRequ "credential_id": credentialId, }) - waitResp, err := wait.CreateCredentialsWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, credentialId).WaitWithContext(ctx) + waitResp, err := wait.CreateCredentialsWaitHandler(ctx, r.client, projectId, region, instanceId, credentialId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating credential", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -304,7 +298,7 @@ func (r *credentialResource) Read(ctx context.Context, req resource.ReadRequest, ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "credential_id", credentialId) - recordSetResp, err := r.client.DefaultAPI.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + recordSetResp, err := r.client.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -360,7 +354,7 @@ func (r *credentialResource) Delete(ctx context.Context, req resource.DeleteRequ ctx = tflog.SetField(ctx, "credential_id", credentialId) // Delete existing record set - err := r.client.DefaultAPI.DeleteCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + err := r.client.DeleteCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -372,7 +366,7 @@ func (r *credentialResource) Delete(ctx context.Context, req resource.DeleteRequ ctx = core.LogResponse(ctx) - _, err = wait.DeleteCredentialsWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, credentialId).WaitWithContext(ctx) + _, err = wait.DeleteCredentialsWaitHandler(ctx, r.client, projectId, region, instanceId, credentialId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting credential", fmt.Sprintf("Instance deletion waiting: %v", err)) return diff --git a/stackit/internal/services/opensearch/instance/datasource.go b/stackit/internal/services/opensearch/instance/datasource.go index 1193e91b5..40f5ada33 100644 --- a/stackit/internal/services/opensearch/instance/datasource.go +++ b/stackit/internal/services/opensearch/instance/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - opensearchUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/opensearch/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types" @@ -33,7 +30,7 @@ func NewInstanceDataSource() datasource.DataSource { // instanceDataSource is the data source implementation. type instanceDataSource struct { - client *opensearch.APIClient + client opensearch.DefaultAPI providerData core.ProviderData } @@ -44,17 +41,14 @@ func (d *instanceDataSource) Metadata(_ context.Context, req datasource.Metadata // Configure adds the provider configured client to the data source. func (d *instanceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := opensearchUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.OpensearchV2Client + tflog.Info(ctx, "OpenSearch instance client configured") } @@ -236,7 +230,7 @@ func (d *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceId) - instanceResp, err := d.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := d.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/opensearch/instance/resource.go b/stackit/internal/services/opensearch/instance/resource.go index fd48be188..d853afa78 100644 --- a/stackit/internal/services/opensearch/instance/resource.go +++ b/stackit/internal/services/opensearch/instance/resource.go @@ -10,8 +10,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - opensearchUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/opensearch/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -100,7 +98,7 @@ func NewInstanceResource() resource.Resource { // instanceResource is the resource implementation. type instanceResource struct { - client *opensearch.APIClient + client opensearch.DefaultAPI providerData core.ProviderData } @@ -111,17 +109,14 @@ func (r *instanceResource) Metadata(_ context.Context, req resource.MetadataRequ // Configure adds the provider configured client to the resource. func (r *instanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := opensearchUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.OpensearchV2Client + tflog.Info(ctx, "OpenSearch instance client configured") } @@ -406,7 +401,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } // Create new instance - createResp, err := r.client.DefaultAPI.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() + createResp, err := r.client.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -421,7 +416,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques "instance_id": instanceId, }) - waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -466,7 +461,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceId) - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && (oapiErr.StatusCode == http.StatusNotFound || oapiErr.StatusCode == http.StatusGone) { @@ -543,12 +538,12 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques return } // Update existing instance - err = r.client.DefaultAPI.PartialUpdateInstance(ctx, projectId, region, instanceId).PartialUpdateInstancePayload(*payload).Execute() + err = r.client.PartialUpdateInstance(ctx, projectId, region, instanceId).PartialUpdateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Calling API: %v", err)) return } - waitResp, err := wait.PartialUpdateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + waitResp, err := wait.PartialUpdateInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Instance update waiting: %v", err)) return @@ -591,7 +586,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = tflog.SetField(ctx, "instance_id", instanceId) // Delete existing instance - err := r.client.DefaultAPI.DeleteInstance(ctx, projectId, region, instanceId).Execute() + err := r.client.DeleteInstance(ctx, projectId, region, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -604,7 +599,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = core.LogResponse(ctx) - _, err = wait.DeleteInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + _, err = wait.DeleteInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting instance", fmt.Sprintf("Instance deletion waiting: %v", err)) return @@ -851,7 +846,7 @@ func toInstanceParams(parameters *parametersModel) (*opensearch.InstanceParamete func (r *instanceResource) loadPlanId(ctx context.Context, model *Model, region string) error { projectId := model.ProjectId.ValueString() - res, err := r.client.DefaultAPI.ListOfferings(ctx, projectId, region).Execute() + res, err := r.client.ListOfferings(ctx, projectId, region).Execute() if err != nil { return fmt.Errorf("getting OpenSearch offerings: %w", err) } @@ -883,10 +878,10 @@ func (r *instanceResource) loadPlanId(ctx context.Context, model *Model, region return fmt.Errorf("couldn't find plan_name '%s' for version %s, available names are: %s", planName, version, availablePlanNames) } -func loadPlanNameAndVersion(ctx context.Context, client *opensearch.APIClient, model *Model, region string) error { +func loadPlanNameAndVersion(ctx context.Context, client opensearch.DefaultAPI, model *Model, region string) error { projectId := model.ProjectId.ValueString() planId := model.PlanId.ValueString() - res, err := client.DefaultAPI.ListOfferings(ctx, projectId, region).Execute() + res, err := client.ListOfferings(ctx, projectId, region).Execute() if err != nil { return fmt.Errorf("getting OpenSearch offerings: %w", err) } diff --git a/stackit/internal/services/opensearch/utils/util.go b/stackit/internal/services/opensearch/utils/util.go deleted file mode 100644 index 53f519763..000000000 --- a/stackit/internal/services/opensearch/utils/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - opensearch "github.com/stackitcloud/stackit-sdk-go/services/opensearch/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *opensearch.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.OpenSearchCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.OpenSearchCustomEndpoint)) - } - - apiClient, err := opensearch.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/opensearch/utils/util_test.go b/stackit/internal/services/opensearch/utils/util_test.go deleted file mode 100644 index 793d447c4..000000000 --- a/stackit/internal/services/opensearch/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - opensearch "github.com/stackitcloud/stackit-sdk-go/services/opensearch/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://opensearch-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *opensearch.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *opensearch.APIClient { - apiClient, err := opensearch.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - OpenSearchCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *opensearch.APIClient { - apiClient, err := opensearch.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/postgresflex/database/datasource.go b/stackit/internal/services/postgresflex/database/datasource.go index c7f7edb94..caab2eaca 100644 --- a/stackit/internal/services/postgresflex/database/datasource.go +++ b/stackit/internal/services/postgresflex/database/datasource.go @@ -6,9 +6,6 @@ import ( "net/http" "strconv" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - postgresflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/postgresflex/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -33,7 +30,7 @@ func NewDatabaseDataSource() datasource.DataSource { // databaseDataSource is the data source implementation. type databaseDataSource struct { - client *postgresflex.APIClient + client postgresflex.DefaultAPI providerData core.ProviderData } @@ -45,16 +42,14 @@ func (r *databaseDataSource) Metadata(_ context.Context, req datasource.Metadata // Configure adds the provider configured client to the data source. func (r *databaseDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := postgresflexUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.PostgresflexV3Client + tflog.Info(ctx, "Postgres Flex database client configured") } @@ -145,7 +140,7 @@ func (r *databaseDataSource) Read(ctx context.Context, req datasource.ReadReques return } - databaseResp, err := r.client.DefaultAPI.GetDatabase(ctx, projectId, region, instanceId, databaseId).Execute() + databaseResp, err := r.client.GetDatabase(ctx, projectId, region, instanceId, databaseId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/postgresflex/database/resource.go b/stackit/internal/services/postgresflex/database/resource.go index 4e5232186..6ca99096e 100644 --- a/stackit/internal/services/postgresflex/database/resource.go +++ b/stackit/internal/services/postgresflex/database/resource.go @@ -10,7 +10,6 @@ import ( "time" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - postgresflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/postgresflex/utils" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -53,7 +52,7 @@ func NewDatabaseResource() resource.Resource { // databaseResource is the resource implementation. type databaseResource struct { - client *postgresflex.APIClient + client postgresflex.DefaultAPI providerData core.ProviderData } @@ -95,16 +94,14 @@ func (r *databaseResource) Metadata(_ context.Context, req resource.MetadataRequ // Configure adds the provider configured client to the resource. func (r *databaseResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := postgresflexUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.PostgresflexV3Client + tflog.Info(ctx, "Postgres Flex database client configured") } @@ -224,7 +221,7 @@ func (r *databaseResource) Create(ctx context.Context, req resource.CreateReques http.StatusLocked, }, } - databaseResp, err := utils.RetryRequest(ctx, r.client.DefaultAPI.CreateDatabase(ctx, projectId, region, instanceId).CreateDatabasePayload(*payload).Execute, config) + databaseResp, err := utils.RetryRequest(ctx, r.client.CreateDatabase(ctx, projectId, region, instanceId).CreateDatabasePayload(*payload).Execute, config) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating database", fmt.Sprintf("Calling API: %v", err)) return @@ -238,7 +235,7 @@ func (r *databaseResource) Create(ctx context.Context, req resource.CreateReques } ctx = tflog.SetField(ctx, "database_id", databaseResp.Id) - database, err := r.client.DefaultAPI.GetDatabase(ctx, projectId, region, instanceId, databaseResp.Id).Execute() + database, err := r.client.GetDatabase(ctx, projectId, region, instanceId, databaseResp.Id).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating database", fmt.Sprintf("Getting database details after creation: %v", err)) return @@ -291,7 +288,7 @@ func (r *databaseResource) Read(ctx context.Context, req resource.ReadRequest, r return } - databaseResp, err := r.client.DefaultAPI.GetDatabase(ctx, projectId, region, instanceId, databaseId).Execute() + databaseResp, err := r.client.GetDatabase(ctx, projectId, region, instanceId, databaseId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -366,7 +363,7 @@ func (r *databaseResource) Update(ctx context.Context, req resource.UpdateReques http.StatusLocked, }, } - err = utils.RetryRequestWithoutResponse(ctx, r.client.DefaultAPI.PartialUpdateDatabase(ctx, projectId, region, instanceId, databaseId).PartialUpdateDatabasePayload(*payload).Execute, config) + err = utils.RetryRequestWithoutResponse(ctx, r.client.PartialUpdateDatabase(ctx, projectId, region, instanceId, databaseId).PartialUpdateDatabasePayload(*payload).Execute, config) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating database", fmt.Sprintf("Calling API: %v", err)) return @@ -374,7 +371,7 @@ func (r *databaseResource) Update(ctx context.Context, req resource.UpdateReques ctx = core.LogResponse(ctx) - database, err := r.client.DefaultAPI.GetDatabase(ctx, projectId, region, instanceId, databaseId).Execute() + database, err := r.client.GetDatabase(ctx, projectId, region, instanceId, databaseId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating database", fmt.Sprintf("Getting database details after update: %v", err)) return @@ -436,7 +433,7 @@ func (r *databaseResource) Delete(ctx context.Context, req resource.DeleteReques http.StatusLocked, }, } - err = utils.RetryRequestWithoutResponse(ctx, r.client.DefaultAPI.DeleteDatabase(ctx, projectId, region, instanceId, databaseId).Execute, config) + err = utils.RetryRequestWithoutResponse(ctx, r.client.DeleteDatabase(ctx, projectId, region, instanceId, databaseId).Execute, config) if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) diff --git a/stackit/internal/services/postgresflex/flavors/datasource.go b/stackit/internal/services/postgresflex/flavors/datasource.go index 89ba99a3a..5ed7c3ce8 100644 --- a/stackit/internal/services/postgresflex/flavors/datasource.go +++ b/stackit/internal/services/postgresflex/flavors/datasource.go @@ -14,9 +14,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" postgresflex "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - postgresflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/postgresflex/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -52,7 +51,7 @@ type storageClass struct { } type flavors struct { - client *postgresflex.APIClient + client postgresflex.DefaultAPI providerData core.ProviderData } @@ -65,17 +64,14 @@ func (f *flavors) Metadata(_ context.Context, req datasource.MetadataRequest, re } func (f *flavors) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - f.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := postgresflexUtils.ConfigureClient(ctx, &f.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - f.client = apiClient + f.providerData = providerData + f.client = clients.PostgresflexV3Client + tflog.Info(ctx, "Postgres Flex flavors client configured") } @@ -190,7 +186,7 @@ func (f *flavors) Read(ctx context.Context, req datasource.ReadRequest, resp *da ctx = core.InitProviderContext(ctx) const pageSize int64 = 100 - flavorsResp, err := f.client.DefaultAPI.ListFlavors(ctx, projectId, region).Size(pageSize).Execute() + flavorsResp, err := f.client.ListFlavors(ctx, projectId, region).Size(pageSize).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Reading flavors", fmt.Sprintf("Calling ListFlavors: %v", err)) return diff --git a/stackit/internal/services/postgresflex/instance/datasource.go b/stackit/internal/services/postgresflex/instance/datasource.go index a730334ab..a664cf4f6 100644 --- a/stackit/internal/services/postgresflex/instance/datasource.go +++ b/stackit/internal/services/postgresflex/instance/datasource.go @@ -12,9 +12,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - postgresflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/postgresflex/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -33,7 +32,7 @@ func NewInstanceDataSource() datasource.DataSource { // instanceDataSource is the data source implementation. type instanceDataSource struct { - client *postgresflex.APIClient + client postgresflex.DefaultAPI providerData core.ProviderData } @@ -44,17 +43,14 @@ func (r *instanceDataSource) Metadata(_ context.Context, req datasource.Metadata // Configure adds the provider configured client to the data source. func (r *instanceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := postgresflexUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.PostgresflexV3Client + tflog.Info(ctx, "Postgres Flex instance client configured") } @@ -248,7 +244,7 @@ func (r *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "region", region) - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { utils.LogError( ctx, @@ -267,7 +263,7 @@ func (r *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = core.LogResponse(ctx) flavor := &flavorModel{} - flavorResp, err := getFlavor(ctx, r.client.DefaultAPI, projectId, region, instanceResp.FlavorId) + flavorResp, err := getFlavor(ctx, r.client, projectId, region, instanceResp.FlavorId) if err != nil { core.LogAndAddWarning(ctx, &resp.Diagnostics, "Flavor not populated", fmt.Sprintf("Finding flavor %q: %v", instanceResp.FlavorId, err)) } else if flavorResp != nil { diff --git a/stackit/internal/services/postgresflex/instance/resource.go b/stackit/internal/services/postgresflex/instance/resource.go index ccf219812..33f57adf2 100644 --- a/stackit/internal/services/postgresflex/instance/resource.go +++ b/stackit/internal/services/postgresflex/instance/resource.go @@ -25,7 +25,7 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - postgresflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/postgresflex/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils/planmodifiers/listplanmodifier" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -158,7 +158,7 @@ func NewInstanceResource() resource.Resource { // instanceResource is the resource implementation. type instanceResource struct { - client *postgresflex.APIClient + client postgresflex.DefaultAPI providerData core.ProviderData } @@ -232,16 +232,14 @@ func (r *instanceResource) Metadata(_ context.Context, req resource.MetadataRequ // Configure adds the provider configured client to the resource. func (r *instanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := postgresflexUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.PostgresflexV3Client + tflog.Info(ctx, "Postgres Flex instance client configured") } @@ -580,7 +578,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques if resp.Diagnostics.HasError() { return } - err := loadFlavorId(ctx, r.client.DefaultAPI, &model, flavor) + err := loadFlavorId(ctx, r.client, &model, flavor) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Loading flavor ID: %v", err)) return @@ -619,7 +617,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } // Create new instance - createResp, err := r.client.DefaultAPI.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() + createResp, err := r.client.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -641,7 +639,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } - waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, createResp.Id).WaitWithContext(ctx) + waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client, projectId, region, createResp.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -685,7 +683,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "region", region) - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -705,7 +703,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r return } } else { - flavorResp, err := getFlavor(ctx, r.client.DefaultAPI, projectId, region, instanceResp.FlavorId) + flavorResp, err := getFlavor(ctx, r.client, projectId, region, instanceResp.FlavorId) if err != nil { core.LogAndAddWarning(ctx, &resp.Diagnostics, "Flavor not populated", fmt.Sprintf("Finding flavor %q: %v", instanceResp.FlavorId, err)) } else if flavorResp != nil { @@ -768,7 +766,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques if resp.Diagnostics.HasError() { return } - err := loadFlavorId(ctx, r.client.DefaultAPI, &model, flavor) + err := loadFlavorId(ctx, r.client, &model, flavor) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Loading flavor ID: %v", err)) return @@ -798,7 +796,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques return } // Update existing instance - err = r.client.DefaultAPI.PartialUpdateInstance(ctx, projectId, region, instanceId).PartialUpdateInstancePayload(*payload).Execute() + err = r.client.PartialUpdateInstance(ctx, projectId, region, instanceId).PartialUpdateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", err.Error()) return @@ -806,7 +804,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques ctx = core.LogResponse(ctx) - waitResp, err := wait.PartialUpdateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + waitResp, err := wait.PartialUpdateInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Instance update waiting: %v", err)) return @@ -846,7 +844,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = tflog.SetField(ctx, "region", region) // Delete existing instance - err := r.client.DefaultAPI.DeleteInstance(ctx, projectId, region, instanceId).Execute() + err := r.client.DeleteInstance(ctx, projectId, region, instanceId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -858,7 +856,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = core.LogResponse(ctx) - _, err = wait.DeleteInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).SetTimeout(45 * time.Minute).WaitWithContext(ctx) + _, err = wait.DeleteInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).SetTimeout(45 * time.Minute).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting instance", fmt.Sprintf("Instance deletion waiting: %v", err)) return diff --git a/stackit/internal/services/postgresflex/user/datasource.go b/stackit/internal/services/postgresflex/user/datasource.go index 91b0820ed..428c8521c 100644 --- a/stackit/internal/services/postgresflex/user/datasource.go +++ b/stackit/internal/services/postgresflex/user/datasource.go @@ -6,9 +6,6 @@ import ( "net/http" "strconv" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - postgresflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/postgresflex/utils" - "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -49,7 +46,7 @@ func NewUserDataSource() datasource.DataSource { // userDataSource is the data source implementation. type userDataSource struct { - client *postgresflex.APIClient + client postgresflex.DefaultAPI providerData core.ProviderData } @@ -61,16 +58,14 @@ func (r *userDataSource) Metadata(_ context.Context, req datasource.MetadataRequ // Configure adds the provider configured client to the data source. func (r *userDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := postgresflexUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.PostgresflexV3Client + tflog.Info(ctx, "Postgres Flex user client configured") } @@ -166,7 +161,7 @@ func (r *userDataSource) Read(ctx context.Context, req datasource.ReadRequest, r return } - recordSetResp, err := r.client.DefaultAPI.GetUser(ctx, projectId, region, instanceId, userId).Execute() + recordSetResp, err := r.client.GetUser(ctx, projectId, region, instanceId, userId).Execute() if err != nil { utils.LogError( ctx, @@ -185,7 +180,7 @@ func (r *userDataSource) Read(ctx context.Context, req datasource.ReadRequest, r ctx = core.LogResponse(ctx) // Deprecated: Legacy mode needed during deprecation period to retrieve all v2 values. Can be removed after February 2027 - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating user", fmt.Sprintf("Calling get instance API: %v", err)) return diff --git a/stackit/internal/services/postgresflex/user/resource.go b/stackit/internal/services/postgresflex/user/resource.go index 7db66929b..d2c91b99d 100644 --- a/stackit/internal/services/postgresflex/user/resource.go +++ b/stackit/internal/services/postgresflex/user/resource.go @@ -11,12 +11,9 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema/mapplanmodifier" - postgresflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/postgresflex/utils" - "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -70,7 +67,7 @@ func NewUserResource() resource.Resource { // userResource is the resource implementation. type userResource struct { - client *postgresflex.APIClient + client postgresflex.DefaultAPI providerData core.ProviderData } @@ -112,16 +109,14 @@ func (r *userResource) Metadata(_ context.Context, req resource.MetadataRequest, // Configure adds the provider configured client to the resource. func (r *userResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := postgresflexUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.PostgresflexV3Client + tflog.Info(ctx, "Postgres Flex user client configured") } @@ -279,7 +274,7 @@ func (r *userResource) Create(ctx context.Context, req resource.CreateRequest, r http.StatusLocked, }, } - userResp, err := utils.RetryRequest(ctx, r.client.DefaultAPI.CreateUser(ctx, projectId, region, instanceId).CreateUserPayload(*payload).Execute, config) + userResp, err := utils.RetryRequest(ctx, r.client.CreateUser(ctx, projectId, region, instanceId).CreateUserPayload(*payload).Execute, config) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating user", fmt.Sprintf("Calling API: %v", err)) return @@ -303,13 +298,13 @@ func (r *userResource) Create(ctx context.Context, req resource.CreateRequest, r return } - getResp, err := wait.CreateUserWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, userResp.Id).WaitWithContext(ctx) + getResp, err := wait.CreateUserWaitHandler(ctx, r.client, projectId, region, instanceId, userResp.Id).WaitWithContext(ctx) if err != nil { return } // Deprecated: Legacy mode needed during deprecation period to retrieve all v2 values. Can be removed after February 2027 - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating user", fmt.Sprintf("Calling get instance API: %v", err)) return @@ -362,7 +357,7 @@ func (r *userResource) Read(ctx context.Context, req resource.ReadRequest, resp return } - recordSetResp, err := r.client.DefaultAPI.GetUser(ctx, projectId, region, instanceId, userId).Execute() + recordSetResp, err := r.client.GetUser(ctx, projectId, region, instanceId, userId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -375,7 +370,7 @@ func (r *userResource) Read(ctx context.Context, req resource.ReadRequest, resp ctx = core.LogResponse(ctx) // Deprecated: Legacy mode needed during deprecation period to retrieve all v2 values. Can be removed after February 2027 - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating user", fmt.Sprintf("Calling get instance API: %v", err)) return @@ -462,7 +457,7 @@ func (r *userResource) Update(ctx context.Context, req resource.UpdateRequest, r http.StatusLocked, }, } - err = utils.RetryRequestWithoutResponse(ctx, r.client.DefaultAPI.PartialUpdateUser(ctx, projectId, region, instanceId, userId).PartialUpdateUserPayload(*payload).Execute, config) + err = utils.RetryRequestWithoutResponse(ctx, r.client.PartialUpdateUser(ctx, projectId, region, instanceId, userId).PartialUpdateUserPayload(*payload).Execute, config) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating user", err.Error()) return @@ -470,14 +465,14 @@ func (r *userResource) Update(ctx context.Context, req resource.UpdateRequest, r ctx = core.LogResponse(ctx) - userResp, err := r.client.DefaultAPI.GetUser(ctx, projectId, region, instanceId, userId).Execute() + userResp, err := r.client.GetUser(ctx, projectId, region, instanceId, userId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating user", fmt.Sprintf("Calling API: %v", err)) return } // Deprecated: Legacy mode needed during deprecation period to retrieve all v2 values. Can be removed after February 2027 - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating user", fmt.Sprintf("Calling get instance API: %v", err)) return @@ -540,7 +535,7 @@ func (r *userResource) Delete(ctx context.Context, req resource.DeleteRequest, r http.StatusLocked, }, } - err = utils.RetryRequestWithoutResponse(ctx, r.client.DefaultAPI.DeleteUser(ctx, projectId, region, instanceId, userId).Execute, config) + err = utils.RetryRequestWithoutResponse(ctx, r.client.DeleteUser(ctx, projectId, region, instanceId, userId).Execute, config) if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -552,7 +547,7 @@ func (r *userResource) Delete(ctx context.Context, req resource.DeleteRequest, r ctx = core.LogResponse(ctx) - _, err = wait.DeleteUserWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, userId).WaitWithContext(ctx) + _, err = wait.DeleteUserWaitHandler(ctx, r.client, projectId, region, instanceId, userId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting user", fmt.Sprintf("Instance deletion waiting: %v", err)) return diff --git a/stackit/internal/services/postgresflex/utils/util.go b/stackit/internal/services/postgresflex/utils/util.go deleted file mode 100644 index 765aa5824..000000000 --- a/stackit/internal/services/postgresflex/utils/util.go +++ /dev/null @@ -1,32 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - - postgresflex "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *postgresflex.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.PostgresFlexCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.PostgresFlexCustomEndpoint)) - } - - apiClient, err := postgresflex.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/postgresflex/utils/util_test.go b/stackit/internal/services/postgresflex/utils/util_test.go deleted file mode 100644 index b24b102ef..000000000 --- a/stackit/internal/services/postgresflex/utils/util_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - - postgresflex "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://postgresflex-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *postgresflex.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *postgresflex.APIClient { - apiClient, err := postgresflex.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - PostgresFlexCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *postgresflex.APIClient { - apiClient, err := postgresflex.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/rabbitmq/credential/datasource.go b/stackit/internal/services/rabbitmq/credential/datasource.go index 477a093ee..e171eeb23 100644 --- a/stackit/internal/services/rabbitmq/credential/datasource.go +++ b/stackit/internal/services/rabbitmq/credential/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - rabbitmqUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/rabbitmq/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -51,7 +48,7 @@ func NewCredentialDataSource() datasource.DataSource { // credentialDataSource is the data source implementation. type credentialDataSource struct { - client *rabbitmq.APIClient + client rabbitmq.DefaultAPI providerData core.ProviderData } @@ -62,17 +59,14 @@ func (r *credentialDataSource) Metadata(_ context.Context, req datasource.Metada // Configure adds the provider configured client to the data source. func (r *credentialDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := rabbitmqUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.RabbitMqV2Client + tflog.Info(ctx, "RabbitMQ credential client configured") } @@ -183,7 +177,7 @@ func (r *credentialDataSource) Read(ctx context.Context, req datasource.ReadRequ ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "credential_id", credentialId) - recordSetResp, err := r.client.DefaultAPI.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + recordSetResp, err := r.client.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/rabbitmq/credential/resource.go b/stackit/internal/services/rabbitmq/credential/resource.go index aaaa38860..9659b570a 100644 --- a/stackit/internal/services/rabbitmq/credential/resource.go +++ b/stackit/internal/services/rabbitmq/credential/resource.go @@ -9,9 +9,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema/mapplanmodifier" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - rabbitmqUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/rabbitmq/utils" - "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -67,7 +64,7 @@ func NewCredentialResource() resource.Resource { // credentialResource is the resource implementation. type credentialResource struct { - client *rabbitmq.APIClient + client rabbitmq.DefaultAPI providerData core.ProviderData } @@ -108,17 +105,14 @@ func (r *credentialResource) ModifyPlan(ctx context.Context, req resource.Modify // Configure adds the provider configured client to the resource. func (r *credentialResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := rabbitmqUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.RabbitMqV2Client + tflog.Info(ctx, "RabbitMQ credential client configured") } @@ -257,7 +251,7 @@ func (r *credentialResource) Create(ctx context.Context, req resource.CreateRequ ctx = tflog.SetField(ctx, "region", region) // Create new recordset - credentialsResp, err := r.client.DefaultAPI.CreateCredentials(ctx, projectId, region, instanceId).Execute() + credentialsResp, err := r.client.CreateCredentials(ctx, projectId, region, instanceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating credential", fmt.Sprintf("Calling API: %v", err)) return @@ -280,7 +274,7 @@ func (r *credentialResource) Create(ctx context.Context, req resource.CreateRequ return } - waitResp, err := wait.CreateCredentialsWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, credentialId).WaitWithContext(ctx) + waitResp, err := wait.CreateCredentialsWaitHandler(ctx, r.client, projectId, region, instanceId, credentialId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating credential", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -325,7 +319,7 @@ func (r *credentialResource) Read(ctx context.Context, req resource.ReadRequest, ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "credential_id", credentialId) - recordSetResp, err := r.client.DefaultAPI.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + recordSetResp, err := r.client.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -381,7 +375,7 @@ func (r *credentialResource) Delete(ctx context.Context, req resource.DeleteRequ ctx = tflog.SetField(ctx, "credential_id", credentialId) // Delete existing record set - err := r.client.DefaultAPI.DeleteCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + err := r.client.DeleteCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -393,7 +387,7 @@ func (r *credentialResource) Delete(ctx context.Context, req resource.DeleteRequ ctx = core.LogResponse(ctx) - _, err = wait.DeleteCredentialsWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, credentialId).WaitWithContext(ctx) + _, err = wait.DeleteCredentialsWaitHandler(ctx, r.client, projectId, region, instanceId, credentialId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting credential", fmt.Sprintf("Instance deletion waiting: %v", err)) return diff --git a/stackit/internal/services/rabbitmq/instance/datasource.go b/stackit/internal/services/rabbitmq/instance/datasource.go index 21e17b3cb..0a6896d34 100644 --- a/stackit/internal/services/rabbitmq/instance/datasource.go +++ b/stackit/internal/services/rabbitmq/instance/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - rabbitmqUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/rabbitmq/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types" @@ -33,7 +30,7 @@ func NewInstanceDataSource() datasource.DataSource { // instanceDataSource is the data source implementation. type instanceDataSource struct { - client *rabbitmq.APIClient + client rabbitmq.DefaultAPI providerData core.ProviderData } @@ -44,17 +41,14 @@ func (r *instanceDataSource) Metadata(_ context.Context, req datasource.Metadata // Configure adds the provider configured client to the data source. func (r *instanceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := rabbitmqUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.RabbitMqV2Client + tflog.Info(ctx, "RabbitMQ instance client configured") } @@ -232,7 +226,7 @@ func (r *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "region", region) - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/rabbitmq/instance/resource.go b/stackit/internal/services/rabbitmq/instance/resource.go index f356b47fe..ee9e03165 100644 --- a/stackit/internal/services/rabbitmq/instance/resource.go +++ b/stackit/internal/services/rabbitmq/instance/resource.go @@ -9,8 +9,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - rabbitmqUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/rabbitmq/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -97,7 +95,7 @@ func NewInstanceResource() resource.Resource { // instanceResource is the resource implementation. type instanceResource struct { - client *rabbitmq.APIClient + client rabbitmq.DefaultAPI providerData core.ProviderData } @@ -137,17 +135,14 @@ func (r *instanceResource) ModifyPlan(ctx context.Context, req resource.ModifyPl // Configure adds the provider configured client to the resource. func (r *instanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := rabbitmqUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.RabbitMqV2Client + tflog.Info(ctx, "RabbitMQ instance client configured") } @@ -401,7 +396,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } // Create new instance - createResp, err := r.client.DefaultAPI.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() + createResp, err := r.client.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -424,7 +419,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } - waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -470,7 +465,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "region", region) - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && (oapiErr.StatusCode == http.StatusNotFound || oapiErr.StatusCode == http.StatusGone) { @@ -547,7 +542,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques return } // Update existing instance - err = r.client.DefaultAPI.PartialUpdateInstance(ctx, projectId, region, instanceId).PartialUpdateInstancePayload(*payload).Execute() + err = r.client.PartialUpdateInstance(ctx, projectId, region, instanceId).PartialUpdateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -555,7 +550,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques ctx = core.LogResponse(ctx) - waitResp, err := wait.PartialUpdateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + waitResp, err := wait.PartialUpdateInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Instance update waiting: %v", err)) return @@ -596,7 +591,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = tflog.SetField(ctx, "region", region) // Delete existing instance - err := r.client.DefaultAPI.DeleteInstance(ctx, projectId, region, instanceId).Execute() + err := r.client.DeleteInstance(ctx, projectId, region, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -609,7 +604,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = core.LogResponse(ctx) - _, err = wait.DeleteInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + _, err = wait.DeleteInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting instance", fmt.Sprintf("Instance deletion waiting: %v", err)) return @@ -862,7 +857,7 @@ func toInstanceParams(parameters *parametersModel) (*rabbitmq.InstanceParameters func (r *instanceResource) loadPlanId(ctx context.Context, model *Model) error { projectId := model.ProjectId.ValueString() region := r.providerData.GetRegionWithOverride(model.Region) - res, err := r.client.DefaultAPI.ListOfferings(ctx, projectId, region).Execute() + res, err := r.client.ListOfferings(ctx, projectId, region).Execute() if err != nil { return fmt.Errorf("getting RabbitMQ offerings: %w", err) } @@ -897,10 +892,10 @@ func (r *instanceResource) loadPlanId(ctx context.Context, model *Model) error { return fmt.Errorf("couldn't find plan_name '%s' for version %s, available names are: %s", planName, version, availablePlanNames) } -func loadPlanNameAndVersion(ctx context.Context, client *rabbitmq.APIClient, model *Model, region string) error { +func loadPlanNameAndVersion(ctx context.Context, client rabbitmq.DefaultAPI, model *Model, region string) error { projectId := model.ProjectId.ValueString() planId := model.PlanId.ValueString() - res, err := client.DefaultAPI.ListOfferings(ctx, projectId, region).Execute() + res, err := client.ListOfferings(ctx, projectId, region).Execute() if err != nil { return fmt.Errorf("getting RabbitMQ offerings: %w", err) } diff --git a/stackit/internal/services/rabbitmq/utils/util.go b/stackit/internal/services/rabbitmq/utils/util.go deleted file mode 100644 index 94c618c3d..000000000 --- a/stackit/internal/services/rabbitmq/utils/util.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *rabbitmq.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.RabbitMQCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.RabbitMQCustomEndpoint)) - } - apiClient, err := rabbitmq.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/rabbitmq/utils/util_test.go b/stackit/internal/services/rabbitmq/utils/util_test.go deleted file mode 100644 index 401f4db87..000000000 --- a/stackit/internal/services/rabbitmq/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - rabbitmq "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://rabbitmq-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *rabbitmq.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *rabbitmq.APIClient { - apiClient, err := rabbitmq.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - RabbitMQCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *rabbitmq.APIClient { - apiClient, err := rabbitmq.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/redis/credential/datasource.go b/stackit/internal/services/redis/credential/datasource.go index 420a25ffc..faa11e561 100644 --- a/stackit/internal/services/redis/credential/datasource.go +++ b/stackit/internal/services/redis/credential/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - redisUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/redis/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -48,7 +45,7 @@ func NewCredentialDataSource() datasource.DataSource { // credentialDataSource is the data source implementation. type credentialDataSource struct { - client *redis.APIClient + client redis.DefaultAPI providerData core.ProviderData } @@ -59,17 +56,14 @@ func (r *credentialDataSource) Metadata(_ context.Context, req datasource.Metada // Configure adds the provider configured client to the data source. func (r *credentialDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := redisUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.RedisV2Client + tflog.Info(ctx, "Redis credential client configured") } @@ -171,7 +165,7 @@ func (r *credentialDataSource) Read(ctx context.Context, req datasource.ReadRequ ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "credential_id", credentialId) - recordSetResp, err := r.client.DefaultAPI.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + recordSetResp, err := r.client.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/redis/credential/resource.go b/stackit/internal/services/redis/credential/resource.go index 0e1896af7..2cd2500f2 100644 --- a/stackit/internal/services/redis/credential/resource.go +++ b/stackit/internal/services/redis/credential/resource.go @@ -9,9 +9,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema/mapplanmodifier" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - redisUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/redis/utils" - "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -64,7 +61,7 @@ func NewCredentialResource() resource.Resource { // credentialResource is the resource implementation. type credentialResource struct { - client *redis.APIClient + client redis.DefaultAPI providerData core.ProviderData } @@ -105,17 +102,14 @@ func (r *credentialResource) ModifyPlan(ctx context.Context, req resource.Modify // Configure adds the provider configured client to the resource. func (r *credentialResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := redisUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.RedisV2Client + tflog.Info(ctx, "Redis credential client configured") } @@ -245,7 +239,7 @@ func (r *credentialResource) Create(ctx context.Context, req resource.CreateRequ ctx = tflog.SetField(ctx, "region", region) // Create new recordset - credentialsResp, err := r.client.DefaultAPI.CreateCredentials(ctx, projectId, region, instanceId).Execute() + credentialsResp, err := r.client.CreateCredentials(ctx, projectId, region, instanceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating credential", fmt.Sprintf("Calling API: %v", err)) return @@ -269,7 +263,7 @@ func (r *credentialResource) Create(ctx context.Context, req resource.CreateRequ return } - waitResp, err := wait.CreateCredentialsWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, credentialId).WaitWithContext(ctx) + waitResp, err := wait.CreateCredentialsWaitHandler(ctx, r.client, projectId, region, instanceId, credentialId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating credential", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -314,7 +308,7 @@ func (r *credentialResource) Read(ctx context.Context, req resource.ReadRequest, ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "credential_id", credentialId) - recordSetResp, err := r.client.DefaultAPI.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + recordSetResp, err := r.client.GetCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -370,7 +364,7 @@ func (r *credentialResource) Delete(ctx context.Context, req resource.DeleteRequ ctx = tflog.SetField(ctx, "credential_id", credentialId) // Delete existing record set - err := r.client.DefaultAPI.DeleteCredentials(ctx, projectId, region, instanceId, credentialId).Execute() + err := r.client.DeleteCredentials(ctx, projectId, region, instanceId, credentialId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -382,7 +376,7 @@ func (r *credentialResource) Delete(ctx context.Context, req resource.DeleteRequ ctx = core.LogResponse(ctx) - _, err = wait.DeleteCredentialsWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, credentialId).WaitWithContext(ctx) + _, err = wait.DeleteCredentialsWaitHandler(ctx, r.client, projectId, region, instanceId, credentialId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting credential", fmt.Sprintf("Instance deletion waiting: %v", err)) return diff --git a/stackit/internal/services/redis/instance/datasource.go b/stackit/internal/services/redis/instance/datasource.go index 473255973..c82723ca8 100644 --- a/stackit/internal/services/redis/instance/datasource.go +++ b/stackit/internal/services/redis/instance/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - redisUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/redis/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types" @@ -33,7 +30,7 @@ func NewInstanceDataSource() datasource.DataSource { // instanceDataSource is the data source implementation. type instanceDataSource struct { - client *redis.APIClient + client redis.DefaultAPI providerData core.ProviderData } @@ -44,17 +41,14 @@ func (r *instanceDataSource) Metadata(_ context.Context, req datasource.Metadata // Configure adds the provider configured client to the data source. func (r *instanceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := redisUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.RedisV2Client + tflog.Info(ctx, "Redis instance client configured") } @@ -279,7 +273,7 @@ func (r *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "region", region) - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/redis/instance/resource.go b/stackit/internal/services/redis/instance/resource.go index 4053a42ed..de4fa5e59 100644 --- a/stackit/internal/services/redis/instance/resource.go +++ b/stackit/internal/services/redis/instance/resource.go @@ -10,8 +10,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - redisUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/redis/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -116,7 +114,7 @@ func NewInstanceResource() resource.Resource { // instanceResource is the resource implementation. type instanceResource struct { - client *redis.APIClient + client redis.DefaultAPI providerData core.ProviderData } @@ -156,17 +154,14 @@ func (r *instanceResource) ModifyPlan(ctx context.Context, req resource.ModifyPl // Configure adds the provider configured client to the resource. func (r *instanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := redisUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.RedisV2Client + tflog.Info(ctx, "Redis instance client configured") } @@ -471,7 +466,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } // Create new instance - createResp, err := r.client.DefaultAPI.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() + createResp, err := r.client.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -493,7 +488,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques if resp.Diagnostics.HasError() { return } - waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -539,7 +534,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "region", region) - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && (oapiErr.StatusCode == http.StatusNotFound || oapiErr.StatusCode == http.StatusGone) { @@ -616,7 +611,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques return } // Update existing instance - err = r.client.DefaultAPI.PartialUpdateInstance(ctx, projectId, region, instanceId).PartialUpdateInstancePayload(*payload).Execute() + err = r.client.PartialUpdateInstance(ctx, projectId, region, instanceId).PartialUpdateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -624,7 +619,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques ctx = core.LogResponse(ctx) - waitResp, err := wait.PartialUpdateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + waitResp, err := wait.PartialUpdateInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Instance update waiting: %v", err)) return @@ -665,7 +660,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = tflog.SetField(ctx, "region", region) // Delete existing instance - err := r.client.DefaultAPI.DeleteInstance(ctx, projectId, region, instanceId).Execute() + err := r.client.DeleteInstance(ctx, projectId, region, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -678,7 +673,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = core.LogResponse(ctx) - _, err = wait.DeleteInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + _, err = wait.DeleteInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting instance", fmt.Sprintf("Instance deletion waiting: %v", err)) return @@ -939,7 +934,7 @@ func toInstanceParams(parameters *parametersModel) (*redis.InstanceParameters, e func (r *instanceResource) loadPlanId(ctx context.Context, model *Model) error { projectId := model.ProjectId.ValueString() region := r.providerData.GetRegionWithOverride(model.Region) - res, err := r.client.DefaultAPI.ListOfferings(ctx, projectId, region).Execute() + res, err := r.client.ListOfferings(ctx, projectId, region).Execute() if err != nil { return fmt.Errorf("getting Redis offerings: %w", err) } @@ -974,10 +969,10 @@ func (r *instanceResource) loadPlanId(ctx context.Context, model *Model) error { return fmt.Errorf("couldn't find plan_name '%s' for version %s, available names are: %s", planName, version, availablePlanNames) } -func loadPlanNameAndVersion(ctx context.Context, client *redis.APIClient, model *Model, region string) error { +func loadPlanNameAndVersion(ctx context.Context, client redis.DefaultAPI, model *Model, region string) error { projectId := model.ProjectId.ValueString() planId := model.PlanId.ValueString() - res, err := client.DefaultAPI.ListOfferings(ctx, projectId, region).Execute() + res, err := client.ListOfferings(ctx, projectId, region).Execute() if err != nil { return fmt.Errorf("getting Redis offerings: %w", err) } diff --git a/stackit/internal/services/redis/utils/util.go b/stackit/internal/services/redis/utils/util.go deleted file mode 100644 index 7e6f301ec..000000000 --- a/stackit/internal/services/redis/utils/util.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - redis "github.com/stackitcloud/stackit-sdk-go/services/redis/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *redis.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.RedisCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.RedisCustomEndpoint)) - } - apiClient, err := redis.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/redis/utils/util_test.go b/stackit/internal/services/redis/utils/util_test.go deleted file mode 100644 index 391ab9a20..000000000 --- a/stackit/internal/services/redis/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - redis "github.com/stackitcloud/stackit-sdk-go/services/redis/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://redis-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *redis.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *redis.APIClient { - apiClient, err := redis.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - RedisCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *redis.APIClient { - apiClient, err := redis.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/resourcemanager/folder/datasource.go b/stackit/internal/services/resourcemanager/folder/datasource.go index 3946f1f44..c426ebf27 100644 --- a/stackit/internal/services/resourcemanager/folder/datasource.go +++ b/stackit/internal/services/resourcemanager/folder/datasource.go @@ -15,9 +15,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" resourcemanager "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager/v0api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - resourcemanagerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/resourcemanager/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -35,7 +34,7 @@ func NewFolderDataSource() datasource.DataSource { // folderDataSource is the data source implementation. type folderDataSource struct { - client *resourcemanager.APIClient + client resourcemanager.DefaultAPI } // Metadata returns the data source type name. @@ -44,16 +43,13 @@ func (d *folderDataSource) Metadata(_ context.Context, req datasource.MetadataRe } func (d *folderDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := resourcemanagerUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.client = clients.ResourceManagerClient + tflog.Info(ctx, "Resource Manager client configured") } @@ -151,7 +147,7 @@ func (d *folderDataSource) Read(ctx context.Context, req datasource.ReadRequest, containerId := model.ContainerId.ValueString() ctx = tflog.SetField(ctx, "container_id", containerId) - folderResp, err := d.client.DefaultAPI.GetFolderDetails(ctx, containerId).Execute() + folderResp, err := d.client.GetFolderDetails(ctx, containerId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/resourcemanager/folder/resource.go b/stackit/internal/services/resourcemanager/folder/resource.go index f062c6972..feb506c4e 100644 --- a/stackit/internal/services/resourcemanager/folder/resource.go +++ b/stackit/internal/services/resourcemanager/folder/resource.go @@ -27,7 +27,7 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - resourcemanagerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/resourcemanager/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -66,7 +66,7 @@ func NewFolderResource() resource.Resource { // folderResource is the resource implementation. type folderResource struct { - client *resourcemanager.APIClient + client resourcemanager.DefaultAPI } // Metadata returns the resource type name. @@ -76,16 +76,12 @@ func (r *folderResource) Metadata(_ context.Context, req resource.MetadataReques // Configure adds the provider configured client to the resource. func (r *folderResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := resourcemanagerUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.ResourceManagerClient tflog.Info(ctx, "Resource Manager client configured") } @@ -207,7 +203,7 @@ func (r *folderResource) Create(ctx context.Context, req resource.CreateRequest, return } - folderCreateResp, err := r.client.DefaultAPI.CreateFolder(ctx).CreateFolderPayload(*payload).Execute() + folderCreateResp, err := r.client.CreateFolder(ctx).CreateFolderPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating folder", fmt.Sprintf("Calling API: %v", err)) return @@ -231,7 +227,7 @@ func (r *folderResource) Create(ctx context.Context, req resource.CreateRequest, // continue } - folderGetResponse, err := r.client.DefaultAPI.GetFolderDetails(ctx, folderCreateResp.ContainerId).Execute() + folderGetResponse, err := r.client.GetFolderDetails(ctx, folderCreateResp.ContainerId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating folder", fmt.Sprintf("Calling API: %v", err)) return @@ -268,7 +264,7 @@ func (r *folderResource) Read(ctx context.Context, req resource.ReadRequest, res ctx = tflog.SetField(ctx, "folder_name", folderName) ctx = tflog.SetField(ctx, "container_id", containerId) - folderResp, err := r.client.DefaultAPI.GetFolderDetails(ctx, containerId).Execute() + folderResp, err := r.client.GetFolderDetails(ctx, containerId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusForbidden { @@ -318,7 +314,7 @@ func (r *folderResource) Update(ctx context.Context, req resource.UpdateRequest, return } // Update existing folder - _, err = r.client.DefaultAPI.PartialUpdateFolder(ctx, containerId).PartialUpdateFolderPayload(*payload).Execute() + _, err = r.client.PartialUpdateFolder(ctx, containerId).PartialUpdateFolderPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating folder", fmt.Sprintf("Calling API: %v", err)) return @@ -327,7 +323,7 @@ func (r *folderResource) Update(ctx context.Context, req resource.UpdateRequest, ctx = core.LogResponse(ctx) // Fetch updated folder - folderResp, err := r.client.DefaultAPI.GetFolderDetails(ctx, containerId).Execute() + folderResp, err := r.client.GetFolderDetails(ctx, containerId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating folder", fmt.Sprintf("Calling API for updated data: %v", err)) return @@ -363,7 +359,7 @@ func (r *folderResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = tflog.SetField(ctx, "container_id", containerId) // Delete existing folder - err := r.client.DefaultAPI.DeleteFolder(ctx, containerId).Execute() + err := r.client.DeleteFolder(ctx, containerId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/resourcemanager/project/datasource.go b/stackit/internal/services/resourcemanager/project/datasource.go index 28132648f..f07f1fffe 100644 --- a/stackit/internal/services/resourcemanager/project/datasource.go +++ b/stackit/internal/services/resourcemanager/project/datasource.go @@ -6,9 +6,6 @@ import ( "net/http" "regexp" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - resourcemanagerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/resourcemanager/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/mapvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -37,7 +34,7 @@ func NewProjectDataSource() datasource.DataSource { // projectDataSource is the data source implementation. type projectDataSource struct { - client *resourcemanager.APIClient + client resourcemanager.DefaultAPI } // Metadata returns the data source type name. @@ -46,16 +43,13 @@ func (d *projectDataSource) Metadata(_ context.Context, req datasource.MetadataR } func (d *projectDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := resourcemanagerUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.client = clients.ResourceManagerClient + tflog.Info(ctx, "Resource Manager project client configured") } @@ -168,7 +162,7 @@ func (d *projectDataSource) Read(ctx context.Context, req datasource.ReadRequest identifierType = "Project" } - projectResp, err := d.client.DefaultAPI.GetProject(ctx, identifier).Execute() + projectResp, err := d.client.GetProject(ctx, identifier).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/resourcemanager/project/resource.go b/stackit/internal/services/resourcemanager/project/resource.go index 12697bbbe..55807cb67 100644 --- a/stackit/internal/services/resourcemanager/project/resource.go +++ b/stackit/internal/services/resourcemanager/project/resource.go @@ -9,7 +9,6 @@ import ( "strings" "time" - resourcemanagerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/resourcemanager/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/google/uuid" @@ -69,7 +68,7 @@ func NewProjectResource() resource.Resource { // projectResource is the resource implementation. type projectResource struct { - client *resourcemanager.APIClient + client resourcemanager.DefaultAPI } // Metadata returns the resource type name. @@ -79,16 +78,13 @@ func (r *projectResource) Metadata(_ context.Context, req resource.MetadataReque // Configure adds the provider configured client to the resource. func (r *projectResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := resourcemanagerUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.ResourceManagerClient + tflog.Info(ctx, "Resource Manager project client configured") } @@ -209,7 +205,7 @@ func (r *projectResource) Create(ctx context.Context, req resource.CreateRequest return } // Create new project - createResp, err := r.client.DefaultAPI.CreateProject(ctx).CreateProjectPayload(*payload).Execute() + createResp, err := r.client.CreateProject(ctx).CreateProjectPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating project", fmt.Sprintf("Calling API: %v", err)) return @@ -227,7 +223,7 @@ func (r *projectResource) Create(ctx context.Context, req resource.CreateRequest // If the request has not been processed yet and the containerId doesn't exist, // the waiter will fail with authentication error, so wait some time before checking the creation - waitResp, err := wait.CreateProjectWaitHandler(ctx, r.client.DefaultAPI, createResp.ContainerId).WaitWithContext(ctx) + waitResp, err := wait.CreateProjectWaitHandler(ctx, r.client, createResp.ContainerId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating project", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -267,7 +263,7 @@ func (r *projectResource) Read(ctx context.Context, req resource.ReadRequest, re } ctx = tflog.SetField(ctx, "container_id", containerId) - projectResp, err := r.client.DefaultAPI.GetProject(ctx, containerId).Execute() + projectResp, err := r.client.GetProject(ctx, containerId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusForbidden { @@ -317,7 +313,7 @@ func (r *projectResource) Update(ctx context.Context, req resource.UpdateRequest return } // Update existing project - _, err = r.client.DefaultAPI.PartialUpdateProject(ctx, containerId).PartialUpdateProjectPayload(*payload).Execute() + _, err = r.client.PartialUpdateProject(ctx, containerId).PartialUpdateProjectPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating project", fmt.Sprintf("Calling API: %v", err)) return @@ -326,7 +322,7 @@ func (r *projectResource) Update(ctx context.Context, req resource.UpdateRequest ctx = core.LogResponse(ctx) // Fetch updated project - projectResp, err := r.client.DefaultAPI.GetProject(ctx, containerId).Execute() + projectResp, err := r.client.GetProject(ctx, containerId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating project", fmt.Sprintf("Calling API for updated data: %v", err)) return @@ -362,7 +358,7 @@ func (r *projectResource) Delete(ctx context.Context, req resource.DeleteRequest ctx = tflog.SetField(ctx, "container_id", containerId) // Delete existing project - err := r.client.DefaultAPI.DeleteProject(ctx, containerId).Execute() + err := r.client.DeleteProject(ctx, containerId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -375,7 +371,7 @@ func (r *projectResource) Delete(ctx context.Context, req resource.DeleteRequest ctx = core.LogResponse(ctx) - _, err = wait.DeleteProjectWaitHandler(ctx, r.client.DefaultAPI, containerId).WaitWithContext(ctx) + _, err = wait.DeleteProjectWaitHandler(ctx, r.client, containerId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting project", fmt.Sprintf("Instance deletion waiting: %v", err)) return diff --git a/stackit/internal/services/resourcemanager/utils/util.go b/stackit/internal/services/resourcemanager/utils/util.go deleted file mode 100644 index e7aed8efd..000000000 --- a/stackit/internal/services/resourcemanager/utils/util.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - resourcemanager "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager/v0api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *resourcemanager.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.ResourceManagerCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.ResourceManagerCustomEndpoint)) - } - apiClient, err := resourcemanager.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/resourcemanager/utils/util_test.go b/stackit/internal/services/resourcemanager/utils/util_test.go deleted file mode 100644 index 417df63f0..000000000 --- a/stackit/internal/services/resourcemanager/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - resourcemanager "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager/v0api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://resourcemanager-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *resourcemanager.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *resourcemanager.APIClient { - apiClient, err := resourcemanager.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - ResourceManagerCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *resourcemanager.APIClient { - apiClient, err := resourcemanager.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/scf/organization/datasource.go b/stackit/internal/services/scf/organization/datasource.go index 7cf9f43bc..112f6af28 100644 --- a/stackit/internal/services/scf/organization/datasource.go +++ b/stackit/internal/services/scf/organization/datasource.go @@ -12,9 +12,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" scf "github.com/stackitcloud/stackit-sdk-go/services/scf/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - scfUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/scf/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -32,22 +31,19 @@ func NewScfOrganizationDataSource() datasource.DataSource { // scfOrganizationDataSource is the datasource implementation. type scfOrganizationDataSource struct { - client *scf.APIClient + client scf.DefaultAPI providerData core.ProviderData } func (s *scfOrganizationDataSource) Configure(ctx context.Context, request datasource.ConfigureRequest, response *datasource.ConfigureResponse) { - var ok bool - s.providerData, ok = conversion.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) if !ok { return } - apiClient := scfUtils.ConfigureClient(ctx, &s.providerData, &response.Diagnostics) - if response.Diagnostics.HasError() { - return - } - s.client = apiClient + s.providerData = providerData + s.client = clients.ScfV1Client + tflog.Info(ctx, "scf client configured") } @@ -149,7 +145,7 @@ func (s *scfOrganizationDataSource) Read(ctx context.Context, request datasource ctx = tflog.SetField(ctx, "region", region) // Read the current scf organization via orgId - scfOrgResponse, err := s.client.DefaultAPI.GetOrganization(ctx, projectId, region, orgId).Execute() + scfOrgResponse, err := s.client.GetOrganization(ctx, projectId, region, orgId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/scf/organization/resource.go b/stackit/internal/services/scf/organization/resource.go index 6ad771932..10e57a61a 100644 --- a/stackit/internal/services/scf/organization/resource.go +++ b/stackit/internal/services/scf/organization/resource.go @@ -20,9 +20,8 @@ import ( scf "github.com/stackitcloud/stackit-sdk-go/services/scf/v1api" "github.com/stackitcloud/stackit-sdk-go/services/scf/v1api/wait" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - scfUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/scf/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -56,7 +55,7 @@ func NewScfOrganizationResource() resource.Resource { // scfOrganizationResource implements the resource interface for scf organization. type scfOrganizationResource struct { - client *scf.APIClient + client scf.DefaultAPI providerData core.ProviderData } @@ -76,17 +75,14 @@ var descriptions = map[string]string{ } func (s *scfOrganizationResource) Configure(ctx context.Context, request resource.ConfigureRequest, response *resource.ConfigureResponse) { - var ok bool - s.providerData, ok = conversion.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) if !ok { return } - apiClient := scfUtils.ConfigureClient(ctx, &s.providerData, &response.Diagnostics) - if response.Diagnostics.HasError() { - return - } - s.client = apiClient + s.providerData = providerData + s.client = clients.ScfV1Client + tflog.Info(ctx, "scf client configured") } @@ -249,7 +245,7 @@ func (s *scfOrganizationResource) Create(ctx context.Context, request resource.C } // Create the new scf organization via the API client. - scfOrgCreateResponse, err := s.client.DefaultAPI.CreateOrganization(ctx, projectId, region). + scfOrgCreateResponse, err := s.client.CreateOrganization(ctx, projectId, region). CreateOrganizationPayload(payload). Execute() if err != nil { @@ -269,7 +265,7 @@ func (s *scfOrganizationResource) Create(ctx context.Context, request resource.C // Apply the org quota if provided if quotaId != "" { - applyOrgQuota, err := s.client.DefaultAPI.ApplyOrganizationQuota(ctx, projectId, region, orgId).ApplyOrganizationQuotaPayload( + applyOrgQuota, err := s.client.ApplyOrganizationQuota(ctx, projectId, region, orgId).ApplyOrganizationQuotaPayload( scf.ApplyOrganizationQuotaPayload{ QuotaId: quotaId, }).Execute() @@ -281,7 +277,7 @@ func (s *scfOrganizationResource) Create(ctx context.Context, request resource.C } if suspended { - _, err := s.client.DefaultAPI.UpdateOrganization(ctx, projectId, region, orgId).UpdateOrganizationPayload( + _, err := s.client.UpdateOrganization(ctx, projectId, region, orgId).UpdateOrganizationPayload( scf.UpdateOrganizationPayload{ Suspended: &suspended, @@ -293,7 +289,7 @@ func (s *scfOrganizationResource) Create(ctx context.Context, request resource.C } // Load the newly created scf organization - scfOrgResponse, err := s.client.DefaultAPI.GetOrganization(ctx, projectId, region, orgId).Execute() + scfOrgResponse, err := s.client.GetOrganization(ctx, projectId, region, orgId).Execute() if err != nil { core.LogAndAddError(ctx, &response.Diagnostics, "Error creating scf organization", fmt.Sprintf("Calling API to load created org: %v", err)) return @@ -340,7 +336,7 @@ func (s *scfOrganizationResource) Read(ctx context.Context, request resource.Rea ctx = tflog.SetField(ctx, "org_id", orgId) ctx = tflog.SetField(ctx, "region", region) // Read the current scf organization via guid - scfOrgResponse, err := s.client.DefaultAPI.GetOrganization(ctx, projectId, region, orgId).Execute() + scfOrgResponse, err := s.client.GetOrganization(ctx, projectId, region, orgId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) @@ -389,7 +385,7 @@ func (s *scfOrganizationResource) Update(ctx context.Context, request resource.U ctx = tflog.SetField(ctx, "org_id", orgId) ctx = tflog.SetField(ctx, "region", region) - org, err := s.client.DefaultAPI.GetOrganization(ctx, projectId, region, orgId).Execute() + org, err := s.client.GetOrganization(ctx, projectId, region, orgId).Execute() if err != nil { core.LogAndAddError(ctx, &response.Diagnostics, "Error retrieving organization state", fmt.Sprintf("Getting organization state: %v", err)) return @@ -397,7 +393,7 @@ func (s *scfOrganizationResource) Update(ctx context.Context, request resource.U // handle a change of the organization name or the suspended flag if name != org.GetName() || suspended != org.GetSuspended() { - updatedOrg, err := s.client.DefaultAPI.UpdateOrganization(ctx, projectId, region, orgId).UpdateOrganizationPayload( + updatedOrg, err := s.client.UpdateOrganization(ctx, projectId, region, orgId).UpdateOrganizationPayload( scf.UpdateOrganizationPayload{ Name: &name, Suspended: &suspended, @@ -413,7 +409,7 @@ func (s *scfOrganizationResource) Update(ctx context.Context, request resource.U // handle a quota change of the org if quotaId != org.GetQuotaId() { - applyOrgQuota, err := s.client.DefaultAPI.ApplyOrganizationQuota(ctx, projectId, region, orgId).ApplyOrganizationQuotaPayload( + applyOrgQuota, err := s.client.ApplyOrganizationQuota(ctx, projectId, region, orgId).ApplyOrganizationQuotaPayload( scf.ApplyOrganizationQuotaPayload{ QuotaId: quotaId, }).Execute() @@ -461,7 +457,7 @@ func (s *scfOrganizationResource) Delete(ctx context.Context, request resource.D ctx = tflog.SetField(ctx, "region", region) // Call API to delete the existing scf organization. - _, err := s.client.DefaultAPI.DeleteOrganization(ctx, projectId, region, orgId).Execute() + _, err := s.client.DeleteOrganization(ctx, projectId, region, orgId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -473,7 +469,7 @@ func (s *scfOrganizationResource) Delete(ctx context.Context, request resource.D ctx = core.LogResponse(ctx) - _, err = wait.DeleteOrganizationWaitHandler(ctx, s.client.DefaultAPI, projectId, model.Region.ValueString(), orgId).WaitWithContext(ctx) + _, err = wait.DeleteOrganizationWaitHandler(ctx, s.client, projectId, model.Region.ValueString(), orgId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &response.Diagnostics, "Error waiting for scf org deletion", fmt.Sprintf("SCFOrganization deleting waiting: %v", err)) return diff --git a/stackit/internal/services/scf/organizationmanager/datasource.go b/stackit/internal/services/scf/organizationmanager/datasource.go index 0de8b9a73..5679594a8 100644 --- a/stackit/internal/services/scf/organizationmanager/datasource.go +++ b/stackit/internal/services/scf/organizationmanager/datasource.go @@ -13,9 +13,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" scf "github.com/stackitcloud/stackit-sdk-go/services/scf/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - scfUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/scf/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -45,22 +44,19 @@ func NewScfOrganizationManagerDataSource() datasource.DataSource { // scfOrganizationManagerDataSource is the datasource implementation. type scfOrganizationManagerDataSource struct { - client *scf.APIClient + client scf.DefaultAPI providerData core.ProviderData } func (s *scfOrganizationManagerDataSource) Configure(ctx context.Context, request datasource.ConfigureRequest, response *datasource.ConfigureResponse) { - var ok bool - s.providerData, ok = conversion.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) if !ok { return } - apiClient := scfUtils.ConfigureClient(ctx, &s.providerData, &response.Diagnostics) - if response.Diagnostics.HasError() { - return - } - s.client = apiClient + s.providerData = providerData + s.client = clients.ScfV1Client + tflog.Info(ctx, "scf client configured for scfOrganizationManagerDataSource") } @@ -152,7 +148,7 @@ func (s *scfOrganizationManagerDataSource) Read(ctx context.Context, request dat ctx = tflog.SetField(ctx, "org_id", orgId) ctx = tflog.SetField(ctx, "region", region) // Read the current scf organization manager via orgId - ScfOrgManager, err := s.client.DefaultAPI.GetOrgManager(ctx, projectId, region, orgId).Execute() + ScfOrgManager, err := s.client.GetOrgManager(ctx, projectId, region, orgId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/scf/organizationmanager/resource.go b/stackit/internal/services/scf/organizationmanager/resource.go index 77b4b5264..53c969535 100644 --- a/stackit/internal/services/scf/organizationmanager/resource.go +++ b/stackit/internal/services/scf/organizationmanager/resource.go @@ -18,9 +18,8 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" scf "github.com/stackitcloud/stackit-sdk-go/services/scf/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - scfUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/scf/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -53,7 +52,7 @@ func NewScfOrganizationManagerResource() resource.Resource { // scfOrganizationManagerResource implements the resource interface for scf organization manager. type scfOrganizationManagerResource struct { - client *scf.APIClient + client scf.DefaultAPI providerData core.ProviderData } @@ -72,17 +71,14 @@ var descriptions = map[string]string{ } func (s *scfOrganizationManagerResource) Configure(ctx context.Context, request resource.ConfigureRequest, response *resource.ConfigureResponse) { // nolint:gocritic // function signature required by Terraform - var ok bool - s.providerData, ok = conversion.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) if !ok { return } - apiClient := scfUtils.ConfigureClient(ctx, &s.providerData, &response.Diagnostics) - if response.Diagnostics.HasError() { - return - } - s.client = apiClient + s.providerData = providerData + s.client = clients.ScfV1Client + tflog.Info(ctx, "scf client configured") } @@ -230,7 +226,7 @@ func (s *scfOrganizationManagerResource) Create(ctx context.Context, request res } // Create the new scf organization manager via the API client. - scfOrgManagerCreateResponse, err := s.client.DefaultAPI.CreateOrgManager(ctx, projectId, region, orgId).Execute() + scfOrgManagerCreateResponse, err := s.client.CreateOrgManager(ctx, projectId, region, orgId).Execute() if err != nil { core.LogAndAddError(ctx, &response.Diagnostics, "Error creating scf organization manager", fmt.Sprintf("Calling API to create org manager: %v", err)) return @@ -281,7 +277,7 @@ func (s *scfOrganizationManagerResource) Read(ctx context.Context, request resou ctx = tflog.SetField(ctx, "region", region) // Read the current scf organization manager via orgId - scfOrgManager, err := s.client.DefaultAPI.GetOrgManager(ctx, projectId, region, orgId).Execute() + scfOrgManager, err := s.client.GetOrgManager(ctx, projectId, region, orgId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -331,7 +327,7 @@ func (s *scfOrganizationManagerResource) Delete(ctx context.Context, request res ctx = tflog.SetField(ctx, "region", region) // Call API to delete the existing scf organization manager. - _, err := s.client.DefaultAPI.DeleteOrgManager(ctx, projectId, region, orgId).Execute() + _, err := s.client.DeleteOrgManager(ctx, projectId, region, orgId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && (oapiErr.StatusCode == http.StatusGone || oapiErr.StatusCode == http.StatusNotFound) { diff --git a/stackit/internal/services/scf/platform/datasource.go b/stackit/internal/services/scf/platform/datasource.go index 70f533ca2..b05f74fda 100644 --- a/stackit/internal/services/scf/platform/datasource.go +++ b/stackit/internal/services/scf/platform/datasource.go @@ -12,9 +12,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" scf "github.com/stackitcloud/stackit-sdk-go/services/scf/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - scfUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/scf/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -32,22 +31,19 @@ func NewScfPlatformDataSource() datasource.DataSource { // scfPlatformDataSource is the datasource implementation. type scfPlatformDataSource struct { - client *scf.APIClient + client scf.DefaultAPI providerData core.ProviderData } func (s *scfPlatformDataSource) Configure(ctx context.Context, request datasource.ConfigureRequest, response *datasource.ConfigureResponse) { - var ok bool - s.providerData, ok = conversion.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, request.ProviderData, &response.Diagnostics) if !ok { return } - apiClient := scfUtils.ConfigureClient(ctx, &s.providerData, &response.Diagnostics) - if response.Diagnostics.HasError() { - return - } - s.client = apiClient + s.providerData = providerData + s.client = clients.ScfV1Client + tflog.Info(ctx, "scf client configured for platform") } @@ -147,7 +143,7 @@ func (s *scfPlatformDataSource) Read(ctx context.Context, request datasource.Rea ctx = tflog.SetField(ctx, "region", region) // Read the scf platform - scfPlatformResponse, err := s.client.DefaultAPI.GetPlatform(ctx, projectId, region, platformId).Execute() + scfPlatformResponse, err := s.client.GetPlatform(ctx, projectId, region, platformId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/scf/utils/utils.go b/stackit/internal/services/scf/utils/utils.go deleted file mode 100644 index b2b4b65f6..000000000 --- a/stackit/internal/services/scf/utils/utils.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - scf "github.com/stackitcloud/stackit-sdk-go/services/scf/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *scf.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.ScfCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.ScfCustomEndpoint)) - } - apiClient, err := scf.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/scf/utils/utils_test.go b/stackit/internal/services/scf/utils/utils_test.go deleted file mode 100644 index 363788bcb..000000000 --- a/stackit/internal/services/scf/utils/utils_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - scf "github.com/stackitcloud/stackit-sdk-go/services/scf/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "0.8.15" - testCustomEndpoint = "https://scf-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *scf.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *scf.APIClient { - apiClient, err := scf.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - ScfCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *scf.APIClient { - apiClient, err := scf.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/secretsmanager/instance/datasource.go b/stackit/internal/services/secretsmanager/instance/datasource.go index fedbd09f0..5b9d1a732 100644 --- a/stackit/internal/services/secretsmanager/instance/datasource.go +++ b/stackit/internal/services/secretsmanager/instance/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - secretsmanagerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/secretsmanager/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types" @@ -33,7 +30,7 @@ func NewInstanceDataSource() datasource.DataSource { // instanceDataSource is the data source implementation. type instanceDataSource struct { - client *secretsmanager.APIClient + client secretsmanager.DefaultAPI } // Metadata returns the data source type name. @@ -43,16 +40,13 @@ func (r *instanceDataSource) Metadata(_ context.Context, req datasource.Metadata // Configure adds the provider configured client to the data source. func (r *instanceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := secretsmanagerUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.SecretsmanagerV1Client + tflog.Info(ctx, "Secrets Manager instance client configured") } @@ -146,7 +140,7 @@ func (r *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "instance_id", instanceId) - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, instanceId).Execute() if err != nil { utils.LogError( ctx, @@ -164,7 +158,7 @@ func (r *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = core.LogResponse(ctx) - aclList, err := r.client.DefaultAPI.ListACLs(ctx, projectId, instanceId).Execute() + aclList, err := r.client.ListACLs(ctx, projectId, instanceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Calling API for ACL data: %v", err)) return diff --git a/stackit/internal/services/secretsmanager/instance/resource.go b/stackit/internal/services/secretsmanager/instance/resource.go index 04c518cdc..9cddba49b 100644 --- a/stackit/internal/services/secretsmanager/instance/resource.go +++ b/stackit/internal/services/secretsmanager/instance/resource.go @@ -9,15 +9,12 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - secretsmanagerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/secretsmanager/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/setvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -60,7 +57,7 @@ func NewInstanceResource() resource.Resource { // instanceResource is the resource implementation. type instanceResource struct { - client *secretsmanager.APIClient + client secretsmanager.DefaultAPI } // Metadata returns the resource type name. @@ -70,16 +67,13 @@ func (r *instanceResource) Metadata(_ context.Context, req resource.MetadataRequ // Configure adds the provider configured client to the resource. func (r *instanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := secretsmanagerUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.SecretsmanagerV1Client + tflog.Info(ctx, "Secrets Manager instance client configured") } @@ -205,7 +199,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } // Create new instance - createResp, err := r.client.DefaultAPI.CreateInstance(ctx, projectId).CreateInstancePayload(*payload).Execute() + createResp, err := r.client.CreateInstance(ctx, projectId).CreateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -229,7 +223,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Creating ACL: %v", err)) return } - aclList, err := r.client.DefaultAPI.ListACLs(ctx, projectId, instanceId).Execute() + aclList, err := r.client.ListACLs(ctx, projectId, instanceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API for ACL data: %v", err)) return @@ -272,7 +266,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "instance_id", instanceId) - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -285,7 +279,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = core.LogResponse(ctx) - aclList, err := r.client.DefaultAPI.ListACLs(ctx, projectId, instanceId).Execute() + aclList, err := r.client.ListACLs(ctx, projectId, instanceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Calling API for ACL data: %v", err)) return @@ -330,7 +324,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques return } // Update instance - err = r.client.DefaultAPI.UpdateInstance(ctx, projectId, instanceId).UpdateInstancePayload(*payload).Execute() + err = r.client.UpdateInstance(ctx, projectId, instanceId).UpdateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -354,7 +348,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques return } - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, instanceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance acl", fmt.Sprintf("Calling API: %v", err)) return @@ -362,7 +356,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques ctx = core.LogResponse(ctx) - aclList, err := r.client.DefaultAPI.ListACLs(ctx, projectId, instanceId).Execute() + aclList, err := r.client.ListACLs(ctx, projectId, instanceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Calling API for ACL data: %v", err)) return @@ -401,7 +395,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = tflog.SetField(ctx, "instance_id", instanceId) // Delete existing instance - err := r.client.DefaultAPI.DeleteInstance(ctx, projectId, instanceId).Execute() + err := r.client.DeleteInstance(ctx, projectId, instanceId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -539,9 +533,9 @@ func toUpdatePayload(model *Model) (*secretsmanager.UpdateInstancePayload, error } // updateACL creates and deletes ACL so that the instance's ACL are the ones in the model -func updateACL(ctx context.Context, projectId, instanceId string, acl []string, client *secretsmanager.APIClient) error { +func updateACL(ctx context.Context, projectId, instanceId string, acl []string, client secretsmanager.DefaultAPI) error { // Get ACL current state - currentACLResp, err := client.DefaultAPI.ListACLs(ctx, projectId, instanceId).Execute() + currentACLResp, err := client.ListACLs(ctx, projectId, instanceId).Execute() if err != nil { return fmt.Errorf("fetching current ACL: %w", err) } @@ -572,14 +566,14 @@ func updateACL(ctx context.Context, projectId, instanceId string, acl []string, payload := secretsmanager.CreateACLPayload{ Cidr: cidr, } - _, err := client.DefaultAPI.CreateACL(ctx, projectId, instanceId).CreateACLPayload(payload).Execute() + _, err := client.CreateACL(ctx, projectId, instanceId).CreateACLPayload(payload).Execute() if err != nil { return fmt.Errorf("creating ACL '%v': %w", cidr, err) } } if !state.isInModel && state.isCreated { - err := client.DefaultAPI.DeleteACL(ctx, projectId, instanceId, state.id).Execute() + err := client.DeleteACL(ctx, projectId, instanceId, state.id).Execute() if err != nil { return fmt.Errorf("deleting ACL '%v': %w", cidr, err) } diff --git a/stackit/internal/services/secretsmanager/instance/resource_test.go b/stackit/internal/services/secretsmanager/instance/resource_test.go index 849e4a403..4e7a24c34 100644 --- a/stackit/internal/services/secretsmanager/instance/resource_test.go +++ b/stackit/internal/services/secretsmanager/instance/resource_test.go @@ -491,7 +491,7 @@ func TestUpdateACL(t *testing.T) { } // Run test - err = updateACL(context.Background(), "pid", "iid", tt.acl, client) + err = updateACL(context.Background(), "pid", "iid", tt.acl, client.DefaultAPI) if !tt.isValid && err == nil { t.Fatalf("Should have failed") } diff --git a/stackit/internal/services/secretsmanager/user/datasource.go b/stackit/internal/services/secretsmanager/user/datasource.go index 2064f9dc0..efb30643f 100644 --- a/stackit/internal/services/secretsmanager/user/datasource.go +++ b/stackit/internal/services/secretsmanager/user/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - secretsmanagerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/secretsmanager/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -43,7 +40,7 @@ func NewUserDataSource() datasource.DataSource { // userDataSource is the data source implementation. type userDataSource struct { - client *secretsmanager.APIClient + client secretsmanager.DefaultAPI } // Metadata returns the data source type name. @@ -53,16 +50,13 @@ func (r *userDataSource) Metadata(_ context.Context, req datasource.MetadataRequ // Configure adds the provider configured client to the data source. func (r *userDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := secretsmanagerUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.SecretsmanagerV1Client + tflog.Info(ctx, "Secrets Manager user client configured") } @@ -144,7 +138,7 @@ func (r *userDataSource) Read(ctx context.Context, req datasource.ReadRequest, r ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "user_id", userId) - userResp, err := r.client.DefaultAPI.GetUser(ctx, projectId, instanceId, userId).Execute() + userResp, err := r.client.GetUser(ctx, projectId, instanceId, userId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/secretsmanager/user/resource.go b/stackit/internal/services/secretsmanager/user/resource.go index 32268b56a..89af3cf0f 100644 --- a/stackit/internal/services/secretsmanager/user/resource.go +++ b/stackit/internal/services/secretsmanager/user/resource.go @@ -11,8 +11,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - secretsmanagerUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/secretsmanager/utils" - "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -59,7 +57,7 @@ func NewUserResource() resource.Resource { // userResource is the resource implementation. type userResource struct { - client *secretsmanager.APIClient + client secretsmanager.DefaultAPI } // Metadata returns the resource type name. @@ -69,16 +67,13 @@ func (r *userResource) Metadata(_ context.Context, req resource.MetadataRequest, // Configure adds the provider configured client to the resource. func (r *userResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := secretsmanagerUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.SecretsmanagerV1Client + tflog.Info(ctx, "Secrets Manager user client configured") } @@ -195,7 +190,7 @@ func (r *userResource) Create(ctx context.Context, req resource.CreateRequest, r return } // Create new user - userResp, err := r.client.DefaultAPI.CreateUser(ctx, projectId, instanceId).CreateUserPayload(*payload).Execute() + userResp, err := r.client.CreateUser(ctx, projectId, instanceId).CreateUserPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating user", fmt.Sprintf("Calling API: %v", err)) return @@ -251,7 +246,7 @@ func (r *userResource) Read(ctx context.Context, req resource.ReadRequest, resp ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "user_id", userId) - userResp, err := r.client.DefaultAPI.GetUser(ctx, projectId, instanceId, userId).Execute() + userResp, err := r.client.GetUser(ctx, projectId, instanceId, userId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -306,7 +301,7 @@ func (r *userResource) Update(ctx context.Context, req resource.UpdateRequest, r return } // Update existing user - err = r.client.DefaultAPI.UpdateUser(ctx, projectId, instanceId, userId).UpdateUserPayload(*payload).Execute() + err = r.client.UpdateUser(ctx, projectId, instanceId, userId).UpdateUserPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating user", err.Error()) return @@ -314,7 +309,7 @@ func (r *userResource) Update(ctx context.Context, req resource.UpdateRequest, r ctx = core.LogResponse(ctx) - user, err := r.client.DefaultAPI.GetUser(ctx, projectId, instanceId, userId).Execute() + user, err := r.client.GetUser(ctx, projectId, instanceId, userId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating user", fmt.Sprintf("Calling API to get user's current state: %v", err)) return @@ -359,7 +354,7 @@ func (r *userResource) Delete(ctx context.Context, req resource.DeleteRequest, r ctx = tflog.SetField(ctx, "user_id", userId) // Delete existing user - err := r.client.DefaultAPI.DeleteUser(ctx, projectId, instanceId, userId).Execute() + err := r.client.DeleteUser(ctx, projectId, instanceId, userId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/secretsmanager/utils/util.go b/stackit/internal/services/secretsmanager/utils/util.go deleted file mode 100644 index 8737fea36..000000000 --- a/stackit/internal/services/secretsmanager/utils/util.go +++ /dev/null @@ -1,52 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - secretsmanagerV1Alpha "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager/v1alphaapi" - secretsmanager "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *secretsmanager.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.SecretsManagerCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.SecretsManagerCustomEndpoint)) - } else { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithRegion(providerData.GetRegion())) - } - apiClient, err := secretsmanager.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} - -func ConfigureV1AlphaClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *secretsmanagerV1Alpha.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.SecretsManagerCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.SecretsManagerCustomEndpoint)) - } else { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithRegion(providerData.GetRegion())) - } - apiClient, err := secretsmanagerV1Alpha.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/secretsmanager/utils/util_test.go b/stackit/internal/services/secretsmanager/utils/util_test.go deleted file mode 100644 index 4c0006e4f..000000000 --- a/stackit/internal/services/secretsmanager/utils/util_test.go +++ /dev/null @@ -1,171 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - secretsmanager "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager/v1api" - - secretsmanagerV1Alpha "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager/v1alphaapi" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://secretsmanager-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *secretsmanager.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *secretsmanager.APIClient { - apiClient, err := secretsmanager.NewAPIClient( - config.WithRegion("eu01"), - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - SecretsManagerCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *secretsmanager.APIClient { - apiClient, err := secretsmanager.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} - -func TestConfigureV1AlphaClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *secretsmanagerV1Alpha.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *secretsmanagerV1Alpha.APIClient { - apiClient, err := secretsmanagerV1Alpha.NewAPIClient( - config.WithRegion("eu01"), - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - SecretsManagerCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *secretsmanagerV1Alpha.APIClient { - apiClient, err := secretsmanagerV1Alpha.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureV1AlphaClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureV1AlphaClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureV1AlphaClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/serverbackup/enable/datasource.go b/stackit/internal/services/serverbackup/enable/datasource.go index b892208ce..b89e810c1 100644 --- a/stackit/internal/services/serverbackup/enable/datasource.go +++ b/stackit/internal/services/serverbackup/enable/datasource.go @@ -12,9 +12,7 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" serverbackup "github.com/stackitcloud/stackit-sdk-go/services/serverbackup/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - serverBackupUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serverbackup/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -39,7 +37,7 @@ func NewServerBackupEnableDataSource() datasource.DataSource { // serverBackupEnableDataSource is the data source implementation. type serverBackupEnableDataSource struct { - client *serverbackup.APIClient + client serverbackup.DefaultAPI providerData core.ProviderData } @@ -50,17 +48,14 @@ func (d *serverBackupEnableDataSource) Metadata(_ context.Context, req datasourc // Configure adds the provider configured client to the data source. func (d *serverBackupEnableDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serverBackupUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.ServerBackupV2Client + tflog.Info(ctx, "Server backup client client configured") } @@ -130,7 +125,7 @@ func (d *serverBackupEnableDataSource) Read(ctx context.Context, req datasource. ctx = tflog.SetField(ctx, "server_id", serverId) ctx = tflog.SetField(ctx, "region", region) - serviceResp, err := d.client.DefaultAPI.GetServiceResource(ctx, projectId, serverId, region).Execute() + serviceResp, err := d.client.GetServiceResource(ctx, projectId, serverId, region).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/serverbackup/enable/resource.go b/stackit/internal/services/serverbackup/enable/resource.go index 316b3ca60..a63132627 100644 --- a/stackit/internal/services/serverbackup/enable/resource.go +++ b/stackit/internal/services/serverbackup/enable/resource.go @@ -17,9 +17,7 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" serverbackup "github.com/stackitcloud/stackit-sdk-go/services/serverbackup/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - serverBackupUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serverbackup/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -46,7 +44,7 @@ func NewServerBackupEnableResource() resource.Resource { // serverBackupEnableResource is the resource implementation. type serverBackupEnableResource struct { - client *serverbackup.APIClient + client serverbackup.DefaultAPI providerData core.ProviderData } @@ -88,16 +86,14 @@ func (r *serverBackupEnableResource) Metadata(_ context.Context, req resource.Me // Configure adds the provider configured client to the resource. func (r *serverBackupEnableResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serverBackupUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ServerBackupV2Client + tflog.Info(ctx, "Server backup client configured") } @@ -189,7 +185,7 @@ func (r *serverBackupEnableResource) Create(ctx context.Context, req resource.Cr ctx = tflog.SetField(ctx, "server_id", serverId) ctx = tflog.SetField(ctx, "region", region) - err := r.client.DefaultAPI.EnableServiceResource(ctx, projectId, serverId, region).EnableServiceResourcePayload(serverbackup.EnableServiceResourcePayload{}).Execute() + err := r.client.EnableServiceResource(ctx, projectId, serverId, region).EnableServiceResourcePayload(serverbackup.EnableServiceResourcePayload{}).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) @@ -201,7 +197,7 @@ func (r *serverBackupEnableResource) Create(ctx context.Context, req resource.Cr tflog.Info(ctx, "Server backup is already enabled for this server. Please check duplicate resources.") } - serviceResp, err := r.client.DefaultAPI.GetServiceResource(ctx, projectId, serverId, region).Execute() + serviceResp, err := r.client.GetServiceResource(ctx, projectId, serverId, region).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading server backup enable", fmt.Sprintf("Calling API: %v", err)) return @@ -243,7 +239,7 @@ func (r *serverBackupEnableResource) Read(ctx context.Context, req resource.Read ctx = tflog.SetField(ctx, "server_id", serverId) ctx = tflog.SetField(ctx, "region", region) - serviceResp, err := r.client.DefaultAPI.GetServiceResource(ctx, projectId, serverId, region).Execute() + serviceResp, err := r.client.GetServiceResource(ctx, projectId, serverId, region).Execute() if err != nil { oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped if ok && oapiErr.StatusCode == http.StatusNotFound { @@ -297,7 +293,7 @@ func (r *serverBackupEnableResource) Delete(ctx context.Context, req resource.De ctx = tflog.SetField(ctx, "server_id", serverId) ctx = tflog.SetField(ctx, "region", region) - err := r.client.DefaultAPI.DisableServiceResource(ctx, projectId, serverId, region).Execute() + err := r.client.DisableServiceResource(ctx, projectId, serverId, region).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/serverbackup/schedule/resource.go b/stackit/internal/services/serverbackup/schedule/resource.go index 6b386ef10..167d8e0a3 100644 --- a/stackit/internal/services/serverbackup/schedule/resource.go +++ b/stackit/internal/services/serverbackup/schedule/resource.go @@ -13,8 +13,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/resource/schema/int32planmodifier" - serverbackupUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serverbackup/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/resource" @@ -25,7 +23,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -68,7 +65,7 @@ func NewScheduleResource() resource.Resource { // scheduleResource is the resource implementation. type scheduleResource struct { - client *serverbackup.APIClient + client serverbackup.DefaultAPI providerData core.ProviderData } @@ -110,16 +107,14 @@ func (r *scheduleResource) Metadata(_ context.Context, req resource.MetadataRequ // Configure adds the provider configured client to the resource. func (r *scheduleResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serverbackupUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ServerBackupV2Client + tflog.Info(ctx, "Server backup client configured.") } @@ -269,7 +264,7 @@ func (r *scheduleResource) Create(ctx context.Context, req resource.CreateReques core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating server backup schedule", fmt.Sprintf("Creating API payload: %v", err)) return } - scheduleResp, err := r.client.DefaultAPI.CreateBackupSchedule(ctx, projectId, serverId, region).CreateBackupSchedulePayload(*payload).Execute() + scheduleResp, err := r.client.CreateBackupSchedule(ctx, projectId, serverId, region).CreateBackupSchedulePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating server backup schedule", fmt.Sprintf("Calling API: %v", err)) return @@ -319,7 +314,7 @@ func (r *scheduleResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = tflog.SetField(ctx, "backup_schedule_id", backupScheduleId) ctx = tflog.SetField(ctx, "region", region) - scheduleResp, err := r.client.DefaultAPI.GetBackupSchedule(ctx, projectId, serverId, region, strconv.FormatInt(int64(backupScheduleId), 10)).Execute() + scheduleResp, err := r.client.GetBackupSchedule(ctx, projectId, serverId, region, strconv.FormatInt(int64(backupScheduleId), 10)).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -376,7 +371,7 @@ func (r *scheduleResource) Update(ctx context.Context, req resource.UpdateReques return } - scheduleResp, err := r.client.DefaultAPI.UpdateBackupSchedule(ctx, projectId, serverId, region, strconv.FormatInt(int64(backupScheduleId), 10)).UpdateBackupSchedulePayload(*payload).Execute() + scheduleResp, err := r.client.UpdateBackupSchedule(ctx, projectId, serverId, region, strconv.FormatInt(int64(backupScheduleId), 10)).UpdateBackupSchedulePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating server backup schedule", fmt.Sprintf("Calling API: %v", err)) return @@ -419,7 +414,7 @@ func (r *scheduleResource) Delete(ctx context.Context, req resource.DeleteReques ctx = tflog.SetField(ctx, "backup_schedule_id", backupScheduleId) ctx = tflog.SetField(ctx, "region", region) - err := r.client.DefaultAPI.DeleteBackupSchedule(ctx, projectId, serverId, region, strconv.FormatInt(int64(backupScheduleId), 10)).Execute() + err := r.client.DeleteBackupSchedule(ctx, projectId, serverId, region, strconv.FormatInt(int64(backupScheduleId), 10)).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -528,7 +523,7 @@ func (r *scheduleResource) enableBackupsService(ctx context.Context, model *Mode region := r.providerData.GetRegionWithOverride(model.Region) tflog.Debug(ctx, "Enabling server backup service") - request := r.client.DefaultAPI.EnableServiceResource(ctx, projectId, serverId, region). + request := r.client.EnableServiceResource(ctx, projectId, serverId, region). EnableServiceResourcePayload(serverbackup.EnableServiceResourcePayload{}) if err := request.Execute(); err != nil { @@ -553,7 +548,7 @@ func (r *scheduleResource) disableBackupsService(ctx context.Context, model *Mod region := r.providerData.GetRegionWithOverride(model.Region) tflog.Debug(ctx, "Checking for existing backups") - backups, err := r.client.DefaultAPI.ListBackups(ctx, projectId, serverId, region).Execute() + backups, err := r.client.ListBackups(ctx, projectId, serverId, region).Execute() if err != nil { return fmt.Errorf("list backups: %w", err) } @@ -562,7 +557,7 @@ func (r *scheduleResource) disableBackupsService(ctx context.Context, model *Mod return nil } - err = r.client.DefaultAPI.DisableServiceResource(ctx, projectId, serverId, region).Execute() + err = r.client.DisableServiceResource(ctx, projectId, serverId, region).Execute() if err != nil { return fmt.Errorf("disable server backup service: %w", err) } diff --git a/stackit/internal/services/serverbackup/schedule/schedule_datasource.go b/stackit/internal/services/serverbackup/schedule/schedule_datasource.go index 31874bdef..dcccb2582 100644 --- a/stackit/internal/services/serverbackup/schedule/schedule_datasource.go +++ b/stackit/internal/services/serverbackup/schedule/schedule_datasource.go @@ -6,9 +6,6 @@ import ( "net/http" "strconv" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - serverbackupUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serverbackup/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -34,7 +31,7 @@ func NewScheduleDataSource() datasource.DataSource { // scheduleDataSource is the data source implementation. type scheduleDataSource struct { - client *serverbackup.APIClient + client serverbackup.DefaultAPI providerData core.ProviderData } @@ -45,17 +42,14 @@ func (r *scheduleDataSource) Metadata(_ context.Context, req datasource.Metadata // Configure adds the provider configured client to the data source. func (r *scheduleDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serverbackupUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ServerBackupV2Client + tflog.Info(ctx, "Server backup client configured") } @@ -146,7 +140,7 @@ func (r *scheduleDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = tflog.SetField(ctx, "backup_schedule_id", backupScheduleId) ctx = tflog.SetField(ctx, "region", region) - scheduleResp, err := r.client.DefaultAPI.GetBackupSchedule(ctx, projectId, serverId, region, strconv.FormatInt(int64(backupScheduleId), 10)).Execute() + scheduleResp, err := r.client.GetBackupSchedule(ctx, projectId, serverId, region, strconv.FormatInt(int64(backupScheduleId), 10)).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/serverbackup/schedule/schedules_datasource.go b/stackit/internal/services/serverbackup/schedule/schedules_datasource.go index b7655d32c..895df089c 100644 --- a/stackit/internal/services/serverbackup/schedule/schedules_datasource.go +++ b/stackit/internal/services/serverbackup/schedule/schedules_datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - serverbackupUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serverbackup/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types" @@ -33,7 +30,7 @@ func NewSchedulesDataSource() datasource.DataSource { // schedulesDataSource is the data source implementation. type schedulesDataSource struct { - client *serverbackup.APIClient + client serverbackup.DefaultAPI providerData core.ProviderData } @@ -44,18 +41,14 @@ func (r *schedulesDataSource) Metadata(_ context.Context, req datasource.Metadat // Configure adds the provider configured client to the data source. func (r *schedulesDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serverbackupUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + r.providerData = providerData + r.client = clients.ServerBackupV2Client - r.client = apiClient tflog.Info(ctx, "Server backup client configured") } @@ -167,7 +160,7 @@ func (r *schedulesDataSource) Read(ctx context.Context, req datasource.ReadReque ctx = tflog.SetField(ctx, "server_id", serverId) ctx = tflog.SetField(ctx, "region", region) - schedules, err := r.client.DefaultAPI.ListBackupSchedules(ctx, projectId, serverId, region).Execute() + schedules, err := r.client.ListBackupSchedules(ctx, projectId, serverId, region).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/serverbackup/utils/util.go b/stackit/internal/services/serverbackup/utils/util.go deleted file mode 100644 index dfdee9afa..000000000 --- a/stackit/internal/services/serverbackup/utils/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - serverbackup "github.com/stackitcloud/stackit-sdk-go/services/serverbackup/v2api" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *serverbackup.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.ServerBackupCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.ServerBackupCustomEndpoint)) - } - apiClient, err := serverbackup.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/serverbackup/utils/util_test.go b/stackit/internal/services/serverbackup/utils/util_test.go deleted file mode 100644 index fa90da415..000000000 --- a/stackit/internal/services/serverbackup/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - serverbackup "github.com/stackitcloud/stackit-sdk-go/services/serverbackup/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://serverbackup-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *serverbackup.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *serverbackup.APIClient { - apiClient, err := serverbackup.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - ServerBackupCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *serverbackup.APIClient { - apiClient, err := serverbackup.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/serverupdate/enable/datasource.go b/stackit/internal/services/serverupdate/enable/datasource.go index 3c95bda0f..c3848540a 100644 --- a/stackit/internal/services/serverupdate/enable/datasource.go +++ b/stackit/internal/services/serverupdate/enable/datasource.go @@ -12,9 +12,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" serverupdate "github.com/stackitcloud/stackit-sdk-go/services/serverupdate/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - serverUpdateUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serverupdate/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -39,7 +38,7 @@ func NewServerUpdateEnableDataSource() datasource.DataSource { // serverUpdateEnableDataSource is the data source implementation. type serverUpdateEnableDataSource struct { - client *serverupdate.APIClient + client serverupdate.DefaultAPI providerData core.ProviderData } @@ -50,17 +49,14 @@ func (d *serverUpdateEnableDataSource) Metadata(_ context.Context, req datasourc // Configure adds the provider configured client to the data source. func (d *serverUpdateEnableDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serverUpdateUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.ServerUpdateV2Client + tflog.Info(ctx, "Server update client client configured") } @@ -130,7 +126,7 @@ func (d *serverUpdateEnableDataSource) Read(ctx context.Context, req datasource. ctx = tflog.SetField(ctx, "server_id", serverId) ctx = tflog.SetField(ctx, "region", region) - serviceResp, err := d.client.DefaultAPI.GetServiceResource(ctx, projectId, serverId, region).Execute() + serviceResp, err := d.client.GetServiceResource(ctx, projectId, serverId, region).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/serverupdate/enable/resource.go b/stackit/internal/services/serverupdate/enable/resource.go index 9ca25abf2..cf9090c65 100644 --- a/stackit/internal/services/serverupdate/enable/resource.go +++ b/stackit/internal/services/serverupdate/enable/resource.go @@ -17,9 +17,8 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" serverupdate "github.com/stackitcloud/stackit-sdk-go/services/serverupdate/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - serverUpdateUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serverupdate/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -46,7 +45,7 @@ func NewServerUpdateEnableResource() resource.Resource { // serverUpdateEnableResource is the resource implementation. type serverUpdateEnableResource struct { - client *serverupdate.APIClient + client serverupdate.DefaultAPI providerData core.ProviderData } @@ -87,17 +86,14 @@ func (r *serverUpdateEnableResource) Metadata(_ context.Context, req resource.Me // Configure adds the provider configured client to the resource. func (r *serverUpdateEnableResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serverUpdateUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ServerUpdateV2Client + tflog.Info(ctx, "Server update client configured") } @@ -189,7 +185,7 @@ func (r *serverUpdateEnableResource) Create(ctx context.Context, req resource.Cr ctx = tflog.SetField(ctx, "server_id", serverId) ctx = tflog.SetField(ctx, "region", region) - err := r.client.DefaultAPI.EnableServiceResource(ctx, projectId, serverId, region).EnableServiceResourcePayload(serverupdate.EnableServiceResourcePayload{}).Execute() + err := r.client.EnableServiceResource(ctx, projectId, serverId, region).EnableServiceResourcePayload(serverupdate.EnableServiceResourcePayload{}).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) @@ -201,7 +197,7 @@ func (r *serverUpdateEnableResource) Create(ctx context.Context, req resource.Cr tflog.Info(ctx, "Server update is already enabled for this server. Please check duplicate resources.") } - serviceResp, err := r.client.DefaultAPI.GetServiceResource(ctx, projectId, serverId, region).Execute() + serviceResp, err := r.client.GetServiceResource(ctx, projectId, serverId, region).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading server update enable", fmt.Sprintf("Calling API: %v", err)) return @@ -243,7 +239,7 @@ func (r *serverUpdateEnableResource) Read(ctx context.Context, req resource.Read ctx = tflog.SetField(ctx, "server_id", serverId) ctx = tflog.SetField(ctx, "region", region) - serviceResp, err := r.client.DefaultAPI.GetServiceResource(ctx, projectId, serverId, region).Execute() + serviceResp, err := r.client.GetServiceResource(ctx, projectId, serverId, region).Execute() if err != nil { oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped if ok && oapiErr.StatusCode == http.StatusNotFound { @@ -297,7 +293,7 @@ func (r *serverUpdateEnableResource) Delete(ctx context.Context, req resource.De ctx = tflog.SetField(ctx, "server_id", serverId) ctx = tflog.SetField(ctx, "region", region) - err := r.client.DefaultAPI.DisableServiceResource(ctx, projectId, serverId, region).Execute() + err := r.client.DisableServiceResource(ctx, projectId, serverId, region).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/serverupdate/schedule/resource.go b/stackit/internal/services/serverupdate/schedule/resource.go index f2dfefcb5..d7956bbc2 100644 --- a/stackit/internal/services/serverupdate/schedule/resource.go +++ b/stackit/internal/services/serverupdate/schedule/resource.go @@ -11,8 +11,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework-validators/int32validator" "github.com/hashicorp/terraform-plugin-framework/resource/schema/int32planmodifier" - serverupdateUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serverupdate/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/resource" @@ -25,7 +23,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -60,7 +57,7 @@ func NewScheduleResource() resource.Resource { // scheduleResource is the resource implementation. type scheduleResource struct { - client *serverupdate.APIClient + client serverupdate.DefaultAPI providerData core.ProviderData } @@ -101,17 +98,14 @@ func (r *scheduleResource) Metadata(_ context.Context, req resource.MetadataRequ // Configure adds the provider configured client to the resource. func (r *scheduleResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serverupdateUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ServerUpdateV2Client + tflog.Info(ctx, "Server update client configured.") } @@ -246,7 +240,7 @@ func (r *scheduleResource) Create(ctx context.Context, req resource.CreateReques core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating server update schedule", fmt.Sprintf("Creating API payload: %v", err)) return } - scheduleResp, err := r.client.DefaultAPI.CreateUpdateSchedule(ctx, projectId, serverId, region).CreateUpdateSchedulePayload(*payload).Execute() + scheduleResp, err := r.client.CreateUpdateSchedule(ctx, projectId, serverId, region).CreateUpdateSchedulePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating server update schedule", fmt.Sprintf("Calling API: %v", err)) return @@ -295,7 +289,7 @@ func (r *scheduleResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "update_schedule_id", updateScheduleId) - scheduleResp, err := r.client.DefaultAPI.GetUpdateSchedule(ctx, projectId, serverId, strconv.FormatInt(int64(updateScheduleId), 10), region).Execute() + scheduleResp, err := r.client.GetUpdateSchedule(ctx, projectId, serverId, strconv.FormatInt(int64(updateScheduleId), 10), region).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -351,7 +345,7 @@ func (r *scheduleResource) Update(ctx context.Context, req resource.UpdateReques return } - scheduleResp, err := r.client.DefaultAPI.UpdateUpdateSchedule(ctx, projectId, serverId, strconv.FormatInt(int64(updateScheduleId), 10), region).UpdateUpdateSchedulePayload(*payload).Execute() + scheduleResp, err := r.client.UpdateUpdateSchedule(ctx, projectId, serverId, strconv.FormatInt(int64(updateScheduleId), 10), region).UpdateUpdateSchedulePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating server update schedule", fmt.Sprintf("Calling API: %v", err)) return @@ -393,7 +387,7 @@ func (r *scheduleResource) Delete(ctx context.Context, req resource.DeleteReques ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "update_schedule_id", updateScheduleId) - err := r.client.DefaultAPI.DeleteUpdateSchedule(ctx, projectId, serverId, strconv.FormatInt(int64(updateScheduleId), 10), region).Execute() + err := r.client.DeleteUpdateSchedule(ctx, projectId, serverId, strconv.FormatInt(int64(updateScheduleId), 10), region).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -460,13 +454,13 @@ func mapFields(schedule *serverupdate.UpdateSchedule, model *Model, region strin // If already enabled, just continues // Deprecated: This function will be removed on 26.09.2026. Use `server_update_enable` resource instead. -func enableUpdatesService(ctx context.Context, model *Model, client *serverupdate.APIClient, region string) error { +func enableUpdatesService(ctx context.Context, model *Model, client serverupdate.DefaultAPI, region string) error { projectId := model.ProjectId.ValueString() serverId := model.ServerId.ValueString() payload := serverupdate.EnableServiceResourcePayload{} tflog.Debug(ctx, "Enabling server update service") - err := client.DefaultAPI.EnableServiceResource(ctx, projectId, serverId, region).EnableServiceResourcePayload(payload).Execute() + err := client.EnableServiceResource(ctx, projectId, serverId, region).EnableServiceResourcePayload(payload).Execute() if err != nil { if strings.Contains(err.Error(), "Tried to activate already active service") { tflog.Debug(ctx, "Service for server update already enabled") diff --git a/stackit/internal/services/serverupdate/schedule/schedule_datasource.go b/stackit/internal/services/serverupdate/schedule/schedule_datasource.go index fb3b46894..e0824f67c 100644 --- a/stackit/internal/services/serverupdate/schedule/schedule_datasource.go +++ b/stackit/internal/services/serverupdate/schedule/schedule_datasource.go @@ -6,9 +6,6 @@ import ( "net/http" "strconv" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - serverupdateUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serverupdate/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -34,7 +31,7 @@ func NewScheduleDataSource() datasource.DataSource { // scheduleDataSource is the data source implementation. type scheduleDataSource struct { - client *serverupdate.APIClient + client serverupdate.DefaultAPI providerData core.ProviderData } @@ -45,17 +42,14 @@ func (r *scheduleDataSource) Metadata(_ context.Context, req datasource.Metadata // Configure adds the provider configured client to the data source. func (r *scheduleDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serverupdateUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ServerUpdateV2Client + tflog.Info(ctx, "Server update client configured") } @@ -133,7 +127,7 @@ func (r *scheduleDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = tflog.SetField(ctx, "update_schedule_id", updateScheduleId) ctx = tflog.SetField(ctx, "region", region) - scheduleResp, err := r.client.DefaultAPI.GetUpdateSchedule(ctx, projectId, serverId, strconv.FormatInt(int64(updateScheduleId), 10), region).Execute() + scheduleResp, err := r.client.GetUpdateSchedule(ctx, projectId, serverId, strconv.FormatInt(int64(updateScheduleId), 10), region).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/serverupdate/schedule/schedules_datasource.go b/stackit/internal/services/serverupdate/schedule/schedules_datasource.go index 44ecc44b3..f948e9650 100644 --- a/stackit/internal/services/serverupdate/schedule/schedules_datasource.go +++ b/stackit/internal/services/serverupdate/schedule/schedules_datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - serverupdateUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serverupdate/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types" @@ -33,7 +30,7 @@ func NewSchedulesDataSource() datasource.DataSource { // schedulesDataSource is the data source implementation. type schedulesDataSource struct { - client *serverupdate.APIClient + client serverupdate.DefaultAPI providerData core.ProviderData } @@ -44,17 +41,14 @@ func (r *schedulesDataSource) Metadata(_ context.Context, req datasource.Metadat // Configure adds the provider configured client to the data source. func (r *schedulesDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serverupdateUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.ServerUpdateV2Client + tflog.Info(ctx, "Server update client configured") } @@ -153,7 +147,7 @@ func (r *schedulesDataSource) Read(ctx context.Context, req datasource.ReadReque ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "server_id", serverId) - schedules, err := r.client.DefaultAPI.ListUpdateSchedules(ctx, projectId, serverId, region).Execute() + schedules, err := r.client.ListUpdateSchedules(ctx, projectId, serverId, region).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/serverupdate/utils/util.go b/stackit/internal/services/serverupdate/utils/util.go deleted file mode 100644 index dc5d91eac..000000000 --- a/stackit/internal/services/serverupdate/utils/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - serverupdate "github.com/stackitcloud/stackit-sdk-go/services/serverupdate/v2api" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *serverupdate.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.ServerUpdateCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.ServerUpdateCustomEndpoint)) - } - apiClient, err := serverupdate.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/serverupdate/utils/util_test.go b/stackit/internal/services/serverupdate/utils/util_test.go deleted file mode 100644 index 03e858d63..000000000 --- a/stackit/internal/services/serverupdate/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - serverupdate "github.com/stackitcloud/stackit-sdk-go/services/serverupdate/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://serverupdate-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *serverupdate.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *serverupdate.APIClient { - apiClient, err := serverupdate.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - ServerUpdateCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *serverupdate.APIClient { - apiClient, err := serverupdate.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/serviceaccount/account/datasource.go b/stackit/internal/services/serviceaccount/account/datasource.go index 0b62ed487..6d587b471 100644 --- a/stackit/internal/services/serviceaccount/account/datasource.go +++ b/stackit/internal/services/serviceaccount/account/datasource.go @@ -4,9 +4,6 @@ import ( "context" "fmt" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - serviceaccountUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serviceaccount/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -14,6 +11,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" serviceaccount "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount/v2api" + serviceaccountUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serviceaccount/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -31,21 +30,18 @@ func NewServiceAccountDataSource() datasource.DataSource { // serviceAccountDataSource is the datasource implementation for service accounts. type serviceAccountDataSource struct { - client *serviceaccount.APIClient + client serviceaccount.DefaultAPI } // Configure initializes the serviceAccountDataSource with the provided provider data. func (r *serviceAccountDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serviceaccountUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.ServiceAccountV2Client + tflog.Info(ctx, "Service Account client configured") } @@ -115,7 +111,7 @@ func (r *serviceAccountDataSource) Read(ctx context.Context, req datasource.Read projectId := model.ProjectId.ValueString() // Call the API to list service accounts in the specified project - listSaResp, err := r.client.DefaultAPI.ListServiceAccounts(ctx, projectId).Execute() + listSaResp, err := r.client.ListServiceAccounts(ctx, projectId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/serviceaccount/account/resource.go b/stackit/internal/services/serviceaccount/account/resource.go index aaef4949f..8b19a9bf7 100644 --- a/stackit/internal/services/serviceaccount/account/resource.go +++ b/stackit/internal/services/serviceaccount/account/resource.go @@ -25,7 +25,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" serviceaccount "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -53,21 +52,18 @@ func NewServiceAccountResource() resource.Resource { // serviceAccountResource implements the resource interface for service accounts. type serviceAccountResource struct { - client *serviceaccount.APIClient + client serviceaccount.DefaultAPI } // Configure sets up the API client for the service account resource. func (r *serviceAccountResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serviceaccountUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.ServiceAccountV2Client + tflog.Info(ctx, "Service Account client configured") } @@ -157,7 +153,7 @@ func (r *serviceAccountResource) Create(ctx context.Context, req resource.Create } // Create the new service account via the API client. - serviceAccountResp, err := r.client.DefaultAPI.CreateServiceAccount(ctx, projectId).CreateServiceAccountPayload(*payload).Execute() + serviceAccountResp, err := r.client.CreateServiceAccount(ctx, projectId).CreateServiceAccountPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating service account", fmt.Sprintf("Calling API: %v", err)) return @@ -201,7 +197,7 @@ func (r *serviceAccountResource) Read(ctx context.Context, req resource.ReadRequ projectId := model.ProjectId.ValueString() // Fetch the list of service accounts from the API. - listSaResp, err := r.client.DefaultAPI.ListServiceAccounts(ctx, projectId).Execute() + listSaResp, err := r.client.ListServiceAccounts(ctx, projectId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -263,7 +259,7 @@ func (r *serviceAccountResource) Delete(ctx context.Context, req resource.Delete ctx = tflog.SetField(ctx, "service_account_name", serviceAccountName) // Call API to delete the existing service account. - err := r.client.DefaultAPI.DeleteServiceAccount(ctx, projectId, serviceAccountEmail).Execute() + err := r.client.DeleteServiceAccount(ctx, projectId, serviceAccountEmail).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/serviceaccount/accounts/datasource.go b/stackit/internal/services/serviceaccount/accounts/datasource.go index 17f648386..c916c3410 100644 --- a/stackit/internal/services/serviceaccount/accounts/datasource.go +++ b/stackit/internal/services/serviceaccount/accounts/datasource.go @@ -7,9 +7,6 @@ import ( "sort" "strings" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - serviceaccountUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serviceaccount/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" @@ -19,6 +16,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" serviceaccount "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount/v2api" + serviceaccountUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serviceaccount/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -52,20 +51,17 @@ func NewServiceAccountsDataSource() datasource.DataSource { // serviceAccountsDataSource is the datasource implementation for querying multiple service accounts. type serviceAccountsDataSource struct { - client *serviceaccount.APIClient + client serviceaccount.DefaultAPI } func (r *serviceAccountsDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serviceaccountUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.ServiceAccountV2Client + tflog.Info(ctx, "Service Accounts (plural) client configured") } @@ -158,7 +154,7 @@ func (r *serviceAccountsDataSource) Read(ctx context.Context, req datasource.Rea } // Fetch all service accounts - listSaResp, err := r.client.DefaultAPI.ListServiceAccounts(ctx, projectId).Execute() + listSaResp, err := r.client.ListServiceAccounts(ctx, projectId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/serviceaccount/federated_identity_provider/datasource.go b/stackit/internal/services/serviceaccount/federated_identity_provider/datasource.go index a4b25924d..dbd61afbc 100644 --- a/stackit/internal/services/serviceaccount/federated_identity_provider/datasource.go +++ b/stackit/internal/services/serviceaccount/federated_identity_provider/datasource.go @@ -6,7 +6,6 @@ import ( "fmt" "net/http" - serviceaccountUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serviceaccount/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" "github.com/hashicorp/terraform-plugin-framework/datasource" @@ -16,7 +15,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" serviceaccount "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" ) @@ -29,7 +27,7 @@ func NewServiceAccountFederatedIdentityProviderDataSource() datasource.DataSourc } type serviceAccountFederatedIdentityProviderDatasource struct { - client *serviceaccount.APIClient + client serviceaccount.DefaultAPI } func (r *serviceAccountFederatedIdentityProviderDatasource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { @@ -99,16 +97,13 @@ func (r *serviceAccountFederatedIdentityProviderDatasource) Schema(_ context.Con } func (r *serviceAccountFederatedIdentityProviderDatasource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serviceaccountUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.ServiceAccountV2Client + tflog.Info(ctx, "Service Account client configured") } @@ -126,7 +121,7 @@ func (r *serviceAccountFederatedIdentityProviderDatasource) Read(ctx context.Con serviceAccountEmail := model.ServiceAccountEmail.ValueString() federationId := model.FederationId.ValueString() - apiResp, err := r.client.DefaultAPI.GetFederatedIdentityProvider(ctx, projectId, serviceAccountEmail, federationId). + apiResp, err := r.client.GetFederatedIdentityProvider(ctx, projectId, serviceAccountEmail, federationId). Execute() if err != nil { diff --git a/stackit/internal/services/serviceaccount/federated_identity_provider/resource.go b/stackit/internal/services/serviceaccount/federated_identity_provider/resource.go index 44ac33e7d..b6a944b52 100644 --- a/stackit/internal/services/serviceaccount/federated_identity_provider/resource.go +++ b/stackit/internal/services/serviceaccount/federated_identity_provider/resource.go @@ -72,7 +72,7 @@ func NewServiceAccountFederatedIdentityProviderResource() resource.Resource { } type serviceAccountFederatedIdentityProviderResource struct { - client *serviceaccount.APIClient + client serviceaccount.DefaultAPI } func (r *serviceAccountFederatedIdentityProviderResource) Metadata(_ context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) { @@ -159,16 +159,13 @@ func (r *serviceAccountFederatedIdentityProviderResource) Schema(_ context.Conte } func (r *serviceAccountFederatedIdentityProviderResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serviceaccountUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.ServiceAccountV2Client + tflog.Info(ctx, "Service Account client configured") } @@ -193,7 +190,7 @@ func (r *serviceAccountFederatedIdentityProviderResource) Create(ctx context.Con return } - apiResp, err := r.client.DefaultAPI.CreateFederatedIdentityProvider(ctx, projectId, serviceAccountEmail). + apiResp, err := r.client.CreateFederatedIdentityProvider(ctx, projectId, serviceAccountEmail). CreateFederatedIdentityProviderPayload(*payload). Execute() if err != nil { @@ -225,7 +222,7 @@ func (r *serviceAccountFederatedIdentityProviderResource) Read(ctx context.Conte serviceAccountEmail := model.ServiceAccountEmail.ValueString() federationId := model.FederationId.ValueString() - apiResp, err := r.client.DefaultAPI.GetFederatedIdentityProvider(ctx, projectId, serviceAccountEmail, federationId). + apiResp, err := r.client.GetFederatedIdentityProvider(ctx, projectId, serviceAccountEmail, federationId). Execute() if err != nil { @@ -280,7 +277,7 @@ func (r *serviceAccountFederatedIdentityProviderResource) Update(ctx context.Con return } - apiResp, err := r.client.DefaultAPI.PartialUpdateServiceAccountFederatedIdentityProvider(ctx, projectId, serviceAccountEmail, federationId). + apiResp, err := r.client.PartialUpdateServiceAccountFederatedIdentityProvider(ctx, projectId, serviceAccountEmail, federationId). PartialUpdateServiceAccountFederatedIdentityProviderPayload(*payload). Execute() if err != nil { @@ -312,7 +309,7 @@ func (r *serviceAccountFederatedIdentityProviderResource) Delete(ctx context.Con serviceAccountEmail := model.ServiceAccountEmail.ValueString() federationId := model.FederationId.ValueString() - err := r.client.DefaultAPI.DeleteServiceFederatedIdentityProvider(ctx, projectId, serviceAccountEmail, federationId). + err := r.client.DeleteServiceFederatedIdentityProvider(ctx, projectId, serviceAccountEmail, federationId). Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting federated identity provider", fmt.Sprintf("Calling API: %v", err)) diff --git a/stackit/internal/services/serviceaccount/key/resource.go b/stackit/internal/services/serviceaccount/key/resource.go index eca9d45d2..18192f1ae 100644 --- a/stackit/internal/services/serviceaccount/key/resource.go +++ b/stackit/internal/services/serviceaccount/key/resource.go @@ -8,8 +8,6 @@ import ( "net/http" "time" - serviceaccountUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serviceaccount/utils" - "github.com/hashicorp/terraform-plugin-framework-validators/int64validator" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" @@ -54,21 +52,18 @@ func NewServiceAccountKeyResource() resource.Resource { // serviceAccountKeyResource implements the resource interface for service account key. type serviceAccountKeyResource struct { - client *serviceaccount.APIClient + client serviceaccount.DefaultAPI } // Configure sets up the API client for the service account resource. func (r *serviceAccountKeyResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := serviceaccountUtils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.client = clients.ServiceAccountV2Client + tflog.Info(ctx, "Service Account client configured") } @@ -183,7 +178,7 @@ func (r *serviceAccountKeyResource) Create(ctx context.Context, req resource.Cre } // Initialize the API request with the required parameters. - saAccountKeyResp, err := r.client.DefaultAPI.CreateServiceAccountKey(ctx, projectId, serviceAccountEmail).CreateServiceAccountKeyPayload(*payload).Execute() + saAccountKeyResp, err := r.client.CreateServiceAccountKey(ctx, projectId, serviceAccountEmail).CreateServiceAccountKeyPayload(*payload).Execute() ctx = core.LogResponse(ctx) @@ -229,7 +224,7 @@ func (r *serviceAccountKeyResource) Read(ctx context.Context, req resource.ReadR return } - _, err := r.client.DefaultAPI.GetServiceAccountKey(ctx, projectId, serviceAccountEmail, keyId).Execute() + _, err := r.client.GetServiceAccountKey(ctx, projectId, serviceAccountEmail, keyId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError // due to security purposes, attempting to get access key for a non-existent Service Account will return 403. @@ -283,7 +278,7 @@ func (r *serviceAccountKeyResource) Delete(ctx context.Context, req resource.Del ctx = tflog.SetField(ctx, "key_id", keyId) // Call API to delete the existing service account key. - err := r.client.DefaultAPI.DeleteServiceAccountKey(ctx, projectId, serviceAccountEmail, keyId).Execute() + err := r.client.DeleteServiceAccountKey(ctx, projectId, serviceAccountEmail, keyId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { diff --git a/stackit/internal/services/serviceaccount/utils/util.go b/stackit/internal/services/serviceaccount/utils/util.go index e2b13552d..603e59961 100644 --- a/stackit/internal/services/serviceaccount/utils/util.go +++ b/stackit/internal/services/serviceaccount/utils/util.go @@ -1,35 +1,10 @@ package utils import ( - "context" "fmt" "regexp" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - serviceaccount "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *serviceaccount.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.ServiceAccountCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.ServiceAccountCustomEndpoint)) - } - apiClient, err := serviceaccount.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} - // ParseNameFromEmail extracts the name component from a service account email address. // The expected email format is `name-@sa.stackit.cloud` // or `name-@ske.sa.stackit.cloud`. diff --git a/stackit/internal/services/serviceaccount/utils/util_test.go b/stackit/internal/services/serviceaccount/utils/util_test.go index 08d40e804..b3e31858f 100644 --- a/stackit/internal/services/serviceaccount/utils/util_test.go +++ b/stackit/internal/services/serviceaccount/utils/util_test.go @@ -1,98 +1,9 @@ package utils import ( - "context" - "os" - "reflect" "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - serviceaccount "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://serviceaccount-custom-endpoint.api.stackit.cloud" ) -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *serviceaccount.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *serviceaccount.APIClient { - apiClient, err := serviceaccount.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - ServiceAccountCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *serviceaccount.APIClient { - apiClient, err := serviceaccount.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} - func TestParseNameFromEmail(t *testing.T) { testCases := []struct { email string diff --git a/stackit/internal/services/serviceenablement/utils/util.go b/stackit/internal/services/serviceenablement/utils/util.go deleted file mode 100644 index 777bb13cc..000000000 --- a/stackit/internal/services/serviceenablement/utils/util.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - serviceenablement "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *serviceenablement.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.ServiceEnablementCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.ServiceEnablementCustomEndpoint)) - } - apiClient, err := serviceenablement.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/serviceenablement/utils/util_test.go b/stackit/internal/services/serviceenablement/utils/util_test.go deleted file mode 100644 index 3135cdb1b..000000000 --- a/stackit/internal/services/serviceenablement/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - serviceenablement "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://serviceenablement-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *serviceenablement.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *serviceenablement.APIClient { - apiClient, err := serviceenablement.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - ServiceEnablementCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *serviceenablement.APIClient { - apiClient, err := serviceenablement.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/sfs/export-policy/datasource.go b/stackit/internal/services/sfs/export-policy/datasource.go index c7d3cd0d5..dd29b724d 100644 --- a/stackit/internal/services/sfs/export-policy/datasource.go +++ b/stackit/internal/services/sfs/export-policy/datasource.go @@ -14,10 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" sfs "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - sfsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sfs/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -27,7 +26,7 @@ var ( ) type exportPolicyDataSource struct { - client *sfs.APIClient + client sfs.DefaultAPI providerData core.ProviderData } @@ -38,22 +37,19 @@ func (d *exportPolicyDataSource) Metadata(_ context.Context, req datasource.Meta // Configure implements datasource.DataSourceWithConfigure. func (d *exportPolicyDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.providerData = providerData + d.client = clients.SfsV1Client + features.CheckBetaResourcesEnabled(ctx, &d.providerData, &resp.Diagnostics, "stackit_sfs_export_policy", core.Datasource) if resp.Diagnostics.HasError() { return } - apiClient := sfsUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient tflog.Info(ctx, "SFS client configured") } @@ -79,7 +75,7 @@ func (d *exportPolicyDataSource) Read(ctx context.Context, req datasource.ReadRe ctx = core.InitProviderContext(ctx) // get export policy - exportPolicyResp, err := d.client.DefaultAPI.GetShareExportPolicy(ctx, projectId, region, exportPolicyId).Execute() + exportPolicyResp, err := d.client.GetShareExportPolicy(ctx, projectId, region, exportPolicyId).Execute() if err != nil { var openapiError *oapierror.GenericOpenAPIError if errors.As(err, &openapiError) { diff --git a/stackit/internal/services/sfs/export-policy/resource.go b/stackit/internal/services/sfs/export-policy/resource.go index e5f9908db..667ade5da 100644 --- a/stackit/internal/services/sfs/export-policy/resource.go +++ b/stackit/internal/services/sfs/export-policy/resource.go @@ -26,7 +26,7 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - sfsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sfs/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -76,7 +76,7 @@ func NewExportPolicyResource() resource.Resource { } type exportPolicyResource struct { - client *sfs.APIClient + client sfs.DefaultAPI providerData core.ProviderData } @@ -124,22 +124,19 @@ func (r *exportPolicyResource) Metadata(_ context.Context, req resource.Metadata // Configure adds the provider configured client to the resource. func (r *exportPolicyResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.SfsV1Client + features.CheckBetaResourcesEnabled(ctx, &r.providerData, &resp.Diagnostics, "stackit_sfs_export_policy", core.Resource) if resp.Diagnostics.HasError() { return } - apiClient := sfsUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "SFS client configured") } @@ -282,7 +279,7 @@ func (r *exportPolicyResource) Create(ctx context.Context, req resource.CreateRe return } - createResp, err := r.client.DefaultAPI.CreateShareExportPolicy(ctx, projectId, region).CreateShareExportPolicyPayload(*payload).Execute() + createResp, err := r.client.CreateShareExportPolicy(ctx, projectId, region).CreateShareExportPolicyPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating export policy", fmt.Sprintf("Calling API: %v", err)) return @@ -305,7 +302,7 @@ func (r *exportPolicyResource) Create(ctx context.Context, req resource.CreateRe } // get export policy - getResp, err := r.client.DefaultAPI.GetShareExportPolicy(ctx, projectId, region, *createResp.ShareExportPolicy.Id).Execute() + getResp, err := r.client.GetShareExportPolicy(ctx, projectId, region, *createResp.ShareExportPolicy.Id).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating export policy", fmt.Sprintf("Calling API to get export policy: %v", err)) return @@ -349,7 +346,7 @@ func (r *exportPolicyResource) Read(ctx context.Context, req resource.ReadReques ctx = core.InitProviderContext(ctx) // get export policy - exportPolicyResp, err := r.client.DefaultAPI.GetShareExportPolicy(ctx, projectId, region, exportPolicyId).Execute() + exportPolicyResp, err := r.client.GetShareExportPolicy(ctx, projectId, region, exportPolicyId).Execute() if err != nil { var openapiError *oapierror.GenericOpenAPIError if errors.As(err, &openapiError) { @@ -413,7 +410,7 @@ func (r *exportPolicyResource) Update(ctx context.Context, req resource.UpdateRe return } - _, err = r.client.DefaultAPI.UpdateShareExportPolicy(ctx, projectId, region, exportPolicyId).UpdateShareExportPolicyPayload(*payload).Execute() + _, err = r.client.UpdateShareExportPolicy(ctx, projectId, region, exportPolicyId).UpdateShareExportPolicyPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating export policy", fmt.Sprintf("Calling API to update export policy: %v", err)) return @@ -422,7 +419,7 @@ func (r *exportPolicyResource) Update(ctx context.Context, req resource.UpdateRe ctx = core.LogResponse(ctx) // get export policy - exportPolicyResp, err := r.client.DefaultAPI.GetShareExportPolicy(ctx, projectId, region, exportPolicyId).Execute() + exportPolicyResp, err := r.client.GetShareExportPolicy(ctx, projectId, region, exportPolicyId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating export policy", fmt.Sprintf("Calling API to get export policy: %v", err)) return @@ -462,7 +459,7 @@ func (r *exportPolicyResource) Delete(ctx context.Context, req resource.DeleteRe ctx = core.InitProviderContext(ctx) - _, err := r.client.DefaultAPI.DeleteShareExportPolicy(ctx, projectId, region, exportPolicyId).Execute() + _, err := r.client.DeleteShareExportPolicy(ctx, projectId, region, exportPolicyId).Execute() if err != nil { var openapiError *oapierror.GenericOpenAPIError if errors.As(err, &openapiError) { diff --git a/stackit/internal/services/sfs/project-lock/datasource.go b/stackit/internal/services/sfs/project-lock/datasource.go index e2f3fba95..cc1099ff5 100644 --- a/stackit/internal/services/sfs/project-lock/datasource.go +++ b/stackit/internal/services/sfs/project-lock/datasource.go @@ -11,9 +11,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" sfs "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - sfsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sfs/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -31,23 +30,20 @@ func NewProjectLockDatasource() datasource.DataSource { // projectlockDatasource is the resource implementation. type projectlockDatasource struct { - client *sfs.APIClient + client sfs.DefaultAPI providerData core.ProviderData } // Configure adds the provider configured client to the resource. func (r *projectlockDatasource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := sfsUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.SfsV1Client + tflog.Info(ctx, "SFS client configured") } @@ -110,7 +106,7 @@ func (r *projectlockDatasource) Read(ctx context.Context, req datasource.ReadReq ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "region", region) - projectResp, err := r.client.DefaultAPI.GetLock(ctx, region, projectId).Execute() + projectResp, err := r.client.GetLock(ctx, region, projectId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/sfs/project-lock/resource.go b/stackit/internal/services/sfs/project-lock/resource.go index eb54b8bb7..6454457e2 100644 --- a/stackit/internal/services/sfs/project-lock/resource.go +++ b/stackit/internal/services/sfs/project-lock/resource.go @@ -17,9 +17,8 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" sfs "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - sfsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sfs/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -50,7 +49,7 @@ func NewProjectLockResource() resource.Resource { // projectlockResource is the resource implementation. type projectlockResource struct { - client *sfs.APIClient + client sfs.DefaultAPI providerData core.ProviderData } @@ -86,17 +85,14 @@ func (r *projectlockResource) ModifyPlan(ctx context.Context, req resource.Modif // Configure adds the provider configured client to the resource. func (r *projectlockResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := sfsUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.SfsV1Client + tflog.Info(ctx, "SFS client configured") } @@ -171,7 +167,7 @@ func (r *projectlockResource) Create(ctx context.Context, req resource.CreateReq ctx = tflog.SetField(ctx, "region", region) var projectResp sfsLockResponse - projectResp, err := r.client.DefaultAPI.EnableLock(ctx, region, projectId).Execute() + projectResp, err := r.client.EnableLock(ctx, region, projectId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) @@ -182,7 +178,7 @@ func (r *projectlockResource) Create(ctx context.Context, req resource.CreateReq } tflog.Info(ctx, "Project lock is already enabled for this project. Please check duplicate resources.") - projectResp, err = r.client.DefaultAPI.GetLock(ctx, region, projectId).Execute() + projectResp, err = r.client.GetLock(ctx, region, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading project lock", fmt.Sprintf("Calling API: %v", err)) return @@ -222,7 +218,7 @@ func (r *projectlockResource) Read(ctx context.Context, req resource.ReadRequest ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "region", region) - projectResp, err := r.client.DefaultAPI.GetLock(ctx, region, projectId).Execute() + projectResp, err := r.client.GetLock(ctx, region, projectId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) @@ -275,7 +271,7 @@ func (r *projectlockResource) Delete(ctx context.Context, req resource.DeleteReq ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "region", region) - _, err := r.client.DefaultAPI.DisableLock(ctx, region, projectId).Execute() + _, err := r.client.DisableLock(ctx, region, projectId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting project lock", fmt.Sprintf("Calling API: %v", err)) return diff --git a/stackit/internal/services/sfs/resourcepool/datasource.go b/stackit/internal/services/sfs/resourcepool/datasource.go index 65c2c89af..9d83f14be 100644 --- a/stackit/internal/services/sfs/resourcepool/datasource.go +++ b/stackit/internal/services/sfs/resourcepool/datasource.go @@ -17,10 +17,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" sfs "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - sfsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sfs/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -48,7 +47,7 @@ type dataSourceModel struct { } type resourcePoolDataSource struct { - client *sfs.APIClient + client sfs.DefaultAPI providerData core.ProviderData } @@ -58,22 +57,19 @@ func NewResourcePoolDataSource() datasource.DataSource { // Configure implements datasource.DataSourceWithConfigure. func (r *resourcePoolDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.SfsV1Client + features.CheckBetaResourcesEnabled(ctx, &r.providerData, &resp.Diagnostics, "stackit_sfs_resource_pool", core.Datasource) if resp.Diagnostics.HasError() { return } - apiClient := sfsUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "SFS client configured") } @@ -99,7 +95,7 @@ func (r *resourcePoolDataSource) Read(ctx context.Context, req datasource.ReadRe ctx = core.InitProviderContext(ctx) - response, err := r.client.DefaultAPI.GetResourcePool(ctx, projectId, region, resourcePoolId).Execute() + response, err := r.client.GetResourcePool(ctx, projectId, region, resourcePoolId).Execute() if err != nil { var openapiError *oapierror.GenericOpenAPIError if errors.As(err, &openapiError) { diff --git a/stackit/internal/services/sfs/resourcepool/resource.go b/stackit/internal/services/sfs/resourcepool/resource.go index 16fdf3579..e32e90f2a 100644 --- a/stackit/internal/services/sfs/resourcepool/resource.go +++ b/stackit/internal/services/sfs/resourcepool/resource.go @@ -25,10 +25,9 @@ import ( sfs "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api" "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api/wait" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - sfsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sfs/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" stringplanmodifierUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils/planmodifiers/stringplanmodifier" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -74,7 +73,7 @@ func NewResourcePoolResource() resource.Resource { // resourcePoolResource is the resource implementation. type resourcePoolResource struct { - client *sfs.APIClient + client sfs.DefaultAPI providerData core.ProviderData } @@ -114,22 +113,19 @@ func (r *resourcePoolResource) Metadata(_ context.Context, req resource.Metadata // Configure adds the provider configured client to the resource. func (r *resourcePoolResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.SfsV1Client + features.CheckBetaResourcesEnabled(ctx, &r.providerData, &resp.Diagnostics, "stackit_sfs_resource_pool", core.Resource) if resp.Diagnostics.HasError() { return } - apiClient := sfsUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "SFS client configured") } @@ -270,7 +266,7 @@ func (r *resourcePoolResource) Create(ctx context.Context, req resource.CreateRe } // Create new resourcepool - resourcePool, err := r.client.DefaultAPI.CreateResourcePool(ctx, projectId, region). + resourcePool, err := r.client.CreateResourcePool(ctx, projectId, region). CreateResourcePoolPayload(*payload). Execute() if err != nil { @@ -295,7 +291,7 @@ func (r *resourcePoolResource) Create(ctx context.Context, req resource.CreateRe return } - response, err := wait.CreateResourcePoolWaitHandler(ctx, r.client.DefaultAPI, projectId, region, *resourcePool.ResourcePool.Id). + response, err := wait.CreateResourcePoolWaitHandler(ctx, r.client, projectId, region, *resourcePool.ResourcePool.Id). WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating resource pool", fmt.Sprintf("resource pool creation waiting: %v", err)) @@ -310,7 +306,7 @@ func (r *resourcePoolResource) Create(ctx context.Context, req resource.CreateRe core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating resource pool", "response did not contain an ID") return } - getResponse, err := r.client.DefaultAPI.GetResourcePool(ctx, projectId, region, *response.ResourcePool.Id).Execute() + getResponse, err := r.client.GetResourcePool(ctx, projectId, region, *response.ResourcePool.Id).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating resource pool", fmt.Sprintf("resource pool get: %v", err)) return @@ -354,7 +350,7 @@ func (r *resourcePoolResource) Read(ctx context.Context, req resource.ReadReques ctx = core.InitProviderContext(ctx) - response, err := r.client.DefaultAPI.GetResourcePool(ctx, projectId, region, resourcePoolId).Execute() + response, err := r.client.GetResourcePool(ctx, projectId, region, resourcePoolId).Execute() if err != nil { if openapiError, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok { if openapiError.StatusCode == http.StatusNotFound || openapiError.StatusCode == http.StatusGone { @@ -415,7 +411,7 @@ func (r *resourcePoolResource) Update(ctx context.Context, req resource.UpdateRe return } - response, err := r.client.DefaultAPI.UpdateResourcePool(ctx, projectId, region, resourcePoolId). + response, err := r.client.UpdateResourcePool(ctx, projectId, region, resourcePoolId). UpdateResourcePoolPayload(*payload). Execute() if err != nil { @@ -440,7 +436,7 @@ func (r *resourcePoolResource) Update(ctx context.Context, req resource.UpdateRe return } - getResponse, err := wait.UpdateResourcePoolWaitHandler(ctx, r.client.DefaultAPI, projectId, region, resourcePoolId).WaitWithContext(ctx) + getResponse, err := wait.UpdateResourcePoolWaitHandler(ctx, r.client, projectId, region, resourcePoolId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating resource pool", fmt.Sprintf("resource pool get: %v", err)) return @@ -478,7 +474,7 @@ func (r *resourcePoolResource) Delete(ctx context.Context, req resource.DeleteRe ctx = core.InitProviderContext(ctx) // Delete existing resource pool - _, err := r.client.DefaultAPI.DeleteResourcePool(ctx, projectId, region, resourcePoolId).Execute() + _, err := r.client.DeleteResourcePool(ctx, projectId, region, resourcePoolId).Execute() if err != nil { var openapiError *oapierror.GenericOpenAPIError if errors.As(err, &openapiError) { @@ -493,7 +489,7 @@ func (r *resourcePoolResource) Delete(ctx context.Context, req resource.DeleteRe ctx = core.LogResponse(ctx) // only delete, if no error occurred - _, err = wait.DeleteResourcePoolWaitHandler(ctx, r.client.DefaultAPI, projectId, region, resourcePoolId).WaitWithContext(ctx) + _, err = wait.DeleteResourcePoolWaitHandler(ctx, r.client, projectId, region, resourcePoolId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting resource pool", fmt.Sprintf("resource pool deletion waiting: %v", err)) return diff --git a/stackit/internal/services/sfs/share/datasource.go b/stackit/internal/services/sfs/share/datasource.go index 28899614e..80c311d02 100644 --- a/stackit/internal/services/sfs/share/datasource.go +++ b/stackit/internal/services/sfs/share/datasource.go @@ -14,10 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" sfs "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - sfsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sfs/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -40,7 +39,7 @@ type dataSourceModel struct { Labels types.Map `tfsdk:"labels"` } type shareDataSource struct { - client *sfs.APIClient + client sfs.DefaultAPI providerData core.ProviderData } @@ -50,22 +49,19 @@ func NewShareDataSource() datasource.DataSource { // Configure implements datasource.DataSourceWithConfigure. func (r *shareDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.SfsV1Client + features.CheckBetaResourcesEnabled(ctx, &r.providerData, &resp.Diagnostics, "stackit_sfs_share", core.Datasource) if resp.Diagnostics.HasError() { return } - apiClient := sfsUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "SFS client configured") } @@ -93,7 +89,7 @@ func (r *shareDataSource) Read(ctx context.Context, req datasource.ReadRequest, ctx = core.InitProviderContext(ctx) - response, err := r.client.DefaultAPI.GetShare(ctx, projectId, region, resourcePoolId, shareId).Execute() + response, err := r.client.GetShare(ctx, projectId, region, resourcePoolId, shareId).Execute() if err != nil { var openapiError *oapierror.GenericOpenAPIError if errors.As(err, &openapiError) { diff --git a/stackit/internal/services/sfs/share/resource.go b/stackit/internal/services/sfs/share/resource.go index e5814636b..f1b9951a8 100644 --- a/stackit/internal/services/sfs/share/resource.go +++ b/stackit/internal/services/sfs/share/resource.go @@ -19,10 +19,9 @@ import ( sfs "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api" "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api/wait" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - sfsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sfs/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -54,7 +53,7 @@ func NewShareResource() resource.Resource { // shareResource is the resource implementation. type shareResource struct { - client *sfs.APIClient + client sfs.DefaultAPI providerData core.ProviderData } @@ -94,22 +93,19 @@ func (r *shareResource) Metadata(_ context.Context, req resource.MetadataRequest // Configure adds the provider configured client to the resource. func (r *shareResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.SfsV1Client + features.CheckBetaResourcesEnabled(ctx, &r.providerData, &resp.Diagnostics, "stackit_sfs_share", core.Resource) if resp.Diagnostics.HasError() { return } - apiClient := sfsUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "SFS client configured") } @@ -233,7 +229,7 @@ func (r *shareResource) Create(ctx context.Context, req resource.CreateRequest, } // Create new share - share, err := r.client.DefaultAPI.CreateShare(ctx, projectId, region, resourcePoolId). + share, err := r.client.CreateShare(ctx, projectId, region, resourcePoolId). CreateSharePayload(*payload). Execute() if err != nil { @@ -258,7 +254,7 @@ func (r *shareResource) Create(ctx context.Context, req resource.CreateRequest, return } - response, err := wait.CreateShareWaitHandler(ctx, r.client.DefaultAPI, projectId, region, resourcePoolId, *share.Share.Id). + response, err := wait.CreateShareWaitHandler(ctx, r.client, projectId, region, resourcePoolId, *share.Share.Id). WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating share", fmt.Sprintf("share creation waiting: %v", err)) @@ -273,7 +269,7 @@ func (r *shareResource) Create(ctx context.Context, req resource.CreateRequest, core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating share", "response did not contain an ID") return } - getResponse, err := r.client.DefaultAPI.GetShare(ctx, projectId, region, resourcePoolId, *response.Share.Id).Execute() + getResponse, err := r.client.GetShare(ctx, projectId, region, resourcePoolId, *response.Share.Id).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating share", fmt.Sprintf("share get: %v", err)) return @@ -319,7 +315,7 @@ func (r *shareResource) Read(ctx context.Context, req resource.ReadRequest, resp ctx = core.InitProviderContext(ctx) - response, err := r.client.DefaultAPI.GetShare(ctx, projectId, region, resourcePoolId, shareId).Execute() + response, err := r.client.GetShare(ctx, projectId, region, resourcePoolId, shareId).Execute() if err != nil { var openapiError *oapierror.GenericOpenAPIError if errors.As(err, &openapiError) { @@ -383,7 +379,7 @@ func (r *shareResource) Update(ctx context.Context, req resource.UpdateRequest, return } - response, err := r.client.DefaultAPI.UpdateShare(ctx, projectId, region, resourcePoolId, shareId). + response, err := r.client.UpdateShare(ctx, projectId, region, resourcePoolId, shareId). UpdateSharePayload(*payload). Execute() if err != nil { @@ -408,7 +404,7 @@ func (r *shareResource) Update(ctx context.Context, req resource.UpdateRequest, return } - getResponse, err := wait.UpdateShareWaitHandler(ctx, r.client.DefaultAPI, projectId, region, resourcePoolId, shareId).WaitWithContext(ctx) + getResponse, err := wait.UpdateShareWaitHandler(ctx, r.client, projectId, region, resourcePoolId, shareId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating share", fmt.Sprintf("share get: %v", err)) return @@ -448,7 +444,7 @@ func (r *shareResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = core.InitProviderContext(ctx) // Delete existing share - _, err := r.client.DefaultAPI.DeleteShare(ctx, projectId, region, resourcePoolId, shareId).Execute() + _, err := r.client.DeleteShare(ctx, projectId, region, resourcePoolId, shareId).Execute() if err != nil { var openapiError *oapierror.GenericOpenAPIError if errors.As(err, &openapiError) { @@ -463,7 +459,7 @@ func (r *shareResource) Delete(ctx context.Context, req resource.DeleteRequest, ctx = core.LogResponse(ctx) // only delete, if no error occurred - _, err = wait.DeleteShareWaitHandler(ctx, r.client.DefaultAPI, projectId, region, resourcePoolId, shareId).WaitWithContext(ctx) + _, err = wait.DeleteShareWaitHandler(ctx, r.client, projectId, region, resourcePoolId, shareId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting share", fmt.Sprintf("share deletion waiting: %v", err)) return diff --git a/stackit/internal/services/sfs/snapshot-policy/policies_datasource.go b/stackit/internal/services/sfs/snapshot-policy/policies_datasource.go index b476d6369..91d63acc9 100644 --- a/stackit/internal/services/sfs/snapshot-policy/policies_datasource.go +++ b/stackit/internal/services/sfs/snapshot-policy/policies_datasource.go @@ -14,9 +14,8 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - sfsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sfs/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -42,7 +41,7 @@ func NewSnapshotPoliciesDataSource() datasource.DataSource { } type policiesDataSource struct { - client *sfs.APIClient + client sfs.DefaultAPI providerData core.ProviderData } @@ -52,21 +51,19 @@ func (r *policiesDataSource) Metadata(_ context.Context, req datasource.Metadata func (r *policiesDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.SfsV1Client + features.CheckBetaResourcesEnabled(ctx, &r.providerData, &resp.Diagnostics, "stackit_sfs_snapshot_policies", core.Datasource) if resp.Diagnostics.HasError() { return } - apiClient := sfsUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "SFS client configured.") } @@ -201,7 +198,7 @@ func (r *policiesDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = tflog.SetField(ctx, "project_id", projectId) - listRequest := r.client.DefaultAPI.ListSnapshotPolicies(ctx, projectId) + listRequest := r.client.ListSnapshotPolicies(ctx, projectId) if !utils.IsUndefined(model.Immutable) { switch model.Immutable.ValueString() { case ImmutableFilterImmutableOnly: diff --git a/stackit/internal/services/sfs/snapshots/datasource.go b/stackit/internal/services/sfs/snapshots/datasource.go index c4ce23f42..edb8c6970 100644 --- a/stackit/internal/services/sfs/snapshots/datasource.go +++ b/stackit/internal/services/sfs/snapshots/datasource.go @@ -16,10 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" sfs "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features" - sfsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sfs/utils" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -58,7 +57,7 @@ type dataSourceModel struct { } type resourcePoolSnapshotDataSource struct { - client *sfs.APIClient + client sfs.DefaultAPI providerData core.ProviderData } @@ -68,22 +67,19 @@ func NewResourcePoolSnapshotDataSource() datasource.DataSource { // Configure implements datasource.DataSourceWithConfigure. func (r *resourcePoolSnapshotDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + r.providerData = providerData + r.client = clients.SfsV1Client + features.CheckBetaResourcesEnabled(ctx, &r.providerData, &resp.Diagnostics, "stackit_sfs_resource_pool_snapshot", core.Datasource) if resp.Diagnostics.HasError() { return } - apiClient := sfsUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient tflog.Info(ctx, "SFS client configured") } @@ -109,7 +105,7 @@ func (r *resourcePoolSnapshotDataSource) Read(ctx context.Context, req datasourc ctx = core.InitProviderContext(ctx) - response, err := r.client.DefaultAPI.ListResourcePoolSnapshots(ctx, projectId, region, resourcePoolId).Execute() + response, err := r.client.ListResourcePoolSnapshots(ctx, projectId, region, resourcePoolId).Execute() if err != nil { var openapiError *oapierror.GenericOpenAPIError if errors.As(err, &openapiError) { diff --git a/stackit/internal/services/sfs/utils/util.go b/stackit/internal/services/sfs/utils/util.go deleted file mode 100644 index 6b3797d5c..000000000 --- a/stackit/internal/services/sfs/utils/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - sfs "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *sfs.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.SfsCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.SfsCustomEndpoint)) - } - apiClient, err := sfs.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/sfs/utils/util_test.go b/stackit/internal/services/sfs/utils/util_test.go deleted file mode 100644 index 94eaed13f..000000000 --- a/stackit/internal/services/sfs/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - sfs "github.com/stackitcloud/stackit-sdk-go/services/sfs/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://sfs-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *sfs.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *sfs.APIClient { - apiClient, err := sfs.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - SfsCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *sfs.APIClient { - apiClient, err := sfs.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/ske/cluster/datasource.go b/stackit/internal/services/ske/cluster/datasource.go index c5461488f..78b4271a7 100644 --- a/stackit/internal/services/ske/cluster/datasource.go +++ b/stackit/internal/services/ske/cluster/datasource.go @@ -7,9 +7,6 @@ import ( sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - skeUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/ske/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -34,7 +31,7 @@ func NewClusterDataSource() datasource.DataSource { // clusterDataSource is the data source implementation. type clusterDataSource struct { - client *ske.APIClient + client ske.DefaultAPI providerData core.ProviderData } @@ -45,17 +42,14 @@ func (r *clusterDataSource) Metadata(_ context.Context, req datasource.MetadataR // Configure adds the provider configured client to the data source. func (r *clusterDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := skeUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.SkeV2Client + tflog.Info(ctx, "SKE client configured") } func (r *clusterDataSource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) { @@ -399,7 +393,7 @@ func (r *clusterDataSource) Read(ctx context.Context, req datasource.ReadRequest ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "name", name) ctx = tflog.SetField(ctx, "region", region) - clusterResp, err := r.client.DefaultAPI.GetCluster(ctx, projectId, region, name).Execute() + clusterResp, err := r.client.GetCluster(ctx, projectId, region, name).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/ske/cluster/resource.go b/stackit/internal/services/ske/cluster/resource.go index 2fd10bee1..69b22c91d 100644 --- a/stackit/internal/services/ske/cluster/resource.go +++ b/stackit/internal/services/ske/cluster/resource.go @@ -10,7 +10,6 @@ import ( "strings" "time" - serviceenablementUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/serviceenablement/utils" skeUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/ske/utils" stringplanmodifierUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils/planmodifiers/stringplanmodifier" @@ -303,8 +302,8 @@ func NewClusterResource() resource.Resource { // clusterResource is the resource implementation. type clusterResource struct { - skeClient *ske.APIClient - enablementClient *serviceenablement.APIClient + skeClient ske.DefaultAPI + enablementClient serviceenablement.DefaultAPI providerData core.ProviderData } @@ -407,22 +406,15 @@ func (r *clusterResource) Metadata(_ context.Context, req resource.MetadataReque // Configure adds the provider configured client to the resource. func (r *clusterResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - skeClient := skeUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - serviceEnablementClient := serviceenablementUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.skeClient = skeClient - r.enablementClient = serviceEnablementClient + r.providerData = providerData + r.skeClient = clients.SkeV2Client + r.enablementClient = clients.ServiceEnablementV2Client + tflog.Info(ctx, "SKE cluster clients configured") } @@ -986,13 +978,13 @@ func (r *clusterResource) Create(ctx context.Context, req resource.CreateRequest } // If SKE functionality is not enabled, enable it - err := r.enablementClient.DefaultAPI.EnableServiceRegional(ctx, region, projectId, utils.SKEServiceId).Execute() + err := r.enablementClient.EnableServiceRegional(ctx, region, projectId, utils.SKEServiceId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating cluster", fmt.Sprintf("Calling API to enable SKE: %v", err)) return } - _, err = enablementWait.EnableServiceWaitHandler(ctx, r.enablementClient.DefaultAPI, region, projectId, utils.SKEServiceId).WaitWithContext(ctx) + _, err = enablementWait.EnableServiceWaitHandler(ctx, r.enablementClient, region, projectId, utils.SKEServiceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating cluster", fmt.Sprintf("Wait for SKE enablement: %v", err)) return @@ -1046,7 +1038,7 @@ func sortK8sVersions(versions []ske.KubernetesVersion) { // The k8s versions are sorted descending order, i.e. the latest versions (including previews) // are listed first func (r *clusterResource) loadAvailableVersions(ctx context.Context, region string) ([]ske.KubernetesVersion, []ske.MachineImage, error) { - res, err := r.skeClient.DefaultAPI.ListProviderOptions(ctx, region).Execute() + res, err := r.skeClient.ListProviderOptions(ctx, region).Execute() if err != nil { return nil, nil, fmt.Errorf("calling API: %w", err) } @@ -1147,7 +1139,7 @@ func (r *clusterResource) createOrUpdateCluster(ctx context.Context, diags *diag Nodepools: nodePools, Access: access, } - _, err = r.skeClient.DefaultAPI.CreateOrUpdateCluster(ctx, projectId, region, name).CreateOrUpdateClusterPayload(payload).Execute() + _, err = r.skeClient.CreateOrUpdateCluster(ctx, projectId, region, name).CreateOrUpdateClusterPayload(payload).Execute() if err != nil { core.LogAndAddError(ctx, diags, "Error creating/updating cluster", fmt.Sprintf("Calling API: %v", err)) return @@ -1159,7 +1151,7 @@ func (r *clusterResource) createOrUpdateCluster(ctx context.Context, diags *diag // Call tflog.Info here, to log the information of the updated context tflog.Info(ctx, "Triggered create/update cluster") - waitResp, err := skeWait.CreateClusterWaitHandler(ctx, r.skeClient.DefaultAPI, projectId, region, name).WaitWithContext(ctx) + waitResp, err := skeWait.CreateClusterWaitHandler(ctx, r.skeClient, projectId, region, name).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, diags, "Error creating/updating cluster", fmt.Sprintf("Cluster creation waiting: %v", err)) return @@ -2507,7 +2499,7 @@ func (r *clusterResource) Read(ctx context.Context, req resource.ReadRequest, re ctx = tflog.SetField(ctx, "name", name) ctx = tflog.SetField(ctx, "region", region) - clResp, err := r.skeClient.DefaultAPI.GetCluster(ctx, projectId, region, name).Execute() + clResp, err := r.skeClient.GetCluster(ctx, projectId, region, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -2557,7 +2549,7 @@ func (r *clusterResource) Update(ctx context.Context, req resource.UpdateRequest return } - currentKubernetesVersion, currentMachineImages := getCurrentVersions(ctx, r.skeClient.DefaultAPI, &model) + currentKubernetesVersion, currentMachineImages := getCurrentVersions(ctx, r.skeClient, &model) r.createOrUpdateCluster(ctx, &resp.Diagnostics, &model, availableKubernetesVersions, availableMachines, currentKubernetesVersion, currentMachineImages) if resp.Diagnostics.HasError() { @@ -2588,7 +2580,7 @@ func (r *clusterResource) Delete(ctx context.Context, req resource.DeleteRequest ctx = tflog.SetField(ctx, "name", name) ctx = tflog.SetField(ctx, "region", region) - _, err := r.skeClient.DefaultAPI.DeleteCluster(ctx, projectId, region, name).Execute() + _, err := r.skeClient.DeleteCluster(ctx, projectId, region, name).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -2601,7 +2593,7 @@ func (r *clusterResource) Delete(ctx context.Context, req resource.DeleteRequest ctx = core.LogResponse(ctx) - _, err = skeWait.DeleteClusterWaitHandler(ctx, r.skeClient.DefaultAPI, projectId, region, name).WaitWithContext(ctx) + _, err = skeWait.DeleteClusterWaitHandler(ctx, r.skeClient, projectId, region, name).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting cluster", fmt.Sprintf("Cluster deletion waiting: %v", err)) return diff --git a/stackit/internal/services/ske/kubeconfig/resource.go b/stackit/internal/services/ske/kubeconfig/resource.go index 348b45955..21d242254 100644 --- a/stackit/internal/services/ske/kubeconfig/resource.go +++ b/stackit/internal/services/ske/kubeconfig/resource.go @@ -8,8 +8,6 @@ import ( "strconv" "time" - skeUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/ske/utils" - "github.com/google/uuid" "github.com/hashicorp/terraform-plugin-framework-validators/int64validator" "github.com/hashicorp/terraform-plugin-framework/path" @@ -61,7 +59,7 @@ func NewKubeconfigResource() resource.Resource { // kubeconfigResource is the resource implementation. type kubeconfigResource struct { - client *ske.APIClient + client ske.DefaultAPI providerData core.ProviderData } @@ -72,17 +70,14 @@ func (r *kubeconfigResource) Metadata(_ context.Context, req resource.MetadataRe // Configure adds the provider configured client to the resource. func (r *kubeconfigResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := skeUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.SkeV2Client + tflog.Info(ctx, "SKE kubeconfig client configured") } @@ -314,7 +309,7 @@ func (r *kubeconfigResource) Read(ctx context.Context, req resource.ReadRequest, ctx = tflog.SetField(ctx, "kube_config_id", kubeconfigUUID) ctx = tflog.SetField(ctx, "region", region) - cluster, err := r.client.DefaultAPI.GetCluster(ctx, projectId, region, clusterName).Execute() + cluster, err := r.client.GetCluster(ctx, projectId, region, clusterName).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -379,7 +374,7 @@ func (r *kubeconfigResource) createKubeconfig(ctx context.Context, model *Model) return fmt.Errorf("creating API payload: %w", err) } // Create new kubeconfig - kubeconfigResp, err := r.client.DefaultAPI.CreateKubeconfig(ctx, model.ProjectId.ValueString(), model.Region.ValueString(), model.ClusterName.ValueString()).CreateKubeconfigPayload(*payload).Execute() + kubeconfigResp, err := r.client.CreateKubeconfig(ctx, model.ProjectId.ValueString(), model.Region.ValueString(), model.ClusterName.ValueString()).CreateKubeconfigPayload(*payload).Execute() if err != nil { return fmt.Errorf("calling API: %w", err) } diff --git a/stackit/internal/services/ske/provideroptions/kubernetesversions/datasource.go b/stackit/internal/services/ske/provideroptions/kubernetesversions/datasource.go index a5e35352d..48c38b174 100644 --- a/stackit/internal/services/ske/provideroptions/kubernetesversions/datasource.go +++ b/stackit/internal/services/ske/provideroptions/kubernetesversions/datasource.go @@ -16,9 +16,7 @@ import ( sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - skeUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/ske/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) @@ -47,7 +45,7 @@ func NewKubernetesVersionsDataSource() datasource.DataSource { } type kubernetesVersionsDataSource struct { - client *ske.APIClient + client ske.DefaultAPI providerData core.ProviderData } @@ -57,16 +55,13 @@ func (d *kubernetesVersionsDataSource) Metadata(_ context.Context, req datasourc } func (d *kubernetesVersionsDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - d.client = skeUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + d.providerData = providerData + d.client = clients.SkeV2Client tflog.Info(ctx, "SKE options client configured") } @@ -131,7 +126,7 @@ func (d *kubernetesVersionsDataSource) Read(ctx context.Context, req datasource. ctx = core.InitProviderContext(ctx) ctx = tflog.SetField(ctx, "region", region) - listProviderOptionsReq := d.client.DefaultAPI.ListProviderOptions(ctx, region) + listProviderOptionsReq := d.client.ListProviderOptions(ctx, region) if !utils.IsUndefined(model.VersionState) { listProviderOptionsReq = listProviderOptionsReq.VersionState( diff --git a/stackit/internal/services/ske/provideroptions/machineimages/datasource.go b/stackit/internal/services/ske/provideroptions/machineimages/datasource.go index c20ca5e8f..874e8bd19 100644 --- a/stackit/internal/services/ske/provideroptions/machineimages/datasource.go +++ b/stackit/internal/services/ske/provideroptions/machineimages/datasource.go @@ -16,9 +16,7 @@ import ( sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - skeUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/ske/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) @@ -52,7 +50,7 @@ func NewKubernetesMachineImageVersionDataSource() datasource.DataSource { } type machineImagesDataSource struct { - client *ske.APIClient + client ske.DefaultAPI providerData core.ProviderData } @@ -62,20 +60,13 @@ func (d *machineImagesDataSource) Metadata(_ context.Context, req datasource.Met } func (d *machineImagesDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - if req.ProviderData == nil { - return - } - - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - d.client = skeUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if d.client == nil { - return - } + d.providerData = providerData + d.client = clients.SkeV2Client tflog.Info(ctx, "SKE machine image versions client configured") } @@ -151,7 +142,7 @@ func (d *machineImagesDataSource) Read(ctx context.Context, req datasource.ReadR ctx = core.InitProviderContext(ctx) ctx = tflog.SetField(ctx, "region", region) - listProviderOptionsReq := d.client.DefaultAPI.ListProviderOptions(ctx, region) + listProviderOptionsReq := d.client.ListProviderOptions(ctx, region) if !utils.IsUndefined(model.VersionState) { listProviderOptionsReq = listProviderOptionsReq.VersionState( diff --git a/stackit/internal/services/ske/utils/util.go b/stackit/internal/services/ske/utils/util.go index 6b4aca343..1bccc70a2 100644 --- a/stackit/internal/services/ske/utils/util.go +++ b/stackit/internal/services/ske/utils/util.go @@ -2,36 +2,14 @@ package utils import ( "context" - "fmt" - "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/stackitcloud/stackit-sdk-go/core/config" ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils/planmodifiers/stringplanmodifier" ) -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *ske.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.SKECustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.SKECustomEndpoint)) - } - apiClient, err := ske.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} - func IsEmptyNetwork(network *ske.Network) bool { if !network.HasId() && !network.HasControlPlane() { return true diff --git a/stackit/internal/services/ske/utils/util_test.go b/stackit/internal/services/ske/utils/util_test.go index 2729e7027..d8a59e6bd 100644 --- a/stackit/internal/services/ske/utils/util_test.go +++ b/stackit/internal/services/ske/utils/util_test.go @@ -1,98 +1,11 @@ package utils import ( - "context" - "os" - "reflect" "testing" - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://ske-custom-endpoint.api.stackit.cloud" ) -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *ske.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *ske.APIClient { - apiClient, err := ske.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - SKECustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *ske.APIClient { - apiClient, err := ske.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} - func TestIsEmptyNetwork(t *testing.T) { tests := []struct { name string diff --git a/stackit/internal/services/sqlserverflex/database/datasource.go b/stackit/internal/services/sqlserverflex/database/datasource.go index 18e874bda..2bb371af8 100644 --- a/stackit/internal/services/sqlserverflex/database/datasource.go +++ b/stackit/internal/services/sqlserverflex/database/datasource.go @@ -11,13 +11,11 @@ import ( "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" - sdk "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - sqlserverflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sqlserverflex/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -31,7 +29,7 @@ func NewDatabaseDataSource() datasource.DataSource { } type databaseDataSource struct { - client *sdk.APIClient + client sqlserverflex.DefaultAPI providerData core.ProviderData } @@ -57,17 +55,14 @@ func (d *databaseDataSource) Metadata(_ context.Context, req datasource.Metadata } func (d *databaseDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := sqlserverflexUtils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient + d.providerData = providerData + d.client = clients.SqlServerFlexV3Client + tflog.Info(ctx, "SqlserverFlex client configured") } @@ -154,7 +149,7 @@ func (d *databaseDataSource) Read(ctx context.Context, req datasource.ReadReques "name": model.Name, }) - apiResp, err := d.client.DefaultAPI.GetDatabase(ctx, projectId, region, instanceId, name).Execute() + apiResp, err := d.client.GetDatabase(ctx, projectId, region, instanceId, name).Execute() if err != nil { utils.LogError(ctx, &resp.Diagnostics, err, "read SqlserverFlex database", fmt.Sprintf("database with name %q does not exist in instance %q", name, instanceId), diff --git a/stackit/internal/services/sqlserverflex/database/resource.go b/stackit/internal/services/sqlserverflex/database/resource.go index 1e6bacb93..fe702c492 100644 --- a/stackit/internal/services/sqlserverflex/database/resource.go +++ b/stackit/internal/services/sqlserverflex/database/resource.go @@ -16,11 +16,10 @@ import ( "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" + sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - sdk "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" sqlserverflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sqlserverflex/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" @@ -39,7 +38,7 @@ func NewDatabaseResource() resource.Resource { } type databaseResource struct { - client *sdk.APIClient + client sqlserverflex.DefaultAPI providerData core.ProviderData } @@ -53,16 +52,13 @@ func (r *databaseResource) Metadata(_ context.Context, req resource.MetadataRequ } func (r *databaseResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := sqlserverflexUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + + r.providerData = providerData + r.client = clients.SqlServerFlexV3Client } func (r *databaseResource) ModifyPlan(ctx context.Context, req resource.ModifyPlanRequest, resp *resource.ModifyPlanResponse) { // nolint:gocritic // function signature required by Terraform @@ -204,7 +200,7 @@ func (r *databaseResource) Create(ctx context.Context, req resource.CreateReques // Workaround: The database creation will be tried 5 times. In some cases the instance might be // in maintenance mode and the database API is temporarily unavailable. Usually this is only for 1-2 seconds. - _, err = utils.RetryRequest(ctx, r.client.DefaultAPI.CreateDatabase(ctx, projectId, region, instanceId).CreateDatabasePayload(*payload).Execute, sqlserverflexUtils.RetryConfig) + _, err = utils.RetryRequest(ctx, r.client.CreateDatabase(ctx, projectId, region, instanceId).CreateDatabasePayload(*payload).Execute, sqlserverflexUtils.RetryConfig) if err != nil { resp.Diagnostics.AddError("Error creating database", err.Error()) return @@ -222,7 +218,7 @@ func (r *databaseResource) Create(ctx context.Context, req resource.CreateReques return } - apiResp, err := r.client.DefaultAPI.GetDatabase(ctx, projectId, region, instanceId, model.Name.ValueString()).Execute() + apiResp, err := r.client.GetDatabase(ctx, projectId, region, instanceId, model.Name.ValueString()).Execute() if err != nil { resp.Diagnostics.AddError("Error reading database after creation", err.Error()) return @@ -265,7 +261,7 @@ func (r *databaseResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = core.InitProviderContext(ctx) - apiResp, err := r.client.DefaultAPI.GetDatabase(ctx, projectId, region, instanceId, name).Execute() + apiResp, err := r.client.GetDatabase(ctx, projectId, region, instanceId, name).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -318,7 +314,7 @@ func (r *databaseResource) Delete(ctx context.Context, req resource.DeleteReques // Workaround: The database deletion will be tried 5 times. In some cases the instance might be // in maintenance mode and the database API is temporarily unavailable. Usually this is only for 1-2 seconds. - err := utils.RetryRequestWithoutResponse(ctx, r.client.DefaultAPI.DeleteDatabase(ctx, projectId, region, instanceId, name).Execute, sqlserverflexUtils.RetryConfig) + err := utils.RetryRequestWithoutResponse(ctx, r.client.DeleteDatabase(ctx, projectId, region, instanceId, name).Execute, sqlserverflexUtils.RetryConfig) if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { return @@ -353,7 +349,7 @@ func (r *databaseResource) ImportState(ctx context.Context, req resource.ImportS tflog.Info(ctx, "SqlserverFlex database state imported") } -func mapFields(apiResp *sdk.GetDatabaseResponse, model *SharedModel, region string) error { +func mapFields(apiResp *sqlserverflex.GetDatabaseResponse, model *SharedModel, region string) error { if apiResp == nil { return fmt.Errorf("response is nil") } @@ -378,11 +374,11 @@ func mapFields(apiResp *sdk.GetDatabaseResponse, model *SharedModel, region stri return nil } -func toCreatePayload(model *Model) (*sdk.CreateDatabasePayload, error) { +func toCreatePayload(model *Model) (*sqlserverflex.CreateDatabasePayload, error) { if model == nil { return nil, fmt.Errorf("nil model") } - payload := &sdk.CreateDatabasePayload{ + payload := &sqlserverflex.CreateDatabasePayload{ Name: model.Name.ValueString(), Owner: model.Owner.ValueString(), } diff --git a/stackit/internal/services/sqlserverflex/flavors/datasource.go b/stackit/internal/services/sqlserverflex/flavors/datasource.go index 5b99dcd07..9a682b4b8 100644 --- a/stackit/internal/services/sqlserverflex/flavors/datasource.go +++ b/stackit/internal/services/sqlserverflex/flavors/datasource.go @@ -14,9 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - sqlserverflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sqlserverflex/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -52,7 +50,7 @@ type storageClass struct { } type flavors struct { - client *sqlserverflex.APIClient + client sqlserverflex.DefaultAPI providerData core.ProviderData } @@ -65,17 +63,13 @@ func (f *flavors) Metadata(_ context.Context, req datasource.MetadataRequest, re } func (f *flavors) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - f.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + _, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := sqlserverflexUtils.ConfigureClient(ctx, &f.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - f.client = apiClient + f.client = clients.SqlServerFlexV3Client + tflog.Info(ctx, "SqlserverFlex client configured") } @@ -187,7 +181,7 @@ func (f *flavors) Read(ctx context.Context, req datasource.ReadRequest, resp *da ctx = core.InitProviderContext(ctx) const pageSize = 100 - flavorsResp, err := f.client.DefaultAPI.ListFlavors(ctx, projectId, region).Size(pageSize).Execute() + flavorsResp, err := f.client.ListFlavors(ctx, projectId, region).Size(pageSize).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Reading flavors", fmt.Sprintf("Error calling ListFlavors: %v", err)) return diff --git a/stackit/internal/services/sqlserverflex/instance/datasource.go b/stackit/internal/services/sqlserverflex/instance/datasource.go index 702fa9859..2ec4cc922 100644 --- a/stackit/internal/services/sqlserverflex/instance/datasource.go +++ b/stackit/internal/services/sqlserverflex/instance/datasource.go @@ -5,9 +5,6 @@ import ( "fmt" "net/http" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - sqlserverflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sqlserverflex/utils" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types/basetypes" @@ -34,7 +31,7 @@ func NewInstanceDataSource() datasource.DataSource { // instanceDataSource is the data source implementation. type instanceDataSource struct { - client *sqlserverflex.APIClient + client sqlserverflex.DefaultAPI providerData core.ProviderData } @@ -45,17 +42,14 @@ func (r *instanceDataSource) Metadata(_ context.Context, req datasource.Metadata // Configure adds the provider configured client to the data source. func (r *instanceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := sqlserverflexUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.SqlServerFlexV3Client + tflog.Info(ctx, "SQLServer Flex instance client configured") } @@ -256,7 +250,7 @@ func (r *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "region", region) - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { utils.LogError( ctx, @@ -284,7 +278,7 @@ func (r *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques } flavor := &flavorModel{} - flavorResp, err := getFlavor(ctx, r.client.DefaultAPI, projectId, region, instanceResp.FlavorId) + flavorResp, err := getFlavor(ctx, r.client, projectId, region, instanceResp.FlavorId) if err != nil { core.LogAndAddWarning(ctx, &resp.Diagnostics, "Flavor not populated", fmt.Sprintf("Finding flavor %q: %v", instanceResp.FlavorId, err)) } else if flavorResp != nil { diff --git a/stackit/internal/services/sqlserverflex/instance/resource.go b/stackit/internal/services/sqlserverflex/instance/resource.go index 9e4ea62a5..0a0143730 100644 --- a/stackit/internal/services/sqlserverflex/instance/resource.go +++ b/stackit/internal/services/sqlserverflex/instance/resource.go @@ -16,7 +16,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema/int32planmodifier" sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" - sqlserverflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sqlserverflex/utils" int32planmodifier2 "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils/planmodifiers/int32planmodifier" listplanmodifier2 "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils/planmodifiers/listplanmodifier" objectplanmodifier2 "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils/planmodifiers/objectplanmodifier" @@ -156,7 +155,7 @@ func NewInstanceResource() resource.Resource { // instanceResource is the resource implementation. type instanceResource struct { - client *sqlserverflex.APIClient + client sqlserverflex.DefaultAPI providerData core.ProviderData } @@ -167,17 +166,14 @@ func (r *instanceResource) Metadata(_ context.Context, req resource.MetadataRequ // Configure adds the provider configured client to the resource. func (r *instanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := sqlserverflexUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.SqlServerFlexV3Client + tflog.Info(ctx, "SQLServer Flex instance client configured") } @@ -685,7 +681,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques if resp.Diagnostics.HasError() { return } - err := loadFlavorId(ctx, r.client.DefaultAPI, &model, flavor) + err := loadFlavorId(ctx, r.client, &model, flavor) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Loading flavor ID: %v", err)) return @@ -725,7 +721,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques return } // Create new instance - createResp, err := r.client.DefaultAPI.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() + createResp, err := r.client.CreateInstance(ctx, projectId, region).CreateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Calling API: %v", err)) return @@ -750,7 +746,7 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques } // The creation waiter sometimes returns an error from the API: "instance with id xxx has unexpected status Failure" // which can be avoided by sleeping before wait - waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).SetSleepBeforeWait(30 * time.Second).WaitWithContext(ctx) + waitResp, err := wait.CreateInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).SetSleepBeforeWait(30 * time.Second).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating instance", fmt.Sprintf("Instance creation waiting: %v", err)) return @@ -804,7 +800,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r ctx = tflog.SetField(ctx, "instance_id", instanceId) ctx = tflog.SetField(ctx, "region", region) - instanceResp, err := r.client.DefaultAPI.GetInstance(ctx, projectId, region, instanceId).Execute() + instanceResp, err := r.client.GetInstance(ctx, projectId, region, instanceId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -826,7 +822,7 @@ func (r *instanceResource) Read(ctx context.Context, req resource.ReadRequest, r } } else { // Read the flavor here from the API, because during an import the flavor should be set - flavorResp, err := getFlavor(ctx, r.client.DefaultAPI, projectId, region, instanceResp.FlavorId) + flavorResp, err := getFlavor(ctx, r.client, projectId, region, instanceResp.FlavorId) if err != nil { core.LogAndAddWarning(ctx, &resp.Diagnostics, "Flavor not populated", fmt.Sprintf("Finding flavor %q: %v", instanceResp.FlavorId, err)) } else if flavorResp != nil { @@ -889,7 +885,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques if resp.Diagnostics.HasError() { return } - err := loadFlavorId(ctx, r.client.DefaultAPI, &model, flavor) + err := loadFlavorId(ctx, r.client, &model, flavor) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Loading flavor ID: %v", err)) return @@ -929,7 +925,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques return } // Update existing instance - err = r.client.DefaultAPI.PartialUpdateInstance(ctx, projectId, region, instanceId).PartialUpdateInstancePayload(*payload).Execute() + err = r.client.PartialUpdateInstance(ctx, projectId, region, instanceId).PartialUpdateInstancePayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", err.Error()) return @@ -937,7 +933,7 @@ func (r *instanceResource) Update(ctx context.Context, req resource.UpdateReques ctx = core.LogResponse(ctx) - waitResp, err := wait.UpdateInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + waitResp, err := wait.UpdateInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating instance", fmt.Sprintf("Instance update waiting: %v", err)) return @@ -977,7 +973,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = tflog.SetField(ctx, "region", region) // Delete existing instance - err := r.client.DefaultAPI.DeleteInstance(ctx, projectId, region, instanceId).Execute() + err := r.client.DeleteInstance(ctx, projectId, region, instanceId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -989,7 +985,7 @@ func (r *instanceResource) Delete(ctx context.Context, req resource.DeleteReques ctx = core.LogResponse(ctx) - _, err = wait.DeleteInstanceWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + _, err = wait.DeleteInstanceWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting instance", fmt.Sprintf("Instance deletion waiting: %v", err)) return diff --git a/stackit/internal/services/sqlserverflex/user/datasource.go b/stackit/internal/services/sqlserverflex/user/datasource.go index a5e79ad19..889794a11 100644 --- a/stackit/internal/services/sqlserverflex/user/datasource.go +++ b/stackit/internal/services/sqlserverflex/user/datasource.go @@ -6,9 +6,6 @@ import ( "net/http" "strconv" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" - sqlserverflexUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/sqlserverflex/utils" - "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/schema/validator" @@ -47,7 +44,7 @@ func NewUserDataSource() datasource.DataSource { // userDataSource is the data source implementation. type userDataSource struct { - client *sqlserverflex.APIClient + client sqlserverflex.DefaultAPI providerData core.ProviderData } @@ -58,17 +55,14 @@ func (r *userDataSource) Metadata(_ context.Context, req datasource.MetadataRequ // Configure adds the provider configured client to the data source. func (r *userDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := sqlserverflexUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.SqlServerFlexV3Client + tflog.Info(ctx, "SQLServer Flex user client configured") } @@ -166,7 +160,7 @@ func (r *userDataSource) Read(ctx context.Context, req datasource.ReadRequest, r return } - recordSetResp, err := r.client.DefaultAPI.GetUser(ctx, projectId, region, instanceId, userId).Execute() + recordSetResp, err := r.client.GetUser(ctx, projectId, region, instanceId, userId).Execute() if err != nil { utils.LogError( ctx, diff --git a/stackit/internal/services/sqlserverflex/user/resource.go b/stackit/internal/services/sqlserverflex/user/resource.go index 59f1b4734..8c0157534 100644 --- a/stackit/internal/services/sqlserverflex/user/resource.go +++ b/stackit/internal/services/sqlserverflex/user/resource.go @@ -15,7 +15,6 @@ import ( "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-log/tflog" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" @@ -65,7 +64,7 @@ func NewUserResource() resource.Resource { // userResource is the resource implementation. type userResource struct { - client *sqlserverflex.APIClient + client sqlserverflex.DefaultAPI providerData core.ProviderData } @@ -76,17 +75,14 @@ func (r *userResource) Metadata(_ context.Context, req resource.MetadataRequest, // Configure adds the provider configured client to the resource. func (r *userResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := sqlserverflexUtils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.SqlServerFlexV3Client + tflog.Info(ctx, "SQLServer Flex user client configured") } @@ -266,7 +262,7 @@ func (r *userResource) Create(ctx context.Context, req resource.CreateRequest, r // Create new user // Workaround: The user creation will be tried 5 times. In some cases the instance might be // in maintenance mode and the user API is temporarily unavailable. Usually this is only for 1-2 seconds. - userResp, err := utils.RetryRequest(ctx, r.client.DefaultAPI.CreateUser(ctx, projectId, region, instanceId).CreateUserPayload(*payload).Execute, sqlserverflexUtils.RetryConfig) + userResp, err := utils.RetryRequest(ctx, r.client.CreateUser(ctx, projectId, region, instanceId).CreateUserPayload(*payload).Execute, sqlserverflexUtils.RetryConfig) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating user", fmt.Sprintf("Calling API: %v", err)) return @@ -286,7 +282,7 @@ func (r *userResource) Create(ctx context.Context, req resource.CreateRequest, r "user_id": userId, }) - _, err = wait.CreateUserWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, userResp.Id).WaitWithContext(ctx) + _, err = wait.CreateUserWaitHandler(ctx, r.client, projectId, region, instanceId, userResp.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating user", fmt.Sprintf("user creation waiting: %v", err)) return @@ -337,7 +333,7 @@ func (r *userResource) Read(ctx context.Context, req resource.ReadRequest, resp return } - userResp, err := r.client.DefaultAPI.GetUser(ctx, projectId, region, instanceId, userId).Execute() + userResp, err := r.client.GetUser(ctx, projectId, region, instanceId, userId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -401,7 +397,7 @@ func (r *userResource) Delete(ctx context.Context, req resource.DeleteRequest, r // Delete existing user // Workaround: The user deletion will be tried 5 times. In some cases the instance might be // in maintenance mode and the user API is temporarily unavailable. Usually this is only for 1-2 seconds. - err = utils.RetryRequestWithoutResponse(ctx, r.client.DefaultAPI.DeleteUser(ctx, projectId, region, instanceId, userId).Execute, sqlserverflexUtils.RetryConfig) + err = utils.RetryRequestWithoutResponse(ctx, r.client.DeleteUser(ctx, projectId, region, instanceId, userId).Execute, sqlserverflexUtils.RetryConfig) if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { return @@ -412,7 +408,7 @@ func (r *userResource) Delete(ctx context.Context, req resource.DeleteRequest, r ctx = core.LogResponse(ctx) - _, err = wait.DeleteUserWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, userId).WaitWithContext(ctx) + _, err = wait.DeleteUserWaitHandler(ctx, r.client, projectId, region, instanceId, userId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting user", fmt.Sprintf("user deletion waiting: %v", err)) return diff --git a/stackit/internal/services/sqlserverflex/utils/util.go b/stackit/internal/services/sqlserverflex/utils/util.go index 07e48c1c1..d04b55984 100644 --- a/stackit/internal/services/sqlserverflex/utils/util.go +++ b/stackit/internal/services/sqlserverflex/utils/util.go @@ -1,37 +1,12 @@ package utils import ( - "context" - "fmt" "net/http" "time" - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" ) -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *sqlserverflex.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.SQLServerFlexCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.SQLServerFlexCustomEndpoint)) - } - apiClient, err := sqlserverflex.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} - var RetryConfig = utils.RetryConfig{ Attempts: 5, Backoff: func(attempt int) time.Duration { diff --git a/stackit/internal/services/sqlserverflex/utils/util_test.go b/stackit/internal/services/sqlserverflex/utils/util_test.go deleted file mode 100644 index d0ea73d82..000000000 --- a/stackit/internal/services/sqlserverflex/utils/util_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - - sqlserverflex "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://sqlserverflex-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *sqlserverflex.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *sqlserverflex.APIClient { - apiClient, err := sqlserverflex.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - SQLServerFlexCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *sqlserverflex.APIClient { - apiClient, err := sqlserverflex.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/telemetrylink/link/datasource.go b/stackit/internal/services/telemetrylink/link/datasource.go index 596826734..3f0afbac2 100644 --- a/stackit/internal/services/telemetrylink/link/datasource.go +++ b/stackit/internal/services/telemetrylink/link/datasource.go @@ -14,9 +14,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" telemetrylink "github.com/stackitcloud/stackit-sdk-go/services/telemetrylink/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/telemetrylink/utils" + tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -42,7 +41,7 @@ type DataSourceModel struct { } type telemetryLinkDataSource struct { - client *telemetrylink.APIClient + client telemetrylink.DefaultAPI providerData core.ProviderData } @@ -51,17 +50,14 @@ func (d *telemetryLinkDataSource) Metadata(_ context.Context, req datasource.Met } func (d *telemetryLinkDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.providerData = providerData + d.client = clients.TelemetryLinkV1Client - apiClient := utils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient tflog.Info(ctx, "TelemetryLink client configured") } @@ -141,11 +137,11 @@ func (d *telemetryLinkDataSource) Read(ctx context.Context, req datasource.ReadR var err error switch resourceType { case resourceTypeOrganization: - response, err = d.client.DefaultAPI.GetOrganizationTelemetryLink(ctx, resourceID, region).Execute() + response, err = d.client.GetOrganizationTelemetryLink(ctx, resourceID, region).Execute() case resourceTypeFolder: - response, err = d.client.DefaultAPI.GetFolderTelemetryLink(ctx, resourceID, region).Execute() + response, err = d.client.GetFolderTelemetryLink(ctx, resourceID, region).Execute() case resourceTypeProject: - response, err = d.client.DefaultAPI.GetProjectTelemetryLink(ctx, resourceID, region).Execute() + response, err = d.client.GetProjectTelemetryLink(ctx, resourceID, region).Execute() default: core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading TelemetryLink", fmt.Sprintf("Unsupported resource type: %s", resourceType)) return diff --git a/stackit/internal/services/telemetrylink/link/resource.go b/stackit/internal/services/telemetrylink/link/resource.go index 9052fa1d9..e21c4ffd4 100644 --- a/stackit/internal/services/telemetrylink/link/resource.go +++ b/stackit/internal/services/telemetrylink/link/resource.go @@ -25,9 +25,8 @@ import ( telemetrylink "github.com/stackitcloud/stackit-sdk-go/services/telemetrylink/v1api" "github.com/stackitcloud/stackit-sdk-go/services/telemetrylink/v1api/wait" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/telemetrylink/utils" + tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -86,7 +85,7 @@ type Model struct { } type telemetryLinkResource struct { - client *telemetrylink.APIClient + client telemetrylink.DefaultAPI providerData core.ProviderData } @@ -95,17 +94,14 @@ func NewTelemetryLinkResource() resource.Resource { } func (r *telemetryLinkResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := utils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient r.providerData = providerData + r.client = clients.TelemetryLinkV1Client + tflog.Info(ctx, "TelemetryLink client configured") } @@ -290,7 +286,7 @@ func (r *telemetryLinkResource) Create(ctx context.Context, req resource.CreateR return } - createResp, err := r.client.DefaultAPI.CreateOrUpdateOrganizationTelemetryLink(ctx, resourceID, region). + createResp, err := r.client.CreateOrUpdateOrganizationTelemetryLink(ctx, resourceID, region). CreateOrUpdateOrganizationTelemetryLinkPayload(*payload). IfNoneMatch("*"). Execute() @@ -316,7 +312,7 @@ func (r *telemetryLinkResource) Create(ctx context.Context, req resource.CreateR return } - response, err = wait.CreateOrganizationTelemetryLinkWaitHandler(ctx, r.client.DefaultAPI, resourceID, region).WaitWithContext(ctx) + response, err = wait.CreateOrganizationTelemetryLinkWaitHandler(ctx, r.client, resourceID, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating TelemetryLink", fmt.Sprintf("Waiting for TelemetryLink to become active: %v", err)) return @@ -329,7 +325,7 @@ func (r *telemetryLinkResource) Create(ctx context.Context, req resource.CreateR return } - createResp, err := r.client.DefaultAPI.CreateOrUpdateFolderTelemetryLink(ctx, resourceID, region). + createResp, err := r.client.CreateOrUpdateFolderTelemetryLink(ctx, resourceID, region). CreateOrUpdateFolderTelemetryLinkPayload(*payload). IfNoneMatch("*"). Execute() @@ -355,7 +351,7 @@ func (r *telemetryLinkResource) Create(ctx context.Context, req resource.CreateR return } - response, err = wait.CreateFolderTelemetryLinkWaitHandler(ctx, r.client.DefaultAPI, resourceID, region).WaitWithContext(ctx) + response, err = wait.CreateFolderTelemetryLinkWaitHandler(ctx, r.client, resourceID, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating TelemetryLink", fmt.Sprintf("Waiting for TelemetryLink to become active: %v", err)) return @@ -367,7 +363,7 @@ func (r *telemetryLinkResource) Create(ctx context.Context, req resource.CreateR return } - createResp, err := r.client.DefaultAPI.CreateOrUpdateProjectTelemetryLink(ctx, resourceID, region). + createResp, err := r.client.CreateOrUpdateProjectTelemetryLink(ctx, resourceID, region). CreateOrUpdateProjectTelemetryLinkPayload(*payload). IfNoneMatch("*"). Execute() @@ -393,7 +389,7 @@ func (r *telemetryLinkResource) Create(ctx context.Context, req resource.CreateR return } - response, err = wait.CreateProjectTelemetryLinkWaitHandler(ctx, r.client.DefaultAPI, resourceID, region).WaitWithContext(ctx) + response, err = wait.CreateProjectTelemetryLinkWaitHandler(ctx, r.client, resourceID, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating TelemetryLink", fmt.Sprintf("Waiting for TelemetryLink to become active: %v", err)) return @@ -438,11 +434,11 @@ func (r *telemetryLinkResource) Read(ctx context.Context, req resource.ReadReque var response *telemetrylink.TelemetryLinkResponse switch resourceType { case resourceTypeOrganization: - response, err = r.client.DefaultAPI.GetOrganizationTelemetryLink(ctx, resourceID, region).Execute() + response, err = r.client.GetOrganizationTelemetryLink(ctx, resourceID, region).Execute() case resourceTypeFolder: - response, err = r.client.DefaultAPI.GetFolderTelemetryLink(ctx, resourceID, region).Execute() + response, err = r.client.GetFolderTelemetryLink(ctx, resourceID, region).Execute() case resourceTypeProject: - response, err = r.client.DefaultAPI.GetProjectTelemetryLink(ctx, resourceID, region).Execute() + response, err = r.client.GetProjectTelemetryLink(ctx, resourceID, region).Execute() default: core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading TelemetryLink", fmt.Sprintf("Unsupported resource type: %s", model.ResourceType.ValueString())) return @@ -523,7 +519,7 @@ func (r *telemetryLinkResource) Update(ctx context.Context, req resource.UpdateR return } - _, err = r.client.DefaultAPI.PartialUpdateOrganizationTelemetryLink(ctx, resourceID, region). + _, err = r.client.PartialUpdateOrganizationTelemetryLink(ctx, resourceID, region). PartialUpdateOrganizationTelemetryLinkPayload(*payload). Execute() if err != nil { @@ -533,7 +529,7 @@ func (r *telemetryLinkResource) Update(ctx context.Context, req resource.UpdateR ctx = core.LogResponse(ctx) - response, err = wait.PartialUpdateOrganizationTelemetryLinkWaitHandler(ctx, r.client.DefaultAPI, resourceID, region).WaitWithContext(ctx) + response, err = wait.PartialUpdateOrganizationTelemetryLinkWaitHandler(ctx, r.client, resourceID, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating TelemetryLink", fmt.Sprintf("Waiting for TelemetryLink to become active: %v", err)) return @@ -545,7 +541,7 @@ func (r *telemetryLinkResource) Update(ctx context.Context, req resource.UpdateR return } - _, err = r.client.DefaultAPI.PartialUpdateFolderTelemetryLink(ctx, resourceID, region). + _, err = r.client.PartialUpdateFolderTelemetryLink(ctx, resourceID, region). PartialUpdateFolderTelemetryLinkPayload(*payload). Execute() if err != nil { @@ -555,7 +551,7 @@ func (r *telemetryLinkResource) Update(ctx context.Context, req resource.UpdateR ctx = core.LogResponse(ctx) - response, err = wait.PartialUpdateFolderTelemetryLinkWaitHandler(ctx, r.client.DefaultAPI, resourceID, region).WaitWithContext(ctx) + response, err = wait.PartialUpdateFolderTelemetryLinkWaitHandler(ctx, r.client, resourceID, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating TelemetryLink", fmt.Sprintf("Waiting for TelemetryLink to become active: %v", err)) return @@ -567,7 +563,7 @@ func (r *telemetryLinkResource) Update(ctx context.Context, req resource.UpdateR return } - _, err = r.client.DefaultAPI.PartialUpdateProjectTelemetryLink(ctx, resourceID, region). + _, err = r.client.PartialUpdateProjectTelemetryLink(ctx, resourceID, region). PartialUpdateProjectTelemetryLinkPayload(*payload). Execute() if err != nil { @@ -577,7 +573,7 @@ func (r *telemetryLinkResource) Update(ctx context.Context, req resource.UpdateR ctx = core.LogResponse(ctx) - response, err = wait.PartialUpdateProjectTelemetryLinkWaitHandler(ctx, r.client.DefaultAPI, resourceID, region).WaitWithContext(ctx) + response, err = wait.PartialUpdateProjectTelemetryLinkWaitHandler(ctx, r.client, resourceID, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating TelemetryLink", fmt.Sprintf("Waiting for TelemetryLink to become active: %v", err)) return @@ -625,7 +621,7 @@ func (r *telemetryLinkResource) Delete(ctx context.Context, req resource.DeleteR var err error switch resourceType { case resourceTypeOrganization: - err = r.client.DefaultAPI.DeleteOrganizationTelemetryLink(ctx, resourceID, region).Execute() + err = r.client.DeleteOrganizationTelemetryLink(ctx, resourceID, region).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting TelemetryLink", fmt.Sprintf("Calling API: %v", err)) return @@ -633,13 +629,13 @@ func (r *telemetryLinkResource) Delete(ctx context.Context, req resource.DeleteR ctx = core.LogResponse(ctx) - _, err = wait.DeleteOrganizationTelemetryLinkWaitHandler(ctx, r.client.DefaultAPI, resourceID, region).WaitWithContext(ctx) + _, err = wait.DeleteOrganizationTelemetryLinkWaitHandler(ctx, r.client, resourceID, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting TelemetryLink", fmt.Sprintf("Waiting for TelemetryLink to become deleted: %v", err)) return } case resourceTypeFolder: - err = r.client.DefaultAPI.DeleteFolderTelemetryLink(ctx, resourceID, region).Execute() + err = r.client.DeleteFolderTelemetryLink(ctx, resourceID, region).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting TelemetryLink", fmt.Sprintf("Calling API: %v", err)) return @@ -647,13 +643,13 @@ func (r *telemetryLinkResource) Delete(ctx context.Context, req resource.DeleteR ctx = core.LogResponse(ctx) - _, err = wait.DeleteFolderTelemetryLinkWaitHandler(ctx, r.client.DefaultAPI, resourceID, region).WaitWithContext(ctx) + _, err = wait.DeleteFolderTelemetryLinkWaitHandler(ctx, r.client, resourceID, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting TelemetryLink", fmt.Sprintf("Waiting for TelemetryLink to become deleted: %v", err)) return } case resourceTypeProject: - err = r.client.DefaultAPI.DeleteProjectTelemetryLink(ctx, resourceID, region).Execute() + err = r.client.DeleteProjectTelemetryLink(ctx, resourceID, region).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting TelemetryLink", fmt.Sprintf("Calling API: %v", err)) return @@ -661,7 +657,7 @@ func (r *telemetryLinkResource) Delete(ctx context.Context, req resource.DeleteR ctx = core.LogResponse(ctx) - _, err = wait.DeleteProjectTelemetryLinkWaitHandler(ctx, r.client.DefaultAPI, resourceID, region).WaitWithContext(ctx) + _, err = wait.DeleteProjectTelemetryLinkWaitHandler(ctx, r.client, resourceID, region).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting TelemetryLink", fmt.Sprintf("Waiting for TelemetryLink to become deleted: %v", err)) return diff --git a/stackit/internal/services/telemetrylink/utils/utils.go b/stackit/internal/services/telemetrylink/utils/utils.go deleted file mode 100644 index 22c40fa84..000000000 --- a/stackit/internal/services/telemetrylink/utils/utils.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - telemetrylink "github.com/stackitcloud/stackit-sdk-go/services/telemetrylink/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *telemetrylink.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.TelemetryLinkCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.TelemetryLinkCustomEndpoint)) - } - apiClient, err := telemetrylink.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/telemetrylink/utils/utils_test.go b/stackit/internal/services/telemetrylink/utils/utils_test.go deleted file mode 100644 index 9a3205fb7..000000000 --- a/stackit/internal/services/telemetrylink/utils/utils_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - telemetrylink "github.com/stackitcloud/stackit-sdk-go/services/telemetrylink/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://telemetrylink-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *telemetrylink.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *telemetrylink.APIClient { - apiClient, err := telemetrylink.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - TelemetryLinkCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *telemetrylink.APIClient { - apiClient, err := telemetrylink.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/telemetryrouter/accesstoken/datasource.go b/stackit/internal/services/telemetryrouter/accesstoken/datasource.go index 5c89c3049..bbc88b330 100644 --- a/stackit/internal/services/telemetryrouter/accesstoken/datasource.go +++ b/stackit/internal/services/telemetryrouter/accesstoken/datasource.go @@ -13,9 +13,8 @@ import ( "github.com/hashicorp/terraform-plugin-log/tflog" telemetryrouter "github.com/stackitcloud/stackit-sdk-go/services/telemetryrouter/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/telemetryrouter/utils" + tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -43,7 +42,7 @@ func NewTelemetryRouterAccessTokenDataSource() datasource.DataSource { } type telemetryRouterAccessTokenDataSource struct { - client *telemetryrouter.APIClient + client telemetryrouter.DefaultAPI providerData core.ProviderData } @@ -52,17 +51,14 @@ func (d *telemetryRouterAccessTokenDataSource) Metadata(_ context.Context, req d } func (d *telemetryRouterAccessTokenDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.providerData = providerData + d.client = clients.TelemetryRouterV1Client - apiClient := utils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient tflog.Info(ctx, "TelemetryRouter client configured") } @@ -148,7 +144,7 @@ func (d *telemetryRouterAccessTokenDataSource) Read(ctx context.Context, req dat ctx = tflog.SetField(ctx, "instance_id", instanceID) ctx = tflog.SetField(ctx, "access_token_id", accessTokenID) - accessTokenResponse, err := d.client.DefaultAPI.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute() + accessTokenResponse, err := d.client.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute() if err != nil { tfutils.LogError( ctx, diff --git a/stackit/internal/services/telemetryrouter/accesstoken/resource.go b/stackit/internal/services/telemetryrouter/accesstoken/resource.go index 5021a8acc..bca33a9a1 100644 --- a/stackit/internal/services/telemetryrouter/accesstoken/resource.go +++ b/stackit/internal/services/telemetryrouter/accesstoken/resource.go @@ -26,7 +26,7 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/telemetryrouter/utils" + tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -72,7 +72,7 @@ type Model struct { } type telemetryRouterAccessTokenResource struct { - client *telemetryrouter.APIClient + client telemetryrouter.DefaultAPI providerData core.ProviderData } @@ -82,15 +82,14 @@ func NewTelemetryRouterAccessTokenResource() resource.Resource { func (r *telemetryRouterAccessTokenResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - r.client = utils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + r.providerData = providerData + r.client = clients.TelemetryRouterV1Client + tflog.Info(ctx, "TelemetryRouter client configured") } @@ -257,7 +256,7 @@ func (r *telemetryRouterAccessTokenResource) Create(ctx context.Context, req res return } - createResp, err := r.client.DefaultAPI.CreateAccessToken(ctx, projectId, region, instanceId).CreateAccessTokenPayload(*payload).Execute() + createResp, err := r.client.CreateAccessToken(ctx, projectId, region, instanceId).CreateAccessTokenPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating TelemetryRouter access token", fmt.Sprintf("Calling API: %v", err)) return @@ -282,7 +281,7 @@ func (r *telemetryRouterAccessTokenResource) Create(ctx context.Context, req res return } - waitResp, err := wait.CreateAccessTokenWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, createResp.Id).WaitWithContext(ctx) + waitResp, err := wait.CreateAccessTokenWaitHandler(ctx, r.client, projectId, region, instanceId, createResp.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating TelemetryRouter access token", fmt.Sprintf("Waiting for TelemetryRouter access token to become active: %v", err)) return @@ -334,7 +333,7 @@ func (r *telemetryRouterAccessTokenResource) Read(ctx context.Context, req resou ctx = tflog.SetField(ctx, "instance_id", instanceID) ctx = tflog.SetField(ctx, "access_token_id", accessTokenID) - accessTokenResponse, err := r.client.DefaultAPI.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute() + accessTokenResponse, err := r.client.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) @@ -388,7 +387,7 @@ func (r *telemetryRouterAccessTokenResource) Update(ctx context.Context, req res return } - accessTokenResponse, err := r.client.DefaultAPI.UpdateAccessToken(ctx, projectID, region, instanceID, accessTokenID).UpdateAccessTokenPayload(*payload).Execute() + accessTokenResponse, err := r.client.UpdateAccessToken(ctx, projectID, region, instanceID, accessTokenID).UpdateAccessTokenPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating TelemetryRouter access token", fmt.Sprintf("Calling API: %v", err)) return @@ -396,7 +395,7 @@ func (r *telemetryRouterAccessTokenResource) Update(ctx context.Context, req res ctx = core.LogResponse(ctx) - _, err = wait.UpdateAccessTokenWaitHandler(ctx, r.client.DefaultAPI, projectID, region, instanceID, accessTokenResponse.Id).WaitWithContext(ctx) + _, err = wait.UpdateAccessTokenWaitHandler(ctx, r.client, projectID, region, instanceID, accessTokenResponse.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating TelemetryRouter access token", fmt.Sprintf("Waiting for TelemetryRouter access token to become active: %v", err)) return @@ -438,7 +437,7 @@ func (r *telemetryRouterAccessTokenResource) Delete(ctx context.Context, req res ctx = tflog.SetField(ctx, "instance_id", instanceID) ctx = tflog.SetField(ctx, "access_token_id", accessTokenID) - err := r.client.DefaultAPI.DeleteAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute() + err := r.client.DeleteAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting TelemetryRouter access token", fmt.Sprintf("Calling API: %v", err)) return @@ -446,7 +445,7 @@ func (r *telemetryRouterAccessTokenResource) Delete(ctx context.Context, req res ctx = core.LogResponse(ctx) - _, err = wait.DeleteAccessTokenWaitHandler(ctx, r.client.DefaultAPI, projectID, region, instanceID, accessTokenID).WaitWithContext(ctx) + _, err = wait.DeleteAccessTokenWaitHandler(ctx, r.client, projectID, region, instanceID, accessTokenID).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting TelemetryRouter access token", fmt.Sprintf("Waiting for TelemetryRouter access token to become deleted: %v", err)) return diff --git a/stackit/internal/services/telemetryrouter/destination/datasource.go b/stackit/internal/services/telemetryrouter/destination/datasource.go index 95883a064..ed7c39a50 100644 --- a/stackit/internal/services/telemetryrouter/destination/datasource.go +++ b/stackit/internal/services/telemetryrouter/destination/datasource.go @@ -20,9 +20,8 @@ import ( sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" telemetryrouter "github.com/stackitcloud/stackit-sdk-go/services/telemetryrouter/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/telemetryrouter/utils" + tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -114,7 +113,7 @@ var datasourceS3Types = map[string]attr.Type{ } type telemetryRouterDestinationDataSource struct { - client *telemetryrouter.APIClient + client telemetryrouter.DefaultAPI providerData core.ProviderData } @@ -123,17 +122,14 @@ func (d *telemetryRouterDestinationDataSource) Metadata(_ context.Context, req d } func (d *telemetryRouterDestinationDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.providerData = providerData + d.client = clients.TelemetryRouterV1Client - apiClient := utils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient tflog.Info(ctx, "TelemetryRouter client configured") } @@ -297,7 +293,7 @@ func (d *telemetryRouterDestinationDataSource) Read(ctx context.Context, req dat ctx = tflog.SetField(ctx, "instance_id", instanceID) ctx = tflog.SetField(ctx, "destination_id", destinationID) - destinationResponse, err := d.client.DefaultAPI.GetDestination(ctx, projectID, region, instanceID, destinationID).Execute() + destinationResponse, err := d.client.GetDestination(ctx, projectID, region, instanceID, destinationID).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) diff --git a/stackit/internal/services/telemetryrouter/destination/resource.go b/stackit/internal/services/telemetryrouter/destination/resource.go index 638f4b064..b2db94949 100644 --- a/stackit/internal/services/telemetryrouter/destination/resource.go +++ b/stackit/internal/services/telemetryrouter/destination/resource.go @@ -27,7 +27,7 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/telemetryrouter/utils" + tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -196,7 +196,7 @@ var accessKeyTypes = map[string]attr.Type{ } type telemetryRouterDestinationResource struct { - client *telemetryrouter.APIClient + client telemetryrouter.DefaultAPI providerData core.ProviderData } @@ -205,17 +205,14 @@ func NewTelemetryRouterDestinationResource() resource.Resource { } func (r *telemetryRouterDestinationResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := utils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient r.providerData = providerData + r.client = clients.TelemetryRouterV1Client + tflog.Info(ctx, "TelemetryRouter client configured") } @@ -554,7 +551,7 @@ func (r *telemetryRouterDestinationResource) Create(ctx context.Context, req res core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating TelemetryRouter destination", fmt.Sprintf("Creating API payload: %v", err)) return } - createResp, err := r.client.DefaultAPI.CreateDestination(ctx, projectId, region, instanceId).CreateDestinationPayload(*payload).Execute() + createResp, err := r.client.CreateDestination(ctx, projectId, region, instanceId).CreateDestinationPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating TelemetryRouter destination", fmt.Sprintf("Calling API: %v", err)) return @@ -579,7 +576,7 @@ func (r *telemetryRouterDestinationResource) Create(ctx context.Context, req res return } - waitResp, err := wait.CreateDestinationWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId, createResp.Id).WaitWithContext(ctx) + waitResp, err := wait.CreateDestinationWaitHandler(ctx, r.client, projectId, region, instanceId, createResp.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating TelemetryRouter destination", fmt.Sprintf("Waiting for TelemetryRouter destination to become active: %v", err)) return @@ -624,7 +621,7 @@ func (r *telemetryRouterDestinationResource) Read(ctx context.Context, req resou ctx = tflog.SetField(ctx, "instance_id", instanceID) ctx = tflog.SetField(ctx, "destination_id", destinationID) - instanceResponse, err := r.client.DefaultAPI.GetDestination(ctx, projectID, region, instanceID, destinationID).Execute() + instanceResponse, err := r.client.GetDestination(ctx, projectID, region, instanceID, destinationID).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) @@ -679,7 +676,7 @@ func (r *telemetryRouterDestinationResource) Update(ctx context.Context, req res return } - updateResp, err := r.client.DefaultAPI.UpdateDestination(ctx, projectID, region, instanceID, destinationID).UpdateDestinationPayload(*payload).Execute() + updateResp, err := r.client.UpdateDestination(ctx, projectID, region, instanceID, destinationID).UpdateDestinationPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating TelemetryRouter destination", fmt.Sprintf("Calling API: %v", err)) return @@ -687,7 +684,7 @@ func (r *telemetryRouterDestinationResource) Update(ctx context.Context, req res ctx = core.LogResponse(ctx) - waitResp, err := wait.UpdateDestinationWaitHandler(ctx, r.client.DefaultAPI, projectID, region, instanceID, updateResp.Id).WaitWithContext(ctx) + waitResp, err := wait.UpdateDestinationWaitHandler(ctx, r.client, projectID, region, instanceID, updateResp.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating TelemetryRouter destination", fmt.Sprintf("Waiting for TelemetryRouter destination to become active: %v", err)) return @@ -730,7 +727,7 @@ func (r *telemetryRouterDestinationResource) Delete(ctx context.Context, req res ctx = tflog.SetField(ctx, "instance_id", instanceID) ctx = tflog.SetField(ctx, "destination_id", destinationID) - err := r.client.DefaultAPI.DeleteDestination(ctx, projectID, region, instanceID, destinationID).Execute() + err := r.client.DeleteDestination(ctx, projectID, region, instanceID, destinationID).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting TelemetryRouter destination", fmt.Sprintf("Calling API: %v", err)) return @@ -738,7 +735,7 @@ func (r *telemetryRouterDestinationResource) Delete(ctx context.Context, req res ctx = core.LogResponse(ctx) - _, err = wait.DeleteDestinationWaitHandler(ctx, r.client.DefaultAPI, projectID, region, instanceID, destinationID).WaitWithContext(ctx) + _, err = wait.DeleteDestinationWaitHandler(ctx, r.client, projectID, region, instanceID, destinationID).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting TelemetryRouter destination", fmt.Sprintf("Waiting for TelemetryRouter destination to become deleted: %v", err)) return diff --git a/stackit/internal/services/telemetryrouter/instance/datasource.go b/stackit/internal/services/telemetryrouter/instance/datasource.go index 84a5b4d49..5027a46ca 100644 --- a/stackit/internal/services/telemetryrouter/instance/datasource.go +++ b/stackit/internal/services/telemetryrouter/instance/datasource.go @@ -16,9 +16,8 @@ import ( sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" telemetryrouter "github.com/stackitcloud/stackit-sdk-go/services/telemetryrouter/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/telemetryrouter/utils" + tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -32,7 +31,7 @@ func NewTelemetryRouterInstanceDataSource() datasource.DataSource { } type telemetryRouterInstanceDataSource struct { - client *telemetryrouter.APIClient + client telemetryrouter.DefaultAPI providerData core.ProviderData } @@ -41,17 +40,14 @@ func (d *telemetryRouterInstanceDataSource) Metadata(_ context.Context, req data } func (d *telemetryRouterInstanceDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } + d.providerData = providerData + d.client = clients.TelemetryRouterV1Client - apiClient := utils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient tflog.Info(ctx, "TelemetryRouter client configured") } @@ -164,7 +160,7 @@ func (d *telemetryRouterInstanceDataSource) Read(ctx context.Context, req dataso ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceID) - instanceResponse, err := d.client.DefaultAPI.GetTelemetryRouter(ctx, projectID, region, instanceID).Execute() + instanceResponse, err := d.client.GetTelemetryRouter(ctx, projectID, region, instanceID).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) diff --git a/stackit/internal/services/telemetryrouter/instance/resource.go b/stackit/internal/services/telemetryrouter/instance/resource.go index bc58e371d..06169c6b3 100644 --- a/stackit/internal/services/telemetryrouter/instance/resource.go +++ b/stackit/internal/services/telemetryrouter/instance/resource.go @@ -27,7 +27,7 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/telemetryrouter/utils" + tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -106,7 +106,7 @@ var attributeTypes = map[string]attr.Type{ } type telemetryRouterInstanceResource struct { - client *telemetryrouter.APIClient + client telemetryrouter.DefaultAPI providerData core.ProviderData } @@ -115,17 +115,14 @@ func NewTelemetryRouterInstanceResource() resource.Resource { } func (r *telemetryRouterInstanceResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := utils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient r.providerData = providerData + r.client = clients.TelemetryRouterV1Client + tflog.Info(ctx, "TelemetryRouter client configured") } @@ -299,7 +296,7 @@ func (r *telemetryRouterInstanceResource) Create(ctx context.Context, req resour return } - createResp, err := r.client.DefaultAPI.CreateTelemetryRouter(ctx, projectId, region).CreateTelemetryRouterPayload(*payload).Execute() + createResp, err := r.client.CreateTelemetryRouter(ctx, projectId, region).CreateTelemetryRouterPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating TelemetryRouter Instance", fmt.Sprintf("Calling API: %v", err)) return @@ -323,7 +320,7 @@ func (r *telemetryRouterInstanceResource) Create(ctx context.Context, req resour return } - waitResp, err := wait.CreateTelemetryRouterWaitHandler(ctx, r.client.DefaultAPI, projectId, region, instanceId).WaitWithContext(ctx) + waitResp, err := wait.CreateTelemetryRouterWaitHandler(ctx, r.client, projectId, region, instanceId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating TelemetryRouter Instance", fmt.Sprintf("Waiting for TelemetryRouter Instance to become active: %v", err)) return @@ -366,7 +363,7 @@ func (r *telemetryRouterInstanceResource) Read(ctx context.Context, req resource ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceID) - instanceResponse, err := r.client.DefaultAPI.GetTelemetryRouter(ctx, projectID, region, instanceID).Execute() + instanceResponse, err := r.client.GetTelemetryRouter(ctx, projectID, region, instanceID).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) @@ -418,7 +415,7 @@ func (r *telemetryRouterInstanceResource) Update(ctx context.Context, req resour return } - updateResp, err := r.client.DefaultAPI.UpdateTelemetryRouter(ctx, projectID, region, instanceID).UpdateTelemetryRouterPayload(*payload).Execute() + updateResp, err := r.client.UpdateTelemetryRouter(ctx, projectID, region, instanceID).UpdateTelemetryRouterPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating TelemetryRouter Instance", fmt.Sprintf("Calling API: %v", err)) return @@ -426,7 +423,7 @@ func (r *telemetryRouterInstanceResource) Update(ctx context.Context, req resour ctx = core.LogResponse(ctx) - waitResp, err := wait.UpdateTelemetryRouterWaitHandler(ctx, r.client.DefaultAPI, projectID, region, updateResp.Id).WaitWithContext(ctx) + waitResp, err := wait.UpdateTelemetryRouterWaitHandler(ctx, r.client, projectID, region, updateResp.Id).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating TelemetryRouter Instance", fmt.Sprintf("Waiting for TelemetryRouter Instance to become active: %v", err)) return @@ -466,7 +463,7 @@ func (r *telemetryRouterInstanceResource) Delete(ctx context.Context, req resour ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "instance_id", instanceID) - err := r.client.DefaultAPI.DeleteTelemetryRouter(ctx, projectID, region, instanceID).Execute() + err := r.client.DeleteTelemetryRouter(ctx, projectID, region, instanceID).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting TelemetryRouter Instance", fmt.Sprintf("Calling API: %v", err)) return @@ -474,7 +471,7 @@ func (r *telemetryRouterInstanceResource) Delete(ctx context.Context, req resour ctx = core.LogResponse(ctx) - _, err = wait.DeleteTelemetryRouterWaitHandler(ctx, r.client.DefaultAPI, projectID, region, instanceID).WaitWithContext(ctx) + _, err = wait.DeleteTelemetryRouterWaitHandler(ctx, r.client, projectID, region, instanceID).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting TelemetryRouter Instance", fmt.Sprintf("Waiting for TelemetryRouter Instance to become deleted: %v", err)) return diff --git a/stackit/internal/services/telemetryrouter/utils/utils.go b/stackit/internal/services/telemetryrouter/utils/utils.go deleted file mode 100644 index 1adca7d91..000000000 --- a/stackit/internal/services/telemetryrouter/utils/utils.go +++ /dev/null @@ -1,30 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - telemetryrouter "github.com/stackitcloud/stackit-sdk-go/services/telemetryrouter/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *telemetryrouter.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.TelemetryRouterCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.TelemetryRouterCustomEndpoint)) - } - apiClient, err := telemetryrouter.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/telemetryrouter/utils/utils_test.go b/stackit/internal/services/telemetryrouter/utils/utils_test.go deleted file mode 100644 index b9b69da9e..000000000 --- a/stackit/internal/services/telemetryrouter/utils/utils_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - telemetryrouter "github.com/stackitcloud/stackit-sdk-go/services/telemetryrouter/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://telemetry-router-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *telemetryrouter.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *telemetryrouter.APIClient { - apiClient, err := telemetryrouter.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - TelemetryRouterCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *telemetryrouter.APIClient { - apiClient, err := telemetryrouter.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/services/vpn/connection/datasource.go b/stackit/internal/services/vpn/connection/datasource.go index 9473c84c6..9efa81f3e 100644 --- a/stackit/internal/services/vpn/connection/datasource.go +++ b/stackit/internal/services/vpn/connection/datasource.go @@ -15,9 +15,7 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" vpn "github.com/stackitcloud/stackit-sdk-go/services/vpn/v1api" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/vpn/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -41,7 +39,7 @@ type DataSourceModel struct { } type vpnConnectionDataSource struct { - client *vpn.APIClient + client vpn.DefaultAPI providerData core.ProviderData } @@ -50,17 +48,14 @@ func NewVPNConnectionDataSource() datasource.DataSource { } func (d *vpnConnectionDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := utils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - d.client = apiClient d.providerData = providerData + d.client = clients.VpnV1Client + tflog.Info(ctx, "VPN connection data source configured") } @@ -252,7 +247,7 @@ func (d *vpnConnectionDataSource) Read(ctx context.Context, req datasource.ReadR ctx = tflog.SetField(ctx, "gateway_id", gatewayId) ctx = tflog.SetField(ctx, "connection_id", connectionId) - connResp, err := d.client.DefaultAPI.GetGatewayConnection(ctx, projectId, region, gatewayId, connectionId).Execute() + connResp, err := d.client.GetGatewayConnection(ctx, projectId, region, gatewayId, connectionId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) diff --git a/stackit/internal/services/vpn/connection/resource.go b/stackit/internal/services/vpn/connection/resource.go index 2b319e3f0..bb67ffe0e 100644 --- a/stackit/internal/services/vpn/connection/resource.go +++ b/stackit/internal/services/vpn/connection/resource.go @@ -33,7 +33,6 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/vpn/utils" tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -144,7 +143,7 @@ var ( ) type vpnConnectionResource struct { - client *vpn.APIClient + client vpn.DefaultAPI providerData core.ProviderData } @@ -153,18 +152,14 @@ func NewVpnConnectionResource() resource.Resource { } func (r *vpnConnectionResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { - providerData, ok := conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := utils.ConfigureClient(ctx, &providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - - r.client = apiClient r.providerData = providerData + r.client = clients.VpnV1Client + tflog.Info(ctx, "VPN client configured") } @@ -558,7 +553,7 @@ func (r *vpnConnectionResource) Create(ctx context.Context, req resource.CreateR return } - createResp, err := r.client.DefaultAPI.CreateGatewayConnection(ctx, projectId, region, gatewayId).CreateGatewayConnectionPayload(*payload).Execute() + createResp, err := r.client.CreateGatewayConnection(ctx, projectId, region, gatewayId).CreateGatewayConnectionPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating VPN connection", fmt.Sprintf("Calling API: %v", err)) return @@ -599,7 +594,7 @@ func (r *vpnConnectionResource) Read(ctx context.Context, req resource.ReadReque ctx = tflog.SetField(ctx, "gateway_id", gatewayId) ctx = tflog.SetField(ctx, "connection_id", connectionId) - connResp, err := r.client.DefaultAPI.GetGatewayConnection(ctx, projectId, region, gatewayId, connectionId).Execute() + connResp, err := r.client.GetGatewayConnection(ctx, projectId, region, gatewayId, connectionId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) @@ -670,7 +665,7 @@ func (r *vpnConnectionResource) Update(ctx context.Context, req resource.UpdateR return } - connResp, err := r.client.DefaultAPI.UpdateGatewayConnection(ctx, projectId, region, gatewayId, connectionId).UpdateGatewayConnectionPayload(*payload).Execute() + connResp, err := r.client.UpdateGatewayConnection(ctx, projectId, region, gatewayId, connectionId).UpdateGatewayConnectionPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating VPN connection", err.Error()) return @@ -711,7 +706,7 @@ func (r *vpnConnectionResource) Delete(ctx context.Context, req resource.DeleteR ctx = tflog.SetField(ctx, "gateway_id", gatewayId) ctx = tflog.SetField(ctx, "connection_id", connectionId) - err := r.client.DefaultAPI.DeleteGatewayConnection(ctx, projectId, region, gatewayId, connectionId).Execute() + err := r.client.DeleteGatewayConnection(ctx, projectId, region, gatewayId, connectionId).Execute() if err != nil { if oapiErr, ok := errors.AsType[*oapierror.GenericOpenAPIError](err); ok && oapiErr.StatusCode == http.StatusNotFound { resp.State.RemoveResource(ctx) diff --git a/stackit/internal/services/vpn/gateway/datasource.go b/stackit/internal/services/vpn/gateway/datasource.go index eebfd3904..86a4beca8 100644 --- a/stackit/internal/services/vpn/gateway/datasource.go +++ b/stackit/internal/services/vpn/gateway/datasource.go @@ -16,9 +16,7 @@ import ( vpn "github.com/stackitcloud/stackit-sdk-go/services/vpn/v1api" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/vpn/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -28,7 +26,7 @@ var ( ) type vpnGatewayDataSource struct { - client *vpn.APIClient + client vpn.DefaultAPI providerData core.ProviderData } @@ -37,16 +35,14 @@ func NewVPNGatewayDataSource() datasource.DataSource { } func (d *vpnGatewayDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - d.client = utils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + d.providerData = providerData + d.client = clients.VpnV1Client + tflog.Info(ctx, "VPN client configured") } @@ -150,7 +146,7 @@ func (d *vpnGatewayDataSource) Read(ctx context.Context, req datasource.ReadRequ ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "gateway_id", gatewayId) - gatewayResponse, err := d.client.DefaultAPI.GetGateway(ctx, projectId, region, gatewayId).Execute() + gatewayResponse, err := d.client.GetGateway(ctx, projectId, region, gatewayId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) diff --git a/stackit/internal/services/vpn/gateway/resource.go b/stackit/internal/services/vpn/gateway/resource.go index 8a93bbef9..46d7c027f 100644 --- a/stackit/internal/services/vpn/gateway/resource.go +++ b/stackit/internal/services/vpn/gateway/resource.go @@ -27,9 +27,7 @@ import ( sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/vpn/utils" tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -85,7 +83,7 @@ var schemaDescriptions = map[string]string{ } type gatewayResource struct { - client *vpn.APIClient + client vpn.DefaultAPI providerData core.ProviderData } @@ -95,16 +93,14 @@ func NewGatewayResource() resource.Resource { func (r *gatewayResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { var ok bool - r.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - apiClient := utils.ConfigureClient(ctx, &r.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } - r.client = apiClient + r.providerData = providerData + r.client = clients.VpnV1Client + tflog.Info(ctx, "VPN client configured") } @@ -321,7 +317,7 @@ func (r *gatewayResource) Create(ctx context.Context, req resource.CreateRequest return } - createResp, err := r.client.DefaultAPI.CreateGateway(ctx, projectId, region).CreateGatewayPayload(*payload).Execute() + createResp, err := r.client.CreateGateway(ctx, projectId, region).CreateGatewayPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating VPN gateway", fmt.Sprintf("Calling API: %v", err)) return @@ -344,7 +340,7 @@ func (r *gatewayResource) Create(ctx context.Context, req resource.CreateRequest return } - waitResp, err := wait.CreateGatewayWaitHandler(ctx, r.client.DefaultAPI, projectId, region, gatewayId).WaitWithContext(ctx) + waitResp, err := wait.CreateGatewayWaitHandler(ctx, r.client, projectId, region, gatewayId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating VPN gateway", fmt.Sprintf("Gateway creation waiting: %v", err)) return @@ -381,7 +377,7 @@ func (r *gatewayResource) Read(ctx context.Context, req resource.ReadRequest, re ctx = tflog.SetField(ctx, "gateway_id", gatewayId) ctx = tflog.SetField(ctx, "region", region) - gatewayResp, err := r.client.DefaultAPI.GetGateway(ctx, projectId, region, gatewayId).Execute() + gatewayResp, err := r.client.GetGateway(ctx, projectId, region, gatewayId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) && oapiErr.StatusCode == http.StatusNotFound { @@ -431,7 +427,7 @@ func (r *gatewayResource) Update(ctx context.Context, req resource.UpdateRequest return } - _, err = r.client.DefaultAPI.UpdateGateway(ctx, projectId, region, gatewayId).UpdateGatewayPayload(*payload).Execute() + _, err = r.client.UpdateGateway(ctx, projectId, region, gatewayId).UpdateGatewayPayload(*payload).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating VPN gateway", err.Error()) return @@ -439,7 +435,7 @@ func (r *gatewayResource) Update(ctx context.Context, req resource.UpdateRequest ctx = core.LogResponse(ctx) - waitResp, err := wait.UpdateGatewayWaitHandler(ctx, r.client.DefaultAPI, projectId, region, gatewayId).WaitWithContext(ctx) + waitResp, err := wait.UpdateGatewayWaitHandler(ctx, r.client, projectId, region, gatewayId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating VPN gateway", fmt.Sprintf("Gateway update waiting: %v", err)) return @@ -476,7 +472,7 @@ func (r *gatewayResource) Delete(ctx context.Context, req resource.DeleteRequest ctx = tflog.SetField(ctx, "gateway_id", gatewayId) ctx = tflog.SetField(ctx, "region", region) - err := r.client.DefaultAPI.DeleteGateway(ctx, projectId, region, gatewayId).Execute() + err := r.client.DeleteGateway(ctx, projectId, region, gatewayId).Execute() if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting VPN gateway", fmt.Sprintf("Calling API: %v", err)) return @@ -484,7 +480,7 @@ func (r *gatewayResource) Delete(ctx context.Context, req resource.DeleteRequest ctx = core.LogResponse(ctx) - _, err = wait.DeleteGatewayWaitHandler(ctx, r.client.DefaultAPI, projectId, region, gatewayId).WaitWithContext(ctx) + _, err = wait.DeleteGatewayWaitHandler(ctx, r.client, projectId, region, gatewayId).WaitWithContext(ctx) if err != nil { core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting VPN gateway", fmt.Sprintf("Gateway deletion waiting: %v", err)) return diff --git a/stackit/internal/services/vpn/gateway_status/datasource.go b/stackit/internal/services/vpn/gateway_status/datasource.go index f56134633..468ec8a4d 100644 --- a/stackit/internal/services/vpn/gateway_status/datasource.go +++ b/stackit/internal/services/vpn/gateway_status/datasource.go @@ -19,9 +19,7 @@ import ( vpn "github.com/stackitcloud/stackit-sdk-go/services/vpn/v1api" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/vpn/utils" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion" tfutils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate" ) @@ -32,7 +30,7 @@ var ( ) type vpnGatewayStatusDataSource struct { - client *vpn.APIClient + client vpn.DefaultAPI providerData core.ProviderData } @@ -75,16 +73,14 @@ func NewVPNGatewayStatusDataSource() datasource.DataSource { } func (d *vpnGatewayStatusDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { - var ok bool - d.providerData, ok = conversion.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) + providerData, clients, ok := core.ParseProviderData(ctx, req.ProviderData, &resp.Diagnostics) if !ok { return } - d.client = utils.ConfigureClient(ctx, &d.providerData, &resp.Diagnostics) - if resp.Diagnostics.HasError() { - return - } + d.providerData = providerData + d.client = clients.VpnV1Client + tflog.Info(ctx, "VPN client configured") } @@ -202,7 +198,7 @@ func (d *vpnGatewayStatusDataSource) Read(ctx context.Context, req datasource.Re ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "gateway_id", gatewayId) - gatewayResponse, err := d.client.DefaultAPI.GetGatewayStatus(ctx, projectId, region, gatewayId).Execute() + gatewayResponse, err := d.client.GetGatewayStatus(ctx, projectId, region, gatewayId).Execute() if err != nil { var oapiErr *oapierror.GenericOpenAPIError ok := errors.As(err, &oapiErr) diff --git a/stackit/internal/services/vpn/utils/util.go b/stackit/internal/services/vpn/utils/util.go deleted file mode 100644 index 93bb2ef91..000000000 --- a/stackit/internal/services/vpn/utils/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package utils - -import ( - "context" - "fmt" - - "github.com/hashicorp/terraform-plugin-framework/diag" - "github.com/stackitcloud/stackit-sdk-go/core/config" - vpn "github.com/stackitcloud/stackit-sdk-go/services/vpn/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -func ConfigureClient(ctx context.Context, providerData *core.ProviderData, diags *diag.Diagnostics) *vpn.APIClient { - apiClientConfigOptions := []config.ConfigurationOption{ - config.WithCustomAuth(providerData.RoundTripper), - utils.UserAgentConfigOption(providerData.Version), - } - if providerData.VpnCustomEndpoint != "" { - apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.VpnCustomEndpoint)) - } - - apiClient, err := vpn.NewAPIClient(apiClientConfigOptions...) - if err != nil { - core.LogAndAddError(ctx, diags, "Error configuring API client", fmt.Sprintf("Configuring client: %v. This is an error related to the provider configuration, not to the resource configuration", err)) - return nil - } - - return apiClient -} diff --git a/stackit/internal/services/vpn/utils/util_test.go b/stackit/internal/services/vpn/utils/util_test.go deleted file mode 100644 index e3e6ce25c..000000000 --- a/stackit/internal/services/vpn/utils/util_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package utils - -import ( - "context" - "os" - "reflect" - "testing" - - "github.com/hashicorp/terraform-plugin-framework/diag" - sdkClients "github.com/stackitcloud/stackit-sdk-go/core/clients" - "github.com/stackitcloud/stackit-sdk-go/core/config" - vpn "github.com/stackitcloud/stackit-sdk-go/services/vpn/v1api" - - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" - "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils" -) - -const ( - testVersion = "1.2.3" - testCustomEndpoint = "https://vpn-custom-endpoint.api.stackit.cloud" -) - -func TestConfigureClient(t *testing.T) { - /* mock authentication by setting service account token env variable */ - os.Clearenv() - err := os.Setenv(sdkClients.ServiceAccountToken, "mock-val") - if err != nil { - t.Errorf("error setting env variable: %v", err) - } - - type args struct { - providerData *core.ProviderData - } - tests := []struct { - name string - args args - wantErr bool - expected *vpn.APIClient - }{ - { - name: "default endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - }, - }, - expected: func() *vpn.APIClient { - apiClient, err := vpn.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - { - name: "custom endpoint", - args: args{ - providerData: &core.ProviderData{ - Version: testVersion, - VpnCustomEndpoint: testCustomEndpoint, - }, - }, - expected: func() *vpn.APIClient { - apiClient, err := vpn.NewAPIClient( - utils.UserAgentConfigOption(testVersion), - config.WithEndpoint(testCustomEndpoint), - ) - if err != nil { - t.Errorf("error configuring client: %v", err) - } - return apiClient - }(), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.Background() - diags := diag.Diagnostics{} - - actual := ConfigureClient(ctx, tt.args.providerData, &diags) - if diags.HasError() != tt.wantErr { - t.Errorf("ConfigureClient() error = %v, want %v", diags.HasError(), tt.wantErr) - } - - if !reflect.DeepEqual(actual, tt.expected) { - t.Errorf("ConfigureClient() = %v, want %v", actual, tt.expected) - } - }) - } -} diff --git a/stackit/internal/testutil/testutil.go b/stackit/internal/testutil/testutil.go index f2c596c53..d7699ea77 100644 --- a/stackit/internal/testutil/testutil.go +++ b/stackit/internal/testutil/testutil.go @@ -19,6 +19,8 @@ import ( "github.com/hashicorp/terraform-plugin-testing/helper/resource" sdkConf "github.com/stackitcloud/stackit-sdk-go/core/config" + "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core" + "github.com/stackitcloud/terraform-provider-stackit/stackit" ) @@ -517,3 +519,9 @@ func CheckAttrHasPrefix(prefix string) resource.CheckResourceAttrWithFunc { return nil } } + +func NewTestUnitV6ProviderFactories(clientFactory core.ClientFactory) map[string]func() (tfprotov6.ProviderServer, error) { + return map[string]func() (tfprotov6.ProviderServer, error){ + "stackit": providerserver.NewProtocol6WithError(stackit.NewTestProvider("test-version", clientFactory)()), + } +} diff --git a/stackit/internal/utils/headers.go b/stackit/internal/utils/headers.go deleted file mode 100644 index abbedbc34..000000000 --- a/stackit/internal/utils/headers.go +++ /dev/null @@ -1,11 +0,0 @@ -package utils - -import ( - "fmt" - - "github.com/stackitcloud/stackit-sdk-go/core/config" -) - -func UserAgentConfigOption(providerVersion string) config.ConfigurationOption { - return config.WithUserAgent(fmt.Sprintf("stackit-terraform-provider/%s", providerVersion)) -} diff --git a/stackit/internal/utils/headers_test.go b/stackit/internal/utils/headers_test.go deleted file mode 100644 index f7f0c1758..000000000 --- a/stackit/internal/utils/headers_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package utils - -import ( - "reflect" - "testing" - - "github.com/stackitcloud/stackit-sdk-go/core/config" -) - -func TestUserAgentConfigOption(t *testing.T) { - type args struct { - providerVersion string - } - tests := []struct { - name string - args args - want config.ConfigurationOption - }{ - { - name: "TestUserAgentConfigOption", - args: args{ - providerVersion: "1.0.0", - }, - want: config.WithUserAgent("stackit-terraform-provider/1.0.0"), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - clientConfigActual := config.Configuration{} - err := tt.want(&clientConfigActual) - if err != nil { - t.Errorf("error applying configuration: %v", err) - } - - clientConfigExpected := config.Configuration{} - err = UserAgentConfigOption(tt.args.providerVersion)(&clientConfigExpected) - if err != nil { - t.Errorf("error applying configuration: %v", err) - } - - if !reflect.DeepEqual(clientConfigActual, clientConfigExpected) { - t.Errorf("UserAgentConfigOption() = %v, want %v", clientConfigActual, clientConfigExpected) - } - }) - } -} diff --git a/stackit/provider.go b/stackit/provider.go index 49c1af158..9280cf80a 100644 --- a/stackit/provider.go +++ b/stackit/provider.go @@ -154,13 +154,25 @@ var ( // Provider is the provider implementation. type Provider struct { version string + + clientFactory core.ClientFactory } // New is a helper function to simplify provider server and testing implementation. func New(version string) func() provider.Provider { return func() provider.Provider { return &Provider{ - version: version, + version: version, + clientFactory: nil, // nil means the default client factory will be used later + } + } +} + +func NewTestProvider(version string, clientFactory core.ClientFactory) func() provider.Provider { + return func() provider.Provider { + return &Provider{ + version: version, + clientFactory: clientFactory, } } } @@ -530,6 +542,7 @@ func (p *Provider) Configure(ctx context.Context, req provider.ConfigureRequest, // Configure SDK client sdkConfig := &config.Configuration{} var providerData core.ProviderData + var customEndpointConfig core.CustomEndpointConfig // Helper function to set a string field if it's known and not null setStringField := func(v basetypes.StringValue, setter func(string)) { @@ -563,44 +576,44 @@ func (p *Provider) Configure(ctx context.Context, req provider.ConfigureRequest, setStringField(providerConfig.DefaultRegion, func(v string) { providerData.DefaultRegion = v }) setBoolField(providerConfig.EnableBetaResources, func(v bool) { providerData.EnableBetaResources = v }) - setStringField(providerConfig.ALBCertificatesCustomEndpoint, func(v string) { providerData.ALBCertificatesCustomEndpoint = v }) - setStringField(providerConfig.ALBCustomEndpoint, func(v string) { providerData.ALBCustomEndpoint = v }) - setStringField(providerConfig.AlbWafCustomEndpoint, func(v string) { providerData.AlbWafCustomEndpoint = v }) - setStringField(providerConfig.AuthorizationCustomEndpoint, func(v string) { providerData.AuthorizationCustomEndpoint = v }) - setStringField(providerConfig.CdnCustomEndpoint, func(v string) { providerData.CdnCustomEndpoint = v }) - setStringField(providerConfig.DnsCustomEndpoint, func(v string) { providerData.DnsCustomEndpoint = v }) - setStringField(providerConfig.DremioCustomEndpoint, func(v string) { providerData.DremioCustomEndpoint = v }) - setStringField(providerConfig.EdgeCloudCustomEndpoint, func(v string) { providerData.EdgeCloudCustomEndpoint = v }) - setStringField(providerConfig.GitCustomEndpoint, func(v string) { providerData.GitCustomEndpoint = v }) - setStringField(providerConfig.IaaSCustomEndpoint, func(v string) { providerData.IaaSCustomEndpoint = v }) - setStringField(providerConfig.IntakeCustomEndpoint, func(v string) { providerData.IntakeCustomEndpoint = v }) - setStringField(providerConfig.KmsCustomEndpoint, func(v string) { providerData.KMSCustomEndpoint = v }) - setStringField(providerConfig.LoadBalancerCustomEndpoint, func(v string) { providerData.LoadBalancerCustomEndpoint = v }) - setStringField(providerConfig.LogMeCustomEndpoint, func(v string) { providerData.LogMeCustomEndpoint = v }) - setStringField(providerConfig.LogsCustomEndpoint, func(v string) { providerData.LogsCustomEndpoint = v }) - setStringField(providerConfig.MariaDBCustomEndpoint, func(v string) { providerData.MariaDBCustomEndpoint = v }) - setStringField(providerConfig.ModelServingCustomEndpoint, func(v string) { providerData.ModelServingCustomEndpoint = v }) - setStringField(providerConfig.ModelExperimentsCustomEndpoint, func(v string) { providerData.ModelExperimentsCustomEndpoint = v }) - setStringField(providerConfig.MongoDBFlexCustomEndpoint, func(v string) { providerData.MongoDBFlexCustomEndpoint = v }) - setStringField(providerConfig.ObjectStorageCustomEndpoint, func(v string) { providerData.ObjectStorageCustomEndpoint = v }) - setStringField(providerConfig.ObservabilityCustomEndpoint, func(v string) { providerData.ObservabilityCustomEndpoint = v }) - setStringField(providerConfig.OpenSearchCustomEndpoint, func(v string) { providerData.OpenSearchCustomEndpoint = v }) - setStringField(providerConfig.PostgresFlexCustomEndpoint, func(v string) { providerData.PostgresFlexCustomEndpoint = v }) - setStringField(providerConfig.RabbitMQCustomEndpoint, func(v string) { providerData.RabbitMQCustomEndpoint = v }) - setStringField(providerConfig.RedisCustomEndpoint, func(v string) { providerData.RedisCustomEndpoint = v }) - setStringField(providerConfig.ResourceManagerCustomEndpoint, func(v string) { providerData.ResourceManagerCustomEndpoint = v }) - setStringField(providerConfig.ScfCustomEndpoint, func(v string) { providerData.ScfCustomEndpoint = v }) - setStringField(providerConfig.SecretsManagerCustomEndpoint, func(v string) { providerData.SecretsManagerCustomEndpoint = v }) - setStringField(providerConfig.ServerBackupCustomEndpoint, func(v string) { providerData.ServerBackupCustomEndpoint = v }) - setStringField(providerConfig.ServerUpdateCustomEndpoint, func(v string) { providerData.ServerUpdateCustomEndpoint = v }) - setStringField(providerConfig.ServiceAccountCustomEndpoint, func(v string) { providerData.ServiceAccountCustomEndpoint = v }) - setStringField(providerConfig.ServiceEnablementCustomEndpoint, func(v string) { providerData.ServiceEnablementCustomEndpoint = v }) - setStringField(providerConfig.SfsCustomEndpoint, func(v string) { providerData.SfsCustomEndpoint = v }) - setStringField(providerConfig.SkeCustomEndpoint, func(v string) { providerData.SKECustomEndpoint = v }) - setStringField(providerConfig.SqlServerFlexCustomEndpoint, func(v string) { providerData.SQLServerFlexCustomEndpoint = v }) - setStringField(providerConfig.TelemetryRouterCustomEndpoint, func(v string) { providerData.TelemetryRouterCustomEndpoint = v }) - setStringField(providerConfig.TelemetryLinkCustomEndpoint, func(v string) { providerData.TelemetryLinkCustomEndpoint = v }) - setStringField(providerConfig.VpnCustomEndpoint, func(v string) { providerData.VpnCustomEndpoint = v }) + setStringField(providerConfig.ALBCertificatesCustomEndpoint, func(v string) { customEndpointConfig.ALBCertificatesCustomEndpoint = v }) + setStringField(providerConfig.ALBCustomEndpoint, func(v string) { customEndpointConfig.ALBCustomEndpoint = v }) + setStringField(providerConfig.AlbWafCustomEndpoint, func(v string) { customEndpointConfig.AlbWafCustomEndpoint = v }) + setStringField(providerConfig.AuthorizationCustomEndpoint, func(v string) { customEndpointConfig.AuthorizationCustomEndpoint = v }) + setStringField(providerConfig.CdnCustomEndpoint, func(v string) { customEndpointConfig.CdnCustomEndpoint = v }) + setStringField(providerConfig.DnsCustomEndpoint, func(v string) { customEndpointConfig.DnsCustomEndpoint = v }) + setStringField(providerConfig.DremioCustomEndpoint, func(v string) { customEndpointConfig.DremioCustomEndpoint = v }) + setStringField(providerConfig.EdgeCloudCustomEndpoint, func(v string) { customEndpointConfig.EdgeCloudCustomEndpoint = v }) + setStringField(providerConfig.GitCustomEndpoint, func(v string) { customEndpointConfig.GitCustomEndpoint = v }) + setStringField(providerConfig.IaaSCustomEndpoint, func(v string) { customEndpointConfig.IaaSCustomEndpoint = v }) + setStringField(providerConfig.IntakeCustomEndpoint, func(v string) { customEndpointConfig.IntakeCustomEndpoint = v }) + setStringField(providerConfig.KmsCustomEndpoint, func(v string) { customEndpointConfig.KMSCustomEndpoint = v }) + setStringField(providerConfig.LoadBalancerCustomEndpoint, func(v string) { customEndpointConfig.LoadBalancerCustomEndpoint = v }) + setStringField(providerConfig.LogMeCustomEndpoint, func(v string) { customEndpointConfig.LogMeCustomEndpoint = v }) + setStringField(providerConfig.LogsCustomEndpoint, func(v string) { customEndpointConfig.LogsCustomEndpoint = v }) + setStringField(providerConfig.MariaDBCustomEndpoint, func(v string) { customEndpointConfig.MariaDBCustomEndpoint = v }) + setStringField(providerConfig.ModelServingCustomEndpoint, func(v string) { customEndpointConfig.ModelServingCustomEndpoint = v }) + setStringField(providerConfig.ModelExperimentsCustomEndpoint, func(v string) { customEndpointConfig.ModelExperimentsCustomEndpoint = v }) + setStringField(providerConfig.MongoDBFlexCustomEndpoint, func(v string) { customEndpointConfig.MongoDBFlexCustomEndpoint = v }) + setStringField(providerConfig.ObjectStorageCustomEndpoint, func(v string) { customEndpointConfig.ObjectStorageCustomEndpoint = v }) + setStringField(providerConfig.ObservabilityCustomEndpoint, func(v string) { customEndpointConfig.ObservabilityCustomEndpoint = v }) + setStringField(providerConfig.OpenSearchCustomEndpoint, func(v string) { customEndpointConfig.OpenSearchCustomEndpoint = v }) + setStringField(providerConfig.PostgresFlexCustomEndpoint, func(v string) { customEndpointConfig.PostgresFlexCustomEndpoint = v }) + setStringField(providerConfig.RabbitMQCustomEndpoint, func(v string) { customEndpointConfig.RabbitMQCustomEndpoint = v }) + setStringField(providerConfig.RedisCustomEndpoint, func(v string) { customEndpointConfig.RedisCustomEndpoint = v }) + setStringField(providerConfig.ResourceManagerCustomEndpoint, func(v string) { customEndpointConfig.ResourceManagerCustomEndpoint = v }) + setStringField(providerConfig.ScfCustomEndpoint, func(v string) { customEndpointConfig.ScfCustomEndpoint = v }) + setStringField(providerConfig.SecretsManagerCustomEndpoint, func(v string) { customEndpointConfig.SecretsManagerCustomEndpoint = v }) + setStringField(providerConfig.ServerBackupCustomEndpoint, func(v string) { customEndpointConfig.ServerBackupCustomEndpoint = v }) + setStringField(providerConfig.ServerUpdateCustomEndpoint, func(v string) { customEndpointConfig.ServerUpdateCustomEndpoint = v }) + setStringField(providerConfig.ServiceAccountCustomEndpoint, func(v string) { customEndpointConfig.ServiceAccountCustomEndpoint = v }) + setStringField(providerConfig.ServiceEnablementCustomEndpoint, func(v string) { customEndpointConfig.ServiceEnablementCustomEndpoint = v }) + setStringField(providerConfig.SfsCustomEndpoint, func(v string) { customEndpointConfig.SfsCustomEndpoint = v }) + setStringField(providerConfig.SkeCustomEndpoint, func(v string) { customEndpointConfig.SKECustomEndpoint = v }) + setStringField(providerConfig.SqlServerFlexCustomEndpoint, func(v string) { customEndpointConfig.SQLServerFlexCustomEndpoint = v }) + setStringField(providerConfig.TelemetryRouterCustomEndpoint, func(v string) { customEndpointConfig.TelemetryRouterCustomEndpoint = v }) + setStringField(providerConfig.TelemetryLinkCustomEndpoint, func(v string) { customEndpointConfig.TelemetryLinkCustomEndpoint = v }) + setStringField(providerConfig.VpnCustomEndpoint, func(v string) { customEndpointConfig.VpnCustomEndpoint = v }) if !(providerConfig.Experiments.IsUnknown() || providerConfig.Experiments.IsNull()) { var experimentValues []string @@ -611,6 +624,25 @@ func (p *Provider) Configure(ctx context.Context, req provider.ConfigureRequest, providerData.Experiments = experimentValues } + // when a client factory was injected for mocking - stop right here + if p.clientFactory != nil { + providerDataInternal, err := core.NewProviderDataInternal(providerData, p.clientFactory) + if err != nil { + core.LogAndAddError(ctx, &resp.Diagnostics, "Error configuring provider", fmt.Sprintf("Setting up provider data: %v", err)) + return + } + + resp.DataSourceData = providerDataInternal + resp.ResourceData = providerDataInternal + + // Copy service account, private key credentials and custom-token endpoint to support ephemeral access token generation + var ephemeralProviderData core.EphemeralProviderData + ephemeralProviderData.ProviderData = providerData + resp.EphemeralResourceData = ephemeralProviderData + + return + } + // Workload Identity Federation via provided OIDC Token oidc_token := "" setStringField(providerConfig.WifFederatedToken, func(v string) { oidc_token = v }) @@ -659,16 +691,25 @@ func (p *Provider) Configure(ctx context.Context, req provider.ConfigureRequest, // Make round tripper and custom endpoints available during DataSource and Resource // type Configure methods. - providerData.RoundTripper = roundTripper + clientFactory := core.DefaultClientFactory{ + RoundTripper: roundTripper, + UserAgent: fmt.Sprintf("stackit-terraform-provider/%s", p.version), + CustomEndpoints: customEndpointConfig, + ProviderDefaultRegion: providerData.GetRegion(), + } - providerData.Version = p.version + providerDataInternal, err := core.NewProviderDataInternal(providerData, &clientFactory) + if err != nil { + core.LogAndAddError(ctx, &resp.Diagnostics, "Error configuring provider", fmt.Sprintf("Setting up provider data: %v", err)) + } - resp.DataSourceData = providerData - resp.ResourceData = providerData + resp.DataSourceData = providerDataInternal + resp.ResourceData = providerDataInternal // Copy service account, private key credentials and custom-token endpoint to support ephemeral access token generation var ephemeralProviderData core.EphemeralProviderData ephemeralProviderData.ProviderData = providerData + ephemeralProviderData.RoundTripper = roundTripper resp.EphemeralResourceData = ephemeralProviderData } @@ -695,26 +736,7 @@ func (p *Provider) DataSources(_ context.Context) []func() datasource.DataSource iaasAlphaVpcNetworkRange.NewVpcNetworkRangeDatasource, iaasAlphaVpcRegion.NewVPCRegionDatasource, iaasAlphaVpcStaticRoute.NewStaticRouteDatasource, - iaasAffinityGroup.NewAffinityGroupDatasource, - iaasImage.NewImageDataSource, - iaasImageV2.NewImageV2DataSource, - iaasNetwork.NewNetworkDataSource, - iaasNetworkArea.NewNetworkAreaDataSource, - iaasNetworkAreaRegion.NewNetworkAreaRegionDataSource, - iaasNetworkAreaRoute.NewNetworkAreaRouteDataSource, - iaasNetworkInterface.NewNetworkInterfaceDataSource, - iaasVolume.NewVolumeDataSource, iaasProject.NewProjectDataSource, - iaasPublicIp.NewPublicIpDataSource, - iaasPublicIpRanges.NewPublicIpRangesDataSource, - iaasKeyPair.NewKeyPairDataSource, - iaasServer.NewServerDataSource, - iaasSecurityGroup.NewSecurityGroupDataSource, - iaasRoutingTable.NewRoutingTableDataSource, - iaasRoutingTableRoute.NewRoutingTableRouteDataSource, - iaasRoutingTables.NewRoutingTablesDataSource, - iaasRoutingTableRoutes.NewRoutingTableRoutesDataSource, - iaasSecurityGroupRule.NewSecurityGroupRuleDataSource, intakeRunner.NewRunnerDataSource, kmsKey.NewKeyDataSource, kmsKeyRing.NewKeyRingDataSource, @@ -785,6 +807,25 @@ func (p *Provider) DataSources(_ context.Context) []func() datasource.DataSource vpnGateway.NewVPNGatewayDataSource, vpnGatewayStatus.NewVPNGatewayStatusDataSource, vpnConnection.NewVPNConnectionDataSource, + iaasAffinityGroup.NewAffinityGroupDatasource, + iaasImage.NewImageDataSource, + iaasImageV2.NewImageV2DataSource, + iaasNetwork.NewNetworkDataSource, + iaasNetworkArea.NewNetworkAreaDataSource, + iaasNetworkAreaRegion.NewNetworkAreaRegionDataSource, + iaasNetworkAreaRoute.NewNetworkAreaRouteDataSource, + iaasNetworkInterface.NewNetworkInterfaceDataSource, + iaasPublicIp.NewPublicIpDataSource, + iaasPublicIpRanges.NewPublicIpRangesDataSource, + iaasKeyPair.NewKeyPairDataSource, + iaasServer.NewServerDataSource, + iaasSecurityGroup.NewSecurityGroupDataSource, + iaasRoutingTable.NewRoutingTableDataSource, + iaasRoutingTableRoute.NewRoutingTableRouteDataSource, + iaasRoutingTables.NewRoutingTablesDataSource, + iaasRoutingTableRoutes.NewRoutingTableRoutesDataSource, + iaasSecurityGroupRule.NewSecurityGroupRuleDataSource, + iaasVolume.NewVolumeDataSource, } dataSources = append(dataSources, customRole.NewCustomRoleDataSources()...) dataSources = append(dataSources, iamRoleBindingsV1.NewRoleBindingsDatasources()...) @@ -816,25 +857,6 @@ func (p *Provider) Resources(_ context.Context) []func() resource.Resource { iaasAlphaVpcNetworkRange.NewVpcNetworkRangeResource, iaasAlphaVpcRegion.NewVPCRegion, iaasAlphaVpcStaticRoute.NewStaticRouteResource, - iaasAffinityGroup.NewAffinityGroupResource, - iaasImage.NewImageResource, - iaasNetwork.NewNetworkResource, - iaasNetworkArea.NewNetworkAreaResource, - iaasNetworkAreaRegion.NewNetworkAreaRegionResource, - iaasNetworkAreaRoute.NewNetworkAreaRouteResource, - iaasNetworkInterface.NewNetworkInterfaceResource, - iaasVolume.NewVolumeResource, - iaasPublicIp.NewPublicIpResource, - iaasKeyPair.NewKeyPairResource, - iaasVolumeAttach.NewVolumeAttachResource, - iaasNetworkInterfaceAttach.NewNetworkInterfaceAttachResource, - iaasServiceAccountAttach.NewServiceAccountAttachResource, - iaasPublicIpAssociate.NewPublicIpAssociateResource, - iaasServer.NewServerResource, - iaasSecurityGroup.NewSecurityGroupResource, - iaasSecurityGroupRule.NewSecurityGroupRuleResource, - iaasRoutingTable.NewRoutingTableResource, - iaasRoutingTableRoute.NewRoutingTableRouteResource, intakeRunner.NewRunnerResource, kmsKey.NewKeyResource, kmsKeyRing.NewKeyRingResource, @@ -898,6 +920,25 @@ func (p *Provider) Resources(_ context.Context) []func() resource.Resource { telemetryLink.NewTelemetryLinkResource, vpnConnection.NewVpnConnectionResource, vpnGateway.NewGatewayResource, + iaasAffinityGroup.NewAffinityGroupResource, + iaasImage.NewImageResource, + iaasNetwork.NewNetworkResource, + iaasNetworkArea.NewNetworkAreaResource, + iaasNetworkAreaRegion.NewNetworkAreaRegionResource, + iaasNetworkAreaRoute.NewNetworkAreaRouteResource, + iaasNetworkInterface.NewNetworkInterfaceResource, + iaasPublicIp.NewPublicIpResource, + iaasKeyPair.NewKeyPairResource, + iaasVolumeAttach.NewVolumeAttachResource, + iaasNetworkInterfaceAttach.NewNetworkInterfaceAttachResource, + iaasServiceAccountAttach.NewServiceAccountAttachResource, + iaasPublicIpAssociate.NewPublicIpAssociateResource, + iaasServer.NewServerResource, + iaasSecurityGroup.NewSecurityGroupResource, + iaasSecurityGroupRule.NewSecurityGroupRuleResource, + iaasRoutingTable.NewRoutingTableResource, + iaasRoutingTableRoute.NewRoutingTableRouteResource, + iaasVolume.NewVolumeResource, } resources = append(resources, roleAssignements.NewRoleAssignmentResources()...) resources = append(resources, customRole.NewCustomRoleResources()...)