@@ -17,6 +17,7 @@ limitations under the License.
1717package frontproxy
1818
1919import (
20+ "bytes"
2021 "context"
2122 "fmt"
2223
@@ -30,6 +31,66 @@ import (
3031 operatorv1alpha1 "github.com/kcp-dev/kcp-operator/sdk/apis/operator/v1alpha1"
3132)
3233
34+ func (r * reconciler ) mergedClientCASecretName () string {
35+ if r .frontProxy != nil {
36+ return fmt .Sprintf ("%s-merged-client-ca" , r .frontProxy .Name )
37+ }
38+ return fmt .Sprintf ("%s-proxy-merged-client-ca" , r .rootShard .Name )
39+ }
40+
41+ // mergedClientCASecretReconciler creates a single secret with the
42+ // FrontProxyClientCA and shard ClientCA concatenated so that the front
43+ // proxy accepts clients signed by either CA.
44+ func (r * reconciler ) mergedClientCASecretReconciler (ctx context.Context , kubeClient ctrlruntimeclient.Client ) k8creconciling.NamedSecretReconcilerFactory {
45+ getCA := func (caType operatorv1alpha1.CA ) ([]byte , error ) {
46+ caSecret := & corev1.Secret {}
47+ caSecretName := resources .GetRootShardCAName (r .rootShard , caType )
48+ if err := kubeClient .Get (ctx , types.NamespacedName {
49+ Namespace : r .rootShard .Namespace ,
50+ Name : caSecretName ,
51+ }, caSecret ); err != nil {
52+ return nil , fmt .Errorf ("failed to get %s secret %s: %w" , caType , caSecretName , err )
53+ }
54+
55+ cert , ok := caSecret .Data ["tls.crt" ]
56+ if ! ok {
57+ return nil , fmt .Errorf ("%s secret %s missing tls.crt" , caType , caSecretName )
58+ }
59+ return cert , nil
60+ }
61+
62+ return func () (string , k8creconciling.SecretReconciler ) {
63+ return r .mergedClientCASecretName (), func (secret * corev1.Secret ) (* corev1.Secret , error ) {
64+ if secret .Data == nil {
65+ secret .Data = make (map [string ][]byte )
66+ }
67+
68+ fpClientCA , err := getCA (operatorv1alpha1 .FrontProxyClientCA )
69+ if err != nil {
70+ return nil , fmt .Errorf ("error getting front proxy client ca: %w" , err )
71+ }
72+
73+ clientCA , err := getCA (operatorv1alpha1 .ClientCA )
74+ if err != nil {
75+ return nil , fmt .Errorf ("error getting client ca: %w" , err )
76+ }
77+
78+ secret .Data ["tls.crt" ] = bytes .Join ([][]byte {fpClientCA , clientCA }, []byte {'\n' })
79+
80+ if secret .Labels == nil {
81+ secret .Labels = make (map [string ]string )
82+ }
83+ if r .frontProxy != nil {
84+ secret .Labels [resources .FrontProxyLabel ] = r .frontProxy .Name
85+ } else {
86+ secret .Labels [resources .RootShardLabel ] = r .rootShard .Name
87+ }
88+
89+ return secret , nil
90+ }
91+ }
92+ }
93+
3394func (r * reconciler ) mergedCABundleSecretName () string {
3495 // Validate whether called for frontProxy or rootShardFrontProxy
3596 if r .frontProxy != nil {
0 commit comments