...
1
16
17 package util
18
19 import (
20 "fmt"
21
22 "github.com/spf13/cobra"
23
24 "k8s.io/apimachinery/pkg/runtime"
25 "k8s.io/kubectl/pkg/scheme"
26 "k8s.io/kubectl/pkg/util/i18n"
27 )
28
29 type OverrideType string
30
31 const (
32
33 OverrideTypeJSON OverrideType = "json"
34
35
36 OverrideTypeMerge OverrideType = "merge"
37
38
39 OverrideTypeStrategic OverrideType = "strategic"
40 )
41
42 const DefaultOverrideType = OverrideTypeMerge
43
44 type OverrideOptions struct {
45 Overrides string
46 OverrideType OverrideType
47 }
48
49 func (o *OverrideOptions) AddOverrideFlags(cmd *cobra.Command) {
50 cmd.Flags().StringVar(&o.Overrides, "overrides", "", i18n.T("An inline JSON override for the generated object. If this is non-empty, it is used to override the generated object. Requires that the object supply a valid apiVersion field."))
51 cmd.Flags().StringVar((*string)(&o.OverrideType), "override-type", string(DefaultOverrideType), fmt.Sprintf("The method used to override the generated object: %s, %s, or %s.", OverrideTypeJSON, OverrideTypeMerge, OverrideTypeStrategic))
52 }
53
54 func (o *OverrideOptions) NewOverrider(dataStruct runtime.Object) *Overrider {
55 return &Overrider{
56 Options: o,
57 DataStruct: dataStruct,
58 }
59 }
60
61 type Overrider struct {
62 Options *OverrideOptions
63 DataStruct runtime.Object
64 }
65
66 func (o *Overrider) Apply(obj runtime.Object) (runtime.Object, error) {
67 if len(o.Options.Overrides) == 0 {
68 return obj, nil
69 }
70
71 codec := runtime.NewCodec(scheme.DefaultJSONEncoder(), scheme.Codecs.UniversalDecoder(scheme.Scheme.PrioritizedVersionsAllGroups()...))
72
73 var overrideType OverrideType
74 if len(o.Options.OverrideType) == 0 {
75 overrideType = DefaultOverrideType
76 } else {
77 overrideType = o.Options.OverrideType
78 }
79
80 switch overrideType {
81 case OverrideTypeJSON:
82 return JSONPatch(codec, obj, o.Options.Overrides)
83 case OverrideTypeMerge:
84 return Merge(codec, obj, o.Options.Overrides)
85 case OverrideTypeStrategic:
86 return StrategicMerge(codec, obj, o.Options.Overrides, o.DataStruct)
87 default:
88 return nil, fmt.Errorf("invalid override type: %v", overrideType)
89 }
90 }
91
View as plain text