Tabellen en weergaven met Junos Pyez

(Nayan Gadre) (12 sep.2020)

Dit zijn notities gemaakt terwijl werken met de Junos pyez-bibliotheek voor netwerkautomatisering. Junos biedt tabellen en weergaven om aangepaste configuratiegegevens in te stellen en te extraheren. Alle pyez-code en ncclient is opensource onder Apache 2.0-licentie

U definieert een tabel en een weergave in een Yaml-bestand op het lib / jnpr / junos / bronnen
zoals “ user.yml ” en de bijbehorende loader-bestand als “ user.py

user.yml
user.py

De” user.py “wordt gebruikt om de yaml-bestandstabel- en weergavedefinities te converteren naar de algemene woordenboekelementen van Python. Hier verwijst \_\_file \_\_ naar de “ user.py ” bestand dat zal. vervolgens worden geconverteerd naar “ user.yml ” bestandsnaam. De loadyaml van de junos pyez zal dan de “ user.yml “in een woordenboek om het toe te voegen aan het globals () woordenboek.

Zowel de tabel- als de weergavedefinities in de yaml worden geconverteerd naar klassen in python. De loadyaml is een fabrieksmethode en wordt weergegeven als openbare API met behulp van de \_\_ all \_\_ pythonische declaratie. Het biedt een woordenboek met itemnaam en itemklassedefinities zoals te zien in de module van één regel.

Het bestand user.yml is opgesplitst in 2 sleutels op het hoogste niveau: “ UserTable ” en “ UserView ” zodat de loadyaml retourneert 2 klassen met deze namen.

woordenboek geconverteerd vanuit het user.yml

Dit woordenboek wordt doorgegeven aan de FactoryLoader.load ( ) methode om klassen te genereren:

FactoryLoader (). load (yaml.load (open (pad, “r”), Loader = yaml.FullLoader))

Het doel van Factory Loader Class

De woordenboek items () methode r retourneert een view-object dat een lijst met tuples bevat die sleutel-waardeparen bevatten.

De manier waarop de fabriekslader beslist of de verstrekte tabel en het geleverde view-schema voor configuratie of voor bewerkingen zijn, is via de sleutels die in het schema aanwezig zijn . Voor bijvoorbeeld: “ set ” en “ get ” -toetsen zouden er een configuratietabel van maken,
rpc ” dan is het een bewerking tabel, “ commando ” of “ titel ” dan is het een commandotabel, er is ook een verwarrende combinatie van “ item ” “ bekijk “en” * “die ook aangeven of het een commandotabel is.

Aangezien we ons concentreren op de “ user.yml ” kunnen we zien dat het “een configuratietabel is, aangezien het een” set ” in zijn hiërarchie. Daarom vullen we de \_item\_cfgtables met de UserTable key.

Dit is de class builder-functie voor het genereren van de table-klasse voor configuratietypetabellen.

De Table-klasse bevat een verwijzing naar de View-klasse, vandaar als er een view is gedefinieerd onder de tabelsectie, zullen we een klasse voor die view maken met de \_build\_view () methode en de klasse als de waarde van de “ view ” -sleutel.

Met het woordenboek get () -methode kan een standaardwaarde worden ingesteld als de sleutel niet aanwezig is , hier zal “ view\_name ” -sleutel afwezig zijn, dus de \_build\_view ( view\_name ) zal een klasse maken en de klasse als waarde koppelen aan de view\_name sleutel. Het zal ook de groepen, eval, velden extraheren en ze opslaan in interne velden van view-objecten.

We zullen eerst controleren hoe de container CFGTABLE wordt gemaakt op \_CFGTBL
\_CFGTBL = FactoryCfgTable

Python stelt u in staat om dynamische klassen of typen te maken met de methode “ type “.
Als “ type “wordt een bestaand object doorgegeven, het geeft zijn type terug. Als “ type ” echter 3 argumenten wordt doorgegeven, wordt “ klassenaam “,” basistuple “,” dict “en daarna geeft een nieuwe klasse terug. Er is ook een “ vars ” -methode, die \_\_dict\_\_ attribuut, dat de schrijfbare attributen van objecten opslaat. Python maakt andere klassen met behulp van metaklassen.

We kunnen de naam van de klasse, waarvan de nieuwe klasse zal erven, als een enkele tuple doorgeven: Voor bijv .: new\_cls = type (table\_name, (CfgTable,), {})

