-
Notifications
You must be signed in to change notification settings - Fork 34
Expand file tree
/
Copy pathservice_credentials.go
More file actions
152 lines (131 loc) · 4.84 KB
/
Copy pathservice_credentials.go
File metadata and controls
152 lines (131 loc) · 4.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package kata
import (
"context"
"errors"
"sync"
"go.kenn.io/kata/internal/config"
)
// FederationCredential is the secret material used by one spoke project to
// communicate with its hub.
type FederationCredential struct {
HubURL string
HubProjectID int64
Token string
Capabilities string
Actor string
AllowInsecure bool
}
// FederationCredentialStore supplies service-scoped federation secrets.
// Implementations must be safe for concurrent use. Callers that need
// credentials to survive process restarts should provide a durable store;
// otherwise each Service receives its own in-memory store.
type FederationCredentialStore interface {
FederationCredential(context.Context, string) (FederationCredential, bool, error)
StoreFederationCredential(context.Context, string, FederationCredential) error
DeleteFederationCredential(context.Context, string) error
}
type serviceCredentialStoreAdapter struct {
store FederationCredentialStore
}
var errManagedFederationCredentialsUnsupported = errors.New(
"mounted federation credential store does not support managed operations",
)
func (a serviceCredentialStoreAdapter) FederationCredential(
ctx context.Context, projectUID string,
) (config.FederationCredential, bool, error) {
credential, ok, err := a.store.FederationCredential(ctx, projectUID)
if err != nil || !ok {
return config.FederationCredential{}, ok, err
}
return internalFederationCredential(credential), true, nil
}
func (a serviceCredentialStoreAdapter) StoreFederationCredential(
ctx context.Context, projectUID string, credential config.FederationCredential,
) error {
return a.store.StoreFederationCredential(ctx, projectUID, publicFederationCredential(credential))
}
func (a serviceCredentialStoreAdapter) DeleteFederationCredential(ctx context.Context, projectUID string) error {
return a.store.DeleteFederationCredential(ctx, projectUID)
}
// Public mounted credentials cannot carry the management marker or spoke
// project name, so they are structurally unmanaged. The internal adapter
// exposes that fact to shared daemon services without expanding the public
// three-method credential-store contract.
func (serviceCredentialStoreAdapter) FindManagedFederationCredential(
context.Context, string,
) (config.FederationManagedCredentialReservation, bool, error) {
return config.FederationManagedCredentialReservation{}, false, nil
}
func (serviceCredentialStoreAdapter) ReserveManagedFederationCredential(
context.Context, config.FederationManagedCredentialReservation,
) error {
return errManagedFederationCredentialsUnsupported
}
func (serviceCredentialStoreAdapter) RekeyFederationCredential(
context.Context, config.FederationCredentialRekey,
) error {
return errManagedFederationCredentialsUnsupported
}
func (serviceCredentialStoreAdapter) DeleteManagedFederationCredential(
context.Context, config.FederationManagedCredentialReservation,
) error {
return errManagedFederationCredentialsUnsupported
}
func (serviceCredentialStoreAdapter) ReplaceManagedFederationCredential(
context.Context,
config.FederationManagedCredentialReservation,
config.FederationManagedCredentialReservation,
) error {
return errManagedFederationCredentialsUnsupported
}
func internalFederationCredential(credential FederationCredential) config.FederationCredential {
return config.FederationCredential{
HubURL: credential.HubURL,
HubProjectID: credential.HubProjectID,
Token: credential.Token,
Capabilities: credential.Capabilities,
Actor: credential.Actor,
AllowInsecure: credential.AllowInsecure,
}
}
func publicFederationCredential(credential config.FederationCredential) FederationCredential {
return FederationCredential{
HubURL: credential.HubURL,
HubProjectID: credential.HubProjectID,
Token: credential.Token,
Capabilities: credential.Capabilities,
Actor: credential.Actor,
AllowInsecure: credential.AllowInsecure,
}
}
type memoryFederationCredentialStore struct {
mu sync.RWMutex
entries map[string]FederationCredential
}
func newMemoryFederationCredentialStore() *memoryFederationCredentialStore {
return &memoryFederationCredentialStore{entries: make(map[string]FederationCredential)}
}
func (s *memoryFederationCredentialStore) FederationCredential(
_ context.Context, projectUID string,
) (FederationCredential, bool, error) {
s.mu.RLock()
defer s.mu.RUnlock()
credential, ok := s.entries[projectUID]
return credential, ok, nil
}
func (s *memoryFederationCredentialStore) StoreFederationCredential(
_ context.Context, projectUID string, credential FederationCredential,
) error {
s.mu.Lock()
defer s.mu.Unlock()
s.entries[projectUID] = credential
return nil
}
func (s *memoryFederationCredentialStore) DeleteFederationCredential(
_ context.Context, projectUID string,
) error {
s.mu.Lock()
defer s.mu.Unlock()
delete(s.entries, projectUID)
return nil
}