Skip to content

Commit 33539d8

Browse files
committed
feat: Use unstructured.Unstructured for search result resources, update OpenAPI definitions, and streamline deployment restarts.
1 parent 0c86b20 commit 33539d8

File tree

7 files changed

+48
-19
lines changed

7 files changed

+48
-19
lines changed

Taskfile.yaml

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -651,17 +651,10 @@ tasks:
651651
echo "Redeploying Search's apiserver..."
652652
653653
echo "Redeploying Search controller manager..."
654-
655-
# Restart the deployment to pick up new image
656-
task test-infra:kubectl -- rollout restart deployment/search-apiserver -n search-system
657-
task test-infra:kubectl -- rollout restart deployment/search-controller-manager -n search-system
658-
task test-infra:kubectl -- rollout restart deployment/resource-indexer -n search-system
659-
660-
# Wait for rollout to complete
661-
echo "Waiting for rollout to complete..."
662-
task test-infra:kubectl -- rollout status deployment/search-apiserver -n search-system --timeout=1000s
663-
task test-infra:kubectl -- rollout status deployment/search-controller-manager -n search-system --timeout=1000s
664-
task test-infra:kubectl -- rollout status deployment/resource-indexer -n search-system --timeout=1000s
654+
655+
task test-infra:kubectl -- delete pod -l app.kubernetes.io/name=search-apiserver -n search-system
656+
task test-infra:kubectl -- delete pod -l app.kubernetes.io/name=search-controller-manager -n search-system
657+
task test-infra:kubectl -- delete pod -l app.kubernetes.io/name=resource-indexer -n search-system
665658
666659
echo "✅ Redeployment complete!"
667660
echo "Check pods with: task test-infra:kubectl -- get pods -n search-system"

cmd/search/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ func (o *SearchServerOptions) Config() (*searchapiserver.Config, error) {
183183
genericConfig.EffectiveVersion = basecompatibility.NewEffectiveVersionFromString("1.35", "", "")
184184

185185
namer := apiopenapi.NewDefinitionNamer(searchapiserver.Scheme)
186-
genericConfig.OpenAPIV3Config = genericapiserver.DefaultOpenAPIV3Config(openapi.GetOpenAPIDefinitions, namer)
186+
genericConfig.OpenAPIV3Config = genericapiserver.DefaultOpenAPIV3Config(openapi.GetOpenAPIDefinitionsWithUnstructured, namer)
187187
genericConfig.OpenAPIV3Config.Info.Title = "Search"
188188
genericConfig.OpenAPIV3Config.Info.Version = version.Version
189189
genericConfig.OpenAPIV3Config.GetDefinitionName = func(name string) (string, spec.Extensions) {
@@ -192,7 +192,7 @@ func (o *SearchServerOptions) Config() (*searchapiserver.Config, error) {
192192
}
193193

194194
// Configure OpenAPI v2
195-
genericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(openapi.GetOpenAPIDefinitions, namer)
195+
genericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(openapi.GetOpenAPIDefinitionsWithUnstructured, namer)
196196
genericConfig.OpenAPIConfig.Info.Title = "Search"
197197
genericConfig.OpenAPIConfig.Info.Version = version.Version
198198
genericConfig.OpenAPIConfig.GetDefinitionName = func(name string) (string, spec.Extensions) {

config/samples/search_v1alpha1_searchquery.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,3 @@ spec:
99
kind: ConfigMap
1010
query: "" # Empty query returns everything, or put a specific string
1111
limit: 20
12-
offset: 0

internal/registry/searchquery/rest.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/golang-jwt/jwt/v5"
1212
apierrors "k8s.io/apimachinery/pkg/api/errors"
1313
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1415
"k8s.io/apimachinery/pkg/runtime"
1516
"k8s.io/apimachinery/pkg/runtime/schema"
1617
"k8s.io/apimachinery/pkg/util/validation/field"
@@ -280,8 +281,13 @@ func formatSearchResult(hit map[string]json.RawMessage) (searchv1alpha1.SearchRe
280281
return searchv1alpha1.SearchResult{}, err
281282
}
282283

284+
var obj unstructured.Unstructured
285+
if err := obj.UnmarshalJSON(b); err != nil {
286+
return searchv1alpha1.SearchResult{}, err
287+
}
288+
283289
return searchv1alpha1.SearchResult{
284-
Resource: runtime.RawExtension{Raw: b},
290+
Resource: obj,
285291
RelevanceScore: score,
286292
}, nil
287293
}

pkg/apis/search/v1alpha1/types.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package v1alpha1
33

44
import (
55
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
6-
"k8s.io/apimachinery/pkg/runtime"
6+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
77
)
88

99
// +k8s:openapi-gen=true
@@ -80,7 +80,7 @@ type SearchQueryStatus struct {
8080
// SearchResult represents a single search result with its relevance score.
8181
type SearchResult struct {
8282
// Resource contains the actual Kubernetes resource.
83-
Resource runtime.RawExtension `json:"resource"`
83+
Resource unstructured.Unstructured `json:"resource"`
8484

8585
// RelevanceScore is the relevance score from Meilisearch.
8686
// +optional
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package openapi
2+
3+
import (
4+
common "k8s.io/kube-openapi/pkg/common"
5+
spec "k8s.io/kube-openapi/pkg/validation/spec"
6+
)
7+
8+
// GetOpenAPIDefinitionsWithUnstructured wraps the generated GetOpenAPIDefinitions
9+
// and adds the missing definition for unstructured.Unstructured, which is a
10+
// special Kubernetes type that does not carry +k8s:openapi-gen markers in upstream.
11+
//
12+
// unstructured.Unstructured is an open-ended JSON object (the same wire format as
13+
// runtime.RawExtension) so the OpenAPI schema is simply "type: object" with
14+
// x-kubernetes-preserve-unknown-fields to allow arbitrary fields.
15+
func GetOpenAPIDefinitionsWithUnstructured(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition {
16+
defs := GetOpenAPIDefinitions(ref)
17+
defs["k8s.io/apimachinery/pkg/apis/meta/v1/unstructured.Unstructured"] = common.OpenAPIDefinition{
18+
Schema: spec.Schema{
19+
SchemaProps: spec.SchemaProps{
20+
Description: "Unstructured represents a Kubernetes resource as an arbitrary JSON object.",
21+
Type: []string{"object"},
22+
},
23+
VendorExtensible: spec.VendorExtensible{
24+
Extensions: spec.Extensions{
25+
"x-kubernetes-preserve-unknown-fields": true,
26+
},
27+
},
28+
},
29+
}
30+
return defs
31+
}

pkg/generated/openapi/zz_generated.openapi.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)