From 048de6fed99b708d4e920eba1055e49e88f3f375 Mon Sep 17 00:00:00 2001 From: Guillaume Raffy Date: Wed, 7 Apr 2021 23:07:11 +0200 Subject: [PATCH] adapted concho's dell html parser to dell's 2021 web pages format note : dell's 2020 web pages are still supported --- ...07 - Cat2 Conf4 PowerEdge R640 - Dell.html | 614 ++++++++++++++++++ concho/dell.py | 268 ++++++-- tests/test1.py | 34 +- 3 files changed, 845 insertions(+), 71 deletions(-) create mode 100644 20210407 - Cat2 Conf4 PowerEdge R640 - Dell.html diff --git a/20210407 - Cat2 Conf4 PowerEdge R640 - Dell.html b/20210407 - Cat2 Conf4 PowerEdge R640 - Dell.html new file mode 100644 index 0000000..6e66eb4 --- /dev/null +++ b/20210407 - Cat2 Conf4 PowerEdge R640 - Dell.html @@ -0,0 +1,614 @@ + + + + + + + Configurer un produit - Dell + + + + + + + + + + +
+
+ + +
+ +
+ +
+ +
+ + +
+ +
+ + +
+ + +
+
+ +
+
+ +
+
+
+ + + + +
CFI : Projet personnalisé de votre etablissement (si disponible)
Base
PowerEdge R640
+ 0,00 €
Processeurs (Passage)
Passage à processeur Intel Xeon Gold 6240R 2.4GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,24C/48T (165W)
+ 2 255,00 €
Passage à processeur Intel Xeon Gold 6258R 2,7GHz, 38.5M Cache,10.40GT/s, 2UPI, Turbo, HT,28C/56T (205W)
+ 3 971,00 €
Passage à processeur Intel Xeon Gold 6242R 3,1GHz, 35,75M Cache,10.40GT/s, 2UPI, Turbo, HT,20C/40T (205W)
+ 2 421,00 €
Processeur Intel Xeon Silver 4208 (2,1GHz, 8C/16T, cache 11Mo, 9,6GT/s, 85W, Turbo, HT), mémoire DDR4 240
+ 0,00 €
Passage à processeur Intel Xeon Silver 4216 2.1GHz, 22M Cache,9.60GT/s, 2UPI, Turbo, HT,16C/32T (100W) -
+ 579,00 €
Passage à processeur Intel Xeon Gold 5222 3.8GHz, 16.5M Cache,10.40GT/s, 2UPI, Turbo, HT,4C/8T (105W) - D
+ 838,00 €
Passage à processeur Intel Xeon Gold 6246R 3.4GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,16C/32T (205W)
+ 3 146,00 €
Passage à processeur Intel Xeon Silver 4215R 3,2GHz, 11M Cache,9.60GT/s, 2UPI, Turbo, HT,8C/16T (130W) -
+ 421,00 €
Passage à processeur Intel Xeon Gold 5220R 2.2GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,24C/48T (150W)
+ 1 247,00 €
Passage à processeur Intel Xeon Gold 6248R 3GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,24C/48T (205W) -
+ 3 013,00 €
Passage à processeur Intel Xeon Gold 6238R 2.2GHz, 38.5M Cache,10.40GT/s,Turbo, HT,28C/56T (165W) - DDR4-
+ 2 521,00 €
Passage à processeur Intel Xeon Gold 6230R 2.1GHz, 35,75M Cache,10.40GT/s, Turbo, HT,26C/52T (150W) - DDR
+ 1 736,00 €
Passage à processeur Intel Xeon Gold 6226R 2,9GHz, 22M Cache,10.40GT/s,Turbo, HT,16C/32T (150W) - DDR4-29
+ 1 121,00 €
Passage à processeur Intel Xeon Gold 5218R 2.1GHz, 27,5M Cache,10.40GT/s, 2UPI, Turbo, HT,20C/40T (125W)
+ 908,00 €
Passage à processeur Intel Xeon Silver 4214R 2.4GHz, 16.5M Cache,9.60GT/s, 2UPI, Turbo, HT,12C/24T (100W)
+ 280,00 €
Passage à processeur Intel Xeon Gold 5217 3GHz, 11M Cache,10.40GT/s, 2UPI, Turbo, HT,8C/16T (115W) - DDR4
+ 1 221,00 €
Passage à processeur Intel Xeon Gold 5215 2.5GHz, 13.75M Cache,10.40GT/s, 2UPI, Turbo, HT,10C/20T (85W) -
+ 888,00 €
Passage à processeur Intel Xeon Silver 4210R 2.4GHz,13.75M Cache,9.60GT/s, 2UPI, Turbo, HT,10C/20T (100W)
+ 60,00 €
Passage à processeur Intel Xeon Gold 6234 3.3GHz, 24.75M Cache,10.40GT/s, 3UPI, Turbo, HT,8C/16T (130W) -
+ 2 061,00 €
Passage à processeur Intel Xeon Gold 6252 2.1GHz, 35.75M Cache,10.40GT/s, 3UPI, Turbo, HT,24C/48T (150W)
+ 3 631,00 €
Passage à processeur Intel Xeon Platinium 8260L 2.4GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,24C/48T (
+ 6 241,00 €
Passage à processeur Intel Xeon Gold 6244 3.6GHz, 24.75M Cache,10.40GT/s, 3UPI, Turbo, HT,8C/16T (150W) -
+ 2 961,00 €
Passage à processeur Intel Xeon Platinium 8260Y 2.4GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,24C/48T (
+ 4 871,00 €
Passage à processeur Intel Xeon Platinium 8270 2.7GHz, 35.75M Cache,10.40GT/s, 3UPI, Turbo, HT,26C/52T (2
+ 7 083,00 €
Passage à processeur Intel Xeon Platinium 8253 2.2GHz, 22M Cache,10.40GT/s, 3UPI, Turbo, HT,16C/32T (125W
+ 2 933,00 €
Passage à processeur Intel Xeon Platinium 8276 2.2GHz, 38.5M Cache,10.40GT/s, 3UPI, Turbo, HT,28C/56T (16
+ 8 549,00 €
Passage à processeur Intel Xeon Gold 6210U 2.5GHz, 27.5M Cache,10.40GT/s, 3UPI, Turbo, HT,20C/40T (150W)
+ 1 271,00 €
Passage à processeur Intel Xeon Gold 6212U 2.4GHz, 35.75M Cache,10.40GT/s, 3UPI, Turbo, HT,24C/48T (165W)
+ 1 871,00 €
Passage à processeur Intel Xeon Platinium 8268 2.9GHz, 35.75M Cache,10.40GT/s, 3UPI, Turbo, HT,24C/48T (2
+ 5 576,00 €
Passage à processeur Intel Xeon Gold 6240Y 2.6GHz, 24.75M Cache,10.40GT/s, 2UPI, Turbo, HT,18C/36T (150W)
+ 2 521,00 €
Passage à processeur Intel Xeon Platinium 8260 2.4GHz, 35.75M Cache,10.40GT/s, 3UPI, Turbo, HT,24C/48T (1
+ 4 310,00 €
Passage à processeur Intel Xeon Gold 6254 3.1GHz, 24.75M Cache,10.40GT/s, 3UPI, Turbo, HT,18C/36T (200W)
+ 3 541,00 €
Passage à processeur Intel Xeon Gold 5215L 2.5GHz, 13.75M Cache,10.40GT/s, 2UPI, Turbo, HT,10C/20T (85W)
+ 3 146,00 €
Passage à processeur Intel Xeon Gold 6240L 2.6GHz, 24.75M Cache,10.40GT/s, 2UPI, Turbo, HT,18C/36T (150W)
+ 4 551,00 €
Passage à processeur Intel Xeon Gold 6238L 2.1GHz, 30.25M Cache,10.40GT/s, 3UPI, Turbo, HT,22C/44T (140W)
+ 4 871,00 €
Passage à processeur Intel Xeon Silver 4214Y 2.2GHz, 16.5M Cache,9.60GT/s, 2UPI, Turbo, HT,12C/24T (85W)
+ 396,00 €
Processeurs additionnels
Processeur additionnel Intel Xeon Silver 4210R 2.4GHz,13.75M Cache,9.60GT/s, 2UPI, Turbo, HT,10C/20T (100
+ 489,00 €
Processeur additionnel Intel Xeon Silver 4214R 2.4GHz, 16.5M Cache,9.60GT/s, 2UPI, Turbo, HT,12C/24T (100
+ 709,00 €
Processeur additionnel Intel Xeon Gold 5215 2.5GHz, 13.75M Cache,10.40GT/s, 2UPI, Turbo, HT,10C/20T (85W)
+ 1 317,00 €
Processeur additionnel Intel Xeon Gold 5217 3GHz, 11M Cache,10.40GT/s, 2UPI, Turbo, HT,8C/16T (115W) - DD
+ 1 650,00 €
Processeur additionnel Intel Xeon Silver 4216 2.1GHz, 22M Cache,9.60GT/s, 2UPI, Turbo, HT,16C/32T (100W)
+ 1 008,00 €
Aucun processeur supplémentaire
+ 0,00 €
Processeur additionnel Intel Xeon Gold 5222 3.8GHz, 16.5M Cache,10.40GT/s, 2UPI, Turbo, HT,4C/8T (105W) -
+ 1 267,00 €
Processeur additionnel Intel Xeon Gold 6238R 2.2GHz, 38.5M Cache,10.40GT/s,Turbo, HT,28C/56T (165W) - DDR
+ 2 950,00 €
Processeur additionnel Intel Xeon Gold 6230R 2.1GHz, 35,75M Cache,10.40GT/s, Turbo, HT,26C/52T (150W) - D
+ 2 165,00 €
Processeur additionnel Intel Xeon Gold 6226R 2,9GHz, 22M Cache,10.40GT/s,Turbo, HT,16C/32T (150W) - DDR4-
+ 1 550,00 €
Processeur additionnel Intel Xeon Gold 5218R 2.1GHz, 27,5M Cache,10.40GT/s, 2UPI, Turbo, HT,20C/40T (125W
+ 1 300,00 €
Processeur additionnel Intel Xeon Gold 6246R 3.4GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,16C/32T (205
+ 3 575,00 €
Processeur additionnel Intel Xeon Silver 4208 2.1GHz,11M Cache,9.60GT/s, 2UPI, Turbo, HT,8C/16T (85W) - D
+ 429,00 €
Processeur additionnel Intel Xeon Gold 6240R 2.4GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,24C/48T (165
+ 2 684,00 €
Processeur additionnel Intel Xeon Gold 6258R 2,7GHz, 38.5M Cache,10.40GT/s, 2UPI, Turbo, HT,28C/56T (205W
+ 4 400,00 €
Processeur additionnel Intel Xeon Gold 6242R 3,1GHz, 35,75M Cache,10.40GT/s, 2UPI, Turbo, HT,20C/40T (205
+ 2 850,00 €
Processeur additionnel Intel Xeon Silver 4215R 3,2GHz, 11M Cache,9.60GT/s, 2UPI, Turbo, HT,8C/16T (130W)
+ 810,00 €
Processeur additionnel Intel Xeon Gold 6248R 3GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,24C/48T (205W)
+ 3 442,00 €
Processeur additionnel Intel Xeon Gold 5220R 2.2GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,24C/48T (150
+ 1 676,00 €
Processeur additionnel Intel Xeon Gold 6252 2.1GHz, 35.75M Cache,10.40GT/s, 3UPI, Turbo, HT,24C/48T (150W
+ 4 060,00 €
Processeur additionnel Intel Xeon Gold 6234 3.3GHz, 24.75M Cache,10.40GT/s, 3UPI, Turbo, HT,8C/16T (130W)
+ 2 490,00 €
Processeur additionnel Intel Xeon Gold 6240L 2.6GHz, 24.75M Cache,10.40GT/s, 2UPI, Turbo, HT,18C/36T (150
+ 4 980,00 €
Processeur additionnel Intel Xeon Gold 6238L 2.1GHz, 30.25M Cache,10.40GT/s, 3UPI, Turbo, HT,22C/44T (140
+ 5 300,00 €
Processeur additionnel Intel Xeon Platinium 8260L 2.4GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,24C/48T
+ 6 670,00 €
Processeur additionnel Intel Xeon Gold 6244 3.6GHz, 24.75M Cache,10.40GT/s, 3UPI, Turbo, HT,8C/16T (150W)
+ 3 390,00 €
Processeur additionnel Intel Xeon Platinium 8253 2.2GHz, 22M Cache,10.40GT/s, 3UPI, Turbo, HT,16C/32T (12
+ 3 362,00 €
Processeur additionnel Intel Xeon Platinium 8270 2.7GHz, 35.75M Cache,10.40GT/s, 3UPI, Turbo, HT,26C/52T
+ 7 512,00 €
Processeur additionnel Intel Xeon Platinium 8260Y 2.4GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,24C/48T
+ 5 300,00 €
Processeur additionnel Intel Xeon Platinium 8276 2.2GHz, 38.5M Cache,10.40GT/s, 3UPI, Turbo, HT,28C/56T (
+ 8 978,00 €
Processeur additionnel Intel Xeon Silver 4214Y 2.2GHz, 16.5M Cache,9.60GT/s, 2UPI, Turbo, HT,12C/24T (85W
+ 825,00 €
Processeur additionnel Intel Xeon Gold 5215L 2.5GHz, 13.75M Cache,10.40GT/s, 2UPI, Turbo, HT,10C/20T (85W
+ 3 575,00 €
Processeur additionnel Intel Xeon Platinium 8268 2.9GHz, 35.75M Cache,10.40GT/s, 3UPI, Turbo, HT,24C/48T
+ 6 005,00 €
Processeur additionnel Intel Xeon Gold 6254 3.1GHz, 24.75M Cache,10.40GT/s, 3UPI, Turbo, HT,18C/36T (200W
+ 3 970,00 €
Processeur additionnel Intel Xeon Gold 6240Y 2.6GHz, 24.75M Cache,10.40GT/s, 2UPI, Turbo, HT,18C/36T (150
+ 2 950,00 €
Processeur additionnel Intel Xeon Platinium 8260 2.4GHz, 35.75M Cache,10.40GT/s, 3UPI, Turbo, HT,24C/48T
+ 4 739,00 €
Mémoires (Passage)
Passage à 128Go DDR4 en 1 x 128Go 2667MHz LRDIMM (A partir de la base en 1x16Go)
+ 2 055,00 €
Passage à 64Go DDR4 en 1 x 64Go 3200MHz RDIMM (A partir de la base en 1x16Go)
+ 415,00 €
Passage à 32Go DDR4 en 1 x 32Go 3200MHz RDIMM (A partir de la base en 1x16Go)
+ 125,00 €
Passage à 32Go DDR4 en 4 x 8Go 3200MHz RDIMM (A partir de la base en 1x16Go)
+ 175,00 €
Mémoire 16 Go DDR4 à 3200MHz (1x16Go)
+ 0,00 €
Mémoire: Ajout de barettes additionnelles
Ajout d'une barette de 32Go 3200MHz RDIMM
+ 270,00 €
Ajout d'une barette de 64Go 3200MHz RDIMM
+ 560,00 €
Ajout d'une barette de 16Go 3200MHz RDIMM
+ 145,00 €
Ajout d'une barette de 8Go 3200MHz RDIMM
+ 80,00 €
Ajout d'une barette de 128Go 2667 Mhz LRDIMM
+ 2 200,00 €
Optane DC Persistent Memory - 128Go 2666Mhz
+ 460,00 €
VEUILLEZ SAISIR ICI VOS BARETTES ADDITIONNELLES
+ 0,00 €
Configuration du châssis
Passage au châssis 2,5" pour maximum 10 disques Hot Plugs avec 8 emplacements disques NVME (2 CPU Obligat
+ 150,00 €
Passage au châssis 2,5" pour maximum 10 disques Hot Plugs + 2 disques 2.5'' hot-plug à l'arrière avec 1 s
+ 130,00 €
Passage au châssis 2,5" pour maximum 10 disques Hot Plugs
+ 90,00 €
Châssis 2,5" avec jusqu’à 8 disques durs et 3 emplacements PCIe
+ 0,00 €
Passage au châssis 3,5" pour maximum 4 disques Hot Plugs
+ 0,00 €
Contrôleur RAID
H330 Contrôleur
+ 0,00 €
Passage à carte HBA330 pour configuration sans Raid
+ 0,00 €
Passage à carte RAID H730p avec 2 Go NV Cache
+ 196,00 €
Passage à carte RAID H740p avec 8 Go NV Cache
+ 319,00 €
Disques durs (Passage)
Retrait des disques de base (2x1.2To SAS 10Ktpm 2.5'')
-330,00 €
2 disques durs 1,2To 10 000 tr/mn SAS
+ 0,00 €
Disques M.2 (BOSS)
Ajout d'un contrôleur BOSS et 1 carte M.2 de 240Go
+ 219,00 €
Ajout d'un contrôleur BOSS et 2 cartes M.2 de 240Go
+ 364,00 €
Ajout d'un contrôleur BOSS et 1 carte M.2 de 480Go
+ 330,00 €
Ajout d'un contrôleur BOSS et 2 cartes M.2 de 480Go
+ 600,00 €
Disques durs additionnels
Ajout d'un disque dur 1.92 To SSD vSAS Mix Use - 2.5'' - 3DWPD - 10512TBW
+ 930,00 €
Ajout d'un disque dur 7.68 To SSD vSAS Read Intensive - 2,5" - 1DWPD - 14016TBW
+ 3 100,00 €
Ajout d'un disque dur 16 To Nearline SAS 7200 Tpm 3,5"- hotplug
+ 610,00 €
Ajout d'un disque dur 960 Go SSD vSAS Read Intensive - 2,5" - 1DWPD - 1752TBW
+ 440,00 €
Ajout d'un disque dur 3.84 To SSD vSAS Mix Use - 2,5" - 3DWPD - 21024TBW
+ 1 730,00 €
Ajout d'un disque dur 3.84 To SSD SAS Read Intensive - 2,5" - 1DWPD - 7008TBW
+ 1 550,00 €
Ajout d'un disque dur 800 Go SSD SAS Mix Use - 2.5'' - 3DWPD - 4360TBW
+ 450,00 €
Ajout d'un disque dur 960 Go SSD SATA Read Intensive - 2.5" - 1DWPD - 1752TBW
+ 330,00 €
VEUILLEZ SAISIR ICI VOS DISQUES ADDITIONNELS EN TENANT COMPTE DES LIMITES IMPOSEES PAR LE CHASSIS CHOISI
+ 0,00 €
Ajout d'un disque dur 960 Go SSD SATA Mix Use - 2.5" - 3DWPD - 5256TBW
+ 430,00 €
Ajout d'un disque dur 480 Go SSD SAS Mix Use - TOSHIBA PM5-V 2,5" - 3DWPD - 2628TBW
+ 489,00 €
Ajout d'un disque dur 480 Go SSD SATA Read Intensive - 2.5" - 1DWPD - 876TBW
+ 175,00 €
Ajout d'un disque dur 480 Go SSD SATA Mix Use - 2.5" - 3DWPD - 2628TBW
+ 230,00 €
Ajout d'un disque dur 3.84 To SSD SAS Mix Use - 2,5" - 3DWPD - 21024TBW
+ 1 850,00 €
Ajout d'un disque dur 1.92 To SSD SATA Mix Use - 2.5" - 3DWPD - 10512TBW
+ 850,00 €
Ajout d'un disque dur 1.92 To SSD SAS Read Intensive - 2,5" - 1DWPD - 3504TBW
+ 780,00 €
Ajout d'un disque dur 3.84 To SSD SATA Read Intensive - 2.5" - 1DWPD - 7008TBW
+ 1 250,00 €
Ajout d'un disque dur 960 Go SSD SAS Read Intensive - 2,5" - 1DWPD - 1752TBW
+ 500,00 €
Ajout d'un disque dur 1.92 To SSD SATA Read Intensive - 2.5" - 1DWPD - 3504TBW
+ 600,00 €
Ajout d'un disque dur 1.6 To SSD SAS Mix Use - 2,5" - 3DWPD - 8760TBW
+ 800,00 €
Ajout d'un disque dur 1,2 To SAS 10k Tpm 2,5" - hotplug
+ 165,00 €
Ajout d'un disque dur 900 Go SAS 15k Tpm 2,5" - hotplug
+ 280,00 €
Ajout d'un disque dur 600 Go SAS 15k Tpm 2,5" - hotplug
+ 180,00 €
Ajout d'un disque SAS Near Line 4To à 7200Tpm 3,5" - hotplug
+ 180,00 €
Ajout d'un disque dur 2 To Nearline SAS 7200 Tpm 3,5"- hotplug
+ 145,00 €
Disque Dur enfichable à chaud 600GB 10K RPM SAS 12Gbps 512n 2.5"
+ 130,00 €
Ajout d'un disque dur 300 Go SAS 15k Tpm 2,5" - hotplug
+ 150,00 €
Ajout d'un disque dur 2.4 To SAS 10k Tpm 2,5" - hotplug
+ 350,00 €
Ajout d'un disque SAS Near Line 12To à 7200Tpm 3,5" - hotplug
+ 420,00 €
Ajout d'un disque SAS Near Line 8To à 7200Tpm 3,5" - hotplug
+ 280,00 €
Extension de garantie disque dur
Gardez votre disque dur - KYHD 5 ans - Par Serveur
+ 70,00 €
Gardez votre disque dur - KYHD 7 ans - Par Serveur
+ 95,00 €
Lecteur optique (ajout)
Lecteur/Graveur DVD
+ 20,00 €
Pas de lecteur optique intégré
+ 0,00 €
Module SD interne
Ajout de 2 cartes SD (MicroSDHC/SDXC) de 64Go redondantes pour hyperviseur
+ 219,00 €
Ajout de 2 cartes SD (MicroSDHC/SDXC) de 32Go redondantes pour hyperviseur
+ 95,00 €
Ajout de 2 cartes SD (MicroSDHC/SDXC) de 16Go redondantes pour hyperviseur
+ 50,00 €
Disques NVME
Ajout d'un disque NVME 2.5'' INTEL P4510 4 To Read Intensive
+ 1 650,00 €
Ajout d'un disque NVME 2.5'' INTEL P4800X 375 Go Ultra Performance
+ 1 300,00 €
Ajout d'un disque NVME 2.5'' INTEL P4800X 750 Go Ultra Performance
+ 2 600,00 €
Ajout d'un disque NVME 2.5'' DELL 960 Go Read Intensive - Gen4
+ 390,00 €
Ajout d'un disque NVME 2.5'' INTEL P4610 3.2 To Mix Use
+ 1 900,00 €
Ajout d'un disque NVME 2.5'' DELL 1.92 To Read Intensive - Gen4
+ 820,00 €
Ajout d'un disque NVME 2.5'' DELL 3.84 To Read Intensive - Gen4
+ 1 550,00 €
Ajout d'un disque NVME 2.5'' Samsung PM1725 3.2 To Mix Use
+ 1 500,00 €
Ajout d'un disque NVME 2.5'' INTEL P4610 1.6 To Mix Use
+ 1 100,00 €
Ajout d'un disque NVME 2.5'' INTEL P4610 6.4 To Mix Use
+ 4 000,00 €
Ajout d'un disque NVME 2.5'' DELL 7.68 To Read Intensive - Gen 4
+ 3 100,00 €
Carte de montage PCIe
Carte de montage Configuration 4, 2 emplacements x16 profil bas
+ 0,00 €
Cartes réseau intégrées
Passage à carte réseau Intel X550 double ports 10 GB Base-T et i350 double ports gigabit
+ 145,00 €
Passage à carte réseau Intel X550 quatre ports 10 GB Base-T
+ 290,00 €
Passage à carte réseau Intel X710 double ports 10 GB SFP+ et i350 double ports gigabit
+ 259,00 €
Passage à carte réseau Intel X710 quatre ports 10 GB SFP+
+ 330,00 €
Carte Fille Réseau Broadcom 5720 QP 1Gb
+ 0,00 €
Carte Fille Réseau Intel Ethernet I350 QP 1Gb
+ 130,00 €
Passage carte réseau QLogic 41162 Dual Ports 10GbE Base-T et Dual ports 1G RJ45
+ 154,00 €
Passage carte réseau QLogic 41262 Dual Ports 25GbE SFP28
+ 160,00 €
Passage carte réseau QLogic 41164 Quad Ports 10GbE SFP+
+ 210,00 €
Passage à carte réseau Mellanox Connect-X 4 Dual Ports 25Gbits SFP
+ 314,00 €
Passage carte réseau QLogic 41164 Quad Ports 10GbE Base-T
+ 254,00 €
Passage à carte réseau Broadcom 57416 2 ports 10Gb Base-T et Broadcom 5720 2 ports 1Gb Base-T
+ 140,00 €
Passage à carte réseau Broadcom 57414 2 ports 25Gb SFP28
+ 290,00 €
Passage carte réseau QLogic 41264 Dual Ports 10GbE SFP+ et Dual ports 1G RJ45
+ 140,00 €
Adaptateur de bus hôte/Carte réseau convergé
Ajout carte HBA FC Emulex LPE 35002 double port 32 Gb
+ 950,00 €
Ajout carte HBA FC Qlogic 2690 mono port 16Gb
+ 439,00 €
Ajout carte HBA FC Qlogic 2692 double port 16Gb
+ 650,00 €
Ajout carte HBA FC Emulex LPE 31000-M6 mono port 16 Gb
+ 449,00 €
Ajout carte HBA FC Emulex LPE 31002-M6 double port 16 Gb
+ 654,00 €
Ajout carte HBA FC Qlogic 2562 double port 8Gb
+ 389,00 €
Ajout carte HBA FC Emulex LPE 12002 double port 8 Gb
+ 449,00 €
Ajout carte HBA FC Qlogic 2560 mono port 8Gb
+ 276,00 €
Cartes PCIe supplémentaires
Ajout carte RAID H840 8Go Nvram avec sortie externe pour connexion à baie Powervault MD1400
+ 350,00 €
Ajout carte SAS 12Gb/s HBA Externe 2 ports
+ 85,00 €
Carte réseau supplémentaire
Ajout carte réseau Intel I350 quatre ports gigabit
+ 141,00 €
Ajout carte réseau Intel I350 deux ports gigabit
+ 65,00 €
Ajout carte Broadcom 57414 25G SFP Dual Ports
+ 205,00 €
Ajout carte Mellanox ConnectX-4 Lx Dual Port 25Gb SFP28
+ 259,00 €
Ajout carte réseau Intel XXV710 Dual Ports 10/25G SFP28
+ 284,00 €
Ajout carte réseau Intel X710 deux ports 10 Gb SFP+
+ 290,00 €
ConnectX-4 VPI adapter card, EDR IB (100Gb/s), Double-port SFP28
+ 1 247,00 €
Ajout carte réseau Intel X710 quatre ports 10 GB Base-T
+ 394,00 €
Ajout carte réseau Intel X550 deux ports 10 Gb Base-T
+ 200,00 €
Ajout carte Broadcom 57416 10G Base-T Dual Ports
+ 190,00 €
Ajout carte Broadcom 57412 10G SFP+ Dual Ports
+ 180,00 €
Ajout carte QLogic 41112 Dual Port 10GbE Base-T
+ 190,00 €
Ajout carte QLogic 41262 Dual Port 25GbE SFP28
+ 205,00 €
Ajout carte QLogic 41112 Dual Port 10GbE SFP+
+ 180,00 €
Ajout carte réseau Broadcom 5720 deux ports gigabit
+ 48,00 €
Ajout carte réseau Broadcom 5719 quatre ports gigabit
+ 66,00 €
Carte Mellanox ConnectX-6 Simple Port HDR - 200 Gbits
+ 704,00 €
Dispositifs optiques
Dell Networking Câble Direct Attach Twinaxial SFP28 (25G) DELL 3 mètres
+ 105,00 €
Dell Networking Câble Direct Attach Twinaxial SFP+ DELL 3 mètres
+ 25,00 €
Ajout Transceiver 10 Gb SR SFP+ pour les cartes 10 Gb Intel
+ 90,00 €
Dispositifs optiques Mellanox
Ajout Transceiver 10 Gb SR SFP+ pour les cartes 10 Gb Mellanox
+ 105,00 €
Options & dispositifs optiques divers
Ajout Transceiver 10 Gb SR SFP+ pour les cartes 10 Gb Broadcom et Qlogic
+ 90,00 €
Carte d'administration à distance
Dell iDRAC9 Enterprise
+ 17,00 €
iDRAC9 Express
+ 0,00 €
Carte d'administration à distance (autre)
iDRAC, Mot de Passe Legacy
+ 0,00 €
Mot de passe iDRAC9 Aléatoire
+ 0,00 €
Carte d'administration à distance (autre)
Passage à carte iDRAC 9 Enterprise avec carte SD Vflash 16 GB
+ 68,00 €
Alimentations (Passage)
Deux blocs d'alimentation redondants hot swapp 1100W
+ 150,00 €
Passage à double alimentation redondante 750W Titanium (1+1)
+ 191,00 €
Passage à double alimentation redondante 495W Platinium (1+1)
Non compatible avec chassis R740xd
+ 75,00 €
Un bloc d'alimenation de 495 Watts Platinium avec câble d'alimentation 2 mètres
Non compatible avec chassis R740xd
+ 0,00 €
Passage à double alimentation redondante 1600W Platinium (1+1)
+ 180,00 €
Passage à mono alimentation non redondante 1600W Platinium (1+0)
+ 75,00 €
Passage à mono alimentation non redondante 750W Titanium (1+0)
+ 47,00 €
Bloc d'alimenation simple enfichable à chaud (1+0) de 750W
+ 19,00 €
Bloc d‘alimentation unique enfichable à chaud (1+0), 1 100 W
+ 0,00 €
Passage à double alimentation redondante 750W Platinium (1+1)
+ 117,00 €
Rails pour rack
Kit de mise en rack statique pour racks 2 ou 4 montants
+ 50,00 €
Sans rails de rack ni bras de gestion des câbles
+ 0,00 €
Rails Coulissants Ready Rails avec Bras de Gestion des Câbles
+ 75,00 €
Rails coulissant Ready rails sans bras de management de cables, pour rack 4 montants
+ 50,00 €
Cadre
Panneau avant métallique façade et écran LCD
+ 50,00 €
Panneau avant métallique façade
+ 17,00 €
Cadre standard Dell EMC sans bordure
+ 0,00 €
Panneau Quick Sync
Module Quick Sync (Bluetooth/Wifi)
+ 80,00 €
Sans Quick Sync
+ 0,00 €
Documentation du système
Aucune Documentation Système et Aucun Kit Dvd OpenManage
+ 0,00 €
Système d'exploitation installé en usine
Pas de système d’exploitation
+ 0,00 €
Cordons d'alimentation
Passage de câble d'alimentation de 2m à 4m
+ 0,00 €
Style PDU 10A 6,5pieds (2m) Cordon d’alimentation C13 à C14
+ 0,00 €
Passage de câble d'alimentation de 2m à 0,6m
+ 0,00 €
Cadre
aucune selection
+ 0,00 €
Extensions de garanties
Extension de garantie 7 ans intervention H+4 (24h/24h, 7j/7j) DELL Prosupport
+ 650,00 €
Extension de garantie 7 ans intervention J+1 (heures ouvrées, jours ouvrés) DELL Prosupport
+ 270,00 €
Extension de garantie 5 ans intervention H+4 (24h/24h, 7j/7j) DELL Prosupport
+ 250,00 €
ProSupport 5 ans, intervention sur site J+1: support professionnel de niveau 2 comprenant assistance maté
+ 0,00 €
Regulatory
PowerEdge R640 CE,CCC,BIS Marking
+ 0,00 €
Cat2 Conf4 PowerEdge R640
Disponible
Réf: 4-2-4-01-14g
Avec + son architecture à double socket 1U, le PowerEdge R640 est la +plate-forme idéale pour vos opérations de calcul sur des datacenters +scale-out haute densité. Le R640 combine densité, performances et +évolutivité pour optimiser les performances de vos applications et la +densité de votre datacente. 


Livraison

Prix de base1175 € HT

Avec options1175 € HT

    Quantité :

    + + + + +
    Nous contacter ?
    +
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/concho/dell.py b/concho/dell.py index 06fc3eb..ef1f8ef 100644 --- a/concho/dell.py +++ b/concho/dell.py @@ -381,23 +381,22 @@ class DellConfiguratorParser(): def __init__(self): pass - @classmethod - def _get_module(cls, root_element, section_label): - modules_element = root_element.xpath(".//div[@class='col-md-10']")[0] + def _get_module(self, root_element, section_label): + modules_element = root_element.xpath(self.get_xpath_filter('root_to_modules_element'))[0] # print(modules_element) - for module_root in modules_element.xpath(".//div[@class='col-md-12 module']"): + for module_root in modules_element.xpath(self.get_xpath_filter('modules_element_to_modules')): # print(module_root) # blue modules such as "Processeurs (Passage)" - module_titles = module_root.xpath(".//div[@class='col-md-4 module-title color-017EB8']") + module_titles = module_root.xpath(self.get_xpath_filter('module_to_blue_title')) if len(module_titles) > 0: - # print(module_title.text) # print(len(module_title.text)) module_title = module_titles[0] + # print('module_title.text = %s ' % module_title.text) # print(module_title.text_content()) if module_title.text == section_label: return module_root # grey modules such as 'Base' - module_titles = module_root.xpath(".//div[@class='col-md-4 module-title color-808080']") + module_titles = module_root.xpath(self.get_xpath_filter('module_to_grey_title')) if len(module_titles) > 0: # print(module_title.text) # print(len(module_title.text)) @@ -405,25 +404,33 @@ class DellConfiguratorParser(): # print(module_title.text_content()) if module_title.text == section_label: return module_root + assert False, 'failed to find module "%s"' % section_label - @classmethod - def price_str_as_float(cls, price_as_str): - match = re.match(r'^\s*(?P[-+]?)\s*(?P[0-9.]*)\s*€\s*$', price_as_str.replace(',','')) - assert match, 'unexpected price string (%s)' % price_as_str - # print(match['sign'], match['numbers']) - price_as_float = float("%s%s" % (match['sign'], match['numbers'])) - return price_as_float + @abstractmethod + def price_str_as_float(self, price_as_str): + assert False + @abstractmethod + def get_module_label(self, module_id): + assert False + + @abstractmethod + def get_xpath_filter(self, filter_id): + assert False + + @abstractmethod + def get_base_price(self, html_root): + assert False def _parse_proc_change_options(self, html_root): proc_options = Module('processor-change') - #module_root_element = DellConfiguratorParser._get_module(html_root, 'Processeurs (Passage)') - module_root_element = DellConfiguratorParser._get_module(html_root, 'Processeurs (Passage)') - for option_root_element in module_root_element.xpath(".//div[@class='row']"): - label_elements = option_root_element.xpath(".//div[@class='option-not-selected ']") + #module_root_element = self._get_module(html_root, 'Processeurs (Passage)') + module_root_element = self._get_module(html_root, self.get_module_label('cpu_change')) + for option_root_element in module_root_element.xpath(self.get_xpath_filter('module_to_options')): + label_elements = option_root_element.xpath(self.get_xpath_filter('option_to_label')) if len(label_elements) > 0: label = label_elements[0].text_content().replace('\n', '') - price = DellConfiguratorParser.price_str_as_float(option_root_element.xpath(".//div[@class='col-md-3 text-right option-price ']")[0].text_content()) + price = self.price_str_as_float(option_root_element.xpath(self.get_xpath_filter('option_to_price'))[0].text_content()) # print(label, price) num_cpus = 1 # Passage à processeur Intel Xeon Gold 6240L 2.6GHz, 24.75M Cache,10.40GT/s, 2UPI, Turbo, HT,18C/36T (150W) - DDR4-2933 @@ -444,13 +451,13 @@ class DellConfiguratorParser(): def _parse_proc_options(self, html_root): proc_options = Module('processor') - #module_root_element = DellConfiguratorParser._get_module(html_root, 'Processeurs (Passage)') - module_root_element = DellConfiguratorParser._get_module(html_root, 'Processeurs additionnels') - for option_root_element in module_root_element.xpath(".//div[@class='row']"): - label_elements = option_root_element.xpath(".//div[@class='option-not-selected ']") + #module_root_element = self._get_module(html_root, 'Processeurs (Passage)') + module_root_element = self._get_module(html_root, self.get_module_label('additional_cpus')) + for option_root_element in module_root_element.xpath(self.get_xpath_filter('module_to_options')): + label_elements = option_root_element.xpath(self.get_xpath_filter('option_to_label')) if len(label_elements) > 0: label = label_elements[0].text_content() - price = DellConfiguratorParser.price_str_as_float(option_root_element.xpath(".//div[@class='col-md-3 text-right option-price ']")[0].text_content()) + price = self.price_str_as_float(option_root_element.xpath(self.get_xpath_filter('option_to_price'))[0].text_content()) # print(label, price) num_additional_cpus = 1 match = re.match(r'^Processeur additionnel Intel Xeon (?PSilver|Gold|Platinium) (?P[0-9][0-9][0-9][0-9][RLY]?).*', label) @@ -471,16 +478,16 @@ class DellConfiguratorParser(): def _parse_ram_options(self, html_root): ram_options = Module('ram') - #module_root_element = DellConfiguratorParser._get_module(html_root, 'Processeurs (Passage)') - module_root_element = DellConfiguratorParser._get_module(html_root, 'Mémoire: Ajout de barettes additionnelles') - for option_root_element in module_root_element.xpath(".//div[@class='row']"): - label_elements = option_root_element.xpath(".//div[@class='option-not-selected ']") + #module_root_element = self._get_module(html_root, 'Processeurs (Passage)') + module_root_element = self._get_module(html_root, self.get_module_label('ram_additions')) + for option_root_element in module_root_element.xpath(self.get_xpath_filter('module_to_options')): + label_elements = option_root_element.xpath(self.get_xpath_filter('option_to_label')) if len(label_elements) > 0: label = label_elements[0].text_content() - price = DellConfiguratorParser.price_str_as_float(option_root_element.xpath(".//div[@class='col-md-3 text-right option-price ']")[0].text_content()) + price = self.price_str_as_float(option_root_element.xpath(self.get_xpath_filter('option_to_price'))[0].text_content()) # print(label, price) # Ajout d'une barette de 128Go 2667 Mhz LRDIMM - match = re.match(r'^Ajout d\'une barette de (?P[0-9]+)Go (?P[0-9][0-9][0-9][0-9]) Mhz (?PLRDIMM|RDIMM)$', label) + match = re.match(r'^Ajout d\'une barette de (?P[0-9]+)Go (?P[0-9][0-9][0-9][0-9]) *M[Hh]z (?PLRDIMM|RDIMM)$', label) if match: # print(match['num_gb'], match['num_mhz']) @@ -505,19 +512,9 @@ class DellConfiguratorParser(): assert len(ram_options.options) > 0 return ram_options - @classmethod - def _get_module_default_item(cls, module_label, html_root): - module_root_element = DellConfiguratorParser._get_module(html_root, module_label) - assert module_root_element is not None - for option_root_element in module_root_element.xpath(".//div[@class='row']"): - label_elements = option_root_element.xpath(".//div[@class='option-selected ']") - assert label_elements is not None - if len(label_elements) > 0: - label = label_elements[0].text_content().replace('\n', '') - price = DellConfiguratorParser.price_str_as_float(option_root_element.xpath(".//div[@class='col-md-3 text-right option-price option-price-selected']")[0].text_content()) - assert price == 0.0, 'default items are expected to have a price of 0.0 € (%s s price is %f)' % (label, price) - return label - assert False, 'failed to find the default item of module %s' % module_label + @abstractmethod + def _get_module_default_item(self, module_label, html_root): + assert False def _parse_base_config(self, html_root, configurator): base_config = Config(configurator) @@ -525,7 +522,7 @@ class DellConfiguratorParser(): base_config.num_cpu_per_server = 1 # initialize cpu - item_label = DellConfiguratorParser._get_module_default_item('Processeurs (Passage)', html_root) + item_label = self._get_module_default_item('Processeurs (Passage)', html_root) # Processeur Intel Xeon Silver 4208 2.1GHz,11M Cache,9.60GT/s, 2UPI,No Turbo, HT,8C/16T (85W) - DDR4-2400 match = re.match(r'^Processeur Intel Xeon (?PSilver|Gold|Platinium) (?P[0-9][0-9][0-9][0-9][RLYU]?).*', item_label) if match is None: @@ -537,7 +534,7 @@ class DellConfiguratorParser(): base_config.set_cpu(Cpu(cpu_id)) # initialize the default ram dimms - item_label = DellConfiguratorParser._get_module_default_item('Mémoires (Passage)', html_root) + item_label = self._get_module_default_item(self.get_module_label('ram_change'), html_root) # Mémoire 16 Go DDR4 à 2933MHz (1x16Go) match = re.match(r'^Mémoire (?P[0-9]+) Go DDR4 à (?P[0-9]+)MHz \((?P[0-9]+)x(?P[0-9]+)Go\)', item_label) assert match, 'unhandled label : %s' % item_label @@ -610,18 +607,21 @@ class DellConfiguratorParser(): # modules_element = body.xpath("//div[@class='col-md-10']") - module_root_element = DellConfiguratorParser._get_module(html_root, 'Base') + module_root_element = self._get_module(html_root, 'Base') assert module_root_element is not None - for option_root_element in module_root_element.xpath(".//div[@class='row']"): - label_elements = option_root_element.xpath(".//div[@class='option-selected ']") - assert len(label_elements) > 0 - label = label_elements[0].text_content().replace('\n', '') - # PowerEdge R640 - match = re.match(r'^PowerEdge (?P[CR][0-9][0-9][0-9][0-9]?).*', label) - assert match, 'unhandled label : %s' % label - # print(match['cpu_class'], match['cpu_number']) - chassis_id = "dell-poweredge-%s" % (match['chassis_type'].lower(), ) - configurator.chassis = Option(Chassis(chassis_id), 0.0) + #option_root_elements = module_root_element.xpath(".//div[@class='row']") + #assert len(option_root_elements) > 0 + + # option_root_element = option_root_elements[0] + label_elements = module_root_element.xpath(self.get_xpath_filter('base_module_to_label')) + assert len(label_elements) > 0 + label = label_elements[0].text_content().replace('\n', '') + # PowerEdge R640 + match = re.match(r'^PowerEdge (?P[CR][0-9][0-9][0-9][0-9]?).*', label) + assert match, 'unhandled label : %s' % label + # print(match['cpu_class'], match['cpu_number']) + chassis_id = "dell-poweredge-%s" % (match['chassis_type'].lower(), ) + configurator.chassis = Option(Chassis(chassis_id), 0.0) configurator.base_config = self._parse_base_config(html_root, configurator) @@ -637,6 +637,60 @@ class DellConfiguratorParser(): assert configurator.get_item_price(base_cpu.uid) is not None # compute the price of the chassis + base_price = self.get_base_price(html_root) + + one_cpu_price = configurator.get_item_price(configurator.base_config.cpu.uid) + ram_price = configurator.base_config.ram_price + configurator.chassis.price = base_price - configurator.base_config.num_cpus * one_cpu_price - ram_price + + +class DellConfiguratorParser2020(DellConfiguratorParser): + + def __init__(self): + super().__init__() + + def get_module_label(self, module_id): + return { + 'cpu_change': 'Processeurs (Passage)', + 'additional_cpus': 'Processeurs additionnels', + 'ram_change': 'Mémoires (Passage)', + 'ram_additions': 'Mémoire: Ajout de barettes additionnelles', + }[module_id] + + def get_xpath_filter(self, filter_id): + return { + 'root_to_modules_element': ".//div[@class='col-md-10']", + 'modules_element_to_modules': ".//div[@class='col-md-12 module']", + 'module_to_blue_title': ".//div[@class='col-md-4 module-title color-017EB8']", + 'module_to_grey_title': ".//div[@class='col-md-4 module-title color-808080']", + 'module_to_options': ".//div[@class='row']", + 'option_to_label': ".//div[@class='option-not-selected ']", + 'option_to_price': ".//div[@class='col-md-3 text-right option-price ']", + 'base_module_to_label': ".//div[@class='option-selected ']", + }[filter_id] + + def price_str_as_float(self, price_as_str): + # eg '+ 2,255.00 €' + match = re.match(r'^\s*(?P[-+]?)\s*(?P[0-9.]*)\s*€\s*$', price_as_str.replace(',','')) + assert match, 'unexpected price string (%s)' % price_as_str + # print(match['sign'], match['numbers']) + price_as_float = float("%s%s" % (match['sign'], match['numbers'])) + return price_as_float + + def _get_module_default_item(self, module_label, html_root): + module_root_element = self._get_module(html_root, module_label) + assert module_root_element is not None + for option_root_element in module_root_element.xpath(".//div[@class='row']"): + label_elements = option_root_element.xpath(".//div[@class='option-selected ']") + assert label_elements is not None + if len(label_elements) > 0: + label = label_elements[0].text_content().replace('\n', '') + price = self.price_str_as_float(option_root_element.xpath(".//div[@class='col-md-3 text-right option-price option-price-selected']")[0].text_content()) + assert price == 0.0, 'default items are expected to have a price of 0.0 € (%s s price is %f)' % (label, price) + return label + assert False, 'failed to find the default item of module %s' % module_label + + def get_base_price(self, html_root): base_price = None price_preview_element = html_root.xpath(".//div[@class='price-preview']")[0] assert price_preview_element is not None @@ -657,24 +711,108 @@ class DellConfiguratorParser(): if label == 'Prix': price_value_element = price_element.xpath(".//span[@class='col-md-8']")[0] assert price_value_element is not None - base_price = DellConfiguratorParser.price_str_as_float(price_value_element.text_content()) + base_price = self.price_str_as_float(price_value_element.text_content()) assert base_price is not None + return base_price + +class DellConfiguratorParser2021(DellConfiguratorParser): + + def __init__(self): + super().__init__() + + def get_module_label(self, module_id): + return { + 'cpu_change': 'Processeurs (Passage)', + 'additional_cpus': 'Processeurs additionnels', + 'ram_change': 'Mémoires (Passage)', + 'ram_additions': 'Mémoire: Ajout de barettes additionnelles', + }[module_id] + + def get_xpath_filter(self, filter_id): + return { + 'root_to_modules_element': ".//div[@class='modules']", + 'modules_element_to_modules': ".//div[@class='product-module-configuration']", + 'module_to_blue_title': ".//header", + 'module_to_grey_title': ".//div[@class='col-md-4 module-title color-808080']", + 'module_to_options': ".//div[@class='product-options-configuration-line']", + 'option_to_label': ".//div[@class='option-info']", + 'option_to_price': ".//div[@class='option-price']", + 'base_module_to_label': ".//div[@class='product-options-configuration-block option-selected']", + }[filter_id] + + def price_str_as_float(self, price_as_str): + # eg '+ 2 255,00 €' # contains a Narrow No-Break Space (NNBSP) https://www.compart.com/en/unicode/U+202F + nnbsp = ' ' + match = re.match(r'^\s*(?P[-+]?)\s*(?P[0-9.]*)\s*€\s*$', price_as_str.replace(',','.').replace(nnbsp, '')) + assert match, 'unexpected price string (%s)' % price_as_str + # print(match['sign'], match['numbers']) + price_as_float = float("%s%s" % (match['sign'], match['numbers'])) + return price_as_float + + def _get_module_default_item(self, module_label, html_root): + module_root_element = self._get_module(html_root, module_label) + assert module_root_element is not None + + if module_label == self.get_module_label('ram_change'): + #
    + #
    Mémoire 16 Go DDR4 à 3200MHz (1x16Go)
    + #
    + #
    + 0,00 €
    + #
    + selected_option_filter = ".//div[@class='product-options-configuration-block option-selected']" + label_filter = ".//header" + price_filter = ".//div[@class='mt-2 option-price']" + else: + selected_option_filter = ".//div[@class='product-options-configuration-line option-selected']" + label_filter = ".//div[@class='option-info']" + price_filter = ".//div[@class='option-price']" + + for selected_option_root_element in module_root_element.xpath(selected_option_filter): + label_elements = selected_option_root_element.xpath(label_filter) + assert label_elements is not None + if len(label_elements) > 0: + label = label_elements[0].text_content().replace('\n', '') + price = self.price_str_as_float(selected_option_root_element.xpath(price_filter)[0].text_content()) + assert price == 0.0, 'default items are expected to have a price of 0.0 € (%s s price is %f)' % (label, price) + return label + assert False, 'failed to find the default item of module %s' % module_label + + def get_base_price(self, html_root): + base_price = None + price_preview_element = html_root.xpath(".//div[@class='product-info']")[0] + assert price_preview_element is not None + for price_element in price_preview_element.xpath(".//div[@class='info']"): + price_label_element = price_element.xpath(".//span[@class='info-label']")[0] + #
    Prix de base1175 € HT
    + #
    + #
    Avec options1175 € HT
    + #
    + + assert price_label_element is not None + label = price_label_element.text_content().replace('\n', '') + if label == 'Prix de base': + price_value_element = price_element.xpath(".//span[@class='info-value strong']")[0] + assert price_value_element is not None + base_price = self.price_str_as_float(price_value_element.text_content().replace(' HT','')) + assert base_price is not None + return base_price - one_cpu_price = configurator.get_item_price(configurator.base_config.cpu.uid) - ram_price = configurator.base_config.ram_price - configurator.chassis.price = base_price - configurator.base_config.num_cpus * one_cpu_price - ram_price class DellMatinfoConfigurator(Configurator): ''' a configurator using the web page from dell matinfo ''' - def __init__(self, dell_configurator_html_file_path): + def __init__(self, dell_configurator_html_file_path, html_parser): super().__init__(self) self.base_config = None self.chassis = None - parser = DellConfiguratorParser() - parser.parse(dell_configurator_html_file_path, self) + html_parser.parse(dell_configurator_html_file_path, self) def create_config(self): @@ -740,7 +878,7 @@ class DellMatinfoCsvConfigurator(Configurator): match = re.match(r'^Passage à 2 Processeurs Intel Xeon (?PSilver|Gold|Platinium) (?P[0-9][0-9][0-9][0-9][RLYUM]?) .*', label) if match: - price = DellConfiguratorParser.price_str_as_float(line_cells[COLUMN_PRICE]) + price = self.price_str_as_float(line_cells[COLUMN_PRICE]) cpu_class = match['cpu_class'].lower() if cpu_class == 'platinium': cpu_class = 'platinum' @@ -752,7 +890,7 @@ class DellMatinfoCsvConfigurator(Configurator): # Ajout d'une barette de 8Go 2667 Mhz DDR-4 - Pour les 4 serveurs match = re.match(r'^Ajout d\'une barette de (?P[0-9]+)Go (?P[0-9][0-9][0-9][0-9]) Mhz (?PDDR-4) - Pour les 4 serveurs$', label) if match: - price_for_four = DellConfiguratorParser.price_str_as_float(line_cells[COLUMN_PRICE]) + price_for_four = self.price_str_as_float(line_cells[COLUMN_PRICE]) dimm = Dimm(mem_type='rdimm', num_gb=int(match['num_gb']), num_mhz=int(match['num_mhz'])) option = Option(dimm, price_for_four/4.0) ram_options.add_option(option) diff --git a/tests/test1.py b/tests/test1.py index 3cd6771..a2004b5 100644 --- a/tests/test1.py +++ b/tests/test1.py @@ -1,5 +1,7 @@ from concho.dell import DellMatinfoCsvConfigurator from concho.dell import DellMatinfoConfigurator +from concho.dell import DellConfiguratorParser2020 +from concho.dell import DellConfiguratorParser2021 from concho.procs_chooser import plot_configurators from concho.procs_chooser import ConfigPrice from concho.procs_chooser import ConfigFlops @@ -10,8 +12,8 @@ def test_all_matinfo_2020_configs(): # print(configurator) configurators = [ DellMatinfoCsvConfigurator('c6420-20200716-price.tsv'), - DellMatinfoConfigurator('rcrc1406676-4834664 - Cat2 Conf4 PowerEdge R640 - Dell.html'), - DellMatinfoConfigurator('rcrc1406676-4824727 - Cat 2 Conf 7 PowerEdge R940 - Dell.html'), + DellMatinfoConfigurator('rcrc1406676-4834664 - Cat2 Conf4 PowerEdge R640 - Dell.html', DellConfiguratorParser2020()), + DellMatinfoConfigurator('rcrc1406676-4824727 - Cat 2 Conf 7 PowerEdge R940 - Dell.html', DellConfiguratorParser2020()), # dell.DellPowerEdgeR940(), ] @@ -22,8 +24,8 @@ def test_credits_2020_configs(): # print(configurator) configurators = [ DellMatinfoCsvConfigurator('c6420-20200716-price.tsv'), - DellMatinfoConfigurator('rcrc1406676-4834664 - Cat2 Conf4 PowerEdge R640 - Dell.html'), - DellMatinfoConfigurator('rcrc1406676-4824727 - Cat 2 Conf 7 PowerEdge R940 - Dell.html'), + DellMatinfoConfigurator('rcrc1406676-4834664 - Cat2 Conf4 PowerEdge R640 - Dell.html', DellConfiguratorParser2020()), + DellMatinfoConfigurator('rcrc1406676-4824727 - Cat 2 Conf 7 PowerEdge R940 - Dell.html', DellConfiguratorParser2020()), # dell.DellPowerEdgeR940(), ] @@ -38,10 +40,30 @@ def test_credits_2020_configs(): # 'intel-xeon-gold-6240', # ] - config_filter = lambda config : config.get_price() < 15000.0 + config_filter = lambda config : config.get_price() < 40000.0 + + plot_configurators(configurators=configurators, ram_per_core=4.0e9, xaxis_def=ConfigPrice(), yaxis_def=ConfigFlopsPerEuro(), plot_title='physmol/ts credit 2020 configs', config_filter=config_filter) + +def test_credits_2021_configs(): + configurators = [ + DellMatinfoConfigurator('20210407 - Cat2 Conf4 PowerEdge R640 - Dell.html', DellConfiguratorParser2021()), + ] + + # config_filter = lambda config : config.cpu.uid in [ + # 'intel-xeon-gold-5222', + # 'intel-xeon-gold-6226r', + # 'intel-xeon-gold-6230r', + # 'intel-xeon-gold-6234r', + # 'intel-xeon-gold-6240r', + # 'intel-xeon-gold-6248r', + # 'intel-xeon-gold-6230', + # 'intel-xeon-gold-6240', + # ] + + config_filter = lambda config : config.get_price() < 40000.0 plot_configurators(configurators=configurators, ram_per_core=4.0e9, xaxis_def=ConfigPrice(), yaxis_def=ConfigFlopsPerEuro(), plot_title='physmol/ts credit 2020 configs', config_filter=config_filter) if __name__ == '__main__': - test_credits_2020_configs() \ No newline at end of file + test_credits_2021_configs() \ No newline at end of file