Táblázatok és nézetek Junos Pyez

vel (Nayan Gadre) (2020.09.12.)

Ezek a jegyzetek dolgozik a Junos pyez könyvtárral a hálózat automatizálása érdekében. A Junos Táblák és Nézetek szolgáltatást nyújt az egyedi konfigurációs adatok beállításához és kibontásához. Az összes pyez kód és az ncclient az openache Apache 2.0 licenc alatt

Táblázatot és nézetet definiálhat egy Yaml fájlban a lib / jnpr / junos / erőforrások
mint például a „ user.yml ” és a megfelelő fájlok betöltő fájl „ user.py

user.yml
user.py

A„ user.py ”a yaml Table és View definíciókat konvertálja a python globális szótár elemeivé. Itt \_\_file \_\_ mutat a „ user.py ” fájl, amely megtörténik. majd konvertálja át „ user.yml ” fájlnévvé. A junos pyez loadyaml majd átalakítja a „ user.yml ”szótárba a globálok () szótárhoz.

A tábla és a Nézet definíciók is a yaml-ben osztályokba konvertálódnak a pythonban. A loadyaml egy gyári módszer, és nyilvános API-ként van kitéve a \_\_ all \_\_ pythonikus deklaráció. Szótárat tartalmaz az elem-név és az osztály-osztályok definícióiról, amint az az egy soron belül látható.

A user.yml fájl két legfelső szintű kulcsra van felosztva: „ UserTable ” és „ UserView “, így a A loadyaml két osztályt ad vissza ilyen nevekkel.

szótár a user.yml

Ez a szótár továbbításra kerül a FactoryLoader.load ( ) módszer az osztályok előállításához:

FactoryLoader (). load (yaml.load (open (elérési út, „r”), Loader = yaml.FullLoader))

A gyári betöltő osztály célja

A szótárak elemei () metódus r eturns egy nézetobjektumot, amely tartalmazza a kulcs-érték párokat tartalmazó tömbök listáját.

A gyári betöltő a sémában található kulcsokon keresztül döntheti el, hogy a megadott tábla és nézet séma konfigurálásra vagy műveletekre vonatkozik-e. . Például: „ set ” és „ get ” kulcsok konfigurációs táblává tennék,
rpc ”, majd a művelete tábla, „ parancs ” vagy „ cím “, majd annak parancstáblája, van néhány zavaros kombinációja is a „ elemnek nézet ”és„ * ”, amelyek azt is meghatározzák, hogy parancstábláról van-e szó.

Mivel a következőkre összpontosítunk: a „ user.yml ” azt láthatjuk, hogy ez egy konfigurációs tábla, mivel rendelkezik „ set ” a hierarchiájában. Ezért feltöltjük a \_item\_cfgtables a UserTable kulcs.

Ez az osztálykészítő függvény a táblaosztály előállításához a konfigurációs típusú táblákhoz.

A Táblázat osztály hivatkozást tartalmaz a Nézet osztályra, ezért ha a táblázat részben definiált nézet van, akkor a \_build\_view () módszerrel létrehozunk egy osztályt ehhez a nézethez, és állítsuk be az osztály a „ nézet ” kulcs értékeként.

A get () szótár lehetővé teszi az alapértelmezett érték beállítását, ha a kulcs nincs , itt a „ view\_name ” kulcs hiányzik, ezért a \_build\_view ( view\_name ) létrehoz egy osztályt, és az osztályt értékként társítja a view\_name gombot. Ezenkívül kibontja a csoportokat, az eval, a mezőket, és a nézetobjektumok belső mezőibe tárolja őket.

Először ellenőrizni fogjuk, hogy a CFGTABLE a \_CFGTBL
\_CFGTBL = FactoryCfgTable

A Python lehetővé teszi dinamikus osztályok vagy típusok létrehozásához a „ type ” módszerrel.
Ha „ type ”egy meglévő objektumot továbbítanak, visszaadja a típusát. Ha azonban a „ type ” 3 argumentumot kap, akkor a „ osztálynév ”,„ alapok ”,„ dict ”, akkor új osztályt ad vissza. Van egy „ vars ” módszer is, amely visszaadja a \_\_dict\_\_ attribútum, amely az objektumok írható attribútumokat tárol. A Python metaclasses segítségével más osztályokat hoz létre.

