22# The test scenario is randomly selected.
33# The inputs are printed to stdout in GitHub step output key=value format.
44
5+ import argparse
56from dataclasses import dataclass
67import random
78import typing as t
@@ -17,6 +18,7 @@ class OSRelease:
1718@dataclass
1819class OpenStackRelease :
1920 version : str
21+ previous_version : str
2022 os_releases : t .List [OSRelease ]
2123
2224
@@ -33,19 +35,41 @@ class Scenario:
3335UBUNTU_NOBLE = OSRelease ("ubuntu" , "noble" , "ubuntu" )
3436# NOTE(upgrade): Add supported releases here.
3537OPENSTACK_RELEASES = [
36- OpenStackRelease ("2023.1" , [ROCKY_9 , UBUNTU_JAMMY ]),
37- OpenStackRelease ("2024.1" , [ROCKY_9 , UBUNTU_JAMMY ]),
38- OpenStackRelease ("2025.1" , [ROCKY_9 , UBUNTU_NOBLE ]),
38+ OpenStackRelease ("2023.1" , "zed" , [ROCKY_9 , UBUNTU_JAMMY ]),
39+ OpenStackRelease ("2024.1" , "2023.1" , [ROCKY_9 , UBUNTU_JAMMY ]),
40+ OpenStackRelease ("2025.1" , "2024.1" , [ROCKY_9 , UBUNTU_NOBLE ]),
3941]
4042NEUTRON_PLUGINS = ["ovs" , "ovn" ]
4143VERSION_HIERARCHY = ["zed" , "2023.1" , "2024.1" , "2025.1" ]
4244
4345
4446def main () -> None :
47+
48+ parser = argparse .ArgumentParser (
49+ description = 'Randomly picks a multinode scenario to execute' )
50+ parser .add_argument (
51+ '--output-summary' , '-s' ,
52+ type = argparse .FileType ('w' , encoding = 'UTF-8' ),
53+ default = None ,
54+ help = "Write a markdown summary table of selected inputs to a file (use '-' to write to stdout)" )
55+ args = parser .parse_args ()
56+
4557 scenario = random_scenario ()
46- inputs = generate_inputs (scenario )
58+ inputs = {
59+ "os_distribution" : scenario .os_release .distribution ,
60+ "os_release" : scenario .os_release .release ,
61+ "ssh_username" : scenario .os_release .ssh_username ,
62+ "neutron_plugin" : scenario .neutron_plugin ,
63+ "upgrade" : scenario .upgrade ,
64+ "stackhpc_kayobe_config_version" : get_branch (scenario .openstack_release .version ),
65+ "stackhpc_kayobe_config_previous_version" : get_branch (scenario .openstack_release .previous_version ),
66+ "terraform_kayobe_multinode_version" : get_tkm_version (scenario .openstack_release .version ),
67+ "terraform_kayobe_multinode_previous_version" : get_tkm_version (scenario .openstack_release .previous_version ),
68+ }
4769 for name , value in inputs .items ():
4870 write_output (name , value )
71+ if args .output_summary :
72+ write_summary (inputs , args .output_summary )
4973
5074
5175def random_scenario () -> Scenario :
@@ -56,43 +80,30 @@ def random_scenario() -> Scenario:
5680 return Scenario (openstack_release , os_release , neutron_plugin , upgrade )
5781
5882
59- def generate_inputs (scenario : Scenario ) -> t .Dict [str , str ]:
60- branch = get_branch (scenario .openstack_release .version )
61- previous_branch = get_branch (
62- VERSION_HIERARCHY [
63- VERSION_HIERARCHY .index (scenario .openstack_release .version ) - 1
64- ]
65- )
66- terraform_kayobe_multinode_version = get_tkm_version (
67- scenario .openstack_release .version
68- )
69- inputs = {
70- "os_distribution" : scenario .os_release .distribution ,
71- "os_release" : scenario .os_release .release ,
72- "ssh_username" : scenario .os_release .ssh_username ,
73- "neutron_plugin" : scenario .neutron_plugin ,
74- "upgrade" : scenario .upgrade ,
75- "stackhpc_kayobe_config_version" : branch ,
76- "stackhpc_kayobe_config_previous_version" : previous_branch ,
77- "terraform_kayobe_multinode_version" : terraform_kayobe_multinode_version ,
78- }
79- return inputs
80-
81-
8283def get_branch (version : str ) -> str :
8384 return f"stackhpc/{ version } "
8485
8586
8687def get_tkm_version (version : str ) -> str :
87- if version in [ "zed" , "2023.1" ] :
88+ if version == "zed" :
8889 return "ea61ea1730e179e05e8f0e58b759267664c555e7"
89- else :
90+ elif version == "2025.1" :
9091 return "main"
92+ else :
93+ return get_branch (version )
9194
9295
9396def write_output (name : str , value : str ) -> None :
9497 print (f"{ name } ={ value } " )
9598
9699
100+ def write_summary (inputs : dict , output : t .TextIO ):
101+ print (
102+ '| Input | Value |\n '
103+ '| -----: | :---- |' , file = output )
104+ for key , value in inputs .items ():
105+ print (f'| **{ key } ** | `{ value } ` |' , file = output )
106+
107+
97108if __name__ == "__main__" :
98109 main ()
0 commit comments