Skip to content

Commit 4a9caa9

Browse files
committed
feat: Introduce a standalone API server, remove webhooks, and integrate Etcd for local development and testing.
1 parent f7f3732 commit 4a9caa9

File tree

38 files changed

+6430
-1211
lines changed

38 files changed

+6430
-1211
lines changed

.github/workflows/test-environment-validation.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,26 @@ jobs:
8686
echo "⏳ Waiting for controller manager to be ready..."
8787
task test-infra:kubectl -- wait --for=condition=Ready pod -l app.kubernetes.io/name=search-controller-manager -n search-system --timeout=120s
8888
89+
# Wait for API server to be ready
90+
echo "⏳ Waiting for API server to be ready..."
91+
task test-infra:kubectl -- wait --for=condition=Ready pod -l app.kubernetes.io/name=search-apiserver -n search-system --timeout=120s
92+
93+
# Verify Aggregated API Availability (CA Injection)
94+
echo "⏳ Verifying Aggregated API Availability..."
95+
for i in {1..30}; do
96+
CA_LEN=$(task test-infra:kubectl -- get apiservice v1alpha1.policy.search.miloapis.com -o jsonpath='{len(.spec.caBundle)}' 2>/dev/null || echo "0")
97+
if [ "$CA_LEN" -gt "0" ]; then
98+
echo "✅ CA Bundle injected into APIService."
99+
break
100+
fi
101+
echo "Waiting for CA injection into APIService..."
102+
sleep 2
103+
done
104+
105+
# Verify Discovery works
106+
echo "Verifying API Discovery..."
107+
task test-infra:kubectl -- get resourceindexpolicies
108+
89109
echo "✓ Search components verification complete"
90110
91111
- name: Run end-to-end tests