Átadhatjuk annak az osztálynak a nevét, amelyből az új osztály örökölni fog, mint egyetlen köteg: Például: new\_cls = type (tábla\_neve, (CfgTable,), {})

Ha „ set ”kulcsszó a táblázat részben található:
például: set: system / login / user
Ezért át kell mennünk a config alaposztályban is, hogy létrehozzuk a UserTable osztályt:
Például: new\_cls = type (tábla\_neve, (CfgTable, Config), {})

mezők, amelyek automatikusan kitöltődnek az osztályban

Az osztály egyszer létrejön, hozzáadjuk a factoryLoader osztályok katalógusához: self.catalog [table\_name] = cls

Most folytatjuk a nézet osztály létrehozását:

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

A view\_name user.yml ” fájlban meghatározott / div> „ userView ”.

Végül a„ betöltés ”A FactoryLoader osztály által létrehozott osztályok katalógusát adja vissza.

Így összefoglalva az utat:

Ez csak egy részt fejez be, ahol az yml osztályokká konvertálódik, és ezután felhasználható a műveletekre. Tehát ezután a UserTable osztály objektumának létrehozásával kezdjük.

user\_table = UserTable (dev)

Mivel az újonnan létrehozott UserTable örökli a CfgTable és a Config alaposztályok, örököljük a konstruktort és az ezekben az alaposztályokban definiált összes metódust. Amint létrehozunk egy új UserTable objektumot, hívja a \_\_init\_\_ . Mivel a „ set ” szerepel az yml fájlban, ezért a config alaposztály.

Ezek után hívja a get () módszer a system / login / user hierarchia.
Először ellenőrizzük a namesonly = false beállítást.

Ne feledje, hogy az xpath kifejezés hierarchiáját a set: system / login / user „ user.yml ”utasítás. A \_build\_xml függvény ezt lefordítja a-ra. XML, mint az alábbiak:

Ha a felhasználó meghatározott felhasználói nevet adott meg, amelyet „ namekey ” néven emlegettek, akkor szükségünk van hogy beillessze ezt a fent létrehozott xml-be. Például: get (user = ”regress”) beillesztené a név elemet regresszióval:

regresszió

mindent a get\_cmd fájlba csomagolunk és elküldünk a self.RPC.get\_config (get\_cmd) fájlra
Egy tipikus XML- Az RPC az alábbiak szerint néz ki:

XML RPC metódus formátumának hívása XML

A felhasználói információk lekérésére szolgáló XML fájlunk így néz ki:

Ezt az XML-RPC-t HTTP POST-kéréssé konvertálják és elküldik a szervernek: Futtat egy XML-RPC-t, és XML-ként vagy natív pythonként adja vissza az eredményeket >

A tényleges RPC hívás az ncclient rpc módszerével történik az ssh felett, így az adatok titkosítva vannak.

Az RPC kezelése a rpc\_cmd\_e az. az ncclient végzi, amely biztosítja a netconf végrehajtását az ssh felett. Nehéz lesz megérteni, hogy az ncclient csomag Manager () objektumában az rpc metódus valójában hol lett meghatározva. Az ncclient könyvtár tanulmányozása után megállapítottam, hogy a módszer az „rpc” = ExecuteRpc , és ez a szótár gyártóspecifikus. Kattintson ide a további információkért .

Ez a teljes szótárnévvelési művelet minden összekapcsolási kérelemhez a szállító alapján jön létre, és visszaküldik.

A végső XML RPC ssh too netconf szerveren keresztül is elküldött Junos eszközön

Gyors a netconf munkamenet kezdeményezésének és cseréjének összefoglalása:

Az ügyfélnek netconf kapcsolatot kell kezdeményeznie a 830 az ssh felett. A szervernek azonnal el kell küldenie szia üzenetét, és az ügyfélnek is ezt kell tennie. A teljes szia > üzenet meghatározza az ügyfél és a szerver képességeit. A szervernek ekkor várnia kell a rpc > kérések feldolgozására, és el kell küldenie egy rpc-válasz >. Az ügyfél annyi XML-attribútumot adhat a rpc > elemhez, amennyit csak kíván, A szerver visszaadja az összes attribútumot az rpc-válasz > elemben.

A válasz elemezve van ok > és rpc-error > nem vagy semmilyen hibát jelző címkék. Ezután eszköz / gyártó függő formátumban alakítja át, eltávolítja a névtér címkéit stb.

A válasz végül az alábbiak szerint érkezik:

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