Tabelele și vizualizările cu Junos Pyez

(Nayan Gadre) (12 septembrie 2020)

Acestea sunt note create în timp ce lucrul cu biblioteca Junos pyez pentru automatizarea rețelei. Junos oferă tabele și vizualizări pentru a seta și extrage date de configurare personalizate. Tot codul pyez și ncclient sunt opensource sub licența Apache 2.0

Definiți un tabel și o vizualizare într-un fișier Yaml la lib / jnpr / junos / resurse
cum ar fi „ user.yml ” și ​​corespunzător fișier de încărcare ca „ user.py

user.yml
user.py

user.py ”este folosit pentru a converti fișierul yaml Table și Definiții în elementele de dicționar global ale python. Aici \_\_file \_\_ indică „ user.py ” fișier care va. apoi fiți convertit în numele de fișier „ user.yml loadyaml de la junos pyez va converti apoi utilizatorul „ user.yml ”într-un dicționar pentru a-l atașa la globals () dicționar.

Atât definiția Tabel, cât și Vizualizarea din yaml sunt convertite în clase în python. loadyaml este o metodă din fabrică și este expus ca API public utilizând \_\_ toate \_\_ declarație pitonică. Acesta oferă un dicționar de definiții de nume de articol și de clasă de element, așa cum se poate vedea în snap-ul cu o singură linie.

Fișierul user.yml este împărțit în 2 taste de nivel superior: „ UserTable ” și ​​„ UserView ” deci loadyaml va returna 2 clase cu aceste nume.

dicționar convertit din user.yml

Acest dicționar este transmis către FactoryLoader.load ( ) metodă pentru a genera clase:

FactoryLoader (). load (yaml.load (deschis (cale, „r”), Loader = yaml.FullLoader))

Scopul clasei de încărcătoare din fabrică

Elementele dicționarilor () metoda r afișează un obiect de vizualizare care conține o listă de tupluri care conțin perechi cheie-valoare.

Modul în care încărcătorul din fabrică decide dacă tabelul furnizat și schema de vizualizare sunt pentru configurare sau pentru operațiuni este prin intermediul tastelor prezente în schemă . De exemplu: „ set ” și ​​„ obțineți ” ar face din acesta un tabel de configurare,
rpc ” atunci este o operațiune tabel, comanda „ ” sau „ title ” atunci este un tabel de comandă, există, de asemenea, o combinație confuză de „ element ” “ vizualizați ”și„ * ”, care dictează și dacă este un tabel de comenzi.

Deoarece ne concentrăm pe „ user.yml ” putem vedea că este „un tabel de configurare, deoarece are un„ set ” în ierarhia sa. Prin urmare, vom popula \_item\_cfgtables cu UserTable cheie.

Aceasta este funcția de generare a claselor pentru generarea clasei tabelelor pentru tabelele tipului de configurație.

Clasa Table conține o referință la clasa View dacă există o vizualizare definită în secțiunea tabel, vom crea o clasă pentru acea vizualizare folosind metoda \_build\_view () clasa ca valoare a cheii „ vizualizare ”.

Metoda dicționar get () , permite setarea unei valori implicite dacă cheia nu este prezentă , aici „ view\_name ” va lipsi, deci \_build\_view ( view\_name ) va crea o clasă și va asocia clasa ca valoare view\_name tasta. De asemenea, va extrage grupurile, eval, câmpuri și le va stoca în câmpurile interne ale obiectelor de vizualizare.

Mai întâi vom verifica modul în care containerul CFGTABLE este creat la \_CFGTBL
\_CFGTBL = FactoryCfgTable

Python vă permite pentru a crea clase sau tipuri dinamice utilizând metoda „ tip ”.
Dacă „ type ”este trecut un obiect existent, acesta returnează tipul său. Cu toate acestea, dacă „ type ” este trecut cu 3 argumente, „ numele clasei ”,„ tuplul de bază ”,„ dict ”apoi returnează o nouă clasă. Există, de asemenea, o metodă „ vars ”, care returnează \_\_dict\_\_ atribut, care stochează atribute care pot fi scrise. Python creează alte clase folosind metaclasele.

Putem transmite numele clasei de la care noua clasă va moșteni ca un singur tuplu: De exemplu: new\_cls = type (table\_name, (CfgTable,), {})

