Verktøy for utvikling av Cerebrum

Informasjon, tips og triks til dei ulike verktøya som brukast for utvikling av Cerebrum.

1   Python/Cerebrum oppsett

1.1   En mulig måte er å bruke envtoolkit fra Cerebrum devutils

Kjør følgende:

git@github.uio.no:IT-CEREBRUM/crb-devutils.git

Les devutils/envtoolkit/INSTALL.rst

Et fint triks for å koble via gt-auth automatisk, er å legge følgende i ~/.ssh/config:

Host cere-utv04
    ProxyCommand ssh <gtauth user>@gt-auth nc %h %p

Et annet fint triks, er å legge din offentlige ssh-nøkkel inn i ~/.ssh/authorized_keys, på både gt-auth og cere-utv04, som gjør det betraktelig mindre smertefritt samt raskere å få logget inn.

2   Utviklingsmiljø

  • cere-utv04: Nytt utviklingsmiljø. Bruk denne.
    • OS: RHEL7
    • Lokal lib: /usr/lib/python2.7/site-packages/

3   Øvrig oppsett

3.1   Setup.py

Installasjonsskriptet som set opp filene til Cerebrum-prosjektet. Den vanlegaste måten å køyre Cerebrum-kode i test på er ved å legge git-repoet i $PYTHONPATH, men om ein treng å teste installasjonsopplegget så er det setup.py som set opp dette. Mest brukt av Cerebrum drift. Du trengs altså ikkje å bruke setup.py for testing, med mindre det er sjølve setup.py du skal teste.

Døme på kommandoen:

$ python setup.py install --prefix /site/$USERNAME/cerebrum/

Dette legg ut alle filene under til dømes /site/jokim/.

#TODO: meir info!

3.2   makedb.py

Dette skriptet er for å opprette og vedlikeholde Cerebrum-databasen. Det kan sette opp ein ny, tom database, og når nye Cerebrum-konstantar vert definerte køyrast denne for å opprette dei i databasen. Den brukast også til å opprette nye tabellar ut frå nye design-filer. Migreringar vert derimot gjort av eit anna verktøy.

3.3   Ny database

For å opprette tom, ny database:

$ python makedb.py --extra-file design/mod_changelog.sql --extra-file ...

Opsjonen --extra-file legg til ekstra design-filer med funksjonalitet som ikkje er ein del av core, til dømes change-log. Det er vanleg å bruke denne mange ganger, sidan dei fleste instansar brukar ein del ekstra.

Kommandoen oppretter då alle tabellar som trengs. Konstantar må du legge inn etterpå.

3.4   Nye konstantar

Kvar gang du definerer ein ny konstant i Cerebrum-koden må denne leggast inn i databasen så du kan bruke den.

For å opprette nye konstantar:

$ python makedb.py --only-insert-codes # oppretter

For å opprette nye konstantar, oppdatere innhaldet i eksisterande og slette konstantar som ikkje lenger eksisterer:

$ python makedb.py --update-codes # oppretter, sletter og endrer

Kommandoen går gjennom Cerebrum etter alle definerte konstantar (henta frå cereconf.CLASS_CONSTANTS) og samanliknar dei med databasen.

3.5   Ny design-fil

Om du har ei ekstra design-fil du vil ha kjapt lagt til i databasen:

python makedb.py design/mod_new_file.sql

Kommandoen les då inn design-fila og gjer alt den vil av opprettingar, typisk oppretting av nye databasetabellar. Eventuelt nye konstantar må du legge inn etterpå, i ei eiga køyring med til dømes --only-insert-codes.

3.6   migrate

Dersom databasen må oppdaterast, til dømes at tabellar skal endrast på, må du migrere databasen. Dette gjerast med filer under design/migrate_to_*.

Følgende kommando migrerer dns-modulen fra versjon 1.3 til 1.4. (Det kan være fortrinnsmessig å kjøre makedb.py --only-insert-codes før migrering, hvis du har definert nye konstanter):

~/src/cerebrum/contrib/migrate_cerebrum_database.py --component=dns --from=dns_1_3 --to=dns_1_4 --makedb-path=~/src/jcerebrum --design-path=~/src/cerebrum/design

#TODO: beskriv kommando og kva som skjer!

3.7   psql

Dette er den vanlegaste postgresklienten for å få shell-tilgang til ein postgres-database.

cere-utv04.uio.no $ psql -h dbpg-cere-utv.uio.no -U cerebrum cerebrum_uio_ro
Password for user cerebrum:
cerebrum_uio_ro=>

