Skip to content

Commit c908696

Browse files
authored
Refactoring misc (#156)
* refactor client factory * refactor context package * add explaining comments * refactor deep merging of maps * rename test suite descriptions * refactor version handling for executables
1 parent 3654ef3 commit c908696

File tree

15 files changed

+340
-52
lines changed

15 files changed

+340
-52
lines changed

.github/workflows/publish-scaffold.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@ jobs:
2828
for arch in amd64 arm64; do
2929
file=bin/scaffold-$os-$arch
3030
echo "Building $file ..."
31-
GOOS=$os GOARCH=$arch go build -o $file -ldflags "-X main.version=${{ github.event.release.tag_name }}" ./scaffold
31+
LDFLAGS=""
32+
LDFLAGS+=" -X github.com/sap/component-operator-runtime/internal/version.version=${{ github.event.release.tag_name }}"
33+
LDFLAGS+=" -X github.com/sap/component-operator-runtime/internal/version.gitCommit=${{ github.sha }}"
34+
LDFLAGS+=" -X github.com/sap/component-operator-runtime/internal/version.gitTreeState=clean"
35+
GOOS=$os GOARCH=$arch go build -o $file -ldflags "$LDFLAGS" ./scaffold
3236
done
3337
done
3438

internal/cluster/client.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ package cluster
88
import (
99
"time"
1010

11+
corev1 "k8s.io/api/core/v1"
12+
"k8s.io/apimachinery/pkg/runtime"
1113
"k8s.io/client-go/discovery"
14+
"k8s.io/client-go/kubernetes"
15+
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
16+
"k8s.io/client-go/rest"
1217
"k8s.io/client-go/tools/record"
1318
"sigs.k8s.io/controller-runtime/pkg/client"
1419
)
@@ -21,6 +26,35 @@ func NewClient(clnt client.Client, discoveryClient discovery.DiscoveryInterface,
2126
}
2227
}
2328

29+
func NewClientFor(config *rest.Config, scheme *runtime.Scheme, name string) (Client, error) {
30+
return newClientFor(config, scheme, name)
31+
}
32+
33+
func newClientFor(config *rest.Config, scheme *runtime.Scheme, name string) (*clientImpl, error) {
34+
httpClient, err := rest.HTTPClientFor(config)
35+
if err != nil {
36+
return nil, err
37+
}
38+
ctrlClient, err := client.New(config, client.Options{HTTPClient: httpClient, Scheme: scheme})
39+
if err != nil {
40+
return nil, err
41+
}
42+
clientset, err := kubernetes.NewForConfigAndClient(config, httpClient)
43+
if err != nil {
44+
return nil, err
45+
}
46+
eventBroadcaster := record.NewBroadcaster()
47+
eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: clientset.CoreV1().Events("")})
48+
eventRecorder := eventBroadcaster.NewRecorder(scheme, corev1.EventSource{Component: name})
49+
clnt := &clientImpl{
50+
Client: ctrlClient,
51+
discoveryClient: clientset,
52+
eventBroadcaster: eventBroadcaster,
53+
eventRecorder: eventRecorder,
54+
}
55+
return clnt, nil
56+
}
57+
2458
type clientImpl struct {
2559
client.Client
2660
discoveryClient discovery.DiscoveryInterface

internal/cluster/factory.go

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,12 @@ import (
1414
"sync"
1515
"time"
1616

17-
corev1 "k8s.io/api/core/v1"
1817
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1918
"k8s.io/apimachinery/pkg/runtime"
20-
"k8s.io/client-go/kubernetes"
2119
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
22-
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
2320
"k8s.io/client-go/rest"
2421
"k8s.io/client-go/tools/clientcmd"
25-
"k8s.io/client-go/tools/record"
2622
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
27-
"sigs.k8s.io/controller-runtime/pkg/client"
2823

2924
"github.com/sap/component-operator-runtime/internal/metrics"
3025
"github.com/sap/component-operator-runtime/pkg/types"
@@ -132,28 +127,11 @@ func (f *ClientFactory) Get(kubeConfig []byte, impersonationUser string, imperso
132127
return rt.RoundTrip(r)
133128
})
134129
})
135-
httpClient, err := rest.HTTPClientFor(config)
130+
clnt, err := newClientFor(config, f.scheme, f.name)
136131
if err != nil {
137132
return nil, err
138133
}
139-
ctrlClient, err := client.New(config, client.Options{HTTPClient: httpClient, Scheme: f.scheme})
140-
if err != nil {
141-
return nil, err
142-
}
143-
clientset, err := kubernetes.NewForConfigAndClient(config, httpClient)
144-
if err != nil {
145-
return nil, err
146-
}
147-
eventBroadcaster := record.NewBroadcaster()
148-
eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: clientset.CoreV1().Events("")})
149-
eventRecorder := eventBroadcaster.NewRecorder(f.scheme, corev1.EventSource{Component: f.name})
150-
clnt := &clientImpl{
151-
Client: ctrlClient,
152-
discoveryClient: clientset,
153-
eventBroadcaster: eventBroadcaster,
154-
eventRecorder: eventRecorder,
155-
validUntil: time.Now().Add(validity),
156-
}
134+
clnt.validUntil = time.Now().Add(validity)
157135
f.clients[key] = clnt
158136
metrics.CreatedClients.WithLabelValues(f.controllerName).Inc()
159137
metrics.ActiveClients.WithLabelValues(f.controllerName).Set(float64(len(f.clients)))

