1.3.0
This commit is contained in:
@@ -76,7 +76,7 @@ func (d *dataSourceAccountListDeleted) Schema(ctx context.Context, _ datasource.
|
||||
}
|
||||
|
||||
func (d *dataSourceAccountListDeleted) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) {
|
||||
resp.TypeName = req.ProviderTypeName + "_account_list_deleted"
|
||||
resp.TypeName = req.ProviderTypeName + "_account_deleted_list"
|
||||
}
|
||||
|
||||
// Configure adds the provider configured client to the data source.
|
||||
@@ -51,6 +51,7 @@ func AccountDataSource(ctx context.Context, state *models.DataSourceAccountModel
|
||||
DeactivationTime: types.Float64Value(recordAccount.DeactivationTime),
|
||||
DeletedBy: types.StringValue(recordAccount.DeletedBy),
|
||||
DeletedTime: types.Int64Value(int64(recordAccount.DeletedTime)),
|
||||
Desc: types.StringValue(recordAccount.Description),
|
||||
DisplayName: types.StringValue(recordAccount.DisplayName),
|
||||
GUID: types.Int64Value(int64(recordAccount.GUID)),
|
||||
Machines: flattenMachines(ctx, recordAccount.Machines),
|
||||
|
||||
@@ -52,6 +52,7 @@ func AccountListDataSource(ctx context.Context, state *models.DataSourceAccountL
|
||||
AccountName: types.StringValue(item.Name),
|
||||
Status: types.StringValue(item.Status),
|
||||
UpdatedTime: types.Int64Value(int64(item.UpdatedTime)),
|
||||
Desc: types.StringValue(item.Description),
|
||||
}
|
||||
i.ComputeFeatures, diags = types.ListValueFrom(ctx, types.StringType, item.ComputeFeatures)
|
||||
if diags.HasError() {
|
||||
|
||||
@@ -48,6 +48,7 @@ func AccountListDeletedDataSource(ctx context.Context, state *models.DataSourceA
|
||||
i := models.ItemAccountListDeletedModel{
|
||||
CreatedTime: types.Int64Value(int64(item.CreatedTime)),
|
||||
DeletedTime: types.Int64Value(int64(item.DeletedTime)),
|
||||
Desc: types.StringValue(item.Description),
|
||||
AccountID: types.Int64Value(int64(item.ID)),
|
||||
AccountName: types.StringValue(item.Name),
|
||||
Status: types.StringValue(item.Status),
|
||||
|
||||
@@ -90,6 +90,7 @@ func AccountRGListDataSource(ctx context.Context, state *models.DataSourceAccoun
|
||||
CreatedTime: types.Int64Value(int64(item.CreatedTime)),
|
||||
DeletedBy: types.StringValue(item.DeletedBy),
|
||||
DeletedTime: types.Int64Value(int64(item.DeletedTime)),
|
||||
Desc: types.StringValue(item.Description),
|
||||
RGID: types.Int64Value(int64(item.RGID)),
|
||||
Milestones: types.Int64Value(int64(item.Milestones)),
|
||||
RGName: types.StringValue(item.RGName),
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-framework/types/basetypes"
|
||||
"repository.basistech.ru/BASIS/terraform-provider-dynamix/internal/client"
|
||||
"repository.basistech.ru/BASIS/terraform-provider-dynamix/internal/flattens"
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-framework/diag"
|
||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||
@@ -47,13 +48,13 @@ func AccountResource(ctx context.Context, state *models.ResourceAccountModel, c
|
||||
*state = models.ResourceAccountModel{
|
||||
// request fields
|
||||
AccountName: types.StringValue(recordAccount.Name),
|
||||
Username: state.Username,
|
||||
EmailAddress: state.EmailAddress,
|
||||
SendAccessEmails: state.SendAccessEmails,
|
||||
Users: state.Users,
|
||||
SendAccessEmails: types.BoolValue(recordAccount.SendAccessEmails),
|
||||
Users: flattenUsers(ctx, recordAccount.ACL),
|
||||
Restore: state.Restore,
|
||||
Permanently: state.Permanently,
|
||||
Desc: types.StringValue(recordAccount.Description),
|
||||
Enable: state.Enable,
|
||||
Reason: state.Reason,
|
||||
ResourceLimits: flattenResourceLimitsInAccountResource(ctx, recordAccount.ResourceLimits, state),
|
||||
Timeouts: state.Timeouts,
|
||||
|
||||
@@ -67,6 +68,7 @@ func AccountResource(ctx context.Context, state *models.ResourceAccountModel, c
|
||||
Company: types.StringValue(recordAccount.Company),
|
||||
CompanyURL: types.StringValue(recordAccount.CompanyURL),
|
||||
Computes: flattenComputes(ctx, recordAccount.Computes),
|
||||
ComputeFeatures: flattens.FlattenSimpleTypeToList(ctx, types.StringType, recordAccount.ComputeFeatures),
|
||||
CPUAllocationParameter: types.StringValue(recordAccount.CPUAllocationParameter),
|
||||
CPUAllocationRatio: types.Float64Value(recordAccount.CPUAllocationRatio),
|
||||
CreatedBy: types.StringValue(recordAccount.CreatedBy),
|
||||
@@ -74,23 +76,22 @@ func AccountResource(ctx context.Context, state *models.ResourceAccountModel, c
|
||||
DeactivationTime: types.Float64Value(recordAccount.DeactivationTime),
|
||||
DeletedBy: types.StringValue(recordAccount.DeletedBy),
|
||||
DeletedTime: types.Int64Value(int64(recordAccount.DeletedTime)),
|
||||
DisplayName: types.StringValue(recordAccount.DisplayName),
|
||||
GUID: types.Int64Value(int64(recordAccount.GUID)),
|
||||
Machines: flattenMachines(ctx, recordAccount.Machines),
|
||||
Status: types.StringValue(recordAccount.Status),
|
||||
UpdatedTime: types.Int64Value(int64(recordAccount.UpdatedTime)),
|
||||
Version: types.Int64Value(int64(recordAccount.Version)),
|
||||
VINSes: types.Int64Value(int64(recordAccount.VINSes)),
|
||||
//Description: types.StringValue(recordAccount.Description),
|
||||
DisplayName: types.StringValue(recordAccount.DisplayName),
|
||||
GUID: types.Int64Value(int64(recordAccount.GUID)),
|
||||
Machines: flattenMachines(ctx, recordAccount.Machines),
|
||||
Status: types.StringValue(recordAccount.Status),
|
||||
UpdatedTime: types.Int64Value(int64(recordAccount.UpdatedTime)),
|
||||
Version: types.Int64Value(int64(recordAccount.Version)),
|
||||
VINS: flattens.FlattenSimpleTypeToList(ctx, types.Int64Type, recordAccount.VINS),
|
||||
VINSes: types.Int64Value(int64(recordAccount.VINSes)),
|
||||
}
|
||||
|
||||
state.VINS, diags = types.ListValueFrom(ctx, types.Int64Type, recordAccount.VINS)
|
||||
if diags.HasError() {
|
||||
tflog.Error(ctx, fmt.Sprint("flattens.AccountResource: cannot flatten recordAccount.VINS to state.VINS", diags))
|
||||
}
|
||||
|
||||
state.ComputeFeatures, diags = types.ListValueFrom(ctx, types.StringType, recordAccount.ComputeFeatures)
|
||||
if diags.HasError() {
|
||||
tflog.Error(ctx, fmt.Sprint("flattens.AccountResource: cannot flatten recordAccount.ComputeFeatures to state.ComputeFeatures", diags))
|
||||
if state.Enable == types.BoolNull() {
|
||||
state.Enable = types.BoolValue(false)
|
||||
if recordAccount.Status == "CONFIRMED" {
|
||||
state.Enable = types.BoolValue(true)
|
||||
}
|
||||
}
|
||||
|
||||
tflog.Info(ctx, "flattens.AccountResource: after flatten", map[string]any{"account_id": state.Id.ValueString()})
|
||||
@@ -137,3 +138,30 @@ func flattenResourceLimitsInAccountResource(ctx context.Context, limits account.
|
||||
tflog.Info(ctx, "End flattenResourceLimitsInAccountResource")
|
||||
return res
|
||||
}
|
||||
|
||||
func flattenUsers(ctx context.Context, aclList []account.RecordACL) types.Set {
|
||||
tflog.Info(ctx, "Start flattenUsers")
|
||||
tempSlice := make([]types.Object, 0, len(aclList))
|
||||
for i, item := range aclList {
|
||||
if i == 0 {
|
||||
continue
|
||||
}
|
||||
temp := models.UsersModel{
|
||||
UserID: types.StringValue(item.UgroupID),
|
||||
AccessType: types.StringValue(item.Rights),
|
||||
}
|
||||
obj, diags := types.ObjectValueFrom(ctx, models.ItemUsersResource, temp)
|
||||
if diags != nil {
|
||||
tflog.Error(ctx, fmt.Sprint("Error flattenUsers struct to obj", diags))
|
||||
}
|
||||
tempSlice = append(tempSlice, obj)
|
||||
}
|
||||
|
||||
res, diags := types.SetValueFrom(ctx, types.ObjectType{AttrTypes: models.ItemUsersResource}, tempSlice)
|
||||
if diags != nil {
|
||||
tflog.Error(ctx, fmt.Sprint("Error flattenUsers", diags))
|
||||
}
|
||||
|
||||
tflog.Info(ctx, "End flattenUsers")
|
||||
return res
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ type DataSourceAccountModel struct {
|
||||
DeactivationTime types.Float64 `tfsdk:"deactivation_time"`
|
||||
DeletedBy types.String `tfsdk:"deleted_by"`
|
||||
DeletedTime types.Int64 `tfsdk:"deleted_time"`
|
||||
Desc types.String `tfsdk:"desc"`
|
||||
DisplayName types.String `tfsdk:"displayname"`
|
||||
GUID types.Int64 `tfsdk:"guid"`
|
||||
Machines types.Object `tfsdk:"machines"`
|
||||
|
||||
@@ -31,6 +31,7 @@ type ItemAccountListModel struct {
|
||||
Status types.String `tfsdk:"status"`
|
||||
UpdatedTime types.Int64 `tfsdk:"updated_time"`
|
||||
ComputeFeatures types.List `tfsdk:"compute_features"`
|
||||
Desc types.String `tfsdk:"desc"`
|
||||
}
|
||||
|
||||
type RecordACLModel struct {
|
||||
|
||||
@@ -25,6 +25,7 @@ type ItemAccountListDeletedModel struct {
|
||||
ACL []RecordACLModel `tfsdk:"acl"`
|
||||
CreatedTime types.Int64 `tfsdk:"created_time"`
|
||||
DeletedTime types.Int64 `tfsdk:"deleted_time"`
|
||||
Desc types.String `tfsdk:"desc"`
|
||||
AccountID types.Int64 `tfsdk:"account_id"`
|
||||
AccountName types.String `tfsdk:"account_name"`
|
||||
Status types.String `tfsdk:"status"`
|
||||
|
||||
@@ -31,6 +31,7 @@ type ItemAccountRGModel struct {
|
||||
CreatedTime types.Int64 `tfsdk:"created_time"`
|
||||
DeletedBy types.String `tfsdk:"deleted_by"`
|
||||
DeletedTime types.Int64 `tfsdk:"deleted_time"`
|
||||
Desc types.String `tfsdk:"desc"`
|
||||
RGID types.Int64 `tfsdk:"rg_id"`
|
||||
Milestones types.Int64 `tfsdk:"milestones"`
|
||||
RGName types.String `tfsdk:"rg_name"`
|
||||
|
||||
@@ -9,17 +9,16 @@ import (
|
||||
type ResourceAccountModel struct {
|
||||
// request fields - required
|
||||
AccountName types.String `tfsdk:"account_name"`
|
||||
Username types.String `tfsdk:"username"`
|
||||
|
||||
// request fields - optional
|
||||
EmailAddress types.String `tfsdk:"emailaddress"`
|
||||
SendAccessEmails types.Bool `tfsdk:"send_access_emails"`
|
||||
Users types.List `tfsdk:"users"`
|
||||
Users types.Set `tfsdk:"users"`
|
||||
Restore types.Bool `tfsdk:"restore"`
|
||||
Permanently types.Bool `tfsdk:"permanently"`
|
||||
Enable types.Bool `tfsdk:"enable"`
|
||||
ResourceLimits types.Object `tfsdk:"resource_limits"`
|
||||
Timeouts timeouts.Value `tfsdk:"timeouts"`
|
||||
Desc types.String `tfsdk:"desc"`
|
||||
|
||||
// response fields
|
||||
Id types.String `tfsdk:"id"`
|
||||
@@ -42,6 +41,7 @@ type ResourceAccountModel struct {
|
||||
DisplayName types.String `tfsdk:"displayname"`
|
||||
GUID types.Int64 `tfsdk:"guid"`
|
||||
Machines types.Object `tfsdk:"machines"`
|
||||
Reason types.String `tfsdk:"reason"`
|
||||
Status types.String `tfsdk:"status"`
|
||||
UpdatedTime types.Int64 `tfsdk:"updated_time"`
|
||||
Version types.Int64 `tfsdk:"version"`
|
||||
@@ -54,6 +54,11 @@ type UsersModel struct {
|
||||
AccessType types.String `tfsdk:"access_type"`
|
||||
}
|
||||
|
||||
var ItemUsersResource = map[string]attr.Type{
|
||||
"user_id": types.StringType,
|
||||
"access_type": types.StringType,
|
||||
}
|
||||
|
||||
type ResourceLimitsInAccountResourceModel struct {
|
||||
CUC types.Float64 `tfsdk:"cu_c"`
|
||||
CUD types.Float64 `tfsdk:"cu_d"`
|
||||
|
||||
@@ -137,7 +137,7 @@ func (r *resourceAccount) Update(ctx context.Context, req resource.UpdateRequest
|
||||
|
||||
// enable/disable account
|
||||
if !plan.Enable.Equal(state.Enable) && !plan.Enable.IsNull() {
|
||||
resp.Diagnostics.Append(utilities.EnableDisableAccount(ctx, uint64(accountId), plan.Enable.ValueBool(), r.client)...)
|
||||
resp.Diagnostics.Append(utilities.EnableDisableAccount(ctx, uint64(accountId), &plan, r.client)...)
|
||||
if resp.Diagnostics.HasError() {
|
||||
tflog.Error(ctx, "Update resourceAccount: Error enabling/disabling account")
|
||||
return
|
||||
@@ -204,9 +204,6 @@ func (r *resourceAccount) Delete(ctx context.Context, req resource.DeleteRequest
|
||||
defer cancel()
|
||||
|
||||
permanently := state.Permanently.ValueBool()
|
||||
if state.Permanently.IsNull() {
|
||||
permanently = true
|
||||
} // default true
|
||||
|
||||
// Delete existing resource group
|
||||
delReq := account.DeleteRequest{
|
||||
|
||||
@@ -73,6 +73,9 @@ func MakeSchemaDataSourceAccount() map[string]schema.Attribute {
|
||||
"deleted_by": schema.StringAttribute{
|
||||
Computed: true,
|
||||
},
|
||||
"desc": schema.StringAttribute{
|
||||
Computed: true,
|
||||
},
|
||||
"deleted_time": schema.Int64Attribute{
|
||||
Computed: true,
|
||||
},
|
||||
|
||||
@@ -83,6 +83,9 @@ func MakeSchemaDataSourceAccountList() map[string]schema.Attribute {
|
||||
"account_id": schema.Int64Attribute{
|
||||
Computed: true,
|
||||
},
|
||||
"desc": schema.StringAttribute{
|
||||
Computed: true,
|
||||
},
|
||||
"account_name": schema.StringAttribute{
|
||||
Computed: true,
|
||||
},
|
||||
|
||||
@@ -72,6 +72,9 @@ func MakeSchemaDataSourceAccountListDeleted() map[string]schema.Attribute {
|
||||
"deleted_time": schema.Int64Attribute{
|
||||
Computed: true,
|
||||
},
|
||||
"desc": schema.StringAttribute{
|
||||
Computed: true,
|
||||
},
|
||||
"account_id": schema.Int64Attribute{
|
||||
Computed: true,
|
||||
},
|
||||
|
||||
@@ -201,6 +201,9 @@ func MakeSchemaDataSourceAccountRGList() map[string]schema.Attribute {
|
||||
"deleted_time": schema.Int64Attribute{
|
||||
Computed: true,
|
||||
},
|
||||
"desc": schema.StringAttribute{
|
||||
Computed: true,
|
||||
},
|
||||
"rg_id": schema.Int64Attribute{
|
||||
Computed: true,
|
||||
},
|
||||
|
||||
@@ -2,6 +2,7 @@ package schemas
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
|
||||
"github.com/hashicorp/terraform-plugin-framework/resource/schema/booldefault"
|
||||
"github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier"
|
||||
"github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier"
|
||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||
@@ -14,21 +15,19 @@ func MakeSchemaResourceAccount() map[string]schema.Attribute {
|
||||
Required: true,
|
||||
Description: "name of the account",
|
||||
},
|
||||
"username": schema.StringAttribute{
|
||||
Required: true,
|
||||
Description: "username of owner the account",
|
||||
},
|
||||
|
||||
// optional attributes
|
||||
"emailaddress": schema.StringAttribute{
|
||||
Optional: true,
|
||||
Description: "email",
|
||||
},
|
||||
"send_access_emails": schema.BoolAttribute{
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
Default: booldefault.StaticBool(false),
|
||||
Description: "if true send emails when a user is granted access to resources",
|
||||
},
|
||||
"users": schema.ListNestedAttribute{
|
||||
"desc": schema.StringAttribute{
|
||||
Optional: true,
|
||||
Description: "description of the account",
|
||||
},
|
||||
"users": schema.SetNestedAttribute{
|
||||
Optional: true,
|
||||
NestedObject: schema.NestedAttributeObject{
|
||||
Attributes: map[string]schema.Attribute{
|
||||
@@ -43,16 +42,25 @@ func MakeSchemaResourceAccount() map[string]schema.Attribute {
|
||||
},
|
||||
"restore": schema.BoolAttribute{
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
Description: "restore a deleted account",
|
||||
Default: booldefault.StaticBool(true),
|
||||
},
|
||||
"permanently": schema.BoolAttribute{
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
Description: "whether to completely delete the account",
|
||||
// default is false
|
||||
Default: booldefault.StaticBool(true),
|
||||
},
|
||||
"enable": schema.BoolAttribute{
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
Description: "enable/disable account",
|
||||
Default: booldefault.StaticBool(true),
|
||||
},
|
||||
"reason": schema.StringAttribute{
|
||||
Optional: true,
|
||||
Description: "reason to disable",
|
||||
},
|
||||
"resource_limits": schema.SingleNestedAttribute{
|
||||
Optional: true,
|
||||
|
||||
@@ -120,10 +120,11 @@ func RestoreAccount(ctx context.Context, accountId uint64, c *client.Client) dia
|
||||
|
||||
// EnableDisableAccount performs account Enable/Disable request.
|
||||
// Returns error in case of failures.
|
||||
func EnableDisableAccount(ctx context.Context, accountId uint64, enable bool, c *client.Client) diag.Diagnostics {
|
||||
func EnableDisableAccount(ctx context.Context, accountId uint64, plan *models.ResourceAccountModel, c *client.Client) diag.Diagnostics {
|
||||
tflog.Info(ctx, "Start EnableDisableAccount", map[string]any{"account_id": accountId})
|
||||
|
||||
diags := diag.Diagnostics{}
|
||||
enable := plan.Enable.ValueBool()
|
||||
|
||||
if enable {
|
||||
tflog.Info(ctx, "EnableDisableAccount: before calling CloudAPI().Account().Enable", map[string]any{"account_id": accountId})
|
||||
@@ -141,7 +142,8 @@ func EnableDisableAccount(ctx context.Context, accountId uint64, enable bool, c
|
||||
}
|
||||
|
||||
tflog.Info(ctx, "EnableDisableAccount: before calling CloudAPI().Account().Disable", map[string]any{"account_id": accountId})
|
||||
res, err := c.CloudAPI().Account().Disable(ctx, account.DisableEnableRequest{AccountID: accountId})
|
||||
reason := plan.Reason.ValueString()
|
||||
res, err := c.CloudAPI().Account().Disable(ctx, account.DisableEnableRequest{AccountID: accountId, Reason: reason})
|
||||
if err != nil {
|
||||
diags.AddError(
|
||||
"EnableDisableAccount: cannot disable account",
|
||||
@@ -172,6 +174,12 @@ func UpdateAccount(ctx context.Context, accountId uint64, plan, state *models.Re
|
||||
updateNeeded = true
|
||||
}
|
||||
|
||||
// check if description was changed
|
||||
if !plan.Desc.Equal(state.Desc) {
|
||||
updateReq.Description = plan.Desc.ValueString()
|
||||
updateNeeded = true
|
||||
}
|
||||
|
||||
// check if resource_limits were changed
|
||||
if !plan.ResourceLimits.Equal(state.ResourceLimits) && !plan.ResourceLimits.IsUnknown() {
|
||||
tflog.Info(ctx, "UpdateAccount: new ResourceLimits specified", map[string]any{"account_id": accountId})
|
||||
|
||||
Reference in New Issue
Block a user