Compare commits

...

2 Commits

Author SHA1 Message Date
t.behrendt 2f46a10388 docs: update CRD documentation
CI / install-dependencies (pull_request) Successful in 22s
CI / image check (pull_request) Failing after 7s
CI / check lint (pull_request) Successful in 26s
CI / test (pull_request) Successful in 22s
CI / check format (pull_request) Successful in 1m31s
CI / build check (pull_request) Successful in 14m44s
2026-05-25 13:13:50 +02:00
t.behrendt 5f0785502a feat: allow proxyProvider outpost field to be updated 2026-05-25 13:12:10 +02:00
4 changed files with 27 additions and 5 deletions
+3 -3
View File
@@ -34,9 +34,11 @@ spec:
invalidation_flow: 7acac1ef-19e3-4a6f-8d8d-14ca7031d184 invalidation_flow: 7acac1ef-19e3-4a6f-8d8d-14ca7031d184
# The external host of your application. # The external host of your application.
external_host: https://example.t00n.de external_host: https://example.t00n.de
# The ID of the outpost, which at current point in time can only be retrieved from Authentik directly. In this example: "Proxy-Forward-Auth-Auto"
outpost: e004ffe7-4af6-4ac1-9e9d-522354799e1f
``` ```
The ProxyProvider will be created in Authentik, but will not be assigned to an outpost or an application (Resources are TBD). The ProxyProvider will be created in Authentik and assigned to the configured outpost.
### Application ### Application
@@ -54,8 +56,6 @@ spec:
slug: application-example slug: application-example
# The ID of the provider, which can be retrieved from e.g. the ProxyPRovider via "kubectl get pp proxy-provider-example -o jsonpath='{.status.pk}'" # The ID of the provider, which can be retrieved from e.g. the ProxyPRovider via "kubectl get pp proxy-provider-example -o jsonpath='{.status.pk}'"
provider: 105 provider: 105
# The ID of the outpost, which at current point in time, can only be retrieved from Authentik directly. This value can also not be updated.
outpost: e004ffe7-4af6-4ac1-9e9d-522354799e1f
``` ```
### PolicyBinding ### PolicyBinding
+1 -1
View File
@@ -9,4 +9,4 @@ spec:
authorization_flow: 16896c6d-b326-42d1-8d3f-93f32921962e authorization_flow: 16896c6d-b326-42d1-8d3f-93f32921962e
invalidation_flow: 7acac1ef-19e3-4a6f-8d8d-14ca7031d184 invalidation_flow: 7acac1ef-19e3-4a6f-8d8d-14ca7031d184
external_host: https://example.t00n.de external_host: https://example.t00n.de
outpost: e004ffe7-4af6-4ac1-9e9d-522354799e1f outpost: ce8f74c0-88cd-47fe-96f5-d6507b739ceb
+5 -1
View File
@@ -212,9 +212,13 @@ func (c *ProxyProviderController) reconcileUpdate(ctx context.Context, pp *v1alp
if err != nil { if err != nil {
return fmt.Errorf("error when calling `ProvidersAPI.ProvidersProxyPartialUpdate`: %w with response %v", err, r) return fmt.Errorf("error when calling `ProvidersAPI.ProvidersProxyPartialUpdate`: %w with response %v", err, r)
} }
pp.Status.PK = strconv.Itoa(int(resp.Pk)) pp.Status.PK = strconv.Itoa(int(resp.Pk))
err = c.reconcileOutpost(ctx, pp.Spec.Outpost, int32(pk), ReconcileOutpostModeAdd)
if err != nil {
return fmt.Errorf("error when calling `reconcileOutpost`: %w", err)
}
return c.updateProxyProviderStatus(ctx, pp) return c.updateProxyProviderStatus(ctx, pp)
} }
@@ -123,6 +123,7 @@ func TestController_syncHandler_update(t *testing.T) {
pp.Status.PK = "42" pp.Status.PK = "42"
pp.Finalizers = []string{DeleteAuthentikProxyProviderFinalizer} pp.Finalizers = []string{DeleteAuthentikProxyProviderFinalizer}
var outpostPartialUpdateCalled bool
server := newAuthentikTestServer(t, authentikTestHandlers{ server := newAuthentikTestServer(t, authentikTestHandlers{
allRetrieve: func(w http.ResponseWriter, _ *http.Request) { allRetrieve: func(w http.ResponseWriter, _ *http.Request) {
writeJSON(t, w, http.StatusOK, map[string]any{"pk": 42}) writeJSON(t, w, http.StatusOK, map[string]any{"pk": 42})
@@ -130,6 +131,20 @@ func TestController_syncHandler_update(t *testing.T) {
proxyPartialUpdate: func(w http.ResponseWriter, _ *http.Request) { proxyPartialUpdate: func(w http.ResponseWriter, _ *http.Request) {
writeJSON(t, w, http.StatusOK, map[string]any{"pk": 42}) writeJSON(t, w, http.StatusOK, map[string]any{"pk": 42})
}, },
outpostRetrieve: outpostRetrieveHandler(t, nil),
outpostPartialUpdate: func(w http.ResponseWriter, r *http.Request) {
outpostPartialUpdateCalled = true
var body struct {
Providers []int32 `json:"providers"`
}
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
t.Fatalf("decode outpost patch body: %v", err)
}
if !slices.Contains(body.Providers, 42) {
t.Fatalf("patched providers = %v, want to contain 42", body.Providers)
}
writeJSON(t, w, http.StatusOK, map[string]any{"pk": testOutpostID, "providers": body.Providers})
},
}) })
t.Cleanup(server.Close) t.Cleanup(server.Close)
@@ -140,6 +155,9 @@ func TestController_syncHandler_update(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("syncHandler() error = %v", err) t.Fatalf("syncHandler() error = %v", err)
} }
if !outpostPartialUpdateCalled {
t.Fatal("expected Authentik outpost partial update call")
}
got := getProxyProvider(t, ctrl, pp.Namespace, pp.Name) got := getProxyProvider(t, ctrl, pp.Namespace, pp.Name)
if got.Status.PK != "42" { if got.Status.PK != "42" {