@@ -300,3 +300,162 @@ def release_notes_image_ids_section(metadata_files):
300300 output += "\n </details>\n \n "
301301
302302 return output
303+
304+
305+ def generate_table_format (grouped_data ):
306+ """
307+ Generate the table format with collapsible region details
308+ """
309+ output = "| Variant | Platform | Architecture | Flavor | Regions & Image IDs | Download Links |\n "
310+ output += "|---------|----------|--------------|--------|---------------------|----------------|\n "
311+
312+ for variant in IMAGE_IDS_VARIANT_ORDER :
313+ if variant not in grouped_data :
314+ continue
315+
316+ for platform in sorted (grouped_data [variant ].keys ()):
317+ for arch in sorted (grouped_data [variant ][platform ].keys ()):
318+ for metadata in grouped_data [variant ][platform ][arch ]:
319+ data = PLATFORMS [platform ].published_images_by_regions (metadata )
320+ if data is None :
321+ continue
322+
323+ details_content = PLATFORMS [platform ].region_details (metadata )
324+ summary_text = PLATFORMS [platform ].summary_text (metadata )
325+
326+ download_link = PLATFORMS [platform ].artifact_for_flavor (data ['flavor' ])
327+
328+ variant_display = IMAGE_IDS_VARIANT_TABLE_NAMES [variant ]
329+ output += (f"| { variant_display } "
330+ f"| { PLATFORMS [platform ].full_name ()} "
331+ f"| { arch } "
332+ f"| `{ data ['flavor' ]} ` "
333+ f"| <details><summary>{ summary_text } </summary><br>{ details_content } </details> "
334+ f"| <details><summary>Download</summary><br>{ download_link } </details> "
335+ "|\n " )
336+
337+ return output
338+
339+
340+ def generate_detailed_format (grouped_data ):
341+ """
342+ Generate the old detailed format with YAML
343+ """
344+ output = ""
345+
346+ for variant in IMAGE_IDS_VARIANT_ORDER :
347+ if variant not in grouped_data :
348+ continue
349+
350+ output += (
351+ f"<details>\n <summary>Variant - { IMAGE_IDS_VARIANT_NAMES [variant ]} </summary>\n \n "
352+ )
353+ output += f"### Variant - { IMAGE_IDS_VARIANT_NAMES [variant ]} \n \n "
354+
355+ for platform in sorted (grouped_data [variant ].keys ()):
356+ platform_long_name = PLATFORMS [platform ].full_name ()
357+ platform_short_name = PLATFORMS [platform ].short_name ().upper ()
358+ output += f"<details>\n <summary>{ platform_short_name } - { platform_long_name } </summary>\n \n "
359+ output += f"#### { platform_short_name } - { platform_long_name } \n \n "
360+
361+ for arch in sorted (grouped_data [variant ][platform ].keys ()):
362+ output += f"<details>\n <summary>{ arch } </summary>\n \n "
363+ output += f"##### { arch } \n \n "
364+ output += "```\n "
365+
366+ # Process all metadata for this variant/platform/architecture
367+ for metadata in grouped_data [variant ][platform ][arch ]:
368+ data = PLATFORMS [platform ].published_images_by_regions (metadata )
369+ if data is None :
370+ continue
371+
372+ output += f"- flavor: { data ['flavor' ]} \n "
373+
374+ download_url = PLATFORMS [platform ].artifact_for_flavor (data ['flavor' ], markdown_format = False )
375+ output += f" download_url: { download_url } \n "
376+
377+ if "regions" in data :
378+ output += " regions:\n "
379+ for region in data ["regions" ]:
380+ if "image_name" in region :
381+ output += f" - region: { region ['region' ]} \n "
382+ output += f" image_id: { region ['image_id' ]} \n "
383+ output += f" image_name: { region ['image_name' ]} \n "
384+ else :
385+ output += f" - region: { region ['region' ]} \n "
386+ output += f" image_id: { region ['image_id' ]} \n "
387+ elif "details" in data and platform != "gcp" :
388+ output += " details:\n "
389+ for key , value in data ["details" ].items ():
390+ output += f" { key } : { value } \n "
391+ elif platform == "gcp" and "details" in data :
392+ # For GCP, move details up to same level as flavor
393+ for key , value in data ["details" ].items ():
394+ output += f" { key } : { value } \n "
395+ elif "gallery_images" in data or "marketplace_images" in data :
396+ if data .get ("gallery_images" ):
397+ output += " gallery_images:\n "
398+ for img in data ["gallery_images" ]:
399+ output += f" - hyper_v_generation: { img ['hyper_v_generation' ]} \n "
400+ output += f" azure_cloud: { img ['azure_cloud' ]} \n "
401+ output += f" image_id: { img ['image_id' ]} \n "
402+ if data .get ("marketplace_images" ):
403+ output += " marketplace_images:\n "
404+ for img in data ["marketplace_images" ]:
405+ output += f" - hyper_v_generation: { img ['hyper_v_generation' ]} \n "
406+ output += f" urn: { img ['urn' ]} \n "
407+
408+ output += "```\n \n "
409+ output += "</details>\n \n "
410+
411+ output += "</details>\n \n "
412+
413+ output += "</details>\n \n "
414+
415+ return output
416+
417+
418+ def release_notes_image_ids_section (metadata_files ):
419+ """
420+ Groups metadata files by image variant, then platform, then architecture
421+ """
422+ # Group metadata by variant, platform, and architecture
423+ grouped_data = {}
424+
425+ for metadata_file_path in metadata_files :
426+ with open (metadata_file_path ) as f :
427+ metadata = yaml .load (f , Loader = SafeLoader )
428+
429+ published_image_metadata = metadata ["published_image_metadata" ]
430+ # Skip if no publishing metadata found
431+ if published_image_metadata is None :
432+ continue
433+
434+ platform = metadata ["platform" ]
435+ arch = metadata ["architecture" ]
436+
437+ # Determine variant from flavor name
438+ flavor_name = metadata ["s3_key" ].split ("/" )[- 1 ]
439+ variant = get_variant_from_flavor (flavor_name )
440+
441+ if variant not in grouped_data :
442+ grouped_data [variant ] = {}
443+ if platform not in grouped_data [variant ]:
444+ grouped_data [variant ][platform ] = {}
445+ if arch not in grouped_data [variant ][platform ]:
446+ grouped_data [variant ][platform ][arch ] = []
447+
448+ grouped_data [variant ][platform ][arch ].append (metadata )
449+
450+ output = "## Published Images\n \n "
451+
452+ output += "<details>\n <summary>📊 Table View</summary>\n \n "
453+ output += generate_table_format (grouped_data )
454+ output += "\n </details>\n \n "
455+
456+ # Old format
457+ output += "<details>\n <summary>📝 Detailed View</summary>\n \n "
458+ output += generate_detailed_format (grouped_data )
459+ output += "\n </details>\n \n "
460+
461+ return output
0 commit comments