Virtlab:Řídící server/Mapovací algoritmus
Z VirtlabWiki
(Rozdíly mezi verzemi)
| Verze z 22:17, 23. 2. 2007 Vav166 (Diskuse | příspěvky) (→Popis) ← Předchozí porovnání |
Verze z 22:19, 23. 2. 2007 Vav166 (Diskuse | příspěvky) (→Ukázky) Následující porovnání → |
||
| Řádka 128: | Řádka 128: | ||
| [r3] => 0 | [r3] => 0 | ||
| [r1] => 0 | [r1] => 0 | ||
| + | ) | ||
| + | ) | ||
| + | |||
| + | '''ukázka 2:''' | ||
| + | Array | ||
| + | ( | ||
| + | [ra] => Array | ||
| + | ( | ||
| + | [r7] => 1005 | ||
| + | ) | ||
| + | [rb] => Array | ||
| + | ( | ||
| + | [r3] => 180 | ||
| + | [r5] => 375 | ||
| + | [r1] => 605 | ||
| + | [r7] => 1005 | ||
| + | ) | ||
| + | [rc] => Array | ||
| + | ( | ||
| + | [r3] => 180 | ||
| + | [r5] => 375 | ||
| + | ) | ||
| + | [rd] => Array | ||
| + | ( | ||
| + | [r5] => 375 | ||
| ) | ) | ||
| ) | ) | ||
Verze z 22:19, 23. 2. 2007
Obsah |
Popis
Celkový postup mapovacího algoritmu:
- rychlé ověřění jednoduchých podmínek, jestli má mapování šanci na úspěch
- srovnání typů zařízení ve vybavení a virtuální topologii. Pokud je třeba mít v topologii typ zařízení, které nemáme mezi vybavením, tak není třeba s mapováním pokračovat - nepovede se.
- použijí se funkce virtlabParserTopology::getVertexesTypes() a virtlabParserEquipment::getDevicesTypes(), jejiž výstupy se jednoduše porovnají pomocí funkce array_diff
- srovnání speciálních vlastností zařízení v topologii a vybavení. Pokud v topologii požaduji po zařízení určitou speciální vlastnost, která se v celém vybavení vůbec nevyskytuje - mapování se nepovede.
- použijí se funkce virtlabParserTopology::getVertexesFeatures() a virtlabParserEquipment::getDevicesFeatures(), jejiž výstupy se jednoduše porovnají pomocí funkce array_diff
- srovnání speciálních vlastností jednotlivých linek a rozhraní zařízení ve vybavení. Pokud je v topologii po některé lince požadována speciální vlastnost, musí tuto vlastnost mít obě rozhraní, které tvoří konce této linky. Takže na každou vlastnost linky musí připadat alespoň dvě vlastnosti rozhraní.
- použije se funkce virtlabParserTopology::getEdgesFeatures(), jejíž výstupní seznam se zdvojí funkcí DoubleArrayItems. Teto seznam se poravná funkcí array_porovnej (kvůli duplicitním hodnotám nejde použít array_diff) s výstupem funkce virtlabParserEquipment::getDevicesInterfacesFeatures(). array_diff]
- srovnání typů zařízení ve vybavení a virtuální topologii. Pokud je třeba mít v topologii typ zařízení, které nemáme mezi vybavením, tak není třeba s mapováním pokračovat - nepovede se.
- vlastní mapovací část
- ze seznamu zařízení (virtlabParserEquipment::getDevicesList()) a vrcholů linek virtuální topologie (virtlabParserTopology::getVertexesList()) se vytvoří dvojrozměrné pole (indexováno prvky ze získaných seznamů), jehož hodnoty jsou 0 pokud příslušný prvek nemůže být daným vrcholem. Nebo pole, určující na kterých linkách může být které rozhraní - zajištěno funkcí virtlabMapping::Availability($device, $vertex) (viz ukázka 1):
- zjistění vhodnosti je komplexní problém, které se skládá z mnoha částí:
- porovnání typu zařízení s vrcholem (při neshodě vrácena hodnota virtlabValues::badType)
- porovnání platformy zařízení s požadovanou platformou (požadavek na platformu je považován za regulární výraz) (při neshodě vrácena hodnota virtlabValues::badPlatform)
- porovnání verze OS (požadavek na verzi OS je považována za regulární výraz) (při neshodě vrácena hodnota virtlabValues::badOS)
- porovnání speciálních vlastností zařízení (pokud nejsou splněny všechny požadavky, je vrácena hodnota virtlabValues::noDeviceFeature)
- zjištění dostatečného počtu rozhraní (pokud nemá zařízení dostatek rozhraní, aby mohla pokrýt potřeny topologie, je vrácena hodnota virtlabValues::notEnoughInterfaces - kontroluje se i typ rozhraní)
- zjištění způsobilostí rozhraní pro všechny požadované linky (počítáno přes všechny linky a rozhraní)
- porovnání speciálních vlastností rozhraní a linky
- porovnání technologie - u linek typu serial se porovnává rychlost rozhraní a požadovaná rychlost linky, u linek typu ethernet se porovná typ ethernetu (na lince, která má mít rychlost fast, může být rozhraní gigabit, ale ne legacy, ...)
- pokud se pro nějakou linku nenajde ani jedno rozhraní, je vrácena hodnota virtlabValues::VertexDeviceMismatch
- zjistění vhodnosti je komplexní problém, které se skládá z mnoha částí:
- na základě pole, které vzniklo (viz ukázka 1) se vyrobí pole další, které už ale není kompletní maticí vrcholy X zařízení, ale obsahuje jen takové body, u kterých bylo zjištěno, že vrchol a zařízení jsou pro sebe vhodné. Jeho hodnoty budou hodnocení zařízení vyrobené funkcí virtlabMapping::Evaluate($device) (viz ukázka 2)
- jednotlivá vnitřní pole se seřadí vzestupně, podle hodnot zařízení
- takhle vyrobené pole slouží jako vstup funkce virtlabMapping::Mapping($map2, &$vysledek), které rekurzivně zjišťuje jestli je namapování možné
- ze seznamu zařízení (virtlabParserEquipment::getDevicesList()) a vrcholů linek virtuální topologie (virtlabParserTopology::getVertexesList()) se vytvoří dvojrozměrné pole (indexováno prvky ze získaných seznamů), jehož hodnoty jsou 0 pokud příslušný prvek nemůže být daným vrcholem. Nebo pole, určující na kterých linkách může být které rozhraní - zajištěno funkcí virtlabMapping::Availability($device, $vertex) (viz ukázka 1):
...
Ukázky
ukázka 1:
Array
(
[ra] => Array
(
[swa] => 0
[r7] => Array
(
[Kacena] => Array
(
[2] => s0/2/2
)
[Kocour] => Array
(
[4] => s0/2/4
[3] => s0/2/3
[2] => s0/2/2
[1] => s0/2/1
[0] => s0/2/0
)
)
[r5] => 0
[r3] => 0
[r1] => 0
)
[rb] => Array
(
[swa] => 0
[r7] => Array
(
[Kocour] => Array
(
[4] => s0/2/4
[3] => s0/2/3
[2] => s0/2/2
[1] => s0/2/1
[0] => s0/2/0
)
)
[r5] => Array
(
[Kocour] => Array
(
[0] => s0/0
)
)
[r3] => Array
(
[Kocour] => Array
(
[0] => s0
)
)
[r1] => Array
(
[Kocour] => Array
(
[2] => s0/1/1
[1] => s0/2/1
[0] => s0/1/0
)
)
)
[rc] => Array
(
[swa] => 0
[r7] => 0
[r5] => Array
(
[Krokodyl] => Array
(
[1] => gi0
)
)
[r3] => Array
(
[Krokodyl] => Array
(
[2] => fa0/1
[1] => fa0/0
)
)
[r1] => 0
)
[rd] => Array
(
[swa] => 0
[r7] => 0
[r5] => Array
(
[Kacena] => Array
(
[0] => s0/0
)
[Krokodyl] => Array
(
[1] => gi0
)
)
[r3] => 0
[r1] => 0
)
)
ukázka 2:
Array
(
[ra] => Array
(
[r7] => 1005
)
[rb] => Array
(
[r3] => 180
[r5] => 375
[r1] => 605
[r7] => 1005
)
[rc] => Array
(
[r3] => 180
[r5] => 375
)
[rd] => Array
(
[r5] => 375
)
)
