@@ -90,11 +90,39 @@ func TestManifestBundleEncode(t *testing.T) {
9090 },
9191 },
9292 },
93+ {
94+ name : "encode a manifestwork status with metadata" ,
95+ eventType : types.CloudEventsType {
96+ CloudEventsDataType : payload .ManifestBundleEventDataType ,
97+ SubResource : types .SubResourceStatus ,
98+ Action : "test" ,
99+ },
100+ work : & workv1.ManifestWork {
101+ ObjectMeta : metav1.ObjectMeta {
102+ UID : "test" ,
103+ ResourceVersion : "13" ,
104+ Name : "test-work" ,
105+ Namespace : "test-namespace" ,
106+ Labels : map [string ]string {
107+ "cloudevents.open-cluster-management.io/originalsource" : "source1" ,
108+ "test-label" : "test-value" ,
109+ },
110+ Annotations : map [string ]string {
111+ "test-annotation" : "test-value" ,
112+ },
113+ Finalizers : []string {"test-finalizer" },
114+ },
115+ Status : workv1.ManifestWorkStatus {
116+ Conditions : []metav1.Condition {},
117+ ResourceStatus : workv1.ManifestResourceStatus {},
118+ },
119+ },
120+ },
93121 }
94122
95123 for _ , c := range cases {
96124 t .Run (c .name , func (t * testing.T ) {
97- _ , err := NewManifestBundleCodec ().Encode ("cluster1-work-agent" , c .eventType , c .work )
125+ evt , err := NewManifestBundleCodec ().Encode ("cluster1-work-agent" , c .eventType , c .work )
98126 if c .expectedErr {
99127 if err == nil {
100128 t .Errorf ("expected an error, but failed" )
@@ -105,6 +133,23 @@ func TestManifestBundleEncode(t *testing.T) {
105133 if err != nil {
106134 t .Errorf ("unexpected error %v" , err )
107135 }
136+
137+ // Verify that ExtensionWorkMeta is set when encoding manifestwork status
138+ if c .work != nil && evt != nil {
139+ workMetaExt := evt .Extensions ()[types .ExtensionWorkMeta ]
140+ if workMetaExt == nil {
141+ t .Errorf ("expected ExtensionWorkMeta to be set" )
142+ } else {
143+ // Verify the metadata can be unmarshaled
144+ var metaObj metav1.ObjectMeta
145+ if err := json .Unmarshal ([]byte (workMetaExt .(string )), & metaObj ); err != nil {
146+ t .Errorf ("failed to unmarshal metadata: %v" , err )
147+ }
148+ if metaObj .UID != c .work .ObjectMeta .UID {
149+ t .Errorf ("expected UID %s, got %s" , c .work .ObjectMeta .UID , metaObj .UID )
150+ }
151+ }
152+ }
108153 })
109154 }
110155}
@@ -255,11 +300,57 @@ func TestManifestBundleDecode(t *testing.T) {
255300 return & evt
256301 }(),
257302 },
303+ {
304+ name : "decode a cloudevent with metadata extension" ,
305+ event : func () * cloudevents.Event {
306+ metaJson , err := json .Marshal (metav1.ObjectMeta {
307+ UID : "original-uid" ,
308+ ResourceVersion : "5" ,
309+ Name : "original-name" ,
310+ Namespace : "original-namespace" ,
311+ Labels : map [string ]string {"original-label" : "original-value" },
312+ Annotations : map [string ]string {"original-annotation" : "original-value" },
313+ Finalizers : []string {"original-finalizer" },
314+ })
315+ if err != nil {
316+ t .Fatal (err )
317+ }
318+ evt := cloudevents .NewEvent ()
319+ evt .SetSource ("source1" )
320+ evt .SetType ("io.open-cluster-management.works.v1alpha1.manifestbundles.spec.test" )
321+ evt .SetExtension ("resourceid" , "test" )
322+ evt .SetExtension ("resourceversion" , "13" )
323+ evt .SetExtension ("clustername" , "cluster1" )
324+ evt .SetExtension ("resourcename" , "work1" )
325+ evt .SetExtension (types .ExtensionWorkMeta , string (metaJson ))
326+ if err := evt .SetData (cloudevents .ApplicationJSON , & payload.ManifestBundle {
327+ Manifests : []workv1.Manifest {
328+ {
329+ RawExtension : runtime.RawExtension {
330+ Raw : toConfigMap (t ),
331+ },
332+ },
333+ },
334+ Executer : & workv1.ManifestWorkExecutor {
335+ Subject : workv1.ManifestWorkExecutorSubject {
336+ Type : workv1 .ExecutorSubjectTypeServiceAccount ,
337+ ServiceAccount : & workv1.ManifestWorkSubjectServiceAccount {
338+ Name : "test-sa" ,
339+ Namespace : "test-ns" ,
340+ },
341+ },
342+ },
343+ }); err != nil {
344+ t .Fatal (err )
345+ }
346+ return & evt
347+ }(),
348+ },
258349 }
259350
260351 for _ , c := range cases {
261352 t .Run (c .name , func (t * testing.T ) {
262- _ , err := NewManifestBundleCodec ().Decode (c .event )
353+ work , err := NewManifestBundleCodec ().Decode (c .event )
263354 if c .expectedErr {
264355 if err == nil {
265356 t .Errorf ("expected an error, but failed" )
@@ -270,6 +361,39 @@ func TestManifestBundleDecode(t *testing.T) {
270361 if err != nil {
271362 t .Errorf ("unexpected error %v" , err )
272363 }
364+
365+ // Additional verification for metadata extension test case
366+ if c .name == "decode a cloudevent with metadata extension" && work != nil {
367+ // Verify that original metadata from extension was merged correctly
368+ if work .ObjectMeta .Labels ["original-label" ] != "original-value" {
369+ t .Errorf ("expected original-label to be preserved, got %v" , work .ObjectMeta .Labels )
370+ }
371+ if work .ObjectMeta .Annotations ["original-annotation" ] != "original-value" {
372+ t .Errorf ("expected original-annotation to be preserved, got %v" , work .ObjectMeta .Annotations )
373+ }
374+ if len (work .ObjectMeta .Finalizers ) == 0 || work .ObjectMeta .Finalizers [0 ] != "original-finalizer" {
375+ t .Errorf ("expected original-finalizer to be preserved, got %v" , work .ObjectMeta .Finalizers )
376+ }
377+ // Verify that event-specific metadata overrides
378+ if work .ObjectMeta .UID != "test" {
379+ t .Errorf ("expected UID to be overridden to 'test', got %s" , work .ObjectMeta .UID )
380+ }
381+ if work .ObjectMeta .Name != "work1" {
382+ t .Errorf ("expected Name to be overridden to 'work1', got %s" , work .ObjectMeta .Name )
383+ }
384+ if work .ObjectMeta .Namespace != "cluster1" {
385+ t .Errorf ("expected Namespace to be overridden to 'cluster1', got %s" , work .ObjectMeta .Namespace )
386+ }
387+ if work .ObjectMeta .ResourceVersion != "13" {
388+ t .Errorf ("expected ResourceVersion to be overridden to '13', got %s" , work .ObjectMeta .ResourceVersion )
389+ }
390+ // Verify Executor field
391+ if work .Spec .Executor == nil {
392+ t .Errorf ("expected Executor to be set" )
393+ } else if work .Spec .Executor .Subject .ServiceAccount .Name != "test-sa" {
394+ t .Errorf ("expected Executor ServiceAccount name to be 'test-sa', got %s" , work .Spec .Executor .Subject .ServiceAccount .Name )
395+ }
396+ }
273397 })
274398 }
275399}
0 commit comments