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
						
			
		