Skip to content

Commit a0a0af8

Browse files
authored
feat: Allow external usage of secret and proxy modules (#113)
1 parent f858a1e commit a0a0af8

File tree

4 files changed

+43
-48
lines changed

4 files changed

+43
-48
lines changed

internal/controller/controller.go

+1-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"github.com/caddyserver/caddy/v2"
1212
"github.com/caddyserver/certmagic"
1313
"github.com/caddyserver/ingress/internal/k8s"
14-
"github.com/caddyserver/ingress/pkg/storage"
1514
"github.com/caddyserver/ingress/pkg/store"
1615
"go.uber.org/zap"
1716
apiv1 "k8s.io/api/core/v1"
@@ -28,6 +27,7 @@ import (
2827
_ "github.com/caddyserver/caddy/v2/modules/caddytls/standardstek"
2928
_ "github.com/caddyserver/caddy/v2/modules/metrics"
3029
_ "github.com/caddyserver/ingress/pkg/proxy"
30+
_ "github.com/caddyserver/ingress/pkg/storage"
3131
)
3232

3333
const (
@@ -146,9 +146,6 @@ func NewCaddyController(
146146
DeleteFunc: controller.onConfigMapDeleted,
147147
})
148148

149-
// register kubernetes specific cert-magic storage module and proxy module
150-
caddy.RegisterModule(storage.SecretStorage{})
151-
152149
// Create resource store
153150
controller.resourceStore = store.NewStore(opts, podInfo)
154151

pkg/proxy/proxy.go

+24-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package proxy
22

3-
import "github.com/caddyserver/caddy/v2"
3+
import (
4+
"github.com/caddyserver/caddy/v2"
5+
"github.com/pires/go-proxyproto"
6+
"net"
7+
)
48

59
var (
610
_ = caddy.Provisioner(&Wrapper{})
@@ -12,9 +16,28 @@ func init() {
1216
caddy.RegisterModule(Wrapper{})
1317
}
1418

19+
// Wrapper provides PROXY protocol support to Caddy by implementing the caddy.ListenerWrapper interface.
20+
// It must be loaded before the `tls` listener.
21+
type Wrapper struct {
22+
policy proxyproto.PolicyFunc
23+
}
24+
1525
func (Wrapper) CaddyModule() caddy.ModuleInfo {
1626
return caddy.ModuleInfo{
1727
ID: "caddy.listeners.proxy_protocol",
1828
New: func() caddy.Module { return new(Wrapper) },
1929
}
2030
}
31+
32+
func (pp *Wrapper) Provision(ctx caddy.Context) error {
33+
pp.policy = func(upstream net.Addr) (proxyproto.Policy, error) {
34+
return proxyproto.REQUIRE, nil
35+
}
36+
return nil
37+
}
38+
39+
func (pp *Wrapper) WrapListener(l net.Listener) net.Listener {
40+
pL := &proxyproto.Listener{Listener: l, Policy: pp.policy}
41+
42+
return pL
43+
}

pkg/proxy/wrapper.go

-30
This file was deleted.

pkg/storage/storage.go

+18-13
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,17 @@ func cleanKey(key string, prefix string) string {
4646

4747
// SecretStorage facilitates storing certificates retrieved by certmagic in kubernetes secrets.
4848
type SecretStorage struct {
49-
Namespace string
50-
KubeClient *kubernetes.Clientset
51-
LeaseId string
49+
Namespace string
50+
LeaseId string
51+
52+
kubeClient *kubernetes.Clientset
5253
logger *zap.Logger
5354
}
5455

56+
func init() {
57+
caddy.RegisterModule(SecretStorage{})
58+
}
59+
5560
func (SecretStorage) CaddyModule() caddy.ModuleInfo {
5661
return caddy.ModuleInfo{
5762
ID: "caddy.storage.secret_store",
@@ -66,7 +71,7 @@ func (s *SecretStorage) Provision(ctx caddy.Context) error {
6671
clientset, _ := kubernetes.NewForConfig(config)
6772

6873
s.logger = ctx.Logger(s)
69-
s.KubeClient = clientset
74+
s.kubeClient = clientset
7075
if s.LeaseId == "" {
7176
s.LeaseId = uuid.New().String()
7277
}
@@ -81,7 +86,7 @@ func (s *SecretStorage) CertMagicStorage() (certmagic.Storage, error) {
8186
// Exists returns true if key exists in fs.
8287
func (s *SecretStorage) Exists(ctx context.Context, key string) bool {
8388
s.logger.Debug("finding secret", zap.String("name", key))
84-
secrets, err := s.KubeClient.CoreV1().Secrets(s.Namespace).List(context.TODO(), metav1.ListOptions{
89+
secrets, err := s.kubeClient.CoreV1().Secrets(s.Namespace).List(context.TODO(), metav1.ListOptions{
8590
FieldSelector: fmt.Sprintf("metadata.name=%v", cleanKey(key, keyPrefix)),
8691
})
8792

@@ -115,10 +120,10 @@ func (s *SecretStorage) Store(ctx context.Context, key string, value []byte) err
115120
var err error
116121
if s.Exists(ctx, key) {
117122
s.logger.Debug("creating secret", zap.String("name", key))
118-
_, err = s.KubeClient.CoreV1().Secrets(s.Namespace).Update(context.TODO(), &se, metav1.UpdateOptions{})
123+
_, err = s.kubeClient.CoreV1().Secrets(s.Namespace).Update(context.TODO(), &se, metav1.UpdateOptions{})
119124
} else {
120125
s.logger.Debug("updating secret", zap.String("name", key))
121-
_, err = s.KubeClient.CoreV1().Secrets(s.Namespace).Create(context.TODO(), &se, metav1.CreateOptions{})
126+
_, err = s.kubeClient.CoreV1().Secrets(s.Namespace).Create(context.TODO(), &se, metav1.CreateOptions{})
122127
}
123128

124129
if err != nil {
@@ -130,7 +135,7 @@ func (s *SecretStorage) Store(ctx context.Context, key string, value []byte) err
130135

131136
// Load retrieves the value at the given key.
132137
func (s *SecretStorage) Load(ctx context.Context, key string) ([]byte, error) {
133-
secret, err := s.KubeClient.CoreV1().Secrets(s.Namespace).Get(context.TODO(), cleanKey(key, keyPrefix), metav1.GetOptions{})
138+
secret, err := s.kubeClient.CoreV1().Secrets(s.Namespace).Get(context.TODO(), cleanKey(key, keyPrefix), metav1.GetOptions{})
134139
if err != nil {
135140
if errors.IsNotFound(err) {
136141
return nil, fs.ErrNotExist
@@ -144,7 +149,7 @@ func (s *SecretStorage) Load(ctx context.Context, key string) ([]byte, error) {
144149

145150
// Delete deletes the value at the given key.
146151
func (s *SecretStorage) Delete(ctx context.Context, key string) error {
147-
err := s.KubeClient.CoreV1().Secrets(s.Namespace).Delete(context.TODO(), cleanKey(key, keyPrefix), metav1.DeleteOptions{})
152+
err := s.kubeClient.CoreV1().Secrets(s.Namespace).Delete(context.TODO(), cleanKey(key, keyPrefix), metav1.DeleteOptions{})
148153
if err != nil {
149154
return err
150155
}
@@ -158,7 +163,7 @@ func (s *SecretStorage) List(ctx context.Context, prefix string, recursive bool)
158163
var keys []string
159164

160165
s.logger.Debug("listing secrets", zap.String("name", prefix))
161-
secrets, err := s.KubeClient.CoreV1().Secrets(s.Namespace).List(context.TODO(), metav1.ListOptions{
166+
secrets, err := s.kubeClient.CoreV1().Secrets(s.Namespace).List(context.TODO(), metav1.ListOptions{
162167
LabelSelector: labels.SelectorFromSet(matchLabels).String(),
163168
})
164169
if err != nil {
@@ -178,7 +183,7 @@ func (s *SecretStorage) List(ctx context.Context, prefix string, recursive bool)
178183

179184
// Stat returns information about key.
180185
func (s *SecretStorage) Stat(ctx context.Context, key string) (certmagic.KeyInfo, error) {
181-
secret, err := s.KubeClient.CoreV1().Secrets(s.Namespace).Get(context.TODO(), cleanKey(key, keyPrefix), metav1.GetOptions{})
186+
secret, err := s.kubeClient.CoreV1().Secrets(s.Namespace).Get(context.TODO(), cleanKey(key, keyPrefix), metav1.GetOptions{})
182187
if err != nil {
183188
return certmagic.KeyInfo{}, err
184189
}
@@ -229,7 +234,7 @@ func (s *SecretStorage) tryAcquireOrRenew(ctx context.Context, key string, shoul
229234
Name: key,
230235
Namespace: s.Namespace,
231236
},
232-
Client: s.KubeClient.CoordinationV1(),
237+
Client: s.kubeClient.CoordinationV1(),
233238
LockConfig: resourcelock.ResourceLockConfig{
234239
Identity: s.LeaseId,
235240
},
@@ -280,6 +285,6 @@ func (s *SecretStorage) tryAcquireOrRenew(ctx context.Context, key string, shoul
280285
}
281286

282287
func (s *SecretStorage) Unlock(ctx context.Context, key string) error {
283-
err := s.KubeClient.CoordinationV1().Leases(s.Namespace).Delete(context.TODO(), cleanKey(key, leasePrefix), metav1.DeleteOptions{})
288+
err := s.kubeClient.CoordinationV1().Leases(s.Namespace).Delete(context.TODO(), cleanKey(key, leasePrefix), metav1.DeleteOptions{})
284289
return err
285290
}

0 commit comments

Comments
 (0)