5
5
"errors"
6
6
"fmt"
7
7
"os"
8
+ "regexp"
9
+ "strconv"
10
+ "strings"
8
11
9
12
"github.com/prometheus/client_golang/prometheus"
10
13
"github.com/sirupsen/logrus"
@@ -16,9 +19,9 @@ import (
16
19
"github.com/stakater/Reloader/internal/pkg/util"
17
20
"github.com/stakater/Reloader/pkg/kube"
18
21
v1 "k8s.io/api/core/v1"
19
- "regexp "
20
- "strconv "
21
- "strings "
22
+ "k8s.io/apimachinery/pkg/api/meta "
23
+ "k8s.io/apimachinery/pkg/runtime "
24
+ "k8s.io/client-go/tools/record "
22
25
)
23
26
24
27
// GetDeploymentRollingUpgradeFuncs returns all callback funcs for a deployment
@@ -91,31 +94,31 @@ func GetArgoRolloutRollingUpgradeFuncs() callbacks.RollingUpgradeFuncs {
91
94
}
92
95
}
93
96
94
- func doRollingUpgrade (config util.Config , collectors metrics.Collectors ) error {
97
+ func doRollingUpgrade (config util.Config , collectors metrics.Collectors , recorder record. EventRecorder ) error {
95
98
clients := kube .GetClients ()
96
99
97
- err := rollingUpgrade (clients , config , GetDeploymentRollingUpgradeFuncs (), collectors )
100
+ err := rollingUpgrade (clients , config , GetDeploymentRollingUpgradeFuncs (), collectors , recorder )
98
101
if err != nil {
99
102
return err
100
103
}
101
- err = rollingUpgrade (clients , config , GetDaemonSetRollingUpgradeFuncs (), collectors )
104
+ err = rollingUpgrade (clients , config , GetDaemonSetRollingUpgradeFuncs (), collectors , recorder )
102
105
if err != nil {
103
106
return err
104
107
}
105
- err = rollingUpgrade (clients , config , GetStatefulSetRollingUpgradeFuncs (), collectors )
108
+ err = rollingUpgrade (clients , config , GetStatefulSetRollingUpgradeFuncs (), collectors , recorder )
106
109
if err != nil {
107
110
return err
108
111
}
109
112
110
113
if kube .IsOpenshift {
111
- err = rollingUpgrade (clients , config , GetDeploymentConfigRollingUpgradeFuncs (), collectors )
114
+ err = rollingUpgrade (clients , config , GetDeploymentConfigRollingUpgradeFuncs (), collectors , recorder )
112
115
if err != nil {
113
116
return err
114
117
}
115
118
}
116
119
117
120
if options .IsArgoRollouts == "true" {
118
- err = rollingUpgrade (clients , config , GetArgoRolloutRollingUpgradeFuncs (), collectors )
121
+ err = rollingUpgrade (clients , config , GetArgoRolloutRollingUpgradeFuncs (), collectors , recorder )
119
122
if err != nil {
120
123
return err
121
124
}
@@ -124,17 +127,17 @@ func doRollingUpgrade(config util.Config, collectors metrics.Collectors) error {
124
127
return nil
125
128
}
126
129
127
- func rollingUpgrade (clients kube.Clients , config util.Config , upgradeFuncs callbacks.RollingUpgradeFuncs , collectors metrics.Collectors ) error {
130
+ func rollingUpgrade (clients kube.Clients , config util.Config , upgradeFuncs callbacks.RollingUpgradeFuncs , collectors metrics.Collectors , recorder record. EventRecorder ) error {
128
131
129
- err := PerformRollingUpgrade (clients , config , upgradeFuncs , collectors )
132
+ err := PerformRollingUpgrade (clients , config , upgradeFuncs , collectors , recorder )
130
133
if err != nil {
131
134
logrus .Errorf ("Rolling upgrade for '%s' failed with error = %v" , config .ResourceName , err )
132
135
}
133
136
return err
134
137
}
135
138
136
139
// PerformRollingUpgrade upgrades the deployment if there is any change in configmap or secret data
137
- func PerformRollingUpgrade (clients kube.Clients , config util.Config , upgradeFuncs callbacks.RollingUpgradeFuncs , collectors metrics.Collectors ) error {
140
+ func PerformRollingUpgrade (clients kube.Clients , config util.Config , upgradeFuncs callbacks.RollingUpgradeFuncs , collectors metrics.Collectors , recorder record. EventRecorder ) error {
138
141
items := upgradeFuncs .ItemsFunc (clients , config .Namespace )
139
142
140
143
for _ , i := range items {
@@ -177,17 +180,29 @@ func PerformRollingUpgrade(clients kube.Clients, config util.Config, upgradeFunc
177
180
}
178
181
179
182
if result == constants .Updated {
183
+ accessor , err := meta .Accessor (i )
184
+ if err != nil {
185
+ return err
186
+ }
187
+ resourceName := accessor .GetName ()
180
188
err = upgradeFuncs .UpdateFunc (clients , config .Namespace , i )
181
- resourceName := util .ToObjectMeta (i ).Name
182
189
if err != nil {
183
- logrus .Errorf ("Update for '%s' of type '%s' in namespace '%s' failed with error %v" , resourceName , upgradeFuncs .ResourceType , config .Namespace , err )
190
+ message := fmt .Sprintf ("Update for '%s' of type '%s' in namespace '%s' failed with error %v" , resourceName , upgradeFuncs .ResourceType , config .Namespace , err )
191
+ logrus .Errorf (message )
184
192
collectors .Reloaded .With (prometheus.Labels {"success" : "false" }).Inc ()
193
+ if recorder != nil {
194
+ recorder .Event (i , v1 .EventTypeWarning , "ReloadFail" , message )
195
+ }
185
196
return err
186
197
} else {
187
- logrus .Infof ("Changes detected in '%s' of type '%s' in namespace '%s'" , config .ResourceName , config .Type , config .Namespace )
188
- logrus .Infof ("Updated '%s' of type '%s' in namespace '%s'" , resourceName , upgradeFuncs .ResourceType , config .Namespace )
198
+ message := fmt .Sprintf ("Changes detected in '%s' of type '%s' in namespace '%s'" , config .ResourceName , config .Type , config .Namespace )
199
+ message += fmt .Sprintf (", Updated '%s' of type '%s' in namespace '%s'" , resourceName , upgradeFuncs .ResourceType , config .Namespace )
200
+ logrus .Infof (message )
189
201
collectors .Reloaded .With (prometheus.Labels {"success" : "true" }).Inc ()
190
202
alert_on_reload , ok := os .LookupEnv ("ALERT_ON_RELOAD" )
203
+ if recorder != nil {
204
+ recorder .Event (i , v1 .EventTypeNormal , "Reloaded" , message )
205
+ }
191
206
if ok && alert_on_reload == "true" {
192
207
msg := fmt .Sprintf (
193
208
"Reloader detected changes in *%s* of type *%s* in namespace *%s*. Hence reloaded *%s* of type *%s* in namespace *%s*" ,
@@ -271,7 +286,7 @@ func getContainerWithEnvReference(containers []v1.Container, resourceName string
271
286
return nil
272
287
}
273
288
274
- func getContainerUsingResource (upgradeFuncs callbacks.RollingUpgradeFuncs , item interface {} , config util.Config , autoReload bool ) * v1.Container {
289
+ func getContainerUsingResource (upgradeFuncs callbacks.RollingUpgradeFuncs , item runtime. Object , config util.Config , autoReload bool ) * v1.Container {
275
290
volumes := upgradeFuncs .VolumesFunc (item )
276
291
containers := upgradeFuncs .ContainersFunc (item )
277
292
initContainers := upgradeFuncs .InitContainersFunc (item )
@@ -310,15 +325,15 @@ func getContainerUsingResource(upgradeFuncs callbacks.RollingUpgradeFuncs, item
310
325
return container
311
326
}
312
327
313
- func invokeReloadStrategy (upgradeFuncs callbacks.RollingUpgradeFuncs , item interface {} , config util.Config , autoReload bool ) constants.Result {
328
+ func invokeReloadStrategy (upgradeFuncs callbacks.RollingUpgradeFuncs , item runtime. Object , config util.Config , autoReload bool ) constants.Result {
314
329
if options .ReloadStrategy == constants .AnnotationsReloadStrategy {
315
330
return updatePodAnnotations (upgradeFuncs , item , config , autoReload )
316
331
}
317
332
318
333
return updateContainerEnvVars (upgradeFuncs , item , config , autoReload )
319
334
}
320
335
321
- func updatePodAnnotations (upgradeFuncs callbacks.RollingUpgradeFuncs , item interface {} , config util.Config , autoReload bool ) constants.Result {
336
+ func updatePodAnnotations (upgradeFuncs callbacks.RollingUpgradeFuncs , item runtime. Object , config util.Config , autoReload bool ) constants.Result {
322
337
container := getContainerUsingResource (upgradeFuncs , item , config , autoReload )
323
338
if container == nil {
324
339
return constants .NoContainerFound
@@ -370,7 +385,7 @@ func createReloadedAnnotations(target *util.ReloadSource) (map[string]string, er
370
385
return annotations , nil
371
386
}
372
387
373
- func updateContainerEnvVars (upgradeFuncs callbacks.RollingUpgradeFuncs , item interface {} , config util.Config , autoReload bool ) constants.Result {
388
+ func updateContainerEnvVars (upgradeFuncs callbacks.RollingUpgradeFuncs , item runtime. Object , config util.Config , autoReload bool ) constants.Result {
374
389
var result constants.Result
375
390
envVar := constants .EnvVarPrefix + util .ConvertToEnvVarName (config .ResourceName ) + "_" + config .Type
376
391
container := getContainerUsingResource (upgradeFuncs , item , config , autoReload )
0 commit comments