Virtlab:Řídící server/Mapovací algoritmus

Z VirtlabWiki

(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
Verze z 22:51, 22. 2. 2007
Vav166 (Diskuse | příspěvky)

← Předchozí porovnání
Verze z 22:17, 23. 2. 2007
Vav166 (Diskuse | příspěvky)
(Popis)
Následující porovnání →
Řádka 9: Řádka 9:
##* použije se funkce <tt>[[Virtlab:ParserTopology.php.inc|virtlabParserTopology]]::getEdgesFeatures()</tt>, jejíž výstupní seznam se zdvojí funkcí <tt>[[Virtlab:SupportFunctions.php.inc|DoubleArrayItems]]</tt>. Teto seznam se poravná funkcí <tt>[[Virtlab:SupportFunctions.php.inc|array_porovnej]]</tt> (kvůli duplicitním hodnotám nejde použít <tt>[http://www.php.net/array_diff array_diff]</tt>) s výstupem funkce <tt>[[Virtlab:ParserEquipment.php.inc|virtlabParserEquipment]]::getDevicesInterfacesFeatures()</tt>. array_diff] ##* použije se funkce <tt>[[Virtlab:ParserTopology.php.inc|virtlabParserTopology]]::getEdgesFeatures()</tt>, jejíž výstupní seznam se zdvojí funkcí <tt>[[Virtlab:SupportFunctions.php.inc|DoubleArrayItems]]</tt>. Teto seznam se poravná funkcí <tt>[[Virtlab:SupportFunctions.php.inc|array_porovnej]]</tt> (kvůli duplicitním hodnotám nejde použít <tt>[http://www.php.net/array_diff array_diff]</tt>) s výstupem funkce <tt>[[Virtlab:ParserEquipment.php.inc|virtlabParserEquipment]]::getDevicesInterfacesFeatures()</tt>. array_diff]
# '''vlastní mapovací část''' # '''vlastní mapovací část'''
-## ze seznamu zařízení (<tt>[[Virtlab:ParserEquipment.php.inc|virtlabParserEquipment]]::getDevicesList()</tt>) a vrcholů linek virtuální topologie (<tt>[[Virtlab:ParserTopology.php.inc|virtlabParserTopology]]::getVertexesList()</tt>) se vytvoří dvojrozměrné pole (indexováno prvky ze získaných seznamů), jehož hodnoty jsou <tt>0</tt> 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í <tt>[[Virtlab:Mapping.php.inc|virtlabMapping]]::Availability($device, $vertex)</tt> (viz ukázka1):+## ze seznamu zařízení (<tt>[[Virtlab:ParserEquipment.php.inc|virtlabParserEquipment]]::getDevicesList()</tt>) a vrcholů linek virtuální topologie (<tt>[[Virtlab:ParserTopology.php.inc|virtlabParserTopology]]::getVertexesList()</tt>) se vytvoří dvojrozměrné pole (indexováno prvky ze získaných seznamů), jehož hodnoty jsou <tt>0</tt> 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í <tt>[[Virtlab:Mapping.php.inc|virtlabMapping]]::Availability($device, $vertex)</tt> (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 <tt>[[Virtlab:Values.php.inc|virtlabValues]]::badType</tt>)
 +##*# '''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 <tt>[[Virtlab:Values.php.inc|virtlabValues]]::badPlatform</tt>)
 +##*# '''porovnání verze OS''' (požadavek na verzi OS je považována za '''regulární výraz''') (při neshodě vrácena hodnota <tt>[[Virtlab:Values.php.inc|virtlabValues]]::badOS</tt>)
 +##*# '''porovnání speciálních vlastností zařízení''' (pokud nejsou splněny všechny požadavky, je vrácena hodnota <tt>[[Virtlab:Values.php.inc|virtlabValues]]::noDeviceFeature</tt>)
 +##*# '''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 <tt>[[Virtlab:Values.php.inc|virtlabValues]]::notEnoughInterfaces</tt> - 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 <tt>serial</tt> se porovnává rychlost rozhraní a požadovaná rychlost linky, u linek typu <tt>ethernet</tt> 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 <tt>[[Virtlab:Values.php.inc|virtlabValues]]::VertexDeviceMismatch</tt>
 +## 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í <tt>[[Virtlab:Mapping.php.inc|virtlabMapping]]::Evaluate($device)</tt> (viz '''ukázka 2''')
 +##* jednotlivá ''vnitřní'' pole se seřadí vzestupně, podle hodnot zařízení
 +## takhle vyrobené pole slouží jako vstup funkce <tt>[[Virtlab:Mapping.php.inc|virtlabMapping]]::Mapping($map2, &$vysledek)</tt>, které '''rekurzivně''' zjišťuje jestli je ''namapování'' možné
 + 
 +...
== Ukázky == == Ukázky ==

Verze z 22:17, 23. 2. 2007

Obsah

Popis

Celkový postup mapovacího algoritmu:

  1. rychlé ověřění jednoduchých podmínek, jestli má mapování šanci na úspěch
    1. 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.
    2. 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.
    3. 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í.
  2. vlastní mapovací část
    1. 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í:
        1. porovnání typu zařízení s vrcholem (při neshodě vrácena hodnota virtlabValues::badType)
        2. 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)
        3. 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)
        4. porovnání speciálních vlastností zařízení (pokud nejsou splněny všechny požadavky, je vrácena hodnota virtlabValues::noDeviceFeature)
        5. 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í)
        6. zjištění způsobilostí rozhraní pro všechny požadované linky (počítáno přes všechny linky a rozhraní)
          1. porovnání speciálních vlastností rozhraní a linky
          2. 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
    2. 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í
    3. takhle vyrobené pole slouží jako vstup funkce virtlabMapping::Mapping($map2, &$vysledek), které rekurzivně zjišťuje jestli je namapování možné

...

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
       )
)

Zdrojové XML soubory

Topologie

Vybavení