Den støtter halvvegs autofullføring av kommandoar, databasar, tabellnamn og radnamn ved hjelp av tabbing.

Nokre greie hjelpe-kommandoar:

- \? - gir deg meir info om bruk av psql.
- \h kommando - gir deg informasjon om og formatet til ein sql-kommando.
- \d [tabellnamn] - gir ei beskriving av ein tabell, med liste over element
    og constraints. Om du ikkje oppgir noko tabellnamn får du ei liste over
    alle tabellar.
- \c [database] - kobler til gitt database. I testmiljøet kan du hoppe
    mellom dei ulike databasane på denne måten. Om du ikkje oppgir noko
    database koblar du til på nytt til databasen du allereie er i. Dette
    er praktisk til dømes når ein database har blitt oppdatert med ein ny
    kopi frå produksjonsmiljøet.

3.7.1   Tilgjengelege databasar

Nokre databasar vert automatisk oppdaterte med ein kopi av produksjonsmiljøet:

  • cerebrum_<instans>_ro
    Dette er ein kopi av produksjonsmiljøet for kvar instans. Desse er i utgangspunktet ReadOnly, og du bør lage ein kopi av ein slik database når du skal teste, og ikkje jobbe mot denne databasen direkte. Ikkje bruk denne databasen når du tester noko. Ikkje ver tilkobla denne databasen, då ingen får laga ein kopi av den om nokon bruker den.
  • cerebrum_uio_no_pq
    Dette er ein kopi av UiO sitt produksjonsmiljø, men der tabellen paid_quota_printjob er tømd. Dette fordi denne tabellen er svær, og som oftast unødvendig for testing. I oktober 2012 innehaldt denne tabellen 35'871'822 rader!
Andre databaser:
  • cerebrum_<instans>_<brukarnamn>
    Dette er det vanlege namneformatet for databasar du oppretter for testing.

3.7.2   Opprette test-database

Kvar natt får vi ein kopi av databasen til instansane Cerebrum drifter. Du bør ikkje gjere testar og endringar mot desse test-databasane, men heller lage deg ein lokal kopi. For å lage din eigen kopi av databasen:

cerebrum_uio_ro=> CREATE DATABASE cerebrum_uio_jokim WITH OWNER cerebrum TEMPLATE cerebrum_uio_no_pq;
CREATE DATABASE

cerebrum_uio_ro=> \c cerebrum_uio_jokim
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
You are now connected to database "cerebrum_uio_jokim" as user "cerebrum".

cerebrum_uio_jokim=> ANALYZE ;
WARNING:  skipping "pg_authid" --- only superuser can analyze it
WARNING:  skipping "pg_database" --- only superuser can analyze it
WARNING:  skipping "pg_tablespace" --- only superuser can analyze it
WARNING:  skipping "pg_pltemplate" --- only superuser can analyze it
WARNING:  skipping "pg_auth_members" --- only superuser can analyze it
WARNING:  skipping "pg_shdepend" --- only superuser can analyze it
WARNING:  skipping "pg_shdescription" --- only superuser can analyze it
WARNING:  skipping "pg_db_role_setting" --- only superuser can analyze it
ANALYZE

cerebrum_uio_jokim=>

Vi har ein database per instans, på formatet cerebrum_INST_ro. For UiO har vi også ein skrivbar test-database - cerebrum_uio_rw, som du kan køyre små testar mot, samt ein database utan utskriftskvoter, cerebrum_uio_no_pq. Tabellen for utskriftskvoter er svær, så du kan bruke denne databasen for å få ein kjappare database.

3.7.3   Bruke database i utviklingsmiljø

For at utviklingsmiljøet ditt skal kunne ta i bruk din nyopprettede test-database, må du kopiere/symlinke en allerede eksisterende passord-fil på cere-utv04, som ligger i mappen:

/site/cerebrum/<instans>/etc/passwords

Din passord-fil må ligge i samme mappe, og ha navn etter følgende format:

passwd-cerebrum@<database-navn>@dbpg-cere-utv.uio.no

Dette må gjøres for alle nye instanser du etterhvert begynner å arbeide på.

3.7.4   Sjå aktive tilkoblingar

For å feilsøke i databasetilkoblingar kan ein få ei liste over aktive db-tilkoblingar mot ein database i psql:

SELECT * FROM pg_stat_activity WHERE datname = 'cerebrum_uio_ro';
  datid  |          datname           | procpid | usesysid | usename  | application_name |  client_addr  | client_hostname | client_port |         backend_start         |          xact_start           |          query_start          | waiting |                                           current_query
