Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 3 additions & 0 deletions docs/developers/clusterprovider/02-develop.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ Most ClusterProviders will probably require some form of configuration. Since th
### Cluster Profiles

Out of the configuration(s), the ClusterProvider has to generate `ClusterProfile` resources. They serve as some kind of service discovery and look like this:

```yaml
apiVersion: clusters.openmcp.cloud/v1alpha1
kind: ClusterProfile
Expand Down Expand Up @@ -66,6 +67,7 @@ Note that each ClusterProvider must at least generate one `ClusterProfile` in or
### Cluster Management

The main purpose of ClusterProviders is the management of k8s clusters. Each ClusterProvider therefore needs a controller that reconciles the `Cluster` resource, which looks like this:

```yaml
apiVersion: clusters.openmcp.cloud/v1alpha1
kind: Cluster
Expand Down Expand Up @@ -117,6 +119,7 @@ Note that any kind of kubeconfig should not be part of the cluster's status - ac
### Access Management

ClusterProviders are not only responsible for creating and deleting k8s clusters, but also for managing access to their clusters. Controllers and human users can request access to a cluster by creating an `AccessRequest` resource which looks like this:

```yaml
apiVersion: clusters.openmcp.cloud/v1alpha1
kind: AccessRequest
Expand Down
13 changes: 0 additions & 13 deletions docs/developers/clusterprovider/04-design.mdx

This file was deleted.

11 changes: 0 additions & 11 deletions docs/developers/platformprovider/01-deployment.mdx

This file was deleted.

15 changes: 0 additions & 15 deletions docs/developers/platformprovider/03-develop.mdx

This file was deleted.

11 changes: 0 additions & 11 deletions docs/developers/platformprovider/04-examples.mdx

This file was deleted.

13 changes: 0 additions & 13 deletions docs/developers/platformprovider/05-design.mdx

This file was deleted.

4 changes: 0 additions & 4 deletions docs/developers/platformprovider/_category_.json

This file was deleted.

76 changes: 76 additions & 0 deletions docs/developers/platformservice/01-examples.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
sidebar_position: 1
---

# Examples

Platform Services that deliver infrastructure capabilities within OpenControlPlane. Use these as inspiration to build your own integrations or contribute improvements.

## Official Platform Services

<div className="ecosystem-grid">

<div className="project-card">
<div className="project-card-header">
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="project-logo"><polyline points="13 17 18 12 13 7"></polyline><polyline points="6 17 11 12 6 7"></polyline></svg>
<h3>platform-service-gateway</h3>
</div>
<div className="project-description">
Enables the Gateway API on openMCP backend clusters for cross-cluster webhook communication using Envoy Gateway.
</div>
<div className="project-links">
<a href="https://github.com/openmcp-project/platform-service-gateway" className="project-link project-link-primary" target="_blank" rel="noopener noreferrer"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg> GitHub</a>
</div>
</div>

<div className="project-card">
<div className="project-card-header">
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="project-logo"><circle cx="12" cy="12" r="10"></circle><line x1="2" y1="12" x2="22" y2="12"></line><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path></svg>
<h3>platform-service-dns</h3>
</div>
<div className="project-description">
Manages cross-cluster DNS routing by reconciling Cluster resources and deploying external-dns with cluster-specific configurations.
</div>
<div className="project-links">
<a href="https://github.com/openmcp-project/platform-service-dns" className="project-link project-link-primary" target="_blank" rel="noopener noreferrer"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg> GitHub</a>
</div>
</div>

<div className="project-card">
<div className="project-card-header">
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="project-logo"><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path><polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline><line x1="12" y1="22.08" x2="12" y2="12"></line></svg>
<h3>platform-service-gardener-ipam</h3>
</div>
<div className="project-description">
Automates CIDR block management for Gardener clusters, injecting unique IP ranges to prevent conflicts in multi-cluster deployments.
</div>
<div className="project-links">
<a href="https://github.com/openmcp-project/platform-service-gardener-ipam" className="project-link project-link-primary" target="_blank" rel="noopener noreferrer"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg> GitHub</a>
</div>
</div>

</div>

## Community Platform Services

<div className="ecosystem-grid">

<div className="project-card project-card-cta project-card-disabled" style={{position: 'relative', opacity: 0.6, filter: 'grayscale(0.5)'}}>
<div style={{position: 'absolute', top: '16px', right: '16px', background: 'linear-gradient(135deg, #6B7280 0%, #4B5563 100%)', color: 'white', padding: '4px 12px', borderRadius: '6px', fontSize: '0.75rem', fontWeight: '700', boxShadow: '0 2px 8px rgba(0,0,0,0.15)', zIndex: 10, whiteSpace: 'nowrap'}}>Coming Soon</div>
<div className="project-card-header">
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="16"></line><line x1="8" y1="12" x2="16" y2="12"></line></svg>
<h3>Build Your Own</h3>
</div>
<div className="project-description">
Use our template to create your own Platform Service and contribute it to the community.
</div>
<div className="project-links">
<span className="project-link project-link-primary" style={{opacity: 0.5, cursor: 'not-allowed', pointerEvents: 'none', display: 'inline-flex', alignItems: 'center', justifyContent: 'center'}}><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg> Template Repository</span>
</div>
</div>

</div>

These projects serve as reference implementations for building Platform Services. Refer to the [Service Provider Deploy Guide](../serviceprovider/01-deployment.mdx) for the common deployment contract that applies to all provider types, or contribute improvements to existing services.

**Want to get involved?** Join our developer community through [SIG Extensibility](https://github.com/openmcp-project/community/tree/main/sig-extensibility) - see the [Build Together overview](../getting-started#join-the-community) for details on how to connect with other provider developers.
4 changes: 4 additions & 0 deletions docs/developers/platformservice/_category_.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"label": "Platform Services",
"position": 4
}
12 changes: 6 additions & 6 deletions docs/developers/serviceprovider/02-service-providers.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ This test bootstraps a complete local openMCP installation with all required com

- **The platform cluster** where your service provider is managed by the [openmcp-operator](https://github.com/openmcp-project/openmcp-operator)
- **The onboarding cluster** where end users request the domain service you provider offers.
- **A managed control plane cluster (MCP)** where your service provider installs its [DomainServiceAPI](https://openmcp-project.github.io/docs/about/design/service-provider#api) and optionally its workload.
- **An optional workload cluster**, provisioned when using the template flag `-w`. Your service provider then requests a workload cluster from the `openmcp-operator` to deploy its workload outside the MCP. This will result in another kind cluster.
- **A managed control plane cluster** where your service provider installs its [DomainServiceAPI](https://openmcp-project.github.io/docs/about/design/service-provider#api) and optionally its workload.
- **An optional workload cluster**, provisioned when using the template flag `-w`. Your service provider then requests a workload cluster from the `openmcp-operator` to deploy its workload outside the managed control plane. This will result in another kind cluster.

:::info
This means running the above command from the [Service Provider Template Usage](#service-provider-template-usage) section with `-w` like this:
Expand Down Expand Up @@ -238,7 +238,7 @@ Your `Reconciler` must implement two functions: `CreateOrUpdate` and `Delete`. T

### CreateOrUpdate Operation

The template example contains a basic implementation that installs a CRD into the tenant MCP.
The template example contains a basic implementation that installs a CRD into the tenant ManagedControlPlane.

```go
// CreateOrUpdate is called on every add or update event
Expand All @@ -260,7 +260,7 @@ func (r *FooServiceReconciler) CreateOrUpdate(ctx context.Context, svcobj *apiv1
}
```

In a real world example like Velero, this step contains installing and reconciling every required resource, including CRDs, namespace(s), service account(s), deployments(s), etc. into the MCP and workload cluster.
In a real world example like Velero, this step contains installing and reconciling every required resource, including CRDs, namespace(s), service account(s), deployments(s), etc. into the managed control plane and workload cluster.

The `ClusterContext` provides access to all request specific clusters. This always includes the managed control plane and, when requested, the workload cluster associated with the current request.

Expand Down Expand Up @@ -535,9 +535,9 @@ In here, the values, for example, could come from the `ProviderConfig`. Or furth
being created as a first step.

Also notice the `KubeConfig` section. Your service provider controller is deployed in the Platform cluster. The target controller that your provider is deploying
will run in either the MCP or the Workload cluster. This depends on your choice, however, it is recommended to deploy into the workload cluster as documented [here](https://openmcp-project.github.io/docs/about/design/service-provider/#non-goals).
will run in either the managed control plane or the workload cluster. This depends on your choice, however, it is recommended to deploy into the workload cluster as documented [here](https://openmcp-project.github.io/docs/about/design/service-provider/#non-goals).

This means that Flux will need a KubeConfig in order to deploy to the ManagedControlPlane cluster. And this is the KubeConfig that is given to Flux in this section.
This means that Flux will need a KubeConfig in order to deploy to the managed control plane cluster. And this is the KubeConfig that is given to Flux in this section.

:::info
Note, that as of this writing, it's a bit difficult to obtain the KubeConfig for the Workload Cluster. MCPCluster KubeConfig is obtained via a AccessRequest. For an example,
Expand Down
25 changes: 25 additions & 0 deletions docs/developers/serviceprovider/03-examples.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,31 @@ Community Service Providers that extend OpenControlPlane. Use these as inspirati
<div className="project-links">
<a href="https://github.com/openmcp-project/service-provider-crossplane" className="project-link project-link-primary" target="_blank" rel="noopener noreferrer"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg> GitHub</a>
</div>
<div className="cloud-providers">
<div className="cloud-providers-label">Endorsed Crossplane providers:</div>
<div className="cloud-providers-list">
<a href="https://github.com/crossplane-contrib/provider-aws" className="provider-badge provider-badge-aws" target="_blank" rel="noopener noreferrer">
<img src="/docs/img/logos/aws.svg" alt="AWS" className="provider-logo" />
AWS
</a>
<a href="https://github.com/crossplane-contrib/provider-upjet-azure" className="provider-badge provider-badge-azure" target="_blank" rel="noopener noreferrer">
<img src="/docs/img/logos/azure.svg" alt="Azure" className="provider-logo" />
Azure
</a>
<a href="https://github.com/crossplane-contrib/provider-upjet-gcp" className="provider-badge provider-badge-gcp" target="_blank" rel="noopener noreferrer">
<img src="/docs/img/logos/gcp.svg" alt="GCP" className="provider-logo" />
GCP
</a>
<a href="https://sap.github.io/crossplane-provider-docs/" className="provider-badge provider-badge-sap" target="_blank" rel="noopener noreferrer">
<img src="/docs/img/logos/sap.svg" alt="SAP" className="provider-logo" />
SAP BTP
</a>
<a href="https://github.com/ionos-cloud/crossplane-provider-ionoscloud" className="provider-badge provider-badge-ionos" target="_blank" rel="noopener noreferrer">
<img src="/docs/img/logos/ionos.svg" alt="IONOS" className="provider-logo" />
IONOS
</a>
</div>
</div>
</div>

<div className="project-card">
Expand Down
12 changes: 6 additions & 6 deletions docs/developers/serviceprovider/design.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ sequenceDiagram
%% messages
usr->>sp: request domain service through ServiceProviderAPI
sp->>ds: deploys
sp-->>usr: installs DomainServiceAPI in user MCP
sp-->>usr: installs DomainServiceAPI in user ManagedControlPlane
usr->>ds: uses domain service through DomainServiceAPI
```

