Cuprins
Despre vmchecker
vmchecker este un set de aplicații destinat automatizării testării non-interactive. Aplicația este folosită pentru testarea și corectarea automată a temelor de casă pentru cursurile de Sisteme de Operare, Proiectarea Sistemelor de Operare și Proiectarea Translatoarelor din cadrul Facultății de Automatică și Calculatoare, Universitatea POLITEHNICA din București.
Detalii de utilizare găsiți pe pagina de Documentație.
Logo
Logo-ul vmchecker se găsește la adresa http://www.rosedu.org/~vmchecker/images/vmchecker-logo.png. Orice propunere sau acțiune de îmbunătățire este binevenită.
Echipa
Echipa curentă a fost selectată în cadrul inițiativei ROSEdu Summer of Code. Membrii acesteia vor lucra la vmchecker pe durata stagiului RSoC (și, sperăm noi, nu numai)
- Adriana Szekeres (aaa_sz [at] yahoo [dot] com)
- Ana Savu (ana.savu86 [at] gmail [dot] com)
- Alexandru Moșoi (brtzsnr [at] gmail [dot] com)
- Claudiu Gheorghe (claudiugh [at] gmail [dot] com)
- Lucian Adrian Grijincu (lucian.grijincu [at] gmail [dot] com)
- Marius Sandu-Popa (sandupopamarius [at] gmail [dot] com)
- Răzvan Deaconescu (razvan [at] rosedu [dot] org)
- Sergiu Găman (uigres_44_88 [at] yahoo [dot] com)
- Ștefan Bucur (stefan.bucur [at] gmail [dot] com)
Contribuțiile din exteriorul echipei sunt binevenite.
Cum pot contribui?
Dacă vrei să asiști sau să contribui la dezvoltarea vmchecker ești binevenit. Recomandările noastre sunt următoarele:
- înscrie-te pe lista de discuții (http://lists.rosedu.org/cgi-bin/mailman/listinfo/vmchecker-dev)
- urmărește și participă la discuții (puteți consulta arhivele listei de discuții)
- descarcă sursele vmchecker:
- svn checkout svn://rosedu.org/vmchecker vmchecker
- trimite tichete în cazul în care descoperi bug-uri sau pentru sugestii
- trimite patch-uri către dezvoltatori
Dacă vei avea o contribuție importantă vei putea ajunge în cadrul echipei de bază a proiectului (core-team) cu acces de commit în repository și posibilitatea de a lua decizii de proiectare și implementare.
Utilitare pentru dezvoltare
- dezvoltarea proiectului se face prin intermediul trac; site-ul oferă astfel facilități pentru wiki, roadmap, ticket-uri (bug reports), source browsing
- subversion pentru dezvoltarea colaborativă
- listă de discuții gestionată de Mailman (vmchecker-dev [at] lists [dot] rosedu [dot] org)
- VMware Server pentru testarea aplicațiilor într-un "sandbox"
Componentele proiectului
Arhitectură
Vmchecker a proiectat de Răzvan Deaconescu, Lucian Adrian Grijincu și Alexandru Moșoi și se bazează pe o versiune mai veche scrisă de Octavian Purdilă folosită (până în 2008) la testarea automată a temelor în cadrul cursurilor de Sisteme de Operare și Proiectarea Sistemelor de Operare.
Modulele noi sunt prezentate mai jos. Fiecare modul este descris prin intrare, acțiune și ieșire. Pentru mai multe informații urmăriți pagina wiki asociată fiecărui modul (TODO).
LoginInterface
- Descriere
- interfața web cu utilizatorul pentru autentificarea/deautentificarea utilizatorului
- nu este o componentă directă a vmchecker dar vom furniza și o astfel de interfață (probabil asemănătoare cu cea folosită actualmente la cursurile de Sisteme de Operare și Proiectarea Sistemelor de Operare
- Intrare
- formular de autentificare conținând nume de utilizator și parolă
- Acțiuni
- autentificare (login)
- autentificare (bază de date, fișiere locale, LDAP)
- afișare mesaj de eroare și solicitare retry în caz de autentificare nereușită
- afișare link pentru deautentificare și link pentru upload în caz de autentificare reușită
- crearea unei sesiuni PHP
- link-ul de upload duce la invocarea funcției do_upload care oferă utilizatorului o pagină de încărcare a unei teme; signatura va fi
boolean do_upload(string user_id);
eventual numele utilizatorului poate fi transmis ca o variabilă globală (folosind $_SESSION în PHP)
- deautentificare (logout)
- distrugerea sesiunii PHP
- afișarea interfeței de login
- autentificare (login)
- Ieșire
- autentificare: ieșirea este intrarea pentru modulul UploadInterface, adică funcția do_upload
- identificatorul utilizatorului (user_id)
- deautentificare
- pagina de autentificare inițială (formular de autentificare)
- autentificare: ieșirea este intrarea pentru modulul UploadInterface, adică funcția do_upload
UploadInterface
- Descriere
- interfața web cu utilizatorul pentru încărcarea temei (formular de upload)
- nu este o componentă directă a vmchecker dar vom furniza și o astfel de interfață (probabil asemănătoare cu cea folosită actualmente la cursurile de Sisteme de Operare și Proiectarea Sistemelor de Operare
- Intrare
- se presupune autentificarea realizată la LoginInterface
- identificatorul utilizatorului (nume, prenume, grupă sangvină etc.) de la LoginInterface
- identificatorul temei (din formularul de upload)
- arhiva temei (din formularul de upload)
- Acțiuni: în urma apăsării butonului de upload/submit se rulează funcția process_upload care realizează încărcarea temei și pașii următori
- verificări locale: Makefile prezent, fișiere cod sursă (nu binare) etc.
- dezarhivarea temei într-un director specific pentru acea tema și utilizator
- crearea unui director în care să fie stocate rezultatele testării (probabil cel de mai sus)
- stocarea arhivei într-un director specific (posibil cel de sus)
- invocarea funcției do_check_config cu signatura
boolean do_check(string user_id, string assignment_id, string archive_path, string results_path);
- Signatura funcției process_upload este simplă:
boolean process_upload(void)
Informațiile necesare sunt obținute din variabilele de sesiune și upload ($_SESSION, $_POST).
- Ieșire: ieșirea este intrarea pentru modulul CheckConfig, adică funcția do_check_config
- director în care se vor stoca rezultatele (results_path)
- arhiva temei (archive_path)
- identificatorul utilizatorului (user_id) - transmis de la intrare
- identificatorul temei (assigment_id) - transmis de la intrare
CheckConfig
- Descriere
- crearea unei cozi locale pentru verificarea temelor
- Intrare
- fișier de configurare globală (ini) conținând informații despre curs și despre teme (arhive de test, deadline-uri, depunctări)
- ieșirea de la UploadInterface: user_id, assignment_id, results_path, archive_path
- timpul curent = momentul în care s-a realizat upload-ul
- Acțiune
- crearea unui fișier de configurare a temei; toate informațiile nececsare pentru testare sunt aici (calea către arhiva temei, către test, informații legate de deadline etc.)
- rularea scriptului do_remote_check; scriptul primește ca argument calea către fișierul de configurare
- fișierele de configurare vor fi stocate într-un director care are rolul de coadă; dacă apare vreo problema, recorectarea temelor va fi echivalentă cu rularea scriptului do_remote_check pe fiecare fișier de configurare
- Ieșire
- fișier de configurare a temei
RemoteCheck
- Descriere
- comandarea sistemului de testare pentru verificarea temei
- Intrare
- fișier de configurare a temei
- adresa IP a sistemului de testare
- calea de stocare a fișierelor de configurare la distanță (director cu funcționare de coadă)
- Acțiune: rularea scriptului do_remote_check; scriptul primește ca argument calea către fișierul de configurare a temei
- se copiază fișierul de configurare prin SSH la distanță
- se invocă prin SSH la distanță scriptul notifier
- Ieșire
- afișarea unui mesaj utilizatorului de tipul 'Tema a fost transmisă pentru corectare' sau 'Eroare conectare la sistemul de testare'
Notifier
- Descriere
- notifică prezența unei noi intrări în coada de testare == prezența unui nou fișier de configurare în directorul 'queue/'
- Intrare
- N/A
- Acțiune: se rulează scriptul notifier care rulează programul semctl up $(COURSE_ID)
- incrementarea unui semafor global (System V IPC)
- scriptul notifier nu are sens; s-ar putea rula direct semctl up $(COURSE_ID) din RemoteCheck; este o formă de încapsulare; nu vrem ca RemoteCheck să știe că folosim semafoare pentru notificare; în plus, în cazul unei soluții alternative, se va invoca _alt_ program (diferit de semctl) și se va modifica doar scriptul notifier
- Ieșire
- N/A
QueueManager
- Descriere
- modul de gestiune a cozii pe sistemul de testare
- Intrare
- director ce conține fișiere de configurare pentru o instanță de testare a unei teme
- Acțiune: modulul este dat de rularea unui script cu comportament de daemon (qmand); scriptul primește ca argument directorul de mai sus
- daemonul rulează în buclă infinită
- se apelează programul semctl down $(COURSE_ID) care decrementează semaforul global
- se folosește find sau un utilitar echivalent pentru a extrage din directorul de configurare cel mai vechi fișier
- se comandă scriptul commander care primește ca argument fișierul de mai sus
- se așteaptă încheierea programul commander
- se șterge cel mai vechi fișier de configurare
- Ieșire
- N/A
Commander
- Descriere
- modulul copiază de pe sistemul de testare arhiva temei și arhiva de test și, folosind informațiile din fișierul de configurare, comandă programul vm_executor pentru testarea temei pe mașina virtuală sau jail_executor pentru testare in jail
- Intrare
- fișier de configurare a unei instanțe de testare a unei teme
- fișier de configurare globală a mașinilor virtuale de pe site (ini) sau testare locală (jail)
- Acțiune: se rulează programul commander care primește ca argument fișierul de mai sus
- se parsează fișierul - se obțin toate informațiile necesare (adresă IP sistem de upload, cale completă arhivă tema, test, informații de deadline etc.)
- se copiază prin SSH arhiva temei (stocată în fișierul local file.zip) și testele asociate (stocate local în fișierul tests.zip)
- se parsează fișierul global de configurare a mașinilor virtuale (ini); pe baza cursului și a identificatorului temei se obțin informații complete despre mașina virtuală
- se execută programul vm_executor sau jail_executor care primește argumente necesare pentru testarea temei pe mașina virtuală
- după încheierea programelor *executor se calculează întârzierile și eventualele depunctări (grade.txt)
- se copiază la distanță fișierul/fișierele rezultat (grade.txt, build.txt, run.txt)
- se șterge de la distanță fișierul de configurare; echivalent cu scoaterea din coada de pe sistemul de upload a instanței de testare
- Ieșire
- rezultatele rulării temei pe sistemul de upload
VMExecutor
- Descriere
- testare efectivă a unei teme pe mașina virtuală
- presupune rularea programului *_executor
- Intrare: multe din informațiile de mai jos sunt obținute din parsarea fișierului de configurare globală a mașinilor virtuale
- calea către mașina virtuală (fișierul .vmx)
- calea către arhiva temei
- calea către arhiva de teste
- calea unde vor fi stocate fișierele rezultat (build.txt, run.txt)
- dacă se activează mesajele de kernel
- calea de pe mașina virtuală unde va fi rulată tema
- numele de utilizator și parola utilizatorului mașinii virtuale
- calea către shell-ul de pe mașina virtuală
- timp de așteptare pentru încheierea testării pe mașina virtuală (timeout)
- Acțiune
- se reface mașina virtuală la un snapshot
- se copiază arhiva temei și arhiva de teste pe mașina virtuală
- se comandă dezarhivarea temei și a testelor
- se comandă compilarea (build) temei și a testelor
- se rulează testul
- se așteaptă încheierea testării (timeout)
- se copiază fișierele rezultat de pe mașina virtuală
- Ieșire
- fișiere rezultat în directorul de rezultate; de aici vor fi prelucrate de commander
JailExecutor (planificat, neimplementat)
- Descriere
- testare efectivă a unei teme pe sistemul local într-un jail (context cu drepturi limitate)
- presupune rularea programului jail_executor
- Intrare: multe din informațiile de mai jos sunt obținute din parsarea fișierului de configurare globală unde vor fi precizate materiile ale căror teme vor fi corectate prin testare locală în jail
- calea către arhiva temei
- calea către arhiva de teste
- calea unde vor fi stocate fișierele rezultat (build.txt, run.txt)
- timp de așteptare pentru încheierea testării locale (timeout)
- Acțiune
- se copiază arhiva temei și arhiva de teste în jail
- se comandă dezarhivarea temei și a testelor
- se comandă compilarea (build) temei și a testelor
- se rulează testul
- se așteaptă încheierea testării (timeout)
- se copiază fișierele rezultat din jail
- Ieșire
- fișiere rezultat în directorul de rezultate; de aici vor fi prelucrate de commander
TestDescription
- nu este un modul propriu-zis al aplicației; precizează interfața pe care trebuie să o ofere testul și modul de rulare a acestuia
- interfața testului este dată de un fișier Makefile (Unix sau Windows), denumit Makefile.checker
- fișierul Makefile.checker poate dispune de mai multe reguli dintre care vor fi rulate în ordine următoarele 6:
- pre-build - comenzi de executat înainte de compilarea testului
- build - comenzi pentru compilarea testului
- post-build - comenzi de executat după compilarea testului
- pre-run - comenzi de executat înainte de rularea testului
- run - comenzi pentru rularea testului
- post-run - comenzi de executat după rularea testului
- în cazul Windows, rularea scripturilor necesare (Visual C++, PSDK, WINDDK) este realizată independent de Makefile
- fișierul Makefile.checker poate dispune de mai multe reguli dintre care vor fi rulate în ordine următoarele 6:
- arhiva temei trebuie, de asemenea, să furnizeze un fișier Makefile (denumirea trebuie să fie una implicită pentru utilitarul make sau nmake)
- fișierul Makefile poate disppune de mai multe reguli dintre care vor fi rulate în ordine următoarele 3:
- pre-build - comenzi de executat înainte de compilarea temei
- build - comenzi pentru compilarea temei
- post-build - comenzi de executat după compilarea temei
- fișierul Makefile poate disppune de mai multe reguli dintre care vor fi rulate în ordine următoarele 3:
Repartizare după reproiectare
- LoginInterface
- UploadInterface:
- CheckConfig: Dev: Ana
- RemoteCheck: Dev: Alexandru; CodeReview?: Lucian
- Notifier Dev: Lucian
- QueueManager Dev: Lucian, CodeReview?: Alexandru
- Commander Dev: Lucian, Adriana
- VMExecutor: Dev: Adriana; CodeReview?: Alexandru
- [JailExecutor]: Dev: N/A
- TestDescription: Dev: Răzvan
- Helper?: Dev: Răzvan
