@@ -12,12 +12,12 @@ import (
12
12
)
13
13
14
14
const (
15
- defaultNamespaceIdCacheTTL = 2 * time .Minute
16
- defaultNamespaceIdCacheSize = 100
17
- defaultServiceIdCacheTTL = 2 * time .Minute
18
- defaultServiceIdCacheSize = 1024
19
- defaultEndpointsCacheTTL = 5 * time .Second
20
- defaultEndpointsCacheSize = 1024
15
+ defaultNamespaceCacheTTL = 2 * time .Minute
16
+ defaultNamespaceCacheSize = 100
17
+ defaultServiceIdCacheTTL = 2 * time .Minute
18
+ defaultServiceIdCacheSize = 1024
19
+ defaultEndpointsCacheTTL = 5 * time .Second
20
+ defaultEndpointsCacheSize = 1024
21
21
)
22
22
23
23
// ServiceDiscoveryClient provides the service endpoint management functionality required by the AWS Cloud Map
@@ -40,21 +40,21 @@ type ServiceDiscoveryClient interface {
40
40
}
41
41
42
42
type serviceDiscoveryClient struct {
43
- log logr.Logger
44
- sdApi ServiceDiscoveryApi
45
- namespaceIdCache * cache.LRUExpireCache
46
- serviceIdCache * cache.LRUExpireCache
47
- endpointCache * cache.LRUExpireCache
43
+ log logr.Logger
44
+ sdApi ServiceDiscoveryApi
45
+ namespaceCache * cache.LRUExpireCache
46
+ serviceIdCache * cache.LRUExpireCache
47
+ endpointCache * cache.LRUExpireCache
48
48
}
49
49
50
50
// NewServiceDiscoveryClient creates a new service discovery client for AWS Cloud Map from a given AWS client config.
51
51
func NewServiceDiscoveryClient (cfg * aws.Config ) ServiceDiscoveryClient {
52
52
return & serviceDiscoveryClient {
53
- log : ctrl .Log .WithName ("cloudmap" ),
54
- sdApi : NewServiceDiscoveryApiFromConfig (cfg ),
55
- namespaceIdCache : cache .NewLRUExpireCache (defaultNamespaceIdCacheSize ),
56
- serviceIdCache : cache .NewLRUExpireCache (defaultServiceIdCacheSize ),
57
- endpointCache : cache .NewLRUExpireCache (defaultEndpointsCacheSize ),
53
+ log : ctrl .Log .WithName ("cloudmap" ),
54
+ sdApi : NewServiceDiscoveryApiFromConfig (cfg ),
55
+ namespaceCache : cache .NewLRUExpireCache (defaultNamespaceCacheSize ),
56
+ serviceIdCache : cache .NewLRUExpireCache (defaultServiceIdCacheSize ),
57
+ endpointCache : cache .NewLRUExpireCache (defaultEndpointsCacheSize ),
58
58
}
59
59
}
60
60
@@ -92,21 +92,20 @@ func (sdc *serviceDiscoveryClient) ListServices(ctx context.Context, nsName stri
92
92
func (sdc * serviceDiscoveryClient ) CreateService (ctx context.Context , nsName string , svcName string ) (err error ) {
93
93
sdc .log .Info ("creating a new service" , "namespace" , nsName , "name" , svcName )
94
94
95
- nsId , err := sdc .getNamespaceId (ctx , nsName )
95
+ namespace , err := sdc .getNamespace (ctx , nsName )
96
96
if err != nil {
97
97
return err
98
98
}
99
99
100
- if nsId == "" {
101
- nsId , err = sdc .createNamespace (ctx , nsName )
102
- }
103
- if err != nil {
104
- return err
100
+ if namespace == nil {
101
+ // Create HttpNamespace if the namespace is not present in the CloudMap
102
+ namespace , err = sdc .createNamespace (ctx , nsName )
103
+ if err != nil {
104
+ return err
105
+ }
105
106
}
106
107
107
- //TODO: Handle non-http namespaces
108
- svcId , err := sdc .sdApi .CreateService (ctx , nsId , svcName )
109
-
108
+ svcId , err := sdc .sdApi .CreateService (ctx , * namespace , svcName )
110
109
if err != nil {
111
110
return err
112
111
}
@@ -117,7 +116,7 @@ func (sdc *serviceDiscoveryClient) CreateService(ctx context.Context, nsName str
117
116
}
118
117
119
118
func (sdc * serviceDiscoveryClient ) GetService (ctx context.Context , nsName string , svcName string ) (svc * model.Service , err error ) {
120
- sdc .log .Info ("fetching a service" , "nsName " , nsName , "svcName " , svcName )
119
+ sdc .log .Info ("fetching a service" , "namespace " , nsName , "name " , svcName )
121
120
122
121
svcId , err := sdc .getServiceId (ctx , nsName , svcName )
123
122
@@ -237,27 +236,44 @@ func (sdc *serviceDiscoveryClient) listEndpoints(ctx context.Context, serviceId
237
236
}
238
237
239
238
func (sdc * serviceDiscoveryClient ) getNamespaceId (ctx context.Context , nsName string ) (nsId string , err error ) {
239
+ namespace , err := sdc .getNamespace (ctx , nsName )
240
+ if err != nil || namespace == nil {
241
+ return "" , err
242
+ }
243
+ return namespace .Id , nil
244
+ }
245
+
246
+ func (sdc * serviceDiscoveryClient ) getNamespace (ctx context.Context , nsName string ) (namespace * model.Namespace , err error ) {
240
247
// We are assuming a unique namespace name per account
241
- if cachedValue , exists := sdc .namespaceIdCache .Get (nsName ); exists {
242
- return cachedValue .(string ), nil
248
+ if cachedValue , exists := sdc .namespaceCache .Get (nsName ); exists {
249
+ ns , ok := cachedValue .(* model.Namespace )
250
+ if ! ok {
251
+ return nil , nil
252
+ }
253
+ return ns , nil
243
254
}
244
255
245
256
namespaces , err := sdc .sdApi .ListNamespaces (ctx )
246
-
247
257
if err != nil {
248
- return "" , err
258
+ return nil , err
249
259
}
250
260
251
261
for _ , ns := range namespaces {
252
- sdc .cacheNamespaceId (ns .Name , ns .Id )
262
+ sdc .cacheNamespace (* ns )
263
+ // Set the return namespace
253
264
if nsName == ns .Name {
254
- nsId = ns . Id
265
+ namespace = ns
255
266
}
256
267
}
257
268
258
- // This will cache empty namespace IDs for namespaces not in Cloud Map
259
- sdc .cacheNamespaceId (nsName , nsId )
260
- return nsId , nil
269
+ if namespace == nil {
270
+ // This will cache empty namespace IDs for namespaces not in Cloud Map
271
+ sdc .cacheNamespace (model.Namespace {
272
+ Name : nsName ,
273
+ })
274
+ }
275
+
276
+ return namespace , nil
261
277
}
262
278
263
279
func (sdc * serviceDiscoveryClient ) getServiceId (ctx context.Context , nsName string , svcName string ) (svcId string , err error ) {
@@ -293,27 +309,31 @@ func (sdc *serviceDiscoveryClient) getServiceId(ctx context.Context, nsName stri
293
309
return svcId , nil
294
310
}
295
311
296
- func (sdc * serviceDiscoveryClient ) createNamespace (ctx context.Context , nsName string ) (nsId string , err error ) {
312
+ func (sdc * serviceDiscoveryClient ) createNamespace (ctx context.Context , nsName string ) (namespace * model. Namespace , err error ) {
297
313
sdc .log .Info ("creating a new namespace" , "namespace" , nsName )
298
314
opId , err := sdc .sdApi .CreateHttpNamespace (ctx , nsName )
299
-
300
315
if err != nil {
301
- return "" , err
316
+ return nil , err
302
317
}
303
318
304
- nsId , err = sdc .sdApi .PollCreateNamespace (ctx , opId )
305
-
319
+ nsId , err := sdc .sdApi .PollCreateNamespace (ctx , opId )
306
320
if err != nil {
307
- return "" , err
321
+ return nil , err
308
322
}
309
323
310
- sdc .cacheNamespaceId (nsName , nsId )
324
+ // Cache the Namespace, by default we always create namespace of type HTTP
325
+ namespace = & model.Namespace {
326
+ Id : nsId ,
327
+ Name : nsName ,
328
+ Type : "HTTP" ,
329
+ }
330
+ sdc .cacheNamespace (* namespace )
311
331
312
- return nsId , nil
332
+ return namespace , nil
313
333
}
314
334
315
- func (sdc * serviceDiscoveryClient ) cacheNamespaceId ( nsName string , nsId string ) {
316
- sdc .namespaceIdCache .Add (nsName , nsId , defaultNamespaceIdCacheTTL )
335
+ func (sdc * serviceDiscoveryClient ) cacheNamespace ( namespace model. Namespace ) {
336
+ sdc .namespaceCache .Add (namespace . Name , namespace , defaultNamespaceCacheTTL )
317
337
}
318
338
319
339
func (sdc * serviceDiscoveryClient ) cacheServiceId (nsName string , svcName string , svcId string ) {
0 commit comments