Expand Down Expand Up @@ -120,8 +120,8 @@ graph TD
SPC[ServiceProviderConfig]
end

%% MCP Cluster
subgraph MCPCluster
%% ManagedControlPlane Cluster
subgraph MCPCluster[ManagedControlPlane Cluster]
DS[DomainService]
DSAPI[DomainServiceAPI]
end
Expand All @@ -144,8 +144,8 @@ graph TD
Landscaper
end

%% MCP Cluster
subgraph MCPCluster
%% ManagedControlPlane Cluster
subgraph MCPCluster[ManagedControlPlane Cluster]
Crossplane
Installation
Bucket
Expand Down Expand Up @@ -192,7 +192,7 @@ The following table provides a simplified overview of the layers within a `Servi

This section outlines the main functionality implemented within the runtime. Currently, the focus is on establishing consistency across `ServiceProvider` implementations. However, this section can be extended in the future to include more generic `ServiceProvider` concepts that are handled within the runtime.

Main tasks towards MCP/Workload Clusters (based on watching the `ServiceProviderAPI`):
Main tasks towards ManagedControlPlane/Workload Clusters (based on watching the `ServiceProviderAPI`):

- Observe Service Deployment (Drift Detection) -> IN: context, apiObject, reconcileScope; OUT: bool[exists, drift], error
- Create Service Deployment (Init Lifecycle) -> IN: context, apiObject, reconcileScope; OUT: error
Expand Down
File renamed without changes.
File renamed without changes.
Loading