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{}