cleanup while remebering how it works, as I will need to make changes
- added type hinting (to help understanding the code) - fixed dirty dynamic call to `parse()` method by adding missing abstract base class `IHtmlConfiguratorParser` - organized data files into catalogs directory to unclutter the root
This commit is contained in:
parent
9b085fe72d
commit
e1df4f6501
|
@ -0,0 +1,17 @@
|
|||
concho/__pycache__
|
||||
concho.egg-info
|
||||
concho.venv
|
||||
build/
|
||||
__pycache__/
|
||||
catalogs/hpev1/**/*.js
|
||||
catalogs/hpev1/**/*.css
|
||||
catalogs/hpev2/**/*.js
|
||||
catalogs/hpev2/**/*.css
|
||||
catalogs/hpev2/20250314-cat2-conf16-hpe-dl380-gen11_files/chat_icon.svg
|
||||
catalogs/hpev2/20250314-cat2-conf16-hpe-dl380-gen11_files/configure.html
|
||||
catalogs/hpev2/20250314-cat2-conf16-hpe-dl380-gen11_files/notice
|
||||
catalogs/hpev2/20250314-cat2-conf16-hpe-dl380-gen11_files/v1.7-675
|
||||
catalogs/hpev2/20250314-cat2-conf19-hpe-dl365-gen11_files/chat_icon.svg
|
||||
catalogs/hpev2/20250314-cat2-conf19-hpe-dl365-gen11_files/configure.html
|
||||
catalogs/hpev2/20250314-cat2-conf19-hpe-dl365-gen11_files/notice
|
||||
catalogs/hpev2/20250314-cat2-conf19-hpe-dl365-gen11_files/v1.7-675
|
|
@ -0,0 +1,167 @@
|
|||
| Désignation/Description des matériels | Référence constructeur (le cas échéant) | Numéro de référence | Système | TARIFS en €HT | Qt | |
|
||||
| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :-------------------------------------- | :------------------- | :------ | :-------------- | :-- | :----------- |
|
||||
| CAT3_Configuration n°1 (Châssis rempli de serveurs identiques) | Poweredge C6420 | 4-3-1-14g000 | C6420 | 5,368 € | 1 | € 5,368.00 |
|
||||
| Chassis rack 2U (C6400) avec 4 cartes mères format simple hauteur (4xC6420) - châssis disques 3"5 | | | | | - | |
|
||||
| 2 processeurs Intel Xeon Silver 4210R 2.4GHz, 13.75M Cache,9.60GT/s, 2UPI, Turbo, HT,10C/20T (100W) - DDR4-2400 | | | | | - | |
|
||||
| Mémoire 48Go DDR-4 à 2667MHz (6x8Go) par serveur | | | | | - | |
|
||||
| 1 x disque dur 1TB SATA à 7.2 ktpm en 3"5 par serveur | | | | | - | |
|
||||
| 1 x Réseau Ethernet 1Gbit RJ45 | | | | | - | |
|
||||
| Alimentation hot plug et redondante 1600W Platinium avec 2 câbles d'alimentation C13-14 de 2m | | | | | - | |
|
||||
| Pas de lecteur Optique | | | | | - | |
|
||||
| Sans système d exploitation | | | | | - | |
|
||||
| ProSupport 5 ans, intervention sur site J+1: support professionnel de niveau 2 comprenant assistance matériel et logiciel, 24H/24, 7j/7 Disponibilité d'un Technical Account Manager (TAM) dédié exclusivement à MATINFO 4 pour la gestion des escalades et du reporting | | | | | - | |
|
||||
| Ces extensions concernent l'ensemble des configurations | | | | | | € - |
|
||||
| Cat3 Configuration n°1: PowerEdge C6420 | | | | | | € - |
|
||||
| Processeurs (passage) | | | | | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Silver 4214R 2.4GHz, 16.5M Cache,9.60GT/s, 2UPI, Turbo, HT,12C/24T (100W) - DDR4-2400 | | 4-3-1-14g600 | C6420 | 1,760 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Silver 4215R 3,2GHz, 11M Cache,9.60GT/s, 2UPI, Turbo, HT,8C/16T (130W) - DDR4-2400 | | 4-3-1-14g601 | C6420 | 2,568 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Silver 4216 2.1GHz, 22M Cache,9.60GT/s, 2UPI, Turbo, HT,16C/32T (100W) - DDR4-2400 | | 4-3-1-14g503 | C6420 | 4,152 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 5215 2.5GHz, 13.75M Cache,10.40GT/s, 2UPI, Turbo, HT,10C/20T (85W) - DDR4-2400 | | 4-3-1-14g504 | C6420 | 6,624 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 5217 3GHz, 11M Cache,10.40GT/s, 2UPI, Turbo, HT,8C/16T (115W) - DDR4-2666 | | 4-3-1-14g505 | C6420 | 9,288 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 5218R 2.1GHz, 27,5M Cache,10.40GT/s, 2UPI, Turbo, HT,20C/40T (125W) - DDR4-2666 | | 4-3-1-14g602 | C6420 | 6,488 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 5220R 2.2GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,24C/48T (150W) - DDR4-2666 | | 4-3-1-14g603 | C6420 | 8,488 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 5222 3.8GHz, 16.5M Cache,10.40GT/s, 2UPI, Turbo, HT,4C/8T (105W) - DDR4-2933 | | 4-3-1-14g508 | C6420 | 6,224 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 6226R 2,9GHz, 22M Cache,10.40GT/s,Turbo, HT,16C/32T (150W) - DDR4-2933 | | 4-3-1-14g604 | C6420 | 8,488 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 6230R 2.1GHz, 35,75M Cache,10.40GT/s, Turbo, HT,26C/52T (150W) - DDR4-2933 | | 4-3-1-14g605 | C6420 | 13,408 € | 1 | € 13,408.00 |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 6234 3.3GHz, 24.75M Cache,10.40GT/s, 3UPI, Turbo, HT,8C/16T (130W) - DDR4-2933 | | 4-3-1-14g701 | C6420 | 16,008 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 6238R 2.2GHz, 38.5M Cache,10.40GT/s,Turbo, HT,28C/56T (165W) - DDR4-2933 | | 4-3-1-14g606 | C6420 | 19,688 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 6238M 2.1GHz, 30.25M Cache,10.40GT/s, 3UPI, Turbo, HT,22C/44T (140W) - DDR4-2933 | | 4-3-1-14g703 | C6420 | 38,488 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 6240R 2.4GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,24C/48T (165W) - DDR4-2933 | | 4-3-1-14g607 | C6420 | 17,560 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 6240M 2.6GHz, 24.75M Cache,10.40GT/s, 2UPI, Turbo, HT,18C/36T (150W) - DDR4-2933 | | 4-3-1-14g704 | C6420 | 35,928 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 6242R 3,1GHz, 35,75M Cache,10.40GT/s, 2UPI, Turbo, HT,20C/40T (205W) - DDR4-2933 | | 4-3-1-14g608 | C6420 | 18,888 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 6244 3.6GHz, 24.75M Cache,10.40GT/s, 3UPI, Turbo, HT,8C/16T (150W) - DDR4-2933 | | 4-3-1-14g512 | C6420 | 23,208 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 6246R 3.4GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,16C/32T (205W) - DDR4-2933 | | 4-3-1-14g609 | C6420 | 24,688 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 6248R 3GHz, 35.75M Cache,10.40GT/s, 2UPI, Turbo, HT,24C/48T (205W) - DDR4-2933 | | 4-3-1-14g610 | C6420 | 23,624 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Platinium 8253 2.2GHz, 22M Cache,10.40GT/s, 3UPI, Turbo, HT,16C/32T (125W) - DDR4-2933 | | 4-3-1-14g514 | C6420 | 22,984 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 6254 3.1GHz, 24.75M Cache,10.40GT/s, 3UPI, Turbo, HT,18C/36T (200W) - DDR4-2933 | | 4-3-1-14g515 | C6420 | 27,848 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 6252 2.1GHz, 35.75M Cache,10.40GT/s, 3UPI, Turbo, HT,24C/48T (150W) - DDR4-2933 | | 4-3-1-14g516 | C6420 | 28,568 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Gold 6258R 2,7GHz, 38.5M Cache,10.40GT/s, 2UPI, Turbo, HT,28C/56T (205W) - DDR4-2933 | | 4-3-1-14g611 | C6420 | 31,288 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Platinium 8260 2.4GHz, 35.75M Cache,10.40GT/s, 3UPI, Turbo, HT,24C/48T (165W) - DDR4-2933 | | 4-3-1-14g517 | C6420 | 34,000 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Platinium 8268 2.9GHz, 35.75M Cache,10.40GT/s, 3UPI, Turbo, HT,24C/48T (205W) - DDR4-2933 | | 4-3-1-14g518 | C6420 | 44,128 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Platinium 8270 2.7GHz, 35.75M Cache,10.40GT/s, 3UPI, Turbo, HT,26C/52T (205W) - DDR4-2933 | | 4-3-1-14g519 | C6420 | 56,184 € | | € - |
|
||||
| Passage à 2 Processeurs Intel Xeon Platinium 8276 2.2GHz, 38.5M Cache,10.40GT/s, 3UPI, Turbo, HT,28C/56T (165W) - DDR4-2933 | | 4-3-1-14g520 | C6420 | 67,912 € | | € - |
|
||||
| | | | | | | € - |
|
||||
| Extensions mémoires | | | | | | € - |
|
||||
| Passage à 192Go en 6 x 32Go 2933Mhz RDIMM pour les 4 serveurs (A partir de la base 6x8Go) | | 4-3-1-14g041 | C6420 | 5,760 € | | € - |
|
||||
| Passage à 96Go en 6 x 16Go 2933Mhz RDIMM pour les 4 serveurs (A partir de la base 6x8Go) | | 4-3-1-14g042 | C6420 | 1,920 € | 1 | € 1,920.00 |
|
||||
| | | | | | | € - |
|
||||
| Ajout d'une barette de 8Go 2667 Mhz DDR-4 - Pour les 4 serveurs | | 4-3-1-14g043 | C6420 | 320 € | | € - |
|
||||
| Ajout d'une barette de 16Go 2933 Mhz DDR-4 - Pour les 4 serveurs | | 4-3-1-14g044 | C6420 | 640 € | 6 | € 3,840.00 |
|
||||
| Ajout d'une barette de 32Go 2933 Mhz DDR-4 - Pour les 4 serveurs | | 4-3-1-14g045 | C6420 | 1,280 € | | € - |
|
||||
| | | | | | | € - |
|
||||
| Carte SD et disques M.2 (BOSS) | | | | | | € - |
|
||||
| Ajout d'un contrôleur BOSS et 1 carte M.2 de 120Go - Pour les 4 serveurs | | 4-3-1-14g046 | C6420 | 739 € | | € - |
|
||||
| Ajout de 2 cartes SD (MicroSDHC/SDXC) de 16Go redondantes pour hyperviseur - Pour les 4 serveurs | | 4-3-1-14g047 | C6420 | 200 € | | € - |
|
||||
| Ajout de 2 cartes SD (MicroSDHC/SDXC) de 32Go redondantes pour hyperviseur - Pour les 4 serveurs | | 4-3-1-14g048 | C6420 | 379 € | | € - |
|
||||
| Ajout de 2 cartes SD (MicroSDHC/SDXC) de 64Go redondantes pour hyperviseur - Pour les 4 serveurs | | 4-3-1-14g049 | C6420 | 878 € | | € - |
|
||||
| | | | | | | € - |
|
||||
| Disques durs (passage) | | | | | | € - |
|
||||
| Passage à châssis avec 4 cartes mères format disques 2"5 | | 4-3-1-14g050 | C6420 | 370 € | | € - |
|
||||
| Passage à châssis avec 4 cartes mères format disques 2"5 NVMe | | 4-3-1-14g051 | C6420 | 399 € | | € - |
|
||||
| Passage au châssis sans disques (Retrait des 4x1To du châssis de base) / Carte BOSS obligatoire | | 4-3-1-14g184 | C6420 | -361 € | | € - |
|
||||
| | | | | | | € - |
|
||||
| Disques durs additionnels | | | | | | € - |
|
||||
| Ajout de disques durs hotplug 3,5" | | | | | | € - |
|
||||
| Ajout d'un disque dur 1 To SATA 7200 Tpm 3,5'' pour les 4 serveurs | | 4-3-1-14g096 | C6420 | 361 € | | € - |
|
||||
| Ajout d'un disque dur 1 To Nearline SAS 7200 Tpm 3,5"pour les 4 serveurs | | 4-3-1-14g097 | C6420 | 395 € | | € - |
|
||||
| Ajout d'un disque dur 2 To Nearline SAS 7200 Tpm 3,5"pour les 4 serveurs | | 4-3-1-14g098 | C6420 | 579 € | | € - |
|
||||
| Ajout d'un disque dur 4 To Nearline SAS 7200 Tpm 3,5"pour les 4 serveurs | | 4-3-1-14g099 | C6420 | 778 € | | € - |
|
||||
| Ajout d'un disque dur 8 To Nearline SAS 7200 Tpm 3,5"pour les 4 serveurs | | 4-3-1-14g101 | C6420 | 1,120 € | | € - |
|
||||
| Ajout d'un disque dur 12 To Nearline SAS 7200 Tpm 3,5"- hotplug | | 4-3-1-14g521 | C6420 | 1,680 € | | € - |
|
||||
| Ajout d'un disque dur 14 To Nearline SAS 7200 Tpm 3,5"- hotplug | | 4-3-1-14g522 | C6420 | 2,120 € | | € - |
|
||||
| Ajout d'un disque dur 4 To Nearline SAS 7200 Tpm 3,5"- SED FIPS140-2 pour les 4 serveurs | | 4-3-1-14g103 | C6420 | 898 € | | € - |
|
||||
| Ajout d'un disque dur 8 To Nearline SAS 7200 Tpm 3,5"- SED FIPS140-2 pour les 4 serveurs | | 4-3-1-14g104 | C6420 | 1,280 € | | € - |
|
||||
| Ajout de disques durs hotplug 2,5" | | | | | | € - |
|
||||
| Ajout d'un disque dur 1 To Nearline SAS 7200 Tpm 2,5" - Pour les 4 serveurs | | 4-3-1-14g105 | C6420 | 658 € | | € - |
|
||||
| Ajout d'un disque dur 2 To Nearline SAS 7200 Tpm 2,5" - Pour les 4 serveurs | | 4-3-1-14g106 | C6420 | 1,077 € | | € - |
|
||||
| Ajout d'un disque dur 300 Go SAS 15k Tpm 2,5" - Pour les 4 serveurs | | 4-3-1-14g108 | C6420 | 599 € | | € - |
|
||||
| Ajout d'un disque dur 600 Go SAS 10k Tpm 2,5" - Pour les 4 serveurs | | 4-3-1-14g109 | C6420 | 519 € | | € - |
|
||||
| Ajout d'un disque dur 600 Go SAS 15k Tpm 2,5" - Pour les 4 serveurs | | 4-3-1-14g110 | C6420 | 998 € | | € - |
|
||||
| Ajout d'un disque dur 900 Go SAS 15k Tpm 2,5" - Pour les 4 serveurs | | 4-3-1-14g111 | C6420 | 1,120 € | | € - |
|
||||
| Ajout d'un disque dur 1,2 To SAS 10k Tpm 2,5" - Pour les 4 serveurs | | 4-3-1-14g112 | C6420 | 660 € | | € - |
|
||||
| Ajout d'un disque dur 1,8 To SAS 10k Tpm 2,5" - Pour les 4 serveurs | | 4-3-1-14g113 | C6420 | 960 € | | € - |
|
||||
| Ajout d'un disque dur 2.4 To SAS 10k Tpm 2,5" - Pour les 4 serveurs | | 4-3-1-14g523 | C6420 | 1,400 € | | € - |
|
||||
| Ajout d'un disque dur 1,2 To SAS 10k Tpm 2,5" - SED FIPS140-2 - Pour les 4 serveurs | | 4-3-1-14g115 | C6420 | 740 € | | € - |
|
||||
| Disques SSD SATA Lecture Intensive | | | | | | € - |
|
||||
| Ajout d'un disque dur 480 Go SSD SATA Read Intensive - 2.5" - 1DWPD - 876TBW - Pour les 4 serveurs | | 4-3-1-14g300 | C6420 | 700 € | | € - |
|
||||
| Ajout d'un disque dur 960 Go SSD SATA Read Intensive - 2.5" - 1DWPD - 1752TBW - Pour les 4 serveurs | | 4-3-1-14g301 | C6420 | 1,320 € | | € - |
|
||||
| Ajout d'un disque dur 1.92 To SSD SATA Read Intensive - 2.5" - 1DWPD - 3504TBW - Pour les 4 serveurs | | 4-3-1-14g302 | C6420 | 2,400 € | | € - |
|
||||
| Ajout d'un disque dur 3.84 To SSD SATA Read Intensive - 2.5" - 1DWPD - 7008TBW - Pour les 4 serveurs | | 4-3-1-14g303 | C6420 | 5,000 € | | € - |
|
||||
| Disques SSD SATA Utilisation Mixte | | | | | | € - |
|
||||
| Ajout d'un disque dur 240 Go SSD SATA Mix Use - INTEL S4610 2.5" - 3DWPD - 1314TBW - Pour les 4 serveurs | | 4-3-1-14g196 | C6420 | 680 € | | € - |
|
||||
| Ajout d'un disque dur 480 Go SSD SATA Mix Use - 2.5" - 3DWPD - 2628TBW - Pour les 4 serveurs | | 4-3-1-14g304 | C6420 | 920 € | | € - |
|
||||
| Ajout d'un disque dur 960 Go SSD SATA Mix Use - 2.5" - 3DWPD - 5256TBW - Pour les 4 serveurs | | 4-3-1-14g305 | C6420 | 1,720 € | | € - |
|
||||
| Ajout d'un disque dur 1.92 To SSD SATA Mix Use - 2.5" - 3DWPD - 10512TBW - Pour les 4 serveurs | | 4-3-1-14g306 | C6420 | 3,400 € | | € - |
|
||||
| Disques SSD SAS Lecture Intensive | | | | | | € - |
|
||||
| Ajout d'un disque dur 960 Go SSD SAS Read Intensive - 2,5" - 1DWPD - 1752TBW - Pour les 4 serveurs | | 4-3-1-14g307 | C6420 | 2,000 € | | € - |
|
||||
| Ajout d'un disque dur 1.92 To SSD SAS Read Intensive - 2,5" - 1DWPD - 3504TBW - Pour les 4 serveurs | | 4-3-1-14g308 | C6420 | 3,120 € | | € - |
|
||||
| Ajout d'un disque dur 3.84 To SSD SAS Read Intensive - 2,5" - 1DWPD - 7008TBW - Pour les 4 serveurs | | 4-3-1-14g309 | C6420 | 6,200 € | | € - |
|
||||
| Disques SSD SAS Utilisation Mixte | | | | | | € - |
|
||||
| Ajout d'un disque dur 480 Go SSD SAS Mix Use - TOSHIBA PM5-SV 2,5" - 3DWPD - 2628TBW - Pour les 4 serveurs | | 4-3-1-14g133 | C6420 | 2,075 € | | € - |
|
||||
| Ajout d'un disque dur 800 Go SSD SAS Mix Use - 2.5'' - 3DWPD - 4360TBW - Pour les 4 serveurs | | 4-3-1-14g310 | C6420 | 1,800 € | | € - |
|
||||
| Ajout d'un disque dur 1.6 To SSD SAS Mix Use - 2,5" - 3DWPD - 8760TBW - Pour les 4 serveurs | | 4-3-1-14g311 | C6420 | 3,200 € | | € - |
|
||||
| Ajout d'un disque dur 3.84To SSD SAS Mix Use - 2,5" - 3DWPD - 21024TBW - Pour les 4 serveurs | | 4-3-1-14g136 | C6420 | 9,200 € | | € - |
|
||||
| Disques SSD SAS Ecriture Intensive | | | | | | € - |
|
||||
| Ajout d'un disque dur 400 Go SSD SAS Write Intensive - TOSHIBA PM5-M 2,5" - 10DWPD - 7300TBW - Pour les 4 serveurs | | 4-3-1-14g139 | C6420 | 2,800 € | | € - |
|
||||
| Ajout d'un disque dur 800 Go SSD SAS Write Intensive - TOSHIBA PM5-M 2,5" - 10DWPD - 14600TBW - Pour les 4 serveurs | | 4-3-1-14g140 | C6420 | 4,800 € | | € - |
|
||||
| Ajout d'un disque dur 1.6 To SSD SAS Write Intensive - TOSHIBA PM5-M 2,5" - 10DWPD - 29200TBW - Pour les 4 serveurs | | 4-3-1-14g141 | C6420 | 7,200 € | | € - |
|
||||
| | | | | | | € - |
|
||||
| Disques NVME 2.5'' | | | | | | € - |
|
||||
| Ajout d'un disque NVME 2.5'' Samsung PM1725 1.6 To Mix Use - Pour les 4 serveurs | | 4-3-1-14g143 | C6420 | 4,400 € | | € - |
|
||||
| Ajout d'un disque NVME 2.5'' Samsung PM1725 3.2 To Mix Use - Pour les 4 serveurs | | 4-3-1-14g202 | C6420 | 8,800 € | | € - |
|
||||
| Ajout d'un disque NVME 2.5'' Samsung PM1725 6.4 To Mix Use - Pour les 4 serveurs | | 4-3-1-14g203 | C6420 | 17,600 € | | € - |
|
||||
| Ajout d'un disque NVME 2.5'' INTEL P4510 1 To Read Intensive - Pour les 4 serveurs | | 4-3-1-14g204 | C6420 | 1,840 € | | € - |
|
||||
| Ajout d'un disque NVME 2.5'' INTEL P4610 1.6 To Mix Use - Pour les 4 serveurs | | 4-3-1-14g207 | C6420 | 4,400 € | | € - |
|
||||
| Ajout d'un disque NVME 2.5'' INTEL P4610 3.2 To Mix Use - Pour les 4 serveurs | | 4-3-1-14g208 | C6420 | 8,800 € | | € - |
|
||||
| | | | | | | € - |
|
||||
| Cartes interfaces | | | | | | € - |
|
||||
| Ajout d'une carte RAID H330 SAS/SATA RAID 0,1,5, 10 & 50 pour les 4 serveurs | | 4-3-1-14g145 | C6420 | 410 € | | € - |
|
||||
| Ajout d'une carte RAID H730p SAS/SATA RAID 0,1,5, 10 & 50 avec 2Go de cache pour les 4 serveurs | | 4-3-1-14g146 | C6420 | 928 € | | € - |
|
||||
| | | | | | | € - |
|
||||
| Cartes I/O additionnelles | | | | | | € - |
|
||||
| Ajout carte réseau Intel I350 deux ports gigabit pour les 4 serveurs | | 4-3-1-14g147 | C6420 | 260 € | | € - |
|
||||
| Ajout carte réseau Intel X550 deux ports 10 Gb Base-T pour les 4 serveurs | | 4-3-1-14g149 | C6420 | 798 € | | € - |
|
||||
| Ajout carte réseau Intel XL710 deux ports 40 Gb QSFP+ pour les 4 serveurs | | 4-3-1-14g150 | C6420 | 1,481 € | | € - |
|
||||
| Ajout carte réseau Intel X710 deux ports 10 Gb SFP+ pour les 4 serveurs | | 4-3-1-14g151 | C6420 | 1,159 € | 1 | € 1,159.00 |
|
||||
| Ajout carte réseau Intel X710 quatre ports 10 Gb Base-T pour les 4 serveurs | | 4-3-1-14g152 | C6420 | 1,575 € | | € - |
|
||||
| Ajout carte Mellanox ConnectX-4 Lx Dual Port 25Gb SFP28 pour les 4 serveurs | | 4-3-1-14g155 | C6420 | 1,037 € | | € - |
|
||||
| Ajout carte SolarFlare 8522 10Gb 2 Ports SFP+ pour les 4 serveurs | | 4-3-1-14g156 | C6420 | 678 € | | € - |
|
||||
| Ajout carte Broadcom 57412 10G SFP+ Dual Ports pour les 4 serveurs | | 4-3-1-14g157 | C6420 | 718 € | | € - |
|
||||
| Ajout carte Broadcom 57414 25G SFP28 Dual Ports pour les 4 serveurs | | 4-3-1-14g158 | C6420 | 818 € | | € - |
|
||||
| Ajout carte Broadcom 57416 10G Base-T Dual Ports pour les 4 serveurs | | 4-3-1-14g159 | C6420 | 758 € | | € - |
|
||||
| Ajout carte QLogic 41112 Dual Port 10GbE SFP+ pour les 4 serveurs | | 4-3-1-14g160 | C6420 | 718 € | | € - |
|
||||
| Ajout carte QLogic 41162 Dual Port 10GbE Base-T pour les 4 serveurs | | 4-3-1-14g161 | C6420 | 758 € | | € - |
|
||||
| Ajout carte QLogic 41262 Dual Port 25GbE SFP28 pour les 4 serveurs | | 4-3-1-14g162 | C6420 | 819 € | | € - |
|
||||
| Dell Networking Câble Direct Attach Twinaxial SFP+ DELL 3 mètres | | 4-3-1-14g209 | C6420 | 25 € | | € - |
|
||||
| Dell Networking Câble Direct Attach Twinaxial SFP28 (25G) DELL 3 mètres | | 4-3-1-14g210 | C6420 | 105 € | | € - |
|
||||
| | | | | | | € - |
|
||||
| Carte d'administration à distance | | | | | | € - |
|
||||
| Passage à carte iDRAC 9 Enterprise pour les 4 serveurs | | 4-3-1-14g163 | C6420 | 68 € | 1 | € 68.00 |
|
||||
| Passage à carte iDRAC 9 Enterprise avec carte SD Vflash 16 GB pour les 4 serveurs | | 4-3-1-14g164 | C6420 | 273 € | | € - |
|
||||
| Activation d'iDRAC9 Group Manager pour les 4 serveurs | | 4-3-1-14g165 | C6420 | 0 € | | € - |
|
||||
| Mot de passe iDRAC9 Classique pour les 4 serveurs | | 4-3-1-14g166 | C6420 | 0 € | | € - |
|
||||
| Mot de passe iDRAC9 Aléatoire pour les 4 serveurs | | 4-3-1-14g167 | C6420 | 0 € | | € - |
|
||||
| | | | | | | € - |
|
||||
| Alimentations redondantes | | | | | | € - |
|
||||
| Passage à double alimentation redondante 2000W (C19/C20) Platinium (1+1) avec 2 câbles d'alimentation C19-C20 de 2.5m | | 4-3-1-14g169 | C6420 | 250 € | | € - |
|
||||
| Passage à double alimentation redondante 2400W (C19/C20) Platinium (1+1) avec 2 câbles d'alimentation C19-C20 de 2.5m | | 4-3-1-14g170 | C6420 | 350 € | 1 | € 350.00 |
|
||||
| Passage de câble d'alimentation de 2m à 0,6cm | | 4-2-14g173 | C6420 | 0 € | | € - |
|
||||
| Passage de câble d'alimentation de 2m à 4m | | 4-2-14g174 | C6420 | 0 € | | € - |
|
||||
| | | | | | | € - |
|
||||
| Kit de mise en rack (préciser les modèles de serveurs concernés) | | | | | | € - |
|
||||
| Kit de mise en rack inclus de base pour le Poweredge C6420 | | 4-3-1-14g171 | C6420 | 0 € | | € - |
|
||||
| | | | | | | € - |
|
||||
| Cartes réseau haut-débit pour les applications HPC (préciser les modèles de serveurs concernés) | | | | | | € - |
|
||||
| Intel® Omni-Path Host Fabric Interface Adapter 100 Series 1 Port PCIe x16 - Pour les 4 serveurs | | 4-3-1-14g172 | C6420 | 1,638 € | | € - |
|
||||
| ConnectX-4 VPI adapter card, EDR IB (100Gb/s), Double-port SFP28 - Pour les 4 serveurs | | 4-3-1-14g174 | C6420 | 4,988 € | | € - |
|
||||
| ConnectX-4 VPI adapter card, EDR IB (100Gb/s), single-port SFP28 - Pour les 4 serveurs | | 4-3-1-14g175 | C6420 | 2,853 € | | € - |
|
||||
| ConnectX-4 adapter card, 100Gbits Dual-ports QSFP+ - Pour les 4 serveurs | | 4-3-1-14g176 | C6420 | 2,853 € | | € - |
|
||||
| Carte Mellanox ConnectX-5 Simple Port EDR VPI QSFP28 - Pour les 4 serveurs | | 4-3-1-14g-212 | C6420 | 2,814 € | | € - |
|
||||
| Carte Mellanox ConnectX-6 Simple Port HDR100 100Gbits - Pour les 4 serveurs | | 4-3-1-14g706 | C6420 | 2,816 € | | € - |
|
||||
| | | | | | | € - |
|
||||
| Extensions de garanties acquises lors de l'achat initial | | | | | | € - |
|
||||
| Gardez votre disque dur - KYHD 5 ans - Par châssis | | 4-3-1-14g-213 | C6420 | 280 € | | € - |
|
||||
| Gardez votre disque dur - KYHD 7 ans - Par châssis | | 4-3-1-14g-214 | C6420 | 380 € | | € - |
|
||||
| Extension de garantie 5 ans intervention H+4 (24h/24h, 7j/7j) DELL Prosupport pour le châssis et les 4 serveurs | | 4-3-1-14g177 | C6420 | 750 € | | € - |
|
||||
| Extension de garantie 7 ans intervention J+1 (heures ouvrées, jours ouvrés) DELL Prosupport pour le châssis et les 4 serveurs | | 4-3-1-14g178 | C6420 | 1,100 € | 1 | € 1,100.00 |
|
||||
| | | | | | | |
|
Can't render this file because it contains an unexpected character in line 3 and column 98.
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
177
concho/config.py
177
concho/config.py
|
@ -1,19 +1,38 @@
|
|||
from typing import Dict, List, Optional
|
||||
import re
|
||||
from abc import abstractmethod
|
||||
import numpy
|
||||
# from concho import dell
|
||||
import math
|
||||
from pathlib import Path
|
||||
import copy
|
||||
|
||||
ItemUid = str # eg 'dell-poweredge-c640'
|
||||
CpuId = str # eg 'intel-xeon-gold-6140'
|
||||
CpuArchitecture = str # eg 'icelake'
|
||||
SimdId = str # eg 'avx2'
|
||||
MemType = str # eg 'rdimm', 'pmm' (persistent memory module)
|
||||
TransistorSize = int # transistor size (in nm)
|
||||
Price = float # price in euros excluding vat
|
||||
ComponentId = str # eg 'processor', 'ram', 'processor-change'
|
||||
MemSize = float # memory size in bytes
|
||||
MemSizeGb = int # memory size in Gibibytes
|
||||
Power = float # power in watts
|
||||
|
||||
|
||||
class Item():
|
||||
uid: ItemUid
|
||||
|
||||
def __init__(self, uid):
|
||||
self.uid = uid
|
||||
|
||||
|
||||
class Chassis(Item):
|
||||
max_num_servers: int
|
||||
num_cpu_slots_per_server: int
|
||||
num_dimm_slots_per_channel: int
|
||||
|
||||
def __init__(self, uid):
|
||||
def __init__(self, uid: ItemUid):
|
||||
super().__init__(uid)
|
||||
self.max_num_servers = 1
|
||||
self.num_cpu_slots_per_server = 2
|
||||
|
@ -25,6 +44,9 @@ class Chassis(Item):
|
|||
|
||||
|
||||
class Dimm(Item):
|
||||
num_gb: int
|
||||
num_mhz: int
|
||||
mem_type: MemType
|
||||
|
||||
def __init__(self, num_gb, num_mhz, mem_type):
|
||||
uid = "%s-%s-%s" % (mem_type, num_gb, num_mhz)
|
||||
|
@ -35,10 +57,15 @@ class Dimm(Item):
|
|||
|
||||
|
||||
class Cpu(Item):
|
||||
clock: float # in GHz
|
||||
num_cores: int
|
||||
max_cpus: int # how many such cpus can be put on the same motherboard
|
||||
tdp: Power # TDP of the cpu, in Watts
|
||||
cpumark: float # cpu mark
|
||||
|
||||
def __init__(self, proc_id):
|
||||
def __init__(self, proc_id: CpuId):
|
||||
super().__init__(proc_id)
|
||||
cpuTable = numpy.genfromtxt('cpu_table.tsv', dtype=("|U32", float, int, float, float, float), names=True, delimiter='\t')
|
||||
cpuTable = numpy.genfromtxt('catalogs/cpu_table.tsv', dtype=("|U32", float, int, float, float, float), names=True, delimiter='\t')
|
||||
for cpu_id, clock, num_cores, max_cpus, tdp, cpumark in zip(cpuTable['id'], cpuTable['clock'], cpuTable['num_cores'], cpuTable['max_cpus'], cpuTable['tdp'], cpuTable['cpumark_1_cpu']):
|
||||
# print(cpu_id)
|
||||
if cpu_id == proc_id:
|
||||
|
@ -52,7 +79,7 @@ class Cpu(Item):
|
|||
self.cpumark = cpumark
|
||||
|
||||
@property
|
||||
def architecture(self):
|
||||
def architecture(self) -> CpuArchitecture:
|
||||
proc_id = self.uid
|
||||
if re.match('intel-core-i[357]-8[0-9][0-9][0-9][ktbuh]', proc_id):
|
||||
return 'coffeelake'
|
||||
|
@ -98,7 +125,7 @@ class Cpu(Item):
|
|||
assert False, 'unhandled processor id : %s' % proc_id
|
||||
|
||||
@property
|
||||
def num_dp_flop_per_cycle(self):
|
||||
def num_dp_flop_per_cycle(self) -> int:
|
||||
proc_arch = self.architecture
|
||||
simd_id = get_simd_id(proc_arch)
|
||||
num_simd_per_core = 1
|
||||
|
@ -144,7 +171,7 @@ class Cpu(Item):
|
|||
return dp_flops_per_cycle
|
||||
|
||||
@property
|
||||
def num_ram_channels(self):
|
||||
def num_ram_channels(self) -> int:
|
||||
return {
|
||||
'skylake': 6,
|
||||
'coffeelake': 6,
|
||||
|
@ -155,11 +182,11 @@ class Cpu(Item):
|
|||
}[self.architecture]
|
||||
|
||||
|
||||
def get_proc_architecture(proc_id):
|
||||
def get_proc_architecture(proc_id: CpuId):
|
||||
return Cpu(proc_id).architecture
|
||||
|
||||
|
||||
def get_proc_arch_transistor_size(proc_id):
|
||||
def get_proc_arch_transistor_size(proc_id: CpuId) -> TransistorSize:
|
||||
return {
|
||||
'woodcrest': 65,
|
||||
'harpertown': 45,
|
||||
|
@ -175,7 +202,7 @@ def get_proc_arch_transistor_size(proc_id):
|
|||
}[get_proc_architecture(proc_id)]
|
||||
|
||||
|
||||
def simd_id_to_dp_flops_per_cycle(simd_id):
|
||||
def simd_id_to_dp_flops_per_cycle(simd_id: SimdId) -> int:
|
||||
"""
|
||||
:param str simd_id: eg 'avx2'
|
||||
|
||||
|
@ -208,7 +235,7 @@ def simd_id_to_dp_flops_per_cycle(simd_id):
|
|||
}[simd_id]
|
||||
|
||||
|
||||
def get_simd_id(proc_arch):
|
||||
def get_simd_id(proc_arch: CpuArchitecture) -> SimdId:
|
||||
"""
|
||||
:param str proc_arch: eg 'broadwell'
|
||||
:return str: eg 'sse4'
|
||||
|
@ -236,18 +263,50 @@ def get_simd_id(proc_arch):
|
|||
|
||||
|
||||
class MemChannel():
|
||||
dimms: List[Dimm]
|
||||
|
||||
def __init__(self):
|
||||
self.dimms = []
|
||||
|
||||
|
||||
class CpuSlotMem():
|
||||
mem_channels: List[MemChannel]
|
||||
|
||||
def __init__(self):
|
||||
self.mem_channels = []
|
||||
|
||||
|
||||
class Option():
|
||||
'''an option in a machine configuration
|
||||
'''
|
||||
item: Item # the item describing this option
|
||||
price: Price # the price of this option, excluding vat
|
||||
|
||||
def __init__(self, item: Item, price: Price):
|
||||
self.item = item
|
||||
self.price = price
|
||||
|
||||
|
||||
class Module():
|
||||
'''a configurable machine component, for which there are options (eg ram, cpu)
|
||||
'''
|
||||
name: ComponentId # eg 'processor', 'ram', 'processor-change'
|
||||
options: Dict[ItemUid, Option]
|
||||
|
||||
def __init__(self, name: ComponentId):
|
||||
self.name = name
|
||||
self.options = {}
|
||||
|
||||
def add_option(self, option: Option):
|
||||
self.options[option.item.uid] = option
|
||||
|
||||
|
||||
class Config():
|
||||
configurator: 'Configurator'
|
||||
num_servers: int
|
||||
_num_cpu_per_server: int
|
||||
cpu: Optional[Cpu]
|
||||
cpu_slots_mem: List[CpuSlotMem]
|
||||
|
||||
def __init__(self, configurator):
|
||||
self.configurator = configurator
|
||||
|
@ -257,11 +316,11 @@ class Config():
|
|||
self.cpu_slots_mem = []
|
||||
|
||||
@property
|
||||
def chassis(self):
|
||||
def chassis(self) -> ItemUid:
|
||||
return self.configurator.chassis.item
|
||||
|
||||
@staticmethod
|
||||
def _find_dimm_combination(num_dimm_slots_per_channel, min_ram_per_channel, available_dimms):
|
||||
def _find_dimm_combination(num_dimm_slots_per_channel: int, min_ram_per_channel: int, available_dimms: List['Option']) -> List[Dimm]:
|
||||
available_dimms.append(Option(Dimm(0, 0, 'dummy'), 0.0)) # fake dimm to represent empty slot
|
||||
slot_options = []
|
||||
|
||||
|
@ -302,7 +361,8 @@ class Config():
|
|||
slot_dimms.append(dimm)
|
||||
return slot_dimms
|
||||
|
||||
def set_ram(self, ram_per_core=None, ram_per_server=None, ram_per_cpu=None):
|
||||
def set_ram(self, ram_per_core: Optional[MemSize] = None, ram_per_server: Optional[MemSize] = None, ram_per_cpu: Optional[MemSize] = None):
|
||||
'''populates this config's memory slots'''
|
||||
|
||||
# ramUpgradePrice128Gb = {
|
||||
# 'c6220':3520.0,
|
||||
|
@ -338,7 +398,7 @@ class Config():
|
|||
mem_channel.dimms[dimm_slot_index] = slot_dimms[dimm_slot_index]
|
||||
|
||||
@property
|
||||
def ram_size(self):
|
||||
def ram_size(self) -> MemSizeGb:
|
||||
ram_size = 0
|
||||
for cpu_slot_mem in self.cpu_slots_mem:
|
||||
for mem_channel in cpu_slot_mem.mem_channels:
|
||||
|
@ -350,7 +410,7 @@ class Config():
|
|||
return ram_size
|
||||
|
||||
@property
|
||||
def ram_price(self):
|
||||
def ram_price(self) -> Price:
|
||||
ram_price = 0.0
|
||||
for cpu_slot_mem in self.cpu_slots_mem:
|
||||
for mem_channel in cpu_slot_mem.mem_channels:
|
||||
|
@ -361,19 +421,19 @@ class Config():
|
|||
ram_price += self.num_servers * dimm_price
|
||||
return ram_price
|
||||
|
||||
def get_price(self):
|
||||
def get_price(self) -> Price:
|
||||
price = self.configurator.chassis.price
|
||||
print(self.cpu.uid, self.configurator.chassis.price, self.configurator.get_item_price(self.cpu.uid), self.ram_price)
|
||||
price += self.num_servers * self.num_cpu_per_server * self.configurator.get_item_price(self.cpu.uid) + self.ram_price
|
||||
assert price > 0.0
|
||||
return price
|
||||
|
||||
def get_power_consumption(self):
|
||||
def get_power_consumption(self) -> Power:
|
||||
server_base_power_consumption = 100.0 # rough estimation in watts
|
||||
power_consumption = (self.cpu.tdp * self.num_cpu_per_server + server_base_power_consumption) * self.num_servers
|
||||
return power_consumption
|
||||
|
||||
def get_flops(self):
|
||||
def get_flops(self) -> float:
|
||||
# print('%d servers * %d cpu %s * %d cores @ %f (%d flops/cycle)' % (self.num_servers, self.num_cpu_per_server, str(self.cpu.uid), self.cpu.num_cores, self.cpu.clock, self.cpu.num_dp_flop_per_cycle))
|
||||
dynamic_frequency_scaling = 1.0 # https://en.wikichip.org/wiki/intel/frequency_behavior
|
||||
# https://www.nas.nasa.gov/hecc/support/kb/cascade-lake-processors_579.html
|
||||
|
@ -407,78 +467,63 @@ class Config():
|
|||
cpu_slot_mem.mem_channels.append(mem_channel)
|
||||
self.cpu_slots_mem.append(cpu_slot_mem)
|
||||
|
||||
def set_cpu(self, cpu):
|
||||
def set_cpu(self, cpu: Cpu):
|
||||
self.cpu = cpu
|
||||
# update the dimm slots accordingly
|
||||
self._init_dimm_slots()
|
||||
|
||||
@property
|
||||
def num_cpu_per_server(self):
|
||||
def num_cpu_per_server(self) -> int:
|
||||
return self._num_cpu_per_server
|
||||
|
||||
@num_cpu_per_server.setter
|
||||
def num_cpu_per_server(self, num_cpu_per_server):
|
||||
def num_cpu_per_server(self, num_cpu_per_server: int):
|
||||
self._num_cpu_per_server = num_cpu_per_server
|
||||
# update the dimm slots accordingly
|
||||
self._init_dimm_slots()
|
||||
|
||||
@property
|
||||
def num_cpus(self):
|
||||
def num_cpus(self) -> int:
|
||||
return self.num_cpu_per_server * self.num_servers
|
||||
|
||||
|
||||
class Option():
|
||||
|
||||
def __init__(self, item, price):
|
||||
self.item = item
|
||||
self.price = price
|
||||
|
||||
|
||||
class Module():
|
||||
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
self.options = {}
|
||||
|
||||
def add_option(self, option):
|
||||
self.options[option.item.uid] = option
|
||||
|
||||
|
||||
class Configurator():
|
||||
modules: Dict[ComponentId, Module]
|
||||
|
||||
def __init__(self, name):
|
||||
def __init__(self, name: ComponentId):
|
||||
self.modules = {}
|
||||
|
||||
@abstractmethod
|
||||
def create_config(self):
|
||||
def create_config(self) -> Config:
|
||||
'''create a working basic configuration (basic cpu, basic ram), that can be tweaked later on'''
|
||||
assert False
|
||||
|
||||
def add_module(self, module):
|
||||
def add_module(self, module: Module):
|
||||
self.modules[module.name] = module
|
||||
|
||||
def get_cpu_options(self):
|
||||
def get_cpu_options(self) -> List[Cpu]:
|
||||
return [Cpu(option.item.uid) for option in self.modules['processor'].options.values()]
|
||||
|
||||
def get_ram_options(self):
|
||||
def get_ram_options(self) -> List[Option]:
|
||||
return self.modules['ram'].values()
|
||||
|
||||
def get_dimm(self, dimm_capacity):
|
||||
def get_dimm(self, dimm_capacity: MemSizeGb) -> Dimm:
|
||||
for dimm_option in self.modules['ram'].options.values():
|
||||
dimm = dimm_option.item
|
||||
# print(dimm.num_gb)
|
||||
if dimm.num_gb == dimm_capacity:
|
||||
if dimm.num_gb == MemSizeGb:
|
||||
return dimm
|
||||
assert False, 'failed to find an option for a dimm of capacity %d gb' % dimm_capacity
|
||||
|
||||
def get_dimm_options(self):
|
||||
def get_dimm_options(self) -> List[Option]:
|
||||
return list(self.modules['ram'].options.values())
|
||||
|
||||
def get_item(self, item_uid):
|
||||
def get_item(self, item_uid: ItemUid) -> Item:
|
||||
for module in self.modules.values():
|
||||
if item_uid in module.options:
|
||||
return module.options[item_uid].item
|
||||
|
||||
def get_item_price(self, item_uid):
|
||||
def get_item_price(self, item_uid: ItemUid) -> Price:
|
||||
for module in self.modules.values():
|
||||
if item_uid in module.options:
|
||||
return module.options[item_uid].price
|
||||
|
@ -490,7 +535,7 @@ class TableBasedConfigurator(Configurator):
|
|||
self.host_type_id = host_type_id
|
||||
self.num_cpu_per_server = num_cpu_per_server
|
||||
self.num_servers = num_servers
|
||||
self.dell_price_table = numpy.genfromtxt('dell_procoptions_table.dat', dtype=("|U15", "|U15", float), names=True, delimiter='\t')
|
||||
self.dell_price_table = numpy.genfromtxt(Path('catalogs/dell/dell_procoptions_table.tsv'), dtype=("|U15", "|U15", float), names=True, delimiter='\t')
|
||||
self.base_config = Config(self)
|
||||
self.base_config.num_servers = self.num_servers
|
||||
self.base_config.num_cpu_per_server = self.num_cpu_per_server
|
||||
|
@ -519,6 +564,38 @@ class TableBasedConfigurator(Configurator):
|
|||
return supported_cpus
|
||||
|
||||
|
||||
class IHtmlConfiguratorParser():
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def parse(self, configurator_html_file_path: Path, configurator: Configurator):
|
||||
'''parses configurator_html_file_path to build configurator'''
|
||||
pass
|
||||
|
||||
|
||||
class HtmlConfigurator(Configurator):
|
||||
'''
|
||||
a configurator using a server configurator web page from matinfo
|
||||
'''
|
||||
|
||||
def __init__(self, configurator_html_file_path: Path, html_parser: IHtmlConfiguratorParser):
|
||||
super().__init__(self)
|
||||
self.base_config = None
|
||||
self.chassis = None
|
||||
html_parser.parse(configurator_html_file_path, self)
|
||||
|
||||
def create_config(self):
|
||||
# config = copy.deepcopy(self.base_config)
|
||||
config = Config(self)
|
||||
config.num_servers = self.base_config.num_servers
|
||||
config.num_cpu_per_server = self.base_config.num_cpu_per_server
|
||||
config.set_cpu(self.base_config.cpu)
|
||||
config.cpu_slots_mem = copy.deepcopy(self.base_config.cpu_slots_mem)
|
||||
|
||||
return config
|
||||
|
||||
# def create_host_type(host_type_id):
|
||||
# if host_type_id == 'c6420':
|
||||
# return dell.DellPowerEdgeC6420(host_type_id)
|
||||
|
|
|
@ -6,6 +6,7 @@ from concho.config import Option
|
|||
from concho.config import Config
|
||||
from concho.config import Chassis
|
||||
from concho.config import Cpu, Dimm
|
||||
from concho.config import IHtmlConfiguratorParser
|
||||
|
||||
from abc import abstractmethod
|
||||
# from xml.dom.minidom import parse
|
||||
|
@ -382,7 +383,7 @@ class DellPowerEdgeC6420(TableBasedConfigurator):
|
|||
return 361.0
|
||||
|
||||
|
||||
class DellConfiguratorParser():
|
||||
class DellConfiguratorParser(IHtmlConfiguratorParser):
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
@ -860,28 +861,6 @@ class DellConfiguratorParser2021(DellConfiguratorParser):
|
|||
return base_price
|
||||
|
||||
|
||||
class MatinfoConfigurator(Configurator):
|
||||
'''
|
||||
a configurator using a server configurator web page from matinfo
|
||||
'''
|
||||
|
||||
def __init__(self, configurator_html_file_path: Path, html_parser):
|
||||
super().__init__(self)
|
||||
self.base_config = None
|
||||
self.chassis = None
|
||||
html_parser.parse(configurator_html_file_path, self)
|
||||
|
||||
def create_config(self):
|
||||
# config = copy.deepcopy(self.base_config)
|
||||
config = Config(self)
|
||||
config.num_servers = self.base_config.num_servers
|
||||
config.num_cpu_per_server = self.base_config.num_cpu_per_server
|
||||
config.set_cpu(self.base_config.cpu)
|
||||
config.cpu_slots_mem = copy.deepcopy(self.base_config.cpu_slots_mem)
|
||||
|
||||
return config
|
||||
|
||||
|
||||
class DellMatinfoCsvConfigurator(Configurator):
|
||||
'''
|
||||
a configurator using the excel sheet from dell matinfo
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
from typing import Dict, List
|
||||
from typing import Dict, List, Any
|
||||
from pathlib import Path
|
||||
from concho.config import Module
|
||||
from concho.config import Option
|
||||
from concho.config import Config
|
||||
from concho.config import Chassis
|
||||
from concho.config import Cpu, Dimm
|
||||
from concho.config import IHtmlConfiguratorParser
|
||||
|
||||
# from xml.dom.minidom import parse
|
||||
from lxml.html import parse
|
||||
from lxml.html import parse as parse_html
|
||||
import re
|
||||
|
||||
|
||||
|
@ -220,7 +221,7 @@ class HpeCatalogWoutCpuParser(HpeCatalogParser):
|
|||
return base_config
|
||||
|
||||
|
||||
class HpeConfiguratorParser():
|
||||
class HpeConfiguratorParser(IHtmlConfiguratorParser):
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
@ -262,8 +263,8 @@ class HpeConfiguratorParser():
|
|||
assert False
|
||||
|
||||
@staticmethod
|
||||
def _get_db_as_tree(hpe_configurator_html_file_path: Path):
|
||||
html_root = parse(str(hpe_configurator_html_file_path)).getroot()
|
||||
def _get_db_as_tree(hpe_configurator_html_file_path: Path) -> Dict[str, Any]:
|
||||
html_root = parse_html(str(hpe_configurator_html_file_path)).getroot()
|
||||
import json
|
||||
|
||||
script_elements = html_root.xpath(".//script[@type='text/javascript']")
|
||||
|
@ -385,7 +386,7 @@ class HpeConfiguratorParser():
|
|||
# builds a configurator by parsing one of hpe configurator's pages
|
||||
# as input, it expects a html page saved from a configurator in which the cpu choice only appears when the user sets a quantity of 0 in front of the selected cpu.
|
||||
# So, to create a html file compatible with this parser:
|
||||
# 1. on hpe's matingo web page, chose a configuration for which the the cpu choice only appears when the user sets a quantity of 0 in front of the selected cpu (eg cat2-conf10)
|
||||
# 1. on hpe's matinfo web page, choose a configuration for which the the cpu choice only appears when the user sets a quantity of 0 in front of the selected cpu (eg cat2-conf10)
|
||||
# 2. on this page, set the number of cpu to 0. This causes a popup window to appear; this popup window contains all the cpu choices. Only when this popup window is shown save the page as html (because the catalog contained in the embedded javascript contains all the options except for cpu options).
|
||||
class HpeCpuChoiceConfiguratorParser(HpeConfiguratorParser):
|
||||
|
||||
|
@ -403,7 +404,7 @@ class HpeCpuChoiceConfiguratorParser(HpeConfiguratorParser):
|
|||
|
||||
def parse_proc_change_options(self, hpe_configurator_html_file_path: Path):
|
||||
# find the proc options in the cpu options popup window as these options are not present in the hpe_catalog of this page
|
||||
html_root = parse(str(hpe_configurator_html_file_path)).getroot()
|
||||
html_root = parse_html(str(hpe_configurator_html_file_path)).getroot()
|
||||
|
||||
proc_options = Module('processor-change')
|
||||
# module_root_element = self._get_module(html_root, 'Processeurs (Passage)')
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from typing import List
|
||||
from abc import abstractmethod
|
||||
import numpy
|
||||
# import pylab
|
||||
|
@ -10,7 +11,7 @@ import hashlib
|
|||
# from string import ascii_lowercase
|
||||
# from concho.config import Configurator
|
||||
# from concho.config import Config
|
||||
from concho.config import Cpu
|
||||
from concho.config import Cpu, MemSize, Configurator
|
||||
# from concho import dell
|
||||
|
||||
markerTypes = [',', '+', '.', '^', 'v', '<', '>', 'o', '*', '1', '2', '3', '4', '8', 's', 'p', 'h', 'H', 'x', 'X', 'D', 'd', '|', '_']
|
||||
|
@ -109,7 +110,7 @@ class ConfigFlopsPerEuro(ConfigAxisDef):
|
|||
return u'num total DP operations/total cost [€/^-1]'
|
||||
|
||||
def get_value_for_config(self, config):
|
||||
kWHPrice = 0.30 # from yjuet on 20/01/2023 : 300€/MWh
|
||||
kWHPrice = 0.08 # from yjuet on 20/01/2023 : 300€/MWh
|
||||
containerLifetime = 7.0 # in years
|
||||
powerUsageEfficiency = 0.5
|
||||
|
||||
|
@ -201,7 +202,7 @@ def plot_configs(configs, xaxis_def, yaxis_def, plot_title):
|
|||
# marker = get_marker_from_label( label )
|
||||
# print(x1, y1)
|
||||
short_label = config_label.replace('dell-poweredge-', '').replace('intel-xeon-', '').replace('hpe-proliant-', '').replace('-gen', '-g')
|
||||
plt.scatter(x1, y1, facecolors=color, s=(markerSize * len(create_unique_marker(config_index))), marker='$\mathrm{%s}$' % create_unique_marker(config_index), label=short_label)
|
||||
plt.scatter(x1, y1, facecolors=color, s=(markerSize * len(create_unique_marker(config_index))), marker=r'$\mathrm{%s}$' % create_unique_marker(config_index), label=short_label)
|
||||
if False: # y1 > 5.0e16:
|
||||
plt.annotate(u'%s' % short_label,
|
||||
xy=(x1, y1), xytext=(x1 * 4.0, (y1 - 5.2e16) * 7.1),
|
||||
|
@ -224,7 +225,7 @@ def plot_configs(configs, xaxis_def, yaxis_def, plot_title):
|
|||
plt.show()
|
||||
|
||||
|
||||
def plot_configurators(configurators, ram_per_core, xaxis_def, yaxis_def, plot_title, config_filter=lambda config: True):
|
||||
def plot_configurators(configurators: List[Configurator], ram_per_core: MemSize, xaxis_def, yaxis_def, plot_title, config_filter=lambda config: True):
|
||||
configs = []
|
||||
for configurator in configurators:
|
||||
for cpu in configurator.get_cpu_options():
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from pathlib import Path
|
||||
from concho.dell import DellMatinfoCsvConfigurator
|
||||
from concho.dell import MatinfoConfigurator
|
||||
from concho.config import HtmlConfigurator
|
||||
from concho.dell import DellConfiguratorParser2020
|
||||
from concho.dell import DellConfiguratorParser2021
|
||||
from concho.hpe import HpeConfiguratorParser, HpeCpuChoiceConfiguratorParser
|
||||
|
@ -11,12 +11,12 @@ from concho.procs_chooser import ConfigFlopsPerEuro
|
|||
|
||||
|
||||
def test_all_matinfo_2020_configs():
|
||||
# configurator = DellMatinfoConfigurator('rcrc1406676-4834664 - Cat2 Conf4 PowerEdge R640 - Dell.html')
|
||||
# configurator = DellHtmlConfigurator('rcrc1406676-4834664 - Cat2 Conf4 PowerEdge R640 - Dell.html')
|
||||
# print(configurator)
|
||||
configurators = [
|
||||
DellMatinfoCsvConfigurator(Path('c6420-20200716-price.tsv')),
|
||||
MatinfoConfigurator(Path('rcrc1406676-4834664 - Cat2 Conf4 PowerEdge R640 - Dell.html'), DellConfiguratorParser2020()),
|
||||
MatinfoConfigurator(Path('rcrc1406676-4824727 - Cat 2 Conf 7 PowerEdge R940 - Dell.html'), DellConfiguratorParser2020()),
|
||||
DellMatinfoCsvConfigurator(Path('catalogs/dell/c6420-20200716-price.tsv')),
|
||||
HtmlConfigurator(Path('catalogs/dell/rcrc1406676-4834664 - Cat2 Conf4 PowerEdge R640 - Dell.html'), DellConfiguratorParser2020()),
|
||||
HtmlConfigurator(Path('catalogs/dell/rcrc1406676-4824727 - Cat 2 Conf 7 PowerEdge R940 - Dell.html'), DellConfiguratorParser2020()),
|
||||
# dell.DellPowerEdgeR940(),
|
||||
]
|
||||
|
||||
|
@ -24,12 +24,12 @@ def test_all_matinfo_2020_configs():
|
|||
|
||||
|
||||
def test_credits_2020_configs():
|
||||
# configurator = DellMatinfoConfigurator('rcrc1406676-4834664 - Cat2 Conf4 PowerEdge R640 - Dell.html')
|
||||
# configurator = DellHtmlConfigurator('rcrc1406676-4834664 - Cat2 Conf4 PowerEdge R640 - Dell.html')
|
||||
# print(configurator)
|
||||
configurators = [
|
||||
DellMatinfoCsvConfigurator(Path('c6420-20200716-price.tsv')),
|
||||
MatinfoConfigurator(Path('rcrc1406676-4834664 - Cat2 Conf4 PowerEdge R640 - Dell.html'), DellConfiguratorParser2020()),
|
||||
MatinfoConfigurator(Path('rcrc1406676-4824727 - Cat 2 Conf 7 PowerEdge R940 - Dell.html'), DellConfiguratorParser2020()),
|
||||
DellMatinfoCsvConfigurator(Path('catalogs/dell/c6420-20200716-price.tsv')),
|
||||
HtmlConfigurator(Path('catalogs/dell/rcrc1406676-4834664 - Cat2 Conf4 PowerEdge R640 - Dell.html'), DellConfiguratorParser2020()),
|
||||
HtmlConfigurator(Path('catalogs/dell/rcrc1406676-4824727 - Cat 2 Conf 7 PowerEdge R940 - Dell.html'), DellConfiguratorParser2020()),
|
||||
# dell.DellPowerEdgeR940(),
|
||||
]
|
||||
|
||||
|
@ -52,10 +52,10 @@ def test_credits_2020_configs():
|
|||
|
||||
def test_credits_2021_configs():
|
||||
configurators = [
|
||||
MatinfoConfigurator(Path('20210407 - Cat2 Conf4 PowerEdge R640 - Dell.html'), DellConfiguratorParser2021()),
|
||||
MatinfoConfigurator(Path('20210407 - Cat2 Conf7 PowerEdge R940 - Dell.html'), DellConfiguratorParser2021()),
|
||||
MatinfoConfigurator(Path('20210407 - Cat2 Conf8 PowerEdge R7525 - Dell.html'), DellConfiguratorParser2021()),
|
||||
# MatinfoConfigurator('20210407 - Cat2 Conf10 PowerEdge R6525 - Dell.html', DellConfiguratorParser2021()),
|
||||
HtmlConfigurator(Path('catalogs/dell/20210407 - Cat2 Conf4 PowerEdge R640 - Dell.html'), DellConfiguratorParser2021()),
|
||||
HtmlConfigurator(Path('catalogs/dell/20210407 - Cat2 Conf7 PowerEdge R940 - Dell.html'), DellConfiguratorParser2021()),
|
||||
HtmlConfigurator(Path('catalogs/dell/20210407 - Cat2 Conf8 PowerEdge R7525 - Dell.html'), DellConfiguratorParser2021()),
|
||||
# HtmlConfigurator('20210407 - Cat2 Conf10 PowerEdge R6525 - Dell.html', DellConfiguratorParser2021()),
|
||||
]
|
||||
# config_filter = lambda config : config.cpu.uid in [
|
||||
# 'intel-xeon-gold-5222',
|
||||
|
@ -76,10 +76,10 @@ def test_credits_2021_configs():
|
|||
|
||||
def test_ur1_presents_2023_configs():
|
||||
configurators = [
|
||||
# MatinfoConfigurator('20210407 - Cat2 Conf4 PowerEdge R640 - Dell.html', DellConfiguratorParser2021()),
|
||||
MatinfoConfigurator(Path('20230120-cat2-conf3-hpe-dl360-gen10.html'), HpeConfiguratorParser()),
|
||||
MatinfoConfigurator(Path('20230123-cat2-conf10-hpe-dl360-gen10plus-cpuchoice.html'), HpeCpuChoiceConfiguratorParser()),
|
||||
MatinfoConfigurator(Path('20230123-cat2-conf11-hpe-dl385-gen10plus-cpuchoice.html'), HpeCpuChoiceConfiguratorParser()),
|
||||
# HtmlConfigurator('20210407 - Cat2 Conf4 PowerEdge R640 - Dell.html', DellConfiguratorParser2021()),
|
||||
HtmlConfigurator(Path('catalogs/hpev1/20230120-cat2-conf3-hpe-dl360-gen10.html'), HpeConfiguratorParser()),
|
||||
HtmlConfigurator(Path('catalogs/hpev1/20230123-cat2-conf10-hpe-dl360-gen10plus-cpuchoice.html'), HpeCpuChoiceConfiguratorParser()),
|
||||
HtmlConfigurator(Path('catalogs/hpev1/20230123-cat2-conf11-hpe-dl385-gen10plus-cpuchoice.html'), HpeCpuChoiceConfiguratorParser()),
|
||||
]
|
||||
|
||||
def config_filter(config):
|
||||
|
|
Loading…
Reference in New Issue