From 3a8857474b4027e0be7733c2e571804df177449b Mon Sep 17 00:00:00 2001 From: Aditya Choudhari Date: Mon, 2 Mar 2026 21:10:55 -0800 Subject: [PATCH] refactor: add uuid field to release (noop) --- apps/workspace-engine/oapi/openapi.json | 5 + .../oapi/spec/schemas/entities.jsonnet | 3 +- apps/workspace-engine/pkg/oapi/oapi.gen.go | 1 + apps/workspace-engine/pkg/oapi/oapi.go | 4 +- apps/workspace-engine/pkg/oapi/persistence.go | 2 +- .../pkg/persistence/integration_test.go | 2 +- .../pkg/workspace/jobs/factory.go | 6 +- .../pkg/workspace/jobs/factory_test.go | 2 +- .../releasemanager/action/orchestrator.go | 4 +- .../action/orchestrator_test.go | 16 +- .../releasemanager/action/rollback/hooks.go | 6 +- .../action/rollback/rollback.go | 6 +- .../action/verification/verification.go | 6 +- .../action/verification/verification_test.go | 36 +- .../releasemanager/deployment/executor.go | 10 +- .../deployment/executor_test.go | 18 +- .../deployment/job_eligibility.go | 2 +- .../deployment/job_eligibility_retry_test.go | 12 +- .../deployment/job_eligibility_test.go | 26 +- .../releasemanager/deployment/planner.go | 2 +- .../releasemanager/deployment/planner_test.go | 4 +- .../pkg/workspace/releasemanager/manager.go | 2 +- .../workspace/releasemanager/manager_test.go | 12 +- .../deployment_dependency_policy_action.go | 2 +- .../deployment_dependency_test.go | 2 +- .../deploymentwindow/deploymentwindow_test.go | 2 +- .../environment_progression_action.go | 2 +- .../environmentprogression_test.go | 24 +- .../environmentprogression/jobtracker_test.go | 50 +- .../environmentprogression/passrate_test.go | 16 +- .../environmentprogression/soaktime_test.go | 20 +- .../gradualrollout/gradualrollout_test.go | 16 +- .../releasetargetconcurrency_test.go | 22 +- .../policy/evaluator/retry/retry.go | 10 +- .../policy/evaluator/retry/retry_test.go | 76 +- .../evaluator/retry/smart_defaults_test.go | 32 +- .../evaluator/rollback/rollback_test.go | 2 +- .../versioncooldown/version_summary_test.go | 2 +- .../versioncooldown/versioncooldown_test.go | 4 +- .../releasemanager/state_index_test.go | 6 +- .../verification/executor_test.go | 12 +- .../verification/manager_test.go | 52 +- .../verification/recorder_test.go | 18 +- .../verification/scheduler_test.go | 26 +- .../pkg/workspace/store/jobs.go | 2 +- .../workspace/store/release_targets_test.go | 24 +- .../pkg/workspace/store/releases.go | 5 + .../store/repository/db/releases/mapper.go | 3 +- .../store/repository/db/releases/repo.go | 4 +- .../memory/indexstore/schema_release.go | 2 +- .../desiredrelease/policyeval/adapters.go | 2 +- .../controllers/desiredrelease/reconcile.go | 2 +- .../svc/controllers/jobdispatch/reconcile.go | 4 +- .../test/controllers/pipeline_test.go | 2 +- .../e2e/engine_job_verification_query_test.go | 2 +- .../e2e/engine_nil_release_handling_test.go | 6 +- .../test/e2e/engine_releasemanager_test.go | 2 +- .../e2e/engine_releasetarget_state_test.go | 18 +- .../e2e/engine_verification_hooks_test.go | 4 +- packages/workspace-engine-sdk/src/schema.ts | 10291 ++++++++-------- 60 files changed, 5525 insertions(+), 5431 deletions(-) diff --git a/apps/workspace-engine/oapi/openapi.json b/apps/workspace-engine/oapi/openapi.json index 57541e60d..22b836ae7 100644 --- a/apps/workspace-engine/oapi/openapi.json +++ b/apps/workspace-engine/oapi/openapi.json @@ -1627,6 +1627,10 @@ }, "type": "array" }, + "id": { + "format": "uuid", + "type": "string" + }, "releaseTarget": { "$ref": "#/components/schemas/ReleaseTarget" }, @@ -1641,6 +1645,7 @@ } }, "required": [ + "id", "version", "variables", "encryptedVariables", diff --git a/apps/workspace-engine/oapi/spec/schemas/entities.jsonnet b/apps/workspace-engine/oapi/spec/schemas/entities.jsonnet index d145ca0bd..609dcadb0 100644 --- a/apps/workspace-engine/oapi/spec/schemas/entities.jsonnet +++ b/apps/workspace-engine/oapi/spec/schemas/entities.jsonnet @@ -141,8 +141,9 @@ local openapi = import '../lib/openapi.libsonnet'; Release: { type: 'object', - required: ['version', 'variables', 'encryptedVariables', 'releaseTarget', 'createdAt'], + required: ['id', 'version', 'variables', 'encryptedVariables', 'releaseTarget', 'createdAt'], properties: { + id: { type: 'string', format: 'uuid' }, version: openapi.schemaRef('DeploymentVersion'), variables: { type: 'object', diff --git a/apps/workspace-engine/pkg/oapi/oapi.gen.go b/apps/workspace-engine/pkg/oapi/oapi.gen.go index 52bb3f35d..6c931f2e0 100644 --- a/apps/workspace-engine/pkg/oapi/oapi.gen.go +++ b/apps/workspace-engine/pkg/oapi/oapi.gen.go @@ -849,6 +849,7 @@ type RelationshipRule_Matcher struct { type Release struct { CreatedAt string `json:"createdAt"` EncryptedVariables []string `json:"encryptedVariables"` + Id openapi_types.UUID `json:"id"` ReleaseTarget ReleaseTarget `json:"releaseTarget"` Variables map[string]LiteralValue `json:"variables"` Version DeploymentVersion `json:"version"` diff --git a/apps/workspace-engine/pkg/oapi/oapi.go b/apps/workspace-engine/pkg/oapi/oapi.go index 989904be8..b907f0004 100644 --- a/apps/workspace-engine/pkg/oapi/oapi.go +++ b/apps/workspace-engine/pkg/oapi/oapi.go @@ -16,7 +16,7 @@ import ( "github.com/google/uuid" ) -func (r *Release) ID() string { +func (r *Release) ContentHash() string { // Collect relevant fields for deterministic ID var sb strings.Builder sb.WriteString(r.Version.Id) @@ -44,7 +44,7 @@ func (r *Release) ID() string { } func (r *Release) UUID() uuid.UUID { - return uuid.NewSHA1(uuid.NameSpaceOID, []byte(r.ID())) + return uuid.NewSHA1(uuid.NameSpaceOID, []byte(r.ContentHash())) } func toString(v any) string { diff --git a/apps/workspace-engine/pkg/oapi/persistence.go b/apps/workspace-engine/pkg/oapi/persistence.go index 8cb1906cc..f967d5c7d 100644 --- a/apps/workspace-engine/pkg/oapi/persistence.go +++ b/apps/workspace-engine/pkg/oapi/persistence.go @@ -42,7 +42,7 @@ func (s *System) CompactionKey() (string, string) { } func (r *Release) CompactionKey() (string, string) { - return "release", r.ID() + return "release", r.ContentHash() } func (j *Job) CompactionKey() (string, string) { diff --git a/apps/workspace-engine/pkg/persistence/integration_test.go b/apps/workspace-engine/pkg/persistence/integration_test.go index 115c68fa6..a17ef9e3a 100644 --- a/apps/workspace-engine/pkg/persistence/integration_test.go +++ b/apps/workspace-engine/pkg/persistence/integration_test.go @@ -664,7 +664,7 @@ func TestPersistence_ComplexWorkspaceWithComputedValues(t *testing.T) { require.True(t, ok, "JobAgent should be restored") assert.Equal(t, "k8s-agent", restoredJobAgent.Name) - restoredRelease, ok := newStore.Repo().Releases().Get(release.ID()) + restoredRelease, ok := newStore.Repo().Releases().Get(release.ContentHash()) require.True(t, ok, "Release should be restored") assert.Equal(t, "v1.2.3", restoredRelease.Version.Tag) diff --git a/apps/workspace-engine/pkg/workspace/jobs/factory.go b/apps/workspace-engine/pkg/workspace/jobs/factory.go index cb00ebb70..683a2f58b 100644 --- a/apps/workspace-engine/pkg/workspace/jobs/factory.go +++ b/apps/workspace-engine/pkg/workspace/jobs/factory.go @@ -169,11 +169,11 @@ func (f *Factory) CreateJobForRelease(ctx context.Context, release *oapi.Release if action != nil { action.AddStep("Create job", trace.StepResultPass, - fmt.Sprintf("Job created successfully with ID %s for release %s", jobId, release.ID())). + fmt.Sprintf("Job created successfully with ID %s for release %s", jobId, release.ContentHash())). AddMetadata("job_id", jobId). AddMetadata("job_status", string(oapi.JobStatusPending)). AddMetadata("job_agent_id", jobAgent.Id). - AddMetadata("release_id", release.ID()). + AddMetadata("release_id", release.ContentHash()). AddMetadata("version_tag", release.Version.Tag) } @@ -184,7 +184,7 @@ func (f *Factory) CreateJobForRelease(ctx context.Context, release *oapi.Release return &oapi.Job{ Id: jobId, - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), JobAgentId: jobAgent.Id, JobAgentConfig: jobAgent.Config, Status: oapi.JobStatusPending, diff --git a/apps/workspace-engine/pkg/workspace/jobs/factory_test.go b/apps/workspace-engine/pkg/workspace/jobs/factory_test.go index 1f3bd4630..97a0ef815 100644 --- a/apps/workspace-engine/pkg/workspace/jobs/factory_test.go +++ b/apps/workspace-engine/pkg/workspace/jobs/factory_test.go @@ -174,7 +174,7 @@ func TestFactory_CreateJobForRelease_SetsCorrectJobFields(t *testing.T) { require.NoError(t, err) // Verify release ID is correct - require.Equal(t, release.ID(), job.ReleaseId) + require.Equal(t, release.ContentHash(), job.ReleaseId) // Verify job agent ID is correct require.Equal(t, jobAgentId, job.JobAgentId) diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/action/orchestrator.go b/apps/workspace-engine/pkg/workspace/releasemanager/action/orchestrator.go index afa250b74..04adcd8c2 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/action/orchestrator.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/action/orchestrator.go @@ -67,7 +67,7 @@ func (o *Orchestrator) OnJobStatusChange( return nil // No release found } - span.SetAttributes(attribute.String("release.id", release.ID())) + span.SetAttributes(attribute.String("release.id", release.ContentHash())) policies, err := o.store.ReleaseTargets.GetPolicies(ctx, &release.ReleaseTarget) if err != nil { @@ -97,7 +97,7 @@ func (o *Orchestrator) OnJobStatusChange( log.Error("Policy action failed", "action", action.Name(), "job_id", job.Id, - "release_id", release.ID(), + "release_id", release.ContentHash(), "error", err) // Continue with other actions } diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/action/orchestrator_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/action/orchestrator_test.go index 4665a59c7..2a25f2af8 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/action/orchestrator_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/action/orchestrator_test.go @@ -159,7 +159,7 @@ func TestOrchestrator_OnJobStatusChange_TriggerJobSuccess(t *testing.T) { // Create job job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -172,7 +172,7 @@ func TestOrchestrator_OnJobStatusChange_TriggerJobSuccess(t *testing.T) { assert.True(t, mockAct.executeCalled) assert.Equal(t, action.TriggerJobSuccess, mockAct.lastTrigger) assert.Equal(t, job.Id, mockAct.lastContext.Job.Id) - assert.Equal(t, release.ID(), mockAct.lastContext.Release.ID()) + assert.Equal(t, release.ContentHash(), mockAct.lastContext.Release.ContentHash()) } func TestOrchestrator_OnJobStatusChange_TriggerJobStarted(t *testing.T) { @@ -190,7 +190,7 @@ func TestOrchestrator_OnJobStatusChange_TriggerJobStarted(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusInProgress, CreatedAt: time.Now(), } @@ -217,7 +217,7 @@ func TestOrchestrator_OnJobStatusChange_TriggerJobFailure(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now(), } @@ -244,7 +244,7 @@ func TestOrchestrator_OnJobStatusChange_NoTrigger(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusInProgress, CreatedAt: time.Now(), } @@ -272,7 +272,7 @@ func TestOrchestrator_OnJobStatusChange_ShouldNotExecute(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -301,7 +301,7 @@ func TestOrchestrator_OnJobStatusChange_MultipleActions(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -357,7 +357,7 @@ func TestOrchestrator_OnJobStatusChange_ActionError(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/action/rollback/hooks.go b/apps/workspace-engine/pkg/workspace/releasemanager/action/rollback/hooks.go index 8628fd222..96860bc5b 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/action/rollback/hooks.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/action/rollback/hooks.go @@ -72,7 +72,7 @@ func (h *RollbackHooks) OnVerificationComplete(ctx context.Context, verification } span.SetAttributes( - attribute.String("release.id", release.ID()), + attribute.String("release.id", release.ContentHash()), attribute.String("release_target.key", release.ReleaseTarget.Key()), ) @@ -99,14 +99,14 @@ func (h *RollbackHooks) OnVerificationComplete(ctx context.Context, verification } // Don't rollback to the same release - if currentRelease.ID() == release.ID() { + if currentRelease.ContentHash() == release.ContentHash() { span.AddEvent("Current release is the same as failed release, no rollback needed") span.SetStatus(codes.Ok, "already on current release") return nil } span.SetAttributes( - attribute.String("rollback_to_release.id", currentRelease.ID()), + attribute.String("rollback_to_release.id", currentRelease.ContentHash()), attribute.String("rollback_to_version.id", currentRelease.Version.Id), attribute.String("rollback_to_version.tag", currentRelease.Version.Tag), ) diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/action/rollback/rollback.go b/apps/workspace-engine/pkg/workspace/releasemanager/action/rollback/rollback.go index bcacd996b..460dbf177 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/action/rollback/rollback.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/action/rollback/rollback.go @@ -43,7 +43,7 @@ func (r *RollbackAction) Execute( span.SetAttributes( attribute.String("trigger", string(trigger)), - attribute.String("release.id", actx.Release.ID()), + attribute.String("release.id", actx.Release.ContentHash()), attribute.String("job.id", actx.Job.Id), attribute.String("job.status", string(actx.Job.Status)), ) @@ -63,14 +63,14 @@ func (r *RollbackAction) Execute( return nil } - if currentRelease.ID() == actx.Release.ID() { + if currentRelease.ContentHash() == actx.Release.ContentHash() { span.AddEvent("Current release is the same as failed release, no rollback needed") span.SetStatus(codes.Ok, "already on current release") return nil } span.SetAttributes( - attribute.String("rollback_to_release.id", currentRelease.ID()), + attribute.String("rollback_to_release.id", currentRelease.ContentHash()), attribute.String("rollback_to_version.id", currentRelease.Version.Id), attribute.String("rollback_to_version.tag", currentRelease.Version.Tag), ) diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/action/verification/verification.go b/apps/workspace-engine/pkg/workspace/releasemanager/action/verification/verification.go index fcaa3fcfc..619f69598 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/action/verification/verification.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/action/verification/verification.go @@ -43,7 +43,7 @@ func (v *VerificationAction) Execute( span.SetAttributes( attribute.String("trigger", string(trigger)), - attribute.String("release.id", actx.Release.ID()), + attribute.String("release.id", actx.Release.ContentHash()), attribute.String("job.id", actx.Job.Id)) // Extract all verification metrics from matching policies @@ -62,7 +62,7 @@ func (v *VerificationAction) Execute( span.SetStatus(codes.Error, "failed to create verification") log.Error("Failed to create verification", "error", err, - "release_id", actx.Release.ID(), + "release_id", actx.Release.ContentHash(), "job_id", actx.Job.Id, "trigger", trigger) return err @@ -70,7 +70,7 @@ func (v *VerificationAction) Execute( span.SetStatus(codes.Ok, "verification created") log.Info("Created verification from policy action", - "release_id", actx.Release.ID(), + "release_id", actx.Release.ContentHash(), "job_id", actx.Job.Id, "trigger", trigger, "metric_count", len(metrics)) diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/action/verification/verification_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/action/verification/verification_test.go index 92e3c368a..db41c45e0 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/action/verification/verification_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/action/verification/verification_test.go @@ -113,7 +113,7 @@ func TestVerificationAction_Execute_NoMetrics(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -181,7 +181,7 @@ func TestVerificationAction_Execute_CreatesVerification(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -233,7 +233,7 @@ func TestVerificationAction_Execute_SkipsDisabledPolicy(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -271,7 +271,7 @@ func TestVerificationAction_Execute_SkipsWrongTrigger(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -308,7 +308,7 @@ func TestVerificationAction_Execute_DefaultsTriggerToJobSuccess(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -346,7 +346,7 @@ func TestVerificationAction_Execute_DeduplicatesMetrics(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -406,7 +406,7 @@ func TestVerificationAction_Execute_TriggerJobCreated(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusPending, CreatedAt: time.Now(), } @@ -447,7 +447,7 @@ func TestVerificationAction_Execute_TriggerJobStarted(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusInProgress, CreatedAt: time.Now(), } @@ -488,7 +488,7 @@ func TestVerificationAction_Execute_TriggerJobFailure(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now(), } @@ -545,7 +545,7 @@ func TestVerificationAction_Execute_PolicyWithMixedRules(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -602,7 +602,7 @@ func TestVerificationAction_Execute_MultipleVerificationRulesInPolicy(t *testing job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -671,7 +671,7 @@ func TestVerificationAction_Execute_NilVerificationRule(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -711,7 +711,7 @@ func TestVerificationAction_Execute_EmptyMetricsArray(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -755,7 +755,7 @@ func TestVerificationAction_Execute_NilPoliciesSlice(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -785,7 +785,7 @@ func TestVerificationAction_Execute_PolicyWithNoRules(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -820,7 +820,7 @@ func TestVerificationAction_Execute_VerificationIsRunningWithCorrectMetricSpecs( job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -887,7 +887,7 @@ func TestVerificationAction_Execute_VerificationRecordHasCorrectReleaseLink(t *t job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } @@ -933,7 +933,7 @@ func TestVerificationAction_Execute_MultipleMetricsAllRunning(t *testing.T) { job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), } diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/deployment/executor.go b/apps/workspace-engine/pkg/workspace/releasemanager/deployment/executor.go index ff7c598bd..56205cebc 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/deployment/executor.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/deployment/executor.go @@ -11,6 +11,7 @@ import ( "workspace-engine/pkg/workspace/releasemanager/trace" "workspace-engine/pkg/workspace/store" + "github.com/google/uuid" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" oteltrace "go.opentelemetry.io/otel/trace" @@ -90,7 +91,7 @@ func (e *Executor) dispatchJobForAgent(ctx context.Context, release *oapi.Releas func (e *Executor) ExecuteRelease(ctx context.Context, releaseToDeploy *oapi.Release, recorder *trace.ReconcileTarget) ([]*oapi.Job, error) { ctx, span := tracer.Start(ctx, "ExecuteRelease", oteltrace.WithAttributes( - attribute.String("release.id", releaseToDeploy.ID()), + attribute.String("release.id", releaseToDeploy.ContentHash()), attribute.String("deployment.id", releaseToDeploy.ReleaseTarget.DeploymentId), attribute.String("environment.id", releaseToDeploy.ReleaseTarget.EnvironmentId), attribute.String("resource.id", releaseToDeploy.ReleaseTarget.ResourceId), @@ -120,7 +121,7 @@ func (e *Executor) ExecuteRelease(ctx context.Context, releaseToDeploy *oapi.Rel if err != nil { span.RecordError(err) span.SetStatus(codes.Error, "failed to get deployment agents") - failedJob := e.jobFactory.InvalidDeploymentAgentsJob(releaseToDeploy.ID(), deployment.Name, nil) + failedJob := e.jobFactory.InvalidDeploymentAgentsJob(releaseToDeploy.ContentHash(), deployment.Name, nil) e.store.Jobs.Upsert(ctx, failedJob) return []*oapi.Job{failedJob}, nil } @@ -137,7 +138,7 @@ func (e *Executor) ExecuteRelease(ctx context.Context, releaseToDeploy *oapi.Rel } if len(agents) == 0 { - failedJob := e.jobFactory.NoAgentConfiguredJob(releaseToDeploy.ID(), "", deployment.Name, nil) + failedJob := e.jobFactory.NoAgentConfiguredJob(releaseToDeploy.ContentHash(), "", deployment.Name, nil) e.store.Jobs.Upsert(ctx, failedJob) return []*oapi.Job{failedJob}, nil } @@ -183,10 +184,11 @@ func BuildRelease( } return &oapi.Release{ + Id: uuid.New(), ReleaseTarget: *releaseTarget, Version: *version, Variables: clonedVariables, - EncryptedVariables: []string{}, // TODO: Handle encrypted variables + EncryptedVariables: []string{}, CreatedAt: time.Now().Format(time.RFC3339), } } diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/deployment/executor_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/deployment/executor_test.go index 96eeb28e2..5227e548a 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/deployment/executor_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/deployment/executor_test.go @@ -132,14 +132,14 @@ func TestExecuteRelease_Success(t *testing.T) { require.NoError(t, err) require.Len(t, jobs, 1) job := jobs[0] - assert.Equal(t, release.ID(), job.ReleaseId) + assert.Equal(t, release.ContentHash(), job.ReleaseId) assert.Equal(t, oapi.JobStatusPending, job.Status) assert.Equal(t, jobAgentID, job.JobAgentId) // Verify release was persisted - storedRelease, exists := testStore.Releases.Get(release.ID()) + storedRelease, exists := testStore.Releases.Get(release.ContentHash()) require.True(t, exists) - assert.Equal(t, release.ID(), storedRelease.ID()) + assert.Equal(t, release.ContentHash(), storedRelease.ContentHash()) // Verify job was persisted storedJob, exists := testStore.Jobs.Get(job.Id) @@ -249,7 +249,7 @@ func TestExecuteRelease_NoJobAgentConfigured(t *testing.T) { require.Equal(t, oapi.JobStatusInvalidJobAgent, jobs[0].Status) // Verify release was still persisted - _, exists := testStore.Releases.Get(release.ID()) + _, exists := testStore.Releases.Get(release.ContentHash()) require.True(t, exists) } @@ -356,7 +356,7 @@ func TestExecuteRelease_MultipleReleases(t *testing.T) { for i, job := range allJobs { // Verify each job has correct release ID - assert.Equal(t, releases[i].ID(), job.ReleaseId) + assert.Equal(t, releases[i].ContentHash(), job.ReleaseId) // Verify job was persisted storedJob, exists := testStore.Jobs.Get(job.Id) @@ -364,9 +364,9 @@ func TestExecuteRelease_MultipleReleases(t *testing.T) { assert.Equal(t, job.Id, storedJob.Id) // Verify release was persisted - storedRelease, exists := testStore.Releases.Get(releases[i].ID()) + storedRelease, exists := testStore.Releases.Get(releases[i].ContentHash()) require.True(t, exists) - assert.Equal(t, releases[i].ID(), storedRelease.ID()) + assert.Equal(t, releases[i].ContentHash(), storedRelease.ContentHash()) } } @@ -604,7 +604,7 @@ func TestBuildRelease_ReleaseIDDetermination(t *testing.T) { release2 := BuildRelease(ctx, releaseTarget, version, variables1) // Same inputs should produce same release ID - assert.Equal(t, release1.ID(), release2.ID()) + assert.Equal(t, release1.ContentHash(), release2.ContentHash()) // Different variables should produce different release ID replicas2 := oapi.LiteralValue{} @@ -615,5 +615,5 @@ func TestBuildRelease_ReleaseIDDetermination(t *testing.T) { } release3 := BuildRelease(ctx, releaseTarget, version, variables2) - assert.NotEqual(t, release1.ID(), release3.ID()) + assert.NotEqual(t, release1.ContentHash(), release3.ContentHash()) } diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/deployment/job_eligibility.go b/apps/workspace-engine/pkg/workspace/releasemanager/deployment/job_eligibility.go index 61e1f3a4b..4a45bbc4a 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/deployment/job_eligibility.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/deployment/job_eligibility.go @@ -60,7 +60,7 @@ func (c *JobEligibilityChecker) ShouldCreateJob( ) (*EligibilityResult, error) { ctx, span := jobEligibilityTracer.Start(ctx, "ShouldCreateJob", oteltrace.WithAttributes( - attribute.String("release.id", release.ID()), + attribute.String("release.id", release.ContentHash()), attribute.String("release.version.id", release.Version.Id), attribute.String("release.version.tag", release.Version.Tag), attribute.String("release.target.key", release.ReleaseTarget.Key()), diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/deployment/job_eligibility_retry_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/deployment/job_eligibility_retry_test.go index 1eca2a3df..65ba5d7ab 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/deployment/job_eligibility_retry_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/deployment/job_eligibility_retry_test.go @@ -82,7 +82,7 @@ func TestRetryPolicy_MultipleRules_FirstNoRetry_SecondHasRetry(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-1 * time.Hour), CompletedAt: &completedAt, @@ -99,7 +99,7 @@ func TestRetryPolicy_MultipleRules_FirstNoRetry_SecondHasRetry(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-" + string(rune(i)), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now(), CompletedAt: &completedAt, @@ -196,7 +196,7 @@ func TestRetryPolicy_MultiplePolicies_MostRestrictiveWins(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-1 * time.Hour), CompletedAt: &completedAt, @@ -211,7 +211,7 @@ func TestRetryPolicy_MultiplePolicies_MostRestrictiveWins(t *testing.T) { completedAt2 := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-2", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now(), CompletedAt: &completedAt2, @@ -294,7 +294,7 @@ func TestRetryPolicy_AllRulesNoRetry_UsesDefault(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-1 * time.Hour), CompletedAt: &completedAt, @@ -366,7 +366,7 @@ func TestRetryPolicy_DisabledPolicy_NotApplied(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-1 * time.Hour), CompletedAt: &completedAt, diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/deployment/job_eligibility_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/deployment/job_eligibility_test.go index 185d3ea2b..37ecf2545 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/deployment/job_eligibility_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/deployment/job_eligibility_test.go @@ -85,7 +85,7 @@ func TestShouldCreateJob_AlreadyDeployed(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-1 * time.Hour), CompletedAt: &completedAt, @@ -115,7 +115,7 @@ func TestShouldCreateJob_NewVersionAfterSuccessfulDeployment(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-v1", - ReleaseId: releaseV1.ID(), + ReleaseId: releaseV1.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-1 * time.Hour), CompletedAt: &completedAt, @@ -150,7 +150,7 @@ func TestShouldCreateJob_JobInProgress(t *testing.T) { st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusInProgress, CreatedAt: time.Now(), }) @@ -179,7 +179,7 @@ func TestShouldCreateJob_PendingJob(t *testing.T) { st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusPending, CreatedAt: time.Now(), }) @@ -209,7 +209,7 @@ func TestShouldCreateJob_FailedJobPreventsRedeploy(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-1 * time.Hour), CompletedAt: &completedAt, @@ -240,7 +240,7 @@ func TestShouldCreateJob_CancelledJobPreventsRedeploy(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusCancelled, CreatedAt: time.Now().Add(-1 * time.Hour), CompletedAt: &completedAt, @@ -288,7 +288,7 @@ func TestShouldCreateJob_DifferentVariablesAllowsNewJob(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-1 * time.Hour), CompletedAt: &completedAt, @@ -340,7 +340,7 @@ func TestShouldCreateJob_ConcurrentJobsForSameTarget(t *testing.T) { st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), Status: oapi.JobStatusInProgress, CreatedAt: time.Now(), }) @@ -390,7 +390,7 @@ func TestShouldCreateJob_AllowsConcurrentJobsForDifferentTargets(t *testing.T) { st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), Status: oapi.JobStatusInProgress, CreatedAt: time.Now(), }) @@ -440,7 +440,7 @@ func TestShouldCreateJob_MultipleCompletedJobs(t *testing.T) { completedAt := time.Now().Add(-time.Duration(4-i) * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-time.Duration(4-i) * time.Hour), CompletedAt: &completedAt, @@ -485,7 +485,7 @@ func TestShouldCreateJob_SkippedJobPreventsRedeploy(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSkipped, CreatedAt: time.Now().Add(-1 * time.Hour), CompletedAt: &completedAt, @@ -515,7 +515,7 @@ func TestShouldCreateJob_InvalidJobAgentStatusPreventsRedeploy(t *testing.T) { st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusInvalidJobAgent, CreatedAt: time.Now().Add(-1 * time.Hour), }) @@ -576,7 +576,7 @@ func TestShouldCreateJob_EvaluatorOrdering(t *testing.T) { st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusInProgress, CreatedAt: time.Now(), }) diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/deployment/planner.go b/apps/workspace-engine/pkg/workspace/releasemanager/deployment/planner.go index 3789d3827..4fb6a1f4e 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/deployment/planner.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/deployment/planner.go @@ -176,7 +176,7 @@ func (p *Planner) PlanDeployment(ctx context.Context, releaseTarget *oapi.Releas desiredRelease := BuildRelease(ctx, releaseTarget, deployableVersion, resolvedVariables) span.SetAttributes( attribute.Bool("has_desired_release", true), - attribute.String("release.id", desiredRelease.ID()), + attribute.String("release.id", desiredRelease.ContentHash()), ) span.SetStatus(codes.Ok, "planning completed successfully") diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/deployment/planner_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/deployment/planner_test.go index 8bfdc025d..cb2e9802d 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/deployment/planner_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/deployment/planner_test.go @@ -618,7 +618,7 @@ func TestPlanDeployment_MultipleResourcesSameDeployment(t *testing.T) { assert.Equal(t, versionID, release2.Version.Id) // But releases should have different IDs due to different resources - assert.NotEqual(t, release1.ID(), release2.ID()) + assert.NotEqual(t, release1.ContentHash(), release2.ContentHash()) } func TestPlanDeployment_VariableEvaluationError(t *testing.T) { @@ -744,5 +744,5 @@ func TestPlanDeployment_ConsistentReleaseIDs(t *testing.T) { require.NotNil(t, release2) // Same inputs should produce same release ID - assert.Equal(t, release1.ID(), release2.ID()) + assert.Equal(t, release1.ContentHash(), release2.ContentHash()) } diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/manager.go b/apps/workspace-engine/pkg/workspace/releasemanager/manager.go index 65cf9980c..f39198141 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/manager.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/manager.go @@ -299,7 +299,7 @@ func (m *Manager) reconcileTargetWithRecorder( planning := recorder.StartPlanning() if desiredRelease != nil { planning.MakeDecision( - fmt.Sprintf("Desired release resolved from index: %s", desiredRelease.ID()), + fmt.Sprintf("Desired release resolved from index: %s", desiredRelease.ContentHash()), trace.DecisionApproved, ) } else { diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/manager_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/manager_test.go index 5cff571f7..e50cd3c1b 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/manager_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/manager_test.go @@ -103,7 +103,7 @@ func TestProcessChanges_DeleteOnly(t *testing.T) { _ = testStore.Releases.Upsert(ctx, release) // Create a pending job for this release target - job := createTestJob(release.ID(), oapi.JobStatusPending) + job := createTestJob(release.ContentHash(), oapi.JobStatusPending) testStore.Jobs.Upsert(ctx, job) // Verify job is pending @@ -266,10 +266,10 @@ func TestProcessChanges_OnlyPendingJobsCancelled(t *testing.T) { _ = testStore.Releases.Upsert(ctx, release) // Create jobs in different states - pendingJob := createTestJob(release.ID(), oapi.JobStatusPending) - inProgressJob := createTestJob(release.ID(), oapi.JobStatusInProgress) - successfulJob := createTestJob(release.ID(), oapi.JobStatusSuccessful) - failedJob := createTestJob(release.ID(), oapi.JobStatusFailure) + pendingJob := createTestJob(release.ContentHash(), oapi.JobStatusPending) + inProgressJob := createTestJob(release.ContentHash(), oapi.JobStatusInProgress) + successfulJob := createTestJob(release.ContentHash(), oapi.JobStatusSuccessful) + failedJob := createTestJob(release.ContentHash(), oapi.JobStatusFailure) testStore.Jobs.Upsert(ctx, pendingJob) testStore.Jobs.Upsert(ctx, inProgressJob) @@ -323,7 +323,7 @@ func TestProcessChanges_MixedOperations(t *testing.T) { Variables: map[string]oapi.LiteralValue{}, } _ = testStore.Releases.Upsert(ctx, release2) - job2 := createTestJob(release2.ID(), oapi.JobStatusPending) + job2 := createTestJob(release2.ContentHash(), oapi.JobStatusPending) testStore.Jobs.Upsert(ctx, job2) // Create changeset with mixed operations diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/deploymentdependency/deployment_dependency_policy_action.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/deploymentdependency/deployment_dependency_policy_action.go index 45594d64a..5f4c90d33 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/deploymentdependency/deployment_dependency_policy_action.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/deploymentdependency/deployment_dependency_policy_action.go @@ -37,7 +37,7 @@ func (d *DeploymentDependencyAction) Execute(ctx context.Context, trigger action span.SetAttributes( attribute.String("trigger", string(trigger)), - attribute.String("release.id", context.Release.ID()), + attribute.String("release.id", context.Release.ContentHash()), attribute.String("job.id", context.Job.Id), attribute.String("job.status", string(context.Job.Status)), ) diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/deploymentdependency/deployment_dependency_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/deploymentdependency/deployment_dependency_test.go index 12334994b..a6e7083cd 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/deploymentdependency/deployment_dependency_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/deploymentdependency/deployment_dependency_test.go @@ -91,7 +91,7 @@ func generateReleaseAndJob(ctx context.Context, releaseTarget *oapi.ReleaseTarge job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: jobStatus, CreatedAt: now, CompletedAt: completedAt, diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/deploymentwindow/deploymentwindow_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/deploymentwindow/deploymentwindow_test.go index a6a14633b..a8151beca 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/deploymentwindow/deploymentwindow_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/deploymentwindow/deploymentwindow_test.go @@ -90,7 +90,7 @@ func seedSuccessfulRelease( completedAt := time.Now().Add(-1 * time.Hour) job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CompletedAt: &completedAt, CreatedAt: completedAt, diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/environment_progression_action.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/environment_progression_action.go index 1274e523c..40e6785a0 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/environment_progression_action.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/environment_progression_action.go @@ -44,7 +44,7 @@ func (a *EnvironmentProgressionAction) Execute(ctx context.Context, trigger acti span.SetAttributes( attribute.String("trigger", string(trigger)), - attribute.String("release.id", actx.Release.ID()), + attribute.String("release.id", actx.Release.ContentHash()), attribute.String("job.id", actx.Job.Id), attribute.String("job.status", string(actx.Job.Status)), ) diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/environmentprogression_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/environmentprogression_test.go index 1c6846f9d..5635dd9fd 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/environmentprogression_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/environmentprogression_test.go @@ -195,7 +195,7 @@ func TestEnvironmentProgressionEvaluator_VersionSuccessfulInDependency(t *testin completedAt := time.Now().Add(-10 * time.Minute) job := &oapi.Job{ Id: "job-1", - ReleaseId: stagingRelease.ID(), + ReleaseId: stagingRelease.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-15 * time.Minute), @@ -275,7 +275,7 @@ func TestEnvironmentProgressionEvaluator_SoakTimeNotMet(t *testing.T) { completedAt := time.Now().Add(-2 * time.Minute) job := &oapi.Job{ Id: "job-1", - ReleaseId: stagingRelease.ID(), + ReleaseId: stagingRelease.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-5 * time.Minute), @@ -464,7 +464,7 @@ func TestEnvironmentProgressionEvaluator_SatisfiedAt_PassRateOnly(t *testing.T) completedAt1 := time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 0, 0, 0, time.UTC), @@ -478,7 +478,7 @@ func TestEnvironmentProgressionEvaluator_SatisfiedAt_PassRateOnly(t *testing.T) completedAt2 := time.Date(2024, 1, 1, 10, 10, 0, 0, time.UTC) // This should be the satisfiedAt job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC), @@ -492,7 +492,7 @@ func TestEnvironmentProgressionEvaluator_SatisfiedAt_PassRateOnly(t *testing.T) completedAt3 := time.Date(2024, 1, 1, 10, 15, 0, 0, time.UTC) job3 := &oapi.Job{ Id: "job-3", - ReleaseId: release3.ID(), + ReleaseId: release3.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 10, 0, 0, time.UTC), @@ -577,7 +577,7 @@ func TestEnvironmentProgressionEvaluator_SatisfiedAt_SoakTimeOnly(t *testing.T) completedAt := mostRecentSuccess job := &oapi.Job{ Id: "job-1", - ReleaseId: stagingRelease.ID(), + ReleaseId: stagingRelease.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: mostRecentSuccess.Add(-5 * time.Minute), @@ -683,7 +683,7 @@ func TestEnvironmentProgressionEvaluator_SatisfiedAt_BothPassRateAndSoakTime(t * completedAt1 := passRateSatisfiedAt job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 0, 0, 0, time.UTC), @@ -698,7 +698,7 @@ func TestEnvironmentProgressionEvaluator_SatisfiedAt_BothPassRateAndSoakTime(t * completedAt2 := mostRecentSuccess job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 15, 0, 0, time.UTC), @@ -842,7 +842,7 @@ func TestEnvironmentProgressionEvaluator_SatisfiedAt_PassRateBeforeSoakTime(t *t completedAt1 := mostRecentSuccess job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-35 * time.Minute), @@ -856,7 +856,7 @@ func TestEnvironmentProgressionEvaluator_SatisfiedAt_PassRateBeforeSoakTime(t *t completedAt2 := time.Now().Add(-18 * time.Minute) // Completes before job3 job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-20 * time.Minute), @@ -873,7 +873,7 @@ func TestEnvironmentProgressionEvaluator_SatisfiedAt_PassRateBeforeSoakTime(t *t completedAt3 := passRateSatisfiedAt job3 := &oapi.Job{ Id: "job-3", - ReleaseId: release3.ID(), + ReleaseId: release3.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-22 * time.Minute), @@ -964,7 +964,7 @@ func TestEnvironmentProgressionEvaluator_SatisfiedAt_NotSatisfied(t *testing.T) completedAt := time.Now().Add(-2 * time.Minute) job := &oapi.Job{ Id: "job-1", - ReleaseId: stagingRelease.ID(), + ReleaseId: stagingRelease.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-5 * time.Minute), diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/jobtracker_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/jobtracker_test.go index ec416c32b..efaea24cd 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/jobtracker_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/jobtracker_test.go @@ -184,7 +184,7 @@ func TestReleaseTargetJobTracker_GetSuccessPercentage_WithSuccesses(t *testing.T completedAt := time.Now().Add(-5 * time.Minute) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-10 * time.Minute), @@ -197,7 +197,7 @@ func TestReleaseTargetJobTracker_GetSuccessPercentage_WithSuccesses(t *testing.T // Create pending job for release2 job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusPending, CreatedAt: time.Now().Add(-3 * time.Minute), @@ -258,7 +258,7 @@ func TestReleaseTargetJobTracker_GetSuccessPercentage_AllSuccessful(t *testing.T completedAt1 := time.Now().Add(-5 * time.Minute) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-10 * time.Minute), @@ -269,7 +269,7 @@ func TestReleaseTargetJobTracker_GetSuccessPercentage_AllSuccessful(t *testing.T completedAt2 := time.Now().Add(-3 * time.Minute) job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-8 * time.Minute), @@ -339,7 +339,7 @@ func TestReleaseTargetJobTracker_MeetsSoakTimeRequirement_SoakTimeMet(t *testing completedAt := time.Now().Add(-15 * time.Minute) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-20 * time.Minute), @@ -401,7 +401,7 @@ func TestReleaseTargetJobTracker_MeetsSoakTimeRequirement_MultipleJobs(t *testin completedAt1 := time.Now().Add(-20 * time.Minute) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-25 * time.Minute), @@ -414,7 +414,7 @@ func TestReleaseTargetJobTracker_MeetsSoakTimeRequirement_MultipleJobs(t *testin completedAt2 := time.Now().Add(-5 * time.Minute) job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-10 * time.Minute), @@ -466,7 +466,7 @@ func TestReleaseTargetJobTracker_GetSoakTimeRemaining(t *testing.T) { completedAt := time.Now().Add(-5 * time.Minute) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-10 * time.Minute), @@ -526,7 +526,7 @@ func TestReleaseTargetJobTracker_GetMostRecentSuccess(t *testing.T) { completedAt := time.Now().Add(-5 * time.Minute) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-10 * time.Minute), @@ -586,7 +586,7 @@ func TestReleaseTargetJobTracker_IsWithinMaxAge_WithinAge(t *testing.T) { completedAt := time.Now().Add(-5 * time.Minute) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-10 * time.Minute), @@ -649,7 +649,7 @@ func TestReleaseTargetJobTracker_Jobs(t *testing.T) { completedAt := time.Now().Add(-5 * time.Minute) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-10 * time.Minute), @@ -659,7 +659,7 @@ func TestReleaseTargetJobTracker_Jobs(t *testing.T) { } job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusPending, CreatedAt: time.Now().Add(-3 * time.Minute), @@ -726,7 +726,7 @@ func TestReleaseTargetJobTracker_FiltersByEnvironmentAndDeployment(t *testing.T) completedAt1 := time.Now().Add(-5 * time.Minute) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-10 * time.Minute), @@ -737,7 +737,7 @@ func TestReleaseTargetJobTracker_FiltersByEnvironmentAndDeployment(t *testing.T) completedAt2 := time.Now().Add(-3 * time.Minute) job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-8 * time.Minute), @@ -794,7 +794,7 @@ func TestReleaseTargetJobTracker_MultipleJobsPerTarget_TracksOldestSuccess(t *te completedAt1 := time.Now().Add(-20 * time.Minute) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-25 * time.Minute), @@ -807,7 +807,7 @@ func TestReleaseTargetJobTracker_MultipleJobsPerTarget_TracksOldestSuccess(t *te completedAt2 := time.Now().Add(-10 * time.Minute) job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-15 * time.Minute), @@ -892,7 +892,7 @@ func TestReleaseTargetJobTracker_GetSuccessPercentageSatisfiedAt_Basic(t *testin completedAt1 := time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 0, 0, 0, time.UTC), @@ -907,7 +907,7 @@ func TestReleaseTargetJobTracker_GetSuccessPercentageSatisfiedAt_Basic(t *testin completedAt2 := time.Date(2024, 1, 1, 10, 10, 0, 0, time.UTC) job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC), @@ -921,7 +921,7 @@ func TestReleaseTargetJobTracker_GetSuccessPercentageSatisfiedAt_Basic(t *testin completedAt3 := time.Date(2024, 1, 1, 10, 15, 0, 0, time.UTC) job3 := &oapi.Job{ Id: "job-3", - ReleaseId: release3.ID(), + ReleaseId: release3.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 10, 0, 0, time.UTC), @@ -998,7 +998,7 @@ func TestReleaseTargetJobTracker_GetSuccessPercentageSatisfiedAt_NotEnoughSucces completedAt1 := time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 0, 0, 0, time.UTC), @@ -1105,7 +1105,7 @@ func TestReleaseTargetJobTracker_GetSuccessPercentageSatisfiedAt_ZeroMinimumPerc completedAt1 := time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 0, 0, 0, time.UTC), @@ -1116,7 +1116,7 @@ func TestReleaseTargetJobTracker_GetSuccessPercentageSatisfiedAt_ZeroMinimumPerc completedAt2 := time.Date(2024, 1, 1, 10, 10, 0, 0, time.UTC) job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC), @@ -1198,7 +1198,7 @@ func TestReleaseTargetJobTracker_GetSuccessPercentageSatisfiedAt_OutOfOrderCompl completedAt2 := time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC) job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 0, 0, 0, time.UTC), @@ -1212,7 +1212,7 @@ func TestReleaseTargetJobTracker_GetSuccessPercentageSatisfiedAt_OutOfOrderCompl completedAt1 := time.Date(2024, 1, 1, 10, 10, 0, 0, time.UTC) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC), @@ -1226,7 +1226,7 @@ func TestReleaseTargetJobTracker_GetSuccessPercentageSatisfiedAt_OutOfOrderCompl completedAt3 := time.Date(2024, 1, 1, 10, 15, 0, 0, time.UTC) job3 := &oapi.Job{ Id: "job-3", - ReleaseId: release3.ID(), + ReleaseId: release3.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 10, 0, 0, time.UTC), diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/passrate_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/passrate_test.go index 4cfc80789..8da342af9 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/passrate_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/passrate_test.go @@ -150,7 +150,7 @@ func TestPassRateEvaluator_MeetsMinimumRequirement(t *testing.T) { completedAt1 := time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 0, 0, 0, time.UTC), @@ -161,7 +161,7 @@ func TestPassRateEvaluator_MeetsMinimumRequirement(t *testing.T) { completedAt2 := time.Date(2024, 1, 1, 10, 10, 0, 0, time.UTC) job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC), @@ -279,7 +279,7 @@ func TestPassRateEvaluator_BelowMinimumRequirement(t *testing.T) { completedAt1 := time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 0, 0, 0, time.UTC), @@ -397,7 +397,7 @@ func TestPassRateEvaluator_SatisfiedAt_ExactThreshold(t *testing.T) { completedAt1 := time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 0, 0, 0, time.UTC), @@ -410,7 +410,7 @@ func TestPassRateEvaluator_SatisfiedAt_ExactThreshold(t *testing.T) { completedAt2 := satisfiedAtTime job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC), @@ -422,7 +422,7 @@ func TestPassRateEvaluator_SatisfiedAt_ExactThreshold(t *testing.T) { completedAt3 := time.Date(2024, 1, 1, 10, 15, 0, 0, time.UTC) job3 := &oapi.Job{ Id: "job-3", - ReleaseId: release3.ID(), + ReleaseId: release3.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 10, 0, 0, time.UTC), @@ -501,7 +501,7 @@ func TestPassRateEvaluator_ZeroMinimumPercentage(t *testing.T) { completedAt := time.Date(2024, 1, 1, 10, 5, 0, 0, time.UTC) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: time.Date(2024, 1, 1, 10, 0, 0, 0, time.UTC), @@ -602,7 +602,7 @@ func TestPassRateEvaluator_CustomSuccessStatuses(t *testing.T) { completedAt := time.Now().Add(-5 * time.Minute) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusInProgress, CreatedAt: time.Now().Add(-10 * time.Minute), diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/soaktime_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/soaktime_test.go index 346a4fe21..654b4edc3 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/soaktime_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/environmentprogression/soaktime_test.go @@ -97,7 +97,7 @@ func TestSoakTimeEvaluator_SoakTimeMet(t *testing.T) { completedAt := mostRecentSuccess job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: mostRecentSuccess.Add(-5 * time.Minute), @@ -162,7 +162,7 @@ func TestSoakTimeEvaluator_SoakTimeNotMet(t *testing.T) { completedAt := mostRecentSuccess job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: mostRecentSuccess.Add(-5 * time.Minute), @@ -222,7 +222,7 @@ func TestSoakTimeEvaluator_NoSuccessfulJobs(t *testing.T) { // Create a pending job (not successful) job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusPending, CreatedAt: time.Now(), @@ -284,7 +284,7 @@ func TestSoakTimeEvaluator_SatisfiedAt_Calculation(t *testing.T) { completedAt := mostRecentSuccess job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: mostRecentSuccess.Add(-5 * time.Minute), @@ -350,7 +350,7 @@ func TestSoakTimeEvaluator_MultipleJobs_UseMostRecent(t *testing.T) { completedAt1 := oldSuccess job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: oldSuccess.Add(-5 * time.Minute), @@ -366,7 +366,7 @@ func TestSoakTimeEvaluator_MultipleJobs_UseMostRecent(t *testing.T) { completedAt2 := mostRecentSuccess job2 := &oapi.Job{ Id: "job-2", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: mostRecentSuccess.Add(-5 * time.Minute), @@ -445,7 +445,7 @@ func TestSoakTimeEvaluator_CustomSuccessStatuses(t *testing.T) { completedAt := mostRecentSuccess job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusInProgress, CreatedAt: mostRecentSuccess.Add(-5 * time.Minute), @@ -510,7 +510,7 @@ func TestSoakTimeEvaluator_ExactlyAtThreshold(t *testing.T) { completedAt := mostRecentSuccess job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: mostRecentSuccess.Add(-5 * time.Minute), @@ -574,7 +574,7 @@ func TestSoakTimeEvaluator_NextEvaluationTime_WhenPending(t *testing.T) { completedAt := mostRecentSuccess job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: mostRecentSuccess.Add(-5 * time.Minute), @@ -641,7 +641,7 @@ func TestSoakTimeEvaluator_NextEvaluationTime_WhenSatisfied(t *testing.T) { completedAt := mostRecentSuccess job1 := &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), JobAgentId: "agent-1", Status: oapi.JobStatusSuccessful, CreatedAt: mostRecentSuccess.Add(-5 * time.Minute), diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/gradualrollout/gradualrollout_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/gradualrollout/gradualrollout_test.go index 17fc1647f..6b57fc7ea 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/gradualrollout/gradualrollout_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/gradualrollout/gradualrollout_test.go @@ -93,7 +93,7 @@ func seedSuccessfulRelease(ctx context.Context, store *store.Store, releaseTarge completedAt := time.Now().Add(-23 * time.Hour) job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CompletedAt: &completedAt, CreatedAt: completedAt, @@ -953,7 +953,7 @@ func TestGradualRolloutEvaluator_EnvironmentProgressionOnly_SuccessPercentage(t completedAt := successTime.Add(time.Duration(i) * time.Minute) job := &oapi.Job{ Id: fmt.Sprintf("job-staging-%d", i), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: successTime, CompletedAt: &completedAt, @@ -1070,7 +1070,7 @@ func TestGradualRolloutEvaluator_EnvironmentProgressionOnly_SoakTime(t *testing. jobCompletedAt := baseTime.Add(1 * time.Hour) job := &oapi.Job{ Id: "job-staging-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: baseTime, CompletedAt: &jobCompletedAt, @@ -1191,7 +1191,7 @@ func TestGradualRolloutEvaluator_EnvironmentProgressionOnly_BothSuccessPercentag completedAt := successTime.Add(time.Duration(i) * time.Minute) job := &oapi.Job{ Id: fmt.Sprintf("job-staging-%d", i), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: successTime, CompletedAt: &completedAt, @@ -1429,7 +1429,7 @@ func TestGradualRolloutEvaluator_BothPolicies_BothSatisfied(t *testing.T) { completedAt := envProgTime.Add(time.Duration(i) * time.Minute) job := &oapi.Job{ Id: fmt.Sprintf("job-staging-%d", i), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: envProgTime, CompletedAt: &completedAt, @@ -1553,7 +1553,7 @@ func TestGradualRolloutEvaluator_BothPolicies_ApprovalLater(t *testing.T) { completedAt := envProgTime.Add(time.Duration(i) * time.Minute) job := &oapi.Job{ Id: fmt.Sprintf("job-staging-%d", i), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: envProgTime, CompletedAt: &completedAt, @@ -1694,7 +1694,7 @@ func TestGradualRolloutEvaluator_BothPolicies_ApprovalUnsatisfied(t *testing.T) completedAt := envProgTime.Add(time.Duration(i) * time.Minute) job := &oapi.Job{ Id: fmt.Sprintf("job-staging-%d", i), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: envProgTime, CompletedAt: &completedAt, @@ -2165,7 +2165,7 @@ func TestGradualRolloutEvaluator_EnvProgressionJustSatisfied_OnlyPosition0Allowe completedAt := stagingCompletionTime job := &oapi.Job{ Id: fmt.Sprintf("job-staging-%d", i), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: baseTime, CompletedAt: &completedAt, diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/releasetargetconcurrency/releasetargetconcurrency_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/releasetargetconcurrency/releasetargetconcurrency_test.go index 702aa9e5d..c938171c5 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/releasetargetconcurrency/releasetargetconcurrency_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/releasetargetconcurrency/releasetargetconcurrency_test.go @@ -87,7 +87,7 @@ func TestReleaseTargetConcurrencyEvaluator_JobInPendingState(t *testing.T) { st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: existingRelease.ID(), + ReleaseId: existingRelease.ContentHash(), Status: oapi.JobStatusPending, CreatedAt: time.Now(), }) @@ -149,7 +149,7 @@ func TestReleaseTargetConcurrencyEvaluator_JobInProgressState(t *testing.T) { st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: existingRelease.ID(), + ReleaseId: existingRelease.ContentHash(), Status: oapi.JobStatusInProgress, CreatedAt: time.Now(), }) @@ -203,7 +203,7 @@ func TestReleaseTargetConcurrencyEvaluator_JobInActionRequiredState(t *testing.T st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: existingRelease.ID(), + ReleaseId: existingRelease.ContentHash(), Status: oapi.JobStatusActionRequired, CreatedAt: time.Now(), }) @@ -269,14 +269,14 @@ func TestReleaseTargetConcurrencyEvaluator_MultipleActiveJobs(t *testing.T) { st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), Status: oapi.JobStatusPending, CreatedAt: time.Now().Add(-1 * time.Hour), }) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), Status: oapi.JobStatusInProgress, CreatedAt: time.Now(), }) @@ -360,7 +360,7 @@ func TestReleaseTargetConcurrencyEvaluator_TerminalStateJobsDoNotBlock(t *testin st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-3 * time.Hour), CompletedAt: &completedAt, @@ -368,7 +368,7 @@ func TestReleaseTargetConcurrencyEvaluator_TerminalStateJobsDoNotBlock(t *testin st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-2", - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-2 * time.Hour), CompletedAt: &completedAt, @@ -376,7 +376,7 @@ func TestReleaseTargetConcurrencyEvaluator_TerminalStateJobsDoNotBlock(t *testin st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-3", - ReleaseId: release3.ID(), + ReleaseId: release3.ContentHash(), Status: oapi.JobStatusCancelled, CreatedAt: time.Now().Add(-1 * time.Hour), CompletedAt: &completedAt, @@ -453,7 +453,7 @@ func TestReleaseTargetConcurrencyEvaluator_DifferentReleaseTargetsDoNotInterfere st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), Status: oapi.JobStatusInProgress, CreatedAt: time.Now(), }) @@ -512,7 +512,7 @@ func TestReleaseTargetConcurrencyEvaluator_AllProcessingStatesBlock(t *testing.T st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: existingRelease.ID(), + ReleaseId: existingRelease.ContentHash(), Status: status, CreatedAt: time.Now(), }) @@ -586,7 +586,7 @@ func TestReleaseTargetConcurrencyEvaluator_AllTerminalStatesAllow(t *testing.T) completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: existingRelease.ID(), + ReleaseId: existingRelease.ContentHash(), Status: status, CreatedAt: time.Now(), CompletedAt: &completedAt, diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/retry/retry.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/retry/retry.go index 07d026b55..294065efc 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/retry/retry.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/retry/retry.go @@ -116,7 +116,7 @@ func (e *RetryEvaluator) Evaluate( for _, job := range jobs { // Only count jobs for this exact release - if job.ReleaseId != release.ID() { + if job.ReleaseId != release.ContentHash() { break } @@ -149,7 +149,7 @@ func (e *RetryEvaluator) Evaluate( NewDeniedResult( fmt.Sprintf("Retry limit exceeded (%d/%d attempts)", attemptCount, maxRetries), ). - WithDetail("release_id", release.ID()). + WithDetail("release_id", release.ContentHash()). WithDetail("attempt_count", attemptCount). WithDetail("max_retries", maxRetries). WithDetail("version", release.Version.Tag). @@ -171,7 +171,7 @@ func (e *RetryEvaluator) Evaluate( NewAllowedResult( fmt.Sprintf("First attempt (0/%d retries used)", maxRetries), ). - WithDetail("release_id", release.ID()). + WithDetail("release_id", release.ContentHash()). WithDetail("max_retries", maxRetries). WithDetail("version", release.Version.Tag) } @@ -180,7 +180,7 @@ func (e *RetryEvaluator) Evaluate( NewAllowedResult( fmt.Sprintf("Retry allowed (%d/%d attempts)", attemptCount, maxRetries), ). - WithDetail("release_id", release.ID()). + WithDetail("release_id", release.ContentHash()). WithDetail("attempt_count", attemptCount). WithDetail("max_retries", maxRetries). WithDetail("version", release.Version.Tag). @@ -246,7 +246,7 @@ func (e *RetryEvaluator) evaluateBackoff( "wait", fmt.Sprintf("Waiting for retry backoff (%ds remaining)", remainingSeconds), ). - WithDetail("release_id", release.ID()). + WithDetail("release_id", release.ContentHash()). WithDetail("attempt_count", attemptCount). WithDetail("max_retries", int(e.rule.MaxRetries)). WithDetail("version", release.Version.Tag). diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/retry/retry_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/retry/retry_test.go index 7e3950e8a..e90055382 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/retry/retry_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/retry/retry_test.go @@ -86,7 +86,7 @@ func TestRetryEvaluator_DefaultBehavior_SecondAttemptDenied(t *testing.T) { completedAt := time.Now().Add(-1 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-2 * time.Hour), CompletedAt: &completedAt, @@ -115,7 +115,7 @@ func TestRetryEvaluator_DefaultBehavior_AllStatusesCount(t *testing.T) { completedAt := time.Now().Add(-1 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-success", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-2 * time.Hour), CompletedAt: &completedAt, @@ -159,7 +159,7 @@ func TestRetryEvaluator_MaxRetries_Zero(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now(), CompletedAt: &completedAt, @@ -191,7 +191,7 @@ func TestRetryEvaluator_MaxRetries_Three(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-" + string(rune(i)), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now(), CompletedAt: &completedAt, @@ -206,7 +206,7 @@ func TestRetryEvaluator_MaxRetries_Three(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-4", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now(), CompletedAt: &completedAt, @@ -244,7 +244,7 @@ func TestRetryEvaluator_RetryOnStatuses_OnlyCountsFailures(t *testing.T) { completedAt1 := time.Now().Add(-2 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-success", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-3 * time.Hour), CompletedAt: &completedAt1, @@ -254,7 +254,7 @@ func TestRetryEvaluator_RetryOnStatuses_OnlyCountsFailures(t *testing.T) { completedAt2 := time.Now().Add(-1 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-cancelled", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusCancelled, CreatedAt: time.Now().Add(-90 * time.Minute), CompletedAt: &completedAt2, @@ -269,7 +269,7 @@ func TestRetryEvaluator_RetryOnStatuses_OnlyCountsFailures(t *testing.T) { completedAt3 := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-failed", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now(), CompletedAt: &completedAt3, @@ -284,7 +284,7 @@ func TestRetryEvaluator_RetryOnStatuses_OnlyCountsFailures(t *testing.T) { completedAt4 := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-failed-2", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now(), CompletedAt: &completedAt4, @@ -320,7 +320,7 @@ func TestRetryEvaluator_RetryOnStatuses_MultipleStatuses(t *testing.T) { completedAt1 := time.Now().Add(-3 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-4 * time.Hour), CompletedAt: &completedAt1, @@ -329,7 +329,7 @@ func TestRetryEvaluator_RetryOnStatuses_MultipleStatuses(t *testing.T) { completedAt2 := time.Now().Add(-2 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-2", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusInvalidJobAgent, CreatedAt: time.Now().Add(-150 * time.Minute), CompletedAt: &completedAt2, @@ -343,7 +343,7 @@ func TestRetryEvaluator_RetryOnStatuses_MultipleStatuses(t *testing.T) { completedAt3 := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-3", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusExternalRunNotFound, CreatedAt: time.Now(), CompletedAt: &completedAt3, @@ -385,7 +385,7 @@ func TestRetryEvaluator_DifferentReleasesIndependent(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-r1", - ReleaseId: release1.ID(), + ReleaseId: release1.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now(), CompletedAt: &completedAt, @@ -423,7 +423,7 @@ func TestRetryEvaluator_LinearBackoff_StillWaiting(t *testing.T) { completedAt := time.Now().Add(-30 * time.Second) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-1 * time.Hour), CompletedAt: &completedAt, @@ -466,7 +466,7 @@ func TestRetryEvaluator_LinearBackoff_BackoffElapsed(t *testing.T) { completedAt := time.Now().Add(-90 * time.Second) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-2 * time.Minute), CompletedAt: &completedAt, @@ -503,7 +503,7 @@ func TestRetryEvaluator_LinearBackoff_ConstantDelay(t *testing.T) { completedAt := time.Now().Add(-20 * time.Second) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-" + string(rune(i)), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-1 * time.Minute), CompletedAt: &completedAt, @@ -553,7 +553,7 @@ func TestRetryEvaluator_ExponentialBackoff_DoublesEachRetry(t *testing.T) { completedAt := time.Now().Add(-10 * time.Second) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-" + string(rune(i)), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-1 * time.Minute), CompletedAt: &completedAt, @@ -604,7 +604,7 @@ func TestRetryEvaluator_ExponentialBackoff_WithCap(t *testing.T) { completedAt := time.Now().Add(-5 * time.Second) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-" + string(rune(i)), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-1 * time.Minute), CompletedAt: &completedAt, @@ -641,7 +641,7 @@ func TestRetryEvaluator_NoBackoff_ImmediateRetry(t *testing.T) { completedAt := time.Now().Add(-1 * time.Second) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-1 * time.Minute), CompletedAt: &completedAt, @@ -678,7 +678,7 @@ func TestRetryEvaluator_Backoff_UsesCompletedAt(t *testing.T) { completedAt := time.Now().Add(-30 * time.Second) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-2 * time.Hour), CompletedAt: &completedAt, @@ -713,7 +713,7 @@ func TestRetryEvaluator_Backoff_FallsBackToCreatedAt(t *testing.T) { // Job with no completedAt (still running) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusInProgress, CreatedAt: time.Now().Add(-30 * time.Second), CompletedAt: nil, // No completion time @@ -745,7 +745,7 @@ func TestRetryEvaluator_Backoff_NextEvaluationTime(t *testing.T) { completedAt := time.Now().Add(-60 * time.Second) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-2 * time.Minute), CompletedAt: &completedAt, @@ -790,7 +790,7 @@ func TestRetryEvaluator_Backoff_OnlyForRetryableStatuses(t *testing.T) { completedAt1 := time.Now().Add(-5 * time.Second) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-success", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-1 * time.Hour), CompletedAt: &completedAt1, @@ -804,7 +804,7 @@ func TestRetryEvaluator_Backoff_OnlyForRetryableStatuses(t *testing.T) { completedAt2 := time.Now().Add(-5 * time.Second) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-failed", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-10 * time.Second), CompletedAt: &completedAt2, @@ -844,7 +844,7 @@ func TestRetryEvaluator_VersionFlip_AllowsRedeployAfterDifferentRelease(t *testi completedAt1 := time.Now().Add(-3 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-v1-first", - ReleaseId: releaseV1.ID(), + ReleaseId: releaseV1.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-4 * time.Hour), CompletedAt: &completedAt1, @@ -854,7 +854,7 @@ func TestRetryEvaluator_VersionFlip_AllowsRedeployAfterDifferentRelease(t *testi completedAt2 := time.Now().Add(-2 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-v2", - ReleaseId: releaseV2.ID(), + ReleaseId: releaseV2.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-150 * time.Minute), CompletedAt: &completedAt2, @@ -891,7 +891,7 @@ func TestRetryEvaluator_VersionFlip_CountsOnlyLatestConsecutiveJobs(t *testing.T completedAt1 := time.Now().Add(-5 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-v1-old", - ReleaseId: releaseV1.ID(), + ReleaseId: releaseV1.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-6 * time.Hour), CompletedAt: &completedAt1, @@ -901,7 +901,7 @@ func TestRetryEvaluator_VersionFlip_CountsOnlyLatestConsecutiveJobs(t *testing.T completedAt2 := time.Now().Add(-3 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-v2", - ReleaseId: releaseV2.ID(), + ReleaseId: releaseV2.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-4 * time.Hour), CompletedAt: &completedAt2, @@ -911,7 +911,7 @@ func TestRetryEvaluator_VersionFlip_CountsOnlyLatestConsecutiveJobs(t *testing.T completedAt3 := time.Now().Add(-1 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-v1-recent", - ReleaseId: releaseV1.ID(), + ReleaseId: releaseV1.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-2 * time.Hour), CompletedAt: &completedAt3, @@ -945,7 +945,7 @@ func TestRetryEvaluator_VersionFlip_DeniesWhenConsecutiveExceedsLimit(t *testing completedAt1 := time.Now().Add(-5 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-v2", - ReleaseId: releaseV2.ID(), + ReleaseId: releaseV2.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-6 * time.Hour), CompletedAt: &completedAt1, @@ -955,7 +955,7 @@ func TestRetryEvaluator_VersionFlip_DeniesWhenConsecutiveExceedsLimit(t *testing completedAt2 := time.Now().Add(-2 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-v1-a", - ReleaseId: releaseV1.ID(), + ReleaseId: releaseV1.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-3 * time.Hour), CompletedAt: &completedAt2, @@ -964,7 +964,7 @@ func TestRetryEvaluator_VersionFlip_DeniesWhenConsecutiveExceedsLimit(t *testing completedAt3 := time.Now().Add(-1 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-v1-b", - ReleaseId: releaseV1.ID(), + ReleaseId: releaseV1.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-90 * time.Minute), CompletedAt: &completedAt3, @@ -997,22 +997,22 @@ func TestRetryEvaluator_VersionFlip_MultipleFlips(t *testing.T) { // v1 → v2 → v1 → v2 (each successful) completedAt1 := time.Now().Add(-4 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ - Id: "job-1-v1", ReleaseId: releaseV1.ID(), Status: oapi.JobStatusSuccessful, + Id: "job-1-v1", ReleaseId: releaseV1.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-5 * time.Hour), CompletedAt: &completedAt1, }) completedAt2 := time.Now().Add(-3 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ - Id: "job-2-v2", ReleaseId: releaseV2.ID(), Status: oapi.JobStatusSuccessful, + Id: "job-2-v2", ReleaseId: releaseV2.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-210 * time.Minute), CompletedAt: &completedAt2, }) completedAt3 := time.Now().Add(-2 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ - Id: "job-3-v1", ReleaseId: releaseV1.ID(), Status: oapi.JobStatusSuccessful, + Id: "job-3-v1", ReleaseId: releaseV1.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-150 * time.Minute), CompletedAt: &completedAt3, }) completedAt4 := time.Now().Add(-1 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ - Id: "job-4-v2", ReleaseId: releaseV2.ID(), Status: oapi.JobStatusSuccessful, + Id: "job-4-v2", ReleaseId: releaseV2.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-90 * time.Minute), CompletedAt: &completedAt4, }) @@ -1058,7 +1058,7 @@ func TestRetryEvaluator_MultipleJobsSameRelease_FindsMostRecent(t *testing.T) { oldCompletedAt := time.Now().Add(-2 * time.Hour) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-old", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-3 * time.Hour), CompletedAt: &oldCompletedAt, @@ -1068,7 +1068,7 @@ func TestRetryEvaluator_MultipleJobsSameRelease_FindsMostRecent(t *testing.T) { recentCompletedAt := time.Now().Add(-30 * time.Second) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-recent", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-1 * time.Minute), CompletedAt: &recentCompletedAt, diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/retry/smart_defaults_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/retry/smart_defaults_test.go index 709aa5461..ce7409b67 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/retry/smart_defaults_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/retry/smart_defaults_test.go @@ -36,7 +36,7 @@ func TestRetryEvaluator_SmartDefault_OnlyCountsFailures(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1-success", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-5 * time.Minute), CompletedAt: &completedAt, @@ -50,7 +50,7 @@ func TestRetryEvaluator_SmartDefault_OnlyCountsFailures(t *testing.T) { // Add a failed job - should count st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-2-failure", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-3 * time.Minute), CompletedAt: &completedAt, @@ -81,7 +81,7 @@ func TestRetryEvaluator_SmartDefault_CountsInvalidIntegration(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1-invalid", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusInvalidIntegration, CreatedAt: time.Now().Add(-1 * time.Minute), CompletedAt: &completedAt, @@ -94,7 +94,7 @@ func TestRetryEvaluator_SmartDefault_CountsInvalidIntegration(t *testing.T) { // Add another invalidIntegration - should exceed limit st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-2-invalid", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusInvalidIntegration, CreatedAt: time.Now(), CompletedAt: &completedAt, @@ -124,14 +124,14 @@ func TestRetryEvaluator_SmartDefault_DoesNotCountCancelled(t *testing.T) { completedAt := time.Now() st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1-cancelled", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusCancelled, CreatedAt: time.Now().Add(-5 * time.Minute), CompletedAt: &completedAt, }) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-2-cancelled", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusCancelled, CreatedAt: time.Now().Add(-3 * time.Minute), CompletedAt: &completedAt, @@ -164,7 +164,7 @@ func TestRetryEvaluator_SmartDefault_MixedStatuses(t *testing.T) { // so they must be older than the retryable ones. st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1-success", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now().Add(-10 * time.Minute), CompletedAt: &completedAt, @@ -172,7 +172,7 @@ func TestRetryEvaluator_SmartDefault_MixedStatuses(t *testing.T) { st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-2-cancelled", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusCancelled, CreatedAt: time.Now().Add(-8 * time.Minute), CompletedAt: &completedAt, @@ -180,7 +180,7 @@ func TestRetryEvaluator_SmartDefault_MixedStatuses(t *testing.T) { st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-3-skipped", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSkipped, CreatedAt: time.Now().Add(-6 * time.Minute), CompletedAt: &completedAt, @@ -189,7 +189,7 @@ func TestRetryEvaluator_SmartDefault_MixedStatuses(t *testing.T) { // Retryable jobs (most recent consecutive) — only these count st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-4-failure", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-4 * time.Minute), CompletedAt: &completedAt, @@ -197,7 +197,7 @@ func TestRetryEvaluator_SmartDefault_MixedStatuses(t *testing.T) { st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-5-invalid", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusInvalidIntegration, CreatedAt: time.Now().Add(-2 * time.Minute), CompletedAt: &completedAt, @@ -211,7 +211,7 @@ func TestRetryEvaluator_SmartDefault_MixedStatuses(t *testing.T) { // Add one more failure - should exceed st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-6-failure", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now(), CompletedAt: &completedAt, @@ -247,7 +247,7 @@ func TestRetryEvaluator_ExplicitStatuses_OverridesSmartDefault(t *testing.T) { // Add a failure - should NOT count (only cancelled counts) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1-failure", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusFailure, CreatedAt: time.Now().Add(-5 * time.Minute), CompletedAt: &completedAt, @@ -260,7 +260,7 @@ func TestRetryEvaluator_ExplicitStatuses_OverridesSmartDefault(t *testing.T) { // Add cancelled job - should count st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-2-cancelled", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusCancelled, CreatedAt: time.Now(), CompletedAt: &completedAt, @@ -293,7 +293,7 @@ func TestRetryEvaluator_ZeroMaxRetries_CountsSuccessfulAndErrors(t *testing.T) { // Add a successful job - should count (strict mode: successful counts for maxRetries=0) st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1-success", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: time.Now(), CompletedAt: &completedAt, @@ -326,7 +326,7 @@ func TestRetryEvaluator_ZeroMaxRetries_AllowsAfterCancelled(t *testing.T) { // Add a cancelled job - should NOT count st.Jobs.Upsert(ctx, &oapi.Job{ Id: "job-1-cancelled", - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusCancelled, CreatedAt: time.Now(), CompletedAt: &completedAt, diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/rollback/rollback_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/rollback/rollback_test.go index c627fa8cf..096d1f579 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/rollback/rollback_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/rollback/rollback_test.go @@ -92,7 +92,7 @@ func createJob(t *testing.T, s *store.Store, ctx context.Context, e testEntities completedAt := createdAt.Add(30 * time.Second) job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: status, CreatedAt: createdAt, } diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/versioncooldown/version_summary_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/versioncooldown/version_summary_test.go index b8e9caad1..3d64b70d3 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/versioncooldown/version_summary_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/versioncooldown/version_summary_test.go @@ -159,7 +159,7 @@ func TestSummaryEvaluator_SomeTargetsDenied(t *testing.T) { completedAt := time.Now().Add(-5 * time.Second) job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CompletedAt: &completedAt, CreatedAt: completedAt, diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/versioncooldown/versioncooldown_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/versioncooldown/versioncooldown_test.go index d2df8c6ea..699b2a2a6 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/versioncooldown/versioncooldown_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/policy/evaluator/versioncooldown/versioncooldown_test.go @@ -88,7 +88,7 @@ func createSuccessfulJob(ctx context.Context, s *store.Store, release *oapi.Rele completedAt := time.Now() job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CompletedAt: &completedAt, CreatedAt: time.Now(), @@ -426,7 +426,7 @@ func TestVersionCooldownEvaluator_Evaluate(t *testing.T) { // Create in-progress job (no completedAt) inProgressJob := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release2.ID(), + ReleaseId: release2.ContentHash(), Status: oapi.JobStatusInProgress, CreatedAt: time.Now(), } diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/state_index_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/state_index_test.go index 06138a3b9..5e4eb4f5b 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/state_index_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/state_index_test.go @@ -90,7 +90,7 @@ func TestRestoreAll_ComputesLatestJob(t *testing.T) { now := time.Now() job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: now, UpdatedAt: now, @@ -175,7 +175,7 @@ func TestGetReleaseTargetState_AfterRestore(t *testing.T) { now := time.Now() job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusPending, CreatedAt: now, UpdatedAt: now, @@ -228,7 +228,7 @@ func TestRecomputeEntity_RefreshesAfterRestore(t *testing.T) { now := time.Now() job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusInProgress, CreatedAt: now, UpdatedAt: now, diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/verification/executor_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/verification/executor_test.go index 77e2b6ff8..afd032a3b 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/verification/executor_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/verification/executor_test.go @@ -38,7 +38,7 @@ func TestExecutor_Execute_Success(t *testing.T) { metric := createHTTPMetricStatus(server.URL) // Execute measurement with direct objects - measurement, err := executor.Execute(ctx, &metric, release.ID()) + measurement, err := executor.Execute(ctx, &metric, release.ContentHash()) require.NoError(t, err) assert.Equal(t, oapi.Passed, measurement.Status) @@ -78,7 +78,7 @@ func TestExecutor_Execute_FailedMeasurement(t *testing.T) { // Execute measurement - should not error but should fail // (success condition not met, no failure condition = binary pass/fail) - measurement, err := executor.Execute(ctx, &metric, release.ID()) + measurement, err := executor.Execute(ctx, &metric, release.ContentHash()) require.NoError(t, err) assert.Equal(t, oapi.Failed, measurement.Status) @@ -103,7 +103,7 @@ func TestExecutor_Execute_ContextCancellation(t *testing.T) { metric := createHTTPMetricStatus(server.URL) // Execute should fail due to context timeout - _, err := executor.Execute(ctx, &metric, release.ID()) + _, err := executor.Execute(ctx, &metric, release.ContentHash()) assert.Error(t, err) } @@ -125,7 +125,7 @@ func TestExecutor_Execute_WithTemplatedURL(t *testing.T) { metric := createHTTPMetricStatus(server.URL + "/{{.release.version.tag}}") // Execute - template should be resolved - measurement, err := executor.Execute(ctx, &metric, release.ID()) + measurement, err := executor.Execute(ctx, &metric, release.ContentHash()) require.NoError(t, err) assert.Equal(t, oapi.Passed, measurement.Status) @@ -138,7 +138,7 @@ func TestExecutor_BuildProviderContext_Success(t *testing.T) { release := createTestRelease(s, ctx) - providerCtx, err := executor.BuildProviderContext(release.ID()) + providerCtx, err := executor.BuildProviderContext(release.ContentHash()) require.NoError(t, err) require.NotNil(t, providerCtx) @@ -181,7 +181,7 @@ func TestExecutor_BuildProviderContext_WithVariables(t *testing.T) { } _ = s.Releases.Upsert(ctx, release) - providerCtx, err := executor.BuildProviderContext(release.ID()) + providerCtx, err := executor.BuildProviderContext(release.ContentHash()) require.NoError(t, err) require.NotNil(t, providerCtx) diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/verification/manager_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/verification/manager_test.go index b29811b90..542f2c94d 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/verification/manager_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/verification/manager_test.go @@ -37,7 +37,7 @@ func TestManager_StartVerification_Success(t *testing.T) { defer ts.Close() release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) // Create metric specs using test server metrics := []oapi.VerificationMetricSpec{ @@ -87,7 +87,7 @@ func TestManager_StartVerification_MultipleMetrics(t *testing.T) { defer ts.Close() release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) metrics := []oapi.VerificationMetricSpec{ { @@ -131,7 +131,7 @@ func TestManager_StartVerification_AlreadyExists(t *testing.T) { defer ts.Close() release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) metrics := []oapi.VerificationMetricSpec{ { @@ -173,7 +173,7 @@ func TestManager_StartVerification_NoMetrics(t *testing.T) { manager := NewManager(s) release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) // Try to start with empty metrics err := manager.StartVerification(ctx, job, []oapi.VerificationMetricSpec{}) @@ -196,7 +196,7 @@ func TestManager_StartVerification_WithFailureLimit(t *testing.T) { defer ts.Close() release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) failureLimit := 3 metrics := []oapi.VerificationMetricSpec{ @@ -234,7 +234,7 @@ func TestManager_StopVerification_Success(t *testing.T) { defer ts.Close() release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) metrics := []oapi.VerificationMetricSpec{ { @@ -305,11 +305,11 @@ func TestManager_Restore_RunningVerifications(t *testing.T) { // Create some releases, jobs, and verifications in running state release1 := createTestRelease(s, ctx) - job1 := createTestJob(s, ctx, release1.ID()) + job1 := createTestJob(s, ctx, release1.ContentHash()) release2 := createTestRelease(s, ctx) - job2 := createTestJob(s, ctx, release2.ID()) + job2 := createTestJob(s, ctx, release2.ContentHash()) release3 := createTestRelease(s, ctx) - job3 := createTestJob(s, ctx, release3.ID()) + job3 := createTestJob(s, ctx, release3.ContentHash()) verification1 := createTestVerification(s, ctx, job1.Id, 2, 3600) verification2 := createTestVerification(s, ctx, job2.Id, 1, 300) @@ -367,7 +367,7 @@ func TestManager_Restore_FailedVerifications(t *testing.T) { manager := NewManager(s) release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) verification := createTestVerification(s, ctx, job.Id, 1, 30) // Make verification failed by exceeding failure limit @@ -404,11 +404,11 @@ func TestManager_Restore_MixedStates(t *testing.T) { // Create verifications in different states runningRelease := createTestRelease(s, ctx) - runningJob := createTestJob(s, ctx, runningRelease.ID()) + runningJob := createTestJob(s, ctx, runningRelease.ContentHash()) passedRelease := createTestRelease(s, ctx) - passedJob := createTestJob(s, ctx, passedRelease.ID()) + passedJob := createTestJob(s, ctx, passedRelease.ContentHash()) failedRelease := createTestRelease(s, ctx) - failedJob := createTestJob(s, ctx, failedRelease.ID()) + failedJob := createTestJob(s, ctx, failedRelease.ContentHash()) runningVerification := createTestVerification(s, ctx, runningJob.Id, 1, 3600) @@ -480,7 +480,7 @@ func TestManager_StartAndStopMultiple(t *testing.T) { jobs := make([]*oapi.Job, 5) for i := 0; i < 5; i++ { release := createTestRelease(s, ctx) - jobs[i] = createTestJob(s, ctx, release.ID()) + jobs[i] = createTestJob(s, ctx, release.ContentHash()) err := manager.StartVerification(ctx, jobs[i], metrics) require.NoError(t, err) } @@ -513,7 +513,7 @@ func TestManager_StartVerification_PreservesAllMetricFields(t *testing.T) { defer ts.Close() release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) method := oapi.POST timeout := "10s" @@ -583,7 +583,7 @@ func TestManager_Integration_FullLifecycle(t *testing.T) { defer ts.Close() release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) metrics := []oapi.VerificationMetricSpec{ { @@ -646,7 +646,7 @@ func BenchmarkManager_StartVerification(b *testing.B) { jobs := make([]*oapi.Job, b.N) for i := 0; i < b.N; i++ { release := createTestRelease(s, ctx) - jobs[i] = createTestJob(s, ctx, release.ID()) + jobs[i] = createTestJob(s, ctx, release.ContentHash()) } b.ResetTimer() @@ -686,7 +686,7 @@ func BenchmarkManager_StopVerification(b *testing.B) { jobs := make([]*oapi.Job, b.N) for i := 0; i < b.N; i++ { release := createTestRelease(s, ctx) - jobs[i] = createTestJob(s, ctx, release.ID()) + jobs[i] = createTestJob(s, ctx, release.ContentHash()) _ = manager.StartVerification(ctx, jobs[i], metrics) } @@ -706,7 +706,7 @@ func BenchmarkManager_Restore(b *testing.B) { // Create 10 running verifications per store for j := 0; j < 10; j++ { release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) createTestVerification(s, ctx, job.Id, 2, 3600) } stores[i] = s @@ -848,7 +848,7 @@ func TestManager_HooksOnVerificationStarted(t *testing.T) { defer ts.Close() release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) metrics := []oapi.VerificationMetricSpec{ { @@ -889,7 +889,7 @@ func TestManager_HooksOnVerificationStopped(t *testing.T) { defer ts.Close() release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) metrics := []oapi.VerificationMetricSpec{ { @@ -930,7 +930,7 @@ func TestManager_HooksOnMeasurementTaken(t *testing.T) { defer ts.Close() release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) metrics := []oapi.VerificationMetricSpec{ { @@ -978,7 +978,7 @@ func TestManager_HooksOnMetricComplete(t *testing.T) { defer ts.Close() release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) // Use a very short interval, low count, and short timeout to complete quickly metrics := []oapi.VerificationMetricSpec{ @@ -1027,7 +1027,7 @@ func TestManager_HooksOnVerificationComplete(t *testing.T) { defer ts.Close() release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) // Use a very short interval, low count, and short timeout to complete quickly metrics := []oapi.VerificationMetricSpec{ @@ -1083,7 +1083,7 @@ func TestManager_HooksErrorsDontFailVerification(t *testing.T) { manager := NewManager(s, WithHooks(hooks)) release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) metrics := []oapi.VerificationMetricSpec{ { @@ -1125,7 +1125,7 @@ func TestManager_HooksWithMultipleMetrics(t *testing.T) { defer ts.Close() release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) // Create multiple metrics metrics := []oapi.VerificationMetricSpec{ diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/verification/recorder_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/verification/recorder_test.go index bd6e35cf8..32fcc1031 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/verification/recorder_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/verification/recorder_test.go @@ -27,7 +27,7 @@ func TestRecorder_RecordMeasurement_Success(t *testing.T) { recorder := NewMeasurementRecorder(s) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 1, 60) + verification := createTestVerification(s, ctx, release.ContentHash(), 1, 60) // Record a measurement measurement := oapi.VerificationMeasurement{ @@ -68,7 +68,7 @@ func TestRecorder_RecordMeasurement_MetricIndexOutOfRange(t *testing.T) { recorder := NewMeasurementRecorder(s) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 1, 60) + verification := createTestVerification(s, ctx, release.ContentHash(), 1, 60) measurement := oapi.VerificationMeasurement{ Status: oapi.Passed, @@ -87,7 +87,7 @@ func TestRecorder_RecordMeasurement_MultipleMeasurements(t *testing.T) { recorder := NewMeasurementRecorder(s) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 1, 60) + verification := createTestVerification(s, ctx, release.ContentHash(), 1, 60) // Record multiple measurements for i := 0; i < 5; i++ { @@ -116,7 +116,7 @@ func TestRecorder_RecordMeasurement_MultipleMetrics(t *testing.T) { recorder := NewMeasurementRecorder(s) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 3, 60) + verification := createTestVerification(s, ctx, release.ContentHash(), 3, 60) // Record measurement for each metric for i := 0; i < 3; i++ { @@ -143,7 +143,7 @@ func TestRecorder_RecordError_Success(t *testing.T) { recorder := NewMeasurementRecorder(s) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 1, 60) + verification := createTestVerification(s, ctx, release.ContentHash(), 1, 60) // Record an error testError := errors.New("connection timeout") @@ -180,7 +180,7 @@ func TestRecorder_UpdateMessage_Success(t *testing.T) { recorder := NewMeasurementRecorder(s) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 1, 60) + verification := createTestVerification(s, ctx, release.ContentHash(), 1, 60) // Update message testMessage := "Verification completed: 5/5 measurements passed" @@ -212,7 +212,7 @@ func TestRecorder_ConcurrentRecordMeasurements(t *testing.T) { recorder := NewMeasurementRecorder(s) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 1, 60) + verification := createTestVerification(s, ctx, release.ContentHash(), 1, 60) // Record measurements concurrently var wg sync.WaitGroup @@ -246,7 +246,7 @@ func TestRecorder_ConcurrentRecordAndUpdate(t *testing.T) { recorder := NewMeasurementRecorder(s) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 3, 60) + verification := createTestVerification(s, ctx, release.ContentHash(), 3, 60) var wg sync.WaitGroup @@ -294,7 +294,7 @@ func TestRecorder_AppendMeasurement_PreservesExistingMeasurements(t *testing.T) recorder := NewMeasurementRecorder(s) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 2, 60) + verification := createTestVerification(s, ctx, release.ContentHash(), 2, 60) // Record first measurement measurement1 := oapi.VerificationMeasurement{ diff --git a/apps/workspace-engine/pkg/workspace/releasemanager/verification/scheduler_test.go b/apps/workspace-engine/pkg/workspace/releasemanager/verification/scheduler_test.go index 8254bd351..259cfe23b 100644 --- a/apps/workspace-engine/pkg/workspace/releasemanager/verification/scheduler_test.go +++ b/apps/workspace-engine/pkg/workspace/releasemanager/verification/scheduler_test.go @@ -177,7 +177,7 @@ func createTestRelease(s *store.Store, ctx context.Context) *oapi.Release { func createTestReleaseAndJob(s *store.Store, ctx context.Context) (*oapi.Release, *oapi.Job) { release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) return release, job } @@ -269,7 +269,7 @@ func TestScheduler_StartVerification_AlreadyRunning(t *testing.T) { scheduler := newScheduler(s, DefaultHooks()) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 1, 3600) + verification := createTestVerification(s, ctx, release.ContentHash(), 1, 3600) // Start verification first time scheduler.StartVerification(ctx, verification.Id) @@ -300,7 +300,7 @@ func TestScheduler_StartVerification_AlreadyCompleted(t *testing.T) { scheduler := newScheduler(s, DefaultHooks()) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 1, 3600) + verification := createTestVerification(s, ctx, release.ContentHash(), 1, 3600) // Mark all metrics as complete by adding measurements for i := range verification.Metrics { @@ -330,7 +330,7 @@ func TestScheduler_StartVerification_Success(t *testing.T) { scheduler := newScheduler(s, DefaultHooks()) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 3, 3600) + verification := createTestVerification(s, ctx, release.ContentHash(), 3, 3600) scheduler.StartVerification(ctx, verification.Id) @@ -350,7 +350,7 @@ func TestScheduler_StopVerification(t *testing.T) { scheduler := newScheduler(s, DefaultHooks()) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 2, 3600) + verification := createTestVerification(s, ctx, release.ContentHash(), 2, 3600) scheduler.StartVerification(ctx, verification.Id) @@ -385,7 +385,7 @@ func TestScheduler_StopVerification_MultipleTimes(t *testing.T) { scheduler := newScheduler(s, DefaultHooks()) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 1, 3600) + verification := createTestVerification(s, ctx, release.ContentHash(), 1, 3600) scheduler.StartVerification(ctx, verification.Id) scheduler.StopVerification(verification.Id) @@ -405,7 +405,7 @@ func TestScheduler_ConcurrentStartStop(t *testing.T) { verificationIDs := make([]string, 10) for i := 0; i < 10; i++ { release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 2, 3600) + verification := createTestVerification(s, ctx, release.ContentHash(), 2, 3600) verificationIDs[i] = verification.Id } @@ -452,7 +452,7 @@ func TestScheduler_MultipleMetrics(t *testing.T) { release := createTestRelease(s, ctx) // Create verification with 5 metrics - verification := createTestVerification(s, ctx, release.ID(), 5, 3600) + verification := createTestVerification(s, ctx, release.ContentHash(), 5, 3600) scheduler.StartVerification(ctx, verification.Id) @@ -472,7 +472,7 @@ func TestScheduler_RestartAfterStop(t *testing.T) { scheduler := newScheduler(s, DefaultHooks()) release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 2, 3600) + verification := createTestVerification(s, ctx, release.ContentHash(), 2, 3600) // Start, stop, start again scheduler.StartVerification(ctx, verification.Id) @@ -504,7 +504,7 @@ func TestScheduler_VerificationWithNoMetrics(t *testing.T) { scheduler := newScheduler(s, DefaultHooks()) release := createTestRelease(s, ctx) - job := createTestJob(s, ctx, release.ID()) + job := createTestJob(s, ctx, release.ContentHash()) verification := &oapi.JobVerification{ Id: uuid.New().String(), @@ -708,7 +708,7 @@ func BenchmarkScheduler_StartVerification(b *testing.B) { verificationIDs := make([]string, b.N) for i := 0; i < b.N; i++ { release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 2, 3600) + verification := createTestVerification(s, ctx, release.ContentHash(), 2, 3600) verificationIDs[i] = verification.Id } @@ -732,7 +732,7 @@ func BenchmarkScheduler_StopVerification(b *testing.B) { verificationIDs := make([]string, b.N) for i := 0; i < b.N; i++ { release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 2, 3600) + verification := createTestVerification(s, ctx, release.ContentHash(), 2, 3600) verificationIDs[i] = verification.Id scheduler.StartVerification(ctx, verification.Id) } @@ -752,7 +752,7 @@ func BenchmarkScheduler_ConcurrentOperations(b *testing.B) { verificationIDs := make([]string, 100) for i := 0; i < 100; i++ { release := createTestRelease(s, ctx) - verification := createTestVerification(s, ctx, release.ID(), 2, 3600) + verification := createTestVerification(s, ctx, release.ContentHash(), 2, 3600) verificationIDs[i] = verification.Id } diff --git a/apps/workspace-engine/pkg/workspace/store/jobs.go b/apps/workspace-engine/pkg/workspace/store/jobs.go index a92218bf9..13bb38239 100644 --- a/apps/workspace-engine/pkg/workspace/store/jobs.go +++ b/apps/workspace-engine/pkg/workspace/store/jobs.go @@ -81,7 +81,7 @@ func (j *Jobs) GetJobsForReleaseTarget(releaseTarget *oapi.ReleaseTarget) map[st } for _, release := range releases { - releaseJobs := j.store.Releases.Jobs(release.ID()) + releaseJobs := j.store.Releases.Jobs(release.ContentHash()) for _, job := range releaseJobs { jobs[job.Id] = job } diff --git a/apps/workspace-engine/pkg/workspace/store/release_targets_test.go b/apps/workspace-engine/pkg/workspace/store/release_targets_test.go index 32907a160..56c6747b1 100644 --- a/apps/workspace-engine/pkg/workspace/store/release_targets_test.go +++ b/apps/workspace-engine/pkg/workspace/store/release_targets_test.go @@ -93,7 +93,7 @@ func createTestReleaseAndJob(s *store.Store, ctx context.Context, tag string, co // Create job job := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: completedAt.Add(-1 * time.Minute), CompletedAt: &completedAt, @@ -204,7 +204,7 @@ func TestGetCurrentRelease_NoVerification(t *testing.T) { require.NoError(t, err) require.NotNil(t, currentRelease) require.NotNil(t, currentJob) - assert.Equal(t, release.ID(), currentRelease.ID()) + assert.Equal(t, release.ContentHash(), currentRelease.ContentHash()) assert.Equal(t, oapi.JobStatusSuccessful, currentJob.Status) } @@ -228,7 +228,7 @@ func TestGetCurrentRelease_PassedVerification(t *testing.T) { require.NoError(t, err) require.NotNil(t, currentRelease) require.NotNil(t, currentJob) - assert.Equal(t, release.ID(), currentRelease.ID()) + assert.Equal(t, release.ContentHash(), currentRelease.ContentHash()) } func TestGetCurrentRelease_FailedVerification_FallbackToPrevious(t *testing.T) { @@ -294,7 +294,7 @@ func TestGetCurrentRelease_FailedVerification_FallbackToPrevious(t *testing.T) { olderJobCompletedAt := time.Now().Add(-1 * time.Hour) olderJob := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: olderRelease.ID(), + ReleaseId: olderRelease.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: olderJobCompletedAt.Add(-1 * time.Minute), CompletedAt: &olderJobCompletedAt, @@ -325,7 +325,7 @@ func TestGetCurrentRelease_FailedVerification_FallbackToPrevious(t *testing.T) { newerJobCompletedAt := time.Now() newerJob := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: newerRelease.ID(), + ReleaseId: newerRelease.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: newerJobCompletedAt.Add(-1 * time.Minute), CompletedAt: &newerJobCompletedAt, @@ -342,7 +342,7 @@ func TestGetCurrentRelease_FailedVerification_FallbackToPrevious(t *testing.T) { require.NoError(t, err) require.NotNil(t, currentRelease) require.NotNil(t, currentJob) - assert.Equal(t, olderRelease.ID(), currentRelease.ID()) + assert.Equal(t, olderRelease.ContentHash(), currentRelease.ContentHash()) assert.Equal(t, "v1.0.0", currentRelease.Version.Tag) } @@ -409,7 +409,7 @@ func TestGetCurrentRelease_RunningVerification_FallbackToPrevious(t *testing.T) olderJobCompletedAt := time.Now().Add(-1 * time.Hour) olderJob := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: olderRelease.ID(), + ReleaseId: olderRelease.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: olderJobCompletedAt.Add(-1 * time.Minute), CompletedAt: &olderJobCompletedAt, @@ -440,7 +440,7 @@ func TestGetCurrentRelease_RunningVerification_FallbackToPrevious(t *testing.T) newerJobCompletedAt := time.Now() newerJob := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: newerRelease.ID(), + ReleaseId: newerRelease.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: newerJobCompletedAt.Add(-1 * time.Minute), CompletedAt: &newerJobCompletedAt, @@ -457,7 +457,7 @@ func TestGetCurrentRelease_RunningVerification_FallbackToPrevious(t *testing.T) require.NoError(t, err) require.NotNil(t, currentRelease) require.NotNil(t, currentJob) - assert.Equal(t, olderRelease.ID(), currentRelease.ID()) + assert.Equal(t, olderRelease.ContentHash(), currentRelease.ContentHash()) assert.Equal(t, "v1.0.0", currentRelease.Version.Tag) } @@ -551,7 +551,7 @@ func TestGetCurrentRelease_CancelledVerification_FallbackToPrevious(t *testing.T olderJobCompletedAt := time.Now().Add(-1 * time.Hour) olderJob := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: olderRelease.ID(), + ReleaseId: olderRelease.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: olderJobCompletedAt.Add(-1 * time.Minute), CompletedAt: &olderJobCompletedAt, @@ -579,7 +579,7 @@ func TestGetCurrentRelease_CancelledVerification_FallbackToPrevious(t *testing.T newerJobCompletedAt := time.Now() newerJob := &oapi.Job{ Id: uuid.New().String(), - ReleaseId: newerRelease.ID(), + ReleaseId: newerRelease.ContentHash(), Status: oapi.JobStatusSuccessful, CreatedAt: newerJobCompletedAt.Add(-1 * time.Minute), CompletedAt: &newerJobCompletedAt, @@ -597,7 +597,7 @@ func TestGetCurrentRelease_CancelledVerification_FallbackToPrevious(t *testing.T require.NoError(t, err) require.NotNil(t, currentRelease) require.NotNil(t, currentJob) - assert.Equal(t, olderRelease.ID(), currentRelease.ID()) + assert.Equal(t, olderRelease.ContentHash(), currentRelease.ContentHash()) assert.Equal(t, "v1.0.0", currentRelease.Version.Tag) } diff --git a/apps/workspace-engine/pkg/workspace/store/releases.go b/apps/workspace-engine/pkg/workspace/store/releases.go index e54806e2a..4d4af4a97 100644 --- a/apps/workspace-engine/pkg/workspace/store/releases.go +++ b/apps/workspace-engine/pkg/workspace/store/releases.go @@ -4,6 +4,8 @@ import ( "context" "workspace-engine/pkg/oapi" "workspace-engine/pkg/workspace/store/repository" + + "github.com/google/uuid" ) func NewReleases(store *Store) *Releases { @@ -24,6 +26,9 @@ func (r *Releases) SetRepo(repo repository.ReleaseRepo) { } func (r *Releases) Upsert(ctx context.Context, release *oapi.Release) error { + if release.Id == uuid.Nil { + release.Id = uuid.NewSHA1(uuid.NameSpaceOID, []byte(release.ContentHash())) + } if err := r.repo.Set(release); err != nil { return err } diff --git a/apps/workspace-engine/pkg/workspace/store/repository/db/releases/mapper.go b/apps/workspace-engine/pkg/workspace/store/repository/db/releases/mapper.go index 2de1c936f..439286cc6 100644 --- a/apps/workspace-engine/pkg/workspace/store/repository/db/releases/mapper.go +++ b/apps/workspace-engine/pkg/workspace/store/repository/db/releases/mapper.go @@ -36,6 +36,7 @@ func ToOapi( } return &oapi.Release{ + Id: row.ID, CreatedAt: createdAt, EncryptedVariables: encrypted, ReleaseTarget: oapi.ReleaseTarget{ @@ -79,7 +80,7 @@ func ToUpsertParams(release *oapi.Release) (db.UpsertReleaseParams, error) { } return db.UpsertReleaseParams{ - ID: release.UUID(), + ID: release.Id, ResourceID: resourceID, EnvironmentID: environmentID, DeploymentID: deploymentID, diff --git a/apps/workspace-engine/pkg/workspace/store/repository/db/releases/repo.go b/apps/workspace-engine/pkg/workspace/store/repository/db/releases/repo.go index e1a37d50b..7257d29a5 100644 --- a/apps/workspace-engine/pkg/workspace/store/repository/db/releases/repo.go +++ b/apps/workspace-engine/pkg/workspace/store/repository/db/releases/repo.go @@ -111,7 +111,7 @@ func (r *Repo) Set(entity *oapi.Release) error { return fmt.Errorf("upsert release: %w", err) } - releaseUUID := entity.UUID() + releaseUUID := entity.Id encryptedKeys := make(map[string]bool, len(entity.EncryptedVariables)) for _, k := range entity.EncryptedVariables { @@ -165,7 +165,7 @@ func (r *Repo) Items() map[string]*oapi.Release { log.Warn("Failed to assemble release", "release_id", row.ID, "error", err) continue } - result[release.ID()] = release + result[release.ContentHash()] = release } return result diff --git a/apps/workspace-engine/pkg/workspace/store/repository/memory/indexstore/schema_release.go b/apps/workspace-engine/pkg/workspace/store/repository/memory/indexstore/schema_release.go index c4278e13a..4ac7fbd11 100644 --- a/apps/workspace-engine/pkg/workspace/store/repository/memory/indexstore/schema_release.go +++ b/apps/workspace-engine/pkg/workspace/store/repository/memory/indexstore/schema_release.go @@ -30,7 +30,7 @@ func (r *ReleaseIDIndexer) FromObject(obj any) (bool, []byte, error) { if !ok { return false, nil, fmt.Errorf("expected *oapi.Release, got %T", obj) } - id := release.ID() + id := release.ContentHash() return true, []byte(id + "\x00"), nil } diff --git a/apps/workspace-engine/svc/controllers/desiredrelease/policyeval/adapters.go b/apps/workspace-engine/svc/controllers/desiredrelease/policyeval/adapters.go index 7a2061038..cead5e065 100644 --- a/apps/workspace-engine/svc/controllers/desiredrelease/policyeval/adapters.go +++ b/apps/workspace-engine/svc/controllers/desiredrelease/policyeval/adapters.go @@ -46,5 +46,5 @@ func (a *deployableVersionsAdapter) GetReleases() map[string]*oapi.Release { if release == nil { return nil } - return map[string]*oapi.Release{release.ID(): release} + return map[string]*oapi.Release{release.ContentHash(): release} } diff --git a/apps/workspace-engine/svc/controllers/desiredrelease/reconcile.go b/apps/workspace-engine/svc/controllers/desiredrelease/reconcile.go index 43f14ac64..0c1ebc606 100644 --- a/apps/workspace-engine/svc/controllers/desiredrelease/reconcile.go +++ b/apps/workspace-engine/svc/controllers/desiredrelease/reconcile.go @@ -71,7 +71,7 @@ func Reconcile(ctx context.Context, getter Getter, setter Setter, rt *ReleaseTar } span.SetAttributes( - attribute.String("release.id", release.ID()), + attribute.String("release.id", release.ContentHash()), attribute.Bool("has_desired_release", true), ) span.SetStatus(codes.Ok, "reconcile completed") diff --git a/apps/workspace-engine/svc/controllers/jobdispatch/reconcile.go b/apps/workspace-engine/svc/controllers/jobdispatch/reconcile.go index 6f4f49dde..1b2504e09 100644 --- a/apps/workspace-engine/svc/controllers/jobdispatch/reconcile.go +++ b/apps/workspace-engine/svc/controllers/jobdispatch/reconcile.go @@ -35,7 +35,7 @@ func Reconcile(ctx context.Context, getter Getter, setter Setter, verifier Agent span.AddEvent("no desired release") return &ReconcileResult{}, nil } - span.SetAttributes(attribute.String("release.id", release.ID())) + span.SetAttributes(attribute.String("release.id", release.ContentHash())) releaseID := release.UUID() @@ -111,7 +111,7 @@ func buildJob(release *oapi.Release, agent *oapi.JobAgent) *oapi.Job { now := time.Now() return &oapi.Job{ Id: uuid.New().String(), - ReleaseId: release.ID(), + ReleaseId: release.ContentHash(), JobAgentId: agent.Id, JobAgentConfig: agent.Config, Status: oapi.JobStatusPending, diff --git a/apps/workspace-engine/test/controllers/pipeline_test.go b/apps/workspace-engine/test/controllers/pipeline_test.go index a0a3621dd..f2a6f39ac 100644 --- a/apps/workspace-engine/test/controllers/pipeline_test.go +++ b/apps/workspace-engine/test/controllers/pipeline_test.go @@ -452,7 +452,7 @@ func TestPipeline_JobReferencesRelease(t *testing.T) { p.AssertJobCreated(t) release := p.Releases()[0] - p.AssertJobReleaseID(t, 0, release.ID()) + p.AssertJobReleaseID(t, 0, release.ContentHash()) } func TestRun_FullPipeline_WithJobDispatch(t *testing.T) { diff --git a/apps/workspace-engine/test/e2e/engine_job_verification_query_test.go b/apps/workspace-engine/test/e2e/engine_job_verification_query_test.go index 1571c9867..0bfd3ec65 100644 --- a/apps/workspace-engine/test/e2e/engine_job_verification_query_test.go +++ b/apps/workspace-engine/test/e2e/engine_job_verification_query_test.go @@ -88,7 +88,7 @@ func TestEngine_JobVerification_QueryByReleaseId(t *testing.T) { assert.Len(t, byJob, 1) // Query by release ID - byRelease := engine.Workspace().Store().JobVerifications.GetByReleaseId(release.ID()) + byRelease := engine.Workspace().Store().JobVerifications.GetByReleaseId(release.ContentHash()) assert.Len(t, byRelease, 1) assert.Equal(t, job.Id, byRelease[0].JobId) } diff --git a/apps/workspace-engine/test/e2e/engine_nil_release_handling_test.go b/apps/workspace-engine/test/e2e/engine_nil_release_handling_test.go index a1be9d11a..aa1488221 100644 --- a/apps/workspace-engine/test/e2e/engine_nil_release_handling_test.go +++ b/apps/workspace-engine/test/e2e/engine_nil_release_handling_test.go @@ -78,7 +78,7 @@ func TestEngine_JobsWithNilReleaseReference(t *testing.T) { // EDGE CASE 1: Manually remove the release but keep the job // This simulates a corrupted state where a job references a non-existent release - engine.Workspace().Releases().Remove(ctx, release.ID()) + engine.Workspace().Releases().Remove(ctx, release.ContentHash()) // Verify release is gone _, ok = engine.Workspace().Releases().Get(job.ReleaseId) @@ -173,7 +173,7 @@ func TestEngine_ReleaseTargetStateWithNilRelease(t *testing.T) { if !ok { t.Fatalf("release should exist") } - engine.Workspace().Releases().Remove(ctx, release.ID()) + engine.Workspace().Releases().Remove(ctx, release.ContentHash()) releaseTarget := &oapi.ReleaseTarget{ ResourceId: resource.Id, @@ -294,7 +294,7 @@ func TestEngine_MultipleJobsWithMixedNilReleases(t *testing.T) { t.Fatalf("release should exist") } - releaseIdToDelete := release.ID() + releaseIdToDelete := release.ContentHash() engine.Workspace().Releases().Remove(ctx, releaseIdToDelete) // Get jobs for release target - should only return jobs with valid releases diff --git a/apps/workspace-engine/test/e2e/engine_releasemanager_test.go b/apps/workspace-engine/test/e2e/engine_releasemanager_test.go index 48068b3f9..ef0d9664e 100644 --- a/apps/workspace-engine/test/e2e/engine_releasemanager_test.go +++ b/apps/workspace-engine/test/e2e/engine_releasemanager_test.go @@ -564,7 +564,7 @@ func TestEngine_ReleaseManager_MultipleResources(t *testing.T) { } if release.Version.Tag != "v3.0.0" { - t.Errorf("release %s has version tag %s, want v3.0.0", release.ID(), release.Version.Tag) + t.Errorf("release %s has version tag %s, want v3.0.0", release.ContentHash(), release.Version.Tag) } } diff --git a/apps/workspace-engine/test/e2e/engine_releasetarget_state_test.go b/apps/workspace-engine/test/e2e/engine_releasetarget_state_test.go index 0cfd164eb..5a3073dca 100644 --- a/apps/workspace-engine/test/e2e/engine_releasetarget_state_test.go +++ b/apps/workspace-engine/test/e2e/engine_releasetarget_state_test.go @@ -67,12 +67,12 @@ func TestEngine_ReleaseTargetState_NoCurrentNoDesired(t *testing.T) { // Verify: no current release (no successful jobs) if state.CurrentRelease != nil { - t.Errorf("expected no current release, got release %s", state.CurrentRelease.ID()) + t.Errorf("expected no current release, got release %s", state.CurrentRelease.ContentHash()) } // Verify: no desired release (no versions available) if state.DesiredRelease != nil { - t.Errorf("expected no desired release, got release %s", state.DesiredRelease.ID()) + t.Errorf("expected no desired release, got release %s", state.DesiredRelease.ContentHash()) } } @@ -137,7 +137,7 @@ func TestEngine_ReleaseTargetState_NoCurrentWithDesired(t *testing.T) { // Verify: no current release (job not completed yet) if state.CurrentRelease != nil { - t.Errorf("expected no current release, got release %s", state.CurrentRelease.ID()) + t.Errorf("expected no current release, got release %s", state.CurrentRelease.ContentHash()) } // Verify: desired release exists @@ -247,9 +247,9 @@ func TestEngine_ReleaseTargetState_CurrentMatchesDesired(t *testing.T) { } // Verify: releases are the same - if state.CurrentRelease.ID() != state.DesiredRelease.ID() { + if state.CurrentRelease.ContentHash() != state.DesiredRelease.ContentHash() { t.Errorf("expected current and desired releases to be the same, got current=%s, desired=%s", - state.CurrentRelease.ID(), state.DesiredRelease.ID()) + state.CurrentRelease.ContentHash(), state.DesiredRelease.ContentHash()) } } @@ -352,7 +352,7 @@ func TestEngine_ReleaseTargetState_CurrentDiffersFromDesired(t *testing.T) { } // Verify: releases are different - if state.CurrentRelease.ID() == state.DesiredRelease.ID() { + if state.CurrentRelease.ContentHash() == state.DesiredRelease.ContentHash() { t.Errorf("expected current and desired releases to differ") } } @@ -428,7 +428,7 @@ func TestEngine_ReleaseTargetState_JobStatusTransitions(t *testing.T) { t.Fatalf("failed to get release target state: %v", err) } if state.CurrentRelease != nil { - t.Errorf("expected no current release when job is pending, got release %s", state.CurrentRelease.ID()) + t.Errorf("expected no current release when job is pending, got release %s", state.CurrentRelease.ContentHash()) } // State 2: Job is InProgress - still no current release @@ -440,7 +440,7 @@ func TestEngine_ReleaseTargetState_JobStatusTransitions(t *testing.T) { t.Fatalf("failed to get release target state: %v", err) } if state.CurrentRelease != nil { - t.Errorf("expected no current release when job is in progress, got release %s", state.CurrentRelease.ID()) + t.Errorf("expected no current release when job is in progress, got release %s", state.CurrentRelease.ContentHash()) } // State 3: Job is Successful - current release should now exist @@ -619,7 +619,7 @@ func TestEngine_ReleaseTargetState_MultipleReleaseTargets(t *testing.T) { t.Fatalf("failed to get release target state for pending: %v", err) } if state2.CurrentRelease != nil { - t.Errorf("expected no current release for pending target, got release %s", state2.CurrentRelease.ID()) + t.Errorf("expected no current release for pending target, got release %s", state2.CurrentRelease.ContentHash()) } if state2.DesiredRelease == nil { t.Errorf("expected desired release for pending target, got nil") diff --git a/apps/workspace-engine/test/e2e/engine_verification_hooks_test.go b/apps/workspace-engine/test/e2e/engine_verification_hooks_test.go index 6193f89d8..2f4609e68 100644 --- a/apps/workspace-engine/test/e2e/engine_verification_hooks_test.go +++ b/apps/workspace-engine/test/e2e/engine_verification_hooks_test.go @@ -127,7 +127,7 @@ func TestEngineVerificationHooks(t *testing.T) { if releaseTargetState.CurrentRelease == nil { t.Fatalf("expected current release, got nil") } - assert.Equal(t, release.ID(), releaseTargetState.CurrentRelease.ID()) + assert.Equal(t, release.ContentHash(), releaseTargetState.CurrentRelease.ContentHash()) } func TestEngineVerificationHooks_SuccessThreshold(t *testing.T) { @@ -243,5 +243,5 @@ func TestEngineVerificationHooks_SuccessThreshold(t *testing.T) { if releaseTargetState.CurrentRelease == nil { t.Fatalf("expected current release, got nil") } - assert.Equal(t, release.ID(), releaseTargetState.CurrentRelease.ID()) + assert.Equal(t, release.ContentHash(), releaseTargetState.CurrentRelease.ContentHash()) } diff --git a/packages/workspace-engine-sdk/src/schema.ts b/packages/workspace-engine-sdk/src/schema.ts index 8125544ae..01d7c77c7 100644 --- a/packages/workspace-engine-sdk/src/schema.ts +++ b/packages/workspace-engine-sdk/src/schema.ts @@ -4,5134 +4,5213 @@ */ export interface paths { - "/v1/validate/resource-selector": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Validate a resource selector */ - post: operations["validateResourceSelector"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List workspace IDs - * @description Returns a list of workspace that are in memory. These could be inactive. - */ - get: operations["listWorkspaceIds"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/deployment-variable-values/{valueId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get deployment variable value - * @description Returns a specific deployment variable value by ID. - */ - get: operations["getDeploymentVariableValue"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/deployment-variables/{variableId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get deployment variable - * @description Returns a specific deployment variable by ID. - */ - get: operations["getDeploymentVariable"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/deployment-versions/{versionId}/jobs-list": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get deployment version jobs list - * @description Returns jobs grouped by environment and release target for a deployment version. - */ - get: operations["getDeploymentVersionJobsList"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/deployments": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List deployments - * @description Returns a paginated list of deployments for a workspace. - */ - get: operations["listDeployments"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/deployments/{deploymentId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get deployment - * @description Returns a specific deployment by ID. - */ - get: operations["getDeployment"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/deployments/{deploymentId}/policies": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get policies for a deployment - * @description Returns a list of resolved policies for a deployment. - */ - get: operations["getPoliciesForDeployment"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/deployments/{deploymentId}/release-targets": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get release targets for a deployment - * @description Returns a list of release targets for a deployment. - */ - get: operations["getReleaseTargetsForDeployment"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/deployments/{deploymentId}/resources": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get resources for a deployment - * @description Returns a paginated list of resources for deployment {deploymentId}. - */ - get: operations["getDeploymentResources"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/deployments/{deploymentId}/versions": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get versions for a deployment - * @description Returns a list of releases for a deployment. - */ - get: operations["getVersionsForDeployment"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/deploymentversions/{deploymentVersionId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get deployment version - * @description Returns a deployment version by ID. - */ - get: operations["getDeploymentVersion"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/entities/{relatableEntityType}/{entityId}/relations": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get related entities for a given entity - * @description Returns all entities related to the specified entity (deployment, environment, or resource) based on relationship rules. Relationships are grouped by relationship reference. - */ - get: operations["getRelatedEntities"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/environments": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List environments - * @description Returns a list of environments for a workspace. - */ - get: operations["listEnvironments"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/environments/{environmentId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get environment - * @description Returns a specific environment by ID. - */ - get: operations["getEnvironment"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/environments/{environmentId}/release-targets": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get release targets for an environment - * @description Returns a list of release targets for an environment. - */ - get: operations["getReleaseTargetsForEnvironment"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/environments/{environmentId}/resources": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get resources for an environment - * @description Returns a paginated list of resources for environment {environmentId}. - */ - get: operations["getEnvironmentResources"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/github-entities/{installationId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get GitHub entity by installation ID - * @description Returns a GitHub entity by installation ID. - */ - get: operations["getGitHubEntityByInstallationId"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/job-agents": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get job agents - * @description Returns a list of job agents. - */ - get: operations["getJobAgents"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/job-agents/{jobAgentId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get job agent - * @description Returns a specific job agent by ID. - */ - get: operations["getJobAgent"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/job-agents/{jobAgentId}/deployments": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get deployments for a job agent - * @description Returns a list of deployments for a job agent. - */ - get: operations["getDeploymentsForJobAgent"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/job-agents/{jobAgentId}/jobs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get jobs for a job agent - * @description Returns a list of jobs for a job agent. - */ - get: operations["getJobsForJobAgent"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/jobs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List jobs - * @description Returns a list of jobs. - */ - get: operations["getJobs"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/jobs/{jobId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get job - * @description Returns a specific job by ID. - */ - get: operations["getJob"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/jobs/{jobId}/with-release": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get job with release - * @description Returns a specific job by ID with its release. - */ - get: operations["getJobWithRelease"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/policies": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List policies - * @description Returns a list of policies for workspace {workspaceId}. - */ - get: operations["listPolicies"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/policies/evaluate": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Evaluate policies - * @description Evaluates all policies for a workspace. - */ - post: operations["evaluatePolicies"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/policies/{policyId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; + "/v1/validate/resource-selector": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Validate a resource selector */ + post: operations["validateResourceSelector"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List workspace IDs + * @description Returns a list of workspace that are in memory. These could be inactive. + */ + get: operations["listWorkspaceIds"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/deployment-variable-values/{valueId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get deployment variable value + * @description Returns a specific deployment variable value by ID. + */ + get: operations["getDeploymentVariableValue"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/deployment-variables/{variableId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get deployment variable + * @description Returns a specific deployment variable by ID. + */ + get: operations["getDeploymentVariable"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/deployment-versions/{versionId}/jobs-list": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get deployment version jobs list + * @description Returns jobs grouped by environment and release target for a deployment version. + */ + get: operations["getDeploymentVersionJobsList"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/deployments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List deployments + * @description Returns a paginated list of deployments for a workspace. + */ + get: operations["listDeployments"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/deployments/{deploymentId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get deployment + * @description Returns a specific deployment by ID. + */ + get: operations["getDeployment"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/deployments/{deploymentId}/policies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get policies for a deployment + * @description Returns a list of resolved policies for a deployment. + */ + get: operations["getPoliciesForDeployment"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/deployments/{deploymentId}/release-targets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get release targets for a deployment + * @description Returns a list of release targets for a deployment. + */ + get: operations["getReleaseTargetsForDeployment"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/deployments/{deploymentId}/resources": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get resources for a deployment + * @description Returns a paginated list of resources for deployment {deploymentId}. + */ + get: operations["getDeploymentResources"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/deployments/{deploymentId}/versions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get versions for a deployment + * @description Returns a list of releases for a deployment. + */ + get: operations["getVersionsForDeployment"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/deploymentversions/{deploymentVersionId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get deployment version + * @description Returns a deployment version by ID. + */ + get: operations["getDeploymentVersion"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/entities/{relatableEntityType}/{entityId}/relations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get related entities for a given entity + * @description Returns all entities related to the specified entity (deployment, environment, or resource) based on relationship rules. Relationships are grouped by relationship reference. + */ + get: operations["getRelatedEntities"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/environments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List environments + * @description Returns a list of environments for a workspace. + */ + get: operations["listEnvironments"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/environments/{environmentId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get environment + * @description Returns a specific environment by ID. + */ + get: operations["getEnvironment"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/environments/{environmentId}/release-targets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get release targets for an environment + * @description Returns a list of release targets for an environment. + */ + get: operations["getReleaseTargetsForEnvironment"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/environments/{environmentId}/resources": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get resources for an environment + * @description Returns a paginated list of resources for environment {environmentId}. + */ + get: operations["getEnvironmentResources"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/github-entities/{installationId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get GitHub entity by installation ID + * @description Returns a GitHub entity by installation ID. + */ + get: operations["getGitHubEntityByInstallationId"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/job-agents": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get job agents + * @description Returns a list of job agents. + */ + get: operations["getJobAgents"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/job-agents/{jobAgentId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get job agent + * @description Returns a specific job agent by ID. + */ + get: operations["getJobAgent"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/job-agents/{jobAgentId}/deployments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get deployments for a job agent + * @description Returns a list of deployments for a job agent. + */ + get: operations["getDeploymentsForJobAgent"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/job-agents/{jobAgentId}/jobs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get jobs for a job agent + * @description Returns a list of jobs for a job agent. + */ + get: operations["getJobsForJobAgent"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/jobs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List jobs + * @description Returns a list of jobs. + */ + get: operations["getJobs"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/jobs/{jobId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get job + * @description Returns a specific job by ID. + */ + get: operations["getJob"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/jobs/{jobId}/with-release": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get job with release + * @description Returns a specific job by ID with its release. + */ + get: operations["getJobWithRelease"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/policies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List policies + * @description Returns a list of policies for workspace {workspaceId}. + */ + get: operations["listPolicies"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/policies/evaluate": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Evaluate policies + * @description Evaluates all policies for a workspace. + */ + post: operations["evaluatePolicies"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/policies/{policyId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get policy + * @description Returns a specific policy by ID. + */ + get: operations["getPolicy"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/policies/{policyId}/release-targets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get release targets for a policy + * @description Returns a list of release targets for a policy {policyId}. + */ + get: operations["getReleaseTargetsForPolicy"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/policies/{policyId}/rules/{ruleId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get rule + * @description Returns a specific rule by ID. + */ + get: operations["getRule"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/policy-skips": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List policy skips for a workspace + * @description Returns a list of policy skips for workspace {workspaceId}. + */ + get: operations["listPolicySkips"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/policy-skips/environment/{environmentId}/version/{deploymentVersionId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get policy skips for an environment and version + * @description Returns a list of policy skips for an environment and version. + */ + get: operations["getPolicySkipsForEnvironmentAndVersion"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/policy-skips/{policySkipId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get policy skip by ID + * @description Returns a specific policy skip by ID. + */ + get: operations["getPolicySkip"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/relationship-rules": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get relationship rules for a given workspace + * @description Returns all relationship rules for the specified workspace. + */ + get: operations["getRelationshipRules"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/relationship-rules/{relationshipRuleId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get relationship rule */ + get: operations["getRelationshipRule"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/release-targets/evaluate": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Evaluate policies for a release target + * @description Evaluates all policies and rules that apply to a given release target and returns the evaluation results. + */ + post: operations["evaluateReleaseTarget"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/release-targets/resource-preview": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Preview release targets for a resource + * @description Simulates which release targets would be created if the given resource were added to the workspace. This is a dry-run endpoint — no resources or release targets are actually created. + */ + post: operations["previewReleaseTargetsForResource"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/release-targets/state": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Get release target states by deployment and environment + * @description Returns paginated release target states for a given deployment and environment. + */ + post: operations["getReleaseTargetStates"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/release-targets/{releaseTargetKey}/desired-release": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get the desired release for a release target + * @description Returns the desired release for a release target {releaseTargetKey}. + */ + get: operations["getReleaseTargetDesiredRelease"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/release-targets/{releaseTargetKey}/jobs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get jobs for a release target + * @description Returns a list of jobs for a release target {releaseTargetKey}. + */ + get: operations["getJobsForReleaseTarget"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/release-targets/{releaseTargetKey}/policies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get policies for a release target + * @description Returns a list of policies for a release target {releaseTargetId}. + */ + get: operations["getPoliciesForReleaseTarget"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/release-targets/{releaseTargetKey}/state": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get the state for a release target + * @description Returns the state for a release target {releaseTargetKey}. + */ + get: operations["getReleaseTargetState"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/releases/{releaseId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get release + * @description Returns a specific release by ID. + */ + get: operations["getRelease"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/releases/{releaseId}/verifications": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get release verifications + * @description Returns all verifications for jobs belonging to this release. + */ + get: operations["getReleaseVerifications"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/resource-providers": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get all resource providers */ + get: operations["getResourceProviders"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/resource-providers/cache-batch": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Cache a large resource batch for deferred processing + * @description Stores resources in memory and returns a batch ID. The batch is processed when a corresponding Kafka event is received. Uses Ristretto cache with 5-minute TTL. + */ + post: operations["cacheBatch"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/resource-providers/name/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get a resource provider by name */ + get: operations["getResourceProviderByName"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/resources/kinds": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get kinds for a workspace + * @description Returns a list of all resource kinds in a workspace. + */ + get: operations["getKindsForWorkspace"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/resources/query": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Query resources with CEL expression + * @description Returns paginated resources that match the provided CEL expression. Use the "resource" variable in your expression to access resource properties. + */ + post: operations["queryResources"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/resources/{resourceIdentifier}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get resource by identifier + * @description Returns a specific resource by its identifier. + */ + get: operations["getResourceByIdentifier"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/resources/{resourceIdentifier}/deployments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get deployments for a resource + * @description Returns a paginated list of deployments that match the given resource. + */ + get: operations["getDeploymentsForResource"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/resources/{resourceIdentifier}/relationships": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get relationships for a resource + * @description Returns all relationships for the specified resource. + */ + get: operations["getRelationshipsForResource"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/resources/{resourceIdentifier}/release-targets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get release targets for a resource + * @description Returns a list of release targets for a resource. + */ + get: operations["getReleaseTargetsForResource"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/resources/{resourceIdentifier}/release-targets/deployment/{deploymentId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get release target for a resource in a deployment + * @description Returns a release target for a resource in a deployment. + */ + get: operations["getReleaseTargetForResourceInDeployment"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/resources/{resourceIdentifier}/variables": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get variables for a resource + * @description Returns a list of variables for a resource + */ + get: operations["getVariablesForResource"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get engine status + * @description Returns the status of the engine. + */ + get: operations["getEngineStatus"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/systems": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List systems + * @description Returns a list of systems for a workspace. + */ + get: operations["listSystems"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/systems/{systemId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get system + * @description Returns a specific system by ID. + */ + get: operations["getSystem"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/systems/{systemId}/deployments/{deploymentId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get deployment system link + * @description Returns a specific deployment system link by ID. + */ + get: operations["getDeploymentSystemLink"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/systems/{systemId}/environments/{environmentId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get environment system link + * @description Returns a specific environment system link by ID. + */ + get: operations["getEnvironmentSystemLink"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/workflows": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List workflows + * @description Returns a list of workflows. + */ + get: operations["listWorkflows"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/workflows/{workflowId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a workflow + * @description Gets a workflow by ID. + */ + get: operations["getWorkflow"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/workflows/{workflowId}/runs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get all workflow runs for a workflow + * @description Gets all workflow runs for a workflow by ID. + */ + get: operations["getWorkflowRuns"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + AnyApprovalRule: { + /** Format: int32 */ + minApprovals: number; + }; + /** @enum {string} */ + ApprovalStatus: "approved" | "rejected"; + ArgoCDJobAgentConfig: { + /** @description ArgoCD API token. */ + apiKey: string; + /** @description ArgoCD server address (host[:port] or URL). */ + serverUrl: string; + /** @description ArgoCD application template. */ + template: string; + }; + BooleanValue: boolean; + CelMatcher: { + cel: string; + }; + CelSelector: { + cel: string; + }; + DatadogMetricProvider: { + /** + * @description Datadog aggregator + * @default last + * @enum {string} + */ + aggregator: + | "avg" + | "min" + | "max" + | "sum" + | "last" + | "percentile" + | "mean" + | "l2norm" + | "area"; + /** + * @description Datadog API key (supports Go templates for variable references) + * @example {{.variables.dd_api_key}} + */ + apiKey: string; + /** + * @description Datadog Application key (supports Go templates for variable references) + * @example {{.variables.dd_app_key}} + */ + appKey: string; + /** @description Datadog formula (supports Go templates) */ + formula?: string; + /** + * Format: int64 + * @example 30 + */ + intervalSeconds?: number; + /** + * @description Datadog metrics queries (supports Go templates) + * @example { + * "q": "sum:requests.error.rate{service:{{.resource.name}}}" + * } + */ + queries: { + [key: string]: string; + }; + /** + * @description Datadog site URL (e.g., datadoghq.com, datadoghq.eu, us3.datadoghq.com) + * @default datadoghq.com + */ + site: string; + /** + * @description Provider type (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: "datadog"; + }; + DeployDecision: { + policyResults: components["schemas"]["PolicyEvaluation"][]; + }; + Deployment: { + description?: string; + id: string; + jobAgentConfig: components["schemas"]["JobAgentConfig"]; + jobAgentId?: string; + jobAgents?: components["schemas"]["DeploymentJobAgent"][]; + metadata: { + [key: string]: string; + }; + name: string; + resourceSelector?: components["schemas"]["Selector"]; + slug: string; + }; + DeploymentAndSystems: { + deployment: components["schemas"]["Deployment"]; + systems: components["schemas"]["System"][]; + }; + DeploymentDependencyRule: { + /** @description CEL expression to match upstream deployment(s) that must have a successful release before this deployment can proceed. */ + dependsOn: string; + }; + DeploymentJobAgent: { + config: components["schemas"]["JobAgentConfig"]; + ref: string; + /** @description CEL expression to determine if the job agent should be used */ + selector: string; + }; + DeploymentVariable: { + defaultValue?: components["schemas"]["LiteralValue"]; + deploymentId: string; + description?: string; + id: string; + key: string; + }; + DeploymentVariableValue: { + deploymentVariableId: string; + id: string; + /** Format: int64 */ + priority: number; + resourceSelector?: components["schemas"]["Selector"]; + value: components["schemas"]["Value"]; + }; + DeploymentVariableWithValues: { + values: components["schemas"]["DeploymentVariableValue"][]; + variable: components["schemas"]["DeploymentVariable"]; + }; + DeploymentVersion: { + config: { + [key: string]: unknown; + }; + /** Format: date-time */ + createdAt: string; + deploymentId: string; + id: string; + jobAgentConfig: components["schemas"]["JobAgentConfig"]; + message?: string; + metadata: { + [key: string]: string; + }; + name: string; + status: components["schemas"]["DeploymentVersionStatus"]; + tag: string; + }; + /** @enum {string} */ + DeploymentVersionStatus: + | "unspecified" + | "building" + | "ready" + | "failed" + | "rejected" + | "paused"; + DeploymentWindowRule: { + /** + * @description If true, deployments are only allowed during the window. If false, deployments are blocked during the window (deny window) + * @default true + */ + allowWindow: boolean; + /** + * Format: int32 + * @description Duration of each deployment window in minutes + */ + durationMinutes: number; + /** @description RFC 5545 recurrence rule defining when deployment windows start (e.g., FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;BYHOUR=9) */ + rrule: string; + /** @description IANA timezone for the rrule (e.g., America/New_York). Defaults to UTC if not specified */ + timezone?: string; + }; + DeploymentWithVariablesAndSystems: { + deployment: components["schemas"]["Deployment"]; + systems: components["schemas"]["System"][]; + variables: components["schemas"]["DeploymentVariableWithValues"][]; + }; + DispatchContext: { + deployment?: components["schemas"]["Deployment"]; + environment?: components["schemas"]["Environment"]; + jobAgent: components["schemas"]["JobAgent"]; + jobAgentConfig: components["schemas"]["JobAgentConfig"]; + release?: components["schemas"]["Release"]; + resource?: components["schemas"]["Resource"]; + variables?: { + [key: string]: components["schemas"]["LiteralValue"]; + }; + version?: components["schemas"]["DeploymentVersion"]; + workflow?: components["schemas"]["Workflow"]; + workflowJob?: components["schemas"]["WorkflowJob"]; + workflowRun?: components["schemas"]["WorkflowRun"]; + }; + EntityRelation: { + direction: components["schemas"]["RelationDirection"]; + entity: components["schemas"]["RelatableEntity"]; + /** @description ID of the related entity */ + entityId: string; + entityType: components["schemas"]["RelatableEntityType"]; + rule: components["schemas"]["RelationshipRule"]; + }; + Environment: { + /** Format: date-time */ + createdAt: string; + description?: string; + id: string; + metadata: { + [key: string]: string; + }; + name: string; + resourceSelector?: components["schemas"]["Selector"]; + }; + EnvironmentProgressionRule: { + dependsOnEnvironmentSelector: components["schemas"]["Selector"]; + /** + * Format: int32 + * @description Maximum age of dependency deployment before blocking progression (prevents stale promotions) + */ + maximumAgeHours?: number; + /** + * Format: int32 + * @description Minimum time to wait after the depends on environment is in a success state before the current environment can be deployed + * @default 0 + */ + minimumSockTimeMinutes: number; + /** + * Format: float + * @default 100 + */ + minimumSuccessPercentage: number; + successStatuses?: components["schemas"]["JobStatus"][]; + }; + EnvironmentSummary: { + id: string; + name: string; + }; + EnvironmentWithSystems: components["schemas"]["Environment"] & { + systems: components["schemas"]["System"][]; + }; + ErrorResponse: { + /** @example Workspace not found */ + error?: string; + }; + EvaluateReleaseTargetRequest: { + releaseTarget: components["schemas"]["ReleaseTarget"]; + version: components["schemas"]["DeploymentVersion"]; + }; + EvaluationScope: { + environmentId?: string; + versionId?: string; + }; + GithubEntity: { + installationId: number; + slug: string; + }; + GithubJobAgentConfig: { + /** + * Format: int + * @description GitHub app installation ID. + */ + installationId: number; + /** @description GitHub repository owner. */ + owner: string; + /** @description Git ref to run the workflow on (defaults to "main" if omitted). */ + ref?: string; + /** @description GitHub repository name. */ + repo: string; + /** + * Format: int64 + * @description GitHub Actions workflow ID. + */ + workflowId: number; + }; + GradualRolloutRule: { + /** + * @description Strategy for scheduling deployments to release targets. "linear": Each target is deployed at a fixed interval of timeScaleInterval seconds. "linear-normalized": Deployments are spaced evenly so that the last target is scheduled at or before timeScaleInterval seconds. See rolloutType algorithm documentation for details. + * @enum {string} + */ + rolloutType: "linear" | "linear-normalized"; + /** + * Format: int32 + * @description Base time interval in seconds used to compute the delay between deployments to release targets. + */ + timeScaleInterval: number; + }; + HTTPMetricProvider: { + /** @description Request body (supports Go templates) */ + body?: string; + /** @description HTTP headers (values support Go templates) */ + headers?: { + [key: string]: string; + }; + /** + * @description HTTP method + * @default GET + * @enum {string} + */ + method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS"; + /** + * @description Request timeout (duration string, e.g., "30s") + * @default 30s + */ + timeout: string; + /** + * @description Provider type (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: "http"; + /** + * @description HTTP endpoint URL (supports Go templates) + * @example http://{{ .resource.name }}.{{ .environment.name }}/health + */ + url: string; + }; + IntegerValue: number; + Job: { + /** Format: date-time */ + completedAt?: string; + /** Format: date-time */ + createdAt: string; + dispatchContext?: components["schemas"]["DispatchContext"]; + externalId?: string; + id: string; + jobAgentConfig: components["schemas"]["JobAgentConfig"]; + jobAgentId: string; + message?: string; + metadata: { + [key: string]: string; + }; + releaseId: string; + /** Format: date-time */ + startedAt?: string; + status: components["schemas"]["JobStatus"]; + traceToken?: string; + /** Format: date-time */ + updatedAt: string; + workflowJobId: string; + }; + JobAgent: { + config: components["schemas"]["JobAgentConfig"]; + id: string; + metadata?: { + [key: string]: string; + }; + name: string; + type: string; + workspaceId: string; + }; + JobAgentConfig: { + [key: string]: unknown; + }; + /** @enum {string} */ + JobStatus: + | "cancelled" + | "skipped" + | "inProgress" + | "actionRequired" + | "pending" + | "failure" + | "invalidJobAgent" + | "invalidIntegration" + | "externalRunNotFound" + | "successful"; + JobSummary: { + id: string; + /** @description External links extracted from job metadata */ + links?: { + [key: string]: string; + }; + message?: string; + status: components["schemas"]["JobStatus"]; + verifications: components["schemas"]["JobVerification"][]; + }; + JobUpdateEvent: { + agentId?: string; + externalId?: string; + fieldsToUpdate?: ( + | "completedAt" + | "createdAt" + | "dispatchContext" + | "externalId" + | "id" + | "jobAgentConfig" + | "jobAgentId" + | "message" + | "metadata" + | "releaseId" + | "startedAt" + | "status" + | "traceToken" + | "updatedAt" + | "workflowJobId" + )[]; + id?: string; + job: components["schemas"]["Job"]; + } & (unknown | unknown); + JobVerification: { + /** + * Format: date-time + * @description When verification was created + */ + createdAt: string; + id: string; + jobId: string; + /** @description Summary message of verification result */ + message?: string; + /** @description Metrics associated with this verification */ + metrics: components["schemas"]["VerificationMetricStatus"][]; + }; + /** @enum {string} */ + JobVerificationStatus: "running" | "passed" | "failed" | "cancelled"; + JobWithRelease: { + deployment?: components["schemas"]["Deployment"]; + environment?: components["schemas"]["Environment"]; + job: components["schemas"]["Job"]; + release: components["schemas"]["Release"]; + resource?: components["schemas"]["Resource"]; + }; + JobWithVerifications: { + job: components["schemas"]["Job"]; + verifications: components["schemas"]["JobVerification"][]; + }; + JsonSelector: { + json: { + [key: string]: unknown; + }; + }; + LiteralValue: + | components["schemas"]["BooleanValue"] + | components["schemas"]["NumberValue"] + | components["schemas"]["IntegerValue"] + | components["schemas"]["StringValue"] + | components["schemas"]["ObjectValue"] + | components["schemas"]["NullValue"]; + MetricProvider: + | components["schemas"]["HTTPMetricProvider"] + | components["schemas"]["SleepMetricProvider"] + | components["schemas"]["DatadogMetricProvider"] + | components["schemas"]["PrometheusMetricProvider"] + | components["schemas"]["TerraformCloudRunMetricProvider"]; + /** @enum {boolean} */ + NullValue: true; + NumberValue: number; + ObjectValue: { + object: { + [key: string]: unknown; + }; + }; + Policy: { + createdAt: string; + description?: string; + enabled: boolean; + id: string; + /** @description Arbitrary metadata for the policy (record) */ + metadata: { + [key: string]: string; + }; + name: string; + priority: number; + rules: components["schemas"]["PolicyRule"][]; + /** @description CEL expression for matching release targets. Use "true" to match all targets. */ + selector: string; + workspaceId: string; + }; + PolicyEvaluation: { + policy?: components["schemas"]["Policy"]; + ruleResults: components["schemas"]["RuleEvaluation"][]; + summary?: string; + }; + PolicyRule: { + anyApproval?: components["schemas"]["AnyApprovalRule"]; + createdAt: string; + deploymentDependency?: components["schemas"]["DeploymentDependencyRule"]; + deploymentWindow?: components["schemas"]["DeploymentWindowRule"]; + environmentProgression?: components["schemas"]["EnvironmentProgressionRule"]; + gradualRollout?: components["schemas"]["GradualRolloutRule"]; + id: string; + policyId: string; + retry?: components["schemas"]["RetryRule"]; + rollback?: components["schemas"]["RollbackRule"]; + verification?: components["schemas"]["VerificationRule"]; + versionCooldown?: components["schemas"]["VersionCooldownRule"]; + versionSelector?: components["schemas"]["VersionSelectorRule"]; + }; + PolicySkip: { + /** + * Format: date-time + * @description When this skip was created + */ + createdAt: string; + /** @description User ID who created this skip */ + createdBy: string; + /** @description Environment this skip applies to. If null, applies to all environments. */ + environmentId?: string; + /** + * Format: date-time + * @description When this skip expires. If null, skip never expires. + */ + expiresAt?: string; + /** @description Unique identifier for the skip */ + id: string; + /** @description Required reason for why this skip is needed (e.g., incident ticket, emergency situation) */ + reason: string; + /** @description Resource this skip applies to. If null, applies to all resources (in the environment if specified, or globally). */ + resourceId?: string; + /** @description Rule ID this skip applies to */ + ruleId: string; + /** @description Deployment version this skip applies to */ + versionId: string; + /** @description Workspace this skip belongs to */ + workspaceId: string; + }; + PrometheusMetricProvider: { + /** + * @description Prometheus server address (supports Go templates) + * @example http://prometheus.example.com:9090 + */ + address: string; + /** @description Authentication configuration for Prometheus */ + authentication?: { /** - * Get policy - * @description Returns a specific policy by ID. + * @description Bearer token for authentication (supports Go templates for variable references) + * @example {{.variables.prometheus_token}} */ - get: operations["getPolicy"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/policies/{policyId}/release-targets": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; + bearerToken?: string; + /** @description OAuth2 client credentials flow */ + oauth2?: { + /** @description OAuth2 client ID (supports Go templates) */ + clientId: string; + /** @description OAuth2 client secret (supports Go templates) */ + clientSecret: string; + /** @description OAuth2 scopes */ + scopes?: string[]; + /** @description Token endpoint URL */ + tokenUrl: string; + }; + }; + /** @description Additional HTTP headers for the Prometheus request (values support Go templates) */ + headers?: { + /** @example X-Scope-OrgID */ + key: string; + /** @example tenant_a */ + value: string; + }[]; + /** + * @description Skip TLS certificate verification + * @default false + */ + insecure: boolean; + /** + * @description PromQL query expression (supports Go templates) + * @example sum(irate(istio_requests_total{reporter="source",destination_service=~"{{.resource.name}}",response_code!~"5.*"}[5m])) + */ + query: string; + /** @description If provided, a range query (/api/v1/query_range) is used instead of an instant query (/api/v1/query) */ + rangeQuery?: { /** - * Get release targets for a policy - * @description Returns a list of release targets for a policy {policyId}. + * @description How far back from now for the query end, as a Prometheus duration (e.g., "0s" for now, "1m" for 1 minute ago). Defaults to "0s" (now) if unset. + * @example 0s */ - get: operations["getReleaseTargetsForPolicy"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/policies/{policyId}/rules/{ruleId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; + end?: string; /** - * Get rule - * @description Returns a specific rule by ID. + * @description How far back from now to start the query, as a Prometheus duration (e.g., "5m", "1h"). Defaults to 10 * step if unset. + * @example 5m */ - get: operations["getRule"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/policy-skips": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; + start?: string; /** - * List policy skips for a workspace - * @description Returns a list of policy skips for workspace {workspaceId}. + * @description Query resolution step width as a Prometheus duration (e.g., "15s", "1m", "500ms") + * @example 1m */ - get: operations["listPolicySkips"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/policy-skips/environment/{environmentId}/version/{deploymentVersionId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + step: string; + }; + /** + * Format: int64 + * @description Query timeout in seconds + * @example 30 + */ + timeout?: number; + /** + * @description Provider type (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: "prometheus"; + }; + PropertiesMatcher: { + properties: components["schemas"]["PropertyMatcher"][]; + }; + PropertyMatcher: { + fromProperty: string[]; + /** @enum {string} */ + operator: + | "equals" + | "notEquals" + | "contains" + | "startsWith" + | "endsWith" + | "regex"; + toProperty: string[]; + }; + ReferenceValue: { + path: string[]; + reference: string; + }; + RelatableEntity: + | components["schemas"]["Deployment"] + | components["schemas"]["Environment"] + | components["schemas"]["Resource"]; + /** @enum {string} */ + RelatableEntityType: "deployment" | "environment" | "resource"; + /** @enum {string} */ + RelationDirection: "from" | "to"; + RelationshipRule: { + description?: string; + fromSelector?: components["schemas"]["Selector"]; + fromType: components["schemas"]["RelatableEntityType"]; + id: string; + matcher: + | components["schemas"]["CelMatcher"] + | components["schemas"]["PropertiesMatcher"]; + metadata: { + [key: string]: string; + }; + name: string; + reference: string; + relationshipType: string; + toSelector?: components["schemas"]["Selector"]; + toType: components["schemas"]["RelatableEntityType"]; + workspaceId: string; + }; + Release: { + createdAt: string; + encryptedVariables: string[]; + /** Format: uuid */ + id: string; + releaseTarget: components["schemas"]["ReleaseTarget"]; + variables: { + [key: string]: components["schemas"]["LiteralValue"]; + }; + version: components["schemas"]["DeploymentVersion"]; + }; + ReleaseTarget: { + deploymentId: string; + environmentId: string; + resourceId: string; + }; + ReleaseTargetAndState: { + releaseTarget: components["schemas"]["ReleaseTarget"]; + state: components["schemas"]["ReleaseTargetState"]; + }; + ReleaseTargetPreview: { + deployment: components["schemas"]["Deployment"]; + environment: components["schemas"]["Environment"]; + system: components["schemas"]["System"]; + }; + ReleaseTargetState: { + currentRelease?: components["schemas"]["Release"]; + desiredRelease?: components["schemas"]["Release"]; + latestJob?: components["schemas"]["JobWithVerifications"]; + }; + ReleaseTargetSummary: { + currentVersion?: components["schemas"]["VersionSummary"]; + desiredVersion?: components["schemas"]["VersionSummary"]; + environment: components["schemas"]["EnvironmentSummary"]; + latestJob?: components["schemas"]["JobSummary"]; + releaseTarget: components["schemas"]["ReleaseTarget"]; + resource: components["schemas"]["ResourceSummary"]; + }; + ReleaseTargetWithState: { + deployment: components["schemas"]["Deployment"]; + environment: components["schemas"]["Environment"]; + releaseTarget: components["schemas"]["ReleaseTarget"]; + resource: components["schemas"]["Resource"]; + state: components["schemas"]["ReleaseTargetState"]; + }; + ResolvedPolicy: { + environmentIds: string[]; + policy: components["schemas"]["Policy"]; + releaseTargets: components["schemas"]["ReleaseTarget"][]; + }; + Resource: { + config: { + [key: string]: unknown; + }; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + deletedAt?: string; + id: string; + identifier: string; + kind: string; + /** Format: date-time */ + lockedAt?: string; + metadata: { + [key: string]: string; + }; + name: string; + providerId?: string; + /** Format: date-time */ + updatedAt?: string; + version: string; + workspaceId: string; + }; + ResourcePreviewRequest: { + config: { + [key: string]: unknown; + }; + identifier: string; + kind: string; + metadata: { + [key: string]: string; + }; + name: string; + version: string; + }; + ResourceProvider: { + /** Format: date-time */ + createdAt: string; + id: string; + metadata: { + [key: string]: string; + }; + name: string; + /** Format: uuid */ + workspaceId: string; + }; + ResourceSummary: { + id: string; + identifier: string; + kind: string; + name: string; + version: string; + }; + ResourceVariable: { + key: string; + resourceId: string; + value: components["schemas"]["Value"]; + }; + ResourceVariablesBulkUpdateEvent: { + resourceId: string; + variables: { + [key: string]: unknown; + }; + }; + RetryRule: { + /** + * Format: int32 + * @description Minimum seconds to wait between retry attempts. If null, retries are allowed immediately after job completion. + */ + backoffSeconds?: number; + /** + * @description Backoff strategy: "linear" uses constant backoffSeconds delay, "exponential" doubles the delay with each retry (backoffSeconds * 2^(attempt-1)). + * @default linear + * @enum {string} + */ + backoffStrategy: "linear" | "exponential"; + /** + * Format: int32 + * @description Maximum backoff time in seconds (cap for exponential backoff). If null, no maximum is enforced. + */ + maxBackoffSeconds?: number; + /** + * Format: int32 + * @description Maximum number of retries allowed. 0 means no retries (1 attempt total), 3 means up to 4 attempts (1 initial + 3 retries). + */ + maxRetries: number; + /** @description Job statuses that count toward the retry limit. If null or empty, defaults to ["failure", "invalidIntegration", "invalidJobAgent"] for maxRetries > 0, or ["failure", "invalidIntegration", "invalidJobAgent", "successful"] for maxRetries = 0. Cancelled and skipped jobs never count by default (allows redeployment after cancellation). Example: ["failure", "cancelled"] will only count failed/cancelled jobs. */ + retryOnStatuses?: components["schemas"]["JobStatus"][]; + }; + RollbackRule: { + /** @description Job statuses that will trigger a rollback */ + onJobStatuses?: components["schemas"]["JobStatus"][]; + /** + * @description If true, a release target will be rolled back if the verification fails + * @default false + */ + onVerificationFailure: boolean; + }; + RuleEvaluation: { + /** @description Whether the rule requires an action (e.g., approval, wait) */ + actionRequired: boolean; + /** + * @description Type of action required + * @enum {string} + */ + actionType?: "approval" | "wait"; + /** @description Whether the rule allows the deployment */ + allowed: boolean; + /** @description Additional details about the rule evaluation */ + details: { + [key: string]: unknown; + }; + /** @description Human-readable explanation of the rule result */ + message: string; + /** + * Format: date-time + * @description The time when this rule should be re-evaluated (e.g., when soak time will be complete, when gradual rollout schedule is due) + */ + nextEvaluationTime?: string; + /** @description The ID of the rule that was evaluated */ + ruleId: string; + /** + * Format: date-time + * @description The time when the rule requirement was satisfied (e.g., when approvals were met, soak time completed) + */ + satisfiedAt?: string; + }; + Selector: + | components["schemas"]["JsonSelector"] + | components["schemas"]["CelSelector"]; + SensitiveValue: { + valueHash: string; + }; + SleepMetricProvider: { + /** + * Format: int32 + * @example 30 + */ + durationSeconds: number; + /** + * @description Provider type (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: "sleep"; + }; + StringValue: string; + System: { + description?: string; + id: string; + metadata?: { + [key: string]: string; + }; + name: string; + workspaceId: string; + }; + SystemDeploymentLink: { + deploymentId: string; + systemId: string; + }; + SystemEnvironmentLink: { + environmentId: string; + systemId: string; + }; + TerraformCloudJobAgentConfig: { + /** @description Terraform Cloud address (e.g. https://app.terraform.io). */ + address: string; + /** @description Terraform Cloud organization name. */ + organization: string; + /** @description Terraform Cloud workspace template. */ + template: string; + /** @description Terraform Cloud API token. */ + token: string; + }; + TerraformCloudRunMetricProvider: { + /** + * @description Terraform Cloud address + * @example https://app.terraform.io + */ + address: string; + /** + * @description Terraform Cloud run ID + * @example run-1234567890 + */ + runId: string; + /** + * @description Terraform Cloud token + * @example {{.variables.terraform_cloud_token}} + */ + token: string; + /** + * @description Provider type (enum property replaced by openapi-typescript) + * @enum {string} + */ + type: "terraformCloudRun"; + }; + TestRunnerJobAgentConfig: { + /** + * Format: int + * @description Delay in seconds before resolving the job. + */ + delaySeconds?: number; + /** @description Optional message to include in the job output. */ + message?: string; + /** @description Final status to set (e.g. "successful", "failure"). */ + status?: string; + }; + UserApprovalRecord: { + createdAt: string; + environmentId: string; + reason?: string; + status: components["schemas"]["ApprovalStatus"]; + userId: string; + versionId: string; + }; + Value: + | components["schemas"]["LiteralValue"] + | components["schemas"]["ReferenceValue"] + | components["schemas"]["SensitiveValue"]; + VerificationMeasurement: { + /** @description Raw measurement data */ + data?: { + [key: string]: unknown; + }; + /** + * Format: date-time + * @description When measurement was taken + */ + measuredAt: string; + /** @description Measurement result message */ + message?: string; + status: components["schemas"]["VerificationMeasurementStatus"]; + }; + /** + * @description Status of a verification measurement + * @enum {string} + */ + VerificationMeasurementStatus: "passed" | "failed" | "inconclusive"; + VerificationMetricSpec: { + /** @description Number of measurements to take */ + count: number; + /** + * @description CEL expression to evaluate measurement failure (e.g., "result.statusCode == 500"), if not provided, a failure is just the opposite of the success condition + * @example result.statusCode == 500 + */ + failureCondition?: string; + /** + * @description Stop after this many consecutive failures (0 = no limit) + * @default 0 + */ + failureThreshold: number; + /** + * Format: int32 + * @description Interval between measurements in seconds + * @example 30 + */ + intervalSeconds: number; + /** @description Name of the verification metric */ + name: string; + provider: components["schemas"]["MetricProvider"]; + /** + * @description CEL expression to evaluate measurement success (e.g., "result.statusCode == 200") + * @example result.statusCode == 200 + */ + successCondition: string; + /** + * @description Minimum number of consecutive successful measurements required to consider the metric successful + * @example 0 + */ + successThreshold?: number; + }; + VerificationMetricStatus: components["schemas"]["VerificationMetricSpec"] & { + /** @description Individual verification measurements taken for this metric */ + measurements: components["schemas"]["VerificationMeasurement"][]; + }; + VerificationRule: { + /** @description Metrics to verify */ + metrics: components["schemas"]["VerificationMetricSpec"][]; + /** + * @description When to trigger verification + * @default jobSuccess + * @enum {string} + */ + triggerOn: "jobCreated" | "jobStarted" | "jobSuccess" | "jobFailure"; + }; + VersionCooldownRule: { + /** + * Format: int32 + * @description Minimum time in seconds that must pass since the currently deployed (or in-progress) version was created before allowing another deployment. This enables batching of frequent upstream releases into periodic deployments. + */ + intervalSeconds: number; + }; + VersionSelectorRule: { + /** @description Human-readable description of what this version selector does. Example: "Only deploy v2.x versions to staging environments" */ + description?: string; + selector: components["schemas"]["Selector"]; + }; + VersionSummary: { + id: string; + name: string; + tag: string; + }; + Workflow: { + id: string; + inputs: components["schemas"]["WorkflowInput"][]; + jobs: components["schemas"]["WorkflowJobTemplate"][]; + name: string; + }; + WorkflowArrayInput: + | components["schemas"]["WorkflowManualArrayInput"] + | components["schemas"]["WorkflowSelectorArrayInput"]; + WorkflowBooleanInput: { + default?: boolean; + key: string; + /** @enum {string} */ + type: "boolean"; + }; + WorkflowInput: + | components["schemas"]["WorkflowStringInput"] + | components["schemas"]["WorkflowNumberInput"] + | components["schemas"]["WorkflowBooleanInput"] + | components["schemas"]["WorkflowArrayInput"] + | components["schemas"]["WorkflowObjectInput"]; + WorkflowJob: { + /** @description Configuration for the job agent */ + config: { + [key: string]: unknown; + }; + id: string; + index: number; + /** @description Reference to the job agent */ + ref: string; + workflowRunId: string; + }; + WorkflowJobAgentConfig: { + config: { + [key: string]: unknown; + }; + id: string; + }; + WorkflowJobMatrix: { + [key: string]: + | { + [key: string]: unknown; + }[] + | string; + }; + WorkflowJobTemplate: { + /** @description Configuration for the job agent */ + config: { + [key: string]: unknown; + }; + id: string; + /** @description CEL expression to determine if the job should run */ + if?: string; + matrix?: components["schemas"]["WorkflowJobMatrix"]; + name: string; + /** @description Reference to the job agent */ + ref: string; + workflowId: string; + }; + WorkflowJobWithJobs: components["schemas"]["WorkflowJob"] & { + jobs: components["schemas"]["Job"][]; + }; + WorkflowManualArrayInput: { + default?: { + [key: string]: unknown; + }[]; + key: string; + /** @enum {string} */ + type: "array"; + }; + WorkflowNumberInput: { + default?: number; + key: string; + /** @enum {string} */ + type: "number"; + }; + WorkflowObjectInput: { + default?: { + [key: string]: unknown; + }; + key: string; + /** @enum {string} */ + type: "object"; + }; + WorkflowRun: { + id: string; + inputs: { + [key: string]: unknown; + }; + workflowId: string; + }; + WorkflowRunWithJobs: components["schemas"]["WorkflowRun"] & { + jobs: components["schemas"]["WorkflowJobWithJobs"][]; + }; + WorkflowSelectorArrayInput: { + key: string; + selector: { + default?: components["schemas"]["Selector"]; + /** @enum {string} */ + entityType: "resource" | "environment" | "deployment"; + }; + /** @enum {string} */ + type: "array"; + }; + WorkflowStringInput: { + default?: string; + key: string; + /** @enum {string} */ + type: "string"; + }; + }; + responses: never; + parameters: { + /** @description Type of the entity (deployment, environment, or resource) */ + relatableEntityType: components["schemas"]["RelatableEntityType"]; + }; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + validateResourceSelector: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + resourceSelector?: components["schemas"]["Selector"]; + }; + }; + }; + responses: { + /** @description The validated resource selector */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + errors: string[]; + valid: boolean; + }; + }; + }; + }; + }; + listWorkspaceIds: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of workspace IDs */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + workspaceIds?: string[]; + }; + }; + }; + }; + }; + getDeploymentVariableValue: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the deployment variable value */ + valueId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested deployment variable value */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["DeploymentVariableValue"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getDeploymentVariable: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the deployment variable */ + variableId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested deployment variable */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["DeploymentVariableWithValues"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getDeploymentVersionJobsList: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the deployment version */ + versionId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Jobs list grouped by environment and release target */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + environment: components["schemas"]["Environment"]; + releaseTargets: { + deployment: components["schemas"]["Deployment"]; + deploymentId: string; + environment: components["schemas"]["Environment"]; + environmentId: string; + id: string; + jobs: { + /** Format: date-time */ + createdAt: string; + externalId?: string; + id: string; + metadata: { + [key: string]: string; + }; + status: components["schemas"]["JobStatus"]; + }[]; + resource: components["schemas"]["Resource"]; + resourceId: string; + }[]; + }[]; }; - /** - * Get policy skips for an environment and version - * @description Returns a list of policy skips for an environment and version. - */ - get: operations["getPolicySkipsForEnvironmentAndVersion"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/policy-skips/{policySkipId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; }; - /** - * Get policy skip by ID - * @description Returns a specific policy skip by ID. - */ - get: operations["getPolicySkip"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/relationship-rules": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; - /** - * Get relationship rules for a given workspace - * @description Returns all relationship rules for the specified workspace. - */ - get: operations["getRelationshipRules"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/relationship-rules/{relationshipRuleId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get relationship rule */ - get: operations["getRelationshipRule"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/release-targets/evaluate": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Evaluate policies for a release target - * @description Evaluates all policies and rules that apply to a given release target and returns the evaluation results. - */ - post: operations["evaluateReleaseTarget"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/release-targets/resource-preview": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Preview release targets for a resource - * @description Simulates which release targets would be created if the given resource were added to the workspace. This is a dry-run endpoint — no resources or release targets are actually created. - */ - post: operations["previewReleaseTargetsForResource"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/release-targets/state": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Get release target states by deployment and environment - * @description Returns paginated release target states for a given deployment and environment. - */ - post: operations["getReleaseTargetStates"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/release-targets/{releaseTargetKey}/desired-release": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; }; - /** - * Get the desired release for a release target - * @description Returns the desired release for a release target {releaseTargetKey}. - */ - get: operations["getReleaseTargetDesiredRelease"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/release-targets/{releaseTargetKey}/jobs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; - /** - * Get jobs for a release target - * @description Returns a list of jobs for a release target {releaseTargetKey}. - */ - get: operations["getJobsForReleaseTarget"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/release-targets/{releaseTargetKey}/policies": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + }; + }; + }; + listDeployments: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["DeploymentAndSystems"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getDeployment: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the deployment */ + deploymentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested deployment */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["DeploymentWithVariablesAndSystems"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getPoliciesForDeployment: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the deployment */ + deploymentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of resolved policies */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["ResolvedPolicy"][]; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getReleaseTargetsForDeployment: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + /** @description Filter by resource name */ + query?: string; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the deployment */ + deploymentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["ReleaseTargetSummary"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getDeploymentResources: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the deployment */ + deploymentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["Resource"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getVersionsForDeployment: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the deployment */ + deploymentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["DeploymentVersion"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getDeploymentVersion: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the deployment version */ + deploymentVersionId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["DeploymentVersion"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getRelatedEntities: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Type of the entity (deployment, environment, or resource) */ + relatableEntityType: components["parameters"]["relatableEntityType"]; + /** @description ID of the entity */ + entityId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Related entities grouped by relationship reference */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + relations?: { + [key: string]: components["schemas"]["EntityRelation"][]; + }; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listEnvironments: { + parameters: { + query?: { + /** @description Number of items to skip */ + offset?: number; + /** @description Maximum number of items to return */ + limit?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of environments */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["Environment"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getEnvironment: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the environment */ + environmentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested environment */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["EnvironmentWithSystems"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getReleaseTargetsForEnvironment: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the environment */ + environmentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["ReleaseTargetWithState"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getEnvironmentResources: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the environment */ + environmentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["Resource"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getGitHubEntityByInstallationId: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Installation ID of the GitHub entity */ + installationId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["GithubEntity"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getJobAgents: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["JobAgent"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getJobAgent: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the job agent */ + jobAgentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested job agent */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["JobAgent"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getDeploymentsForJobAgent: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the job agent */ + jobAgentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["Deployment"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getJobsForJobAgent: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the job agent */ + jobAgentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["Job"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getJobs: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + /** @description ID of the resource */ + resourceId?: string; + /** @description ID of the environment */ + environmentId?: string; + /** @description ID of the deployment */ + deploymentId?: string; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["Job"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the job */ + jobId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Get job */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Job"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getJobWithRelease: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the job */ + jobId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Get job with release */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["JobWithRelease"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listPolicies: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of policies */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + policies?: components["schemas"]["Policy"][]; + }; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + evaluatePolicies: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["EvaluationScope"]; + }; + }; + responses: { + /** @description OK response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + decision?: components["schemas"]["DeployDecision"]; + }; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getPolicy: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the policy */ + policyId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested policy */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Policy"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getReleaseTargetsForPolicy: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the policy */ + policyId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of release targets */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + releaseTargets?: components["schemas"]["ReleaseTarget"][]; + }; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getRule: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the policy */ + policyId: string; + /** @description ID of the rule */ + ruleId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PolicyRule"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listPolicySkips: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of policy skips */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + skips?: components["schemas"]["PolicySkip"][]; + }; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getPolicySkipsForEnvironmentAndVersion: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the environment */ + environmentId: string; + /** @description ID of the deployment version */ + deploymentVersionId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of policy skips */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items?: components["schemas"]["PolicySkip"][]; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getPolicySkip: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Policy skip ID */ + policySkipId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested policy skip */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PolicySkip"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getRelationshipRules: { + parameters: { + query?: { + /** @description Number of items to skip */ + offset?: number; + /** @description Maximum number of items to return */ + limit?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["RelationshipRule"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getRelationshipRule: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the relationship rule */ + relationshipRuleId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["RelationshipRule"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + evaluateReleaseTarget: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["EvaluateReleaseTargetRequest"]; + }; + }; + responses: { + /** @description Policy evaluation results for the release target */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + decision?: components["schemas"]["DeployDecision"]; + /** @description The number of policies evaluated */ + policiesEvaluated?: number; + }; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + previewReleaseTargetsForResource: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ResourcePreviewRequest"]; + }; + }; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["ReleaseTargetPreview"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getReleaseTargetStates: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + deploymentId: string; + environmentId: string; + }; + }; + }; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["ReleaseTargetAndState"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getReleaseTargetDesiredRelease: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Key of the release target */ + releaseTargetKey: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The desired release for the release target */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + desiredRelease?: components["schemas"]["Release"]; + }; }; - /** - * Get policies for a release target - * @description Returns a list of policies for a release target {releaseTargetId}. - */ - get: operations["getPoliciesForReleaseTarget"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/release-targets/{releaseTargetKey}/state": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; }; - /** - * Get the state for a release target - * @description Returns the state for a release target {releaseTargetKey}. - */ - get: operations["getReleaseTargetState"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/releases/{releaseId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; - /** - * Get release - * @description Returns a specific release by ID. - */ - get: operations["getRelease"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/releases/{releaseId}/verifications": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + }; + }; + }; + getJobsForReleaseTarget: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + /** @description CEL expression to filter the results */ + cel?: string; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Key of the release target */ + releaseTargetKey: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["Job"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getPoliciesForReleaseTarget: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Key of the release target */ + releaseTargetKey: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of policies */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + policies?: components["schemas"]["Policy"][]; + }; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getReleaseTargetState: { + parameters: { + query?: { + /** @description Whether to bypass the cache */ + bypassCache?: boolean; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Key of the release target */ + releaseTargetKey: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The state for the release target */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ReleaseTargetState"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getRelease: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the release */ + releaseId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested release */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Release"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getReleaseVerifications: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the release */ + releaseId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description List of verifications for the release */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["JobVerification"][]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getResourceProviders: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["ResourceProvider"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + }; + }; + cacheBatch: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + /** @description The ID of the resource provider */ + providerId: string; + /** @description Array of resources to cache */ + resources: components["schemas"]["Resource"][]; + }; + }; + }; + responses: { + /** @description Batch cached successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @description Unique ID for this cached batch */ + batchId?: string; + /** @description Number of resources cached */ + resourceCount?: number; + }; + }; + }; + }; + }; + getResourceProviderByName: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Name of the resource provider */ + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ResourceProvider"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getKindsForWorkspace: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested kinds */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": string[]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + queryResources: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + filter?: components["schemas"]["Selector"]; + }; + }; + }; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["Resource"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getResourceByIdentifier: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Identifier of the resource */ + resourceIdentifier: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested resource */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Resource"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getDeploymentsForResource: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Identifier of the resource */ + resourceIdentifier: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["Deployment"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getRelationshipsForResource: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Identifier of the resource */ + resourceIdentifier: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested relationships */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: components["schemas"]["EntityRelation"][]; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getReleaseTargetsForResource: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Identifier of the resource */ + resourceIdentifier: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["ReleaseTargetWithState"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getReleaseTargetForResourceInDeployment: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Identifier of the resource */ + resourceIdentifier: string; + /** @description ID of the deployment */ + deploymentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested release target */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ReleaseTarget"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getVariablesForResource: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Identifier of the resource */ + resourceIdentifier: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested variables */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ResourceVariable"][]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getEngineStatus: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The status of the engine */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + healthy?: boolean; + message?: string; + }; }; - /** - * Get release verifications - * @description Returns all verifications for jobs belonging to this release. - */ - get: operations["getReleaseVerifications"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/resource-providers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get all resource providers */ - get: operations["getResourceProviders"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/resource-providers/cache-batch": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Cache a large resource batch for deferred processing - * @description Stores resources in memory and returns a batch ID. The batch is processed when a corresponding Kafka event is received. Uses Ristretto cache with 5-minute TTL. - */ - post: operations["cacheBatch"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/resource-providers/name/{name}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a resource provider by name */ - get: operations["getResourceProviderByName"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/resources/kinds": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + }; + }; + }; + listSystems: { + parameters: { + query?: { + /** @description Number of items to skip */ + offset?: number; + /** @description Maximum number of items to return */ + limit?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of systems */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["System"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getSystem: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the system */ + systemId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested system with its environments and deployments */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @description Deployments associated with the system */ + deployments: components["schemas"]["Deployment"][]; + /** @description Environments associated with the system */ + environments: components["schemas"]["Environment"][]; + system: components["schemas"]["System"]; + }; }; - /** - * Get kinds for a workspace - * @description Returns a list of all resource kinds in a workspace. - */ - get: operations["getKindsForWorkspace"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/resources/query": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Query resources with CEL expression - * @description Returns paginated resources that match the provided CEL expression. Use the "resource" variable in your expression to access resource properties. - */ - post: operations["queryResources"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/resources/{resourceIdentifier}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; }; - /** - * Get resource by identifier - * @description Returns a specific resource by its identifier. - */ - get: operations["getResourceByIdentifier"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/resources/{resourceIdentifier}/deployments": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; - /** - * Get deployments for a resource - * @description Returns a paginated list of deployments that match the given resource. - */ - get: operations["getDeploymentsForResource"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/resources/{resourceIdentifier}/relationships": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; }; - /** - * Get relationships for a resource - * @description Returns all relationships for the specified resource. - */ - get: operations["getRelationshipsForResource"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/resources/{resourceIdentifier}/release-targets": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get release targets for a resource - * @description Returns a list of release targets for a resource. - */ - get: operations["getReleaseTargetsForResource"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/resources/{resourceIdentifier}/release-targets/deployment/{deploymentId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get release target for a resource in a deployment - * @description Returns a release target for a resource in a deployment. - */ - get: operations["getReleaseTargetForResourceInDeployment"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/resources/{resourceIdentifier}/variables": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get variables for a resource - * @description Returns a list of variables for a resource - */ - get: operations["getVariablesForResource"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/status": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get engine status - * @description Returns the status of the engine. - */ - get: operations["getEngineStatus"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/systems": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List systems - * @description Returns a list of systems for a workspace. - */ - get: operations["listSystems"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/systems/{systemId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get system - * @description Returns a specific system by ID. - */ - get: operations["getSystem"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/systems/{systemId}/deployments/{deploymentId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get deployment system link - * @description Returns a specific deployment system link by ID. - */ - get: operations["getDeploymentSystemLink"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/systems/{systemId}/environments/{environmentId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get environment system link - * @description Returns a specific environment system link by ID. - */ - get: operations["getEnvironmentSystemLink"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/workflows": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List workflows - * @description Returns a list of workflows. - */ - get: operations["listWorkflows"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/workflows/{workflowId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get a workflow - * @description Gets a workflow by ID. - */ - get: operations["getWorkflow"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/workflows/{workflowId}/runs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get all workflow runs for a workflow - * @description Gets all workflow runs for a workflow by ID. - */ - get: operations["getWorkflowRuns"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; -} -export type webhooks = Record; -export interface components { - schemas: { - AnyApprovalRule: { - /** Format: int32 */ - minApprovals: number; - }; - /** @enum {string} */ - ApprovalStatus: "approved" | "rejected"; - ArgoCDJobAgentConfig: { - /** @description ArgoCD API token. */ - apiKey: string; - /** @description ArgoCD server address (host[:port] or URL). */ - serverUrl: string; - /** @description ArgoCD application template. */ - template: string; - }; - BooleanValue: boolean; - CelMatcher: { - cel: string; - }; - CelSelector: { - cel: string; - }; - DatadogMetricProvider: { - /** - * @description Datadog aggregator - * @default last - * @enum {string} - */ - aggregator: "avg" | "min" | "max" | "sum" | "last" | "percentile" | "mean" | "l2norm" | "area"; - /** - * @description Datadog API key (supports Go templates for variable references) - * @example {{.variables.dd_api_key}} - */ - apiKey: string; - /** - * @description Datadog Application key (supports Go templates for variable references) - * @example {{.variables.dd_app_key}} - */ - appKey: string; - /** @description Datadog formula (supports Go templates) */ - formula?: string; - /** - * Format: int64 - * @example 30 - */ - intervalSeconds?: number; - /** - * @description Datadog metrics queries (supports Go templates) - * @example { - * "q": "sum:requests.error.rate{service:{{.resource.name}}}" - * } - */ - queries: { - [key: string]: string; - }; - /** - * @description Datadog site URL (e.g., datadoghq.com, datadoghq.eu, us3.datadoghq.com) - * @default datadoghq.com - */ - site: string; - /** - * @description Provider type (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: "datadog"; - }; - DeployDecision: { - policyResults: components["schemas"]["PolicyEvaluation"][]; - }; - Deployment: { - description?: string; - id: string; - jobAgentConfig: components["schemas"]["JobAgentConfig"]; - jobAgentId?: string; - jobAgents?: components["schemas"]["DeploymentJobAgent"][]; - metadata: { - [key: string]: string; - }; - name: string; - resourceSelector?: components["schemas"]["Selector"]; - slug: string; - }; - DeploymentAndSystems: { - deployment: components["schemas"]["Deployment"]; - systems: components["schemas"]["System"][]; - }; - DeploymentDependencyRule: { - /** @description CEL expression to match upstream deployment(s) that must have a successful release before this deployment can proceed. */ - dependsOn: string; - }; - DeploymentJobAgent: { - config: components["schemas"]["JobAgentConfig"]; - ref: string; - /** @description CEL expression to determine if the job agent should be used */ - selector: string; - }; - DeploymentVariable: { - defaultValue?: components["schemas"]["LiteralValue"]; - deploymentId: string; - description?: string; - id: string; - key: string; - }; - DeploymentVariableValue: { - deploymentVariableId: string; - id: string; - /** Format: int64 */ - priority: number; - resourceSelector?: components["schemas"]["Selector"]; - value: components["schemas"]["Value"]; - }; - DeploymentVariableWithValues: { - values: components["schemas"]["DeploymentVariableValue"][]; - variable: components["schemas"]["DeploymentVariable"]; - }; - DeploymentVersion: { - config: { - [key: string]: unknown; - }; - /** Format: date-time */ - createdAt: string; - deploymentId: string; - id: string; - jobAgentConfig: components["schemas"]["JobAgentConfig"]; - message?: string; - metadata: { - [key: string]: string; - }; - name: string; - status: components["schemas"]["DeploymentVersionStatus"]; - tag: string; - }; - /** @enum {string} */ - DeploymentVersionStatus: "unspecified" | "building" | "ready" | "failed" | "rejected" | "paused"; - DeploymentWindowRule: { - /** - * @description If true, deployments are only allowed during the window. If false, deployments are blocked during the window (deny window) - * @default true - */ - allowWindow: boolean; - /** - * Format: int32 - * @description Duration of each deployment window in minutes - */ - durationMinutes: number; - /** @description RFC 5545 recurrence rule defining when deployment windows start (e.g., FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;BYHOUR=9) */ - rrule: string; - /** @description IANA timezone for the rrule (e.g., America/New_York). Defaults to UTC if not specified */ - timezone?: string; - }; - DeploymentWithVariablesAndSystems: { - deployment: components["schemas"]["Deployment"]; - systems: components["schemas"]["System"][]; - variables: components["schemas"]["DeploymentVariableWithValues"][]; - }; - DispatchContext: { - deployment?: components["schemas"]["Deployment"]; - environment?: components["schemas"]["Environment"]; - jobAgent: components["schemas"]["JobAgent"]; - jobAgentConfig: components["schemas"]["JobAgentConfig"]; - release?: components["schemas"]["Release"]; - resource?: components["schemas"]["Resource"]; - variables?: { - [key: string]: components["schemas"]["LiteralValue"]; - }; - version?: components["schemas"]["DeploymentVersion"]; - workflow?: components["schemas"]["Workflow"]; - workflowJob?: components["schemas"]["WorkflowJob"]; - workflowRun?: components["schemas"]["WorkflowRun"]; - }; - EntityRelation: { - direction: components["schemas"]["RelationDirection"]; - entity: components["schemas"]["RelatableEntity"]; - /** @description ID of the related entity */ - entityId: string; - entityType: components["schemas"]["RelatableEntityType"]; - rule: components["schemas"]["RelationshipRule"]; - }; - Environment: { - /** Format: date-time */ - createdAt: string; - description?: string; - id: string; - metadata: { - [key: string]: string; - }; - name: string; - resourceSelector?: components["schemas"]["Selector"]; - }; - EnvironmentProgressionRule: { - dependsOnEnvironmentSelector: components["schemas"]["Selector"]; - /** - * Format: int32 - * @description Maximum age of dependency deployment before blocking progression (prevents stale promotions) - */ - maximumAgeHours?: number; - /** - * Format: int32 - * @description Minimum time to wait after the depends on environment is in a success state before the current environment can be deployed - * @default 0 - */ - minimumSockTimeMinutes: number; - /** - * Format: float - * @default 100 - */ - minimumSuccessPercentage: number; - successStatuses?: components["schemas"]["JobStatus"][]; - }; - EnvironmentSummary: { - id: string; - name: string; - }; - EnvironmentWithSystems: components["schemas"]["Environment"] & { - systems: components["schemas"]["System"][]; - }; - ErrorResponse: { - /** @example Workspace not found */ - error?: string; - }; - EvaluateReleaseTargetRequest: { - releaseTarget: components["schemas"]["ReleaseTarget"]; - version: components["schemas"]["DeploymentVersion"]; - }; - EvaluationScope: { - environmentId?: string; - versionId?: string; - }; - GithubEntity: { - installationId: number; - slug: string; - }; - GithubJobAgentConfig: { - /** - * Format: int - * @description GitHub app installation ID. - */ - installationId: number; - /** @description GitHub repository owner. */ - owner: string; - /** @description Git ref to run the workflow on (defaults to "main" if omitted). */ - ref?: string; - /** @description GitHub repository name. */ - repo: string; - /** - * Format: int64 - * @description GitHub Actions workflow ID. - */ - workflowId: number; - }; - GradualRolloutRule: { - /** - * @description Strategy for scheduling deployments to release targets. "linear": Each target is deployed at a fixed interval of timeScaleInterval seconds. "linear-normalized": Deployments are spaced evenly so that the last target is scheduled at or before timeScaleInterval seconds. See rolloutType algorithm documentation for details. - * @enum {string} - */ - rolloutType: "linear" | "linear-normalized"; - /** - * Format: int32 - * @description Base time interval in seconds used to compute the delay between deployments to release targets. - */ - timeScaleInterval: number; - }; - HTTPMetricProvider: { - /** @description Request body (supports Go templates) */ - body?: string; - /** @description HTTP headers (values support Go templates) */ - headers?: { - [key: string]: string; - }; - /** - * @description HTTP method - * @default GET - * @enum {string} - */ - method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS"; - /** - * @description Request timeout (duration string, e.g., "30s") - * @default 30s - */ - timeout: string; - /** - * @description Provider type (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: "http"; - /** - * @description HTTP endpoint URL (supports Go templates) - * @example http://{{ .resource.name }}.{{ .environment.name }}/health - */ - url: string; - }; - IntegerValue: number; - Job: { - /** Format: date-time */ - completedAt?: string; - /** Format: date-time */ - createdAt: string; - dispatchContext?: components["schemas"]["DispatchContext"]; - externalId?: string; - id: string; - jobAgentConfig: components["schemas"]["JobAgentConfig"]; - jobAgentId: string; - message?: string; - metadata: { - [key: string]: string; - }; - releaseId: string; - /** Format: date-time */ - startedAt?: string; - status: components["schemas"]["JobStatus"]; - traceToken?: string; - /** Format: date-time */ - updatedAt: string; - workflowJobId: string; - }; - JobAgent: { - config: components["schemas"]["JobAgentConfig"]; - id: string; - metadata?: { - [key: string]: string; - }; - name: string; - type: string; - workspaceId: string; - }; - JobAgentConfig: { - [key: string]: unknown; - }; - /** @enum {string} */ - JobStatus: "cancelled" | "skipped" | "inProgress" | "actionRequired" | "pending" | "failure" | "invalidJobAgent" | "invalidIntegration" | "externalRunNotFound" | "successful"; - JobSummary: { - id: string; - /** @description External links extracted from job metadata */ - links?: { - [key: string]: string; - }; - message?: string; - status: components["schemas"]["JobStatus"]; - verifications: components["schemas"]["JobVerification"][]; - }; - JobUpdateEvent: { - agentId?: string; - externalId?: string; - fieldsToUpdate?: ("completedAt" | "createdAt" | "dispatchContext" | "externalId" | "id" | "jobAgentConfig" | "jobAgentId" | "message" | "metadata" | "releaseId" | "startedAt" | "status" | "traceToken" | "updatedAt" | "workflowJobId")[]; - id?: string; - job: components["schemas"]["Job"]; - } & (unknown | unknown); - JobVerification: { - /** - * Format: date-time - * @description When verification was created - */ - createdAt: string; - id: string; - jobId: string; - /** @description Summary message of verification result */ - message?: string; - /** @description Metrics associated with this verification */ - metrics: components["schemas"]["VerificationMetricStatus"][]; - }; - /** @enum {string} */ - JobVerificationStatus: "running" | "passed" | "failed" | "cancelled"; - JobWithRelease: { - deployment?: components["schemas"]["Deployment"]; - environment?: components["schemas"]["Environment"]; - job: components["schemas"]["Job"]; - release: components["schemas"]["Release"]; - resource?: components["schemas"]["Resource"]; - }; - JobWithVerifications: { - job: components["schemas"]["Job"]; - verifications: components["schemas"]["JobVerification"][]; - }; - JsonSelector: { - json: { - [key: string]: unknown; - }; - }; - LiteralValue: components["schemas"]["BooleanValue"] | components["schemas"]["NumberValue"] | components["schemas"]["IntegerValue"] | components["schemas"]["StringValue"] | components["schemas"]["ObjectValue"] | components["schemas"]["NullValue"]; - MetricProvider: components["schemas"]["HTTPMetricProvider"] | components["schemas"]["SleepMetricProvider"] | components["schemas"]["DatadogMetricProvider"] | components["schemas"]["PrometheusMetricProvider"] | components["schemas"]["TerraformCloudRunMetricProvider"]; - /** @enum {boolean} */ - NullValue: true; - NumberValue: number; - ObjectValue: { - object: { - [key: string]: unknown; - }; - }; - Policy: { - createdAt: string; - description?: string; - enabled: boolean; - id: string; - /** @description Arbitrary metadata for the policy (record) */ - metadata: { - [key: string]: string; - }; - name: string; - priority: number; - rules: components["schemas"]["PolicyRule"][]; - /** @description CEL expression for matching release targets. Use "true" to match all targets. */ - selector: string; - workspaceId: string; - }; - PolicyEvaluation: { - policy?: components["schemas"]["Policy"]; - ruleResults: components["schemas"]["RuleEvaluation"][]; - summary?: string; - }; - PolicyRule: { - anyApproval?: components["schemas"]["AnyApprovalRule"]; - createdAt: string; - deploymentDependency?: components["schemas"]["DeploymentDependencyRule"]; - deploymentWindow?: components["schemas"]["DeploymentWindowRule"]; - environmentProgression?: components["schemas"]["EnvironmentProgressionRule"]; - gradualRollout?: components["schemas"]["GradualRolloutRule"]; - id: string; - policyId: string; - retry?: components["schemas"]["RetryRule"]; - rollback?: components["schemas"]["RollbackRule"]; - verification?: components["schemas"]["VerificationRule"]; - versionCooldown?: components["schemas"]["VersionCooldownRule"]; - versionSelector?: components["schemas"]["VersionSelectorRule"]; - }; - PolicySkip: { - /** - * Format: date-time - * @description When this skip was created - */ - createdAt: string; - /** @description User ID who created this skip */ - createdBy: string; - /** @description Environment this skip applies to. If null, applies to all environments. */ - environmentId?: string; - /** - * Format: date-time - * @description When this skip expires. If null, skip never expires. - */ - expiresAt?: string; - /** @description Unique identifier for the skip */ - id: string; - /** @description Required reason for why this skip is needed (e.g., incident ticket, emergency situation) */ - reason: string; - /** @description Resource this skip applies to. If null, applies to all resources (in the environment if specified, or globally). */ - resourceId?: string; - /** @description Rule ID this skip applies to */ - ruleId: string; - /** @description Deployment version this skip applies to */ - versionId: string; - /** @description Workspace this skip belongs to */ - workspaceId: string; - }; - PrometheusMetricProvider: { - /** - * @description Prometheus server address (supports Go templates) - * @example http://prometheus.example.com:9090 - */ - address: string; - /** @description Authentication configuration for Prometheus */ - authentication?: { - /** - * @description Bearer token for authentication (supports Go templates for variable references) - * @example {{.variables.prometheus_token}} - */ - bearerToken?: string; - /** @description OAuth2 client credentials flow */ - oauth2?: { - /** @description OAuth2 client ID (supports Go templates) */ - clientId: string; - /** @description OAuth2 client secret (supports Go templates) */ - clientSecret: string; - /** @description OAuth2 scopes */ - scopes?: string[]; - /** @description Token endpoint URL */ - tokenUrl: string; - }; - }; - /** @description Additional HTTP headers for the Prometheus request (values support Go templates) */ - headers?: { - /** @example X-Scope-OrgID */ - key: string; - /** @example tenant_a */ - value: string; - }[]; - /** - * @description Skip TLS certificate verification - * @default false - */ - insecure: boolean; - /** - * @description PromQL query expression (supports Go templates) - * @example sum(irate(istio_requests_total{reporter="source",destination_service=~"{{.resource.name}}",response_code!~"5.*"}[5m])) - */ - query: string; - /** @description If provided, a range query (/api/v1/query_range) is used instead of an instant query (/api/v1/query) */ - rangeQuery?: { - /** - * @description How far back from now for the query end, as a Prometheus duration (e.g., "0s" for now, "1m" for 1 minute ago). Defaults to "0s" (now) if unset. - * @example 0s - */ - end?: string; - /** - * @description How far back from now to start the query, as a Prometheus duration (e.g., "5m", "1h"). Defaults to 10 * step if unset. - * @example 5m - */ - start?: string; - /** - * @description Query resolution step width as a Prometheus duration (e.g., "15s", "1m", "500ms") - * @example 1m - */ - step: string; - }; - /** - * Format: int64 - * @description Query timeout in seconds - * @example 30 - */ - timeout?: number; - /** - * @description Provider type (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: "prometheus"; - }; - PropertiesMatcher: { - properties: components["schemas"]["PropertyMatcher"][]; - }; - PropertyMatcher: { - fromProperty: string[]; - /** @enum {string} */ - operator: "equals" | "notEquals" | "contains" | "startsWith" | "endsWith" | "regex"; - toProperty: string[]; - }; - ReferenceValue: { - path: string[]; - reference: string; - }; - RelatableEntity: components["schemas"]["Deployment"] | components["schemas"]["Environment"] | components["schemas"]["Resource"]; - /** @enum {string} */ - RelatableEntityType: "deployment" | "environment" | "resource"; - /** @enum {string} */ - RelationDirection: "from" | "to"; - RelationshipRule: { - description?: string; - fromSelector?: components["schemas"]["Selector"]; - fromType: components["schemas"]["RelatableEntityType"]; - id: string; - matcher: components["schemas"]["CelMatcher"] | components["schemas"]["PropertiesMatcher"]; - metadata: { - [key: string]: string; - }; - name: string; - reference: string; - relationshipType: string; - toSelector?: components["schemas"]["Selector"]; - toType: components["schemas"]["RelatableEntityType"]; - workspaceId: string; - }; - Release: { - createdAt: string; - encryptedVariables: string[]; - releaseTarget: components["schemas"]["ReleaseTarget"]; - variables: { - [key: string]: components["schemas"]["LiteralValue"]; - }; - version: components["schemas"]["DeploymentVersion"]; - }; - ReleaseTarget: { - deploymentId: string; - environmentId: string; - resourceId: string; - }; - ReleaseTargetAndState: { - releaseTarget: components["schemas"]["ReleaseTarget"]; - state: components["schemas"]["ReleaseTargetState"]; - }; - ReleaseTargetPreview: { - deployment: components["schemas"]["Deployment"]; - environment: components["schemas"]["Environment"]; - system: components["schemas"]["System"]; - }; - ReleaseTargetState: { - currentRelease?: components["schemas"]["Release"]; - desiredRelease?: components["schemas"]["Release"]; - latestJob?: components["schemas"]["JobWithVerifications"]; - }; - ReleaseTargetSummary: { - currentVersion?: components["schemas"]["VersionSummary"]; - desiredVersion?: components["schemas"]["VersionSummary"]; - environment: components["schemas"]["EnvironmentSummary"]; - latestJob?: components["schemas"]["JobSummary"]; - releaseTarget: components["schemas"]["ReleaseTarget"]; - resource: components["schemas"]["ResourceSummary"]; - }; - ReleaseTargetWithState: { - deployment: components["schemas"]["Deployment"]; - environment: components["schemas"]["Environment"]; - releaseTarget: components["schemas"]["ReleaseTarget"]; - resource: components["schemas"]["Resource"]; - state: components["schemas"]["ReleaseTargetState"]; - }; - ResolvedPolicy: { - environmentIds: string[]; - policy: components["schemas"]["Policy"]; - releaseTargets: components["schemas"]["ReleaseTarget"][]; - }; - Resource: { - config: { - [key: string]: unknown; - }; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - deletedAt?: string; - id: string; - identifier: string; - kind: string; - /** Format: date-time */ - lockedAt?: string; - metadata: { - [key: string]: string; - }; - name: string; - providerId?: string; - /** Format: date-time */ - updatedAt?: string; - version: string; - workspaceId: string; - }; - ResourcePreviewRequest: { - config: { - [key: string]: unknown; - }; - identifier: string; - kind: string; - metadata: { - [key: string]: string; - }; - name: string; - version: string; - }; - ResourceProvider: { - /** Format: date-time */ - createdAt: string; - id: string; - metadata: { - [key: string]: string; - }; - name: string; - /** Format: uuid */ - workspaceId: string; - }; - ResourceSummary: { - id: string; - identifier: string; - kind: string; - name: string; - version: string; - }; - ResourceVariable: { - key: string; - resourceId: string; - value: components["schemas"]["Value"]; - }; - ResourceVariablesBulkUpdateEvent: { - resourceId: string; - variables: { - [key: string]: unknown; - }; - }; - RetryRule: { - /** - * Format: int32 - * @description Minimum seconds to wait between retry attempts. If null, retries are allowed immediately after job completion. - */ - backoffSeconds?: number; - /** - * @description Backoff strategy: "linear" uses constant backoffSeconds delay, "exponential" doubles the delay with each retry (backoffSeconds * 2^(attempt-1)). - * @default linear - * @enum {string} - */ - backoffStrategy: "linear" | "exponential"; - /** - * Format: int32 - * @description Maximum backoff time in seconds (cap for exponential backoff). If null, no maximum is enforced. - */ - maxBackoffSeconds?: number; - /** - * Format: int32 - * @description Maximum number of retries allowed. 0 means no retries (1 attempt total), 3 means up to 4 attempts (1 initial + 3 retries). - */ - maxRetries: number; - /** @description Job statuses that count toward the retry limit. If null or empty, defaults to ["failure", "invalidIntegration", "invalidJobAgent"] for maxRetries > 0, or ["failure", "invalidIntegration", "invalidJobAgent", "successful"] for maxRetries = 0. Cancelled and skipped jobs never count by default (allows redeployment after cancellation). Example: ["failure", "cancelled"] will only count failed/cancelled jobs. */ - retryOnStatuses?: components["schemas"]["JobStatus"][]; - }; - RollbackRule: { - /** @description Job statuses that will trigger a rollback */ - onJobStatuses?: components["schemas"]["JobStatus"][]; - /** - * @description If true, a release target will be rolled back if the verification fails - * @default false - */ - onVerificationFailure: boolean; - }; - RuleEvaluation: { - /** @description Whether the rule requires an action (e.g., approval, wait) */ - actionRequired: boolean; - /** - * @description Type of action required - * @enum {string} - */ - actionType?: "approval" | "wait"; - /** @description Whether the rule allows the deployment */ - allowed: boolean; - /** @description Additional details about the rule evaluation */ - details: { - [key: string]: unknown; - }; - /** @description Human-readable explanation of the rule result */ - message: string; - /** - * Format: date-time - * @description The time when this rule should be re-evaluated (e.g., when soak time will be complete, when gradual rollout schedule is due) - */ - nextEvaluationTime?: string; - /** @description The ID of the rule that was evaluated */ - ruleId: string; - /** - * Format: date-time - * @description The time when the rule requirement was satisfied (e.g., when approvals were met, soak time completed) - */ - satisfiedAt?: string; - }; - Selector: components["schemas"]["JsonSelector"] | components["schemas"]["CelSelector"]; - SensitiveValue: { - valueHash: string; - }; - SleepMetricProvider: { - /** - * Format: int32 - * @example 30 - */ - durationSeconds: number; - /** - * @description Provider type (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: "sleep"; - }; - StringValue: string; - System: { - description?: string; - id: string; - metadata?: { - [key: string]: string; - }; - name: string; - workspaceId: string; - }; - SystemDeploymentLink: { - deploymentId: string; - systemId: string; - }; - SystemEnvironmentLink: { - environmentId: string; - systemId: string; - }; - TerraformCloudJobAgentConfig: { - /** @description Terraform Cloud address (e.g. https://app.terraform.io). */ - address: string; - /** @description Terraform Cloud organization name. */ - organization: string; - /** @description Terraform Cloud workspace template. */ - template: string; - /** @description Terraform Cloud API token. */ - token: string; - }; - TerraformCloudRunMetricProvider: { - /** - * @description Terraform Cloud address - * @example https://app.terraform.io - */ - address: string; - /** - * @description Terraform Cloud run ID - * @example run-1234567890 - */ - runId: string; - /** - * @description Terraform Cloud token - * @example {{.variables.terraform_cloud_token}} - */ - token: string; - /** - * @description Provider type (enum property replaced by openapi-typescript) - * @enum {string} - */ - type: "terraformCloudRun"; - }; - TestRunnerJobAgentConfig: { - /** - * Format: int - * @description Delay in seconds before resolving the job. - */ - delaySeconds?: number; - /** @description Optional message to include in the job output. */ - message?: string; - /** @description Final status to set (e.g. "successful", "failure"). */ - status?: string; - }; - UserApprovalRecord: { - createdAt: string; - environmentId: string; - reason?: string; - status: components["schemas"]["ApprovalStatus"]; - userId: string; - versionId: string; - }; - Value: components["schemas"]["LiteralValue"] | components["schemas"]["ReferenceValue"] | components["schemas"]["SensitiveValue"]; - VerificationMeasurement: { - /** @description Raw measurement data */ - data?: { - [key: string]: unknown; - }; - /** - * Format: date-time - * @description When measurement was taken - */ - measuredAt: string; - /** @description Measurement result message */ - message?: string; - status: components["schemas"]["VerificationMeasurementStatus"]; - }; - /** - * @description Status of a verification measurement - * @enum {string} - */ - VerificationMeasurementStatus: "passed" | "failed" | "inconclusive"; - VerificationMetricSpec: { - /** @description Number of measurements to take */ - count: number; - /** - * @description CEL expression to evaluate measurement failure (e.g., "result.statusCode == 500"), if not provided, a failure is just the opposite of the success condition - * @example result.statusCode == 500 - */ - failureCondition?: string; - /** - * @description Stop after this many consecutive failures (0 = no limit) - * @default 0 - */ - failureThreshold: number; - /** - * Format: int32 - * @description Interval between measurements in seconds - * @example 30 - */ - intervalSeconds: number; - /** @description Name of the verification metric */ - name: string; - provider: components["schemas"]["MetricProvider"]; - /** - * @description CEL expression to evaluate measurement success (e.g., "result.statusCode == 200") - * @example result.statusCode == 200 - */ - successCondition: string; - /** - * @description Minimum number of consecutive successful measurements required to consider the metric successful - * @example 0 - */ - successThreshold?: number; - }; - VerificationMetricStatus: components["schemas"]["VerificationMetricSpec"] & { - /** @description Individual verification measurements taken for this metric */ - measurements: components["schemas"]["VerificationMeasurement"][]; - }; - VerificationRule: { - /** @description Metrics to verify */ - metrics: components["schemas"]["VerificationMetricSpec"][]; - /** - * @description When to trigger verification - * @default jobSuccess - * @enum {string} - */ - triggerOn: "jobCreated" | "jobStarted" | "jobSuccess" | "jobFailure"; - }; - VersionCooldownRule: { - /** - * Format: int32 - * @description Minimum time in seconds that must pass since the currently deployed (or in-progress) version was created before allowing another deployment. This enables batching of frequent upstream releases into periodic deployments. - */ - intervalSeconds: number; - }; - VersionSelectorRule: { - /** @description Human-readable description of what this version selector does. Example: "Only deploy v2.x versions to staging environments" */ - description?: string; - selector: components["schemas"]["Selector"]; - }; - VersionSummary: { - id: string; - name: string; - tag: string; - }; - Workflow: { - id: string; - inputs: components["schemas"]["WorkflowInput"][]; - jobs: components["schemas"]["WorkflowJobTemplate"][]; - name: string; - }; - WorkflowArrayInput: components["schemas"]["WorkflowManualArrayInput"] | components["schemas"]["WorkflowSelectorArrayInput"]; - WorkflowBooleanInput: { - default?: boolean; - key: string; - /** @enum {string} */ - type: "boolean"; - }; - WorkflowInput: components["schemas"]["WorkflowStringInput"] | components["schemas"]["WorkflowNumberInput"] | components["schemas"]["WorkflowBooleanInput"] | components["schemas"]["WorkflowArrayInput"] | components["schemas"]["WorkflowObjectInput"]; - WorkflowJob: { - /** @description Configuration for the job agent */ - config: { - [key: string]: unknown; - }; - id: string; - index: number; - /** @description Reference to the job agent */ - ref: string; - workflowRunId: string; - }; - WorkflowJobAgentConfig: { - config: { - [key: string]: unknown; - }; - id: string; - }; - WorkflowJobMatrix: { - [key: string]: { - [key: string]: unknown; - }[] | string; - }; - WorkflowJobTemplate: { - /** @description Configuration for the job agent */ - config: { - [key: string]: unknown; - }; - id: string; - /** @description CEL expression to determine if the job should run */ - if?: string; - matrix?: components["schemas"]["WorkflowJobMatrix"]; - name: string; - /** @description Reference to the job agent */ - ref: string; - workflowId: string; - }; - WorkflowJobWithJobs: components["schemas"]["WorkflowJob"] & { - jobs: components["schemas"]["Job"][]; - }; - WorkflowManualArrayInput: { - default?: { - [key: string]: unknown; - }[]; - key: string; - /** @enum {string} */ - type: "array"; - }; - WorkflowNumberInput: { - default?: number; - key: string; - /** @enum {string} */ - type: "number"; - }; - WorkflowObjectInput: { - default?: { - [key: string]: unknown; - }; - key: string; - /** @enum {string} */ - type: "object"; - }; - WorkflowRun: { - id: string; - inputs: { - [key: string]: unknown; - }; - workflowId: string; - }; - WorkflowRunWithJobs: components["schemas"]["WorkflowRun"] & { - jobs: components["schemas"]["WorkflowJobWithJobs"][]; - }; - WorkflowSelectorArrayInput: { - key: string; - selector: { - default?: components["schemas"]["Selector"]; - /** @enum {string} */ - entityType: "resource" | "environment" | "deployment"; - }; - /** @enum {string} */ - type: "array"; - }; - WorkflowStringInput: { - default?: string; - key: string; - /** @enum {string} */ - type: "string"; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; + }; }; - responses: never; + }; + getDeploymentSystemLink: { parameters: { - /** @description Type of the entity (deployment, environment, or resource) */ - relatableEntityType: components["schemas"]["RelatableEntityType"]; - }; - requestBodies: never; - headers: never; - pathItems: never; -} -export type $defs = Record; -export interface operations { - validateResourceSelector: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - resourceSelector?: components["schemas"]["Selector"]; - }; - }; - }; - responses: { - /** @description The validated resource selector */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - errors: string[]; - valid: boolean; - }; - }; - }; - }; - }; - listWorkspaceIds: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description A list of workspace IDs */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - workspaceIds?: string[]; - }; - }; - }; - }; - }; - getDeploymentVariableValue: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the deployment variable value */ - valueId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested deployment variable value */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["DeploymentVariableValue"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getDeploymentVariable: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the deployment variable */ - variableId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested deployment variable */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["DeploymentVariableWithValues"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getDeploymentVersionJobsList: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the deployment version */ - versionId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Jobs list grouped by environment and release target */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - environment: components["schemas"]["Environment"]; - releaseTargets: { - deployment: components["schemas"]["Deployment"]; - deploymentId: string; - environment: components["schemas"]["Environment"]; - environmentId: string; - id: string; - jobs: { - /** Format: date-time */ - createdAt: string; - externalId?: string; - id: string; - metadata: { - [key: string]: string; - }; - status: components["schemas"]["JobStatus"]; - }[]; - resource: components["schemas"]["Resource"]; - resourceId: string; - }[]; - }[]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - listDeployments: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["DeploymentAndSystems"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getDeployment: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the deployment */ - deploymentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested deployment */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["DeploymentWithVariablesAndSystems"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getPoliciesForDeployment: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the deployment */ - deploymentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description A list of resolved policies */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["ResolvedPolicy"][]; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getReleaseTargetsForDeployment: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - /** @description Filter by resource name */ - query?: string; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the deployment */ - deploymentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["ReleaseTargetSummary"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getDeploymentResources: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the deployment */ - deploymentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["Resource"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getVersionsForDeployment: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the deployment */ - deploymentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["DeploymentVersion"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getDeploymentVersion: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the deployment version */ - deploymentVersionId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["DeploymentVersion"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getRelatedEntities: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Type of the entity (deployment, environment, or resource) */ - relatableEntityType: components["parameters"]["relatableEntityType"]; - /** @description ID of the entity */ - entityId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Related entities grouped by relationship reference */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - relations?: { - [key: string]: components["schemas"]["EntityRelation"][]; - }; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - listEnvironments: { - parameters: { - query?: { - /** @description Number of items to skip */ - offset?: number; - /** @description Maximum number of items to return */ - limit?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description A list of environments */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["Environment"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getEnvironment: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the environment */ - environmentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested environment */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["EnvironmentWithSystems"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getReleaseTargetsForEnvironment: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the environment */ - environmentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["ReleaseTargetWithState"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getEnvironmentResources: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the environment */ - environmentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["Resource"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getGitHubEntityByInstallationId: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Installation ID of the GitHub entity */ - installationId: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["GithubEntity"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getJobAgents: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["JobAgent"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getJobAgent: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the job agent */ - jobAgentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested job agent */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["JobAgent"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getDeploymentsForJobAgent: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the job agent */ - jobAgentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["Deployment"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getJobsForJobAgent: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the job agent */ - jobAgentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["Job"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getJobs: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - /** @description ID of the resource */ - resourceId?: string; - /** @description ID of the environment */ - environmentId?: string; - /** @description ID of the deployment */ - deploymentId?: string; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["Job"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the job */ - jobId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Get job */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Job"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getJobWithRelease: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the job */ - jobId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Get job with release */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["JobWithRelease"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - listPolicies: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description A list of policies */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - policies?: components["schemas"]["Policy"][]; - }; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - evaluatePolicies: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["EvaluationScope"]; - }; - }; - responses: { - /** @description OK response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - decision?: components["schemas"]["DeployDecision"]; - }; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getPolicy: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the policy */ - policyId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested policy */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Policy"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getReleaseTargetsForPolicy: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the policy */ - policyId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description A list of release targets */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - releaseTargets?: components["schemas"]["ReleaseTarget"][]; - }; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getRule: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the policy */ - policyId: string; - /** @description ID of the rule */ - ruleId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["PolicyRule"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - listPolicySkips: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description A list of policy skips */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - skips?: components["schemas"]["PolicySkip"][]; - }; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getPolicySkipsForEnvironmentAndVersion: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the environment */ - environmentId: string; - /** @description ID of the deployment version */ - deploymentVersionId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description A list of policy skips */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items?: components["schemas"]["PolicySkip"][]; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getPolicySkip: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Policy skip ID */ - policySkipId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested policy skip */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["PolicySkip"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getRelationshipRules: { - parameters: { - query?: { - /** @description Number of items to skip */ - offset?: number; - /** @description Maximum number of items to return */ - limit?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["RelationshipRule"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getRelationshipRule: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the relationship rule */ - relationshipRuleId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["RelationshipRule"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - evaluateReleaseTarget: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["EvaluateReleaseTargetRequest"]; - }; - }; - responses: { - /** @description Policy evaluation results for the release target */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - decision?: components["schemas"]["DeployDecision"]; - /** @description The number of policies evaluated */ - policiesEvaluated?: number; - }; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - previewReleaseTargetsForResource: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["ResourcePreviewRequest"]; - }; - }; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["ReleaseTargetPreview"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getReleaseTargetStates: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - deploymentId: string; - environmentId: string; - }; - }; - }; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["ReleaseTargetAndState"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getReleaseTargetDesiredRelease: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Key of the release target */ - releaseTargetKey: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The desired release for the release target */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - desiredRelease?: components["schemas"]["Release"]; - }; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getJobsForReleaseTarget: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - /** @description CEL expression to filter the results */ - cel?: string; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Key of the release target */ - releaseTargetKey: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["Job"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getPoliciesForReleaseTarget: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Key of the release target */ - releaseTargetKey: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description A list of policies */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - policies?: components["schemas"]["Policy"][]; - }; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getReleaseTargetState: { - parameters: { - query?: { - /** @description Whether to bypass the cache */ - bypassCache?: boolean; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Key of the release target */ - releaseTargetKey: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The state for the release target */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ReleaseTargetState"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getRelease: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the release */ - releaseId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested release */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Release"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getReleaseVerifications: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the release */ - releaseId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description List of verifications for the release */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["JobVerification"][]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getResourceProviders: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["ResourceProvider"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - }; - }; - cacheBatch: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - /** @description The ID of the resource provider */ - providerId: string; - /** @description Array of resources to cache */ - resources: components["schemas"]["Resource"][]; - }; - }; - }; - responses: { - /** @description Batch cached successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Unique ID for this cached batch */ - batchId?: string; - /** @description Number of resources cached */ - resourceCount?: number; - }; - }; - }; - }; - }; - getResourceProviderByName: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Name of the resource provider */ - name: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ResourceProvider"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getKindsForWorkspace: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested kinds */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": string[]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - queryResources: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - filter?: components["schemas"]["Selector"]; - }; - }; - }; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["Resource"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getResourceByIdentifier: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Identifier of the resource */ - resourceIdentifier: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested resource */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Resource"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getDeploymentsForResource: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Identifier of the resource */ - resourceIdentifier: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["Deployment"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getRelationshipsForResource: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Identifier of the resource */ - resourceIdentifier: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested relationships */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - [key: string]: components["schemas"]["EntityRelation"][]; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getReleaseTargetsForResource: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Identifier of the resource */ - resourceIdentifier: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["ReleaseTargetWithState"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getReleaseTargetForResourceInDeployment: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Identifier of the resource */ - resourceIdentifier: string; - /** @description ID of the deployment */ - deploymentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested release target */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ReleaseTarget"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getVariablesForResource: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Identifier of the resource */ - resourceIdentifier: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested variables */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ResourceVariable"][]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getEngineStatus: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The status of the engine */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - healthy?: boolean; - message?: string; - }; - }; - }; - }; - }; - listSystems: { - parameters: { - query?: { - /** @description Number of items to skip */ - offset?: number; - /** @description Maximum number of items to return */ - limit?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description A list of systems */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["System"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getSystem: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the system */ - systemId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested system with its environments and deployments */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @description Deployments associated with the system */ - deployments: components["schemas"]["Deployment"][]; - /** @description Environments associated with the system */ - environments: components["schemas"]["Environment"][]; - system: components["schemas"]["System"]; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getDeploymentSystemLink: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the system */ - systemId: string; - /** @description ID of the deployment */ - deploymentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested deployment system link */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SystemDeploymentLink"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getEnvironmentSystemLink: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the system */ - systemId: string; - /** @description ID of the environment */ - environmentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description The requested environment system link */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["SystemEnvironmentLink"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - listWorkflows: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["Workflow"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getWorkflow: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the workflow */ - workflowId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Get workflow */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["Workflow"]; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; - getWorkflowRuns: { - parameters: { - query?: { - /** @description Maximum number of items to return */ - limit?: number; - /** @description Number of items to skip */ - offset?: number; - }; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description ID of the workflow */ - workflowId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Paginated list of items */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - items: components["schemas"]["WorkflowRunWithJobs"][]; - /** @description Maximum number of items returned */ - limit: number; - /** @description Number of items skipped */ - offset: number; - /** @description Total number of items available */ - total: number; - }; - }; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - /** @description Resource not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ErrorResponse"]; - }; - }; - }; - }; + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the system */ + systemId: string; + /** @description ID of the deployment */ + deploymentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested deployment system link */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SystemDeploymentLink"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getEnvironmentSystemLink: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the system */ + systemId: string; + /** @description ID of the environment */ + environmentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested environment system link */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SystemEnvironmentLink"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listWorkflows: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["Workflow"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getWorkflow: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the workflow */ + workflowId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Get workflow */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Workflow"]; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getWorkflowRuns: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: number; + /** @description Number of items to skip */ + offset?: number; + }; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description ID of the workflow */ + workflowId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated list of items */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items: components["schemas"]["WorkflowRunWithJobs"][]; + /** @description Maximum number of items returned */ + limit: number; + /** @description Number of items skipped */ + offset: number; + /** @description Total number of items available */ + total: number; + }; + }; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Resource not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; }