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