Taulukot ja näkymät Junos Pyezillä

(Nayan Gadre) (12.9.2020)

Nämä ovat muistiinpanoja, jotka on luotu työskentelemme Junos pyez -kirjaston kanssa verkon automatisoimiseksi. Junos tarjoaa taulukoita ja näkymiä mukautettujen määritystietojen asettamiseen ja purkamiseen. Kaikki pyez-koodi ja ncclient on opensource Apache 2.0 -käyttöoikeudella.

Taulukko ja näkymä määritetään Yaml-tiedostossa osoitteessa lib / jnpr / junos / resurssit
kuten ” user.yml ” ja vastaavat lataustiedosto nimellä “ user.py

user.yml
user.py

user.py ”käytetään muuntamaan yaml-tiedosto Taulukko ja Näytä-määritelmät pythonin globaaleiksi sanakirjaelementeiksi. Täällä \_\_file \_\_ osoittaa ” user.py ” tiedosto, joka tulee. muunnetaan sitten tiedostoksi ” user.yml ”. Junos pyezin loadyaml muuntaa sitten user.yml ”sanakirjaan liittääksesi sen globaaleihin () sanakirjaan.

Sekä taulukon että näkymän määritelmät yamlissa muunnetaan luokkiksi pythonissa. loadyaml on tehdasmenetelmä, ja se paljastetaan julkisena sovellusliittymänä käyttämällä \_\_ kaikki \_\_ pythoninen ilmoitus. Se tarjoaa sanakirjan nimien ja nimikkeiden määritelmistä, kuten yhden rivin napsautuksessa näkyy.

User.yml-tiedosto on jaettu kahteen ylätason avaimeen: ” UserTable ” ja ” UserView ”, loadyaml palauttaa 2 luokkaa näillä nimillä.

sanakirja, joka on muunnettu user.yml

Tämä sanakirja välitetään FactoryLoader.load ( ) -menetelmä luokkien luomiseksi:

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

Tehdaskuormaajaluokan tarkoitus

Sanakirjat () -menetelmä r eturns näkymäobjektin, joka sisältää luettelon joukkoista, jotka sisältävät avainarvopareja.

Tapa, jolla tehdaslataaja päättää, onko annettu taulukko- ja näkymämalli konfigurointia vai toimintoja varten, on skeemassa olevien avainten kautta. . Esimerkiksi: ” set ” ja ” get ” -avaimet tekisivät siitä määritystaulukon.
rpc ” ja sen toiminta taulukko, ” -komento ” tai ” otsikko ” ja sitten sen komentotaulukko, siellä on myös sekava yhdistelmä ” kohdetta view ”ja“ * ”, jotka sanelevat myös, onko kyseessä komentotaulukko.

Koska keskitymme ” user.yml ” voimme nähdä, että se on määritystaulukko, koska sillä on ” aseta ” hierarkiaan. Siksi täytetään \_item\_cfgtables UserTable -avain.

Tämä on luokan rakennustoiminto taulukkoluokan luomiseksi kokoonpanotyyppisille taulukoille.

Taulukko-luokassa on viittaus Näytä-luokkaan jos taulukon osiossa on määritelty näkymä, luomme luokka tälle näkymälle \_build\_view () -menetelmällä ja luokka “ -näkymän ” avaimen arvona.

Sanakirja get () -menetelmä sallii oletusarvon asettamisen, jos avainta ei ole , tässä “ view\_name ” -avain puuttuu, joten \_build\_view ( view\_name ) luo luokan ja liittää luokan arvoon view\_name -näppäin. Se myös purkaa ryhmät, eval, kentät ja tallentaa ne näkymien sisäisiin kenttiin.

Tarkistamme ensin, miten säilö CFGTABLE luodaan osoitteeseen \_CFGTBL
\_CFGTBL = FactoryCfgTable

Python antaa sinun luoda dynaamisia luokkia tai tyyppejä ” type ” -menetelmällä.
Jos ” type ”välitetään olemassa oleva objekti, se palauttaa tyypin. Jos kuitenkin “ type ” välitetään 3 argumenttia, ” luokan nimi ”,” tukiasemat ”,“ dict ”, niin se palauttaa uuden luokan. On myös menetelmä ” vars ”, joka palauttaa arvon \_\_dict\_\_ -attribuutti, joka tallentaa objektien kirjoitettavat määritteet. Python luo muita luokkia metaklaseilla.

Voimme välittää sen luokan nimen, josta uusi luokka periytyy yhtenä sarjana: Esimerkiksi: new\_cls = type (taulukon\_nimi, (CfgTable,), {})

