Skip to content

Commit faf1ea4

Browse files
committed
implement helm values replace feature
1 parent fbbd727 commit faf1ea4

File tree

8 files changed

+66
-40
lines changed

8 files changed

+66
-40
lines changed

cmd/platform-service-dns/app/run.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ func (o *RunOptions) Run(ctx context.Context) error {
245245
}
246246
return fmt.Errorf("error getting DNSServiceConfig '%s': %w", svcCfg.Name, err)
247247
}
248-
if err := cluster.NewClusterReconciler(o.PlatformCluster, mgr.GetEventRecorderFor(cluster.ControllerName), o.ProviderName, o.ProviderNamespace).SetupWithManager(mgr); err != nil {
248+
if err := cluster.NewClusterReconciler(o.PlatformCluster, mgr.GetEventRecorderFor(cluster.ControllerName), o.ProviderName, o.ProviderNamespace, o.Environment).SetupWithManager(mgr); err != nil {
249249
return fmt.Errorf("unable to add Cluster reconciler to manager: %w", err)
250250
}
251251

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ require (
100100
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
101101
gopkg.in/inf.v0 v0.9.1 // indirect
102102
gopkg.in/yaml.v3 v3.0.1 // indirect
103-
k8s.io/apiextensions-apiserver v0.34.1 // indirect
103+
k8s.io/apiextensions-apiserver v0.34.1
104104
k8s.io/apiserver v0.34.1 // indirect
105105
k8s.io/component-base v0.34.1 // indirect
106106
k8s.io/klog/v2 v2.130.1 // indirect

internal/controllers/cluster/controller.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
corev1 "k8s.io/api/core/v1"
1313
rbacv1 "k8s.io/api/rbac/v1"
14+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1415
apierrors "k8s.io/apimachinery/pkg/api/errors"
1516
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1617
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -53,17 +54,18 @@ type ClusterReconciler struct {
5354
eventRecorder record.EventRecorder
5455
ProviderName string
5556
ProviderNamespace string
57+
Environment string
5658
KnownClusters map[types.NamespacedName]struct{}
5759
KnownClustersLock *sync.RWMutex
58-
FakeClientMapping map[string]client.Client // this must be nil except for unit tests
5960
}
6061

61-
func NewClusterReconciler(platformCluster *clusters.Cluster, recorder record.EventRecorder, providerName, providerNamespace string) *ClusterReconciler {
62+
func NewClusterReconciler(platformCluster *clusters.Cluster, recorder record.EventRecorder, providerName, providerNamespace, environment string) *ClusterReconciler {
6263
return &ClusterReconciler{
6364
PlatformCluster: platformCluster,
6465
eventRecorder: recorder,
6566
ProviderName: providerName,
6667
ProviderNamespace: providerNamespace,
68+
Environment: environment,
6769
KnownClusters: map[types.NamespacedName]struct{}{},
6870
KnownClustersLock: &sync.RWMutex{},
6971
}
@@ -542,7 +544,14 @@ func (r *ClusterReconciler) deployHelmRelease(ctx context.Context, c *clustersv1
542544
hr.Spec.ReleaseName = "external-dns"
543545
hr.Spec.TargetNamespace = "external-dns"
544546
// values
545-
hr.Spec.Values = rr.Config.HelmValues.DeepCopy()
547+
values := string(rr.Config.HelmValues.Raw)
548+
// at some point '<' and '>' get escaped and we have to match the escaped version here
549+
values = strings.ReplaceAll(values, fmt.Sprintf("%sprovider.namespace%s", "\\u003c", "\\u003e"), r.ProviderNamespace)
550+
values = strings.ReplaceAll(values, fmt.Sprintf("%sprovider.name%s", "\\u003c", "\\u003e"), r.ProviderName)
551+
values = strings.ReplaceAll(values, fmt.Sprintf("%senvironment%s", "\\u003c", "\\u003e"), r.Environment)
552+
values = strings.ReplaceAll(values, fmt.Sprintf("%scluster.namespace%s", "\\u003c", "\\u003e"), c.Namespace)
553+
values = strings.ReplaceAll(values, fmt.Sprintf("%scluster.name%s", "\\u003c", "\\u003e"), c.Name)
554+
hr.Spec.Values = &apiextensionsv1.JSON{Raw: []byte(values)}
546555
// install configuration
547556
if hr.Spec.Install == nil {
548557
hr.Spec.Install = &fluxhelmv2.Install{}

internal/controllers/cluster/controller_test.go

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"k8s.io/apimachinery/pkg/runtime"
1515
"sigs.k8s.io/controller-runtime/pkg/client"
1616
"sigs.k8s.io/controller-runtime/pkg/reconcile"
17+
"sigs.k8s.io/yaml"
1718

1819
fluxhelmv2 "github.com/fluxcd/helm-controller/api/v2"
1920
fluxsourcev1 "github.com/fluxcd/source-controller/api/v1"
@@ -35,6 +36,7 @@ const (
3536

3637
providerName = "dns-service"
3738
providerNamespace = "test"
39+
environment = "default"
3840
managedByValue = providerName + "." + cluster.ControllerName
3941
)
4042

@@ -46,13 +48,7 @@ func defaultTestSetup(testDirPathSegments ...string) *testutils.Environment {
4648
WithInitObjectPath(testDirPathSegments...).
4749
WithDynamicObjectsWithStatus(&clustersv1alpha1.AccessRequest{}).
4850
WithReconcilerConstructor(func(c client.Client) reconcile.Reconciler {
49-
cRec := cluster.NewClusterReconciler(clusters.NewTestClusterFromClient(platformCluster, c), nil, providerName, providerNamespace)
50-
cRec.FakeClientMapping = map[string]client.Client{
51-
"cluster-01": nil,
52-
"cluster-02": nil,
53-
"cluster-03": nil,
54-
}
55-
return cRec
51+
return cluster.NewClusterReconciler(clusters.NewTestClusterFromClient(platformCluster, c), nil, providerName, providerNamespace, environment)
5652
}).
5753
Build()
5854

@@ -476,6 +472,37 @@ var _ = Describe("ClusterReconciler", func() {
476472
}))
477473
})
478474

475+
It("should replace the special keywords in the values correctly", func() {
476+
env := defaultTestSetup("testdata", "test-03")
477+
478+
cfg := &dnsv1alpha1.DNSServiceConfig{}
479+
Expect(env.Client().Get(env.Ctx, client.ObjectKey{Name: providerName}, cfg)).To(Succeed())
480+
481+
c1 := &clustersv1alpha1.Cluster{}
482+
Expect(env.Client().Get(env.Ctx, client.ObjectKey{Name: "cluster-01", Namespace: "foo"}, c1)).To(Succeed())
483+
rr := env.ShouldReconcile(testutils.RequestFromObject(c1))
484+
Expect(rr.RequeueAfter).To(BeNumerically(">", 0))
485+
fakeAccessRequestReadiness(env, c1)
486+
rr = env.ShouldReconcile(testutils.RequestFromObject(c1))
487+
Expect(rr.RequeueAfter).To(BeZero())
488+
489+
// verify that the correct resources were created
490+
expectedLabels := map[string]string{
491+
openmcpconst.ManagedByLabel: managedByValue,
492+
openmcpconst.ManagedPurposeLabel: c1.Name,
493+
}
494+
hrs := &fluxhelmv2.HelmReleaseList{}
495+
Expect(env.Client().List(env.Ctx, hrs, client.InNamespace(c1.Namespace), client.MatchingLabels(expectedLabels))).To(Succeed())
496+
Expect(hrs.Items).To(HaveLen(1))
497+
valueData := map[string]any{}
498+
Expect(yaml.Unmarshal(hrs.Items[0].Spec.Values.Raw, &valueData)).To(Succeed())
499+
Expect(valueData).To(HaveKeyWithValue("clusterName", c1.Name))
500+
Expect(valueData).To(HaveKeyWithValue("clusterNamespace", c1.Namespace))
501+
Expect(valueData).To(HaveKeyWithValue("environment", environment))
502+
Expect(valueData).To(HaveKeyWithValue("providerName", providerName))
503+
Expect(valueData).To(HaveKeyWithValue("providerNamespace", providerNamespace))
504+
})
505+
479506
})
480507

481508
func fakeAccessRequestReadiness(env *testutils.Environment, c *clustersv1alpha1.Cluster) {

internal/controllers/cluster/testdata/test-01/config.yaml

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,11 @@ spec:
1818
- name: foo
1919
purposeSelector:
2020
name: foo
21-
helmValues: |
22-
{
23-
"foo": "foo"
24-
}
21+
helmValues:
22+
foo: foo
2523
- name: asdf
26-
helmValues: |
27-
{
28-
"foo": "bar"
29-
}
24+
helmValues:
25+
foo: bar
3026
- name: qwer
31-
helmValues: |
32-
{
33-
"foo": "baz"
34-
}
27+
helmValues:
28+
foo: baz

internal/controllers/cluster/testdata/test-02/config.yaml

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,12 @@ spec:
1818
and:
1919
- name: foo
2020
- name: bar
21-
helmValues: |
22-
{
23-
"foo": "baz"
24-
}
21+
helmValues:
22+
foo: baz
2523
- name: foobar
2624
purposeSelector:
2725
and:
2826
- name: foo
2927
- name: foobar
30-
helmValues: |
31-
{
32-
"foo": "foo"
33-
}
28+
helmValues:
29+
foo: foo

internal/controllers/cluster/testdata/test-03/config.yaml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ spec:
1111
- name: foo
1212
purposeSelector:
1313
name: foo
14-
helmValues: |
15-
{
16-
"foo": "foo"
17-
}
14+
helmValues:
15+
providerNamespace: <provider.namespace>
16+
providerName: <provider.name>
17+
environment: <environment>
18+
clusterNamespace: <cluster.namespace>
19+
clusterName: <cluster.name>

internal/controllers/cluster/testdata/test-04/config.yaml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,5 @@ spec:
1111
- name: foo
1212
purposeSelector:
1313
name: foo
14-
helmValues: |
15-
{
16-
"foo": "foo"
17-
}
14+
helmValues:
15+
foo: foo

0 commit comments

Comments
 (0)