This repository has been archived by the owner on Oct 29, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
model.go
145 lines (118 loc) · 3.66 KB
/
model.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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package business
import (
"github.com/oxyno-zeta/kubernetes-tagger/pkg/kubernetes-tagger/config"
"github.com/oxyno-zeta/kubernetes-tagger/pkg/kubernetes-tagger/resources"
"github.com/oxyno-zeta/kubernetes-tagger/pkg/kubernetes-tagger/rules"
"github.com/sirupsen/logrus"
v1 "k8s.io/api/core/v1"
"k8s.io/client-go/kubernetes"
)
// Context Business context.
type Context struct {
KubernetesClient *kubernetes.Clientset
Configuration *config.Configuration
Rules []*rules.Rule
}
func (context *Context) handlePersistentVolumeAdd(obj interface{}) {
pv, _ := obj.(*v1.PersistentVolume)
log := logrus.WithField("persistentVolumeName", pv.Name)
log.Debug("New persistent volume added detected")
err := context.runForPV(pv)
// Check error
if err != nil {
log.Errorf("Error managing persistent volume: %v", err)
}
}
func (context *Context) handlePersistentVolumeDelete(obj interface{}) {
// Nothing to do
pv, _ := obj.(*v1.PersistentVolume)
log := logrus.WithField("persistentVolumeName", pv.Name)
log.Debug("New persistent volume deleted detected")
}
func (context *Context) handlePersistentVolumeUpdate(old, current interface{}) {
currentPersistentVolume, _ := current.(*v1.PersistentVolume)
log := logrus.WithField("persistentVolumeName", currentPersistentVolume.Name)
log.Debug("New persistent volume updated detected")
err := context.runForPV(currentPersistentVolume)
// Check error
if err != nil {
logrus.WithField("persistentVolumeName", currentPersistentVolume.Name).Errorf("Error managing persistent volume: %v", err)
}
}
func (context *Context) handleServiceAdd(obj interface{}) {
svc, _ := obj.(*v1.Service)
log := logrus.WithFields(logrus.Fields{
"serviceName": svc.Name,
"namespace": svc.Namespace,
})
log.Debug("New service added detected")
err := context.runForService(svc)
// Check error
if err != nil {
log.Errorf("Error managing service: %v", err)
}
}
func (context *Context) handleServiceDelete(obj interface{}) {
// Nothing to do
svc, _ := obj.(*v1.Service)
log := logrus.WithFields(logrus.Fields{
"serviceName": svc.Name,
"namespace": svc.Namespace,
})
log.Debug("New service deleted detected")
}
func (context *Context) handleServiceUpdate(old, current interface{}) {
currentService, _ := current.(*v1.Service)
log := logrus.WithFields(logrus.Fields{
"serviceName": currentService.Name,
"namespace": currentService.Namespace,
})
log.Debug("New service updated detected")
err := context.runForService(currentService)
// Check error
if err != nil {
logrus.WithField("serviceName", currentService.Name).Errorf("Error managing service: %v", err)
}
}
func (context *Context) runForPV(pv *v1.PersistentVolume) error {
resource, err := resources.NewFromPersistentVolume(context.KubernetesClient, pv, context.Configuration)
// Check error
if err != nil {
return err
}
return context.runForResource(resource)
}
func (context *Context) runForService(svc *v1.Service) error {
resource, err := resources.NewFromService(context.KubernetesClient, svc, context.Configuration)
// Check error
if err != nil {
return err
}
return context.runForResource(resource)
}
func (context *Context) runForResource(resource resources.Resource) error {
if resource == nil {
// No resource available
return nil
}
// Get actual tags
actualTags, err := resource.GetActualTags()
if err != nil {
return err
}
availableTagValues, err := resource.GetAvailableTagValues()
if err != nil {
return err
}
delta, err := rules.CalculateTags(actualTags, availableTagValues, context.Rules)
// Check error
if err != nil {
return err
}
err = resource.ManageTags(delta)
// Check error
if err != nil {
return err
}
return nil
}