Dacă „ set ”cuvântul cheie este prezent în secțiunea Tabel:
de exemplu: set: system / login / user
Deci ar trebui să trecem și în clasa de bază config pentru a crea clasa noastră UserTable:
De exemplu: new\_cls = type (table\_name, (CfgTable, Config), {})

câmpuri care sunt completate automat în clasă

Odată ce clasa este creat, îl vom adăuga în catalogul claselor factoryLoader: self.catalog [table\_name] = cls

Acum trecem la construirea clasei de vizualizare:

view\_name = tbl\_dict [„ view ”]
tbl\_dict [“ view ”] = self.catalog.get (view\_name, self.\_build\_view (view\_name))

view\_name definit în fișierul „ user.yml ” este „ userView ”.

În cele din urmă,„ încărcați ”Va returna un catalog de clase create de FactoryLoader .

Deci, rezumând calea:

Asta tocmai completează o parte în care yml este convertit în clase care pot fi apoi utilizate pentru a opera. Apoi, începem prin a crea un obiect din clasa noastră UserTable.

user\_table = UserTable (dev)

De la nou-creat UserTable moștenește de la CfgTable și clasele de bază Config, vom moșteni constructorul și toate metodele definite în acele clase de bază. De îndată ce creăm un nou obiect UserTable , acesta apelează \_\_init\_\_ a claselor părinte. Deoarece „ set ” este menționat în fișierul yml, vom apela și constructorul config clasa de bază.

După aceasta, sunați metoda get () pentru preluarea datelor de configurare pentru system / login / user ierarhie.
Vom verifica mai întâi opțiunea namesonly = false .

Amintiți-vă că ierarhia pentru expresia xpath a fost deja setată prin set: system / login / user declarație„ user.yml ”. O funcție \_build\_xml traduce asta într-un. XML ca mai jos:

Dacă utilizatorul a specificat un anumit nume de utilizator, denumit „ namekey ”, atunci avem nevoie pentru a insera asta în xml-ul generat mai sus. De exemplu: get (user = ”regress”) ar introduce elementul de nume cu valoare regress:

regress

totul este ambalat în get\_cmd și trimis la self.RPC.get\_config (get\_cmd)
Un XML tipic- RPC arată așa mai jos:

formatul XML apel metodă RPC XML

XML-ul nostru pentru obținerea informațiilor despre utilizator arată astfel:

Acest XML-RPC este convertit într-o solicitare HTTP POST și trimis la server: Execută un RPC XML și returnează rezultatele fie ca XML, fie ca python nativ >

Apelul real rpc se face prin metoda rpc a ncclient peste ssh, astfel încât datele să fie criptate.

Tratarea RPC a rpc\_cmd\_e este. realizat de ncclient care oferă implementare pentru netconf peste ssh. Va deveni dificil de înțeles unde este definită de fapt metoda rpc din obiectul Manager () din pachetul ncclient. După ce am studiat biblioteca ncclient, am constatat că este definită ca un dicționar de metode cu „rpc” = ExecuteRpc , iar acest dicționar este specific furnizorului. Faceți clic aici pentru a citi mai multe .

Această întreagă operație de dicționar de nume este creată pentru fiecare cerere de conectare bazată pe furnizor și returnată.

RPC-ul final XML trimis pe ssh prea server netconf pe dispozitivul Junos

rezumatul inițierii și schimbului sesiunii netconf:

Clientul trebuie să inițieze o conexiune netconf la portul 830 peste ssh. Serverul ar trebui să-și trimită imediat mesajul Bună ziua și clientul ar trebui să facă același lucru. Întregul mesaj salut > specifică capacitățile clientului și ale serverului. Apoi, serverul ar trebui să aștepte să proceseze orice solicitări rpc > și ar trebui să trimită un rpc-reply >. Clientul poate adăuga cât mai multe atribute XML la elementul rpc > și doriți serverul va returna toate acele atribute din rpc-reply > element.

Răspunsul este analizat, pentru ok > și rpc-error > etichete care indică erori / nu. Apoi, este transformat într-un format dependent de dispozitiv / furnizor, eliminați etichetele spațiului de nume etc.

Răspunsul este primit în cele din urmă după cum urmează:

[(regress, [(user, regress), (uid, 928), (class\_name, superuser), (password, abc123 @ # $ # $ ^)])]