---------+----------------------------+---------+----------+----------+------------------+---------------+-----------------+-------------+-------------------------------+-------------------------------+-------------------------------+---------+------------------------------------------------------------------------
 3619295 | cerebrum_uio_jokim         |   16407 |    16785 | cerebrum |                  | 129.240.2.119 |                 |       37019 | 2012-10-11 10:32:23.459898+02 |                               | 2012-10-11 10:42:50.120591+02 | f       | <IDLE>
 3604719 | cerebrum_nmh_jokim         |   10484 |    16785 | cerebrum |                  | 129.240.2.119 |                 |       54544 | 2012-10-10 14:39:28.170159+02 | 2012-10-10 14:39:32.639194+02 | 2012-10-10 14:40:12.574372+02 | f       | <IDLE> in transaction
 3590201 | cerebrum_uio_jokim_studaut |     937 |    16785 | cerebrum |                  | 129.240.2.119 |                 |       38321 | 2012-10-11 09:59:36.114355+02 | 2012-10-11 10:02:36.55046+02  | 2012-10-11 10:02:36.572672+02 | t       | DELETE FROM posix_user WHERE account_id = 1808175

Du kan sjå i kolonna current_query kva for kall som køyrast, for å sjå kva som tek tid.

Dersom du lurer på kva eller kven transaksjonen tilhøyrer, er kolonna client_port vesentleg. På maskina som er nemnd i client_addr (vanlegvis cere-utv01) kan du køyre bash-kommandoen:

# netstat -pa --numeric-ports --inet | grep CLIENT_PORT
tcp        0      0 cere-utv04.uio.no:CLIENT_PORT     dbpg-cereutv2.uio.no:DB_PORT   ESTABLISHED PROCESS_ID/python
/* Til dømes: */
tcp        0      0 cere-utv04.uio.no:37019           dbpg-cereutv2.uio.no:5432      ESTABLISHED 30499/python

# ps aux | grep PROCESS_ID
root     22560      0.0  0.0  61148   732 pts/1    S+   11:06   0:00 grep PROCESS_ID
USERNAME PROCESS_ID 0.0  0.5 198960 23756 pts/25   S+   10:32   0:00 COMMAND
/* Til dømes: */
jokim    30499      0.0  0.5 198960 23756 pts/25   S+   10:32   0:00 python /usit/platon/gt-u1/jokim/src/cerebrum-head/servers/bofhd/bofhd.py -c /usit/platon/gt-u1/jokim/jobb/config/uio/config.dat --unencrypted -p 10001 -h localhost

Ein ser då både kva skript som køyrast og kven det tilhøyrer.

3.7.5   Grave frem hva som låser en tabell

Finn databasens oid:

SELECT oid from pg_database WHERE datname = 'cerebrum_uio_ro';

Finn locks på denne databasen:

SELECT * FROM pg_locks WHERE database = 5643667;

Her vil du klassisk lete etter ekslusive låser. Hvis du finner en lås du vil titte på, kan du ta verdien i pid-feltet, og stappe det inn i:

SELECT * FROM pg_stat_activity WHERE procpid = 12765;

Med dette kan du spore opp sesjonen videre til klienten.

Hvis du ønsker å se hvilken tabell låsen er satt på, kan du f.eks. gjøre:

SELECT relname FROM pg_class WHERE oid = 5644075;

Her er oid verdien du finner i relation-feltet ved spørring mot pg_locks.

3.7.6   Finne fram i koden

For å enklare vite korleis klassar, metodar og variablar er definerte kan du bruke tags. Dette er ei fil som inneheld ei liste over alt som er definert i kodetreet, som gjer at du kan slå opp eit namn og finne ut kva det, kor det er definert, og evt. med kva parameter det er definert.

For vim, gå til cerebrum-mappa di:

ctags --recurse --exclude=".git" --exclude="clients/cweb" \
                --exclude="*~" \
                --exclude="contrib/no/ntnu/*" --exclude="contrib/no/uit/*" \
                --exclude="Cerebrum/modules/no/uit/*" --exclude="Cerebrum/modules/no/ntnu/*" \
                --languages="Python,PHP,Java"

