github.com/splunk/dan1-qbec@v0.7.3/internal/remote/discovery-cache.go (about) 1 // Copyright 2017 The kubecfg authors 2 // 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 16 package remote 17 18 // copied from kubecfg and modified as needed. 19 20 import ( 21 "sync" 22 23 "github.com/emicklei/go-restful/swagger" 24 "github.com/googleapis/gnostic/OpenAPIv2" 25 26 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 27 "k8s.io/apimachinery/pkg/version" 28 "k8s.io/client-go/discovery" 29 "k8s.io/client-go/rest" 30 ) 31 32 type cacheDiscoveryClient struct { 33 cl discovery.DiscoveryInterface 34 lock sync.RWMutex 35 serverGroups *metav1.APIGroupList 36 serverResources map[string]*metav1.APIResourceList 37 schemas map[string]*swagger.ApiDeclaration 38 schema *openapi_v2.Document 39 } 40 41 // newCachedDiscoveryClient creates a new DiscoveryClient that caches results in memory 42 func newCachedDiscoveryClient(cl discovery.DiscoveryInterface) discovery.CachedDiscoveryInterface { 43 c := &cacheDiscoveryClient{cl: cl} 44 c.Invalidate() 45 return c 46 } 47 48 func (c *cacheDiscoveryClient) Fresh() bool { 49 return true 50 } 51 52 func (c *cacheDiscoveryClient) Invalidate() { 53 c.lock.Lock() 54 defer c.lock.Unlock() 55 56 c.serverGroups = nil 57 c.serverResources = make(map[string]*metav1.APIResourceList) 58 c.schemas = make(map[string]*swagger.ApiDeclaration) 59 } 60 61 func (c *cacheDiscoveryClient) RESTClient() rest.Interface { 62 return c.cl.RESTClient() 63 } 64 65 func (c *cacheDiscoveryClient) ServerGroups() (*metav1.APIGroupList, error) { 66 c.lock.Lock() 67 defer c.lock.Unlock() 68 69 var err error 70 if c.serverGroups != nil { 71 return c.serverGroups, nil 72 } 73 c.serverGroups, err = c.cl.ServerGroups() 74 return c.serverGroups, err 75 } 76 77 func (c *cacheDiscoveryClient) ServerResourcesForGroupVersion(groupVersion string) (*metav1.APIResourceList, error) { 78 c.lock.Lock() 79 defer c.lock.Unlock() 80 81 var err error 82 if v := c.serverResources[groupVersion]; v != nil { 83 return v, nil 84 } 85 c.serverResources[groupVersion], err = c.cl.ServerResourcesForGroupVersion(groupVersion) 86 return c.serverResources[groupVersion], err 87 } 88 89 func (c *cacheDiscoveryClient) ServerResources() ([]*metav1.APIResourceList, error) { 90 return c.cl.ServerResources() 91 } 92 93 func (c *cacheDiscoveryClient) ServerPreferredResources() ([]*metav1.APIResourceList, error) { 94 return c.cl.ServerPreferredResources() 95 } 96 97 func (c *cacheDiscoveryClient) ServerPreferredNamespacedResources() ([]*metav1.APIResourceList, error) { 98 return c.cl.ServerPreferredNamespacedResources() 99 } 100 101 func (c *cacheDiscoveryClient) ServerVersion() (*version.Info, error) { 102 return c.cl.ServerVersion() 103 } 104 105 func (c *cacheDiscoveryClient) OpenAPISchema() (*openapi_v2.Document, error) { 106 c.lock.Lock() 107 defer c.lock.Unlock() 108 109 if c.schema != nil { 110 return c.schema, nil 111 } 112 113 sch, err := c.cl.OpenAPISchema() 114 if err != nil { 115 return nil, err 116 } 117 118 c.schema = sch 119 return sch, nil 120 } 121 122 var _ discovery.CachedDiscoveryInterface = &cacheDiscoveryClient{}