Skip to content

Commit ad4cf12

Browse files
committed
Improve connection config priority. Add missing option from consumer CRD.
1 parent 5db0cff commit ad4cf12

File tree

9 files changed

+214
-101
lines changed

9 files changed

+214
-101
lines changed

cmd/jetstream-controller/main.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737

3838
ctrl "sigs.k8s.io/controller-runtime"
3939
"sigs.k8s.io/controller-runtime/pkg/healthz"
40+
"sigs.k8s.io/controller-runtime/pkg/log"
4041
)
4142

4243
var (
@@ -94,7 +95,6 @@ func run() error {
9495
klog.Warning("Starting jetStream controller in experimental control loop mode")
9596

9697
natsCfg := &controller.NatsConfig{
97-
CRDConnect: *crdConnect,
9898
ClientName: "jetstream-controller",
9999
Credentials: *creds,
100100
NKey: *nkey,
@@ -167,9 +167,11 @@ func runControlLoop(config *rest.Config, natsCfg *controller.NatsConfig, control
167167
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
168168
utilruntime.Must(v1beta2.AddToScheme(scheme))
169169

170+
log.SetLogger(klog.NewKlogr())
171+
170172
mgr, err := ctrl.NewManager(config, ctrl.Options{
171173
Scheme: scheme,
172-
Logger: klog.NewKlogr().WithName("controller-runtime"),
174+
Logger: log.Log,
173175
})
174176
if err != nil {
175177
return fmt.Errorf("unable to start manager: %w", err)

controllers/jetstream/controller.go

+36-41
Original file line numberDiff line numberDiff line change
@@ -459,40 +459,40 @@ func (c *Controller) getAccountOverrides(account string, ns string) (*accountOve
459459
return nil, err
460460
}
461461

462-
filesToWrite := make(map[string]string)
462+
var certData, keyData []byte
463+
var certPath, keyPath string
463464

464-
getSecretValue := func(key string) string {
465-
value, ok := secret.Data[key]
466-
if !ok {
467-
return ""
465+
for k, v := range secret.Data {
466+
switch k {
467+
case acc.Spec.TLS.ClientCert:
468+
certPath = filepath.Join(accDir, k)
469+
certData = v
470+
case acc.Spec.TLS.ClientKey:
471+
keyPath = filepath.Join(accDir, k)
472+
keyData = v
473+
case acc.Spec.TLS.RootCAs:
474+
overrides.remoteRootCA = filepath.Join(accDir, k)
475+
if err := os.WriteFile(overrides.remoteRootCA, v, 0o644); err != nil {
476+
return nil, err
477+
}
468478
}
469-
return string(value)
470-
}
471-
472-
remoteClientCertValue := getSecretValue(acc.Spec.TLS.ClientCert)
473-
remoteClientKeyValue := getSecretValue(acc.Spec.TLS.ClientKey)
474-
if remoteClientCertValue != "" && remoteClientKeyValue != "" {
475-
overrides.remoteClientCert = filepath.Join(accDir, acc.Spec.TLS.ClientCert)
476-
overrides.remoteClientKey = filepath.Join(accDir, acc.Spec.TLS.ClientKey)
477-
478-
filesToWrite[acc.Spec.TLS.ClientCert] = remoteClientCertValue
479-
filesToWrite[acc.Spec.TLS.ClientKey] = remoteClientKeyValue
480479
}
481480

482-
remoteRootCAValue := getSecretValue(acc.Spec.TLS.RootCAs)
483-
if remoteRootCAValue != "" {
484-
overrides.remoteRootCA = filepath.Join(accDir, acc.Spec.TLS.RootCAs)
485-
filesToWrite[acc.Spec.TLS.RootCAs] = remoteRootCAValue
486-
}
481+
if certData != nil && keyData != nil {
482+
overrides.remoteClientCert = certPath
483+
overrides.remoteClientKey = keyPath
487484

488-
for file, v := range filesToWrite {
489-
if err := os.WriteFile(filepath.Join(accDir, file), []byte(v), 0o644); err != nil {
485+
if err := os.WriteFile(certPath, certData, 0o644); err != nil {
486+
return nil, err
487+
}
488+
if err := os.WriteFile(keyPath, keyData, 0o644); err != nil {
490489
return nil, err
491490
}
492491
}
493492
}
493+
494494
// Lookup the UserCredentials.
495-
if acc.Spec.Creds != nil {
495+
if acc.Spec.Creds != nil && acc.Spec.Creds.Secret != nil {
496496
secretName := acc.Spec.Creds.Secret.Name
497497
secret, err := c.ki.Secrets(ns).Get(c.ctx, secretName, k8smeta.GetOptions{})
498498
if err != nil {
@@ -504,12 +504,11 @@ func (c *Controller) getAccountOverrides(account string, ns string) (*accountOve
504504
if err := os.MkdirAll(accDir, 0o755); err != nil {
505505
return nil, err
506506
}
507-
for k, v := range secret.Data {
508-
if k == acc.Spec.Creds.File {
509-
overrides.userCreds = filepath.Join(c.cacheDir, ns, account, k)
510-
if err := os.WriteFile(filepath.Join(accDir, k), v, 0o644); err != nil {
511-
return nil, err
512-
}
507+
508+
if credsBytes, ok := secret.Data[acc.Spec.Creds.File]; ok {
509+
overrides.userCreds = filepath.Join(accDir, acc.Spec.Creds.File)
510+
if err := os.WriteFile(overrides.userCreds, credsBytes, 0o644); err != nil {
511+
return nil, err
513512
}
514513
}
515514
}
@@ -522,10 +521,8 @@ func (c *Controller) getAccountOverrides(account string, ns string) (*accountOve
522521
return nil, err
523522
}
524523

525-
for k, v := range secret.Data {
526-
if k == acc.Spec.Token.Token {
527-
overrides.token = string(v)
528-
}
524+
if token, ok := secret.Data[acc.Spec.Token.Token]; ok {
525+
overrides.token = string(token)
529526
}
530527
}
531528

@@ -537,13 +534,11 @@ func (c *Controller) getAccountOverrides(account string, ns string) (*accountOve
537534
return nil, err
538535
}
539536

540-
for k, v := range secret.Data {
541-
if k == acc.Spec.User.User {
542-
overrides.user = string(v)
543-
}
544-
if k == acc.Spec.User.Password {
545-
overrides.password = string(v)
546-
}
537+
userBytes := secret.Data[acc.Spec.User.User]
538+
passwordBytes := secret.Data[acc.Spec.User.Password]
539+
if userBytes != nil && passwordBytes != nil {
540+
overrides.user = string(userBytes)
541+
overrides.password = string(passwordBytes)
547542
}
548543
}
549544

deploy/crds.yml

+3
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,9 @@ spec:
618618
maxRequestMaxBytes:
619619
description: The maximum max_bytes value that maybe set when dong a pull on a Pull Consumer.
620620
type: integer
621+
inactiveThreshold:
622+
description: The idle time an Ephemeral Consumer allows before it is removed.
623+
type: string
621624
replicas:
622625
description: When set do not inherit the replica count from the stream but specifically set it to this amount.
623626
type: integer

internal/controller/client.go

+72-10
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,93 @@ import (
99
)
1010

1111
type NatsConfig struct {
12-
CRDConnect bool
1312
ClientName string
14-
Credentials string
15-
NKey string
1613
ServerURL string
17-
CAs []string
1814
Certificate string
1915
Key string
2016
TLSFirst bool
17+
CAs []string
18+
Credentials string
19+
NKey string
20+
Token string
21+
User string
22+
Password string
23+
}
24+
25+
func (o *NatsConfig) Overlay(overlay *NatsConfig) {
26+
if overlay.ClientName != "" {
27+
o.ClientName = overlay.ClientName
28+
}
29+
30+
if overlay.ServerURL != "" {
31+
o.ServerURL = overlay.ServerURL
32+
}
33+
34+
if overlay.Certificate != "" && overlay.Key != "" {
35+
o.Certificate = overlay.Certificate
36+
o.Key = overlay.Key
37+
}
38+
39+
if len(overlay.CAs) > 0 {
40+
o.CAs = overlay.CAs
41+
}
42+
43+
if overlay.TLSFirst {
44+
o.TLSFirst = overlay.TLSFirst
45+
}
46+
47+
if !overlay.HasAuth() {
48+
return
49+
}
50+
51+
o.UnsetAuth()
52+
53+
if overlay.Credentials != "" {
54+
o.Credentials = overlay.Credentials
55+
} else if overlay.NKey != "" {
56+
o.NKey = overlay.NKey
57+
} else if overlay.Token != "" {
58+
o.Token = overlay.Token
59+
} else if overlay.User != "" && overlay.Password != "" {
60+
o.User = overlay.User
61+
o.Password = overlay.Password
62+
}
63+
}
64+
65+
func (o *NatsConfig) HasAuth() bool {
66+
return o.Credentials != "" || o.NKey != "" || o.Token != "" || (o.User != "" && o.Password != "")
67+
}
68+
69+
func (o *NatsConfig) UnsetAuth() {
70+
o.Credentials = ""
71+
o.NKey = ""
72+
o.User = ""
73+
o.Password = ""
74+
o.Token = ""
2175
}
2276

2377
// buildOptions creates options from the config to be used in nats.Connect.
2478
func (o *NatsConfig) buildOptions() ([]nats.Option, error) {
2579
opts := make([]nats.Option, 0)
2680

81+
if o.ClientName != "" {
82+
opts = append(opts, nats.Name(o.ClientName))
83+
}
84+
2785
if o.ServerURL == "" {
2886
return nil, fmt.Errorf("server url is required")
2987
}
3088

89+
if o.Certificate != "" && o.Key != "" {
90+
opts = append(opts, nats.ClientCert(o.Certificate, o.Key))
91+
}
92+
3193
if o.TLSFirst {
3294
opts = append(opts, nats.TLSHandshakeFirst())
3395
}
3496

35-
if o.ClientName != "" {
36-
opts = append(opts, nats.Name(o.ClientName))
97+
if len(o.CAs) > 0 {
98+
opts = append(opts, nats.RootCAs(o.CAs...))
3799
}
38100

39101
if o.Credentials != "" {
@@ -48,12 +110,12 @@ func (o *NatsConfig) buildOptions() ([]nats.Option, error) {
48110
opts = append(opts, opt)
49111
}
50112

51-
if o.Certificate != "" && o.Key != "" {
52-
opts = append(opts, nats.ClientCert(o.Certificate, o.Key))
113+
if o.Token != "" {
114+
opts = append(opts, nats.Token(o.Token))
53115
}
54116

55-
if len(o.CAs) > 0 {
56-
opts = append(opts, nats.RootCAs(o.CAs...))
117+
if o.User != "" && o.Password != "" {
118+
opts = append(opts, nats.UserInfo(o.User, o.Password))
57119
}
58120

59121
return opts, nil

internal/controller/consumer_controller.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func (r *ConsumerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
6666
consumer := &api.Consumer{}
6767
if err := r.Get(ctx, req.NamespacedName, consumer); err != nil {
6868
if apierrors.IsNotFound(err) {
69-
log.Info("Consumer deleted.", "consumerName", req.NamespacedName.String())
69+
log.Info("Consumer resource deleted.", "consumerName", req.NamespacedName.String())
7070
return ctrl.Result{}, nil
7171
}
7272
return ctrl.Result{}, fmt.Errorf("get consumer resource '%s': %w", req.NamespacedName.String(), err)

0 commit comments

Comments
 (0)