-
Notifications
You must be signed in to change notification settings - Fork 70
/
container.go
133 lines (117 loc) · 3.71 KB
/
container.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
//
// DISCLAIMER
//
// Copyright 2016-2024 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 resources
import (
core "k8s.io/api/core/v1"
)
// GetContainerIDByName returns the container id in the given list with the given name.
// Returns -1 if not found.
func GetContainerIDByName(containers []core.Container, name string) int {
for id, c := range containers {
if c.Name == name {
return id
}
}
return -1
}
// GetContainerStatusIDByName returns the container id in the given list with the given name.
// // Returns -1 if not found.
func GetContainerStatusIDByName(containers []core.ContainerStatus, name string) int {
for id, c := range containers {
if c.Name == name {
return id
}
}
return -1
}
// GetContainerByName returns the container in the given pod with the given name.
// Returns false if not found.
func GetContainerByName(p *core.Pod, name string) (core.Container, bool) {
for _, c := range p.Spec.Containers {
if c.Name == name {
return c, true
}
}
return core.Container{}, false
}
// GetContainerStatusByName returns the container status in the given pod with the given name.
// Returns false if not found.
func GetContainerStatusByName(p *core.Pod, name string) (core.ContainerStatus, bool) {
for _, c := range p.Status.ContainerStatuses {
if c.Name == name {
return c, true
}
}
return core.ContainerStatus{}, false
}
// GetAnyContainerByName returns the container in the given containers with the given name.
// Returns false if not found.
func GetAnyContainerByName(containers []core.Container, name string) (core.Container, bool) {
for _, c := range containers {
if c.Name == name {
return c, true
}
}
return core.Container{}, false
}
// GetAnyContainerStatusByName returns the container status in the given ContainerStatus list with the given name.
// Returns false if not found.
func GetAnyContainerStatusByName(containers []core.ContainerStatus, name string) (core.ContainerStatus, bool) {
for _, c := range containers {
if c.Name == name {
return c, true
}
}
return core.ContainerStatus{}, false
}
// GetFailedContainerNames returns list of failed containers from provided list of statuses.
func GetFailedContainerNames(containers []core.ContainerStatus) []string {
var failedContainers []string
for _, c := range containers {
if IsContainerFailed(&c) {
failedContainers = append(failedContainers, c.Name)
}
}
return failedContainers
}
// IsResourceRequirementsChanged returns true if the resource requirements have changed.
func IsResourceRequirementsChanged(wanted, given core.ResourceRequirements) bool {
checkList := func(wanted, given core.ResourceList) bool {
for k, v := range wanted {
if gv, ok := given[k]; !ok {
return true
} else if v.Cmp(gv) != 0 {
return true
}
}
return false
}
return checkList(wanted.Limits, given.Limits) || checkList(wanted.Requests, given.Requests)
}
// IsContainerFailed returns true if the arangodb container
// has terminated wih a non-zero exit code.
func IsContainerFailed(container *core.ContainerStatus) bool {
if c := container.State.Terminated; c != nil {
if c.ExitCode != 0 {
return true
}
}
return false
}