Bridge API
Status: Implemented Issue: none Parent: none
Goal
A frontend configures GitLab instances through an HTTP API instead of writing custom resources. The API grants a caller nothing beyond their own Kubernetes permissions.
Requirements
- Bridge exists only in a build with the
bridgetag, and serves only withENABLE_BRIDGE=true. Release images carry no Bridge. - The API lists, reads, creates, updates, and deletes
GitLabCoreresources, in one namespace or across every namespace the caller may list. - Every
/apirequest acts as the caller its bearer token names, never as the Operator. - A request with no token receives
401. A request the token may not perform receives403. - A value the resource definition would reject receives
422, which names the field. - The OpenAPI document carries the field constraints of the definition. A cross-field rule of the
definition comes back as the
422of the API server. - Only Secret references travel over the API, never a license key or a password.
- Each instance has at most one
Siphonthrough the API. The API finds it by its reference to the instance, whatever its name. - A
Siphoncreated through the API is named<instance>-siphon. A name longer than 31 characters receives422. - A read of the
Siphonof an instance reports none when the cluster does not serve the kind. - The
Orbitof an instance follows Orbit add-on. - The chart versions endpoint lists the versions of the chart repository, newest first. When the repository is unreachable or dynamic chart pull is off, it lists the bundled versions.
- The OpenAPI document, the documentation UI, and the SPA are served without a token.
- When the caller may list namespaces, the namespaces endpoint lists every namespace, sorted by name, without the hidden ones and without those being deleted. It also returns the rules for hidden names.
- A caller who may not list namespaces receives an empty list that says so, and the rules.
- Hidden names start with
kube-oropenshift-, or areopenshiftor one of the add-on namespacescert-manager,clickhouse-operator-system,cnpg-system,envoy-gateway-system,ingress-nginx,nats,seaweedfs-system, andtraefik. - The API creates a namespace by name. A hidden name, one that is not a DNS label, or a namespace
being deleted receives
422, and another existing one409. - Creating a
GitLabCorein a namespace that does not exist receives404, which names the namespace.
Out of scope
- Authentication by Bridge itself, in the cluster.
- The
v1beta1GitLabresource. - Exposing Bridge through a
Serviceor anIngress.
FAQ
- Why does Bridge not use the Operator ServiceAccount? It holds cluster-wide permissions, and every caller would inherit them. For more information, see ADR 34.
- Why do the paths say
gitlabswhen the resource isGitLabCore?/api/v1versions the Bridge API, not the custom resource. - Why does Bridge repeat the field validation of the definition? So the OpenAPI document and the generated client carry it, and a bad value fails in Bridge with the field named.
- Why does the namespaces endpoint hide some namespaces? They belong to the cluster or to the
add-ons an instance depends on, not to a GitLab instance. The add-on names are those the
repository’s guides and tests install. A
GitLabCorecreated in one of them through thegitlabsendpoints is still accepted. - Why does a caller who may not list namespaces get an empty list instead of
403? The form then takes a typed name, which the API server still authorizes. The rules come back either way. - Does Bridge label or delete the namespaces it creates? No.