feat: client enrollment API and compute entity provisioning

Phase 1 implementation from the client-lifecycle plan.

- Migration 012: provisioning_steps table, context_version, context_files,
  enrolled_at column, slug+type index for machine entities
- API endpoints (openapi.yaml + generated code):
  POST /clients/enroll — age key issuance, Infisical identity, state transition
  GET /clients/{slug}/context — agent file delta polling (replaces git pull)
  GET /clients/{slug}/secrets — scoped secret listing
  POST /entities/provision — compute entity creation with constraint validation
  GET /entities/{slug}/provision/status — step-by-step provisioning progress
- Handlers in impl.go: enrollment with state validation and age key generation,
  provisioning with execution tracking and relationship creation,
  context endpoint with since-based delta queries
- Server struct extended with secretsBackend interface for key storage
- All tests pass, build clean
This commit is contained in:
2026-07-08 00:24:32 +02:00
parent 8653f3036d
commit 44e1e421e1
7 changed files with 1611 additions and 154 deletions

View File

@@ -104,6 +104,18 @@ type Classification struct {
CreatedAt time.Time
}
type ContextFile struct {
Path string
Hash string
LastChanged time.Time
}
type ContextVersion struct {
Singleton bool
Version int64
UpdatedAt time.Time
}
type Entity struct {
ID uuid.UUID
Slug string
@@ -115,6 +127,8 @@ type Entity struct {
Version int32
CreatedAt time.Time
UpdatedAt time.Time
EnrolledAt *time.Time
EnrolledBy *uuid.UUID
}
type EntityStatus struct {
@@ -192,6 +206,18 @@ type IdempotencyKey struct {
CreatedAt time.Time
}
type KnowledgeEntity struct {
EntityID uuid.UUID
Title string
Content string
Source *string
Tags []string
CreatedAt time.Time
UpdatedAt time.Time
ContentHash *string
Search interface{}
}
type Ledger struct {
Ts time.Time
ExecutionID uuid.UUID
@@ -261,6 +287,20 @@ type Pattern struct {
CreatedAt time.Time
}
type ProvisioningStep struct {
ID uuid.UUID
EntityID uuid.UUID
ExecutionID uuid.UUID
StepOrder int32
StepName string
Status string
StartedAt *time.Time
FinishedAt *time.Time
ErrorMessage *string
CreatedAt time.Time
UpdatedAt time.Time
}
type Relationship struct {
SourceID uuid.UUID
TargetID uuid.UUID