Skip to content

Commit

Permalink
fix default resource config handling
Browse files Browse the repository at this point in the history
  • Loading branch information
bakito committed Dec 27, 2022
1 parent 22dca27 commit f72c990
Show file tree
Hide file tree
Showing 4 changed files with 204 additions and 6 deletions.
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ endif
all: manager

# Run tests
test: tidy test-ci fmt test-ci
test: tidy fmt generate mocks manifests test-ci

# Run tests
test-ci: generate mocks manifests
test-ci:
go test ./... -coverprofile cover.out.tmp
@cat cover.out.tmp | grep -v "zz_generated.deepcopy.go" > cover.out # filter coverage of generated code
@rm -f cover.out.tmp
Expand Down
15 changes: 11 additions & 4 deletions controllers/config/config_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,16 +75,23 @@ func (r *Reconciler) readConfig(ctx context.Context, reqLogger logr.Logger, nn t
return err
}

if container.Resources.Requests.Cpu() == nil {
if container.Resources.Requests == nil {
container.Resources.Requests = map[corev1.ResourceName]resource.Quantity{}
}
if container.Resources.Limits == nil {
container.Resources.Limits = map[corev1.ResourceName]resource.Quantity{}
}

if _, ok := container.Resources.Requests[corev1.ResourceCPU]; !ok {
container.Resources.Requests[corev1.ResourceCPU] = defaultPodReqCPU
}
if container.Resources.Requests.Memory() == nil {
if _, ok := container.Resources.Requests[corev1.ResourceMemory]; !ok {
container.Resources.Requests[corev1.ResourceMemory] = defaultPodReqMem
}
if container.Resources.Limits.Cpu() == nil {
if _, ok := container.Resources.Limits[corev1.ResourceCPU]; !ok {
container.Resources.Limits[corev1.ResourceCPU] = defaultPodMaxCPU
}
if container.Resources.Limits.Memory() == nil {
if _, ok := container.Resources.Limits[corev1.ResourceMemory]; !ok {
container.Resources.Limits[corev1.ResourceMemory] = defaultPodMaxMem
}

Expand Down
178 changes: 178 additions & 0 deletions controllers/config/config_controller_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
package config

import (
"os"

v1 "github.com/bakito/k8s-event-logger-operator/api/v1"
cnst "github.com/bakito/k8s-event-logger-operator/pkg/constants"
"github.com/google/uuid"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/kubernetes/scheme"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
)

var _ = Describe("Config", func() {
var (
s *runtime.Scheme
cr *Reconciler
)

BeforeEach(func() {
s = scheme.Scheme
Ω(v1.SchemeBuilder.AddToScheme(s)).ShouldNot(HaveOccurred())

cr = &Reconciler{
Log: ctrl.Log.WithName("controllers").WithName("Pod"),
Scheme: s,
}
})

Context("Reconcile", func() {
var configMap *corev1.ConfigMap
BeforeEach(func() {
configMap = &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{
Name: uuid.NewString(),
Namespace: uuid.NewString(),
}}
})

It("should fail if the data is empty", func() {
cr.Reader = fake.NewClientBuilder().WithScheme(s).WithObjects(configMap).Build()
res, err := cr.Reconcile(cr.Ctx(), reconcile.Request{
NamespacedName: types.NamespacedName{
Name: configMap.Name,
Namespace: configMap.Namespace,
},
})
Ω(err).Should(HaveOccurred())
Ω(res.Requeue).Should(BeFalse())
})
It("should fail if the container template does not exist", func() {
configMap.Data = map[string]string{"foo": "bar"}
cr.Reader = fake.NewClientBuilder().WithScheme(s).WithObjects(configMap).Build()
res, err := cr.Reconcile(cr.Ctx(), reconcile.Request{
NamespacedName: types.NamespacedName{
Name: configMap.Name,
Namespace: configMap.Namespace,
},
})
Ω(err).Should(HaveOccurred())
Ω(res.Requeue).Should(BeFalse())
})
It("should read the default config", func() {
configMap.Data = map[string]string{cnst.ConfigKeyContainerTemplate: ""}
cr.Reader = fake.NewClientBuilder().WithScheme(s).WithObjects(configMap).Build()
res, err := cr.Reconcile(cr.Ctx(), reconcile.Request{
NamespacedName: types.NamespacedName{
Name: configMap.Name,
Namespace: configMap.Namespace,
},
})
Ω(err).ShouldNot(HaveOccurred())
Ω(res.Requeue).Should(BeFalse())
cfg := GetCfg(cr.Ctx())

Ω(cfg.ContainerTemplate.Resources.Requests.Cpu().String()).Should(Equal(defaultPodReqCPU.String()))
Ω(cfg.ContainerTemplate.Resources.Requests.Memory().String()).Should(Equal(defaultPodReqMem.String()))
Ω(cfg.ContainerTemplate.Resources.Limits.Cpu().String()).Should(Equal(defaultPodMaxCPU.String()))
Ω(cfg.ContainerTemplate.Resources.Limits.Memory().String()).Should(Equal(defaultPodMaxMem.String()))
})
It("should fail if the container template can not be parsed", func() {
configMap.Data = map[string]string{cnst.ConfigKeyContainerTemplate: `
image: quay.io/bakito/k8s-event-logger
resources:
requests:
cpu: 111m
memory: 222Mi
limits:
cpu: 333m
memory: 444Mi
`}
cr.Reader = fake.NewClientBuilder().WithScheme(s).WithObjects(configMap).Build()
res, err := cr.Reconcile(cr.Ctx(), reconcile.Request{
NamespacedName: types.NamespacedName{
Name: configMap.Name,
Namespace: configMap.Namespace,
},
})
Ω(err).ShouldNot(HaveOccurred())
Ω(res.Requeue).Should(BeFalse())

cfg := GetCfg(cr.Ctx())
Ω(cfg.ContainerTemplate.Resources.Requests.Cpu().String()).Should(Equal("111m"))
Ω(cfg.ContainerTemplate.Resources.Requests.Memory().String()).Should(Equal("222Mi"))
Ω(cfg.ContainerTemplate.Resources.Limits.Cpu().String()).Should(Equal("333m"))
Ω(cfg.ContainerTemplate.Resources.Limits.Memory().String()).Should(Equal("444Mi"))
})
})

Context("setupEventLoggerImage", func() {
var (
pod *corev1.Pod
nn types.NamespacedName
)
BeforeEach(func() {
pod = &corev1.Pod{ObjectMeta: metav1.ObjectMeta{
Name: uuid.NewString(),
Namespace: uuid.NewString(),
}}
nn = types.NamespacedName{
Namespace: pod.Namespace,
Name: pod.Name,
}
})
AfterEach(func() {
_ = os.Setenv(cnst.EnvEventLoggerImage, "")
})

It("should evaluate the image from the env variable", func() {
_ = os.Setenv(cnst.EnvEventLoggerImage, "my:image")
err := cr.setupEventLoggerImage(nn)
Ω(err).ShouldNot(HaveOccurred())
Ω(cr.eventLoggerImage).Should(Equal("my:image"))
})
It("should fail if no pod is found", func() {
cr.Reader = fake.NewClientBuilder().WithScheme(s).Build()
err := cr.setupEventLoggerImage(nn)
Ω(err).Should(HaveOccurred())
Ω(cr.eventLoggerImage).Should(BeEmpty())
})
It("should evaluate the image from the first operator pod container", func() {
pod.Spec = corev1.PodSpec{Containers: []corev1.Container{
{Image: "my-container:image"},
}}
cr.Reader = fake.NewClientBuilder().WithScheme(s).WithObjects(pod).Build()
err := cr.setupEventLoggerImage(nn)
Ω(err).ShouldNot(HaveOccurred())
Ω(cr.eventLoggerImage).Should(Equal("my-container:image"))
})

It("should evaluate the image from the operator pod container", func() {
pod.Spec = corev1.PodSpec{Containers: []corev1.Container{
{Image: "my-container:image1", Name: "something-else"},
{Image: "my-container:image2", Name: defaultContainerName},
}}
cr.Reader = fake.NewClientBuilder().WithScheme(s).WithObjects(pod).Build()
err := cr.setupEventLoggerImage(nn)
Ω(err).ShouldNot(HaveOccurred())
Ω(cr.eventLoggerImage).Should(Equal("my-container:image2"))
})
It("should fail if the container is not found", func() {
pod.Spec = corev1.PodSpec{Containers: []corev1.Container{
{Image: "my-container:image1", Name: "something-else"},
{Image: "my-container:image2", Name: "not-my-container"},
}}
cr.Reader = fake.NewClientBuilder().WithScheme(s).WithObjects(pod).Build()
err := cr.setupEventLoggerImage(nn)
Ω(err).Should(HaveOccurred())
Ω(cr.eventLoggerImage).Should(BeEmpty())
})
})
})
13 changes: 13 additions & 0 deletions controllers/config/config_suite_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package config_test

import (
"testing"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)

func TestSetup(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "Config Suite")
}

0 comments on commit f72c990

Please sign in to comment.