.tmp/local-search-kubeconfig.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
apiVersion: v1
2+
clusters:
3+
- cluster:
4+
insecure-skip-tls-verify: true
5+
server: https://127.0.0.1:9443
6+
name: kind-test-infra
7+
contexts:
8+
- context:
9+
cluster: kind-test-infra
10+
user: kind-test-infra
11+
name: kind-test-infra
12+
current-context: kind-test-infra
13+
kind: Config
14+
preferences: {}
15+
users:
16+
- name: kind-test-infra
17+
user:
18+
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLVENDQWhHZ0F3SUJBZ0lJVTJwbEZvY1dVN1F3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TmpBeU1EVXlNREV5TlRSYUZ3MHlOekF5TURVeU1ERTNOVFJhTUR3eApIekFkQmdOVkJBb1RGbXQxWW1WaFpHMDZZMngxYzNSbGNpMWhaRzFwYm5NeEdUQVhCZ05WQkFNVEVHdDFZbVZ5CmJtVjBaWE10WVdSdGFXNHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFERktIMFIKcnJEanNXdjMzbHhQWlA5eDZYNnEzWENiZnJjdWhkSUxTbHhuVUQrcEpQZkx3T2pmVW04NDBpZnlDcWRNbDJUQwpnb1pXQXBnM1ZmMHZYeERYdjBaVHlSSWFMWHBkY1ZQcTBCVCs3OFFiRzF6TWRpYUNvZ3dsenRHZ1dlcElXdVUzCjdMOGNaL2pKeWJtZGZXdVMyVnhPYit4cVBIODVwWVMySDVvdDN4cVdqb3Y2Ri9Ya294VGFFT2F4WXkrWTd5QjEKUllDdytiaGFOa3Z5R2pxVWh4UTUzVWg5L3VtVHRUajRtWVplWkRxTWJqTU5ZQ3BDZGlzTFhhOVl3bzM0WC9aSApjS0Zhd3UzN0k5SHRjQnFxOXk3eU1pQlVZV2x1QTRQTWRRTFJqOEZUQlhkd2YvbUx4NnYwcHpEczd0VGt2M2trCjRxRVE4aHpXK09SZ09jZjdBZ01CQUFHalZqQlVNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUsKQmdnckJnRUZCUWNEQWpBTUJnTlZIUk1CQWY4RUFqQUFNQjhHQTFVZEl3UVlNQmFBRkVBVGpXT1pMRnRJMmpDZgo5eUh6ODc4ZEU0cTFNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUEvUWFNMWJrSTRQRnovdmxoUEg4RkNOQ1FpClBHdnI0VVMxVUJJck53cTg3djBSelQ5SzhLNTJ4dTVkbmtNWVhsTkYzT1Q0ZG9ocGRxQmxFR3ovMXNvTG94WUwKMk5jOE5BN2Ixb0FrUGNGVXZFbW9TWDkweHRFa0NPT1pGUFJRYThsTzM3bElNZkFiNnl4VlJsYXVGdVdpaTBGNwpNd3BaczVCRWI0MFZrcTYxYXQ5Vnk5Nm1NQ1JERDFpenJmcENhNlQ1bEk3SG9OeVk4Z1ZES1pPRmx6RTArY0FaCmdBSUZpQ05sYlF1WWxSSnBZRktoUk1wQk5JOFdKQjM0WXlWVjNBUVlKb053SWdIWE5ueitmUENaTG5KangxNHgKZlhFQ2xjNFVBZEYwNnVvZE0zRlY0aVRnNFl5VzduQjA0UFFUcmsyQm81WEdwSVp4MDMvcmVucGloU3J6Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
19+
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBeFNoOUVhNnc0N0ZyOTk1Y1QyVC9jZWwrcXQxd20zNjNMb1hTQzBwY1oxQS9xU1QzCnk4RG8zMUp2T05JbjhncW5USmRrd29LR1ZnS1lOMVg5TDE4UTE3OUdVOGtTR2kxNlhYRlQ2dEFVL3UvRUd4dGMKekhZbWdxSU1KYzdSb0ZucVNGcmxOK3kvSEdmNHljbTVuWDFya3RsY1RtL3NhangvT2FXRXRoK2FMZDhhbG82TAoraGYxNUtNVTJoRG1zV012bU84Z2RVV0FzUG00V2paTDhobzZsSWNVT2QxSWZmN3BrN1U0K0ptR1htUTZqRzR6CkRXQXFRbllyQzEydldNS04rRi8yUjNDaFdzTHQreVBSN1hBYXF2Y3U4aklnVkdGcGJnT0R6SFVDMFkvQlV3VjMKY0gvNWk4ZXI5S2N3N083VTVMOTVKT0toRVBJYzF2amtZRG5IK3dJREFRQUJBb0lCQURXbDI4cDQ5NGN0bXd4NgpoREhTY0xQbGJtTStHRXNuZ3Q3MDZQL0xmek5ab2NqNzF6V3BTM1NoTU1TTVl2UTRzK2RpZHJkNjN1VCtsYjdRCjlqRHl0Rm1Rb2FsZzJEMHBUTmVxWThSTVZMbytNZVdTWDREL1VXRlFpTytzeEZ2V3U2cHVtVnJMWUFGeHhUL2IKVlZlbWJpUXFZelN3dmVyMmhVUUJad2hMdHg5dHo5T05WU2VTakhDaGx5YzRmdFR5MnN2emFWQWloclFZZWRBawpQTXhIL1dvcS9sYmg1d1hYc2xlU2FOaFpBQ2NzUGl0WjBuOVlydFFweEkySjZ0WUxrKzl5Y0FkUlRWbkZYQ3Z6CmRiaFZUeFlNRUl4aS9LWmtYdjhWWDBjeEN2OEdMZEFwNWhSbjRYNWowUGtWdXhqcUFvVk9nVVFvNHlKSGJWS2oKMG5oZmJpRUNnWUVBL2grbkJOUUZVRGtsZGJvbzJ0bGJNRjZhK2lXRjZtZjJveFBidDRQdlNrcGkvRldIS3pTQgo4NzkzaVlZSytseUxJc0xoZURLSVpLTDBicUZvcHBpYkx1L2t4WFVCdVFhSlJEZHZXWUJqUUdVc1pYbmFPYlBoClFHYm1meGZtMmtXVHdIdDJ3a0dPMUhzZDgzZlJkcTNlVlNjd0lMUE1vcTdNQ2hLbjQ5d1gxNHNDZ1lFQXhwMG8KeHdnYVhzUVV3aWVRR3JJQ0hXdUpPMjlSZUJLUE5TS00rNFlBTVUyUTZoWHFuMW5KR1VUS2Vpbm9CRmliUHJKQQpRc1Q2RzRyYTZuWXVaSnlFaWNFazBsM3ZNVFhhZFhwRW1ucmZ3WnJjTVFteTA5ZzZYNEFDWWtlMVB0YjlKM0JVCjg5TjBuUEYyMXdJM0dQOUVlVUw2anN2UFZRZStva3FRN05GV1gxRUNnWUVBeEpDdE8xSFk3azNWeVBOL1NKRWEKTlJib241ZEl0NkZGS0sxaXBkZjZ6eWNzMit3NFN0WXBzdVltUzQwUWpzbm9vYkhHZjVmdTRwRWRxemxVM3BCcQpjT3NFdFN1bGNuNDR6VGhuKy80UVI2NDZvaCtZQ2t3MmJ2OXBTV091b0tWeS9VOUM5RTJMY3BYcysvZHhZWEJwCjZzb09NeTJBbTFIRDZBSzROTXQ0OGJNQ2dZQmtTWThCa1BIZjBCcTdQc2JnOCtsbGVaczl5NlBUZ1d1V1pPL1QKUVlKdllyODlzL3RZb3ptTDdOUmdnekNJb1VVaWoxY3JYOUw2ZlU2MC9SL0g1ZEIyem5RTlZTa21MQTgzS3BuaApkeEhzN0lrcXFiOEdnVFJZYkliSG9YVy9XVWRTMXNIT3JJTkJqQnQ1emNDTWVyalVraUY2WVNjN3hFRmFLVlNzCmY3ZWhRUUtCZ0FOSTB1aTNnbXZDQzIrUDZUekRzMmJNN0JIRFkwd3p2aE1WQzQ5SDY2amdScGNVTkNiODRwamIKM0NKVlhUZHpNMDdVRzJ1aVZ1RFQ0MEVZa2p5NFp3RW5wc3hKSWpHcTcrR1FQZ05DTk03VG1QMzI0ajhXWU1uMQpYaUxUT2d0aWR2VFY3QyszU1BRRzFTbUkyaWxJdGhYWTg3MXk0eGd0NFhyaXZSczdWdkhRCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==

