Virtlab:Protokoly/Rezervační server
Z VirtlabWiki
(Rozdíly mezi verzemi)
Verze z 11:37, 10. 1. 2007 Hra196 (Diskuse | příspěvky) (Stránka Virtlab:DistrProtokolRezervServer přemístěna na stránku Virtlab:Rezervační server – komunikační protokol: Konečně srozumitelný název ;)) ← Předchozí porovnání |
Verze z 12:20, 8. 2. 2007 Hra196 (Diskuse | příspěvky) (Přepsání do wiki vzhledu (potřebuje úpravy)) Následující porovnání → |
||
Řádka 1: | Řádka 1: | ||
- | == Protokol rezervačního serveru == | + | Tento článek popisuje '''komunikační prokokol mezi rezervačními servery''' distribuovaného Virtlabu. |
- | První návrh: | + | == Navržené vlastnosti == |
- | * Dotaz na prvky lokality daného rezervačního serveru (parametry: ID dotazující se lokality - filtrace podle ní, časový úsek - spec. případ bez udání času vrátí všechny potenciálně zapůjčitelné prvky pro žádající lokalitu) | + | * Dotaz na prvky lokality daného rezervačního serveru (parametry: ID dotazující se lokality - filtrace podle ní, časový úsek - speciální případ:bez udání času vrátí všechny potenciálně zapůjčitelné prvky pro žádající lokalitu) |
* Dotaz na všechny prvky systému (zevnitř lokality lokálnímu rezervačními serveru, dotazy zvnějšku lokality budou filtrovány aplikací serveru (nepřicházejí z privátní zdrojové adresy) | * Dotaz na všechny prvky systému (zevnitř lokality lokálnímu rezervačními serveru, dotazy zvnějšku lokality budou filtrovány aplikací serveru (nepřicházejí z privátní zdrojové adresy) | ||
Řádka 29: | Řádka 29: | ||
- | == Komunikační protokol (návrh [[Uživatel:hra196|Tomáše Hrabálka]]) == | + | == Popis protokolu == |
- | '''Výpis ze souboru ''reserv/doc/popis.txt'':''' | + | === Vlastnosti === |
- | Popis komunikačního protokolu | + | * Přes TCP spojení |
- | ============================= | + | * Textové příkazy, oddělené <LF> (0x0A), <CR> (0x0D) je ignorováno |
- | - pres TCP spojeni | + | * Case insensitive |
- | - textove prikazy, oddelene <LF>, <CR> je ignorovano | + | * První řádek určuje příkaz, další jeho argumenty |
- | - case insensitive | + | * Na pořadí argumentů nezáleží |
- | - prvni radek urcuje prikaz, dalsi jeho argumenty | + | * Za názvem argumentu je dvojtecka, za kterou ihned nasledují jeho parametry |
- | - na poradi argumentu nezalezi | + | * Whitespace (tabelátory (0x09), mezery (0x20)) nejsou povoleny, slouží jako oddělovače parametrů pro argumenty |
- | - za nazvem argumentu je dvojtecka, za kterou ihned nasleduji jeho parametry | + | * Odeslání prázdného řádku (jen <LF>), potvrdí, že všechny argumenty byly odeslány a je možno zpracovat příkaz |
- | - whitespace (<tab>, mezery) nejsou povoleny, slouzi jako oddelovace parametru pro arg. | + | * Spojení ukončeno vždy na žádost klienta |
- | - odeslani prazdneho radku, jen <LF>, potvrdi, ze vsechny argumenty byly odeslany | + | * Server po komunikaci neukončuje spojení, pouze po určitém timeoutu |
- | - spojeni ukonceno vzdy na zadost klienta | + | * Při odpovědi je na prvním řádku kód odpovědi, mezera a za ní popis odpovědi, poté jsou poslána textová data |
- | - pri odpovedi je na prvnim radku kod odpovedi, mezera a za ni popis odpovedi, | + | |
- | pote jsou poslana textova data | + | |
- | - server po komunikace neukoncuje spojeni, pouze po urcitem timeoutu | + | |
- | Zjisteni obecne nabidky RS | + | === Zjištění obecné nabídky Rezervačního serveru === |
- | -------------------------- | + | * Příkaz: "GET-OFFER\n" |
- | Prikaz: "GET-OFFER\n" | + | * Argument (povinný): "FOR: +'jednoznačný název lokality'\n" např. "FOR:vsb_ostrava\n" |
- | Argument (povinny): "FOR: +'jednoznacny nazev lokality'\n" napr. "FOR:vsb_ostrava\n" | + | * Odpověď: XML soubor s přefiltrovanou nabídkou fyzických zařízení pro danou lokalitu |
- | Odpoved: XML soubor s prefiltrovanou nabidkou fyzickych zarizeni pro danou lokalitu | + | |
- | Zjisteni nabidky celeho distribuovaneho RS | + | === Zjištění nabídky celého distribuovaného RS === |
- | ----------------------------------------- | + | * Stejné jako obecné zjištení "GET-OFFER" |
- | Stejne jako obecne zjisteni "GET-OFFER" | + | * Argument (povinný): DISTRIB Parametr: "YES", "DISTRIB:YES" |
- | Argument (povinny): DISTRIB Parametr: "YES", "DISTRIB:YES" | + | * Odpověď: XML soubor s přefiltrovanou nabídkou fyzických zařízení pro celý distribuovaný RS |
- | Odpoved: XML soubor s prefiltrovanou nabidkou fyzickych zarizeni pro cely distribuovany RS | + | |
- | Zjisteni nabidky v danem case (Co je volne?) | + | === Zjištění nabídky v daném čase (Co je volné?) === |
- | -------------------------------------------- | + | * Opět "GET-OFFER" |
- | Argument (povinny): "TIME:FROM{YYYY-MM-DD HH:MM}TO{YYYY-MM-DD HH:MM}\n" | + | * Argument (povinný): "TIME:FROM{YYYY-MM-DD HH:MM}TO{YYYY-MM-DD HH:MM}\n" |
- | napr. "TIME:FROM{2006-12-24 09:45}TO{2007-01-01 15:14}\n" | + | ** Příklad: ''"TIME:FROM{2006-12-24 09:45}TO{2007-01-01 15:14}\n"'' |
- | Odpoved: XML soubor s nabidkou vsech fyzickych zarizeni lokalne nebo v celem Distr VL pro danou lokalitu, | + | * Odpověď: XML soubor s nabídkou všech fyzických zařízení lokalně nebo v celem distribuovaném VL pro danou lokalitu, podle argumentu (DISTRIB) |
- | podle argumentu (DISTRIB) | + | |
- | + | === Potvrzení rezervace === | |
- | Potvrzeni rezervace | + | * Rezervace je potvrzovana <<dvojitým '''commit'''>>, |
- | ------------------- | + | * Nejprve voláním příkazu "RESERVE\n" a poté "COMMIT" |
- | - Rezervace je potvrzovana <<dvojtym commit>>, | + | * Zavolání "RESERVE" na vzdalený rezervační server znamená, že si server daný čas zablokuje, ostatnim ho neposkytne a čeká (daný čas) na "COMMIT". |
- | nejprve volanim prikazu "RESERVE\n" a pote "COMMIT" | + | * Druhý COMMIT je zavolán, byl-li první u všech serverů úspěšný |
- | - Zavolani "RESERVE" na vzdaleny rezervacni server znamena, ze si server dany cas zablokuje, | + | * Nebyl-li úspěšný, volá se přikaz "ROLLBACK" |
- | ostatnim ho neposkytne a ceka (dany cas) na "COMMIT". | + | * Nastane-li timeout, volá se ROLLBACK automaticky |
- | - Druhy COMMIT je zavolan, byl-li prvni u vsech serveru uspesny | + | * Povinným argumentem je vygenerované globalní Reservation id, které je složené z lokality a místního čísla id: "ID:<LocalID>@<lokalita>" |
- | - Nebyl-li uspesny, volame prikaz ROLLBACK | + | * Povinné je rovnež uvést čas ve stejném formátu jako u zjištování nabídky |
- | - Nastane-li timeout, vola se ROLLBACK automaticky | + | * Jako další argumenty COMMIT jsou ID síťových prvků dané lokace (každé jako zvláštní argument) |
- | - Povinnym argumentem je vygenerovane globalni Reservation id, | + | ** Argument: DEVICE:id_zarizeni\n |
- | ktere je slozene z lokality a mistniho cisla id: "ID:<LocalID>@<lokalita>" | + | * Odpovědi: |
- | - Povinne je rovnez uvest cas ve stejnem formatu jako u zjistovani nabidky | + | ** 200 ACCEPTED<lf> ...kladná odpověď |
- | - Jako dalsi argumenty COMMIT jsou ID sitovych prvku dane lokace (kazde jako zvlastni argument) | + | ** 400 REFUSED<lf> ...zaporná odpověď |
- | - Argumet: DEVICE:id_zarizeni\n | + | |
- | - Odpoved: 200 ACCEPTED<lf> ...kladna odpoved | + | |
- | 400 REFUSED<lf> ...zaporna odpoved | + | |
- | Smazani rezervace | + | === Smazání rezervace === |
- | ----------------- | + | * Příkaz "CANCEL" |
- | - Prikaz "CANCEL" | + | * Povinný argument "ID:<lokalita> <id>" |
- | - Povinny argument "ID:<lokalita> <id>" | + | * Argument "DISTRIB:YES" pro distribuovanou verzi |
- | - Argument "DISTRIB:YES" pro distribuovanou verzi | + | * Odpovědi: |
- | - Odpoved "210 Cancelled" operace provedena | + | ** "210 Cancelled" operace provedena |
- | "410 Bad ID" zadne takove ID neexistuje | + | ** "410 Bad ID" žádne takové ID neexistuje |
- | Priklad | + | === Příklad === |
- | ------- | + | |
User->Local RS | User->Local RS | ||
Verze z 12:20, 8. 2. 2007
Tento článek popisuje komunikační prokokol mezi rezervačními servery distribuovaného Virtlabu.
Obsah |
Navržené vlastnosti
- Dotaz na prvky lokality daného rezervačního serveru (parametry: ID dotazující se lokality - filtrace podle ní, časový úsek - speciální případ:bez udání času vrátí všechny potenciálně zapůjčitelné prvky pro žádající lokalitu)
- Dotaz na všechny prvky systému (zevnitř lokality lokálnímu rezervačními serveru, dotazy zvnějšku lokality budou filtrovány aplikací serveru (nepřicházejí z privátní zdrojové adresy)
- slouží jako proxy, zeptá se všech rezervačních serverů jiných lokalit (zprávou dotaz na prvky lokality)
- může být speciálním případen zprávy pro dotaz na prvky lokality s nastaveným příznakem žádosti o rekurzi.
- Zadost o rezervaci - DOPRACOVAT PARAMETRY A MOZNE ODPOVEDI NA ZPRAVU
- Zrušení rezervace podle globálního čísla rezervace (u sebe nebo rekurzivně u všech, rekurze přijímána jen při poždavku zevnitř lokality)
- Výpis rezervací – výpis rezervační tabulky (lokálního rezervačního serveru nebo rekurzivně, ale v rekurzivním případě vrátí jen rezervace rezervace z tázající se lokality)
ID rezervace – bude vymýšlet rezervující lokalita (název lokality + sekvenční číslo). Bude sloužit i k možnosti zruseni rezervace
Při komunikaci mezi rezervačními servery uvádět jako parametr ID tázající se lokality + vymyslet systém autentizace, aby se ID tázající lokality nedalo podvrhnout.
Lze počítat s tím, že komunikace půjde IPSec tunelem.
Distribuovaná rezervace prvků je distribuovanou transakcí, vymyslet 2-fázový commit, včetně podpory rollbacku od timeoutu při neaktivitě rezervačního klienta. Rezerv. server obsluhuje více spojení najednou, promyslet, zda nevznikají potenciální deadlocky.
Administrátorské CLI rezervačního serveru - navrh
- Výpis všech rezervací (dle časového intervalu od-do)
- Smazání záznamů o již proběhnuvších rezervacích
- Smazání budoucí rezervace
Popis protokolu
Vlastnosti
- Přes TCP spojení
- Textové příkazy, oddělené <LF> (0x0A), <CR> (0x0D) je ignorováno
- Case insensitive
- První řádek určuje příkaz, další jeho argumenty
- Na pořadí argumentů nezáleží
- Za názvem argumentu je dvojtecka, za kterou ihned nasledují jeho parametry
- Whitespace (tabelátory (0x09), mezery (0x20)) nejsou povoleny, slouží jako oddělovače parametrů pro argumenty
- Odeslání prázdného řádku (jen <LF>), potvrdí, že všechny argumenty byly odeslány a je možno zpracovat příkaz
- Spojení ukončeno vždy na žádost klienta
- Server po komunikaci neukončuje spojení, pouze po určitém timeoutu
- Při odpovědi je na prvním řádku kód odpovědi, mezera a za ní popis odpovědi, poté jsou poslána textová data
Zjištění obecné nabídky Rezervačního serveru
- Příkaz: "GET-OFFER\n"
- Argument (povinný): "FOR: +'jednoznačný název lokality'\n" např. "FOR:vsb_ostrava\n"
- Odpověď: XML soubor s přefiltrovanou nabídkou fyzických zařízení pro danou lokalitu
Zjištění nabídky celého distribuovaného RS
- Stejné jako obecné zjištení "GET-OFFER"
- Argument (povinný): DISTRIB Parametr: "YES", "DISTRIB:YES"
- Odpověď: XML soubor s přefiltrovanou nabídkou fyzických zařízení pro celý distribuovaný RS
Zjištění nabídky v daném čase (Co je volné?)
- Opět "GET-OFFER"
- Argument (povinný): "TIME:FROM{YYYY-MM-DD HH:MM}TO{YYYY-MM-DD HH:MM}\n"
- Příklad: "TIME:FROM{2006-12-24 09:45}TO{2007-01-01 15:14}\n"
- Odpověď: XML soubor s nabídkou všech fyzických zařízení lokalně nebo v celem distribuovaném VL pro danou lokalitu, podle argumentu (DISTRIB)
Potvrzení rezervace
- Rezervace je potvrzovana <<dvojitým commit>>,
- Nejprve voláním příkazu "RESERVE\n" a poté "COMMIT"
- Zavolání "RESERVE" na vzdalený rezervační server znamená, že si server daný čas zablokuje, ostatnim ho neposkytne a čeká (daný čas) na "COMMIT".
- Druhý COMMIT je zavolán, byl-li první u všech serverů úspěšný
- Nebyl-li úspěšný, volá se přikaz "ROLLBACK"
- Nastane-li timeout, volá se ROLLBACK automaticky
- Povinným argumentem je vygenerované globalní Reservation id, které je složené z lokality a místního čísla id: "ID:<LocalID>@<lokalita>"
- Povinné je rovnež uvést čas ve stejném formátu jako u zjištování nabídky
- Jako další argumenty COMMIT jsou ID síťových prvků dané lokace (každé jako zvláštní argument)
- Argument: DEVICE:id_zarizeni\n
- Odpovědi:
- 200 ACCEPTED<lf> ...kladná odpověď
- 400 REFUSED<lf> ...zaporná odpověď
Smazání rezervace
- Příkaz "CANCEL"
- Povinný argument "ID:<lokalita> <id>"
- Argument "DISTRIB:YES" pro distribuovanou verzi
- Odpovědi:
- "210 Cancelled" operace provedena
- "410 Bad ID" žádne takové ID neexistuje
Příklad
User->Local RS -> GET-OFFER<lf> FOR:su_karvina<lf> DISTRIB:yes<lf> <lf> <- 200 OK <?XML ..... > end of the connection -> GET-OFFER<lf> FOR:su_karvina<lf> DISTRIB:yes<lf> TIME:FROM{2007-01-18 10:00}TO{2007-01-18 11:00}<lf> <lf> <- 200 OK <? XML .... > end of the connection -> RESERVE<lf> FOR:su_karvina<lf> ID:14@su_karvina TIME:FROM{2007-01-18 10:00}TO{2007-01-18 11:00}<lf> DEVICE:r1 DEVICE:r5 DEVICE:sw2 <lf> <- 200 ACCEPTED end of the connection -> COMMIT<lf> <- 200 ACCEPTED end of the connection