Integration Catalog Architecture

Audience: engineers integrating Stella Ops with external registries, SCM, CI, runtime hosts, and feeds — plus operators configuring those connections. Module: Integrations (src/Integrations/StellaOps.Integrations.WebService) Sprint: SPRINT_20251229_010_PLATFORM_integration_catalog_core Last Updated: 2025-12-30


Overview

The Integration Catalog is the centralized registry for managing external integrations in Stella Ops. It provides a unified API for configuring, testing, and monitoring connections to container registries, SCM providers, CI systems, runtime hosts, and feed sources.

Architecture Note: Integration Catalog is a dedicated service (src/Integrations), NOT part of Gateway. Gateway handles HTTP ingress/routing only. Integration domain logic, plugins, and persistence live in the Integrations module.

Directory Structure

src/Integrations/
├── StellaOps.Integrations.WebService/       # ASP.NET Core host
├── __Libraries/
│   ├── StellaOps.Integrations.Core/         # Domain models, enums, events
│   ├── StellaOps.Integrations.Contracts/    # Plugin contracts and DTOs
│   └── StellaOps.Integrations.Persistence/  # PostgreSQL repositories
└── __Plugins/
    ├── StellaOps.Integrations.Plugin.GitHubApp/
    ├── StellaOps.Integrations.Plugin.Harbor/
    └── StellaOps.Integrations.Plugin.InMemory/

Plugin Architecture

Each integration provider is implemented as a plugin that implements IIntegrationConnectorPlugin:

public interface IIntegrationConnectorPlugin : IAvailabilityPlugin
{
    IntegrationType Type { get; }
    IntegrationProvider Provider { get; }
    Task<TestConnectionResult> TestConnectionAsync(IntegrationConfig config, CancellationToken ct);
    Task<HealthCheckResult> CheckHealthAsync(IntegrationConfig config, CancellationToken ct);
}

Plugins are loaded at startup from:

  1. The configured PluginsDirectory (default: plugins/)
  2. The WebService assembly (for built-in plugins)

Integration Types

TypeDescriptionExamples
RegistryContainer image registriesDocker Hub, Harbor, ECR, ACR, GCR, GHCR, Quay, Artifactory
SCMSource code managementGitHub, GitLab, Gitea, Bitbucket, Azure DevOps
CIContinuous integrationGitHub Actions, GitLab CI, Gitea Actions, Jenkins, CircleCI
HostRuntime observationZastava (eBPF, ETW, dyld probes)
FeedVulnerability feedsConcelier, Excititor mirrors
ArtifactSBOM/VEX uploadsDirect artifact submission

Entity Schema

public sealed class Integration
{
    // Identity
    public Guid IntegrationId { get; init; }
    public string TenantId { get; init; }
    public string Name { get; init; }
    public string? Description { get; set; }
    
    // Classification
    public IntegrationType Type { get; init; }
    public IntegrationProvider Provider { get; init; }
    
    // Configuration
    public string? BaseUrl { get; set; }
    public string? AuthRef { get; set; }  // Never raw secrets
    public JsonDocument Configuration { get; set; }
    
    // Organization
    public string? Environment { get; set; }  // prod, staging, dev
    public string? Tags { get; set; }
    public string? OwnerId { get; set; }
    
    // Lifecycle
    public IntegrationStatus Status { get; private set; }
    public bool Paused { get; private set; }
    public string? PauseReason { get; private set; }
    
    // Health
    public DateTimeOffset? LastTestedAt { get; private set; }
    public bool? LastTestSuccess { get; private set; }
    public int ConsecutiveFailures { get; private set; }
    
    // Audit
    public DateTimeOffset CreatedAt { get; init; }
    public string CreatedBy { get; init; }
    public DateTimeOffset? ModifiedAt { get; private set; }
    public string? ModifiedBy { get; private set; }
    public int Version { get; private set; }
}

Lifecycle States

    ┌─────────┐
    │  Draft  │ ──── SubmitForVerification() ────►
    └─────────┘
         │
         ▼
┌───────────────────┐
│ PendingVerification│ ──── Test Success ────►
└───────────────────┘
         │
         ▼
    ┌──────────┐
    │  Active  │ ◄──── Resume() ────┐
    └──────────┘                     │
         │                           │
    Consecutive                 ┌─────────┐
    Failures ≥ 3                │ Paused  │
         │                      └─────────┘
         ▼                           ▲
   ┌───────────┐                     │
   │ Degraded  │ ──── Pause() ───────┘
   └───────────┘
         │
    Failures ≥ 5
         │
         ▼
    ┌──────────┐
    │  Failed  │
    └──────────┘

API Endpoints

Base path: /api/v1/integrations

MethodPathScopeDescription
GET/integrations.readList integrations with filtering
GET/{id}integrations.readGet integration by ID
POST/integrations.adminCreate integration
PUT/{id}integrations.adminUpdate integration
DELETE/{id}integrations.adminDelete integration
POST/{id}/testintegrations.adminTest connection
POST/{id}/pauseintegrations.adminPause integration
POST/{id}/resumeintegrations.adminResume integration
POST/{id}/activateintegrations.adminActivate integration
GET/{id}/healthintegrations.readGet health status

AuthRef Pattern

Critical: The Integration Catalog never stores raw credentials. All secrets are referenced via AuthRef strings that point to Authority’s secret store.

AuthRef format: ref://<scope>/<provider>/<key>
Example: ref://integrations/github/acme-org-token

The AuthRef is resolved at runtime when making API calls to the integration provider. This ensures:

  1. Secrets are stored centrally with proper encryption
  2. Secret rotation doesn’t require integration updates
  3. Audit trails track secret access separately
  4. Offline bundles can use different AuthRefs

Event Pipeline

Integration lifecycle events are published for consumption by Scheduler and Orchestrator:

EventTriggerConsumers
integration.createdNew integrationScheduler (schedule health checks)
integration.updatedConfiguration changeScheduler (reschedule)
integration.deletedIntegration removedScheduler (cancel jobs)
integration.pausedOperator pausedOrchestrator (pause jobs)
integration.resumedOperator resumedOrchestrator (resume jobs)
integration.healthyTest passedSignals (status update)
integration.unhealthyTest failedSignals, Notify (alert)

Audit Trail

All integration actions are logged:

Audit logs are stored in the append-only audit store for compliance.

Determinism & Offline

RBAC Scopes

ScopePermission
integrations.readView integrations and health
integrations.adminCreate, update, delete, test, pause, resume

Future Extensions

  1. Provider-specific testers: HTTP health checks, registry auth validation, SCM webhook verification.
  2. PostgreSQL persistence: Replace the in-memory repository for production deployments.
  3. Messaging events: Publish lifecycle events to Valkey Streams (or NATS JetStream where configured) instead of the current no-op sink.
  4. Health history: Track uptime percentage and latency over time.
  5. Bulk operations: Import/export integrations for environment promotion.

References