Taskfile.yaml

Lines changed: 118 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -119,20 +119,42 @@ tasks:
119119
cmds:
120120
- echo "Generating deepcopy and object files..."
121121
- "\"{{.TOOL_DIR}}/controller-gen\" object paths=\"./pkg/apis/...\""
122-
- echo "Generating CRD manifests for each package..."
123-
- |
124-
set -e
125-
for package_dir in pkg/apis/*/; do
126-
package_name=$(basename "$package_dir")
127-
echo "Generating CRDs for package: $package_name"
128-
mkdir -p "config/crd/bases/$package_name"
129-
"{{.TOOL_DIR}}/controller-gen" crd paths="./$package_dir..." output:dir="./config/crd/bases/$package_name"
130-
done
131-
- echo "Generating webhook files..."
132-
- "\"{{.TOOL_DIR}}/controller-gen\" webhook paths=\"./internal/webhooks/...\" output:dir=\"./config/webhook\""
133122
# Generate RBAC rules for the controllers.
134123
- echo "Generating RBAC rules for the controllers..."
135124
- "\"{{.TOOL_DIR}}/controller-gen\" rbac:roleName=milo-controller-manager paths=\"./internal/controllers/...\" output:dir=\"./config/controller-manager/overlays/core-control-plane/rbac\""
125+
- task: generate:openapi
126+
silent: true
127+
128+
generate:openapi:
129+
desc: Generate OpenAPI definitions for search API types
130+
deps:
131+
- task: install-go-tool
132+
vars:
133+
NAME: openapi-gen
134+
PACKAGE: k8s.io/code-generator/cmd/openapi-gen
135+
VERSION: v0.23.0
136+
cmds:
137+
- echo "Generating OpenAPI definitions..."
138+
- |
139+
set -e
140+
# Packages to generate OpenAPI for
141+
PACKAGES=(
142+
"pkg/apis/policy/v1alpha1"
143+
"pkg/apis/search/v1alpha1"
144+
)
145+
146+
for REL_DIR in "${PACKAGES[@]}"; do
147+
PKG="go.miloapis.net/search/$REL_DIR"
148+
echo "Generating OpenAPI for $PKG..."
149+
150+
"{{.TOOL_DIR}}/openapi-gen" \
151+
--input-dirs "$PKG,k8s.io/apimachinery/pkg/apis/meta/v1,k8s.io/apimachinery/pkg/runtime,k8s.io/apimachinery/pkg/version" \
152+
--output-package "$REL_DIR" \
153+
--output-base "." \
154+
--output-file-base "zz_generated.openapi" \
155+
--go-header-file "hack/boilerplate.go.txt" \
156+
--report-filename "$REL_DIR/api_violations.report"
157+
done
136158
silent: true
137159

138160
# Test tasks
@@ -191,6 +213,26 @@ tasks:
191213
echo "📦 Installing infrastructure dependencies..."
192214
echo ""
193215
216+
# ============================================================
217+
# Install Etcd
218+
# ============================================================
219+
echo "📦 Installing Etcd..."
220+
221+
echo "Applying Etcd resources..."
222+
task test-infra:kubectl -- apply -k config/dependencies/etcd
223+
224+
echo "Waiting for Etcd namespace to be created..."
225+
task test-infra:kubectl -- wait --for=jsonpath='{.status.phase}'=Active namespace/etcd-system --timeout=30s 2>/dev/null || echo "⚠️ Namespace not ready yet"
226+
227+
echo "Waiting for Etcd HelmRelease to be ready..."
228+
task test-infra:kubectl -- wait --for=condition=ready helmrelease/etcd -n etcd-system --timeout=300s 2>/dev/null || echo "⚠️ Etcd HelmRelease not ready yet"
229+
230+
echo "Waiting for Etcd pods to be ready..."
231+
task test-infra:kubectl -- wait --for=condition=ready pod -l app.kubernetes.io/name=etcd -n etcd-system --timeout=120s 2>/dev/null || echo "⚠️ Etcd pods not ready yet"
232+
233+
echo "✅ Etcd installed"
234+
echo ""
235+
194236
# ============================================================
195237
# Install NATS
196238
# ============================================================
@@ -269,24 +311,36 @@ tasks:
269311
task test-infra:kubectl -- apply -k config/components/nats-streams
270312
271313
echo "⏳ Waiting for NATS stream to be ready..."
272-
task test-infra:kubectl -- wait --for=condition=ready stream/audit-events -n nats-system --timeout=60s 2>/dev/null || echo "⚠️ Stream not ready yet"
314+
task test-infra:kubectl -- wait --for=condition=ready stream/audit-events -n nats-system --timeout=120s 2>/dev/null || echo "⚠️ Stream not ready yet"
273315
274316
echo ""
275317
echo "📋 Deploying Search server and components..."
276318
task test-infra:kubectl -- apply -k config/overlays/dev
277319
278-
echo ""
320+
echo "⏳ Waiting for Search API Server to be ready..."
321+
task test-infra:kubectl -- wait --for=condition=available deployment/search-apiserver -n search-system --timeout=120s 2>/dev/null || echo "⚠️ Search API Server not ready yet"
322+
323+
echo "⏳ Waiting for Search Controller Manager to be ready..."
324+
task test-infra:kubectl -- wait --for=condition=available deployment/search-controller-manager -n search-system --timeout=120s 2>/dev/null || echo "⚠️ Search Controller Manager not ready yet"
325+
279326
echo "✅ Search server and all dependencies deployed successfully!"
280327
echo ""
281328
echo "📊 Check status:"
282329
echo " All resources: task test-infra:kubectl -- get all -n search-system"
283330
echo " Vector pods: task test-infra:kubectl -- get pods -l app.kubernetes.io/instance=vector-sidecar -n search-system"
284331
echo " NATS pods: task test-infra:kubectl -- get pods -n nats-system"
285332
echo " NATS streams: task test-infra:kubectl -- get streams -n nats-system"
333+
echo " Meilisearch pods: task test-infra:kubectl -- get pods -n meilisearch-system"
334+
echo " Etcd pods: task test-infra:kubectl -- get pods -n etcd-system"
335+
echo " Search Server pods: task test-infra:kubectl -- get pods -n search-system"
286336
echo ""
287337
echo "📋 View logs:"
288338
echo " Vector: task test-infra:kubectl -- logs -l app.kubernetes.io/instance=vector-sidecar -n search-system -f"
289339
echo " NATS: task test-infra:kubectl -- logs -l app.kubernetes.io/name=nats -n nats-system -f"
340+
echo " Meilisearch: task test-infra:kubectl -- logs -l app.kubernetes.io/name=meilisearch -n meilisearch-system -f"
341+
echo " Etcd: task test-infra:kubectl -- logs -l app.kubernetes.io/name=etcd -n etcd-system -f"
342+
echo " Search API Server: task test-infra:kubectl -- logs -l app.kubernetes.io/name=search-apiserver -n search-system -f"
343+
echo " Search Controller: task test-infra:kubectl -- logs -l app.kubernetes.io/name=search-controller-manager -n search-system -f"
290344
291345
dev:generate-webhook-certs:
292346
desc: Generate all certificates for webhook server
@@ -297,34 +351,64 @@ tasks:
297351
export CA_BUNDLE
298352
# Dynamically patch the generated manifest to use local host url and injected CA bundle
299353
perl -0777 -pe 's/(\s*)clientConfig:\n\s+service:\n\s+name: webhook-service\n\s+namespace: system\n\s+path: (.*)/$1clientConfig:\n$1 url: https:\/\/host.docker.internal:9443$2\n$1 caBundle: $ENV{CA_BUNDLE}/' config/webhook/manifests.yaml | task test-infra:kubectl -- apply -f -
300-
354+
301355
dev:run-controller:
302-
desc: Run the controller manager locally (requires kubeconfig)
303-
deps:
304-
- dev:apply-crd
305-
- dev:generate-webhook-certs
356+
desc: Run the controller manager against the LOCAL Search API server (127.0.0.1:9443)
306357
cmds:
358+
- |
359+
# Generate a temporary kubeconfig pointing to localhost:9443
360+
mkdir -p .tmp
361+
kubectl config view --minify --raw | \
362+
sed "s|server:.*|server: https://127.0.0.1:9443|g" | \
363+
sed "s|certificate-authority-data:.*|insecure-skip-tls-verify: true|g" \
364+
> .tmp/local-search-kubeconfig.yaml
365+
- |
366+
echo "🚀 Running controller against local Search API server..."
367+
KUBECONFIG=.tmp/local-search-kubeconfig.yaml go run ./cmd/search controller-manager \
368+
--metrics-bind-address=:8085 \
369+
--health-probe-bind-address=:8086 \
370+
--leader-elect=false
371+
silent: true
372+
373+
dev:pf-etcd:
374+
desc: Port forward Etcd for local development
375+
cmds:
376+
- echo "Port forwarding Etcd to localhost:2379..."
377+
- task test-infra:kubectl -- port-forward -n etcd-system svc/etcd 2379:2379
378+
379+
dev:run-apiserver:
380+
desc: Run the API server locally (requires dev:pf-etcd running)
381+
cmds:
382+
- |
383+
# Ensure kubeconfig is up to date with the current Kind cluster port
384+
echo "Syncing kubeconfig for cluster '{{.TEST_INFRA_CLUSTER_NAME}}'..."
385+
kind export kubeconfig --name "{{.TEST_INFRA_CLUSTER_NAME}}"
307386
- |
308387
current_context=$(kubectl config current-context)
309-
if [ "$current_context" != "kind-test-infra" ]; then
310-
echo "❌ Error: Wrong context! You are in '$current_context', but must be in 'kind-test-infra'."
388+
if [ "$current_context" != "kind-{{.TEST_INFRA_CLUSTER_NAME}}" ]; then
389+
echo "❌ Error: Wrong context! You are in '$current_context', but must be in 'kind-{{.TEST_INFRA_CLUSTER_NAME}}'."
311390
echo "Please run context switch command first."
312391
exit 1
313392
fi
393+
- mkdir -p "{{.CERTS_DIR}}"
314394
- |
315-
go run ./cmd/search controller-manager \
316-
--metrics-bind-address=:8082 \
317-
--health-probe-bind-address=:8083 \
318-
--webhook-cert-path={{.CERTS_DIR}} \
319-
--webhook-cert-name=server.crt \
320-
--webhook-cert-key=server.key
321-
silent: true
322-
323-
dev:apply-crd:
324-
desc: Apply all CRDs from config/crd/bases to the cluster
325-
cmds:
326-
- task test-infra:kubectl -- apply -R -f config/crd/bases
327-
silent: true
395+
# Extract Kind CA to allowed local kubectl to authenticate via client certs
396+
kubectl config view --minify --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' | base64 -d > "{{.CERTS_DIR}}/kind-ca.crt"
397+
- echo "Running Search API Server locally..."
398+
- echo "Ensure you are running 'task dev:pf-etcd' in another terminal!"
399+
- |
400+
# Use KUBECONFIG if set, otherwise fallback to default
401+
KCFG=${KUBECONFIG:-$HOME/.kube/config}
402+
go run ./cmd/search serve \
403+
--etcd-servers http://127.0.0.1:2379 \
404+
--secure-port 9443 \
405+
--bind-address 127.0.0.1 \
406+
--authentication-skip-lookup=true \
407+
--authentication-kubeconfig="$KCFG" \
408+
--authorization-kubeconfig="$KCFG" \
409+
--kubeconfig="$KCFG" \
410+
--client-ca-file="{{.CERTS_DIR}}/kind-ca.crt" \
411+
--authorization-always-allow-paths=/healthz,/readyz,/livez,/openapi,/openapi/v2,/openapi/v3,/apis,/api
328412
329413
dev:undeploy:
330414
desc: Undeploy Search server from test-infra cluster
@@ -489,6 +573,7 @@ tasks:
489573
echo "Redeploying Search controller manager..."
490574
491575
# Restart the deployment to pick up new image
576+
task test-infra:kubectl -- rollout restart deployment/search-apiserver -n search-system
492577
task test-infra:kubectl -- rollout restart deployment/search-controller-manager -n search-system
493578
494579
# Wait for rollout to complete

cmd/search/main.go

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import (
44
"context"
55
"fmt"
66
"os"
7+
"strings"
78

89
"github.com/spf13/cobra"
910
"github.com/spf13/pflag"
1011
searchapiserver "go.miloapis.net/search/internal/apiserver"
1112
"go.miloapis.net/search/internal/version"
12-
"go.miloapis.net/search/pkg/generated/openapi"
13+
policyv1alpha1 "go.miloapis.net/search/pkg/apis/policy/v1alpha1"
14+
searchv1alpha1 "go.miloapis.net/search/pkg/apis/search/v1alpha1"
1315
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1416
apiopenapi "k8s.io/apiserver/pkg/endpoints/openapi"
1517
genericapiserver "k8s.io/apiserver/pkg/server"
@@ -20,6 +22,7 @@ import (
2022
"k8s.io/component-base/logs"
2123
logsapi "k8s.io/component-base/logs/api/v1"
2224
"k8s.io/klog/v2"
25+
"k8s.io/kube-openapi/pkg/common"
2326

2427
"go.miloapis.net/search/cmd/search/manager"
2528

@@ -33,6 +36,32 @@ func init() {
3336
utilfeature.DefaultMutableFeatureGate.Set("RemoteRequestHeaderUID=true")
3437
}
3538

39+
func GetOpenAPIDefinitions(cb common.ReferenceCallback) map[string]common.OpenAPIDefinition {
40+
defs := make(map[string]common.OpenAPIDefinition)
41+
42+
merge := func(pkgDefs map[string]common.OpenAPIDefinition) {
43+
for k, v := range pkgDefs {
44+
// For k8s.io types, store both the original key and the transformed key
45+
// because the namer behavior is inconsistent across different types
46+
if strings.HasPrefix(k, "k8s.io/") {
47+
// Store original key (with slashes)
48+
defs[k] = v
49+
// Also store transformed key (io.k8s with dots)
50+
newK := "io.k8s." + k[7:]
51+
newK = strings.ReplaceAll(newK, "/", ".")
52+
defs[newK] = v
53+
} else {
54+
// For non-k8s.io types, keep as-is
55+
defs[k] = v
56+
}
57+
}
58+
}
59+
60+
merge(policyv1alpha1.GetOpenAPIDefinitions(cb))
61+
merge(searchv1alpha1.GetOpenAPIDefinitions(cb))
62+
return defs
63+
}
64+
3665
func main() {
3766
cmd := NewSearchServerCommand()
3867
code := cli.Run(cmd)
@@ -125,12 +154,6 @@ func NewSearchServerOptions() *SearchServerOptions {
125154
Logs: logsapi.NewLoggingConfiguration(),
126155
}
127156

128-
// Disable etcd since storage implementation is external
129-
o.RecommendedOptions.Etcd = nil
130-
131-
// Disable admission plugins since this server doesn't mutate or validate resources.
132-
o.RecommendedOptions.Admission = nil
133-
134157
return o
135158
}
136159

@@ -161,12 +184,12 @@ func (o *SearchServerOptions) Config() (*searchapiserver.Config, error) {
161184
genericConfig.EffectiveVersion = basecompatibility.NewEffectiveVersionFromString("1.34", "", "")
162185

163186
namer := apiopenapi.NewDefinitionNamer(searchapiserver.Scheme)
164-
genericConfig.OpenAPIV3Config = genericapiserver.DefaultOpenAPIV3Config(openapi.GetOpenAPIDefinitions, namer)
187+
genericConfig.OpenAPIV3Config = genericapiserver.DefaultOpenAPIV3Config(GetOpenAPIDefinitions, namer)
165188
genericConfig.OpenAPIV3Config.Info.Title = "Search"
166189
genericConfig.OpenAPIV3Config.Info.Version = version.Version
167190

168191
// Configure OpenAPI v2
169-
genericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(openapi.GetOpenAPIDefinitions, namer)
192+
genericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(GetOpenAPIDefinitions, namer)
170193
genericConfig.OpenAPIConfig.Info.Title = "Search"
171194
genericConfig.OpenAPIConfig.Info.Version = version.Version
172195

0 commit comments

Comments
 (0)