A munkahelyemen félévente külön teret adnak a kreativitásnak: egy 24 órás programozó maratont (hackatlon) szerveznek, ahol különféle ötleteinket kiélhetjük magunk.
Egy barátommal, aki történetesen a kollégám is (commiter oszlopban brogrammer néven szerepel), úgy döntöttünk, hogy az egyik cluster termékünk tesztjeit hatékonyabbá és olcsóbbá kellene tenni,
amihez KVM alapú virtualizációval kellene egy framework, amiben lehet felhúzni clustereket percek alatt. (Így például a kereskedemi virtualizációs megoldások licencein tudnánk spórolni.)
Ezt a célt kitűzve magunk elé, belevágtunk a “Cluster Termékünk Neve virtualized smoke test” projektbe.
A munkakörülmények adottak voltak:
- áram
- LAN, internet (mondjuk csak WiFi volt technikai okokból, és ez kissé az utunkba is állt)
- játszós gépek: 2 (Sun?) Blade (8 Xeon mag + 8 HT, 48 GB RAM, több mint elég HDD, Ubuntu 14.04 LTS)
- kávé
- energiaital (annak aki ilyesmiket iszik)
- rostos és szénsavas üdítők
- sör, buzisör
- pizza
- chips
- xbox one, ps 4
Tehát étel, ital is volt gyakorlatilag végtelen mennyiségben. A bladek több mint elegendőek voltak számunkra. Our greetings fly to the lab operators!
Miután megterveztük a cluster setupot nekiláttunk egy RESTful webapp készítésének, amit backend microservicenek szántunk, de végül eléggé monolitikus lett a dolog. :)
Ez az alkalmazás gyártotta le a libvirt számára a konfigurációs xml-eket, és bizgerálta a KVM-et a libvirt segítségével.
Összességében nem sikerült minden célunkat elérni, de sikerült egy olyan állapotig eljutni, hogy egy clustert be tudunk bootolni, és le tudunk állítani a kis webapp segítségével.
A sikerünkhöz hozzájárult a megfelelő stack választásunk:
- Ubuntu 14.04 LTS
- KVM
- libvirt
- Python 2.7 + IPython
- Flask web microframework
- Jinja 2 template engine
- Stack és Heap in-memory adatbázisok
- git
- Gogs git frontend a szép színes git loghoz, és access controlhoz. (Tisztára egy privát github!)
- Pure CSS a reszponzív témához (hisz ki ne akarná a mobiljáról vezérelni a clusterjét! Tudjuk, hogy lehetett volna Bootstrappal ezt is, de most így alakult.)
- Bootstrap a színes gombokhoz és ikonokhoz
- YAML a konfig fileokhoz
- Visual Studio Code
Tanulságok
Jónéhány fontos tanulsága volt az eseménynek:
A pihenés fontos
A legfontosabbak a fáradtság kezelésével, és az energia helyes beosztásával kapcsolatos tanulságok: Utálom az energiaitalok szagát. A különféle serkentőszerek szervezetbe juttatásánál érdemes a használati útmutatót követni. Még akkor is, ha már 24 órája vagy ébren!
Nem érdemes így maratoniban kódolni, főleg nem úgy, hogy már reggel a munkába is hullafáradtan érkeztem, miután nem rendesen elaludni. Valószínűleg több eredményt értünk volna el, ha rendesen alszunk, mondjuk legalább 6 órát.
Amúgy épp a minap olvastam egy ehhez lazán kapcsolódó írást: Sabotage - az önszabotálás kultuszáról, okairól, hátrányairól, előnyeiről. Angolul.
A libvirt API, Python binding és a doksija elég gáz
Generált a binding. Ez nem lenne még gond, ha vették volna a fáradtságot rendesen megcsinálni. Sajnos nem vették, vagy teljesen eltér a rendesen megcsinálásról a véleményük az enyémtől.
A C apiban, mivel ott nincsenek namespacek, prefixelt minden függvénynév. A bindingban ezek le vannak vágva, de elég brainfuck módon. Persze pythonban nincs segítség az autocomplete type hintjeiből sem. Az egészet talán legjobban összefoglaló példa:
Vajon mit csinálhat a libvirt connection createXML()
metódusa? Nem, nem XML-t csinál! Egy VM leíró XML-t vár argumentumként, és abból csinál egy VM-et. Ez a C API-ban a DomainCreateXML hívás, ami már sejthető, hogy mit csinál.
A linux bugzani fog
Másik tanulság az, hogy linuxxot csak magic sysrq-val indíts újra, ha nincs iLO, IPMI vagy egyéb out of band remote konzolod. Történt ugyanis, hogy a libvirtes kisérletezgetés során a KVM kicsit betojt, és beragadt egy VM. Gondoltuk, hogy újraindítjuk, de le sem állt a gép, viszont az sshd-t már kilőtte… Szerencsénkre egy laboros kolléga még dolgozott ezen a késői órán is, és így erőből újraindította a gépet nekünk.
A konzolok továbbra is… konzolok
Az XBOX One és a PlayStation 4 is console plebeknek való. FPS játékot controllerrel játszani? Összességében nem találtam nagyon jónak a játékélményt egyiken sem, pedig neves franchiseok darabjait próbáltam ki.
Az pedig, hogy a Need For Speed valamennyivel vagy nem lehet split-screen versenyezni (XBOX One), vagy úgy el van rejtve annak a módja, hogy nem találtuk meg, így vagy úgy, de a játékipar szégyene. A játékipar többnyire amúgy is szégyen.
A rendes nyelvek nem véletlen vannak ott az ipari felhasználásukban, ahol
Egy másik tanulság: a duck typing hamar nagyon drága lesz. Egy jó típusrendszer, egy jó fordító, és máris jobban megy a kód írása fáradtan is.
A pythonban az első lépések nagyon faszák voltak, aztán már ennyi idő alatt eljutottunk oda, hogy jobban visszafogott minket, mint segített.
A fáradtság lenyomata
A projektet nem tesszük közzé, mert ez csak a miénk. Meg amúgy is csúf a kód, meg python. :)
Ellenben megosztjuk a commit messageket. Érdemes a commit messageken keresztül követni a fáradtság hatását a kognitív képességekre.
Jól látható, hogy miként fogyott az erőnk az értelmes összefoglalók megírására. Emellett az is megfigyelhető, hogy miután hajnalban ledőltünk 1-2 órát aludni, majd megreggeliztünk, utána ismét értelmesebb üzeneteket tudtunk írni.
Time | Committer | Commit message |
15:12:21 | | initial commit |
15:10:39 | kódfodrász | Extended README |
15:25:03 | brogrammer | Add kvm scripts for starters |
18:19:55 | brogrammer | Add backend proto |
18:31:51 | egy másik pók | first |
19:15:14 | brogrammer | Add template |
21:29:32 | brogrammer | ninja2ization |
18:37:55 | kódfodrász | some vscode defaults for the project |
21:28:33 | kódfodrász | Start rewriting of the backend app |
21:50:11 | brogrammer | Add ninjaized templates |
22:19:18 | kódfodrász | Added bridge name heuristic |
22:46:48 | brogrammer | Add network xml creation |
22:57:39 | kódfodrász | bridge generation in Cluster |
23:37:34 | brogrammer | Domain status |
23:42:12 | kódfodrász | Refactored network creation. Added storage creation. |
00:53:53 | kódfodrász | tempalte loading from yaml |
00:59:55 | brogrammer | bringup |
01:13:22 | brogrammer | dont try this at home |
01:21:09 | brogrammer | works as designed |
01:21:46 | brogrammer | moar blobz |
01:32:48 | brogrammer | only on post................. |
01:28:11 | kódfodrász | dep injection. add storage. stuff. |
01:40:10 | kódfodrász | listen on all interfaces |
01:43:10 | kódfodrász | fix stuff |
01:53:02 | brogrammer | netcode |
02:00:29 | brogrammer | refactor |
01:44:50 | kódfodrász | add shell script to start up app |
01:57:20 | kódfodrász | create domain in bringup |
02:04:29 | brogrammer | storage |
02:10:53 | brogrammer | Call net and storage bringup |
02:12:24 | brogrammer | typo |
02:13:05 | brogrammer | faszom mar |
02:14:25 | brogrammer | prxl |
02:18:05 | brogrammer | mi van maaaar |
02:15:40 | kódfodrász | mar az en faszom is |
02:22:39 | kódfodrász | python suxxs |
02:27:12 | kódfodrász | i am a bad mothafucka! |
02:38:53 | brogrammer | i |
02:42:46 | brogrammer | debug |
02:42:02 | kódfodrász | log some shit |
02:46:10 | kódfodrász | this is a patriarchal commit |
02:47:12 | kódfodrász | this time feminists won :( |
02:49:14 | kódfodrász | e! |
02:56:51 | kódfodrász | dem plates |
03:07:17 | brogrammer | lool |
03:07:55 | brogrammer | szabtoaaaaszzzsss |
03:08:56 | brogrammer | nem |
03:11:12 | brogrammer | azrt |
03:13:06 | brogrammer | tokeletes |
03:15:14 | brogrammer | forman |
03:19:25 | brogrammer | mindent megcsinaltam |
03:22:08 | brogrammer | mit tudjuk mirol van szo |
03:36:02 | brogrammer | whitespace fix and backdoor for nsa |
03:45:43 | brogrammer | random minden |
04:00:39 | kódfodrász | teardown |
04:35:49 | kódfodrász | nem vagyok beszamithato |
07:20:42 | brogrammer | css a little (very little) |
07:23:59 | brogrammer | iii |
07:32:45 | brogrammer | Always return something |
07:38:54 | brogrammer | Delete host handler |
08:05:07 | brogrammer | Fixit |
08:29:08 | kódfodrász | ez má' igen! |
08:41:02 | kódfodrász | a hohes c multivitamin nyito kupakot vagy gonosz vagy idiota emberek terveztek. |
08:47:01 | kódfodrász | én ugyan biztos nem a majomtól származom!!4! Kulonben is, te reviewztad |
08:56:45 | brogrammer | ez meger egy komitot |
09:00:54 | brogrammer | eloleptetnek menedzserre annyira szart kodoltam |
09:02:01 | brogrammer | eating is for pussies |
09:05:19 | brogrammer | pitno plz |
09:26:26 | kódfodrász | Add some responsiveness |
09:49:41 | kódfodrász | éjjel ötkor ne szivj táplálékkiegészitőt az orrodba |
10:07:00 | brogrammer | Add bootstrap |
10:16:09 | brogrammer | more fancy |
10:16:57 | brogrammer | correct to submit |
10:18:41 | brogrammer | Fix action |
10:36:00 | brogrammer | jol szetcsesztem hehe |
10:38:16 | brogrammer | iso |
10:52:20 | brogrammer | template changes |
13:23:56 | kódfodrász | extend readme |
Konklúzió
Részben sikerült a célunk. Kipróbáltunk dolgokat, amiket egy hétköznap nem tennénk. Jól éreztük magunk. Azt hiszem, hogy legközelebb is megyünk, és bőrőzünk! Én legalábbis szeretnék, és brogrammer is ennek jeleit mutatta.