Virtlab:Protokoly/Rezervační server
Z VirtlabWiki
← Starší verze | Novější verze →
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ěď: Na prvním řádku odpovědi je číslo s velikostí následujících dat (v bytech). Následuje 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ěď: Na prvním řádku odpovědi je číslo s velikostí následujících dat (v bytech). Následuje 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, ostatním 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 u obou příkazů je vygenerované globalní Reservation id, které je složené z lokality a místního čísla id: "ID:<LocalID>@<lokalita>". COMMIT již jiný argument nemá.
- U "RESERVE" je povinné rovnež uvést čas ve stejném formátu jako u zjištování nabídky.
- Jako další argumenty RESERVE 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:id_rezervace"
- Argument "DISTRIB:YES" pro distribuovanou verzi
- Pokud dané ID v systému neexistuje je ignorováno a není oznámena žádná chyba
- Odpovědi:
- "210 Cancelled" operace provedena
- "410 Error" nebylo možno rušení provést (výpadek databáze)
Odeslání konfigurace k rezervaci
Když klient rezervačního serveru na základě nabídky prvků a poté kladné rezervace vygeneruje síť spojení jednotlivých prvků (Mapovací algoritmus), je třeba tuto konfigurace předat rezervačnímu serveru. Ten ji dále poskytne konfiguračním skriptům, které vytvoří náplň konfigurace jednotlivých prvků. Konfigurace dané rezervace se může měnit kdykoliv před započetím úlohy.
- Odeslání konfigurace se provádí příkazem SEND-DATA.
- Povinným argumentem je ID rezervace (číslo@lokalita)
- Dalším argumentem je "data". Každý z argumentů "data" určuje postupně jeden řádek odesílaného souboru.
- Odeslaná data jsou uložena do souboru a později předána konfiguračním skriptům. Rezervační server je nijak neinterpretuje ani neupravuje.
SEND-DATA id:14@vsb data:<první řádek konfigurace> data:<druhý řádek konfigurace za kterým je prázdný řádek> data: data:<čtvrtý řádek>
Příklad
User->Local RS -> GET-OFFER<lf> FOR:su_karvina<lf> DISTRIB:yes<lf> <lf> <- 200 OK 375 <?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<lf> TIME:FROM{2007-01-18 10:00}TO{2007-01-18 11:00}<lf> DEVICE:r1<lf> DEVICE:r5<lf> DEVICE:sw2<lf> <lf> <- 200 ACCEPTED end of the connection -> COMMIT<lf> ID:14@su_karvina<lf> <lf> <- 200 ACCEPTED end of the connection -> SEND-DATA<lf> ID:14@su_karvina<lf> DATA:r7:s0/2/2 r5:s0/0<lf> DATA:r3:fa0/1 r5:gi0<lf> DATAr7:s0/2/4 r1:s0/1/1<lf> <lf> <- 200 SEND-DATA OK