Skip to content

Commit cb7ff83

Browse files
authored
Merge pull request #159 from kloeckner-i/METAL-3712/backup_cron_resource
METAL-3712 add ability to configure resource for the backup cronjob
2 parents f31fe4e + 0a8c798 commit cb7ff83

11 files changed

Lines changed: 105 additions & 7 deletions

File tree

Dockerfile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ RUN go mod download
1212

1313
# build
1414
COPY . .
15-
RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -tags build -o /usr/local/bin/db-operator main.go
15+
16+
ARG GOARCH
17+
RUN GOOS=linux GOARCH=$GOARCH CGO_ENABLED=0 go build -tags build -o /usr/local/bin/db-operator main.go
1618

1719
FROM alpine:3.15
1820
LABEL maintainer="dev@kloeckner-i.com"

Makefile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ help: ## show this help
1414
@grep -E '^(.+)\:\ .*##\ (.+)' ${MAKEFILE_LIST} | sort | sed 's/:.*##/#/' | column -t -c 2 -s '#'
1515

1616
build: $(SRC) ## build db-operator docker image
17-
@docker build -t my-db-operator:v1.0.0-dev .
17+
@docker build --build-arg GOARCH=amd64 -t my-db-operator:v1.0.0-dev .
18+
@docker save my-db-operator > my-image.tar
19+
20+
build_arm: $(SRC) ## build db-operator docker image for arm
21+
@docker build --platform=linux/arm64 --build-arg GOARCH=arm64 -t my-db-operator:v1.0.0-dev .
1822
@docker save my-db-operator > my-image.tar
1923

2024
addexamples: ## add examples via kubectl create -f examples/
@@ -46,7 +50,7 @@ k3s_mac_deploy: build k3s_mac_image ## build image and import image to local lim
4650

4751
k3s_mac_image: ## import built image to local lima k8s
4852
limactl copy my-image.tar k3s:/tmp/db.tar
49-
limactl shell k3s sudo k3s ctr images import /tmp/db.tar
53+
limactl shell k3s sudo k3s ctr images import --all-platforms /tmp/db.tar
5054
limactl shell k3s rm -f /tmp/db.tar
5155

5256
k3d_setup: k3d_install k3d_image ## install k3d and import image to your k3d cluster

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ $ make k3s_mac_image
117117
### Deploy
118118

119119
```
120-
helm upgrade my-release kloeckneri/db-operator --set image.repository=my-db-operator --set image.tag=v1.0.0-dev
120+
helm upgrade my-release kloeckneri/db-operator --set image.repository=my-db-operator --set image.tag=1.0.0-dev --set image.pullPolicy=IfNotPresent
121121
```
122122

123123
### Run unit test locally

controllers/backup/cronjob.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
batchv1 "k8s.io/api/batch/v1"
2828
batchv1beta1 "k8s.io/api/batch/v1beta1"
2929
v1 "k8s.io/api/core/v1"
30+
"k8s.io/apimachinery/pkg/api/resource"
3031
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3132
)
3233

@@ -114,6 +115,38 @@ func buildJobTemplate(conf *config.Config, dbcr *kciv1alpha1.Database) (batchv1b
114115
}, nil
115116
}
116117

118+
func getResourceRequirements(conf *config.Config) v1.ResourceRequirements {
119+
resourceRequirements := v1.ResourceRequirements{}
120+
121+
requests := make(v1.ResourceList)
122+
cpuRequests, err := resource.ParseQuantity(conf.Backup.Resource.Requests.Cpu)
123+
if err == nil {
124+
requests["cpu"] = cpuRequests
125+
}
126+
memRequests, err := resource.ParseQuantity(conf.Backup.Resource.Requests.Memory)
127+
if err == nil {
128+
requests["memory"] = memRequests
129+
}
130+
if len(requests) != 0 {
131+
resourceRequirements.Requests = requests
132+
}
133+
134+
limits := make(v1.ResourceList)
135+
cpuLimits, err := resource.ParseQuantity(conf.Backup.Resource.Limits.Cpu)
136+
if err == nil {
137+
limits["cpu"] = cpuLimits
138+
}
139+
memLimits, err := resource.ParseQuantity(conf.Backup.Resource.Limits.Memory)
140+
if err == nil {
141+
limits["memory"] = memLimits
142+
}
143+
if len(limits) != 0 {
144+
resourceRequirements.Limits = limits
145+
}
146+
147+
return resourceRequirements
148+
}
149+
117150
func postgresBackupContainer(conf *config.Config, dbcr *kciv1alpha1.Database) (v1.Container, error) {
118151
env, err := postgresEnvVars(conf, dbcr)
119152
if err != nil {
@@ -126,6 +159,7 @@ func postgresBackupContainer(conf *config.Config, dbcr *kciv1alpha1.Database) (v
126159
ImagePullPolicy: v1.PullAlways,
127160
VolumeMounts: volumeMounts(),
128161
Env: env,
162+
Resources: getResourceRequirements(conf),
129163
}, nil
130164
}
131165

@@ -141,6 +175,7 @@ func mysqlBackupContainer(conf *config.Config, dbcr *kciv1alpha1.Database) (v1.C
141175
ImagePullPolicy: v1.PullAlways,
142176
VolumeMounts: volumeMounts(),
143177
Env: env,
178+
Resources: getResourceRequirements(conf),
144179
}, nil
145180
}
146181

