Skip to content

Commit 8b7b768

Browse files
authored
Merge pull request kubernetes#128011 from seans3/egress-selector-configuration-strict
EgressSelectorConfiguration now uses strict validation
2 parents 023cd33 + 32b2eea commit 8b7b768

File tree

3 files changed

+41
-15
lines changed

3 files changed

+41
-15
lines changed

staging/src/k8s.io/apiserver/pkg/server/egressselector/config.go

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,12 @@ import (
2222
"strings"
2323

2424
"k8s.io/apimachinery/pkg/runtime"
25+
"k8s.io/apimachinery/pkg/runtime/serializer"
2526
"k8s.io/apimachinery/pkg/util/sets"
2627
"k8s.io/apimachinery/pkg/util/validation/field"
2728
"k8s.io/apiserver/pkg/apis/apiserver"
2829
"k8s.io/apiserver/pkg/apis/apiserver/install"
29-
"k8s.io/apiserver/pkg/apis/apiserver/v1beta1"
3030
"k8s.io/utils/path"
31-
"sigs.k8s.io/yaml"
3231
)
3332

3433
var cfgScheme = runtime.NewScheme()
@@ -55,19 +54,13 @@ func ReadEgressSelectorConfiguration(configFilePath string) (*apiserver.EgressSe
5554
if err != nil {
5655
return nil, fmt.Errorf("unable to read egress selector configuration from %q [%v]", configFilePath, err)
5756
}
58-
var decodedConfig v1beta1.EgressSelectorConfiguration
59-
err = yaml.Unmarshal(data, &decodedConfig)
57+
config, gvk, err := serializer.NewCodecFactory(cfgScheme, serializer.EnableStrict).UniversalDecoder().Decode(data, nil, nil)
6058
if err != nil {
61-
// we got an error where the decode wasn't related to a missing type
6259
return nil, err
6360
}
64-
if decodedConfig.Kind != "EgressSelectorConfiguration" {
65-
return nil, fmt.Errorf("invalid service configuration object %q", decodedConfig.Kind)
66-
}
67-
internalConfig := &apiserver.EgressSelectorConfiguration{}
68-
if err := cfgScheme.Convert(&decodedConfig, internalConfig, nil); err != nil {
69-
// we got an error where the decode wasn't related to a missing type
70-
return nil, err
61+
internalConfig, ok := config.(*apiserver.EgressSelectorConfiguration)
62+
if !ok {
63+
return nil, fmt.Errorf("unexpected config type: %v", gvk)
7164
}
7265
return internalConfig, nil
7366
}

staging/src/k8s.io/apiserver/pkg/server/egressselector/config_test.go

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"fmt"
2121
"os"
2222
"reflect"
23+
"strings"
2324
"testing"
2425

2526
utiltesting "k8s.io/client-go/util/testing"
@@ -52,7 +53,39 @@ func TestReadEgressSelectorConfiguration(t *testing.T) {
5253
createFile: false,
5354
contents: ``,
5455
expectedResult: nil,
55-
expectedError: strptr("unable to read egress selector configuration from \"test-egress-selector-config-absent\" [open test-egress-selector-config-absent: no such file or directory]"),
56+
expectedError: strptr("errors.errorString{s:\"unable to read egress selector configuration"),
57+
},
58+
{
59+
name: "unknown field causes error",
60+
createFile: false,
61+
contents: `
62+
apiVersion: apiserver.k8s.io/v1beta1
63+
kind: EgressSelectorConfiguration
64+
egressSelections:
65+
- name: "etcd"
66+
connection:
67+
proxyProtocol: "Direct"
68+
foo:
69+
bar: "baz"
70+
`,
71+
expectedResult: nil,
72+
expectedError: strptr("runtime.strictDecodingError"),
73+
},
74+
{
75+
name: "duplicate field causes error",
76+
createFile: false,
77+
contents: `
78+
apiVersion: apiserver.k8s.io/v1beta1
79+
kind: EgressSelectorConfiguration
80+
egressSelections:
81+
- name: "etcd"
82+
connection:
83+
proxyProtocol: "Direct"
84+
connection:
85+
proxyProtocol: "Indirect"
86+
`,
87+
expectedResult: nil,
88+
expectedError: strptr("runtime.strictDecodingError"),
5689
},
5790
{
5891
name: "v1beta1",
@@ -295,7 +328,7 @@ spec:
295328
if err != nil && tc.expectedError == nil {
296329
t.Errorf("unexpected error calling ReadEgressSelectorConfiguration got: %#v", err)
297330
}
298-
if err != nil && tc.expectedError != nil && err.Error() != *tc.expectedError {
331+
if err != nil && tc.expectedError != nil && strings.Contains(err.Error(), *tc.expectedError) {
299332
t.Errorf("calling ReadEgressSelectorConfiguration expected error: %s, got %#v", *tc.expectedError, err)
300333
}
301334
if !reflect.DeepEqual(config, tc.expectedResult) {

test/integration/apiserver/tracing/tracing_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ func TestAPIServerTracingWithEgressSelector(t *testing.T) {
208208
defer os.Remove(egressSelectorConfigFile.Name())
209209

210210
if err := os.WriteFile(egressSelectorConfigFile.Name(), []byte(`
211-
apiVersion: apiserver.config.k8s.io/v1beta1
211+
apiVersion: apiserver.k8s.io/v1beta1
212212
kind: EgressSelectorConfiguration
213213
egressSelections:
214214
- name: cluster

0 commit comments

Comments
 (0)