added current dell poweredge r760xa configurator

- included added support for emerald rapids cpu

work related to [https://bugzilla.ipr.univ-rennes.fr/show_bug.cgi?id=4171]
This commit is contained in:
Guillaume Raffy 2025-10-23 14:10:08 +02:00
parent 8d92cf77f0
commit a99a69f7db
6 changed files with 12852 additions and 29 deletions

View File

@ -219,20 +219,6 @@ intel-xeon-gold-6448h 2.4 32 4 250 0 0 60.0
intel-xeon-gold-6448y 2.1 32 2 225 0 0 60.0 intel-xeon-gold-6448y 2.1 32 2 225 0 0 60.0
intel-xeon-gold-6454s 2.2 32 2 270 0 0 60.0 intel-xeon-gold-6454s 2.2 32 2 270 0 0 60.0
intel-xeon-gold-6458q 3.1 32 2 350 0 0 60.0 intel-xeon-gold-6458q 3.1 32 2 350 0 0 60.0
intel-xeon-performance-6505p 2.2 12 2 150 0 0 48.0
intel-xeon-performance-6507p 3.5 8 2 150 0 0 48.0
intel-xeon-performance-6515p 2.3 16 2 150 0 0 72.0
intel-xeon-performance-6517p 3.2 16 2 190 0 0 72.0
intel-xeon-performance-6520p 2.4 24 2 210 0 0 144.0
intel-xeon-performance-6527p 3.0 24 2 250 0 0 144.0
intel-xeon-performance-6714p 4.0 8 2 165 0 0 48.0
intel-xeon-performance-6724p 3.6 16 2 210 0 0 72.0
intel-xeon-performance-6730p 2.5 32 2 250 0 0 288.0
intel-xeon-performance-6737p 2.9 32 2 270 0 0 144.0
intel-xeon-performance-6740p 2.1 48 2 270 0 0 288.0
intel-xeon-performance-6747p 2.7 48 2 350 0 0 288.0
intel-xeon-performance-6767p 2.4 64 2 350 0 0 336.0
intel-xeon-performance-6787p 2.0 86 2 350 0 0 336.0
intel-xeon-platinum-8444h 2.9 16 2 270 0 0 45.0 intel-xeon-platinum-8444h 2.9 16 2 270 0 0 45.0
intel-xeon-platinum-8452y 2.0 36 2 300 0 0 67.5 intel-xeon-platinum-8452y 2.0 36 2 300 0 0 67.5
intel-xeon-platinum-8458p 2.7 44 2 350 0 0 82.5 intel-xeon-platinum-8458p 2.7 44 2 350 0 0 82.5
@ -248,6 +234,28 @@ intel-xeon-platinum-8480+ 2.0 56 2 350 0 0 105.0
intel-xeon-platinum-8490h 1.9 60 8 350 0 0 112.5 intel-xeon-platinum-8490h 1.9 60 8 350 0 0 112.5
intel-xeon-platinum-9462 2.7 32 2 350 0 0 75.0 intel-xeon-platinum-9462 2.7 32 2 350 0 0 75.0
intel-xeon-silver-4514y 2.0 16 2 150 0 0 30.0
intel-xeon-gold-6526y 2.8 16 2 195 0 0 37.5
intel-xeon-gold-6534 3.9 8 2 195 0 0 22.5
intel-xeon-gold-6542y 2.9 24 2 250 0 0 60.0
intel-xeon-gold-6548y+ 2.5 32 2 250 0 0 60.0
intel-xeon-platinum-8562y+ 2.8 32 2 300 0 0 60.0
intel-xeon-performance-6505p 2.2 12 2 150 0 0 48.0
intel-xeon-performance-6507p 3.5 8 2 150 0 0 48.0
intel-xeon-performance-6515p 2.3 16 2 150 0 0 72.0
intel-xeon-performance-6517p 3.2 16 2 190 0 0 72.0
intel-xeon-performance-6520p 2.4 24 2 210 0 0 144.0
intel-xeon-performance-6527p 3.0 24 2 250 0 0 144.0
intel-xeon-performance-6714p 4.0 8 2 165 0 0 48.0
intel-xeon-performance-6724p 3.6 16 2 210 0 0 72.0
intel-xeon-performance-6730p 2.5 32 2 250 0 0 288.0
intel-xeon-performance-6737p 2.9 32 2 270 0 0 144.0
intel-xeon-performance-6740p 2.1 48 2 270 0 0 288.0
intel-xeon-performance-6747p 2.7 48 2 350 0 0 288.0
intel-xeon-performance-6767p 2.4 64 2 350 0 0 336.0
intel-xeon-performance-6787p 2.0 86 2 350 0 0 336.0
amd-epyc-7262 3.2 8 2 155 0 0 0 amd-epyc-7262 3.2 8 2 155 0 0 0
amd-epyc-7272 2.9 12 2 120 0 0 0 amd-epyc-7272 2.9 12 2 120 0 0 0
amd-epyc-7282 2.8 16 2 120 0 0 0 amd-epyc-7282 2.8 16 2 120 0 0 0
@ -298,3 +306,23 @@ amd-epyc-9634 2.25 84 2 290 0 0 384
amd-epyc-9654 2.4 96 2 360 0 0 384 amd-epyc-9654 2.4 96 2 360 0 0 384
amd-epyc-9734 2.2 112 2 340 0 0 256 amd-epyc-9734 2.2 112 2 340 0 0 256
amd-epyc-9754 2.25 128 2 360 0 0 256 amd-epyc-9754 2.25 128 2 360 0 0 256
amd-epyc-9115 2.6 16 2 125 0 0 64
amd-epyc-9135 3.65 16 2 200 0 0 64
amd-epyc-9175f 4.2 16 2 320 0 0 512
amd-epyc-9255 3.25 24 2 200 0 0 128
amd-epyc-9275f 4.1 24 2 320 0 0 256
amd-epyc-9335 3.0 32 2 210 0 0 128
amd-epyc-9355 3.55 32 2 280 0 0 256
amd-epyc-9375f 3.8 32 2 320 0 0 256
amd-epyc-9475f 3.65 48 2 400 0 0 256
amd-epyc-9555 3.2 64 2 360 0 0 256
amd-epyc-9575f 3.3 64 2 400 0 0 256
amd-epyc-9655 2.5 96 2 400 0 0 384
amd-epyc-9745 2.4 128 2 400 0 0 256
amd-epyc-9825 2.2 144 2 390 0 0 384
amd-epyc-9845 2.1 160 2 390 0 0 320
amd-epyc-9965 2.25 192 2 500 0 0 384

1 #id clock num_cores max_cpus tdp cpumark_1_cpu cpumark_2_cpu l3_cache_mb
219 intel-xeon-performance-6505p intel-xeon-platinum-8444h 2.2 2.9 12 16 2 150 270 0 0 48.0 45.0
220 intel-xeon-performance-6507p intel-xeon-platinum-8452y 3.5 2.0 8 36 2 150 300 0 0 48.0 67.5
221 intel-xeon-performance-6515p intel-xeon-platinum-8458p 2.3 2.7 16 44 2 150 350 0 0 72.0 82.5
intel-xeon-performance-6517p 3.2 16 2 190 0 0 72.0
intel-xeon-performance-6520p 2.4 24 2 210 0 0 144.0
intel-xeon-performance-6527p 3.0 24 2 250 0 0 144.0
intel-xeon-performance-6714p 4.0 8 2 165 0 0 48.0
intel-xeon-performance-6724p 3.6 16 2 210 0 0 72.0
intel-xeon-performance-6730p 2.5 32 2 250 0 0 288.0
intel-xeon-performance-6737p 2.9 32 2 270 0 0 144.0
intel-xeon-performance-6740p 2.1 48 2 270 0 0 288.0
intel-xeon-performance-6747p 2.7 48 2 350 0 0 288.0
intel-xeon-performance-6767p 2.4 64 2 350 0 0 336.0
intel-xeon-performance-6787p 2.0 86 2 350 0 0 336.0
intel-xeon-platinum-8444h 2.9 16 2 270 0 0 45.0
intel-xeon-platinum-8452y 2.0 36 2 300 0 0 67.5
intel-xeon-platinum-8458p 2.7 44 2 350 0 0 82.5
222 intel-xeon-platinum-8460y+ 2.0 40 2 300 0 0 105.0
223 intel-xeon-platinum-8462y+ 2.8 32 2 300 0 0 60.0
224 intel-xeon-platinum-8468 2.1 48 2 350 0 0 105.0
234 amd-epyc-7272 intel-xeon-gold-6526y 2.9 2.8 12 16 2 120 195 0 0 0 37.5
235 amd-epyc-7282 intel-xeon-gold-6534 2.8 3.9 16 8 2 120 195 0 0 0 22.5
236 amd-epyc-7302 intel-xeon-gold-6542y 3.0 2.9 16 24 2 155 250 0 0 0 60.0
237 intel-xeon-gold-6548y+ 2.5 32 2 250 0 0 60.0
238 intel-xeon-platinum-8562y+ 2.8 32 2 300 0 0 60.0
239 intel-xeon-performance-6505p 2.2 12 2 150 0 0 48.0
240 intel-xeon-performance-6507p 3.5 8 2 150 0 0 48.0
241 intel-xeon-performance-6515p 2.3 16 2 150 0 0 72.0
242 intel-xeon-performance-6517p 3.2 16 2 190 0 0 72.0
243 intel-xeon-performance-6520p 2.4 24 2 210 0 0 144.0
244 intel-xeon-performance-6527p 3.0 24 2 250 0 0 144.0
245 intel-xeon-performance-6714p 4.0 8 2 165 0 0 48.0
246 intel-xeon-performance-6724p 3.6 16 2 210 0 0 72.0
247 intel-xeon-performance-6730p 2.5 32 2 250 0 0 288.0
248 intel-xeon-performance-6737p 2.9 32 2 270 0 0 144.0
249 intel-xeon-performance-6740p 2.1 48 2 270 0 0 288.0
250 intel-xeon-performance-6747p 2.7 48 2 350 0 0 288.0
251 intel-xeon-performance-6767p 2.4 64 2 350 0 0 336.0
252 intel-xeon-performance-6787p 2.0 86 2 350 0 0 336.0
253 amd-epyc-7262 3.2 8 2 155 0 0 0
254 amd-epyc-7272 2.9 12 2 120 0 0 0
255 amd-epyc-7282 2.8 16 2 120 0 0 0
256 amd-epyc-7302 3.0 16 2 155 0 0 0
257 amd-epyc-7352 2.3 24 2 155 0 0 0
258 amd-epyc-7402 2.8 24 2 180 0 0 0
259 amd-epyc-7352 amd-epyc-7452 2.3 2.35 24 32 2 155 0 0 0
260 amd-epyc-7402 amd-epyc-7502 2.8 2.5 24 32 2 180 0 0 0
261 amd-epyc-7452 amd-epyc-7542 2.35 2.9 32 2 155 225 0 0 0
306 amd-epyc-9335 3.0 32 2 210 0 0 128
307 amd-epyc-9355 3.55 32 2 280 0 0 256
308 amd-epyc-9375f 3.8 32 2 320 0 0 256
309 amd-epyc-9475f 3.65 48 2 400 0 0 256
310 amd-epyc-9555 3.2 64 2 360 0 0 256
311 amd-epyc-9575f 3.3 64 2 400 0 0 256
312 amd-epyc-9655 2.5 96 2 400 0 0 384
313 amd-epyc-9745 2.4 128 2 400 0 0 256
314 amd-epyc-9825 2.2 144 2 390 0 0 384
315 amd-epyc-9845 2.1 160 2 390 0 0 320
316 amd-epyc-9965 2.25 192 2 500 0 0 384
317
318
319
320
321
322
323
324
325
326
327
328

File diff suppressed because one or more lines are too long

View File

@ -129,6 +129,12 @@ class Cpu(Item):
return 'coffeelake' return 'coffeelake'
elif re.match('intel-xeon-performance-[0-9][57][0-9][0-9]', proc_id): elif re.match('intel-xeon-performance-[0-9][57][0-9][0-9]', proc_id):
return 'granite rapids' return 'granite rapids'
elif re.match('intel-xeon-silver-[0-9][5][0-9][0-9]', proc_id):
return 'emerald rapids'
elif re.match('intel-xeon-gold-[0-9][5][0-9][0-9]', proc_id):
return 'emerald rapids'
elif re.match('intel-xeon-platinum-[0-9][5][0-9][0-9]', proc_id):
return 'emerald rapids'
elif re.match('intel-xeon-bronze-[0-9]4[0-9][0-9]', proc_id): elif re.match('intel-xeon-bronze-[0-9]4[0-9][0-9]', proc_id):
return 'sapphire rapids' return 'sapphire rapids'
elif re.match('intel-xeon-silver-[0-9]4[0-9][0-9]', proc_id): elif re.match('intel-xeon-silver-[0-9]4[0-9][0-9]', proc_id):
@ -251,6 +257,9 @@ class Cpu(Item):
dp_flops_per_cycle_per_core = 32 dp_flops_per_cycle_per_core = 32
# cpus_may2023_v3.pdf # cpus_may2023_v3.pdf
if proc_arch in ['emerald rapids']:
dp_flops_per_cycle_per_core = 32 # just a guess
if proc_arch in ['granite rapids']: if proc_arch in ['granite rapids']:
dp_flops_per_cycle_per_core = 32 # just a guess, I still don't know if there were some changes compared to sapphire rapids dp_flops_per_cycle_per_core = 32 # just a guess, I still don't know if there were some changes compared to sapphire rapids
@ -301,6 +310,7 @@ class Cpu(Item):
'cascadelake': 6, 'cascadelake': 6,
'icelake': 8, 'icelake': 8,
'sapphire rapids': 8, 'sapphire rapids': 8,
'emerald rapids': 8,
'granite rapids': 8, 'granite rapids': 8,
'rome': 8, 'rome': 8,
'milan': 8, 'milan': 8,
@ -349,6 +359,7 @@ def get_simd_id(proc_arch: CpuArchitecture) -> SimdId:
'cascadelake': 'avx-512', 'cascadelake': 'avx-512',
'icelake': 'avx-512', 'icelake': 'avx-512',
'sapphire rapids': 'avx-512', 'sapphire rapids': 'avx-512',
'emerald rapids': 'avx-512',
'granite rapids': 'avx-512', 'granite rapids': 'avx-512',
'coffeelake': 'avx2', 'coffeelake': 'avx2',
# from https://www.microway.com/knowledge-center-articles/detailed-specifications-of-the-amd-epyc-rome-cpus/: # from https://www.microway.com/knowledge-center-articles/detailed-specifications-of-the-amd-epyc-rome-cpus/:

View File

@ -1,4 +1,4 @@
from typing import List from typing import List, Optional
from pathlib import Path from pathlib import Path
from concho.config import TableBasedConfigurator from concho.config import TableBasedConfigurator
from concho.config import Configurator from concho.config import Configurator
@ -417,7 +417,8 @@ class DellConfiguratorParser(IHtmlConfiguratorParser):
assert False, 'failed to find module "%s"' % section_label assert False, 'failed to find module "%s"' % section_label
@abstractmethod @abstractmethod
def price_str_as_float(self, price_as_str): def price_str_as_float(self, price_as_str) -> Optional[Price]:
'''return None is the price is not available for some reason (eg (Plus disponible))'''
assert False assert False
@abstractmethod @abstractmethod
@ -483,7 +484,8 @@ class DellConfiguratorParser(IHtmlConfiguratorParser):
# examples from dell 20/10/2025: # examples from dell 20/10/2025:
# Processeur Intel® Xeon® 6 Performance 6507P 3,5 GHz, 8C/16T, 24 GT/s, 48 Mo de cache, Turbo (150 W), mémoire DDR5-6400 # Processeur Intel® Xeon® 6 Performance 6507P 3,5 GHz, 8C/16T, 24 GT/s, 48 Mo de cache, Turbo (150 W), mémoire DDR5-6400
# Intel® Xeon® 6 Performance 6714P 4,0 GHz, 8C/16T, 24 GT/s, 330 Mo de cache, Turbo (165 W), mémoire DDR5-6400 # Intel® Xeon® 6 Performance 6714P 4,0 GHz, 8C/16T, 24 GT/s, 330 Mo de cache, Turbo (165 W), mémoire DDR5-6400
match = re.match(r'^(Processeur\s)?Intel[®]?\sXeon[®]?\s+6\s+(?P<cpu_class>Silver|Gold|Platinium|Performance)\s+(?P<cpu_number>[0-9][0-9][0-9][0-9][PRLYU]?).*', label) # Processeur Intel® Xeon® Platinum 8460Y+ 2 GHz, 40C/80T, 16 GT/s, cache 105 Mo, Turbo, HT (300 W), mémoire DDR5 4 800 MHz
match = re.match(r'^(Processeur\s)?Intel[®]?\sXeon[®]?(\s+6)?\s+(?P<cpu_class>Silver|Gold|Platinium|Platinum|Performance)\s+(?P<cpu_number>[0-9][0-9][0-9][0-9][PRLYU]?[+]?).*', label)
if match: if match:
cpu_class = match['cpu_class'].lower() cpu_class = match['cpu_class'].lower()
if cpu_class == 'platinium': if cpu_class == 'platinium':
@ -513,6 +515,9 @@ class DellConfiguratorParser(IHtmlConfiguratorParser):
if len(label_elements) > 0: if len(label_elements) > 0:
label = clean_string(label_elements[0].text_content().replace('\n', '').strip()) label = clean_string(label_elements[0].text_content().replace('\n', '').strip())
price = self.price_str_as_float(option_root_element.xpath(self.get_xpath_filter('option_to_price'))[0].text_content()) price = self.price_str_as_float(option_root_element.xpath(self.get_xpath_filter('option_to_price'))[0].text_content())
if price is None:
logging.warning(f'skipping cpu option with unavailable price: "{label}"')
continue
option = self._parse_cpu_upgrade(label, price) option = self._parse_cpu_upgrade(label, price)
# print('_parse_proc_change_options : adding cpu %s (price = %f)' % (cpu_id, price / num_cpus)) # print('_parse_proc_change_options : adding cpu %s (price = %f)' % (cpu_id, price / num_cpus))
proc_options.add_option(option) proc_options.add_option(option)
@ -736,6 +741,20 @@ class DellConfiguratorParser(IHtmlConfiguratorParser):
'amd-epyc-9255': 2556.0, 'amd-epyc-9255': 2556.0,
'amd-epyc-9275f': 3943.0, 'amd-epyc-9275f': 3943.0,
} }
elif cpu_uid == 'intel-xeon-silver-4514y':
# retail prices [https://en.wikipedia.org/wiki/Emerald_Rapids#List_of_Emerald_Rapids_processors] on 23/10/2025:
public_prices_usd = {
'intel-xeon-silver-4514y': 780.0,
'intel-xeon-gold-6526y': 1517.0,
'intel-xeon-gold-5418y': 1483.0, # from https://en.wikipedia.org/wiki/Sapphire_Rapids#List_of_Sapphire_Rapids_processors
'intel-xeon-gold-6542y': 2878.0,
}
# matinfo 6 upgrade (from 2 x intel-xeon-silver-4514) prices:
matinfo6_upgrade_prices_eur = {
'intel-xeon-gold-6526y': 636.0,
'intel-xeon-gold-5418y': 1128.0,
'intel-xeon-gold-6542y': 2550.0,
}
else: else:
assert False, 'estimation of base cpu price from public prices not implemented for %s' % cpu_uid assert False, 'estimation of base cpu price from public prices not implemented for %s' % cpu_uid
# let p_x be the public price of cpu x in usd (known) # let p_x be the public price of cpu x in usd (known)
@ -824,6 +843,7 @@ class DellConfiguratorParser(IHtmlConfiguratorParser):
base_cpu_price = { base_cpu_price = {
'amd-epyc-7262': 550.0, 'amd-epyc-7262': 550.0,
'amd-epyc-9115': DellConfiguratorParser._estimate_base_cpu_price_from_public_prices(cpu_uid=base_cpu.uid), 'amd-epyc-9115': DellConfiguratorParser._estimate_base_cpu_price_from_public_prices(cpu_uid=base_cpu.uid),
'intel-xeon-silver-4514y': DellConfiguratorParser._estimate_base_cpu_price_from_public_prices(cpu_uid=base_cpu.uid),
'intel-xeon-performance-6505p': DellConfiguratorParser._estimate_base_cpu_price_from_public_prices(cpu_uid=base_cpu.uid), 'intel-xeon-performance-6505p': DellConfiguratorParser._estimate_base_cpu_price_from_public_prices(cpu_uid=base_cpu.uid),
}[base_cpu.uid] }[base_cpu.uid]
configurator.modules['processor'].add_option(Option(base_cpu, base_cpu_price)) configurator.modules['processor'].add_option(Option(base_cpu, base_cpu_price))
@ -883,7 +903,7 @@ class DellConfiguratorParser2020(DellConfiguratorParser):
def additional_cpu_is_automatic(self) -> bool: def additional_cpu_is_automatic(self) -> bool:
return False return False
def price_str_as_float(self, price_as_str): def price_str_as_float(self, price_as_str) -> Optional[Price]:
# eg '+ 2,255.00 €' # eg '+ 2,255.00 €'
match = re.match(r'^\s*(?P<sign>[-+]?)\s*(?P<numbers>[0-9.]*)\s*€\s*$', price_as_str.replace(',', '')) match = re.match(r'^\s*(?P<sign>[-+]?)\s*(?P<numbers>[0-9.]*)\s*€\s*$', price_as_str.replace(',', ''))
assert match, 'unexpected price string (%s)' % price_as_str assert match, 'unexpected price string (%s)' % price_as_str
@ -958,7 +978,7 @@ class DellConfiguratorParser2021(DellConfiguratorParser):
def additional_cpu_is_automatic(self) -> bool: def additional_cpu_is_automatic(self) -> bool:
return False return False
def price_str_as_float(self, price_as_str): def price_str_as_float(self, price_as_str) -> Optional[Price]:
# eg '+ 2255,00 €' # contains a Narrow No-Break Space (NNBSP) https://www.compart.com/en/unicode/U+202F # eg '+ 2255,00 €' # contains a Narrow No-Break Space (NNBSP) https://www.compart.com/en/unicode/U+202F
nnbsp = '' nnbsp = ''
match = re.match(r'^\s*(?P<sign>[-+]?)\s*(?P<numbers>[0-9.]*)\s*€\s*$', price_as_str.replace(',', '.').replace(nnbsp, '')) match = re.match(r'^\s*(?P<sign>[-+]?)\s*(?P<numbers>[0-9.]*)\s*€\s*$', price_as_str.replace(',', '.').replace(nnbsp, ''))
@ -1035,7 +1055,8 @@ class DellConfiguratorParser2025(DellConfiguratorParser):
title_span_element = conf_title_element.xpath(".//span")[0] title_span_element = conf_title_element.xpath(".//span")[0]
assert title_span_element is not None assert title_span_element is not None
title = title_span_element.text_content().replace('\n', '').strip() # eg 'Cat2 Conf 2-2-07: Dell Poweredge R670' title = title_span_element.text_content().replace('\n', '').strip() # eg 'Cat2 Conf 2-2-07: Dell Poweredge R670'
match = re.match(r'^Cat[0-9]+ Conf\s+[0-9\-]+: Dell Poweredge (?P<chassis_type>[CR][0-9][0-9][0-9][0-9]?).*', title) # Cat3 Conf 3-2-01 : Poweredge R760xa
match = re.match(r'^Cat[0-9]+ Conf\s+[0-9\-]+\s*:\s*(Dell )?Poweredge (?P<chassis_type>[CR][0-9][0-9][0-9][0-9]?[xa]*).*', title)
assert match, 'unhandled title : %s' % title assert match, 'unhandled title : %s' % title
# print(match['cpu_class'], match['cpu_number']) # print(match['cpu_class'], match['cpu_number'])
chassis_id = "dell-poweredge-%s" % (match['chassis_type'].lower(), ) # eg "dell-poweredge-r670" chassis_id = "dell-poweredge-%s" % (match['chassis_type'].lower(), ) # eg "dell-poweredge-r670"
@ -1069,14 +1090,20 @@ class DellConfiguratorParser2025(DellConfiguratorParser):
# Inclus dans le prix # Inclus dans le prix
return True return True
def price_str_as_float(self, price_as_str): def price_str_as_float(self, price_as_str) -> Optional[Price]:
# eg '+ 2255,00 €' # contains a Narrow No-Break Space (NNBSP) https://www.compart.com/en/unicode/U+202F # eg '+ 2255,00 €' # contains a Narrow No-Break Space (NNBSP) https://www.compart.com/en/unicode/U+202F
nnbsp = '' nnbsp = ''
match = re.match(r'^\s*(?P<sign>[-+]?)\s*(?P<numbers>[0-9.]*)\s*€\s*$', price_as_str.replace(',', '.').replace(nnbsp, '')) match = re.match(r'^\s*(?P<sign>[-+]?)\s*(?P<numbers>[0-9.]*)\s*€\s*$', price_as_str.replace(',', '.').replace(nnbsp, ''))
assert match, 'unexpected price string (%s)' % price_as_str if match:
# print(match['sign'], match['numbers']) # print(match['sign'], match['numbers'])
price_as_float = float("%s%s" % (match['sign'], match['numbers'])) price_as_float = float("%s%s" % (match['sign'], match['numbers']))
return price_as_float return price_as_float
else:
# handle the case 'Plus disponible' (meaning 'no price available')
match = re.match(r'^\s*Plus\s+disponible\s*$', price_as_str)
if match:
return None
assert match, 'unexpected price string (%s)' % price_as_str
def _get_module_selected_items(self, module_root_element: HtmlElement) -> List[HtmlElement]: def _get_module_selected_items(self, module_root_element: HtmlElement) -> List[HtmlElement]:
logging.debug('getting selected items for module %s' % module_root_element) logging.debug('getting selected items for module %s' % module_root_element)
@ -1156,12 +1183,16 @@ class DellConfiguratorParser2025(DellConfiguratorParser):
# print(label, price) # print(label, price)
# Ajout d'une barette de 128Go 2667 Mhz LRDIMM # Ajout d'une barette de 128Go 2667 Mhz LRDIMM
ram_option = None ram_option = None
# examples:
# Mémoire 16 Go DDR4 à 2933MHz (1x16Go) # Mémoire 16 Go DDR4 à 2933MHz (1x16Go)
# 32 Go RDIMM, 6 400 MT/s, double rangée # 32 Go RDIMM, 6 400 MT/s, double rangée
# 16 Go RDIMM 5600 MT/s, une rangée
# match = re.match(r'^Mémoire (?P<num_gb>[0-9]+) Go DDR[\-]?4 à (?P<num_mhz>[0-9]+)MHz \((?P<num_dimms>[0-9]+)x(?P<num_gb_per_dimm>[0-9]+)Go\)', item_label.replace('Mémoire de base : ', '').replace('De base ', '')) # match = re.match(r'^Mémoire (?P<num_gb>[0-9]+) Go DDR[\-]?4 à (?P<num_mhz>[0-9]+)MHz \((?P<num_dimms>[0-9]+)x(?P<num_gb_per_dimm>[0-9]+)Go\)', item_label.replace('Mémoire de base : ', '').replace('De base ', ''))
# match = re.match(r'^(?P<num_gb>[0-9]+) Go (de mémoire|) RDIMM, (?P<num_mts>[0-9] ?[0-9]+)\s+MT/s, (une|double) rangée', item_label) # match = re.match(r'^(?P<num_gb>[0-9]+) Go (de mémoire|) RDIMM, (?P<num_mts>[0-9] ?[0-9]+)\s+MT/s, (une|double) rangée', item_label)
match = re.match(r'^(?P<num_gb_per_dimm>[0-9]+)\s+Go(\s+de mémoire|)\s+RDIMM,\s+(?P<num_mts>[0-9]\s?[0-9]+)\s+MT/s,\s+(une|double)\s+rangée', label) match = re.match(r'^(?P<num_gb_per_dimm>[0-9]+)\s+Go(\s+de mémoire|)\s+RDIMM([,])?\s+(?P<num_mts>[0-9]\s?[0-9]+)\s+MT/s,\s+(une|double)\s+rangée', label)
if match is None:
# handle 'Mémoire RDIMM 128 Go, 5 600 MT/, 4 doubles rangées, BASE 32 Go'
match = re.match(r'^Mémoire RDIMM\s+(?P<num_gb_per_dimm>[0-9]+)\s+Go,\s+(?P<num_mts>[0-9]\s?[0-9]+)\s+MT/(s)?,\s+[0-9]+\s+(une|double)s?\s+rangées?,\s+BASE\s+[0-9]+\s+Go', label)
assert match, 'unhandled label : %s' % label assert match, 'unhandled label : %s' % label
# DDR5 RDIMM 6400 MT/s # DDR5 RDIMM 6400 MT/s
num_mts = match['num_mts'] num_mts = match['num_mts']
@ -1236,15 +1267,17 @@ class DellConfiguratorParser2025(DellConfiguratorParser):
# initialize cpu # initialize cpu
item_label = self._get_module_default_item_label('Processeur', html_root) item_label = self._get_module_default_item_label('Processeur', html_root)
# Processeur Intel Xeon Silver 4208 2.1GHz,11M Cache,9.60GT/s, 2UPI,No Turbo, HT,8C/16T (85W) - DDR4-2400 # Processeur Intel Xeon Silver 4208 2.1GHz,11M Cache,9.60GT/s, 2UPI,No Turbo, HT,8C/16T (85W) - DDR4-2400
# Processeur Intel® Xeon® Silver 4514Y 2 GHz, 16C/32T, 16 GT/s, cache 30 Mo, Turbo, HT (150 W), mémoire DDR5 à 4 400 MHz
# match = re.match(r'^Processeur Intel[®]? Xeon[®]? 6 (?P<cpu_class>Silver|Gold|Platinium|Performance) (?P<cpu_number>[0-9][0-9][0-9][0-9][PRLYU]?).*', item_label) # match = re.match(r'^Processeur Intel[®]? Xeon[®]? 6 (?P<cpu_class>Silver|Gold|Platinium|Performance) (?P<cpu_number>[0-9][0-9][0-9][0-9][PRLYU]?).*', item_label)
match = re.match(r'^Processeur Intel[®]? Xeon[®]?\s+6\s+(?P<cpu_class>Silver|Gold|Platinium|Performance)\s+(?P<cpu_number>[0-9][0-9][0-9][0-9][PRLYU]?).*', item_label) match = re.match(r'^Processeur\s+Intel[®]?\s+Xeon[®]?\s+(6\s+)?(?P<cpu_class>Silver|Gold|Platinium|Performance)\s+(?P<cpu_number>[0-9][0-9][0-9][0-9][PRLYU]?).*', item_label)
if match: if match:
cpu_id = "intel-xeon-%s-%s" % (match['cpu_class'].lower(), match['cpu_number'].lower()) cpu_id = "intel-xeon-%s-%s" % (match['cpu_class'].lower(), match['cpu_number'].lower())
if not match: if not match:
# Processeur AMD EPYC 9115 2,60 GHz, 16C/32T, 64 Mo de cache (125 W), mémoire DDR5 à 6400 MT/s # Processeur AMD EPYC 9115 2,60 GHz, 16C/32T, 64 Mo de cache (125 W), mémoire DDR5 à 6400 MT/s
match = re.match(r'^Processeur AMD EPYC\s+(?P<cpu_number>[0-9][0-9][0-9][0-9]).*', item_label) match = re.match(r'^Processeur AMD EPYC\s+(?P<cpu_number>[0-9][0-9][0-9][0-9]).*', item_label)
cpu_id = "amd-epyc-%s" % (match['cpu_number'].lower(), ) if match:
cpu_id = "amd-epyc-%s" % (match['cpu_number'].lower(), )
assert match, 'unhandled label : %s' % item_label assert match, 'unhandled label : %s' % item_label
# print(match['cpu_class'], match['cpu_number']) # print(match['cpu_class'], match['cpu_number'])

