diff --git a/src/gen/models/ObjectSerializer.ts b/src/gen/models/ObjectSerializer.ts index 0ed5cb6dbd1..01558b05d97 100644 --- a/src/gen/models/ObjectSerializer.ts +++ b/src/gen/models/ObjectSerializer.ts @@ -2445,7 +2445,10 @@ export class ObjectSerializer { let attributeTypes = typeMap[type].getAttributeTypeMap(); let instance: {[index: string]: any} = {}; for (let attributeType of attributeTypes) { - instance[attributeType.baseName] = ObjectSerializer.serialize(data[attributeType.name], attributeType.type, attributeType.format); + const value = Object.prototype.hasOwnProperty.call(data, attributeType.name) + ? data[attributeType.name] + : data[attributeType.baseName]; + instance[attributeType.baseName] = ObjectSerializer.serialize(value, attributeType.type, attributeType.format); } return instance; } diff --git a/src/serializer_test.ts b/src/serializer_test.ts index a0976d02938..47ddb2996ab 100644 --- a/src/serializer_test.ts +++ b/src/serializer_test.ts @@ -70,6 +70,50 @@ describe('ObjectSerializer', () => { }); }); + it('should serialize known objects with Kubernetes baseName fields', () => { + const s = { + apiVersion: 'apiextensions.k8s.io/v1', + kind: 'CustomResourceDefinition', + metadata: { + name: 'foos.example.com', + }, + spec: { + group: 'example.com', + scope: 'Namespaced', + names: { + plural: 'foos', + singular: 'foo', + kind: 'Foo', + }, + versions: [ + { + name: 'v1', + served: true, + storage: true, + schema: { + openAPIV3Schema: { + type: 'object', + properties: { + podTemplate: { + type: 'object', + 'x-kubernetes-preserve-unknown-fields': true, + }, + }, + }, + }, + }, + ], + }, + }; + const res = ObjectSerializer.serialize(s, 'V1CustomResourceDefinition'); + deepStrictEqual( + res.spec.versions[0].schema.openAPIV3Schema.properties.podTemplate[ + 'x-kubernetes-preserve-unknown-fields' + ], + true, + ); + }); + [ { name: 'should serialize a registered custom object', diff --git a/src/yaml_test.ts b/src/yaml_test.ts index 0174393a94d..e13d00771cb 100644 --- a/src/yaml_test.ts +++ b/src/yaml_test.ts @@ -30,10 +30,13 @@ spec: type: object properties: foobar: - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + podTemplate: + type: object + x-kubernetes-preserve-unknown-fields: true `; const ns = loadYaml(yaml); @@ -48,6 +51,17 @@ spec: ns.spec.versions[0]!.schema!.openAPIV3Schema!.properties!['foobar']['x-kubernetes-int-or-string'], undefined, ); + strictEqual( + ns.spec.versions[0]!.schema!.openAPIV3Schema!.properties!['podTemplate'] + .x_kubernetes_preserve_unknown_fields, + true, + ); + strictEqual( + ns.spec.versions[0]!.schema!.openAPIV3Schema!.properties!['podTemplate'][ + 'x-kubernetes-preserve-unknown-fields' + ], + undefined, + ); }); it('should load all safely', () => {