Skip to content

Commit 05a1af4

Browse files
Adding Patch API to mbsc package
1 parent 001e0ba commit 05a1af4

File tree

4 files changed

+136
-46
lines changed

4 files changed

+136
-46
lines changed

internal/mbsc/mbsc.go

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,36 @@ import (
55
"fmt"
66
kmmv1beta1 "github.com/kubernetes-sigs/kernel-module-management/api/v1beta1"
77

8+
v1 "k8s.io/api/core/v1"
89
k8serrors "k8s.io/apimachinery/pkg/api/errors"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/apimachinery/pkg/runtime"
912
"k8s.io/apimachinery/pkg/types"
1013
"sigs.k8s.io/controller-runtime/pkg/client"
14+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1115
)
1216

1317
//go:generate mockgen -source=mbsc.go -package=mbsc -destination=mock_mbsc.go
1418

1519
type MBSC interface {
16-
SetModuleImageSpec(mbscObj *kmmv1beta1.ModuleBuildSignConfig, moduleImageSpec *kmmv1beta1.ModuleImageSpec)
17-
GetMBSC(ctx context.Context, name, namespace string) (*kmmv1beta1.ModuleBuildSignConfig, error)
20+
Get(ctx context.Context, name, namespace string) (*kmmv1beta1.ModuleBuildSignConfig, error)
21+
CreateOrPatch(ctx context.Context, name string, namespace string, moduleImageSpec *kmmv1beta1.ModuleImageSpec,
22+
imageRepoSecret *v1.LocalObjectReference, owner metav1.Object) error
1823
}
1924

2025
type mbsc struct {
2126
client client.Client
27+
scheme *runtime.Scheme
2228
}
2329

