This repository has been archived by the owner on Oct 29, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 147
/
ns_cache.go
90 lines (75 loc) · 2.64 KB
/
ns_cache.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package resourcecache
import (
"context"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
v12 "k8s.io/apimachinery/pkg/apis/meta/v1"
v1 "github.com/networkservicemesh/networkservicemesh/k8s/pkg/apis/networkservice/v1alpha1"
"github.com/networkservicemesh/networkservicemesh/k8s/pkg/networkservice/clientset/versioned"
. "github.com/networkservicemesh/networkservicemesh/k8s/pkg/networkservice/informers/externalversions"
"github.com/networkservicemesh/networkservicemesh/k8s/pkg/networkservice/namespace"
)
type NetworkServiceCache struct {
cache abstractResourceCache
networkServices map[string]*v1.NetworkService
getCh chan *v1.NetworkService
}
//NewNetworkServiceCache creates cache for network services
func NewNetworkServiceCache(policy CacheFilterPolicy) *NetworkServiceCache {
rv := &NetworkServiceCache{
networkServices: make(map[string]*v1.NetworkService),
}
config := cacheConfig{
keyFunc: getNsKey,
resourceAddedFunc: rv.resourceAdded,
resourceDeletedFunc: rv.resourceDeleted,
resourceGetFunc: rv.resourceGet,
resourceType: NsResource,
}
rv.cache = newAbstractResourceCache(config, policy)
return rv
}
func (c *NetworkServiceCache) Get(key string) *v1.NetworkService {
v := c.cache.get(key)
if v != nil {
return v.(*v1.NetworkService)
}
return nil
}
func (c *NetworkServiceCache) Add(ns *v1.NetworkService) {
c.cache.add(ns)
}
func (c *NetworkServiceCache) Delete(key string) {
c.cache.delete(key)
}
func (c *NetworkServiceCache) Start(f SharedInformerFactory, init ...v1.NetworkService) (func(), error) {
c.replace(init)
return c.cache.start(f)
}
func (c *NetworkServiceCache) StartWithResync(f SharedInformerFactory, cs *versioned.Clientset) (func(), error) {
l, err := cs.NetworkserviceV1alpha1().NetworkServices(namespace.GetNamespace()).List(context.TODO(), v12.ListOptions{})
if err != nil {
return nil, errors.Wrap(err, "unable to list NSs for cache initialization: %v")
}
return c.Start(f, l.Items...)
}
func (c *NetworkServiceCache) replace(resources []v1.NetworkService) {
c.networkServices = map[string]*v1.NetworkService{}
logrus.Infof("Replacing Network services with: %v", resources)
for i := 0; i < len(resources); i++ {
c.resourceAdded(&resources[i])
}
}
func (c *NetworkServiceCache) resourceAdded(obj interface{}) {
ns := obj.(*v1.NetworkService)
c.networkServices[ns.Name] = ns
}
func (c *NetworkServiceCache) resourceDeleted(key string) {
delete(c.networkServices, key)
}
func (c *NetworkServiceCache) resourceGet(key string) interface{} {
return c.networkServices[key]
}
func getNsKey(obj interface{}) string {
return obj.(*v1.NetworkService).Name
}