@@ -62,7 +62,7 @@ func (r *KubeSecretReconciler) Reconcile(ctx context.Context, req ctrl.Request)
6262 err := r .Get (ctx , req .NamespacedName , kubeSecret )
6363 if err != nil {
6464 if api_errors .IsNotFound (err ) {
65- r .log .Info ("Secret not found. Delete object fron xDS cache" )
65+ r .log .Info ("Secret not found. Delete object from xDS cache" )
6666 nodeIDs , err := r .Cache .GetNodeIDsForResource (resourcev3 .SecretType , getResourceName (req .Namespace , req .Name ))
6767 if err != nil {
6868 return ctrl.Result {}, errors .Wrap (err , errors .GetNodeIDForResource )
@@ -90,13 +90,16 @@ func (r *KubeSecretReconciler) Reconcile(ctx context.Context, req ctrl.Request)
9090 nodeIDs = append (nodeIDs , defaultNodeIDs ... )
9191 }
9292
93+ envoySecrets , err := r .makeEnvoySecrets (kubeSecret )
94+ if err != nil {
95+ return ctrl.Result {}, errors .Wrap (err , "cannot generate xDS secret from Kubernetes Secret" )
96+ }
97+
9398 for _ , nodeID := range nodeIDs {
94- envoySecret , err := r .makeEnvoySecret (kubeSecret )
95- if err != nil {
96- return ctrl.Result {}, errors .Wrap (err , "cannot generate xDS secret from Kubernetes Secret" )
97- }
98- if err := r .Cache .Update (nodeID , envoySecret ); err != nil {
99- return ctrl.Result {}, errors .Wrap (err , errors .CannotUpdateCacheMessage )
99+ for _ , envoySecret := range envoySecrets {
100+ if err := r .Cache .Update (nodeID , envoySecret ); err != nil {
101+ return ctrl.Result {}, errors .Wrap (err , errors .CannotUpdateCacheMessage )
102+ }
100103 }
101104 }
102105
@@ -117,26 +120,40 @@ func (r *KubeSecretReconciler) valid(secret *corev1.Secret) bool {
117120 r .log .V (1 ).Info ("Not a xds controller secret" )
118121 return false
119122 }
120- if secret .Type != corev1 .SecretTypeTLS {
121- r .log .V (1 ).Info ("Kuberentes Secret is not a type TLS. Skip" )
123+ if secret .Type != corev1 .SecretTypeTLS && secret . Type != corev1 . SecretTypeOpaque {
124+ r .log .V (1 ).Info ("Kuberentes Secret is not a type TLS or Opaque . Skip" )
122125 return false
123126 }
124127 return true
125128}
126129
127- func (r * KubeSecretReconciler ) makeEnvoySecret (kubeSecret * corev1.Secret ) (* tlsv3.Secret , error ) {
130+ // Generate xDS secret from Kubernetes Secret
131+ func (r * KubeSecretReconciler ) makeEnvoySecrets (kubeSecret * corev1.Secret ) ([]* tlsv3.Secret , error ) {
132+ switch kubeSecret .Type {
133+ case corev1 .SecretTypeTLS :
134+ return r .makeEnvoyTLSSecret (kubeSecret )
135+ case corev1 .SecretTypeOpaque :
136+ return r .makeEnvoyOpaqueSecret (kubeSecret )
137+ default :
138+ return nil , fmt .Errorf ("unsupported secret type %s" , kubeSecret .Type )
139+ }
140+ }
141+
142+ func (r * KubeSecretReconciler ) makeEnvoyTLSSecret (kubeSecret * corev1.Secret ) ([]* tlsv3.Secret , error ) {
143+ secrets := make ([]* tlsv3.Secret , 0 )
144+
128145 envoySecret := & tlsv3.Secret {
129146 Name : fmt .Sprintf ("%s-%s" , kubeSecret .Namespace , kubeSecret .Name ),
130147 Type : & tlsv3.Secret_TlsCertificate {
131148 TlsCertificate : & tlsv3.TlsCertificate {
132149 CertificateChain : & corev3.DataSource {
133150 Specifier : & corev3.DataSource_InlineBytes {
134- InlineBytes : kubeSecret .Data ["tls.crt" ],
151+ InlineBytes : kubeSecret .Data [corev1 . TLSCertKey ],
135152 },
136153 },
137154 PrivateKey : & corev3.DataSource {
138155 Specifier : & corev3.DataSource_InlineBytes {
139- InlineBytes : kubeSecret .Data ["tls.key" ],
156+ InlineBytes : kubeSecret .Data [corev1 . TLSPrivateKeyKey ],
140157 },
141158 },
142159 },
@@ -146,5 +163,34 @@ func (r *KubeSecretReconciler) makeEnvoySecret(kubeSecret *corev1.Secret) (*tlsv
146163 return nil , errors .Wrap (err , "cannot validate Envoy Secret" )
147164 }
148165
149- return envoySecret , nil
166+ secrets = append (secrets , envoySecret )
167+
168+ return secrets , nil
169+ }
170+
171+ func (r * KubeSecretReconciler ) makeEnvoyOpaqueSecret (kubeSecret * corev1.Secret ) ([]* tlsv3.Secret , error ) {
172+ secrets := make ([]* tlsv3.Secret , 0 )
173+
174+ for k , v := range kubeSecret .Data {
175+ envoySecret := & tlsv3.Secret {
176+ Name : fmt .Sprintf ("%s-%s-%s" , kubeSecret .Namespace , kubeSecret .Name , k ),
177+ Type : & tlsv3.Secret_GenericSecret {
178+ GenericSecret : & tlsv3.GenericSecret {
179+ Secret : & corev3.DataSource {
180+ Specifier : & corev3.DataSource_InlineBytes {
181+ InlineBytes : v ,
182+ },
183+ },
184+ },
185+ },
186+ }
187+
188+ if err := envoySecret .ValidateAll (); err != nil {
189+ return nil , errors .Wrap (err , "cannot validate Envoy Secret" )
190+ }
191+
192+ secrets = append (secrets , envoySecret )
193+ }
194+
195+ return secrets , nil
150196}
0 commit comments