-
Notifications
You must be signed in to change notification settings - Fork 50
/
vc_config_controller.go
109 lines (100 loc) · 3.46 KB
/
vc_config_controller.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
package controller
import (
"github.com/sirupsen/logrus"
"github.com/vmware-tanzu/velero-plugin-for-vsphere/pkg/constants"
"github.com/vmware-tanzu/velero-plugin-for-vsphere/pkg/dataMover"
"github.com/vmware-tanzu/velero-plugin-for-vsphere/pkg/snapshotmgr"
"github.com/vmware-tanzu/velero-plugin-for-vsphere/pkg/utils"
corev1 "k8s.io/api/core/v1"
v1 "k8s.io/client-go/informers/core/v1"
"k8s.io/client-go/tools/cache"
"time"
)
type vcConfigController struct {
*genericController
dataMover *dataMover.DataMover
snapMgr *snapshotmgr.SnapshotManager
}
func NewVcConfigController(
logger logrus.FieldLogger,
secretInformer v1.SecretInformer,
dataMover *dataMover.DataMover,
snapMgr *snapshotmgr.SnapshotManager,
) Interface {
v := &vcConfigController{
genericController: newGenericController("vc-config", logger),
dataMover: dataMover,
snapMgr: snapMgr,
}
v.syncHandler = v.processVcConfigSecretItem
v.retryHandler = v.exponentialBackoffHandler
v.cacheSyncWaiters = append(
v.cacheSyncWaiters,
secretInformer.Informer().HasSynced,
)
secretInformer.Informer().AddEventHandlerWithResyncPeriod(
cache.FilteringResourceEventHandler{
FilterFunc: utils.GetVcConfigSecretFilterFunc(logger),
Handler: cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) { v.enqueueVcConfigSecret(obj) },
UpdateFunc: func(oldObj, newObj interface{}) { v.enqueueVcConfigSecret(newObj) },
},
},
constants.DefaultSecretResyncPeriod)
return v
}
func (v *vcConfigController) enqueueVcConfigSecret(obj interface{}) {
// Beware of "xxx deleted" events
if unknown, ok := obj.(cache.DeletedFinalStateUnknown); ok && unknown.Obj != nil {
obj = unknown.Obj
}
if secretItem, ok := obj.(*corev1.Secret); ok {
v.logger.Debugf("enqueueSecret on update: %s", secretItem.Name)
objName, err := cache.DeletionHandlingMetaNamespaceKeyFunc(secretItem)
if err != nil {
v.logger.Errorf("failed to get key from object: %v, %v", err, secretItem)
return
}
v.logger.Debugf("enqueueVcConfigSecret: enqueued %q for sync", objName)
v.enqueue(obj)
}
}
func (v *vcConfigController) processVcConfigSecretItem(key string) error {
log := v.logger.WithField("key", key)
log.Debug("Running processVcConfigSecretItem")
namespace, name, err := cache.SplitMetaNamespaceKey(key)
if err != nil {
log.WithError(err).Error("Failed to split the key of queue item")
return nil
}
// Retrieve the latest Secret.
ivdParams := make(map[string]interface{})
err = utils.RetrieveVcConfigSecret(ivdParams, nil, v.logger)
if err != nil {
v.logger.Errorf("Failed to retrieve the latest vc config secret")
return err
}
v.logger.Debug("Successfully retrieved latest vSphere VC credentials.")
if v.dataMover != nil {
err = v.dataMover.ReloadDataMoverIvdPetmConfig(ivdParams)
if err != nil {
v.logger.Errorf("Secret %s/%s Reload on DataMover failed, err: %v", namespace, name, err)
return err
}
}
if v.snapMgr != nil {
err = v.snapMgr.ReloadSnapshotManagerIvdPetmConfig(ivdParams)
if err != nil {
v.logger.Errorf("Secret %s/%s Reload on Snapshot Manager failed, err: %v", namespace, name, err)
return err
}
}
v.logger.Debugf("Successfully processed updates in vc configuration.")
return nil
}
func (v *vcConfigController) exponentialBackoffHandler(key string) error {
v.logger.Debug("Running exponentialBackoffHandler")
v.logger.Debugf("Re-adding failed secret processing to the queue")
v.queue.AddAfter(key, time.Duration(1)*time.Minute)
return nil
}