Skip to content

Commit 0a6fa17

Browse files
committed
Respect failOpen when GetPre/PostXDSHookClient errors in CompositeManager
Signed-off-by: Marc Navarro Sonnenfeld <marcnavarro@tetrate.io>
1 parent b2469b9 commit 0a6fa17

2 files changed

Lines changed: 55 additions & 6 deletions

File tree

internal/extension/registry/composite_manager.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ func (c *CompositeManager) GetPreXDSHookClient(xdsHookType egv1a1.XDSTranslatorH
118118
for _, nm := range c.managers {
119119
client, err := nm.manager.GetPreXDSHookClient(xdsHookType)
120120
if err != nil {
121+
if nm.manager.FailOpen() {
122+
continue
123+
}
121124
return nil, err
122125
}
123126
if client != nil {
@@ -143,6 +146,9 @@ func (c *CompositeManager) GetPostXDSHookClient(xdsHookType egv1a1.XDSTranslator
143146
for _, nm := range c.managers {
144147
client, err := nm.manager.GetPostXDSHookClient(xdsHookType)
145148
if err != nil {
149+
if nm.manager.FailOpen() {
150+
continue
151+
}
146152
return nil, err
147153
}
148154
if client != nil {

internal/extension/registry/composite_manager_test.go

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,32 @@ func TestCompositeManager_GetPreXDSHookClient(t *testing.T) {
226226
assert.Nil(t, client)
227227
assert.Contains(t, err.Error(), "connection failed")
228228
})
229+
230+
t.Run("skips erroring child when failOpen is true", func(t *testing.T) {
231+
mockClient := &mockXDSHookClient{}
232+
composite := NewCompositeManager([]namedManager{
233+
{name: "mgr1", manager: &mockManager{preHookErr: fmt.Errorf("connection failed"), failOpen: true}},
234+
{name: "mgr2", manager: &mockManager{preHookClient: mockClient}},
235+
})
236+
client, err := composite.GetPreXDSHookClient(egv1a1.XDSRoute)
237+
require.NoError(t, err)
238+
require.NotNil(t, client)
239+
compositeClient, ok := client.(*compositeXDSHookClient)
240+
assert.True(t, ok)
241+
require.Len(t, compositeClient.entries, 1)
242+
assert.Equal(t, "mgr2", compositeClient.entries[0].name)
243+
})
244+
245+
t.Run("returns error when failOpen is false", func(t *testing.T) {
246+
mockClient := &mockXDSHookClient{}
247+
composite := NewCompositeManager([]namedManager{
248+
{name: "mgr1", manager: &mockManager{preHookErr: fmt.Errorf("connection failed"), failOpen: false}},
249+
{name: "mgr2", manager: &mockManager{preHookClient: mockClient}},
250+
})
251+
client, err := composite.GetPreXDSHookClient(egv1a1.XDSRoute)
252+
require.Error(t, err)
253+
assert.Nil(t, client)
254+
})
229255
}
230256

231257
func TestCompositeManager_GetPostXDSHookClient(t *testing.T) {
@@ -254,13 +280,30 @@ func TestCompositeManager_GetPostXDSHookClient(t *testing.T) {
254280
}
255281

256282
func TestCompositeManager_GetPostXDSHookClient_Error(t *testing.T) {
257-
composite := NewCompositeManager([]namedManager{
258-
{name: "mgr1", manager: &mockManager{postHookErr: fmt.Errorf("connection failed")}},
283+
t.Run("returns error when failOpen is false", func(t *testing.T) {
284+
composite := NewCompositeManager([]namedManager{
285+
{name: "mgr1", manager: &mockManager{postHookErr: fmt.Errorf("connection failed")}},
286+
})
287+
client, err := composite.GetPostXDSHookClient(egv1a1.XDSRoute)
288+
require.Error(t, err)
289+
assert.Nil(t, client)
290+
assert.Contains(t, err.Error(), "connection failed")
291+
})
292+
293+
t.Run("skips erroring child when failOpen is true", func(t *testing.T) {
294+
mockClient := &mockXDSHookClient{}
295+
composite := NewCompositeManager([]namedManager{
296+
{name: "mgr1", manager: &mockManager{postHookErr: fmt.Errorf("connection failed"), failOpen: true}},
297+
{name: "mgr2", manager: &mockManager{postHookClient: mockClient}},
298+
})
299+
client, err := composite.GetPostXDSHookClient(egv1a1.XDSRoute)
300+
require.NoError(t, err)
301+
require.NotNil(t, client)
302+
compositeClient, ok := client.(*compositeXDSHookClient)
303+
assert.True(t, ok)
304+
require.Len(t, compositeClient.entries, 1)
305+
assert.Equal(t, "mgr2", compositeClient.entries[0].name)
259306
})
260-
client, err := composite.GetPostXDSHookClient(egv1a1.XDSRoute)
261-
require.Error(t, err)
262-
assert.Nil(t, client)
263-
assert.Contains(t, err.Error(), "connection failed")
264307
}
265308

266309
func TestCompositeManager_CleanupHookConns(t *testing.T) {

0 commit comments

Comments
 (0)