Some checks failed
CI Workflow / Check GoReleaser config (pull_request) Successful in 4s
CI Workflow / Test readiness for publishing provider (pull_request) Failing after 3m57s
CI Workflow / CI run tests (pull_request) Failing after 5m5s
CI Workflow / CI run build and linting (pull_request) Failing after 4m50s
CI Workflow / Code coverage report (pull_request) Has been skipped
239 lines
7.9 KiB
Go
239 lines
7.9 KiB
Go
package postgresflexalpha
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/hashicorp/terraform-plugin-framework/attr"
|
|
"github.com/hashicorp/terraform-plugin-framework/types"
|
|
"github.com/hashicorp/terraform-plugin-framework/types/basetypes"
|
|
postgresflex "github.com/stackitcloud/stackit-sdk-go/services/postgresflex/v3alpha1api"
|
|
|
|
postgresflexalphadatasource "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/instance/datasources_gen"
|
|
postgresflexalpharesource "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/instance/resources_gen"
|
|
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/utils"
|
|
)
|
|
|
|
func mapGetInstanceResponseToModel(
|
|
ctx context.Context,
|
|
m *postgresflexalpharesource.InstanceModel,
|
|
resp *postgresflex.GetInstanceResponse,
|
|
) error {
|
|
m.BackupSchedule = types.StringValue(resp.GetBackupSchedule())
|
|
m.Encryption = postgresflexalpharesource.NewEncryptionValueNull()
|
|
if resp.HasEncryption() {
|
|
m.Encryption = postgresflexalpharesource.NewEncryptionValueMust(
|
|
m.Encryption.AttributeTypes(ctx),
|
|
map[string]attr.Value{
|
|
"kek_key_id": types.StringValue(resp.Encryption.GetKekKeyId()),
|
|
"kek_key_ring_id": types.StringValue(resp.Encryption.GetKekKeyRingId()),
|
|
"kek_key_version": types.StringValue(resp.Encryption.GetKekKeyVersion()),
|
|
"service_account": types.StringValue(resp.Encryption.GetServiceAccount()),
|
|
},
|
|
)
|
|
}
|
|
|
|
isConnectionInfoIncomplete := resp.ConnectionInfo.Write.Host == "" || resp.ConnectionInfo.Write.Port == 0
|
|
|
|
if isConnectionInfoIncomplete {
|
|
m.ConnectionInfo = postgresflexalpharesource.NewConnectionInfoValueNull()
|
|
} else {
|
|
m.ConnectionInfo = postgresflexalpharesource.NewConnectionInfoValueMust(
|
|
postgresflexalpharesource.ConnectionInfoValue{}.AttributeTypes(ctx),
|
|
map[string]attr.Value{
|
|
"write": postgresflexalpharesource.NewWriteValueMust(
|
|
postgresflexalpharesource.WriteValue{}.AttributeTypes(ctx),
|
|
map[string]attr.Value{
|
|
"host": types.StringValue(resp.ConnectionInfo.Write.Host),
|
|
"port": types.Int32Value(resp.ConnectionInfo.Write.Port),
|
|
},
|
|
),
|
|
},
|
|
)
|
|
}
|
|
|
|
m.FlavorId = types.StringValue(resp.GetFlavorId())
|
|
if m.Id.IsNull() || m.Id.IsUnknown() {
|
|
m.Id = utils.BuildInternalTerraformId(
|
|
m.ProjectId.ValueString(),
|
|
m.Region.ValueString(),
|
|
m.InstanceId.ValueString(),
|
|
)
|
|
}
|
|
m.InstanceId = types.StringValue(resp.Id)
|
|
|
|
m.IsDeletable = types.BoolValue(resp.GetIsDeletable())
|
|
|
|
netAcl, diags := types.ListValueFrom(ctx, types.StringType, resp.Network.GetAcl())
|
|
if diags.HasError() {
|
|
return fmt.Errorf("failed converting network acl from response")
|
|
}
|
|
|
|
m.Acl = netAcl
|
|
|
|
netInstAdd := types.StringValue("")
|
|
if instAdd, ok := resp.Network.GetInstanceAddressOk(); ok {
|
|
netInstAdd = types.StringValue(*instAdd)
|
|
}
|
|
|
|
netRtrAdd := types.StringValue("")
|
|
if rtrAdd, ok := resp.Network.GetRouterAddressOk(); ok {
|
|
netRtrAdd = types.StringValue(*rtrAdd)
|
|
}
|
|
|
|
net, diags := postgresflexalpharesource.NewNetworkValue(
|
|
postgresflexalpharesource.NetworkValue{}.AttributeTypes(ctx),
|
|
map[string]attr.Value{
|
|
"access_scope": basetypes.NewStringValue(string(resp.Network.GetAccessScope())),
|
|
"acl": netAcl,
|
|
"instance_address": netInstAdd,
|
|
"router_address": netRtrAdd,
|
|
},
|
|
)
|
|
if diags.HasError() {
|
|
return fmt.Errorf("failed converting network from response")
|
|
}
|
|
|
|
m.Network = net
|
|
m.Replicas = types.Int32Value(int32(resp.GetReplicas()))
|
|
m.RetentionDays = types.Int32Value(resp.GetRetentionDays())
|
|
|
|
m.Name = types.StringValue(resp.GetName())
|
|
|
|
m.Status = types.StringValue(string(resp.GetStatus()))
|
|
|
|
storage, diags := postgresflexalpharesource.NewStorageValue(
|
|
postgresflexalpharesource.StorageValue{}.AttributeTypes(ctx),
|
|
map[string]attr.Value{
|
|
"performance_class": types.StringValue(resp.Storage.GetPerformanceClass()),
|
|
"size": types.Int32Value(resp.Storage.GetSize()),
|
|
},
|
|
)
|
|
if diags.HasError() {
|
|
return fmt.Errorf("failed converting storage from response")
|
|
}
|
|
m.Storage = storage
|
|
|
|
m.Version = types.StringValue(resp.GetVersion())
|
|
return nil
|
|
}
|
|
|
|
func mapGetDataInstanceResponseToModel(
|
|
ctx context.Context,
|
|
m *dataSourceModel,
|
|
resp *postgresflex.GetInstanceResponse,
|
|
) error {
|
|
m.BackupSchedule = types.StringValue(resp.GetBackupSchedule())
|
|
handleEncryption(m, resp)
|
|
handleConnectionInfo(ctx, m, resp)
|
|
|
|
m.FlavorId = types.StringValue(resp.GetFlavorId())
|
|
m.Id = utils.BuildInternalTerraformId(m.ProjectId.ValueString(), m.Region.ValueString(), m.InstanceId.ValueString())
|
|
m.InstanceId = types.StringValue(resp.Id)
|
|
m.IsDeletable = types.BoolValue(resp.GetIsDeletable())
|
|
m.Name = types.StringValue(resp.GetName())
|
|
|
|
err := handleNetwork(ctx, m, resp)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
m.Replicas = types.Int32Value(int32(resp.GetReplicas()))
|
|
m.RetentionDays = types.Int32Value(resp.GetRetentionDays())
|
|
m.Status = types.StringValue(string(resp.GetStatus()))
|
|
storage, diags := postgresflexalphadatasource.NewStorageValue(
|
|
postgresflexalphadatasource.StorageValue{}.AttributeTypes(ctx),
|
|
map[string]attr.Value{
|
|
"performance_class": types.StringValue(resp.Storage.GetPerformanceClass()),
|
|
"size": types.Int32Value(resp.Storage.GetSize()),
|
|
},
|
|
)
|
|
if diags.HasError() {
|
|
return fmt.Errorf("failed converting storage from response")
|
|
}
|
|
m.Storage = storage
|
|
m.Version = types.StringValue(resp.GetVersion())
|
|
return nil
|
|
}
|
|
|
|
func handleConnectionInfo(ctx context.Context, m *dataSourceModel, resp *postgresflex.GetInstanceResponse) {
|
|
isConnectionInfoIncomplete := resp.ConnectionInfo.Write.Host == "" || resp.ConnectionInfo.Write.Port == 0
|
|
|
|
if isConnectionInfoIncomplete {
|
|
m.ConnectionInfo = postgresflexalphadatasource.NewConnectionInfoValueNull()
|
|
} else {
|
|
m.ConnectionInfo = postgresflexalphadatasource.NewConnectionInfoValueMust(
|
|
postgresflexalphadatasource.ConnectionInfoValue{}.AttributeTypes(ctx),
|
|
map[string]attr.Value{
|
|
"write": types.ObjectValueMust(
|
|
postgresflexalphadatasource.WriteValue{}.AttributeTypes(ctx),
|
|
map[string]attr.Value{
|
|
"host": types.StringValue(resp.ConnectionInfo.Write.Host),
|
|
"port": types.Int32Value(resp.ConnectionInfo.Write.Port),
|
|
},
|
|
),
|
|
},
|
|
)
|
|
}
|
|
}
|
|
|
|
func handleNetwork(ctx context.Context, m *dataSourceModel, resp *postgresflex.GetInstanceResponse) error {
|
|
netAcl, diags := types.ListValueFrom(ctx, types.StringType, resp.Network.GetAcl())
|
|
if diags.HasError() {
|
|
return fmt.Errorf("failed converting network acl from response")
|
|
}
|
|
|
|
instAddr := ""
|
|
if iA, ok := resp.Network.GetInstanceAddressOk(); ok {
|
|
instAddr = *iA
|
|
}
|
|
|
|
rtrAddr := ""
|
|
if rA, ok := resp.Network.GetRouterAddressOk(); ok {
|
|
rtrAddr = *rA
|
|
}
|
|
|
|
net, diags := postgresflexalphadatasource.NewNetworkValue(
|
|
postgresflexalphadatasource.NetworkValue{}.AttributeTypes(ctx),
|
|
map[string]attr.Value{
|
|
"access_scope": types.StringValue(string(resp.Network.GetAccessScope())),
|
|
"acl": netAcl,
|
|
"instance_address": types.StringValue(instAddr),
|
|
"router_address": types.StringValue(rtrAddr),
|
|
},
|
|
)
|
|
if diags.HasError() {
|
|
return fmt.Errorf("failed converting network from response")
|
|
}
|
|
m.Network = net
|
|
return nil
|
|
}
|
|
|
|
func handleEncryption(m *dataSourceModel, resp *postgresflex.GetInstanceResponse) {
|
|
keyId := ""
|
|
if keyIdVal, ok := resp.Encryption.GetKekKeyIdOk(); ok {
|
|
keyId = *keyIdVal
|
|
}
|
|
|
|
keyRingId := ""
|
|
if keyRingIdVal, ok := resp.Encryption.GetKekKeyRingIdOk(); ok {
|
|
keyRingId = *keyRingIdVal
|
|
}
|
|
|
|
keyVersion := ""
|
|
if keyVersionVal, ok := resp.Encryption.GetKekKeyVersionOk(); ok {
|
|
keyVersion = *keyVersionVal
|
|
}
|
|
|
|
svcAcc := ""
|
|
if svcAccVal, ok := resp.Encryption.GetServiceAccountOk(); ok {
|
|
svcAcc = *svcAccVal
|
|
}
|
|
|
|
m.Encryption = postgresflexalphadatasource.EncryptionValue{
|
|
KekKeyId: types.StringValue(keyId),
|
|
KekKeyRingId: types.StringValue(keyRingId),
|
|
KekKeyVersion: types.StringValue(keyVersion),
|
|
ServiceAccount: types.StringValue(svcAcc),
|
|
}
|
|
}
|