feat: configurable timeouts for sless_function and sless_job

- sless_function: build_timeout_sec (optional, default 300s = 5 min)
- sless_job: wait_timeout_sec (optional, default 600s = 10 min)
- provider v0.1.3 published to terra.k8c.ru
This commit is contained in:
“Naeel”
2026-03-07 17:49:07 +04:00
parent f405596d42
commit a6bc67de05
2 changed files with 68 additions and 26 deletions
@@ -28,8 +28,9 @@ import (
"github.com/hashicorp/terraform-plugin-framework/types"
)
// jobTimeout — максимальное время ожидания завершения джоба.
const jobTimeout = 10 * time.Minute
// defaultWaitTimeoutSec — дефолтный таймаут ожидания завершения джоба (600 сек = 10 мин).
// Пользователь может переопределить через wait_timeout_sec.
const defaultWaitTimeoutSec = 600
var _ resource.Resource = &JobResource{}
@@ -43,10 +44,12 @@ func NewJobResource() resource.Resource {
// JobModel — модель состояния terraform для sless_job.
type JobModel struct {
Namespace types.String `tfsdk:"namespace"`
Name types.String `tfsdk:"name"`
Function types.String `tfsdk:"function"`
EventJSON types.String `tfsdk:"event_json"`
Namespace types.String `tfsdk:"namespace"`
Name types.String `tfsdk:"name"`
Function types.String `tfsdk:"function"`
EventJSON types.String `tfsdk:"event_json"`
// wait_timeout_sec — максимальное ожидание завершения джоба. Дефолт 600 сек.
WaitTimeoutSec types.Int64 `tfsdk:"wait_timeout_sec"`
Phase types.String `tfsdk:"phase"`
StartTime types.String `tfsdk:"start_time"`
CompletionTime types.String `tfsdk:"completion_time"`
@@ -88,6 +91,12 @@ func (r *JobResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *
stringplanmodifier.RequiresReplace(),
},
},
// wait_timeout_sec — сколько ждать завершения джоба. Увеличь если код долго работает (например миграция БД).
"wait_timeout_sec": schema.Int64Attribute{
Optional: true,
Computed: true,
MarkdownDescription: "Таймаут ожидания завершения джоба в секундах. По умолчанию 600 (10 мин).",
},
// Computed — заполняются после завершения джоба
"phase": schema.StringAttribute{
Computed: true,
@@ -148,7 +157,11 @@ func (r *JobResource) Create(ctx context.Context, req resource.CreateRequest, re
}
// Блокируем apply до завершения джоба (Succeeded или Failed)
j, err := r.client.WaitJobDone(ctx, ns, plan.Name.ValueString(), jobTimeout)
waitSec := plan.WaitTimeoutSec.ValueInt64()
if waitSec <= 0 {
waitSec = defaultWaitTimeoutSec
}
j, err := r.client.WaitJobDone(ctx, ns, plan.Name.ValueString(), time.Duration(waitSec)*time.Second)
if err != nil {
resp.Diagnostics.AddError("waiting for job to complete", err.Error())
return
@@ -198,11 +211,16 @@ func (r *JobResource) Delete(ctx context.Context, req resource.DeleteRequest, re
// jobToModel конвертирует API-ответ → state модель.
func jobToModel(plan JobModel, j *client.JobResponse) JobModel {
waitTimeoutSec := plan.WaitTimeoutSec
if waitTimeoutSec.IsNull() || waitTimeoutSec.IsUnknown() || waitTimeoutSec.ValueInt64() <= 0 {
waitTimeoutSec = types.Int64Value(defaultWaitTimeoutSec)
}
return JobModel{
Namespace: types.StringValue(j.Namespace),
Name: types.StringValue(j.Name),
Function: types.StringValue(j.FunctionRef),
EventJSON: plan.EventJSON, // API отдаёт event_json но берём из plan для консистентности
EventJSON: plan.EventJSON,
WaitTimeoutSec: waitTimeoutSec,
Phase: types.StringValue(j.Phase),
StartTime: types.StringValue(j.StartTime),
CompletionTime: types.StringValue(j.CompletionTime),