1package v1 2 3import "k8s.io/apimachinery/pkg/runtime" 4 5var _ runtime.NestedObjectDecoder = &MasterConfig{} 6 7// DecodeNestedObjects handles encoding RawExtensions on the MasterConfig, ensuring the 8// objects are decoded with the provided decoder. 9func (c *MasterConfig) DecodeNestedObjects(d runtime.Decoder) error { 10 // decoding failures result in a runtime.Unknown object being created in Object and passed 11 // to conversion 12 for k, v := range c.AdmissionConfig.PluginConfig { 13 DecodeNestedRawExtensionOrUnknown(d, &v.Configuration) 14 c.AdmissionConfig.PluginConfig[k] = v 15 } 16 if c.OAuthConfig != nil { 17 for i := range c.OAuthConfig.IdentityProviders { 18 DecodeNestedRawExtensionOrUnknown(d, &c.OAuthConfig.IdentityProviders[i].Provider) 19 } 20 } 21 DecodeNestedRawExtensionOrUnknown(d, &c.AuditConfig.PolicyConfiguration) 22 return nil 23} 24 25var _ runtime.NestedObjectEncoder = &MasterConfig{} 26 27// EncodeNestedObjects handles encoding RawExtensions on the MasterConfig, ensuring the 28// objects are encoded with the provided encoder. 29func (c *MasterConfig) EncodeNestedObjects(e runtime.Encoder) error { 30 for k, v := range c.AdmissionConfig.PluginConfig { 31 if err := EncodeNestedRawExtension(e, &v.Configuration); err != nil { 32 return err 33 } 34 c.AdmissionConfig.PluginConfig[k] = v 35 } 36 if c.OAuthConfig != nil { 37 for i := range c.OAuthConfig.IdentityProviders { 38 if err := EncodeNestedRawExtension(e, &c.OAuthConfig.IdentityProviders[i].Provider); err != nil { 39 return err 40 } 41 } 42 } 43 if err := EncodeNestedRawExtension(e, &c.AuditConfig.PolicyConfiguration); err != nil { 44 return err 45 } 46 return nil 47} 48 49// DecodeNestedRawExtensionOrUnknown 50func DecodeNestedRawExtensionOrUnknown(d runtime.Decoder, ext *runtime.RawExtension) { 51 if ext.Raw == nil || ext.Object != nil { 52 return 53 } 54 obj, gvk, err := d.Decode(ext.Raw, nil, nil) 55 if err != nil { 56 unk := &runtime.Unknown{Raw: ext.Raw} 57 if runtime.IsNotRegisteredError(err) { 58 if _, gvk, err := d.Decode(ext.Raw, nil, unk); err == nil { 59 unk.APIVersion = gvk.GroupVersion().String() 60 unk.Kind = gvk.Kind 61 ext.Object = unk 62 return 63 } 64 } 65 // TODO: record mime-type with the object 66 if gvk != nil { 67 unk.APIVersion = gvk.GroupVersion().String() 68 unk.Kind = gvk.Kind 69 } 70 obj = unk 71 } 72 ext.Object = obj 73} 74 75// EncodeNestedRawExtension will encode the object in the RawExtension (if not nil) or 76// return an error. 77func EncodeNestedRawExtension(e runtime.Encoder, ext *runtime.RawExtension) error { 78 if ext.Raw != nil || ext.Object == nil { 79 return nil 80 } 81 data, err := runtime.Encode(e, ext.Object) 82 if err != nil { 83 return err 84 } 85 ext.Raw = data 86 return nil 87} 88