Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
9a2b3f6
feat(dhei-20905): api and gen for dds
valenok4000 Jun 29, 2026
9cc7467
feat(dhei-20905): add info for exposure and subs
valenok4000 Jun 30, 2026
5e4f0ad
feat(dhei-20905): add copyright header
valenok4000 Jun 30, 2026
c33ed13
feat(dhei-20905): delete memeories dds from OS
valenok4000 Jun 30, 2026
360fc12
feat(dhei-20905): add mapping for FileExposure and FileSubscription a…
valenok4000 Jul 1, 2026
a5ba5da
feat(dhei-20905): add webhook and validation for file types
valenok4000 Jul 1, 2026
9361abd
feat(dhei-20905): change config/feature comment
valenok4000 Jul 3, 2026
4fa6383
feat(dhei-20905): file domain exp/subs handler
valenok4000 Jul 3, 2026
cfc8343
feat(dhei-20905): fix comments of PR
valenok4000 Jul 6, 2026
a8ce3f6
feat(dhei-20905): add tests and info files
valenok4000 Jul 8, 2026
b79a651
feat(dhei-20905): move public keys to the sftp lvl of the file domain…
valenok4000 Jul 17, 2026
924b7cc
feat(sftp integration): dhei-20905 delete . "github.com/onsi/gomega…
valenok4000 Jul 22, 2026
0117241
feat(sftp integration): fix hardcoded approval strategy
valenok4000 Jul 23, 2026
9c10b72
feat(sftp integration): delete the variant proccessing
valenok4000 Jul 24, 2026
7bab199
feat(sftp integration): delete the variant proccessing
valenok4000 Jul 24, 2026
bb0e344
owner name normalization
valenok4000 Jul 24, 2026
2e1c050
Merge branch 'main' into feat/ar-dds-integration-dhei-20905
valenok4000 Jul 27, 2026
d0c6eb3
backmerge from main
valenok4000 Jul 27, 2026
ebf66cb
Merge branch 'main' into feat/ar-dds-integration-dhei-20905
valenok4000 Aug 3, 2026
56d19fb
fix the conditional block
valenok4000 Aug 3, 2026
1e098e6
add tests for coverage
valenok4000 Aug 3, 2026
661c1a8
add tests
valenok4000 Aug 4, 2026
d02a25f
add tests
valenok4000 Aug 4, 2026
85e967d
feat(rover): lint fix
valenok4000 Aug 4, 2026
a919ca5
Merge branch 'main' into feat/ar-dds-integration-dhei-20905
valenok4000 Aug 4, 2026
7bac2f9
feat: fix failing tests
valenok4000 Aug 4, 2026
ee6e844
feat: sum forgotten
valenok4000 Aug 4, 2026
dbd17cd
feat: add test file add header
valenok4000 Aug 4, 2026
c805a59
feat: add test file
valenok4000 Aug 4, 2026
e67fe8c
feat: enable file feature
valenok4000 Aug 5, 2026
c3a0d8a
Merge branch 'main' into feat/ar-dds-integration-dhei-20905
valenok4000 Aug 6, 2026
7816412
feat(sftp): implement sftp domain (#440)
lukas016 Aug 3, 2026
d833bf2
feat(file): implement file domain
lukas016 Jun 26, 2026
0ed8be3
fix(file): update license year
lukas016 Aug 3, 2026
b44c2ce
fix(file): improve manifest
lukas016 Aug 4, 2026
8ebb6e5
fix(file): check proper zone namespace in webhook
lukas016 Aug 4, 2026
446684e
fix(file): optimize code
lukas016 Aug 4, 2026
501f1b0
feat(file): test obj reference in webhook tests
lukas016 Aug 4, 2026
972c03f
feat(file): use shared internal certificate authority
lukas016 Aug 6, 2026
0c2cd81
feat: add/modify tests
valenok4000 Aug 6, 2026
eb28a5f
feat: back reuse compl
valenok4000 Aug 6, 2026
8b801e8
feat: changed rbac group name
valenok4000 Aug 6, 2026
b714f2c
Merge branch 'feat-lk-file-domain' into feat/ar-dds-integration-dhei-…
valenok4000 Aug 7, 2026
b33b50e
feat: fixed after merge file domain
valenok4000 Aug 7, 2026
1df512d
Merge branch 'main' into feat/ar-dds-plus-file-integration-dhei-20905
valenok4000 Aug 7, 2026
4383ca0
feat: update generated code
valenok4000 Aug 10, 2026
70513ad
Merge branch 'main' into feat/ar-dds-plus-file-integration-dhei-20905
valenok4000 Aug 12, 2026
51c5d62
feat: backmerge
valenok4000 Aug 12, 2026
3962494
Merge remote-tracking branch 'origin/feat/ar-dds-plus-file-integratio…
valenok4000 Aug 12, 2026
0f6b4d7
Merge branch 'main' into feat/ar-dds-plus-file-integration-dhei-20905
valenok4000 Aug 14, 2026
94c9618
Merge branch 'main' into feat/ar-dds-plus-file-integration-dhei-20905
valenok4000 Aug 24, 2026
c7411a8
feat: generated after back merge
valenok4000 Aug 24, 2026
d174e5a
feat: update rover mod
valenok4000 Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -368,4 +368,25 @@ jobs:
run_check_generated_files: true
ko_build_path: "cmd/main.go"
coverage_threshold: 66
lint_fail_on_issues: true
lint_fail_on_issues: true

sftp:
name: SFTP
uses: ./.github/workflows/reusable-go-ci.yaml
with:
name: sftp
module: sftp
run_check_generated_files: true
ko_build_path: "cmd/sftp-operator/main.go"
coverage_threshold: 66
lint_fail_on_issues: true

file:
name: File
uses: ./.github/workflows/reusable-go-ci.yaml
with:
name: file
module: file
run_check_generated_files: true
ko_build_path: "cmd/file-operator/main.go"
lint_fail_on_issues: true
22 changes: 20 additions & 2 deletions .goreleaser.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,24 @@ builds:
goarch:
- amd64
- arm64
- id: sftp-operator
dir: sftp
main: cmd/sftp-operator/main.go
binary: sftp-operator
goos:
- linux
goarch:
- amd64
- arm64
- id: file-operator
dir: file
main: cmd/file-operator/main.go
binary: file-operator
goos:
- linux
goarch:
- amd64
- arm64
archives:
- id: rover-ctl
ids: [rover-ctl]
Expand Down Expand Up @@ -255,7 +273,7 @@ release:
sboms:
- artifacts: archive

kos:
kos:
- id: common-server
build: common-server
main: .
Expand Down Expand Up @@ -684,4 +702,4 @@ kos:
- latest
- "{{.Tag}}"
- "{{if not .Prerelease}}stable{{end}}"
bare: true
bare: true
1 change: 1 addition & 0 deletions common/pkg/config/feature.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ var (
FeatureSecretManager Feature = NewFeature("secret_manager", true) // Secret Manager feature enabled by default
FeatureFileManager Feature = NewFeature("file_manager", true) // File Manager feature enabled by default
FeatureAiGateway Feature = NewFeature("ai_gateway", false) // AI Gateway (MCP) feature disabled by default
FeatureFile Feature = NewFeature("file", true)
)

// SetFeatureEnabled sets the enabled state for a feature. Intended for tests.
Expand Down
45 changes: 45 additions & 0 deletions docs/docs/architecture/file.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
---
sidebar_position: 12
---

<!--
SPDX-FileCopyrightText: 2025 Deutsche Telekom AG

SPDX-License-Identifier: CC0-1.0
-->

# File Domain

The File domain manages file-type exposure and subscription resources. It acts as the business-logic layer between Rover-style file declarations and runtime solutions such as SFTP.

## Custom Resources

<CRDReference domain="file" />

## Reconciliation Flow

```
FileType registered
├──▶ FileExposure selected as active provider
│ ├──▶ SFTP Instance created for the active provider zone
│ └──▶ Provider SSH public keys synced to the FileType SFTP User
├──▶ SFTP User created for the active file type with an instanceRef
└──▶ FileSubscription created by a consumer
├──▶ ApprovalRequest created from the active FileExposure approval strategy
└──▶ Subscription-owned SFTP User synced after approval is granted
```

FileExposure and FileSubscription resources reference a `FileType` by name with `spec.fileType`. SFTP-specific public keys are configured through `spec.sftp`, and `spec.zone` points at the ZoneServiceConfig used for provider-side SFTP access. ZoneServiceConfig resources hold the SFTP API managed-route configuration plus internal and external service endpoints, and they must have the same name and namespace as the corresponding admin Zone. The File operator reads the identity realm reference from that Zone, creates an identity client for the managed route, and projects the resolved endpoint, token endpoint, client ID, and client secret to the SFTP domain as an SFTPServiceConfig with the same name and namespace. The active FileExposure creates an SFTP Instance for that zone, and SFTP users reference that instance through `spec.instanceRef`.

## Domain Interactions

- **Rover domain** - File declarations can create FileType, FileExposure, and FileSubscription resources.
- **SFTP domain** - The File operator creates User, Instance, and SFTPServiceConfig resources. Provider keys are stored on the FileType-owned SFTP User, while each granted FileSubscription owns a separate SFTP User with its subscriber keys.
- **Approval domain** - FileExposure carries approval settings for subscription workflows. FileSubscription creates ApprovalRequest and Approval references, waits while approval is pending, provisions a subscriber SFTP User after approval is granted, and deletes it if approval is denied.

## Related Pages

- [Architecture: Rover Domain](./rover.mdx)
1 change: 1 addition & 0 deletions docs/docs/architecture/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,4 @@ Each domain is described in detail on its own page:
| [PubSub](./pubsub.mdx) | Runtime layer for publish/subscribe messaging |
| [Secret Manager](./secret-manager.mdx) | Centralized secret storage, references, and retrieval |
| [ControlPlane API & Projector](./controlplane-api.mdx) | Read-only external access layer (CQRS) for the UI |
| [SFTP](./sftp.mdx) | SFTP service provisioning and SSH public key synchronization |
16 changes: 16 additions & 0 deletions docs/docs/architecture/rover.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,26 @@ Users interact with the Rover domain through three paths:
- **Application domain** — Creates Application resources.
- **API domain** — Creates Api, ApiExposure, and ApiSubscription resources.
- **Event domain** — Creates EventExposure and EventSubscription resources.
- **File domain (SFTP)** — Creates the SFTP user (shared space) from a `FileSpecification` and registers producer/consumer SSH public keys for `fileType` exposures and subscriptions. Gated behind the `file` feature flag.
- **Gateway domain** — Configures traffic management settings.
- **Identity domain** — Configures authentication settings.
- **Approval domain** — Integrates approval requirements for exposures.

## File Types (SFTP)

Rover can configure an external SFTP file-transfer service without changing the customer-facing Rover file:

- A `FileSpecification` (`metadata.name` must equal `spec.type`) provisions an SFTP user with a default shared space.
- A `fileType` **exposure** (producer) or **subscription** (consumer) with `variant: sftp` and one or more `publicKeys` registers those SSH keys on the matching SFTP user.

Validation rules enforced by the Rover webhook:

- `fileType` exposures/subscriptions are only allowed on the `cetus` and `canis` zones.
- `variant: sftp` is optional.
- At least one public key is required; both the key `label` and `key` value must be unique per `fileType`.

Because file transfer happens directly over SFTP, a Rover that only exposes/subscribes to file types yields a **logical** Application (`needsClient` and `needsConsumer` are `false`). If the same Rover also has an API or event subscription, a client is still required.

## Related Pages

- [User Journey: Onboarding](../user-journey/onboarding.md)
Expand Down
52 changes: 52 additions & 0 deletions docs/docs/architecture/sftp.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
---
sidebar_position: 14
---

<!--
SPDX-FileCopyrightText: 2025 Deutsche Telekom AG

SPDX-License-Identifier: CC0-1.0
-->

# SFTP Domain

The SFTP domain manages SSH key-based access to the SFTP Service. It translates Kubernetes resources into SFTP Tardis API calls, provisions service users for SFTP instances, and keeps the public keys for those users synchronized from the declared `User` resources.

## Custom Resources

<CRDReference domain="sftp" />

## Resource Model

SFTP resources follow a simple dependency chain:

```mermaid
graph TD
SFTPServiceConfig["SFTPServiceConfig<br/>SFTP Tardis API access"]
Instance["Instance<br/>SFTP service user"]
User["User<br/>SSH public keys"]

SFTPServiceConfig --> Instance
Instance --> User
```

- A **SFTPServiceConfig** defines the SFTP Tardis API endpoint and OAuth2 client credentials for a zone.
- An **Instance** references an SFTPServiceConfig and represents one SFTP service user in the external service.
- A **User** references an Instance and contributes one or more SSH public keys to that instance.

## Reconciliation Flow

The SFTPServiceConfig controller validates the configured API credentials by creating or refreshing an SFTP service client. The Instance controller then uses that client to create or update the SFTP service user in the external service.

When User resources change, the Instance controller collects all Users that reference the Instance, canonicalizes their SSH public keys, deduplicates them by fingerprint, and updates the public key set for the SFTP service user.
After a successful key sync, the Instance status records the observed per-User `Processing` condition. The User controller watches those Instance status changes, mirrors the relevant `Processing` condition onto each User, and derives the User `Ready` condition from it.

## Domain Interactions

- **Secret Manager** — SFTPServiceConfig can resolve SFTP Tardis client secrets from Secret Manager references during reconciliation.
- **SFTP Tardis API** — The SFTP operator creates, updates, and deletes SFTP service users and synchronizes their public keys through this external API.

## Related Pages

- [Architecture Overview](./overview.md)
- [Reference: API](../reference/api.md)
2 changes: 1 addition & 1 deletion docs/docs/developer-journey/local-development.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ Every operator directory exposes a consistent set of Make targets:

| Target | Description |
|--------|-------------|
| `manifests` | Generate CRDs, RBAC, and webhook manifests |
| `manifests` | Generate CRDs, RBAC, and webhook manifests where configured |
| `generate` | Generate DeepCopy methods |
| `fmt` | Run `go fmt` |
| `vet` | Run `go vet` |
Expand Down
1 change: 1 addition & 0 deletions docs/docs/overview/components.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ Domain operators are the core building blocks of the Control Plane. Each operato
| [Identity](../architecture/identity.mdx) | Manages identity providers, realms, and service-account clients through Keycloak. Provides authentication and authorization for all platform interactions. |
| [Event](../architecture/event.mdx) | Handles event publishing and subscribing, including cross-zone meshing. An optional feature that bridges user configuration (Rover) with the PubSub runtime. |
| [PubSub](../architecture/pubsub.mdx) | The runtime configuration layer for publish/subscribe messaging via Horizon. Managed exclusively by the Event domain. |
| [SFTP](../architecture/sftp.mdx) | Manages SFTP service instances and SSH public keys, synchronizing Kubernetes resources with the external SFTP service. |

## Services

Expand Down
17 changes: 16 additions & 1 deletion docs/docs/reference/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ Most users do not create these resources directly. Instead, they write a single
| [Organization](#organization) | `organization.cp.ei.telekom.de/v1` | 2 |
| [PubSub](#pubsub) | `pubsub.cp.ei.telekom.de/v1` | 3 |
| [Rover](#rover) | `rover.cp.ei.telekom.de/v1` | 3 |
| | **Total** | **34** |
| [SFTP](#sftp) | `sftp.cp.ei.telekom.de/v1` | 3 |
| | **Total** | **37** |

---

Expand Down Expand Up @@ -189,6 +190,20 @@ The primary user-facing interface for declarative application configuration.

---

### SFTP

**API Group:** `sftp.cp.ei.telekom.de/v1` · [Architecture →](../architecture/sftp.mdx)

SFTP service provisioning and SSH public key synchronization.

| Kind | Description |
| ---- | ----------- |
| **SFTPServiceConfig** | Configures zone-specific SFTP Tardis API access and OAuth2 client credentials. |
| **Instance** | Represents an SFTP service instance and provisions a corresponding SFTP service user through the configured SFTPServiceConfig. |
| **User** | Declares SSH public keys for an SFTP user and attaches them to an Instance. |

---

## REST API

In addition to the Kubernetes CRDs, the Control Plane exposes two REST APIs.
Expand Down
10 changes: 10 additions & 0 deletions docs/docs/reference/json-schemas.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,16 @@ The following tables list all available schemas, grouped by domain. Click a sche

---

### SFTP

| Kind | Schema |
| ---- | ------ |
| **Instance** | [`instance_v1.json`](pathname:///schemas/sftp.cp.ei.telekom.de/instance_v1.json) |
| **User** | [`user_v1.json`](pathname:///schemas/sftp.cp.ei.telekom.de/user_v1.json) |
| **SFTPServiceConfig** | [`sftpserviceconfig_v1.json`](pathname:///schemas/sftp.cp.ei.telekom.de/sftpserviceconfig_v1.json) |

---

## Schema Index

A machine-readable index of all available schemas is published at [`schemas/index.json`](pathname:///schemas/index.json). This can be used by tooling to discover schemas programmatically.
Expand Down
1 change: 1 addition & 0 deletions docs/scripts/generate-crd-data.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ const DOMAINS = [
"organization",
"pubsub",
"rover",
"sftp",
];

// ─────────────────────────────────────────────────────────────────────────────
Expand Down
1 change: 1 addition & 0 deletions docs/scripts/generate-crd-schemas.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ const DOMAINS = [
"organization",
"pubsub",
"rover",
"sftp",
];

// ─────────────────────────────────────────────────────────────────────────────
Expand Down
35 changes: 35 additions & 0 deletions file/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Copyright 2026 Deutsche Telekom IT GmbH
#
# SPDX-License-Identifier: Apache-2.0

# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
bin/*
Dockerfile.cross

# Test binary, built with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Go workspace file
go.work*

# Kubernetes Generated files - skip generated files, except for vendored files
!vendor/**/zz_generated.*

# editor and IDE paraphernalia
.idea
.vscode
*.swp
*.swo
*~

# Test reports
gotest.log
ginkgo-junit.xml
Loading
Loading