1
16
17 package daemonset
18
19 import (
20 "context"
21
22 extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
23 apiequality "k8s.io/apimachinery/pkg/api/equality"
24 apivalidation "k8s.io/apimachinery/pkg/api/validation"
25 metav1validation "k8s.io/apimachinery/pkg/apis/meta/v1/validation"
26 "k8s.io/apimachinery/pkg/runtime"
27 "k8s.io/apimachinery/pkg/runtime/schema"
28 "k8s.io/apimachinery/pkg/util/validation/field"
29 genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
30 "k8s.io/apiserver/pkg/registry/rest"
31 "k8s.io/apiserver/pkg/storage/names"
32 "k8s.io/kubernetes/pkg/api/legacyscheme"
33 "k8s.io/kubernetes/pkg/api/pod"
34 "k8s.io/kubernetes/pkg/apis/apps"
35 "k8s.io/kubernetes/pkg/apis/apps/validation"
36 "sigs.k8s.io/structured-merge-diff/v4/fieldpath"
37 )
38
39
40 type daemonSetStrategy struct {
41 runtime.ObjectTyper
42 names.NameGenerator
43 }
44
45
46 var Strategy = daemonSetStrategy{legacyscheme.Scheme, names.SimpleNameGenerator}
47
48
49 var _ = rest.GarbageCollectionDeleteStrategy(Strategy)
50
51
52 func (daemonSetStrategy) DefaultGarbageCollectionPolicy(ctx context.Context) rest.GarbageCollectionPolicy {
53 return rest.DeleteDependents
54 }
55
56
57 func (daemonSetStrategy) NamespaceScoped() bool {
58 return true
59 }
60
61
62
63 func (daemonSetStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set {
64 fields := map[fieldpath.APIVersion]*fieldpath.Set{
65 "apps/v1": fieldpath.NewSet(
66 fieldpath.MakePathOrDie("status"),
67 ),
68 }
69
70 return fields
71 }
72
73
74 func (daemonSetStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) {
75 daemonSet := obj.(*apps.DaemonSet)
76 daemonSet.Status = apps.DaemonSetStatus{}
77
78 daemonSet.Generation = 1
79 if daemonSet.Spec.TemplateGeneration < 1 {
80 daemonSet.Spec.TemplateGeneration = 1
81 }
82
83 pod.DropDisabledTemplateFields(&daemonSet.Spec.Template, nil)
84 }
85
86
87 func (daemonSetStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) {
88 newDaemonSet := obj.(*apps.DaemonSet)
89 oldDaemonSet := old.(*apps.DaemonSet)
90
91 pod.DropDisabledTemplateFields(&newDaemonSet.Spec.Template, &oldDaemonSet.Spec.Template)
92
93
94 newDaemonSet.Status = oldDaemonSet.Status
95
96
97 newDaemonSet.Spec.TemplateGeneration = oldDaemonSet.Spec.TemplateGeneration
98
99
100
101
102
103
104
105
106
107
108
109
110 if !apiequality.Semantic.DeepEqual(oldDaemonSet.Spec.Template, newDaemonSet.Spec.Template) {
111 newDaemonSet.Spec.TemplateGeneration = oldDaemonSet.Spec.TemplateGeneration + 1
112 newDaemonSet.Generation = oldDaemonSet.Generation + 1
113 return
114 }
115 if !apiequality.Semantic.DeepEqual(oldDaemonSet.Spec, newDaemonSet.Spec) {
116 newDaemonSet.Generation = oldDaemonSet.Generation + 1
117 }
118 }
119
120
121 func (daemonSetStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList {
122 daemonSet := obj.(*apps.DaemonSet)
123 opts := pod.GetValidationOptionsFromPodTemplate(&daemonSet.Spec.Template, nil)
124 return validation.ValidateDaemonSet(daemonSet, opts)
125 }
126
127
128 func (daemonSetStrategy) WarningsOnCreate(ctx context.Context, obj runtime.Object) []string {
129 newDaemonSet := obj.(*apps.DaemonSet)
130 return pod.GetWarningsForPodTemplate(ctx, field.NewPath("spec", "template"), &newDaemonSet.Spec.Template, nil)
131 }
132
133
134 func (daemonSetStrategy) Canonicalize(obj runtime.Object) {
135 }
136
137
138
139 func (daemonSetStrategy) AllowCreateOnUpdate() bool {
140 return false
141 }
142
143
144 func (daemonSetStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList {
145 newDaemonSet := obj.(*apps.DaemonSet)
146 oldDaemonSet := old.(*apps.DaemonSet)
147
148 opts := pod.GetValidationOptionsFromPodTemplate(&newDaemonSet.Spec.Template, &oldDaemonSet.Spec.Template)
149 opts.AllowInvalidLabelValueInSelector = opts.AllowInvalidLabelValueInSelector || metav1validation.LabelSelectorHasInvalidLabelValue(oldDaemonSet.Spec.Selector)
150
151 allErrs := validation.ValidateDaemonSet(obj.(*apps.DaemonSet), opts)
152 allErrs = append(allErrs, validation.ValidateDaemonSetUpdate(newDaemonSet, oldDaemonSet, opts)...)
153
154
155
156
157
158 if requestInfo, found := genericapirequest.RequestInfoFrom(ctx); found {
159 groupVersion := schema.GroupVersion{Group: requestInfo.APIGroup, Version: requestInfo.APIVersion}
160 switch groupVersion {
161 case extensionsv1beta1.SchemeGroupVersion:
162
163 default:
164
165 allErrs = append(allErrs, apivalidation.ValidateImmutableField(newDaemonSet.Spec.Selector, oldDaemonSet.Spec.Selector, field.NewPath("spec").Child("selector"))...)
166 }
167 }
168
169 return allErrs
170 }
171
172
173 func (daemonSetStrategy) WarningsOnUpdate(ctx context.Context, obj, old runtime.Object) []string {
174 var warnings []string
175 newDaemonSet := obj.(*apps.DaemonSet)
176 oldDaemonSet := old.(*apps.DaemonSet)
177 if newDaemonSet.Spec.TemplateGeneration != oldDaemonSet.Spec.TemplateGeneration {
178 warnings = pod.GetWarningsForPodTemplate(ctx, field.NewPath("spec", "template"), &newDaemonSet.Spec.Template, &oldDaemonSet.Spec.Template)
179 }
180 return warnings
181 }
182
183
184 func (daemonSetStrategy) AllowUnconditionalUpdate() bool {
185 return true
186 }
187
188 type daemonSetStatusStrategy struct {
189 daemonSetStrategy
190 }
191
192
193 var StatusStrategy = daemonSetStatusStrategy{Strategy}
194
195
196
197 func (daemonSetStatusStrategy) GetResetFields() map[fieldpath.APIVersion]*fieldpath.Set {
198 return map[fieldpath.APIVersion]*fieldpath.Set{
199 "apps/v1": fieldpath.NewSet(
200 fieldpath.MakePathOrDie("spec"),
201 ),
202 }
203 }
204
205 func (daemonSetStatusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) {
206 newDaemonSet := obj.(*apps.DaemonSet)
207 oldDaemonSet := old.(*apps.DaemonSet)
208 newDaemonSet.Spec = oldDaemonSet.Spec
209 }
210
211 func (daemonSetStatusStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList {
212 return validation.ValidateDaemonSetStatusUpdate(obj.(*apps.DaemonSet), old.(*apps.DaemonSet))
213 }
214
215
216 func (daemonSetStatusStrategy) WarningsOnUpdate(ctx context.Context, obj, old runtime.Object) []string {
217 return nil
218 }
219
View as plain text