1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-28 02:18:15 +00:00

fix external.metrics.k8s.io/v1beta1 issue (#4139)

* fix external.metrics.k8s.io/v1beta1 issue

* update find resource discovery method

* revert validate.go

* revert chnages

* update discovery method

* fix error handler issue

* add logger support
This commit is contained in:
Vyankatesh Kudtarkar 2022-07-01 08:30:05 +05:30 committed by GitHub
parent 606b2cb946
commit 12693e1a9c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 46 additions and 11 deletions

View file

@ -21,6 +21,7 @@ type IDiscovery interface {
GetServerVersion() (*version.Info, error)
OpenAPISchema() (*openapiv2.Document, error)
DiscoveryCache() discovery.CachedDiscoveryInterface
DiscoveryInterface() discovery.DiscoveryInterface
}
// serverPreferredResources stores the cachedClient instance for discovery client
@ -33,6 +34,11 @@ func (c serverPreferredResources) DiscoveryCache() discovery.CachedDiscoveryInte
return c.cachedClient
}
// DiscoveryInterface gets the discovery client
func (c serverPreferredResources) DiscoveryInterface() discovery.DiscoveryInterface {
return c.cachedClient
}
// Poll will keep invalidate the local cache
func (c serverPreferredResources) Poll(resync time.Duration, stopCh <-chan struct{}) {
logger := logger.WithName("Poll")
@ -56,6 +62,7 @@ func (c serverPreferredResources) Poll(resync time.Duration, stopCh <-chan struc
// OpenAPISchema returns the API server OpenAPI schema document
func (c serverPreferredResources) OpenAPISchema() (*openapiv2.Document, error) {
return c.cachedClient.OpenAPISchema()
}
// GetGVRFromKind get the Group Version Resource from kind
@ -111,12 +118,12 @@ func (c serverPreferredResources) findResource(apiVersion string, kind string) (
var serverResources []*metav1.APIResourceList
var err error
if apiVersion == "" {
serverResources, err = c.cachedClient.ServerPreferredResources()
serverResources, err = discovery.ServerPreferredResources(c.DiscoveryInterface())
} else {
_, serverResources, err = c.cachedClient.ServerGroupsAndResources()
_, serverResources, err = discovery.ServerGroupsAndResources(c.DiscoveryInterface())
}
if err != nil {
if err != nil && !strings.Contains(err.Error(), "Got empty response for") {
if discovery.IsGroupDiscoveryFailedError(err) {
logDiscoveryErrors(err, c)
} else if isMetricsServerUnavailable(kind, err) {

View file

@ -67,3 +67,6 @@ func (c *fakeDiscoveryClient) OpenAPISchema() (*openapiv2.Document, error) {
func (c *fakeDiscoveryClient) DiscoveryCache() discovery.CachedDiscoveryInterface {
return nil
}
func (c *fakeDiscoveryClient) DiscoveryInterface() discovery.DiscoveryInterface {
return nil
}

View file

@ -10,12 +10,14 @@ import (
"github.com/googleapis/gnostic/compiler"
openapiv2 "github.com/googleapis/gnostic/openapiv2"
"github.com/kyverno/kyverno/pkg/dclient"
util "github.com/kyverno/kyverno/pkg/utils"
"github.com/pkg/errors"
"gopkg.in/yaml.v3"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
runtimeSchema "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/discovery"
"sigs.k8s.io/controller-runtime/pkg/log"
)
@ -24,6 +26,10 @@ type crdSync struct {
controller *Controller
}
const (
skipErrorMsg = "Got empty response for"
)
// crdDefinitionPrior represents CRDs version prior to 1.16
var crdDefinitionPrior struct {
Spec struct {
@ -68,7 +74,7 @@ func (c *crdSync) Run(workers int, stopCh <-chan struct{}) {
log.Log.Error(err, "failed to update in-cluster api versions")
}
newDoc, err := c.client.Discovery().DiscoveryCache().OpenAPISchema()
newDoc, err := c.client.Discovery().OpenAPISchema()
if err != nil {
log.Log.Error(err, "cannot get OpenAPI schema")
}
@ -107,7 +113,7 @@ func (c *crdSync) sync() {
log.Log.Error(err, "sync failed, unable to update in-cluster api versions")
}
newDoc, err := c.client.Discovery().DiscoveryCache().OpenAPISchema()
newDoc, err := c.client.Discovery().OpenAPISchema()
if err != nil {
log.Log.Error(err, "cannot get OpenAPI schema")
}
@ -119,13 +125,14 @@ func (c *crdSync) sync() {
}
func (c *crdSync) updateInClusterKindToAPIVersions() error {
_, apiResourceLists, err := c.client.Discovery().DiscoveryCache().ServerGroupsAndResources()
if err != nil {
util.OverrideRuntimeErrorHandler()
_, apiResourceLists, err := discovery.ServerGroupsAndResources(c.client.Discovery().DiscoveryInterface())
if err != nil && !strings.Contains(err.Error(), skipErrorMsg) {
return errors.Wrapf(err, "fetching API server groups and resources")
}
preferredAPIResourcesLists, err := c.client.Discovery().DiscoveryCache().ServerPreferredResources()
if err != nil {
preferredAPIResourcesLists, err := discovery.ServerPreferredResources(c.client.Discovery().DiscoveryInterface())
if err != nil && !strings.Contains(err.Error(), skipErrorMsg) {
return errors.Wrapf(err, "fetching API server preferreds resources")
}

View file

@ -29,6 +29,7 @@ import (
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/util/validation/field"
"k8s.io/apimachinery/pkg/util/yaml"
"k8s.io/client-go/discovery"
"sigs.k8s.io/controller-runtime/pkg/log"
)
@ -103,7 +104,7 @@ func Validate(policy kyvernov1.PolicyInterface, client dclient.Interface, mock b
clusterResources := sets.NewString()
if !mock && namespaced {
// Get all the cluster type kind supported by cluster
res, err := client.Discovery().DiscoveryCache().ServerPreferredResources()
res, err := discovery.ServerPreferredResources(client.Discovery().DiscoveryInterface())
if err != nil {
return nil, err
}

View file

@ -17,6 +17,7 @@ import (
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/client-go/discovery"
"sigs.k8s.io/controller-runtime/pkg/log"
)
@ -338,3 +339,19 @@ func ApiextensionsJsonToKyvernoConditions(original apiextensions.JSON) (interfac
}
return nil, fmt.Errorf("error occurred while parsing %s: %+v", path, err)
}
func OverrideRuntimeErrorHandler() {
logger := log.Log.WithName("RuntimeErrorHandler")
if len(runtime.ErrorHandlers) > 0 {
runtime.ErrorHandlers[0] = func(err error) {
logger.V(6).Info("runtime error: %s", err)
}
} else {
runtime.ErrorHandlers = []func(err error){
func(err error) {
logger.V(6).Info("runtime error: %s", err)
},
}
}
}