24-
func NewMBSC(client client.Client) MBSC {
30+
func New(client client.Client, scheme *runtime.Scheme) MBSC {
2531
return &mbsc{
2632
client: client,
33+
scheme: scheme,
2734
}
2835
}
2936

30-
func (m *mbsc) SetModuleImageSpec(mbscObj *kmmv1beta1.ModuleBuildSignConfig, moduleImageSpec *kmmv1beta1.ModuleImageSpec) {
31-
for i, imageSpec := range mbscObj.Spec.Images {
32-
if imageSpec.Image == moduleImageSpec.Image {
33-
mbscObj.Spec.Images[i] = *moduleImageSpec
34-
return
35-
}
36-
}
37-
mbscObj.Spec.Images = append(mbscObj.Spec.Images, *moduleImageSpec)
38-
}
39-
40-
func (m *mbsc) GetMBSC(ctx context.Context, name, namespace string) (*kmmv1beta1.ModuleBuildSignConfig, error) {
37+
func (m *mbsc) Get(ctx context.Context, name, namespace string) (*kmmv1beta1.ModuleBuildSignConfig, error) {
4138
mbsc := kmmv1beta1.ModuleBuildSignConfig{}
4239
err := m.client.Get(ctx, types.NamespacedName{Name: name, Namespace: namespace}, &mbsc)
4340
if err != nil {
@@ -48,3 +45,31 @@ func (m *mbsc) GetMBSC(ctx context.Context, name, namespace string) (*kmmv1beta1
4845
}
4946
return &mbsc, nil
5047
}
48+
49+
func (m *mbsc) CreateOrPatch(ctx context.Context,
50+
name string,
51+
namespace string,
52+
moduleImageSpec *kmmv1beta1.ModuleImageSpec,
53+
imageRepoSecret *v1.LocalObjectReference,
54+
owner metav1.Object) error {
55+
mbscObj := &kmmv1beta1.ModuleBuildSignConfig{
56+
ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace},
57+
}
58+
59+
_, err := controllerutil.CreateOrPatch(ctx, m.client, mbscObj, func() error {
60+
setModuleImageSpec(mbscObj, moduleImageSpec)
61+
mbscObj.Spec.ImageRepoSecret = imageRepoSecret
62+
return controllerutil.SetOwnerReference(owner, mbscObj, m.scheme)
63+
})
64+
return err
65+
}
66+
67+
func setModuleImageSpec(mbscObj *kmmv1beta1.ModuleBuildSignConfig, moduleImageSpec *kmmv1beta1.ModuleImageSpec) {
68+
for i, imageSpec := range mbscObj.Spec.Images {
69+
if imageSpec.Image == moduleImageSpec.Image {
70+
mbscObj.Spec.Images[i] = *moduleImageSpec
71+
return
72+
}
73+
}
74+
mbscObj.Spec.Images = append(mbscObj.Spec.Images, *moduleImageSpec)
75+
}

internal/mbsc/mbsc_test.go

Lines changed: 69 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,14 @@ import (
1414
"k8s.io/apimachinery/pkg/types"
1515
)
1616

17-
var _ = Describe("SetModuleImageSpec", func() {
18-
var (
19-
mbsc MBSC
20-
)
21-
22-
BeforeEach(func() {
23-
mbsc = NewMBSC(nil)
24-
})
25-
17+
var _ = Describe("setModuleImageSpec", func() {
2618
It("MBSC does not have any images in spec", func() {
2719
mbscObj := kmmv1beta1.ModuleBuildSignConfig{
2820
Spec: kmmv1beta1.ModuleImagesConfigSpec{},
2921
}
3022
imageSpec := kmmv1beta1.ModuleImageSpec{Image: "some image"}
3123

32-
mbsc.SetModuleImageSpec(&mbscObj, &imageSpec)
24+
setModuleImageSpec(&mbscObj, &imageSpec)
3325

3426
Expect(len(mbscObj.Spec.Images)).To(Equal(1))
3527
})
@@ -45,7 +37,7 @@ var _ = Describe("SetModuleImageSpec", func() {
4537
}
4638
imageSpec := kmmv1beta1.ModuleImageSpec{Image: "some image"}
4739

48-
mbsc.SetModuleImageSpec(&mbscObj, &imageSpec)
40+
setModuleImageSpec(&mbscObj, &imageSpec)
4941

5042
Expect(len(mbscObj.Spec.Images)).To(Equal(3))
5143
})
@@ -61,13 +53,13 @@ var _ = Describe("SetModuleImageSpec", func() {
6153
}
6254
imageSpec := kmmv1beta1.ModuleImageSpec{Image: "image 2"}
6355

64-
mbsc.SetModuleImageSpec(&mbscObj, &imageSpec)
56+
setModuleImageSpec(&mbscObj, &imageSpec)
6557

6658
Expect(len(mbscObj.Spec.Images)).To(Equal(2))
6759
})
6860
})
6961

70-
var _ = Describe("GetMBSC", func() {
62+
var _ = Describe("Get", func() {
7163
var (
7264
ctrl *gomock.Controller
7365
mockClient *client.MockClient
@@ -77,7 +69,7 @@ var _ = Describe("GetMBSC", func() {
7769
BeforeEach(func() {
7870
ctrl = gomock.NewController(GinkgoT())
7971
mockClient = client.NewMockClient(ctrl)
80-
mbsc = NewMBSC(mockClient)
72+
mbsc = New(mockClient, nil)
8173
})
8274

8375
ctx := context.Background()
@@ -86,24 +78,84 @@ var _ = Describe("GetMBSC", func() {
8678
mockClient.EXPECT().Get(ctx, types.NamespacedName{Name: "some name", Namespace: "some namespace"}, gomock.Any()).Return(
8779
k8serrors.NewNotFound(schema.GroupResource{}, "owner name"))
8880

89-
res, err := mbsc.GetMBSC(ctx, "some name", "some namespace")
81+
res, err := mbsc.Get(ctx, "some name", "some namespace")
9082
Expect(err).To(BeNil())
9183
Expect(res).To(BeNil())
9284
})
9385

9486
It("client get returns some error", func() {
9587
mockClient.EXPECT().Get(ctx, types.NamespacedName{Name: "some name", Namespace: "some namespace"}, gomock.Any()).Return(fmt.Errorf("some error"))
9688

97-
res, err := mbsc.GetMBSC(ctx, "some name", "some namespace")
89+
res, err := mbsc.Get(ctx, "some name", "some namespace")
9890
Expect(err).To(HaveOccurred())
9991
Expect(res).To(BeNil())
10092
})
10193

10294
It("mbsc object exists", func() {
10395
mockClient.EXPECT().Get(ctx, types.NamespacedName{Name: "some name", Namespace: "some namespace"}, gomock.Any()).Return(nil)
10496

105-
res, err := mbsc.GetMBSC(ctx, "some name", "some namespace")
97+
res, err := mbsc.Get(ctx, "some name", "some namespace")
10698
Expect(err).To(BeNil())
10799
Expect(res).ToNot(BeNil())
108100
})
109101
})
102+
103+
var _ = Describe("CreateOrPatch", func() {
104+
var (
105+
ctrl *gomock.Controller
106+
mockClient *client.MockClient
107+
mbsc MBSC
108+
)
109+
110+
BeforeEach(func() {
111+
ctrl = gomock.NewController(GinkgoT())
112+
mockClient = client.NewMockClient(ctrl)
113+
mbsc = New(mockClient, scheme)
114+
})
115+
116+
ctx := context.Background()
117+
mbscName := "some name"
118+
mbscNamespace := "some namespace"
119+
imageSpec := kmmv1beta1.ModuleImageSpec{Image: "some image"}
120+
micObj := kmmv1beta1.ModuleImagesConfig{}
121+
122+
It("MSBC does not exists", func() {
123+
gomock.InOrder(
124+
mockClient.EXPECT().Get(ctx, types.NamespacedName{Name: mbscName, Namespace: mbscNamespace}, gomock.Any()).Return(
125+
k8serrors.NewNotFound(schema.GroupResource{}, "some name")),
126+
mockClient.EXPECT().Create(ctx, gomock.Any()).Return(nil),
127+
)
128+
129+
err := mbsc.CreateOrPatch(ctx, mbscName, mbscNamespace, &imageSpec, nil, &micObj)
130+
Expect(err).To(BeNil())
131+
})
132+
133+
It("MSBC does not existsi, create fails", func() {
134+
gomock.InOrder(
135+
mockClient.EXPECT().Get(ctx, types.NamespacedName{Name: mbscName, Namespace: mbscNamespace}, gomock.Any()).Return(
136+
k8serrors.NewNotFound(schema.GroupResource{}, "some name")),
137+
mockClient.EXPECT().Create(ctx, gomock.Any()).Return(fmt.Errorf("some error")),
138+
)
139+
140+
err := mbsc.CreateOrPatch(ctx, mbscName, mbscNamespace, &imageSpec, nil, &micObj)
141+
Expect(err).To(HaveOccurred())
142+
})
143+
144+
It("MSBC exists", func() {
145+
gomock.InOrder(
146+
mockClient.EXPECT().Get(ctx, types.NamespacedName{Name: mbscName, Namespace: mbscNamespace}, gomock.Any()).Return(nil),
147+
mockClient.EXPECT().Patch(ctx, gomock.Any(), gomock.Any()).Return(nil),
148+
)
149+
err := mbsc.CreateOrPatch(ctx, mbscName, mbscNamespace, &imageSpec, nil, &micObj)
150+
Expect(err).To(BeNil())
151+
})
152+
153+
It("MSBC exists. patch fails", func() {
154+
gomock.InOrder(
155+
mockClient.EXPECT().Get(ctx, types.NamespacedName{Name: mbscName, Namespace: mbscNamespace}, gomock.Any()).Return(nil),
156+
mockClient.EXPECT().Patch(ctx, gomock.Any(), gomock.Any()).Return(fmt.Errorf("some error")),
157+
)
158+
err := mbsc.CreateOrPatch(ctx, mbscName, mbscNamespace, &imageSpec, nil, &micObj)
159+
Expect(err).To(HaveOccurred())
160+
})
161+
})

internal/mbsc/mock_mbsc.go

Lines changed: 19 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/mbsc/suite_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,20 @@ package mbsc
33
import (
44
"testing"
55

6+
"github.com/kubernetes-sigs/kernel-module-management/internal/test"
67
. "github.com/onsi/ginkgo/v2"
78
. "github.com/onsi/gomega"
9+
"k8s.io/apimachinery/pkg/runtime"
810
)
911

12+
var scheme *runtime.Scheme
13+
1014
func TestSuite(t *testing.T) {
1115
RegisterFailHandler(Fail)
16+
17+
var err error
18+
scheme, err = test.TestScheme()
19+
Expect(err).NotTo(HaveOccurred())
20+
1221
RunSpecs(t, "MBSC Suite")
1322
}

0 commit comments

Comments
 (0)