If “ set “sleutelwoord is aanwezig onder de sectie Tabel:
voor bijvoorbeeld: set: system / login / user
We moeten dus ook de configuratiebasisklasse doorgeven om onze UserTable-klasse te maken:
Voor bijv .: new\_cls = type (table\_name, (CfgTable, Config), {})

velden die automatisch worden ingevuld in class

Zodra de klas is gemaakt, zullen we het toevoegen aan de catalogus met factoryLoader-klassen: self.catalog [table\_name] = cls

We gaan nu verder met het samenstellen van de view class:

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

De view\_name gedefinieerd in het “ user.yml ” bestand is “ userView “.

Tot slot:” load ”Gaat een catalogus met klassen teruggeven die zijn gemaakt door de FactoryLoader klasse.

Dus het pad samenvattend:

Dat is slechts een deel waarin de yml wordt geconverteerd naar klassen die vervolgens kunnen worden gebruikt om op te werken. Vervolgens beginnen we met het maken van een object van onze UserTable-klasse.

user\_table = UserTable (dev)

Sinds de nieuw gemaakte UserTable erft van CfgTable en Config-basisklassen, zullen we de constructor en alle methoden die in die basisklassen zijn gedefinieerd, erven. Zodra we een nieuw UserTable -object maken, roept dit het \_\_init\_\_ van de bovenliggende klassen. Aangezien “ set ” wordt vermeld in het yml-bestand, zullen we ook de constructor van config aanroepen basisklasse.

Bel hierna de get () – methode voor het ophalen van de configuratiegegevens voor de systeem / login / gebruiker hiërarchie.
We zullen eerst de namesonly = false optie controleren.

Onthoud dat de hiërarchie voor de xpath-expressie al was ingesteld via de set: system / login / user ” user.yml “-instructie. Een functie \_build\_xml vertaalt dat in een. XML zoals hieronder:

Als de gebruiker een specifieke gebruikersnaam heeft opgegeven, waarnaar wordt verwezen als “ namekey “, dan hebben we om dat in te voegen in de hierboven gegenereerde xml. Voor bijvoorbeeld: get (user = ”regress”) zou het name-element met waarde regressie invoegen:

regress

alles wordt verpakt in get\_cmd en naar self.RPC.get\_config (get\_cmd) gestuurd
Een typische XML- RPC ziet er als volgt uit:

formaat van XML RPC method call XML

Onze XML voor de get-gebruikersinformatie ziet er als volgt uit:

Deze XML-RPC wordt geconverteerd naar een HTTP POST-verzoek en naar de server gestuurd: voert een XML RPC uit en retourneert resultaten als XML of native python

De daadwerkelijke rpc-aanroep wordt gedaan via de rpc-methode van ncclient via ssh zodat de gegevens worden gecodeerd.

De RPC-afhandeling van de rpc\_cmd\_e is. gedaan door ncclient die implementatie biedt voor netconf via ssh. Het zal moeilijk worden te begrijpen waar de methode rpc in het Manager () -object van het ncclient-pakket feitelijk is gedefinieerd. Na het bestuderen van de ncclient-bibliotheek, ontdekte ik dat deze is gedefinieerd als een woordenboek met methoden met “rpc” = ExecuteRpc , en dit woordenboek is leverancierspecifiek. Klik hier om meer te lezen .

Dit volledige woordenboek voor bewerking om een ​​naam te geven wordt gemaakt voor elk verbindingsverzoek op basis van de leverancier en geretourneerd.

De uiteindelijke XML RPC verzonden via ssh naar netconf-server op Junos-apparaat

Een snelle samenvatting van het starten en uitwisselen van de netconf-sessie:

De client moet een netconf-verbinding tot stand brengen met poort 830 over ssh. De server zou zijn HELLO bericht direct moeten verzenden, en de cliënt zou hetzelfde moeten doen. Het hele hallo > bericht specificeert de mogelijkheden van de client en de server. De server moet dan wachten met het verwerken van alle rpc > verzoeken, en een rpc-reply >. De client kan zoveel XML-attributen toevoegen aan het rpc > -element als gewenst, en het server retourneert al die attributen in het rpc-reply > element.

Het antwoord wordt geparseerd, voor ok > en rpc-error > tags die geen / geen fouten aangeven. Vervolgens wordt het omgezet in een apparaat- / leverancierafhankelijk formaat, worden naamruimtetags verwijderd enz.

Het antwoord wordt uiteindelijk ontvangen zoals hieronder:

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