View File

@ -146,6 +146,7 @@ def plot_configs(configs: List[Config], xaxis_def: ConfigAxisDef, yaxis_def: Con
'cascadelake': 0.8, 'cascadelake': 0.8,
'icelake': 0.9, 'icelake': 0.9,
'sapphire rapids': 1.0, 'sapphire rapids': 1.0,
'emerald rapids': 1.0,
'granite rapids': 1.0, 'granite rapids': 1.0,
'rome': 0.2, 'rome': 0.2,
'milan': 0.4, 'milan': 0.4,
@ -170,6 +171,7 @@ def plot_configs(configs: List[Config], xaxis_def: ConfigAxisDef, yaxis_def: Con
'dell-poweredge-r630': 0.6, 'dell-poweredge-r630': 0.6,
'dell-poweredge-r640': 0.6, 'dell-poweredge-r640': 0.6,
'dell-poweredge-r6525': 0.5, 'dell-poweredge-r6525': 0.5,
'dell-poweredge-r760xa': 0.55,
'dell-poweredge-r670': 0.6, 'dell-poweredge-r670': 0.6,
'dell-poweredge-r6725': 0.0, 'dell-poweredge-r6725': 0.0,
'dell-poweredge-c4310': 0.6, 'dell-poweredge-c4310': 0.6,

View File

@ -20,6 +20,7 @@ class Test(unittest.TestCase):
logging.info('Starting test_dell2_configs') logging.info('Starting test_dell2_configs')
configurators = [ configurators = [
HtmlConfigurator(Path('catalogs/dell/2025-10/20251020 - Cat2 Conf 2-2-07_ Dell Poweredge R670.html'), DellConfiguratorParser2025()), HtmlConfigurator(Path('catalogs/dell/2025-10/20251020 - Cat2 Conf 2-2-07_ Dell Poweredge R670.html'), DellConfiguratorParser2025()),
HtmlConfigurator(Path('catalogs/dell/2025-10/20251022 - Cat3 Conf 3-2-01 _ Poweredge R760xa.html'), DellConfiguratorParser2025()),
HtmlConfigurator(Path('catalogs/dell/2025-10/20251022 - Cat2 Conf 2-2-09_ Dell Poweredge R6725.html'), DellConfiguratorParser2025()), HtmlConfigurator(Path('catalogs/dell/2025-10/20251022 - Cat2 Conf 2-2-09_ Dell Poweredge R6725.html'), DellConfiguratorParser2025()),
] ]