Skip to content

Commit 0d34eeb

Browse files
committed
chore: update based on pr feedback (move fx code into fx.go & test update)
- move fx code into fx.go - update test defaults for baseClient_test.go
1 parent 2f1165a commit 0d34eeb

File tree

6 files changed

+178
-159
lines changed

6 files changed

+178
-159
lines changed

chrysom/basicClient.go

-26
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515

1616
"github.com/xmidt-org/ancla/auth"
1717
"github.com/xmidt-org/ancla/model"
18-
"go.uber.org/fx"
1918
"go.uber.org/zap"
2019
)
2120

@@ -93,31 +92,6 @@ const (
9392
// Items is a slice of model.Item(s) .
9493
type Items []model.Item
9594

96-
// GetLogger returns a logger from the given context.
97-
type GetLogger func(context.Context) *zap.Logger
98-
99-
// SetLogger embeds the `Listener.logger` in outgoing request contexts for `Listener.Update` calls.
100-
type SetLogger func(context.Context, *zap.Logger) context.Context
101-
102-
type BasicClientIn struct {
103-
fx.In
104-
105-
// Ancla Client config.
106-
Config BasicClientConfig
107-
// GetLogger returns a logger from the given context.
108-
GetLogger GetLogger
109-
}
110-
111-
// ProvideBasicClient provides a new BasicClient.
112-
func ProvideBasicClient(in BasicClientIn) (*BasicClient, error) {
113-
client, err := NewBasicClient(in.Config, in.GetLogger)
114-
if err != nil {
115-
return nil, errors.Join(errFailedConfig, err)
116-
}
117-
118-
return client, nil
119-
}
120-
12195
// NewBasicClient creates a new BasicClient that can be used to
12296
// make requests to Argus.
12397
func NewBasicClient(config BasicClientConfig,

chrysom/basicClient_test.go

+14-22
Original file line numberDiff line numberDiff line change
@@ -54,34 +54,30 @@ func TestValidateBasicConfig(t *testing.T) {
5454
{
5555
Description: "No address",
5656
Input: &BasicClientConfig{
57-
HTTPClient: http.DefaultClient,
58-
Bucket: "bucket-name",
57+
Bucket: "bucket-name",
5958
},
6059
ExpectedErr: ErrAddressEmpty,
6160
},
6261
{
6362
Description: "No bucket",
6463
Input: &BasicClientConfig{
65-
HTTPClient: http.DefaultClient,
66-
Address: "example.com",
64+
Address: "example.com",
6765
},
6866
ExpectedErr: ErrBucketEmpty,
6967
},
7068
{
7169
Description: "All default values",
7270
Input: &BasicClientConfig{
73-
HTTPClient: http.DefaultClient,
74-
Address: "example.com",
75-
Bucket: "bucket-name",
71+
Address: "example.com",
72+
Bucket: "bucket-name",
7673
},
7774
ExpectedConfig: allDefaultsCaseConfig,
7875
},
7976
{
8077
Description: "All defined",
8178
Input: &BasicClientConfig{
82-
HTTPClient: http.DefaultClient,
83-
Address: "example.com",
84-
Bucket: "amazing-bucket",
79+
Address: "example.com",
80+
Bucket: "amazing-bucket",
8581
},
8682
ExpectedConfig: allDefinedCaseConfig,
8783
},
@@ -188,9 +184,8 @@ func TestSendRequest(t *testing.T) {
188184
defer server.Close()
189185

190186
client, err := NewBasicClient(BasicClientConfig{
191-
HTTPClient: http.DefaultClient,
192-
Address: "example.com",
193-
Bucket: "bucket-name",
187+
Address: "example.com",
188+
Bucket: "bucket-name",
194189
},
195190
func(context.Context) *zap.Logger {
196191
return zap.NewNop()
@@ -300,9 +295,8 @@ func TestGetItems(t *testing.T) {
300295
}))
301296

302297
client, err := NewBasicClient(BasicClientConfig{
303-
HTTPClient: http.DefaultClient,
304-
Address: server.URL,
305-
Bucket: bucket,
298+
Address: server.URL,
299+
Bucket: bucket,
306300
},
307301
func(context.Context) *zap.Logger {
308302
return zap.NewNop()
@@ -446,9 +440,8 @@ func TestPushItem(t *testing.T) {
446440
}))
447441

448442
client, err := NewBasicClient(BasicClientConfig{
449-
HTTPClient: http.DefaultClient,
450-
Address: server.URL,
451-
Bucket: bucket,
443+
Address: server.URL,
444+
Bucket: bucket,
452445
},
453446
func(context.Context) *zap.Logger {
454447
return zap.NewNop()
@@ -554,9 +547,8 @@ func TestRemoveItem(t *testing.T) {
554547
}))
555548

556549
client, err := NewBasicClient(BasicClientConfig{
557-
HTTPClient: http.DefaultClient,
558-
Address: server.URL,
559-
Bucket: bucket,
550+
Address: server.URL,
551+
Bucket: bucket,
560552
}, func(context.Context) *zap.Logger {
561553
return zap.NewNop()
562554
})

chrysom/fx.go

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// SPDX-FileCopyrightText: 2025 Comcast Cable Communications Management, LLC
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package chrysom
5+
6+
import (
7+
"context"
8+
"errors"
9+
10+
"github.com/prometheus/client_golang/prometheus"
11+
"go.uber.org/fx"
12+
"go.uber.org/zap"
13+
)
14+
15+
// GetLogger returns a logger from the given context.
16+
type GetLogger func(context.Context) *zap.Logger
17+
18+
// SetLogger embeds the `Listener.logger` in outgoing request contexts for `Listener.Update` calls.
19+
type SetLogger func(context.Context, *zap.Logger) context.Context
20+
21+
type BasicClientIn struct {
22+
fx.In
23+
24+
// Ancla Client config.
25+
Config BasicClientConfig
26+
// GetLogger returns a logger from the given context.
27+
GetLogger GetLogger
28+
}
29+
30+
// ProvideBasicClient provides a new BasicClient.
31+
func ProvideBasicClient(in BasicClientIn) (*BasicClient, error) {
32+
client, err := NewBasicClient(in.Config, in.GetLogger)
33+
if err != nil {
34+
return nil, errors.Join(errFailedConfig, err)
35+
}
36+
37+
return client, nil
38+
}
39+
40+
// ListenerConfig contains config data for polling the Argus client.
41+
type ListenerClientIn struct {
42+
fx.In
43+
44+
// Listener fetches a copy of all items within a bucket on
45+
// an interval based on `BasicClientConfig.PullInterval`.
46+
// (Optional). If not provided, listening won't be enabled for this client.
47+
Listener Listener
48+
// Config configures the ancla client and its listeners.
49+
Config BasicClientConfig
50+
// PollsTotalCounter measures the number of polls (and their success/failure outcomes) to fetch new items.
51+
PollsTotalCounter *prometheus.CounterVec `name:"chrysom_polls_total"`
52+
// Reader is the DB interface used to fetch new items using `GeItems`.
53+
Reader Reader
54+
// GetLogger returns a logger from the given context.
55+
GetLogger GetLogger
56+
// SetLogger embeds the `Listener.logger` in outgoing request contexts for `Listener.Update` calls.
57+
SetLogger SetLogger
58+
}
59+
60+
// ProvideListenerClient provides a new ListenerClient.
61+
func ProvideListenerClient(in ListenerClientIn) (*ListenerClient, error) {
62+
client, err := NewListenerClient(in.Listener, in.GetLogger, in.SetLogger, in.Config.PullInterval, in.PollsTotalCounter, in.Reader)
63+
if err != nil {
64+
return nil, errors.Join(err, errFailedConfig)
65+
}
66+
67+
return client, nil
68+
}
69+
70+
func ProvideDefaultListenerReader(client *BasicClient) Reader {
71+
return client
72+
}
73+
74+
type StartListenerIn struct {
75+
fx.In
76+
77+
Listener *ListenerClient
78+
LC fx.Lifecycle
79+
}
80+
81+
// ProvideStartListenerClient starts the Argus listener client service.
82+
func ProvideStartListenerClient(in StartListenerIn) error {
83+
in.Listener.Start(context.Background())
84+
in.LC.Append(fx.StopHook(in.Listener.Stop))
85+
86+
return nil
87+
}

chrysom/listenerClient.go

-50
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"time"
1111

1212
"github.com/prometheus/client_golang/prometheus"
13-
"go.uber.org/fx"
1413
"go.uber.org/zap"
1514
)
1615

@@ -38,26 +37,6 @@ const (
3837
defaultPullInterval = time.Second * 5
3938
)
4039

41-
// ListenerConfig contains config data for polling the Argus client.
42-
type ListenerClientIn struct {
43-
fx.In
44-
45-
// Listener fetches a copy of all items within a bucket on
46-
// an interval based on `BasicClientConfig.PullInterval`.
47-
// (Optional). If not provided, listening won't be enabled for this client.
48-
Listener Listener
49-
// Config configures the ancla client and its listeners.
50-
Config BasicClientConfig
51-
// PollsTotalCounter measures the number of polls (and their success/failure outcomes) to fetch new items.
52-
PollsTotalCounter *prometheus.CounterVec `name:"chrysom_polls_total"`
53-
// Reader is the DB interface used to fetch new items using `GeItems`.
54-
Reader Reader
55-
// GetLogger returns a logger from the given context.
56-
GetLogger GetLogger
57-
// SetLogger embeds the `Listener.logger` in outgoing request contexts for `Listener.Update` calls.
58-
SetLogger SetLogger
59-
}
60-
6140
// ListenerClient is the client used to poll Argus for updates.
6241
type ListenerClient struct {
6342
observer *observerConfig
@@ -76,20 +55,6 @@ type observerConfig struct {
7655
state int32
7756
}
7857

79-
// ProvideListenerClient provides a new ListenerClient.
80-
func ProvideListenerClient(in ListenerClientIn) (*ListenerClient, error) {
81-
client, err := NewListenerClient(in.Listener, in.GetLogger, in.SetLogger, in.Config.PullInterval, in.PollsTotalCounter, in.Reader)
82-
if err != nil {
83-
return nil, errors.Join(err, errFailedConfig)
84-
}
85-
86-
return client, nil
87-
}
88-
89-
func ProvideDefaultListenerReader(client *BasicClient) Reader {
90-
return client
91-
}
92-
9358
// NewListenerClient creates a new ListenerClient to be used to poll Argus
9459
// for updates.
9560
func NewListenerClient(listener Listener,
@@ -188,18 +153,3 @@ func (c *ListenerClient) Stop(ctx context.Context) error {
188153
atomic.SwapInt32(&c.observer.state, stopped)
189154
return nil
190155
}
191-
192-
type StartListenerIn struct {
193-
fx.In
194-
195-
Listener *ListenerClient
196-
LC fx.Lifecycle
197-
}
198-
199-
// ProvideStartListenerClient starts the Argus listener client service.
200-
func ProvideStartListenerClient(in StartListenerIn) error {
201-
in.Listener.Start(context.Background())
202-
in.LC.Append(fx.StopHook(in.Listener.Stop))
203-
204-
return nil
205-
}

fx.go

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// SPDX-FileCopyrightText: 2025 Comcast Cable Communications Management, LLC
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package ancla
5+
6+
import (
7+
"github.com/xmidt-org/ancla/chrysom"
8+
9+
"github.com/prometheus/client_golang/prometheus"
10+
"go.uber.org/fx"
11+
)
12+
13+
type ServiceIn struct {
14+
fx.In
15+
16+
// Ancla Client.
17+
BasicClient *chrysom.BasicClient
18+
}
19+
20+
// ProvideService builds the Argus client service from the given configuration.
21+
func ProvideService(in ServiceIn) Service {
22+
return NewService(in.BasicClient)
23+
}
24+
25+
// TODO: Refactor and move Watch and Listener related code to chrysom.
26+
type DefaultListenersIn struct {
27+
fx.In
28+
29+
// Metric for webhook list size, used by the webhook list size watcher listener.
30+
WebhookListSizeGauge prometheus.Gauge `name:"webhook_list_size"`
31+
}
32+
33+
type DefaultListenerOut struct {
34+
fx.Out
35+
36+
Watchers []Watch `group:"watchers,flatten"`
37+
}
38+
39+
func ProvideDefaultListenerWatchers(in DefaultListenersIn) DefaultListenerOut {
40+
var watchers []Watch
41+
42+
watchers = append(watchers, webhookListSizeWatch(in.WebhookListSizeGauge))
43+
44+
return DefaultListenerOut{
45+
Watchers: watchers,
46+
}
47+
}
48+
49+
type ListenerIn struct {
50+
fx.In
51+
52+
Shutdowner fx.Shutdowner
53+
// Watchers are called by the Listener when new webhooks are fetched.
54+
Watchers []Watch `group:"watchers"`
55+
}
56+
57+
func ProvideListener(in ListenerIn) chrysom.Listener {
58+
return chrysom.ListenerFunc(func(items chrysom.Items) {
59+
iws, err := ItemsToInternalWebhooks(items)
60+
if err != nil {
61+
in.Shutdowner.Shutdown(fx.ExitCode(1))
62+
63+
return
64+
}
65+
66+
for _, watch := range in.Watchers {
67+
watch.Update(iws)
68+
}
69+
})
70+
}

0 commit comments

Comments
 (0)