From 364009ad4b0ac61d3deec5f3f22288e20c1de70d Mon Sep 17 00:00:00 2001 From: Ramon Quitales Date: Thu, 7 Dec 2023 15:25:42 -0800 Subject: [PATCH] Improve openapi lazy loading to not refetch --- provider/pkg/provider/provider.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/provider/pkg/provider/provider.go b/provider/pkg/provider/provider.go index f8096a3bcf..e42311421b 100644 --- a/provider/pkg/provider/provider.go +++ b/provider/pkg/provider/provider.go @@ -195,16 +195,22 @@ func (k *kubeProvider) getResources() (k8sopenapi.Resources, error) { return k.resources, nil } +// openAPIResourcesGetter is a simple implementation of k8sopenapi.OpenAPIResourcesGetter that returns a fixed set of +// resources. Our current use case already has the resources available, so we just need to wrap them in this struct to +// satisfy the interface. type openAPIResourcesGetter struct { - k *kubeProvider + resources k8sopenapi.Resources } func (o *openAPIResourcesGetter) OpenAPISchema() (k8sopenapi.Resources, error) { - return o.k.getResources() + return o.resources, nil } -func (k *kubeProvider) getResourcesLazy() k8sopenapi.OpenAPIResourcesGetter { - return &openAPIResourcesGetter{k} +// getResourcesLazy returns a openAPIResourcesGetter which implements k8sopenapi.OpenAPIResourcesGetter. This is +// required since the upstream openapi.ValidateAgainstSchema function requires a k8sopenapi.OpenAPIResourcesGetter since +// v0.29.0 of the k8s.io/kubectl library for lazy loading. +func (k *kubeProvider) getResourcesLazy(resources k8sopenapi.Resources) k8sopenapi.OpenAPIResourcesGetter { + return &openAPIResourcesGetter{resources} } func (k *kubeProvider) invalidateResources() { @@ -1442,7 +1448,7 @@ func (k *kubeProvider) Check(ctx context.Context, req *pulumirpc.CheckRequest) ( } // Validate the object according to the OpenAPI schema for its GVK. - err = openapi.ValidateAgainstSchema(k.getResourcesLazy(), resources, newInputs) + err = openapi.ValidateAgainstSchema(k.getResourcesLazy(resources), resources, newInputs) if err != nil { resourceNotFound := apierrors.IsNotFound(err) || strings.Contains(err.Error(), "is not supported by the server")