...
1
16
17 package rest
18
19 import (
20 "fmt"
21 "net/http"
22 "sync"
23
24 "k8s.io/klog/v2"
25
26 clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
27 )
28
29 type AuthProvider interface {
30
31
32 WrapTransport(http.RoundTripper) http.RoundTripper
33
34
35 Login() error
36 }
37
38
39
40
41
42
43 type Factory func(clusterAddress string, config map[string]string, persister AuthProviderConfigPersister) (AuthProvider, error)
44
45
46
47 type AuthProviderConfigPersister interface {
48 Persist(map[string]string) error
49 }
50
51 type noopPersister struct{}
52
53 func (n *noopPersister) Persist(_ map[string]string) error {
54
55 return nil
56 }
57
58
59 var pluginsLock sync.Mutex
60 var plugins = make(map[string]Factory)
61
62 func RegisterAuthProviderPlugin(name string, plugin Factory) error {
63 pluginsLock.Lock()
64 defer pluginsLock.Unlock()
65 if _, found := plugins[name]; found {
66 return fmt.Errorf("auth Provider Plugin %q was registered twice", name)
67 }
68 klog.V(4).Infof("Registered Auth Provider Plugin %q", name)
69 plugins[name] = plugin
70 return nil
71 }
72
73 func GetAuthProvider(clusterAddress string, apc *clientcmdapi.AuthProviderConfig, persister AuthProviderConfigPersister) (AuthProvider, error) {
74 pluginsLock.Lock()
75 defer pluginsLock.Unlock()
76 p, ok := plugins[apc.Name]
77 if !ok {
78 return nil, fmt.Errorf("no Auth Provider found for name %q", apc.Name)
79 }
80 if persister == nil {
81 persister = &noopPersister{}
82 }
83 return p(clusterAddress, apc.Config, persister)
84 }
85
View as plain text