Jos “ set ”avainsana on taulukko-osiossa:
esim. set: system / login / user
Joten meidän pitäisi myös kulkea config-perusluokassa luodaksemme UserTable-luokan:
Esimerkiksi: new\_cls = type (taulukon\_nimi, (CfgTable, Määritykset), {})

kentät, jotka täytetään automaattisesti luokassa

Kun luokka on luotu, lisätään se luetteloon factoryLoader-luokkiin: self.catalog [table\_name] = cls

Siirrytään nyt katseluluokan rakentamiseen:

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

view\_name määritetty tiedostossa ” user.yml ” on ” userView ”.

Lopuksi” lataa ”Palauttaa luettelon luokista, jotka FactoryLoader -luokka on luonut.

Yhteenveto polusta:

Tämä vain täydentää yhden osan, jossa yml muunnetaan luokiksi, joita voidaan sitten käyttää toimintaan. Joten seuraavaksi aloitamme luomalla objektin UserTable-luokastamme.

user\_table = UserTable (dev)

Koska äskettäin luotu UserTable perii CfgTable ja Config-perusluokat, perimme konstruktorin ja kaikki näissä perusluokissa määritellyt menetelmät. Heti kun luomme uuden UserTable -objektin, se kutsuu \_\_init\_\_ pääluokista. Koska ” set ” mainitaan yml-tiedostossa, kutsumme myös config perusluokka.

Tämän jälkeen soita menetelmä get () menetelmä system / login / user hierarkia.
Tarkistamme ensin vaihtoehdon namesonly = false .

Muista, että xpath-lausekkeen hierarkia oli jo määritetty set: system / login / user ” user.yml ”-lauseke. Funktio \_build\_xml kääntää sen a: ksi. XML kuten alla:

Jos käyttäjä on määrittänyt tietyn käyttäjänimen, jota kutsutaan nimellä ” namekey ”, tarvitsemme lisätäksesi sen yllä luotuun xml: ään. Esimerkiksi: get (user = ”regress”) lisäisi nimielementin arvon regressillä:

regress

kaikki pakataan get\_cmd-tiedostoon ja lähetetään itse.RPC.get\_config (get\_cmd)
Tyypillinen XML- RPC näyttää tältä alla:

XML-RPC-menetelmän kutsumuoto XML

Käyttäjätietojen saamisen XML-tiedosto näyttää tältä:

Tämä XML-RPC muunnetaan HTTP POST -pyynnöksi ja lähetetään palvelimelle: Suorittaa XML RPC: n ja palauttaa tulokset joko XML- tai natiivipythonina

Varsinainen RPC-puhelu tapahtuu ncclientin RPC-menetelmällä ssh: n yli, joten tiedot salataan.

rpc\_cmd\_e on. tekee ncclient, joka tarjoaa toteutuksen netconf: lle yli ssh: n. On vaikea ymmärtää, missä ncclient-paketin Manager () -objektissa oleva RPC-menetelmä on todella määritelty. Tutkittuani ncclient-kirjaston huomasin, että se määritellään menetelmien sanakirjaksi, jossa on ”rpc” = ExecuteRpc , ja tämä sanakirja on toimittajakohtainen. Lue lisää napsauttamalla tätä .

Koko tämä sanakirjan nimeämistoiminto luodaan jokaiselle yhteyshakijalle toimittajan perusteella ja palautetaan.

Lopullinen XML-RPC lähetettiin myös SSH: n netconf-palvelimen kautta Junos-laitteessa

Pika yhteenveto netconf-istunnon aloittamisesta ja vaihdosta:

Asiakkaan on aloitettava netconf-yhteys porttiin 830 ssh: n yli. Palvelimen on lähetettävä HELLO -viesti heti, ja myös asiakkaan tulisi tehdä sama. Koko hei > viesti määrittelee asiakkaan ja palvelimen ominaisuudet. Palvelimen tulisi sitten odottaa kaikkien rpc > pyyntöjen käsittelyä ja lähetettävä rpc-vastaus >. Asiakas voi lisätä niin monta XML-määritettä rpc > -elementtiin kuin haluat, ja palvelin palauttaa kaikki nämä määritteet rpc-response > -elementissä.

Vastaus on jäsennelty, kohteisiin ok > ja rpc-error > -tunnisteet, jotka osoittavat virheitä / virheitä. Sitten se muunnetaan laitteesta / toimittajasta riippuvassa muodossa, poista nimiavaruusmerkinnät jne.

Vastaus vastaanotetaan lopulta seuraavasti:

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