For å bruke dette:

  1. Start opp vim i cerebrum-mappa di. Dette for at den leiter berre etter

    tags-fila i den mappa du er i (pwd).

  2. Gå til namnet som du vil slå opp.

  3. Trykk CTRL+}.

  4. Du vil bli sendt til fila der namnet er definert. Dersom namnet er definert

    fleire stader vil du få opp ei liste over alle, og må velge ein av dei med å skrive inn eit tal.

  5. Du kan hoppe til neste definisjon ved å fortsette med punkt 2.

  6. Når du vil hoppe tilbake eit hakk trykker du CTRL+T, ein gang for kvart

    hopp du har utført.

  7. Meir info, køyr: :help tags-and-searches

For emacs, gå til cerebrum-mappa di:

etags --recurse --exclude=".git" --exclude="clients/cweb" \
                --exclude="*~" \
                --exclude="contrib/no/ntnu/*" --exclude="contrib/no/uit/*" \
                --exclude="Cerebrum/modules/no/uit/*" --exclude="Cerebrum/modules/no/ntnu/*" \
                --languages="Python,PHP,Java"

TODO: Kva kommandoar brukast i emacs?

3.7.7   Minnebruk

Av og til kan det vere greit å vite kor mykje minne eit skript bruker.

Dette kan ein finne under /proc/$PID/status. Fila /proc/self/status vil alltid gi deg status for den prosessen du køyrer i.

Kva du kan legge inn på slutten av skriptet ditt:

for line in open('/proc/self/status'):
    if line.startswith('Vm'):
        print line.strip()

Som gir deg output av typen:

VmPeak:   757028 kB
VmSize:   756876 kB
VmLck:         0 kB
VmHWM:    571316 kB
VmRSS:    571080 kB
VmData:   564060 kB
VmStk:       192 kB
VmExe:         4 kB
VmLib:     13556 kB
VmPTE:      1416 kB
VmSwap:        0 kB

Det som gjerne er mest interessant er VmPeak som viser deg kva skriptet har brukt maksimalt på samme tid gjennom køyringa si. VmSize gir deg kor mykje minne du bruker i det du las inn fila frå proc.

3.7.8   Tidsbruk

Dersom du har behov for å sjå kva som gjer skriptet ditt treigt, kan cProfile vere smart å bruke. Dette er funksjonalitet som ser på kva python-koden din køyrer, og kan gje deg statistikk på slutten.

For å køyre det utan å endre skriptet:

python -m cProfile -o /tmp/cprofile.$USER.data -s cumulative ~/src/cerebrum/contrib/...

Ein kan deretter lese ut all informasjonen etterpå:

TODO

TODO: skriv meir om dette.

4   Øvrige verktøy

4.1   Søking i kode

Installer først the_silver_searcher.

For å raskt søke i kode (raskere enn ack) så er ag (the_silver_searcher) et hendig verktøy.

Her er et mulig alias:

alias ag="ag --color-line-number '1;32' --color-match '1;37' --color-path '1;34' -U"

4.2   Formattering av Python-kode (slik at den følger PEP8)

Installer først autopep8.

Her er et mulig alias:

alias pep8fix='autopep8 --jobs=-1 -i -v -a --ignore=W602 --max-line-length=99'

PEP8 krever ikke lenger at linjene må være max 80 karakterer lange, 99 er nå også ok. Vi har fra før mange linjer som er lenger enn 80.

Test at endringene fra autopep8 fungerer! Vanligvis fungerer det veldig bra.

4.3   Konvertering frå Vortex til RST

Dersom du har behov for å konvertere gamal dokumentasjon, som ligg i Vortex i HTML-format, over til cerebrum-dokumentasjon, som er i RST-format, kan du til dømes bruke pandion. Døme:

pandion --from HTML --to RST -o OUTPUT.rst INPUT.html
pandoc --from HTML --to RST -o OUTPUT.rst INPUT.html

Obs: Merk at du mest sannsynleg må endre på RST-fila manuelt etterpå, då den genererer ikkje alltid gyldig RST-syntaks. Du kan teste for feilmeldingar med:

rst2html FILE.rst > /dev/null

Sidan feilemeldingar kjem til stderr og ikkje stdout vil du då stå att med alle feilmeldingar. UiO-spesifikke feilmeldingar om uio-meta kan ignorerast.

4.4   Videoopptak av desktop

For Sprint Review kan det av og til vere nyttig å ta opp det du vil vise fram. Så kan demo-trollet berre komme!

Det er veldig enkelt, og tek eit halvt minutt å sette opp, i alle fall på Fedora 22: http://www.instructables.com/id/How-to-capturerecord-desktop-video-using-VLC-medi/

Av cerebrum
Publisert 24. sep. 2018 08:25 - Sist endret 2. des. 2022 10:57