internal/helm/suite_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@ import (
1414

1515
func TestComponent(t *testing.T) {
1616
RegisterFailHandler(Fail)
17-
RunSpecs(t, "Component Suite")
17+
RunSpecs(t, "Package tests")
1818
}

internal/version/version.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and component-operator-runtime contributors
3+
SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package version
7+
8+
import (
9+
"runtime"
10+
)
11+
12+
var (
13+
version = "latest"
14+
metadata = ""
15+
gitCommit = ""
16+
gitTreeState = ""
17+
)
18+
19+
type BuildInfo struct {
20+
Version string `json:"version,omitempty"`
21+
GitCommit string `json:"gitCommit,omitempty"`
22+
GitTreeState string `json:"gitTreeState,omitempty"`
23+
GoVersion string `json:"goVersion,omitempty"`
24+
}
25+
26+
func GetVersion() string {
27+
if metadata == "" {
28+
return version
29+
}
30+
return version + "+" + metadata
31+
}
32+
33+
func GetBuildInfo() BuildInfo {
34+
return BuildInfo{
35+
Version: GetVersion(),
36+
GitCommit: gitCommit,
37+
GitTreeState: gitTreeState,
38+
GoVersion: runtime.Version(),
39+
}
40+
}

pkg/component/context.go

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,28 +26,36 @@ var (
2626
componentDigestContextKey = componentDigestContextKeyType{}
2727
)
2828

29-
func newContext(ctx context.Context) *reconcileContext {
30-
return &reconcileContext{Context: ctx}
29+
type Context interface {
30+
context.Context
31+
WithReconcilerName(reconcilerName string) Context
32+
WithClient(clnt cluster.Client) Context
33+
WithComponent(component Component) Context
34+
WithComponentDigest(componentDigest string) Context
35+
}
36+
37+
func NewContext(ctx context.Context) Context {
38+
return &contextImpl{Context: ctx}
3139
}
3240

33-
type reconcileContext struct {
41+
type contextImpl struct {
3442
context.Context
3543
}
3644

37-
func (c *reconcileContext) WithReconcilerName(reconcilerName string) *reconcileContext {
38-
return &reconcileContext{Context: context.WithValue(c, reconcilerNameContextKey, reconcilerName)}
45+
func (c *contextImpl) WithReconcilerName(reconcilerName string) Context {
46+
return &contextImpl{Context: context.WithValue(c, reconcilerNameContextKey, reconcilerName)}
3947
}
4048

41-
func (c *reconcileContext) WithClient(clnt cluster.Client) *reconcileContext {
42-
return &reconcileContext{Context: context.WithValue(c, clientContextKey, clnt)}
49+
func (c *contextImpl) WithClient(clnt cluster.Client) Context {
50+
return &contextImpl{Context: context.WithValue(c, clientContextKey, clnt)}
4351
}
4452

45-
func (c *reconcileContext) WithComponent(component Component) *reconcileContext {
46-
return &reconcileContext{Context: context.WithValue(c, componentContextKey, component)}
53+
func (c *contextImpl) WithComponent(component Component) Context {
54+
return &contextImpl{Context: context.WithValue(c, componentContextKey, component)}
4755
}
4856

49-
func (c *reconcileContext) WithComponentDigest(componentDigest string) *reconcileContext {
50-
return &reconcileContext{Context: context.WithValue(c, componentDigestContextKey, componentDigest)}
57+
func (c *contextImpl) WithComponentDigest(componentDigest string) Context {
58+
return &contextImpl{Context: context.WithValue(c, componentDigestContextKey, componentDigest)}
5159
}
5260

5361
func ReconcilerNameFromContext(ctx context.Context) (string, error) {

pkg/component/reconciler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ func (r *Reconciler[T]) Reconcile(ctx context.Context, req ctrl.Request) (result
311311
// note: it's important that this happens after deferring the status handler
312312
// TODO: enhance ctx with tailored logger and event recorder
313313
// TODO: enhance ctx with the local client
314-
hookCtx := newContext(ctx).WithReconcilerName(r.name)
314+
hookCtx := NewContext(ctx).WithReconcilerName(r.name)
315315
for hookOrder, hook := range r.postReadHooks {
316316
if err := hook(hookCtx, r.client, component); err != nil {
317317
return ctrl.Result{}, errors.Wrapf(err, "error running post-read hook (%d)", hookOrder)
@@ -337,7 +337,7 @@ func (r *Reconciler[T]) Reconcile(ctx context.Context, req ctrl.Request) (result
337337
})
338338
// TODO: enhance ctx with tailored logger and event recorder
339339
// TODO: enhance ctx with the local client
340-
hookCtx = newContext(ctx).WithReconcilerName(r.name).WithClient(targetClient)
340+
hookCtx = NewContext(ctx).WithReconcilerName(r.name).WithClient(targetClient)
341341

342342
// do the reconciliation
343343
if component.GetDeletionTimestamp().IsZero() {

pkg/component/target.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func (t *reconcileTarget[T]) Apply(ctx context.Context, component T) (bool, stri
5252
componentDigest := calculateComponentDigest(component)
5353

5454
// TODO: enhance ctx with local client
55-
generateCtx := newContext(ctx).
55+
generateCtx := NewContext(ctx).
5656
WithReconcilerName(t.reconcilerName).
5757
WithClient(t.client).
5858
WithComponent(component).

pkg/manifests/helm/generator.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import (
2525
// HelmGenerator is a Generator implementation that basically renders a given Helm chart.
2626
// A few restrictions apply to the provided Helm chart: it must not contain any subcharts, some template functions are not supported,
2727
// some bultin variables are not supported, and hooks are processed in a slightly different fashion.
28+
// Note: HelmGenerator's Generate() method expects client and reconciler name to be set in the passed context;
29+
// see: Context.WithClient() and Context.WithReconcilerName() in package pkg/component.
2830
type HelmGenerator struct {
2931
client client.Client
3032
chart *helm.Chart

pkg/manifests/kustomize/generator.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ type KustomizeGeneratorOptions struct {
5353
}
5454

5555
// KustomizeGenerator is a Generator implementation that basically renders a given Kustomization.
56+
// Note: KustomizeGenerator's Generate() method expects client and component to be set in the passed context;
57+
// see: Context.WithClient() and Context.WithComponent() in package pkg/component.
5658
type KustomizeGenerator struct {
5759
kustomizer *krusty.Kustomizer
5860
files map[string][]byte

0 commit comments

Comments
 (0)