mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 12:43:23 +00:00
harden managedFields decoding
This commit is contained in:
parent
ff5a0ccb36
commit
470ad03d07
@ -101,6 +101,14 @@ func DecodeManagedFields(encodedManagedFields []metav1.ManagedFieldsEntry) (Mana
|
|||||||
managed.times = make(map[string]*metav1.Time, len(encodedManagedFields))
|
managed.times = make(map[string]*metav1.Time, len(encodedManagedFields))
|
||||||
|
|
||||||
for i, encodedVersionedSet := range encodedManagedFields {
|
for i, encodedVersionedSet := range encodedManagedFields {
|
||||||
|
switch encodedVersionedSet.Operation {
|
||||||
|
case metav1.ManagedFieldsOperationApply, metav1.ManagedFieldsOperationUpdate:
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("operation must be `Apply` or `Update`")
|
||||||
|
}
|
||||||
|
if len(encodedVersionedSet.APIVersion) < 1 {
|
||||||
|
return nil, fmt.Errorf("apiVersion must not be empty")
|
||||||
|
}
|
||||||
switch encodedVersionedSet.FieldsType {
|
switch encodedVersionedSet.FieldsType {
|
||||||
case "FieldsV1":
|
case "FieldsV1":
|
||||||
// Valid case.
|
// Valid case.
|
||||||
|
@ -72,6 +72,84 @@ func TestHasFieldsType(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestHasAPIVersion makes sure that we fail if we don't have an
|
||||||
|
// APIVersion set.
|
||||||
|
func TestHasAPIVersion(t *testing.T) {
|
||||||
|
var unmarshaled []metav1.ManagedFieldsEntry
|
||||||
|
if err := yaml.Unmarshal([]byte(`- apiVersion: v1
|
||||||
|
fieldsType: FieldsV1
|
||||||
|
fieldsV1:
|
||||||
|
f:field: {}
|
||||||
|
manager: foo
|
||||||
|
operation: Apply
|
||||||
|
`), &unmarshaled); err != nil {
|
||||||
|
t.Fatalf("did not expect yaml unmarshalling error but got: %v", err)
|
||||||
|
}
|
||||||
|
if _, err := DecodeManagedFields(unmarshaled); err != nil {
|
||||||
|
t.Fatalf("did not expect decoding error but got: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Missing apiVersion.
|
||||||
|
unmarshaled = nil
|
||||||
|
if err := yaml.Unmarshal([]byte(`- fieldsType: FieldsV1
|
||||||
|
fieldsV1:
|
||||||
|
f:field: {}
|
||||||
|
manager: foo
|
||||||
|
operation: Apply
|
||||||
|
`), &unmarshaled); err != nil {
|
||||||
|
t.Fatalf("did not expect yaml unmarshalling error but got: %v", err)
|
||||||
|
}
|
||||||
|
if _, err := DecodeManagedFields(unmarshaled); err == nil {
|
||||||
|
t.Fatal("Expect decoding error but got none")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestHasOperation makes sure that we fail if we don't have an
|
||||||
|
// Operation set properly.
|
||||||
|
func TestHasOperation(t *testing.T) {
|
||||||
|
var unmarshaled []metav1.ManagedFieldsEntry
|
||||||
|
if err := yaml.Unmarshal([]byte(`- apiVersion: v1
|
||||||
|
fieldsType: FieldsV1
|
||||||
|
fieldsV1:
|
||||||
|
f:field: {}
|
||||||
|
manager: foo
|
||||||
|
operation: Apply
|
||||||
|
`), &unmarshaled); err != nil {
|
||||||
|
t.Fatalf("did not expect yaml unmarshalling error but got: %v", err)
|
||||||
|
}
|
||||||
|
if _, err := DecodeManagedFields(unmarshaled); err != nil {
|
||||||
|
t.Fatalf("did not expect decoding error but got: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invalid operation.
|
||||||
|
if err := yaml.Unmarshal([]byte(`- apiVersion: v1
|
||||||
|
fieldsType: FieldsV1
|
||||||
|
fieldsV1:
|
||||||
|
f:field: {}
|
||||||
|
manager: foo
|
||||||
|
operation: Invalid
|
||||||
|
`), &unmarshaled); err != nil {
|
||||||
|
t.Fatalf("did not expect yaml unmarshalling error but got: %v", err)
|
||||||
|
}
|
||||||
|
if _, err := DecodeManagedFields(unmarshaled); err == nil {
|
||||||
|
t.Fatal("Expect decoding error but got none")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Missing operation.
|
||||||
|
unmarshaled = nil
|
||||||
|
if err := yaml.Unmarshal([]byte(`- apiVersion: v1
|
||||||
|
fieldsType: FieldsV1
|
||||||
|
fieldsV1:
|
||||||
|
f:field: {}
|
||||||
|
manager: foo
|
||||||
|
`), &unmarshaled); err != nil {
|
||||||
|
t.Fatalf("did not expect yaml unmarshalling error but got: %v", err)
|
||||||
|
}
|
||||||
|
if _, err := DecodeManagedFields(unmarshaled); err == nil {
|
||||||
|
t.Fatal("Expect decoding error but got none")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TestRoundTripManagedFields will roundtrip ManagedFields from the wire format
|
// TestRoundTripManagedFields will roundtrip ManagedFields from the wire format
|
||||||
// (api format) to the format used by sigs.k8s.io/structured-merge-diff and back
|
// (api format) to the format used by sigs.k8s.io/structured-merge-diff and back
|
||||||
func TestRoundTripManagedFields(t *testing.T) {
|
func TestRoundTripManagedFields(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user