@@ -2043,25 +2043,63 @@ def filter_a003_settings(self, a003_report: Dict[str, Any], setting_names: List[
20432043
20442044 def extract_postgres_version_from_a003 (self , a003_report : Dict [str , Any ], node_name : str = None ) -> Dict [str , str ]:
20452045 """
2046- Extract PostgreSQL version info from A003 report.
2046+ Extract PostgreSQL version info from A003 report settings data.
2047+
2048+ Derives version from server_version and server_version_num settings
2049+ which are part of the A003 settings data.
20472050
20482051 Args:
20492052 a003_report: Full A003 report
20502053 node_name: Optional specific node name. If None, uses first available node.
20512054
20522055 Returns:
2053- Dictionary with postgres version info
2056+ Dictionary with postgres version info (version, server_version_num, server_major_ver, server_minor_ver)
20542057 """
20552058 results = a003_report .get ('results' , {})
20562059 if not results :
20572060 return {}
20582061
2062+ # Get the node data
20592063 if node_name and node_name in results :
2060- return results [node_name ].get ('postgres_version' , {})
2064+ node_data = results [node_name ]
2065+ else :
2066+ node_data = next (iter (results .values ()), {})
2067+
2068+ # First check if postgres_version is already in the node result
2069+ if node_data .get ('postgres_version' ):
2070+ return node_data ['postgres_version' ]
2071+
2072+ # Otherwise, extract from settings data (server_version, server_version_num)
2073+ data = node_data .get ('data' , {})
2074+ version_str = None
2075+ version_num = None
2076+
2077+ # Look for server_version and server_version_num in settings
2078+ if 'server_version' in data :
2079+ version_str = data ['server_version' ].get ('setting' , '' )
2080+ if 'server_version_num' in data :
2081+ version_num = data ['server_version_num' ].get ('setting' , '' )
20612082
2062- # Use first available node
2063- first_node = next (iter (results .values ()), {})
2064- return first_node .get ('postgres_version' , {})
2083+ if not version_str and not version_num :
2084+ return {}
2085+
2086+ # Parse version numbers
2087+ major_ver = ""
2088+ minor_ver = ""
2089+ if version_num and len (version_num ) >= 6 :
2090+ try :
2091+ num = int (version_num )
2092+ major_ver = str (num // 10000 )
2093+ minor_ver = str (num % 10000 )
2094+ except ValueError :
2095+ pass
2096+
2097+ return {
2098+ "version" : version_str or "" ,
2099+ "server_version_num" : version_num or "" ,
2100+ "server_major_ver" : major_ver ,
2101+ "server_minor_ver" : minor_ver
2102+ }
20652103
20662104 def generate_d004_from_a003 (self , a003_report : Dict [str , Any ], cluster : str = "local" ,
20672105 node_name : str = "node-01" ) -> Dict [str , Any ]:
0 commit comments