/
namespace_mgr.go
92 lines (78 loc) · 2.49 KB
/
namespace_mgr.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
package workers
import (
"context"
"github.com/bf2fc6cc711aee1a0c2a/kas-fleet-manager/internal/connector/internal/services"
"github.com/bf2fc6cc711aee1a0c2a/kas-fleet-manager/pkg/db"
"github.com/bf2fc6cc711aee1a0c2a/kas-fleet-manager/pkg/errors"
"github.com/bf2fc6cc711aee1a0c2a/kas-fleet-manager/pkg/workers"
"github.com/golang/glog"
"github.com/google/uuid"
)
var _ workers.Worker = &NamespaceManager{}
type NamespaceManager struct {
workers.BaseWorker
namespaceService services.ConnectorNamespaceService
db *db.ConnectionFactory
ctx context.Context
}
func (m *NamespaceManager) Start() {
m.StartWorker(m)
}
func (m *NamespaceManager) Stop() {
m.StopWorker(m)
}
func NewNamespaceManager(namespaceService services.ConnectorNamespaceService, db *db.ConnectionFactory,
reconciler workers.Reconciler) *NamespaceManager {
return &NamespaceManager{
BaseWorker: workers.BaseWorker{
Id: uuid.New().String(),
WorkerType: "connector_namespace",
Reconciler: reconciler,
},
namespaceService: namespaceService,
db: db,
}
}
func (m *NamespaceManager) Reconcile() []error {
var errs []error
if m.ctx == nil {
ctx, err := m.db.NewContext(context.Background())
if err != nil {
return []error{err}
}
m.ctx = ctx
}
// reconcile expired namespaces
m.doReconcile(&errs, "expired", m.namespaceService.ReconcileExpiredNamespaces)
// reconcile unused "deleting" namespaces that never had connectors
m.doReconcile(&errs, "unused deleting", m.namespaceService.ReconcileUnusedDeletingNamespaces)
// reconcile used "deleting" namespaces that have connectors
m.doReconcile(&errs, "used deleting", m.namespaceService.ReconcileUsedDeletingNamespaces)
// delete "deleted" namespaces with no connectors
m.doReconcile(&errs, "empty deleted", m.namespaceService.ReconcileDeletedNamespaces)
return errs
}
func (m *NamespaceManager) doReconcile(errs *[]error, nsType string, reconcileFunc func(ctx context.Context) (int64, *errors.ServiceError)) {
glog.V(5).Infof("Reconciling %s namespaces...", nsType)
var count int64
err := InDBTransaction(m.ctx, func(ctx context.Context) error {
var serr *errors.ServiceError
count, serr = reconcileFunc(ctx)
if serr != nil {
return serr
}
return nil
})
if err != nil {
*errs = append(*errs, err)
}
if count == 0 {
glog.V(5).Infof("No %s namespaces", nsType)
} else {
nerr := 0
if err != nil {
nerr++
}
glog.V(5).Infof("Processed %d %s namespaces with %d errors", count, nsType, nerr)
}
}