controllers/backup/cronjob_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import (
2424
kciv1alpha1 "github.com/kloeckner-i/db-operator/api/v1alpha1"
2525
"github.com/kloeckner-i/db-operator/pkg/config"
2626
"github.com/stretchr/testify/assert"
27+
v1 "k8s.io/api/core/v1"
28+
"k8s.io/apimachinery/pkg/api/resource"
2729
)
2830

2931
func TestGCSBackupCronGsql(t *testing.T) {
@@ -95,3 +97,15 @@ func TestGCSBackupCronGeneric(t *testing.T) {
9597
assert.Equal(t, "TestNS-TestDB-backup", funcCronObject.Name)
9698
assert.Equal(t, "* * * * *", funcCronObject.Spec.Schedule)
9799
}
100+
101+
func TestGetResourceRequirements(t *testing.T) {
102+
os.Setenv("CONFIG_PATH", "./test/backup_config.yaml")
103+
conf := config.LoadConfig()
104+
105+
expected := v1.ResourceRequirements{
106+
Requests: map[v1.ResourceName]resource.Quantity{v1.ResourceCPU: resource.MustParse("50m"), v1.ResourceMemory: resource.MustParse("50Mi")},
107+
Limits: map[v1.ResourceName]resource.Quantity{v1.ResourceCPU: resource.MustParse("100m"), v1.ResourceMemory: resource.MustParse("100Mi")},
108+
}
109+
result := getResourceRequirements(&conf)
110+
assert.Equal(t, expected, result)
111+
}

controllers/backup/test/backup_config.yaml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,11 @@ backup:
33
postgres:
44
image: postgresbackupimage:latest
55
mysql:
6-
image: mysqlbackupimage:latest
6+
image: mysqlbackupimage:latest
7+
resources:
8+
requests:
9+
cpu: 50m
10+
memory: 50Mi
11+
limits:
12+
cpu: 100m
13+
memory: 100Mi

go.mod

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ require (
1414
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.52.1
1515
github.com/prometheus/client_golang v1.11.0
1616
github.com/sirupsen/logrus v1.8.1
17-
github.com/stretchr/testify v1.7.0
17+
github.com/stretchr/testify v1.8.0
1818
golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5
1919
google.golang.org/api v0.77.0
2020
gopkg.in/yaml.v2 v2.4.0
@@ -68,6 +68,7 @@ require (
6868
github.com/prometheus/common v0.28.0 // indirect
6969
github.com/prometheus/procfs v0.6.0 // indirect
7070
github.com/spf13/pflag v1.0.5 // indirect
71+
github.com/stretchr/objx v0.4.0 // indirect
7172
go.opencensus.io v0.23.0 // indirect
7273
go.uber.org/atomic v1.7.0 // indirect
7374
go.uber.org/multierr v1.6.0 // indirect
@@ -84,7 +85,7 @@ require (
8485
google.golang.org/grpc v1.45.0 // indirect
8586
google.golang.org/protobuf v1.28.0 // indirect
8687
gopkg.in/inf.v0 v0.9.1 // indirect
87-
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
88+
gopkg.in/yaml.v3 v3.0.1 // indirect
8889
k8s.io/component-base v0.23.5 // indirect
8990
k8s.io/klog/v2 v2.60.1 // indirect
9091
k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect

go.sum

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,13 +579,18 @@ github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag
579579
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
580580
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
581581
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
582+
github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
583+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
582584
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
583585
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
584586
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
585587
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
586588
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
587589
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
588590
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
591+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
592+
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
593+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
589594
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
590595
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
591596
github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
@@ -1181,6 +1186,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
11811186
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
11821187
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
11831188
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
1189+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
1190+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
11841191
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
11851192
gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
11861193
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

pkg/config/config_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,12 @@ func TestLoadConfigFailCases(t *testing.T) {
4848
LoadConfig()
4949
assert.Equal(t, expectedFatal, fatalCalled)
5050
}
51+
52+
func TestBackupResourceConfig(t *testing.T) {
53+
os.Setenv("CONFIG_PATH", "./test/config_backup.yaml")
54+
conf := LoadConfig()
55+
assert.Equal(t, conf.Backup.Resource.Requests.Cpu, "50m")
56+
assert.Equal(t, conf.Backup.Resource.Requests.Memory, "50Mi")
57+
assert.Equal(t, conf.Backup.Resource.Limits.Cpu, "100m")
58+
assert.Equal(t, conf.Backup.Resource.Limits.Memory, "100Mi")
59+
}

pkg/config/test/config_backup.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
backup:
2+
resources:
3+
requests:
4+
cpu: 50m
5+
memory: 50Mi
6+
limits:
7+
cpu: 100m
8+
memory: 100Mi

0 commit comments

Comments
 (0)