@@ -21,12 +21,14 @@ import (
2121 "fmt"
2222 "os"
2323 "testing"
24+ "time"
2425
2526 "github.com/google/go-cmp/cmp"
2627 corev1 "k8s.io/api/core/v1"
2728 apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
2829 "k8s.io/apimachinery/pkg/api/resource"
2930 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
31+ "k8s.io/apimachinery/pkg/types"
3032
3133 "github.com/vmware-tanzu/apps-cli-plugin/pkg/apis"
3234 cli "github.com/vmware-tanzu/apps-cli-plugin/pkg/cli-runtime"
@@ -190,6 +192,255 @@ func TestWorkload_MergeServiceAccountName(t *testing.T) {
190192 }
191193}
192194
195+ func TestWorkload_ReplaceMetadata (t * testing.T ) {
196+ tests := []struct {
197+ name string
198+ seed * Workload
199+ update * Workload
200+ want * Workload
201+ }{{
202+ name : "empty" ,
203+ seed : & Workload {},
204+ update : & Workload {},
205+ want : & Workload {},
206+ }, {
207+ name : "add all metadata to new workload" ,
208+ seed : & Workload {
209+ ObjectMeta : metav1.ObjectMeta {
210+ Name : "my-workload" ,
211+ Namespace : "default" ,
212+ Annotations : map [string ]string {
213+ "name" : "value" ,
214+ },
215+ Labels : map [string ]string {
216+ "name" : "value" ,
217+ },
218+ Finalizers : []string {"my.finalizer" },
219+ DeletionGracePeriodSeconds : & []int64 {5 }[0 ],
220+ ManagedFields : []metav1.ManagedFieldsEntry {
221+ {Manager : "tanzu" },
222+ },
223+ SelfLink : "/default/my-workload" ,
224+ OwnerReferences : []metav1.OwnerReference {
225+ {
226+ APIVersion : "v1" ,
227+ Kind : "Pod" ,
228+ Name : "workload-owner" ,
229+ },
230+ },
231+ },
232+ },
233+ update : & Workload {
234+ ObjectMeta : metav1.ObjectMeta {
235+ UID : types .UID ("uid-xyz" ),
236+ ResourceVersion : "999" ,
237+ Generation : 1 ,
238+ CreationTimestamp : metav1 .Date (2019 , time .September , 10 , 15 , 00 , 00 , 00 , time .UTC ),
239+ DeletionTimestamp : & metav1.Time {Time : time .Date (2021 , 6 , 29 , 01 , 44 , 05 , 0 , time .UTC )},
240+ },
241+ },
242+ want : & Workload {
243+ ObjectMeta : metav1.ObjectMeta {
244+ Name : "my-workload" ,
245+ Namespace : "default" ,
246+ Annotations : map [string ]string {
247+ "name" : "value" ,
248+ },
249+ Labels : map [string ]string {
250+ "name" : "value" ,
251+ },
252+ UID : types .UID ("uid-xyz" ),
253+ ResourceVersion : "999" ,
254+ Generation : 1 ,
255+ CreationTimestamp : metav1 .Date (2019 , time .September , 10 , 15 , 00 , 00 , 00 , time .UTC ),
256+ DeletionTimestamp : & metav1.Time {Time : time .Date (2021 , 6 , 29 , 01 , 44 , 05 , 0 , time .UTC )},
257+ Finalizers : []string {"my.finalizer" },
258+ DeletionGracePeriodSeconds : & []int64 {5 }[0 ],
259+ ManagedFields : []metav1.ManagedFieldsEntry {
260+ {Manager : "tanzu" },
261+ },
262+ SelfLink : "/default/my-workload" ,
263+ OwnerReferences : []metav1.OwnerReference {
264+ {
265+ APIVersion : "v1" ,
266+ Kind : "Pod" ,
267+ Name : "workload-owner" ,
268+ },
269+ },
270+ },
271+ },
272+ }, {
273+ name : "overwrite workload metadata" ,
274+ seed : & Workload {
275+ ObjectMeta : metav1.ObjectMeta {
276+ Name : "my-workload" ,
277+ Namespace : "default" ,
278+ Annotations : map [string ]string {
279+ "name" : "value" ,
280+ },
281+ Labels : map [string ]string {
282+ "name" : "value" ,
283+ },
284+ UID : types .UID ("uid-xyz" ),
285+ ResourceVersion : "111" ,
286+ Generation : 1 ,
287+ CreationTimestamp : metav1 .Date (2018 , time .September , 10 , 15 , 00 , 00 , 00 , time .UTC ),
288+ DeletionTimestamp : & metav1.Time {Time : time .Date (2020 , 6 , 29 , 01 , 44 , 05 , 0 , time .UTC )},
289+ Finalizers : []string {"my.finalizer" },
290+ DeletionGracePeriodSeconds : & []int64 {5 }[0 ],
291+ ManagedFields : []metav1.ManagedFieldsEntry {
292+ {Manager : "tanzu" },
293+ },
294+ SelfLink : "/default/my-workload" ,
295+ OwnerReferences : []metav1.OwnerReference {
296+ {
297+ APIVersion : "v1" ,
298+ Kind : "Pod" ,
299+ Name : "workload-owner" ,
300+ },
301+ },
302+ },
303+ },
304+ update : & Workload {
305+ ObjectMeta : metav1.ObjectMeta {
306+ UID : types .UID ("uid-xyz" ),
307+ ResourceVersion : "999" ,
308+ Generation : 1 ,
309+ CreationTimestamp : metav1 .Date (2019 , time .September , 10 , 15 , 00 , 00 , 00 , time .UTC ),
310+ DeletionTimestamp : & metav1.Time {Time : time .Date (2021 , 6 , 29 , 01 , 44 , 05 , 0 , time .UTC )},
311+ },
312+ },
313+ want : & Workload {
314+ ObjectMeta : metav1.ObjectMeta {
315+ Name : "my-workload" ,
316+ Namespace : "default" ,
317+ Annotations : map [string ]string {
318+ "name" : "value" ,
319+ },
320+ Labels : map [string ]string {
321+ "name" : "value" ,
322+ },
323+ UID : types .UID ("uid-xyz" ),
324+ ResourceVersion : "999" ,
325+ Generation : 1 ,
326+ CreationTimestamp : metav1 .Date (2019 , time .September , 10 , 15 , 00 , 00 , 00 , time .UTC ),
327+ DeletionTimestamp : & metav1.Time {Time : time .Date (2021 , 6 , 29 , 01 , 44 , 05 , 0 , time .UTC )},
328+ Finalizers : []string {"my.finalizer" },
329+ DeletionGracePeriodSeconds : & []int64 {5 }[0 ],
330+ ManagedFields : []metav1.ManagedFieldsEntry {
331+ {Manager : "tanzu" },
332+ },
333+ SelfLink : "/default/my-workload" ,
334+ OwnerReferences : []metav1.OwnerReference {
335+ {
336+ APIVersion : "v1" ,
337+ Kind : "Pod" ,
338+ Name : "workload-owner" ,
339+ },
340+ },
341+ },
342+ },
343+ }, {
344+ name : "do not update to empty metadata" ,
345+ seed : & Workload {
346+ ObjectMeta : metav1.ObjectMeta {
347+ Name : "my-workload" ,
348+ Namespace : "default" ,
349+ Annotations : map [string ]string {
350+ "name" : "value" ,
351+ },
352+ Labels : map [string ]string {
353+ "name" : "value" ,
354+ },
355+ UID : types .UID ("uid-xyz" ),
356+ ResourceVersion : "999" ,
357+ Generation : 1 ,
358+ CreationTimestamp : metav1 .Date (2019 , time .September , 10 , 15 , 00 , 00 , 00 , time .UTC ),
359+ DeletionTimestamp : & metav1.Time {Time : time .Date (2021 , 6 , 29 , 01 , 44 , 05 , 0 , time .UTC )},
360+ Finalizers : []string {"my.finalizer" },
361+ DeletionGracePeriodSeconds : & []int64 {5 }[0 ],
362+ ManagedFields : []metav1.ManagedFieldsEntry {
363+ {Manager : "tanzu" },
364+ },
365+ SelfLink : "/default/my-workload" ,
366+ OwnerReferences : []metav1.OwnerReference {
367+ {
368+ APIVersion : "v1" ,
369+ Kind : "Pod" ,
370+ Name : "workload-owner" ,
371+ },
372+ },
373+ },
374+ },
375+ update : & Workload {
376+ ObjectMeta : metav1.ObjectMeta {},
377+ },
378+ want : & Workload {
379+ ObjectMeta : metav1.ObjectMeta {
380+ Name : "my-workload" ,
381+ Namespace : "default" ,
382+ Annotations : map [string ]string {
383+ "name" : "value" ,
384+ },
385+ Labels : map [string ]string {
386+ "name" : "value" ,
387+ },
388+ UID : types .UID ("uid-xyz" ),
389+ ResourceVersion : "999" ,
390+ Generation : 1 ,
391+ CreationTimestamp : metav1 .Date (2019 , time .September , 10 , 15 , 00 , 00 , 00 , time .UTC ),
392+ DeletionTimestamp : & metav1.Time {Time : time .Date (2021 , 6 , 29 , 01 , 44 , 05 , 0 , time .UTC )},
393+ Finalizers : []string {"my.finalizer" },
394+ DeletionGracePeriodSeconds : & []int64 {5 }[0 ],
395+ ManagedFields : []metav1.ManagedFieldsEntry {
396+ {Manager : "tanzu" },
397+ },
398+ SelfLink : "/default/my-workload" ,
399+ OwnerReferences : []metav1.OwnerReference {
400+ {
401+ APIVersion : "v1" ,
402+ Kind : "Pod" ,
403+ Name : "workload-owner" ,
404+ },
405+ },
406+ },
407+ },
408+ }, {
409+ name : "return only updated system populated fields" ,
410+ seed : & Workload {
411+ ObjectMeta : metav1.ObjectMeta {},
412+ },
413+ update : & Workload {
414+ ObjectMeta : metav1.ObjectMeta {
415+ UID : types .UID ("uid-xyz" ),
416+ ResourceVersion : "999" ,
417+ Generation : 1 ,
418+ CreationTimestamp : metav1 .Date (2019 , time .September , 10 , 15 , 00 , 00 , 00 , time .UTC ),
419+ DeletionTimestamp : & metav1.Time {Time : time .Date (2021 , 6 , 29 , 01 , 44 , 05 , 0 , time .UTC )},
420+ },
421+ },
422+ want : & Workload {
423+ ObjectMeta : metav1.ObjectMeta {
424+ UID : types .UID ("uid-xyz" ),
425+ ResourceVersion : "999" ,
426+ Generation : 1 ,
427+ CreationTimestamp : metav1 .Date (2019 , time .September , 10 , 15 , 00 , 00 , 00 , time .UTC ),
428+ DeletionTimestamp : & metav1.Time {Time : time .Date (2021 , 6 , 29 , 01 , 44 , 05 , 0 , time .UTC )},
429+ },
430+ },
431+ }}
432+
433+ for _ , test := range tests {
434+ t .Run (test .name , func (t * testing.T ) {
435+ got := test .seed .DeepCopy ()
436+ got .ReplaceMetadata (test .update )
437+ if diff := cmp .Diff (test .want , got ); diff != "" {
438+ t .Errorf ("Merge() (-want, +got) = %v" , diff )
439+ }
440+ })
441+ }
442+ }
443+
193444func TestWorkload_Validate (t * testing.T ) {
194445 tests := []struct {
195446 name string
0 commit comments