Skip to content

Commit 4049362

Browse files
authored
[Bugfix] Fix Image Discovery (#1600)
1 parent d2045e0 commit 4049362

File tree

9 files changed

+69
-25
lines changed

9 files changed

+69
-25
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## [master](https://github.com/arangodb/kube-arangodb/tree/master) (N/A)
44
- (Feature) Extract Scheduler API
5+
- (Bugfix) Fix Image Discovery
56

67
## [1.2.38](https://github.com/arangodb/kube-arangodb/tree/1.2.38) (2024-02-22)
78
- (Feature) Extract GRPC Server

chart/kube-arangodb/templates/deployment.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ spec:
132132
valueFrom:
133133
fieldRef:
134134
fieldPath: metadata.name
135+
- name: MY_CONTAINER_NAME
136+
value: "operator"
135137
- name: MY_POD_IP
136138
valueFrom:
137139
fieldRef:

cmd/cmd.go

+2-5
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import (
4646
"k8s.io/client-go/tools/record"
4747

4848
"github.com/arangodb/kube-arangodb/pkg/api"
49+
shared "github.com/arangodb/kube-arangodb/pkg/apis/shared"
4950
"github.com/arangodb/kube-arangodb/pkg/crd"
5051
agencyConfig "github.com/arangodb/kube-arangodb/pkg/deployment/agency/config"
5152
"github.com/arangodb/kube-arangodb/pkg/deployment/features"
@@ -594,13 +595,9 @@ func getMyPodInfo(kubecli kubernetes.Interface, namespace, name string) (string,
594595
return errors.WithStack(err)
595596
}
596597
sa = pod.Spec.ServiceAccountName
597-
if image, err = k8sutil.GetArangoDBImageIDFromPod(pod); err != nil {
598+
if image, err = k8sutil.GetArangoDBImageIDFromPod(pod, shared.ServerContainerName, shared.OperatorContainerName, constants.MyContainerNameEnv.GetOrDefault(shared.OperatorContainerName)); err != nil {
598599
return errors.Wrap(err, "failed to get image ID from pod")
599600
}
600-
if image == "" {
601-
// Fallback in case we don't know the id.
602-
image = pod.Spec.Containers[0].Image
603-
}
604601
return nil
605602
}
606603
if err := retry.Retry(op, time.Minute*5); err != nil {

pkg/apis/shared/constants.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2016-2023 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany
55
//
66
// Licensed under the Apache License, Version 2.0 (the "License");
77
// you may not use this file except in compliance with the License.
@@ -45,6 +45,7 @@ const (
4545
// Pod constants
4646
ServerContainerName = "server"
4747
ExporterContainerName = "exporter"
48+
OperatorContainerName = "operator"
4849
ArangodVolumeName = "arangod-data"
4950
TlsKeyfileVolumeName = "tls-keyfile"
5051
ClientAuthCAVolumeName = "client-auth-ca"

pkg/deployment/images.go

+2-6
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,8 @@ func (ib *imagesBuilder) fetchArangoDBImageIDAndVersion(ctx context.Context, cac
166166
return true, nil
167167
}
168168

169-
imageID, err := k8sutil.GetArangoDBImageIDFromPod(pod)
170-
if err != nil {
171-
log.Err(err).Warn("failed to get image ID from pod")
172-
return true, nil
173-
}
174-
if imageID == "" {
169+
imageID, ok := k8sutil.GetArangoDBImageIDFromContainerStatuses(pod.Status.ContainerStatuses, shared.ServerContainerName)
170+
if !ok {
175171
// Fall back to specified image
176172
imageID = image
177173
}

pkg/util/constants/constants.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2016-2023 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany
55
//
66
// Licensed under the Apache License, Version 2.0 (the "License");
77
// you may not use this file except in compliance with the License.
@@ -20,6 +20,8 @@
2020

2121
package constants
2222

23+
import "github.com/arangodb/kube-arangodb/pkg/util"
24+
2325
const (
2426
EnvOperatorNodeName = "MY_NODE_NAME"
2527
EnvOperatorNodeNameArango = "NODE_NAME"
@@ -73,6 +75,10 @@ const (
7375
LabelRoleLeader = "leader"
7476
)
7577

78+
const (
79+
MyContainerNameEnv util.EnvironmentVariable = "MY_CONTAINER_NAME"
80+
)
81+
7682
func ManagedFinalizers() []string {
7783
return []string{
7884
FinalizerDeplRemoveChildFinalizers,

pkg/util/k8sutil/container/container.go

+11
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@ func GetContainerIDByName(containers []core.Container, name string) int {
3535
return -1
3636
}
3737

38+
// GetContainerStatusIDByName returns the container id in the given list with the given name.
39+
// // Returns -1 if not found.
40+
func GetContainerStatusIDByName(containers []core.ContainerStatus, name string) int {
41+
for id, c := range containers {
42+
if c.Name == name {
43+
return id
44+
}
45+
}
46+
return -1
47+
}
48+
3849
// GetContainerByName returns the container in the given pod with the given name.
3950
// Returns false if not found.
4051
func GetContainerByName(p *core.Pod, name string) (core.Container, bool) {

pkg/util/k8sutil/images.go

+39-9
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ import (
2626
core "k8s.io/api/core/v1"
2727

2828
schedulerContainerResourcesApi "github.com/arangodb/kube-arangodb/pkg/apis/scheduler/v1alpha1/container/resources"
29-
shared "github.com/arangodb/kube-arangodb/pkg/apis/shared"
3029
"github.com/arangodb/kube-arangodb/pkg/util/errors"
30+
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil/container"
3131
)
3232

3333
const (
@@ -44,23 +44,53 @@ func ConvertImageID2Image(imageID string) string {
4444
}
4545

4646
// GetArangoDBImageIDFromPod returns the ArangoDB specific image from a pod
47-
func GetArangoDBImageIDFromPod(pod *core.Pod) (string, error) {
47+
func GetArangoDBImageIDFromPod(pod *core.Pod, names ...string) (string, error) {
4848
if pod == nil {
4949
return "", errors.New("failed to get container statuses from nil pod")
5050
}
5151

52-
if len(pod.Status.ContainerStatuses) == 0 {
53-
return "", errors.New("empty list of ContainerStatuses")
52+
// First try to find container by name
53+
if image, ok := GetArangoDBImageIDFromContainerStatuses(pod.Status.ContainerStatuses, names...); ok {
54+
return image, nil
5455
}
56+
if image, ok := GetArangoDBImageIDFromContainers(pod.Spec.Containers, names...); ok {
57+
return image, nil
58+
}
59+
60+
if cs := pod.Status.ContainerStatuses; len(cs) > 0 {
61+
if image := cs[0].ImageID; image != "" {
62+
return ConvertImageID2Image(image), nil
63+
}
64+
}
65+
if cs := pod.Spec.Containers; len(cs) > 0 {
66+
if image := cs[0].Image; image != "" {
67+
return image, nil
68+
}
69+
}
70+
71+
return "", errors.Errorf("Unable to find image from pod")
72+
}
73+
74+
// GetArangoDBImageIDFromContainerStatuses returns the ArangoDB specific image from a container statuses
75+
func GetArangoDBImageIDFromContainerStatuses(containers []core.ContainerStatus, names ...string) (string, bool) {
76+
for _, name := range names {
77+
if id := container.GetContainerStatusIDByName(containers, name); id != -1 {
78+
return ConvertImageID2Image(containers[id].ImageID), true
79+
}
80+
}
81+
82+
return "", false
83+
}
5584

56-
for _, cs := range pod.Status.ContainerStatuses {
57-
if cs.Name == shared.ServerContainerName {
58-
return ConvertImageID2Image(cs.ImageID), nil
85+
// GetArangoDBImageIDFromContainers returns the ArangoDB specific image from a container specs
86+
func GetArangoDBImageIDFromContainers(containers []core.Container, names ...string) (string, bool) {
87+
for _, name := range names {
88+
if id := container.GetContainerIDByName(containers, name); id != -1 {
89+
return containers[id].Image, true
5990
}
6091
}
6192

62-
// If Server container is not found use first container
63-
return ConvertImageID2Image(pod.Status.ContainerStatuses[0].ImageID), nil
93+
return "", false
6494
}
6595

6696
// GetImageDetails Returns latest defined Image details

pkg/util/k8sutil/images_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2016-2023 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2016-2024 ArangoDB GmbH, Cologne, Germany
55
//
66
// Licensed under the Apache License, Version 2.0 (the "License");
77
// you may not use this file except in compliance with the License.
@@ -47,7 +47,7 @@ func TestGetArangoDBImageIDFromPod(t *testing.T) {
4747
args: args{
4848
pod: &core.Pod{},
4949
},
50-
wantErr: errors.New("empty list of ContainerStatuses"),
50+
wantErr: errors.New("Unable to find image from pod"),
5151
},
5252
"image ID from the only container": {
5353
args: args{
@@ -124,7 +124,7 @@ func TestGetArangoDBImageIDFromPod(t *testing.T) {
124124

125125
for testName, testCase := range tests {
126126
t.Run(testName, func(t *testing.T) {
127-
got, err := GetArangoDBImageIDFromPod(testCase.args.pod)
127+
got, err := GetArangoDBImageIDFromPod(testCase.args.pod, shared.ServerContainerName)
128128
if testCase.wantErr != nil {
129129
require.EqualError(t, err, testCase.wantErr.Error())
130130
return

0 commit comments

Comments
 (0)