fix: refactor to use identity and different model mapping
Some checks failed
CI Workflow / Check GoReleaser config (pull_request) Successful in 5s
CI Workflow / Test readiness for publishing provider (pull_request) Successful in 22m50s
CI Workflow / CI (pull_request) Failing after 27m13s
CI Workflow / Code coverage report (pull_request) Has been skipped

This commit is contained in:
Marcel S. Henselin 2026-02-03 19:00:44 +01:00
parent 762c39fbbd
commit 8d7323bbc1
9 changed files with 191 additions and 212 deletions

View file

@ -75,14 +75,14 @@ func (b *Builder) Build() error {
slog.Info("Creating generator dir", "dir", fmt.Sprintf("%s/%s", *root, GEN_REPO_NAME)) slog.Info("Creating generator dir", "dir", fmt.Sprintf("%s/%s", *root, GEN_REPO_NAME))
genDir := path.Join(*root, GEN_REPO_NAME) genDir := path.Join(*root, GEN_REPO_NAME)
if !b.SkipClone { if !b.SkipClone {
err = createGeneratorDir(GEN_REPO, genDir) err = createGeneratorDir(GEN_REPO, genDir, b.SkipClone)
if err != nil { if err != nil {
return err return err
} }
} }
slog.Info("Creating oas dir", "dir", fmt.Sprintf("%s/%s", *root, OAS_REPO_NAME)) slog.Info("Creating oas repo dir", "dir", fmt.Sprintf("%s/%s", *root, OAS_REPO_NAME))
repoDir, err := createRepoDir(genDir, OAS_REPO, OAS_REPO_NAME, !b.SkipClone) repoDir, err := createRepoDir(genDir, OAS_REPO, OAS_REPO_NAME, b.SkipClone)
if err != nil { if err != nil {
return fmt.Errorf("%s", err.Error()) return fmt.Errorf("%s", err.Error())
} }
@ -128,14 +128,6 @@ func (b *Builder) Build() error {
} }
} }
if !b.SkipCleanup {
slog.Info("Cleaning up", "dir", repoDir)
err = os.RemoveAll(filepath.Dir(repoDir))
if err != nil {
return fmt.Errorf("%s", err.Error())
}
}
slog.Info("Changing dir", "dir", genDir) slog.Info("Changing dir", "dir", genDir)
err = os.Chdir(genDir) err = os.Chdir(genDir)
if err != nil { if err != nil {
@ -249,6 +241,12 @@ func (b *Builder) Build() error {
slog.Error("RemoveAll", "dir", path.Join(*root, GEN_REPO_NAME), "err", err) slog.Error("RemoveAll", "dir", path.Join(*root, GEN_REPO_NAME), "err", err)
return err return err
} }
slog.Info("Cleaning up", "dir", repoDir)
err = os.RemoveAll(filepath.Dir(repoDir))
if err != nil {
return fmt.Errorf("%s", err.Error())
}
} }
slog.Info("Done") slog.Info("Done")
@ -738,9 +736,9 @@ func handleVersion(service string, match []string) (*string, *version, error) {
return &resStr, &version{verString: verString, major: majVer, minor: minVer}, nil return &resStr, &version{verString: verString, major: majVer, minor: minVer}, nil
} }
func createRepoDir(root, repoUrl, repoName string, doClone bool) (string, error) { func createRepoDir(root, repoUrl, repoName string, skipClone bool) (string, error) {
targetDir := path.Join(root, repoName) targetDir := path.Join(root, repoName)
if doClone { if !skipClone {
if fileExists(targetDir) { if fileExists(targetDir) {
slog.Warn("target dir exists - skipping", "targetDir", targetDir) slog.Warn("target dir exists - skipping", "targetDir", targetDir)
return targetDir, nil return targetDir, nil
@ -756,8 +754,14 @@ func createRepoDir(root, repoUrl, repoName string, doClone bool) (string, error)
return targetDir, nil return targetDir, nil
} }
func createGeneratorDir(repoUrl, targetDir string) error { func createGeneratorDir(repoUrl, targetDir string, skipClone bool) error {
if !fileExists(targetDir) { if !skipClone {
if fileExists(targetDir) {
remErr := os.RemoveAll(targetDir)
if remErr != nil {
return remErr
}
}
_, cloneErr := git.Clone( _, cloneErr := git.Clone(
clone.Repository(repoUrl), clone.Repository(repoUrl),
clone.Directory(targetDir), clone.Directory(targetDir),

View file

@ -14,9 +14,6 @@ func main() {
slog.SetDefault(slog.New(slogcolor.NewHandler(os.Stderr, slogcolor.DefaultOptions))) slog.SetDefault(slog.New(slogcolor.NewHandler(os.Stderr, slogcolor.DefaultOptions)))
rootCmd := cmd.NewRootCmd() rootCmd := cmd.NewRootCmd()
//rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra.yaml)")
//rootCmd.PersistentFlags().StringP("author", "a", "YOUR NAME", "author name for copyright attribution")
//rootCmd.PersistentFlags().StringVarP(&userLicense, "license", "l", "", "name of license for the project")
cc.Init(&cc.Config{ cc.Init(&cc.Config{
RootCmd: rootCmd, RootCmd: rootCmd,

View file

@ -34,10 +34,10 @@ resource "stackitprivatepreview_sqlserverflexalpha_instance" "msh-sna-001" {
#keyring_id = stackit_kms_keyring.keyring.keyring_id #keyring_id = stackit_kms_keyring.keyring.keyring_id
#key_version = 1 #key_version = 1
# key with scope public # key with scope public
key_id = "fe039bcf-8d7b-431a-801d-9e81371a6b7b" kek_key_id = "fe039bcf-8d7b-431a-801d-9e81371a6b7b"
# key_id = var.key_id # key_id = var.key_id
keyring_id = var.keyring_id kek_key_ring_id = var.keyring_id
key_version = var.key_version kek_key_version = var.key_version
service_account = var.sa_email service_account = var.sa_email
} }
network = { network = {

View file

@ -18,6 +18,11 @@ resources:
method: DELETE method: DELETE
data_sources: data_sources:
database:
read:
path: /v3alpha1/projects/{projectId}/regions/{region}/instances/{instanceId}/databases/{databaseId}
method: GET
databases: databases:
read: read:
path: /v3alpha1/projects/{projectId}/regions/{region}/instances/{instanceId}/databases path: /v3alpha1/projects/{projectId}/regions/{region}/instances/{instanceId}/databases

View file

@ -278,7 +278,7 @@ func (r *instanceDataSource) Read(ctx context.Context, req datasource.ReadReques
// } // }
//} //}
err = mapDataSourceResponseToModel(ctx, instanceResp, &model, resp) err = mapResponseToModel(ctx, instanceResp, &model, resp.Diagnostics)
//err = mapFields(ctx, instanceResp, &model, storage, encryption, network, region) //err = mapFields(ctx, instanceResp, &model, storage, encryption, network, region)
if err != nil { if err != nil {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Processing API payload: %v", err)) core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading instance", fmt.Sprintf("Processing API payload: %v", err))

View file

@ -6,7 +6,7 @@ import (
"math" "math"
"github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/attr"
"github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/diag"
"github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource"
"github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-framework/types"
sqlserverflex "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pkg_gen/sqlserverflexalpha" sqlserverflex "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pkg_gen/sqlserverflexalpha"
@ -14,200 +14,103 @@ import (
sqlserverflexResGen "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/instance/resources_gen" sqlserverflexResGen "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/instance/resources_gen"
) )
func mapCreateResponseToModel( func mapResponseToModel(
ctx context.Context, ctx context.Context,
resp *sqlserverflex.GetInstanceResponse, resp *sqlserverflex.GetInstanceResponse,
m *sqlserverflexResGen.InstanceModel, m *sqlserverflexResGen.InstanceModel,
tfResp *resource.CreateResponse, tfDiags diag.Diagnostics,
) error { ) error {
m.BackupSchedule = types.StringValue(resp.GetBackupSchedule()) m.BackupSchedule = types.StringValue(resp.GetBackupSchedule())
m.Edition = types.StringValue(string(resp.GetEdition()))
if resp.HasEncryption() { m.Encryption = handleEncryption(m, resp)
m.Encryption = sqlserverflexResGen.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()),
},
)
}
m.FlavorId = types.StringValue(resp.GetFlavorId()) m.FlavorId = types.StringValue(resp.GetFlavorId())
m.Id = types.StringValue(resp.GetId()) m.Id = types.StringValue(resp.GetId())
m.InstanceId = types.StringValue(resp.GetId()) m.InstanceId = types.StringValue(resp.GetId())
m.IsDeletable = types.BoolValue(resp.GetIsDeletable())
m.Name = types.StringValue(resp.GetName()) m.Name = types.StringValue(resp.GetName())
netAcl, diags := types.ListValueFrom(ctx, types.StringType, resp.Network.GetAcl()) netAcl, diags := types.ListValueFrom(ctx, types.StringType, resp.Network.GetAcl())
tfResp.Diagnostics.Append(diags...) tfDiags.Append(diags...)
if diags.HasError() { if diags.HasError() {
return fmt.Errorf("error converting api response value") return fmt.Errorf(
"error converting network acl response value",
)
} }
net, diags := sqlserverflexResGen.NewNetworkValue(
m.Network = sqlserverflexResGen.NetworkValue{ sqlserverflexResGen.NetworkValue{}.AttributeTypes(ctx),
AccessScope: types.StringValue(string(resp.Network.GetAccessScope())), map[string]attr.Value{
Acl: netAcl, "access_scope": types.StringValue(string(resp.Network.GetAccessScope())),
InstanceAddress: types.StringValue(resp.Network.GetInstanceAddress()), "acl": netAcl,
RouterAddress: types.StringValue(resp.Network.GetRouterAddress()), "instance_address": types.StringValue(resp.Network.GetInstanceAddress()),
"router_address": types.StringValue(resp.Network.GetRouterAddress()),
},
)
tfDiags.Append(diags...)
if diags.HasError() {
return fmt.Errorf(
"error converting network response value",
"access_scope",
types.StringValue(string(resp.Network.GetAccessScope())),
"acl",
netAcl,
"instance_address",
types.StringValue(resp.Network.GetInstanceAddress()),
"router_address",
types.StringValue(resp.Network.GetRouterAddress()),
)
} }
m.Network = net
m.Replicas = types.Int64Value(int64(resp.GetReplicas()))
m.RetentionDays = types.Int64Value(resp.GetRetentionDays()) m.RetentionDays = types.Int64Value(resp.GetRetentionDays())
m.Storage = sqlserverflexResGen.StorageValue{
Class: types.StringValue(resp.Storage.GetClass()),
Size: types.Int64Value(resp.Storage.GetSize()),
}
m.Status = types.StringValue(string(resp.GetStatus())) m.Status = types.StringValue(string(resp.GetStatus()))
m.Version = types.StringValue(string(resp.GetVersion()))
stor, diags := sqlserverflexResGen.NewStorageValue(
sqlserverflexResGen.StorageValue{}.AttributeTypes(ctx),
map[string]attr.Value{
"class": types.StringValue(resp.Storage.GetClass()),
"size": types.Int64Value(resp.Storage.GetSize()),
},
)
tfDiags.Append(diags...)
if diags.HasError() {
return fmt.Errorf("error converting storage response value")
}
m.Storage = stor
m.Version = types.StringValue(string(resp.GetVersion()))
return nil return nil
} }
func mapReadResponseToModel( func handleEncryption(
ctx context.Context,
resp *sqlserverflex.GetInstanceResponse,
m *sqlserverflexResGen.InstanceModel, m *sqlserverflexResGen.InstanceModel,
tfResp *resource.ReadResponse,
) error {
m.BackupSchedule = types.StringValue(resp.GetBackupSchedule())
if resp.HasEncryption() {
m.Encryption = sqlserverflexResGen.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()),
},
)
}
m.FlavorId = types.StringValue(resp.GetFlavorId())
m.Id = types.StringValue(resp.GetId())
m.InstanceId = types.StringValue(resp.GetId())
m.Name = types.StringValue(resp.GetName())
netAcl, diags := types.ListValueFrom(ctx, types.StringType, resp.Network.GetAcl())
tfResp.Diagnostics.Append(diags...)
if diags.HasError() {
return fmt.Errorf("error converting api response value")
}
m.Network = sqlserverflexResGen.NetworkValue{
AccessScope: types.StringValue(string(resp.Network.GetAccessScope())),
Acl: netAcl,
InstanceAddress: types.StringValue(resp.Network.GetInstanceAddress()),
RouterAddress: types.StringValue(resp.Network.GetRouterAddress()),
}
m.RetentionDays = types.Int64Value(resp.GetRetentionDays())
m.Storage = sqlserverflexResGen.StorageValue{
Class: types.StringValue(resp.Storage.GetClass()),
Size: types.Int64Value(resp.Storage.GetSize()),
}
m.Status = types.StringValue(string(resp.GetStatus()))
m.Version = types.StringValue(string(resp.GetVersion()))
return nil
}
func mapUpdateResponseToModel(
ctx context.Context,
resp *sqlserverflex.GetInstanceResponse, resp *sqlserverflex.GetInstanceResponse,
m *sqlserverflexResGen.InstanceModel, ) sqlserverflexResGen.EncryptionValue {
tfResp *resource.UpdateResponse, if !resp.HasEncryption() ||
) error { resp.Encryption == nil ||
m.BackupSchedule = types.StringValue(resp.GetBackupSchedule()) resp.Encryption.KekKeyId == nil ||
resp.Encryption.KekKeyRingId == nil ||
resp.Encryption.KekKeyVersion == nil ||
resp.Encryption.ServiceAccount == nil {
if resp.HasEncryption() { if m.Encryption.IsNull() || m.Encryption.IsUnknown() {
m.Encryption = sqlserverflexResGen.NewEncryptionValueMust( return sqlserverflexResGen.NewEncryptionValueNull()
m.Encryption.AttributeTypes(ctx), }
map[string]attr.Value{ return m.Encryption
"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()),
},
)
} }
m.FlavorId = types.StringValue(resp.GetFlavorId()) enc := sqlserverflexResGen.NewEncryptionValueNull()
m.Id = types.StringValue(resp.GetId()) if kVal, ok := resp.Encryption.GetKekKeyIdOk(); ok {
m.InstanceId = types.StringValue(resp.GetId()) enc.KekKeyId = types.StringValue(kVal)
m.Name = types.StringValue(resp.GetName())
netAcl, diags := types.ListValueFrom(ctx, types.StringType, resp.Network.GetAcl())
tfResp.Diagnostics.Append(diags...)
if diags.HasError() {
return fmt.Errorf("error converting api response value")
} }
if kkVal, ok := resp.Encryption.GetKekKeyRingIdOk(); ok {
m.Network = sqlserverflexResGen.NetworkValue{ enc.KekKeyRingId = types.StringValue(kkVal)
AccessScope: types.StringValue(string(resp.Network.GetAccessScope())),
Acl: netAcl,
InstanceAddress: types.StringValue(resp.Network.GetInstanceAddress()),
RouterAddress: types.StringValue(resp.Network.GetRouterAddress()),
} }
if kkvVal, ok := resp.Encryption.GetKekKeyVersionOk(); ok {
m.RetentionDays = types.Int64Value(resp.GetRetentionDays()) enc.KekKeyVersion = types.StringValue(kkvVal)
m.Storage = sqlserverflexResGen.StorageValue{
Class: types.StringValue(resp.Storage.GetClass()),
Size: types.Int64Value(resp.Storage.GetSize()),
} }
m.Status = types.StringValue(string(resp.GetStatus())) if sa, ok := resp.Encryption.GetServiceAccountOk(); ok {
m.Version = types.StringValue(string(resp.GetVersion())) enc.ServiceAccount = types.StringValue(sa)
return nil
}
func mapDataSourceResponseToModel(
ctx context.Context,
resp *sqlserverflex.GetInstanceResponse,
m *sqlserverflexResGen.InstanceModel,
tfResp *datasource.ReadResponse,
) error {
m.BackupSchedule = types.StringValue(resp.GetBackupSchedule())
if resp.HasEncryption() {
m.Encryption = sqlserverflexResGen.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()),
},
)
} }
return enc
m.FlavorId = types.StringValue(resp.GetFlavorId())
m.Id = types.StringValue(resp.GetId())
m.InstanceId = types.StringValue(resp.GetId())
m.Name = types.StringValue(resp.GetName())
netAcl, diags := types.ListValueFrom(ctx, types.StringType, resp.Network.GetAcl())
tfResp.Diagnostics.Append(diags...)
if diags.HasError() {
return fmt.Errorf("error converting api response value")
}
m.Network = sqlserverflexResGen.NetworkValue{
AccessScope: types.StringValue(string(resp.Network.GetAccessScope())),
Acl: netAcl,
InstanceAddress: types.StringValue(resp.Network.GetInstanceAddress()),
RouterAddress: types.StringValue(resp.Network.GetRouterAddress()),
}
m.RetentionDays = types.Int64Value(resp.GetRetentionDays())
m.Storage = sqlserverflexResGen.StorageValue{
Class: types.StringValue(resp.Storage.GetClass()),
Size: types.Int64Value(resp.Storage.GetSize()),
}
m.Status = types.StringValue(string(resp.GetStatus()))
m.Version = types.StringValue(string(resp.GetVersion()))
return nil
} }
//func mapFields( //func mapFields(
@ -357,6 +260,7 @@ func mapDataSourceResponseToModel(
//} //}
func toCreatePayload( func toCreatePayload(
ctx context.Context,
model *sqlserverflexResGen.InstanceModel, model *sqlserverflexResGen.InstanceModel,
) (*sqlserverflex.CreateInstanceRequestPayload, error) { ) (*sqlserverflex.CreateInstanceRequestPayload, error) {
if model == nil { if model == nil {
@ -390,11 +294,9 @@ func toCreatePayload(
) )
var resList []string var resList []string
aclList := model.Network.Acl.Elements() diags := model.Network.Acl.ElementsAs(ctx, &resList, false)
for _, aclItem := range aclList { if diags.HasError() {
if !aclItem.IsNull() && !aclItem.IsUnknown() { return nil, fmt.Errorf("error converting network acl list")
resList = append(resList, aclItem.String())
}
} }
networkPayload.Acl = &resList networkPayload.Acl = &resList
} }

View file

@ -21,7 +21,6 @@ fields:
- name: 'name' - name: 'name'
modifiers: modifiers:
- 'UseStateForUnknown' - 'UseStateForUnknown'
- 'RequiresReplace'
- name: 'backup_schedule' - name: 'backup_schedule'
modifiers: modifiers:
@ -31,24 +30,28 @@ fields:
validators: validators:
- validate.NoSeparator - validate.NoSeparator
modifiers: modifiers:
- 'UseStateForUnknown'
- 'RequiresReplace' - 'RequiresReplace'
- name: 'encryption.kek_key_version' - name: 'encryption.kek_key_version'
validators: validators:
- validate.NoSeparator - validate.NoSeparator
modifiers: modifiers:
- 'UseStateForUnknown'
- 'RequiresReplace' - 'RequiresReplace'
- name: 'encryption.kek_key_ring_id' - name: 'encryption.kek_key_ring_id'
validators: validators:
- validate.NoSeparator - validate.NoSeparator
modifiers: modifiers:
- 'UseStateForUnknown'
- 'RequiresReplace' - 'RequiresReplace'
- name: 'encryption.service_account' - name: 'encryption.service_account'
validators: validators:
- validate.NoSeparator - validate.NoSeparator
modifiers: modifiers:
- 'UseStateForUnknown'
- 'RequiresReplace' - 'RequiresReplace'
- name: 'network.access_scope' - name: 'network.access_scope'
@ -76,6 +79,7 @@ fields:
- name: 'region' - name: 'region'
modifiers: modifiers:
- 'UseStateForUnknown'
- 'RequiresReplace' - 'RequiresReplace'
- name: 'retention_days' - name: 'retention_days'

View file

@ -92,16 +92,20 @@ func (r *instanceResource) ModifyPlan(
req resource.ModifyPlanRequest, req resource.ModifyPlanRequest,
resp *resource.ModifyPlanResponse, resp *resource.ModifyPlanResponse,
) { // nolint:gocritic // function signature required by Terraform ) { // nolint:gocritic // function signature required by Terraform
var configModel sqlserverflexalpha2.InstanceModel
// skip initial empty configuration to avoid follow-up errors // skip initial empty configuration to avoid follow-up errors
if req.Config.Raw.IsNull() { if req.Config.Raw.IsNull() {
return return
} }
var configModel sqlserverflexalpha2.InstanceModel
resp.Diagnostics.Append(req.Config.Get(ctx, &configModel)...) resp.Diagnostics.Append(req.Config.Get(ctx, &configModel)...)
if resp.Diagnostics.HasError() { if resp.Diagnostics.HasError() {
return return
} }
if req.Plan.Raw.IsNull() {
return
}
var planModel sqlserverflexalpha2.InstanceModel var planModel sqlserverflexalpha2.InstanceModel
resp.Diagnostics.Append(req.Plan.Get(ctx, &planModel)...) resp.Diagnostics.Append(req.Plan.Get(ctx, &planModel)...)
if resp.Diagnostics.HasError() { if resp.Diagnostics.HasError() {
@ -113,6 +117,18 @@ func (r *instanceResource) ModifyPlan(
return return
} }
var identityModel InstanceResourceIdentityModel
identityModel.ProjectID = planModel.ProjectId
identityModel.Region = planModel.Region
if !planModel.InstanceId.IsNull() && !planModel.InstanceId.IsUnknown() {
identityModel.InstanceID = planModel.InstanceId
}
resp.Diagnostics.Append(resp.Identity.Set(ctx, identityModel)...)
if resp.Diagnostics.HasError() {
return
}
resp.Diagnostics.Append(resp.Plan.Set(ctx, planModel)...) resp.Diagnostics.Append(resp.Plan.Set(ctx, planModel)...)
if resp.Diagnostics.HasError() { if resp.Diagnostics.HasError() {
return return
@ -416,15 +432,22 @@ func (r *instanceResource) Create(
return return
} }
// Read identity data
var identityData InstanceResourceIdentityModel
resp.Diagnostics.Append(req.Identity.Get(ctx, &identityData)...)
if resp.Diagnostics.HasError() {
return
}
ctx = core.InitProviderContext(ctx) ctx = core.InitProviderContext(ctx)
projectId := model.ProjectId.ValueString() projectId := identityData.ProjectID.ValueString()
region := model.Region.ValueString() region := identityData.Region.ValueString()
ctx = tflog.SetField(ctx, "project_id", projectId) ctx = tflog.SetField(ctx, "project_id", projectId)
ctx = tflog.SetField(ctx, "region", region) ctx = tflog.SetField(ctx, "region", region)
// Generate API request body from model // Generate API request body from model
payload, err := toCreatePayload(&model) payload, err := toCreatePayload(ctx, &model)
if err != nil { if err != nil {
core.LogAndAddError( core.LogAndAddError(
ctx, ctx,
@ -448,6 +471,18 @@ func (r *instanceResource) Create(
ctx = core.LogResponse(ctx) ctx = core.LogResponse(ctx)
instanceId := *createResp.Id instanceId := *createResp.Id
// Set data returned by API in identity
identity := InstanceResourceIdentityModel{
ProjectID: types.StringValue(projectId),
Region: types.StringValue(region),
InstanceID: types.StringValue(instanceId),
}
resp.Diagnostics.Append(resp.Identity.Set(ctx, identity)...)
if resp.Diagnostics.HasError() {
return
}
utils.SetAndLogStateFields( utils.SetAndLogStateFields(
ctx, &resp.Diagnostics, &resp.State, map[string]any{ ctx, &resp.Diagnostics, &resp.State, map[string]any{
"id": utils.BuildInternalTerraformId(projectId, region, instanceId), "id": utils.BuildInternalTerraformId(projectId, region, instanceId),
@ -466,7 +501,11 @@ func (r *instanceResource) Create(
projectId, projectId,
instanceId, instanceId,
region, region,
).SetSleepBeforeWait(30 * time.Second).WaitWithContext(ctx) ).SetSleepBeforeWait(
30 * time.Second,
).SetTimeout(
90 * time.Minute,
).WaitWithContext(ctx)
if err != nil { if err != nil {
core.LogAndAddError( core.LogAndAddError(
ctx, ctx,
@ -489,7 +528,7 @@ func (r *instanceResource) Create(
// Map response body to schema // Map response body to schema
// err = mapFields(ctx, waitResp, &model, storage, encryption, network, region) // err = mapFields(ctx, waitResp, &model, storage, encryption, network, region)
err = mapCreateResponseToModel(ctx, waitResp, &model, resp) err = mapResponseToModel(ctx, waitResp, &model, resp.Diagnostics)
if err != nil { if err != nil {
core.LogAndAddError( core.LogAndAddError(
ctx, ctx,
@ -522,6 +561,13 @@ func (r *instanceResource) Read(
return return
} }
// Read identity data
var identityData InstanceResourceIdentityModel
resp.Diagnostics.Append(req.Identity.Get(ctx, &identityData)...)
if resp.Diagnostics.HasError() {
return
}
ctx = core.InitProviderContext(ctx) ctx = core.InitProviderContext(ctx)
projectId := model.ProjectId.ValueString() projectId := model.ProjectId.ValueString()
@ -547,7 +593,7 @@ func (r *instanceResource) Read(
// Map response body to schema // Map response body to schema
// err = mapFields(ctx, instanceResp, &model, storage, encryption, network, region) // err = mapFields(ctx, instanceResp, &model, storage, encryption, network, region)
err = mapReadResponseToModel(ctx, instanceResp, &model, resp) err = mapResponseToModel(ctx, instanceResp, &model, resp.Diagnostics)
if err != nil { if err != nil {
core.LogAndAddError( core.LogAndAddError(
ctx, ctx,
@ -563,6 +609,17 @@ func (r *instanceResource) Read(
if resp.Diagnostics.HasError() { if resp.Diagnostics.HasError() {
return return
} }
// Set data returned by API in identity
identity := InstanceResourceIdentityModel{
ProjectID: types.StringValue(projectId),
Region: types.StringValue(region),
InstanceID: types.StringValue(instanceId),
}
resp.Diagnostics.Append(resp.Identity.Set(ctx, identity)...)
if resp.Diagnostics.HasError() {
return
}
tflog.Info(ctx, "SQLServer Flex instance read") tflog.Info(ctx, "SQLServer Flex instance read")
} }
@ -627,7 +684,7 @@ func (r *instanceResource) Update(
} }
// Map response body to schema // Map response body to schema
err = mapUpdateResponseToModel(ctx, waitResp, &model, resp) err = mapResponseToModel(ctx, waitResp, &model, resp.Diagnostics)
// err = mapFields(ctx, waitResp, &model, storage, encryption, network, region) // err = mapFields(ctx, waitResp, &model, storage, encryption, network, region)
if err != nil { if err != nil {
core.LogAndAddError( core.LogAndAddError(

View file

@ -44,17 +44,24 @@ func CreateInstanceWaitHandler(ctx context.Context, a APIClientInstanceInterface
} }
switch strings.ToLower(string(*s.Status)) { switch strings.ToLower(string(*s.Status)) {
case strings.ToLower(InstanceStateSuccess): case strings.ToLower(InstanceStateSuccess):
if s.Network.InstanceAddress == nil { if *s.Network.AccessScope == "SNA" {
tflog.Info(ctx, "Waiting for instance_address") if s.Network.InstanceAddress == nil {
return false, nil, nil tflog.Info(ctx, "Waiting for instance_address")
} return false, nil, nil
if s.Network.RouterAddress == nil { }
tflog.Info(ctx, "Waiting for router_address") if s.Network.RouterAddress == nil {
return false, nil, nil tflog.Info(ctx, "Waiting for router_address")
return false, nil, nil
}
} }
return true, s, nil return true, s, nil
case strings.ToLower(InstanceStateUnknown), strings.ToLower(InstanceStateFailed): case strings.ToLower(InstanceStateUnknown), strings.ToLower(InstanceStateFailed):
return true, s, fmt.Errorf("create failed for instance with id %s", instanceId) return true, s, fmt.Errorf("create failed for instance with id %s", instanceId)
case strings.ToLower(InstanceStatePending), strings.ToLower(InstanceStateProcessing):
tflog.Info(ctx, "request is being handled", map[string]interface{}{
"status": *s.Status,
})
return false, nil, nil
default: default:
tflog.Info(ctx, "Wait (create) received unknown status", map[string]interface{}{ tflog.Info(ctx, "Wait (create) received unknown status", map[string]interface{}{
"instanceId": instanceId, "instanceId": instanceId,
@ -63,8 +70,6 @@ func CreateInstanceWaitHandler(ctx context.Context, a APIClientInstanceInterface
return false, s, nil return false, s, nil
} }
}) })
handler.SetTimeout(45 * time.Minute)
handler.SetSleepBeforeWait(15 * time.Second)
return handler return handler
} }
@ -83,6 +88,11 @@ func UpdateInstanceWaitHandler(ctx context.Context, a APIClientInstanceInterface
return true, s, nil return true, s, nil
case strings.ToLower(InstanceStateUnknown), strings.ToLower(InstanceStateFailed): case strings.ToLower(InstanceStateUnknown), strings.ToLower(InstanceStateFailed):
return true, s, fmt.Errorf("update failed for instance with id %s", instanceId) return true, s, fmt.Errorf("update failed for instance with id %s", instanceId)
case strings.ToLower(InstanceStatePending), strings.ToLower(InstanceStateProcessing):
tflog.Info(ctx, "request is being handled", map[string]interface{}{
"status": *s.Status,
})
return false, nil, nil
default: default:
tflog.Info(ctx, "Wait (update) received unknown status", map[string]interface{}{ tflog.Info(ctx, "Wait (update) received unknown status", map[string]interface{}{
"instanceId": instanceId, "instanceId": instanceId,