forked from networkservicemesh/networkservicemesh
/
nsm_cache.go
110 lines (91 loc) · 3.63 KB
/
nsm_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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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 NetworkServiceManagerCache struct {
cache abstractResourceCache
networkServiceManagers map[string]*v1.NetworkServiceManager
}
//NewNetworkServiceManagerCache creates cache for network service managers
func NewNetworkServiceManagerCache(policy CacheFilterPolicy) *NetworkServiceManagerCache {
rv := &NetworkServiceManagerCache{
networkServiceManagers: make(map[string]*v1.NetworkServiceManager),
}
config := cacheConfig{
keyFunc: getNsmKey,
resourceAddedFunc: rv.resourceAdded,
resourceDeletedFunc: rv.resourceDeleted,
resourceUpdatedFunc: rv.resourceUpdated,
resourceGetFunc: rv.resourceGet,
resourceType: NsmResource,
}
rv.cache = newAbstractResourceCache(config, policy)
return rv
}
func (c *NetworkServiceManagerCache) Get(key string) *v1.NetworkServiceManager {
v := c.cache.get(key)
if v != nil {
return v.(*v1.NetworkServiceManager)
}
return nil
}
func (c *NetworkServiceManagerCache) Add(nsm *v1.NetworkServiceManager) {
logrus.Infof("NetworkServiceManagerCache.Add(%v)", nsm)
c.cache.add(nsm)
}
func (c *NetworkServiceManagerCache) Update(nsm *v1.NetworkServiceManager) {
logrus.Infof("NetworkServiceManagerCache.Update(%v)", nsm)
c.cache.update(nsm)
}
func (c *NetworkServiceManagerCache) Delete(key string) {
logrus.Infof("NetworkServiceManagerCache.Delete(%v)", key)
c.cache.delete(key)
}
func (c *NetworkServiceManagerCache) Start(f SharedInformerFactory, init ...v1.NetworkServiceManager) (func(), error) {
c.replace(init)
return c.cache.start(f)
}
func (c *NetworkServiceManagerCache) StartWithResync(f SharedInformerFactory, cs *versioned.Clientset) (func(), error) {
l, err := cs.NetworkserviceV1alpha1().NetworkServiceManagers(namespace.GetNamespace()).List(context.TODO(), v12.ListOptions{})
if err != nil {
return nil, errors.Wrap(err, "unable to list NSMs for cache initialization")
}
return c.Start(f, l.Items...)
}
func (c *NetworkServiceManagerCache) replace(resources []v1.NetworkServiceManager) {
c.networkServiceManagers = map[string]*v1.NetworkServiceManager{}
logrus.Infof("Replacing Network service endpoints with: %v", resources)
for i := 0; i < len(resources); i++ {
c.resourceAdded(&resources[i])
}
}
func (c *NetworkServiceManagerCache) resourceAdded(obj interface{}) {
nsm := obj.(*v1.NetworkServiceManager)
logrus.Infof("NetworkServiceManagerCache.Added(%v)", nsm)
c.networkServiceManagers[getNsmKey(nsm)] = nsm
}
func (c *NetworkServiceManagerCache) resourceUpdated(obj interface{}) {
nsm := obj.(*v1.NetworkServiceManager)
logrus.Infof("NetworkServiceManagerCache.resourceUpdated(%v)", nsm)
c.networkServiceManagers[getNsmKey(nsm)] = nsm
}
func (c *NetworkServiceManagerCache) resourceDeleted(key string) {
logrus.Infof("NetworkServiceManagerCache.Deleted(%v=%v)", key, c.networkServiceManagers[key])
delete(c.networkServiceManagers, key)
}
func (c *NetworkServiceManagerCache) resourceGet(key string) interface{} {
return c.networkServiceManagers[key]
}
func getNsmKey(obj interface{}) string {
return obj.(*v1.NetworkServiceManager).Name
}
func getNsmNamespace(obj interface{}) string {
return obj.(*v1.NetworkServiceManager).Namespace
}