-
Notifications
You must be signed in to change notification settings - Fork 71
/
arangod_volumes.go
111 lines (93 loc) · 2.48 KB
/
arangod_volumes.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
//
// DISCLAIMER
//
// Copyright 2016-2023 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
package rotation
import (
"reflect"
core "k8s.io/api/core/v1"
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
shared "github.com/arangodb/kube-arangodb/pkg/apis/shared"
"github.com/arangodb/kube-arangodb/pkg/util/compare"
)
type volumeDiff struct {
a, b *core.Volume
}
func comparePodVolumes(ds api.DeploymentSpec, g api.ServerGroup, spec, status *core.PodTemplateSpec) compare.Func {
return func(builder api.ActionBuilder) (mode compare.Mode, plan api.Plan, err error) {
specV := mapVolumes(spec.Spec)
statusV := mapVolumes(status.Spec)
diff := getVolumesDiffFromPods(specV, statusV)
if len(diff) == 0 {
return compare.SkippedRotation, nil, nil
}
for k, v := range diff {
switch k {
case shared.ArangoDTimezoneVolumeName:
// We are fine, should be just replaced
if v.a == nil {
// we remove volume
return compare.GracefulRotation, nil, nil
}
if ds.Mode.Get().ServingGroup() == g {
// Always enforce on serving group
return compare.GracefulRotation, nil, nil
}
default:
return compare.GracefulRotation, nil, nil
}
}
status.Spec.Volumes = spec.Spec.Volumes
return compare.SilentRotation, nil, nil
}
}
func getVolumesDiffFromPods(a, b map[string]*core.Volume) map[string]volumeDiff {
d := map[string]volumeDiff{}
for k := range a {
if z, ok := b[k]; ok {
if !reflect.DeepEqual(a[k], z) {
d[k] = volumeDiff{
a: a[k],
b: z,
}
}
} else {
d[k] = volumeDiff{
a: a[k],
b: nil,
}
}
}
for k := range b {
if _, ok := a[k]; !ok {
d[k] = volumeDiff{
a: nil,
b: b[k],
}
}
}
return d
}
func mapVolumes(a core.PodSpec) map[string]*core.Volume {
n := make(map[string]*core.Volume, len(a.Volumes))
for id := range a.Volumes {
v := &a.Volumes[id]
n[v.Name] = v
}
return n
}