Definir visualizações das tabelas operacionais do Junos PyEZ que analisam a saída estruturada
Tabelas operacionais (op) do Junos PyEZ para saída estruturada selecionam dados específicos da saída XML de um RPC executado em um dispositivo Junos. Uma tabela está associada a uma visualização, que é usada para acessar campos nos itens da Tabela e mapeá-los para variáveis Python definidas pelo usuário. Você associa uma Tabela a uma visualização específica, incluindo a view propriedade na definição da Tabela, que toma o nome View como seu argumento.
A View mapeia suas variáveis definidas pelo usuário para elementos XML nos itens de Tabela selecionados. Uma visualização permite que você acesse campos específicos na saída como variáveis com propriedades que podem ser manipuladas no Python. O Junos PyEZ lida com a extração dos dados em Python, bem como qualquer tipo de conversão ou normalização de dados. As chaves definidas na visualização devem ser nomes de variáveis Python válidos.
As visualizações do Junos PyEZ, como tabelas, são formatadas usando YAML. As visualizações que analisam a saída estruturada podem incluir uma série de parâmetros, que são resumidos na Tabela 1.
Exibir nome do parâmetro |
Parâmetro de visualização |
Descrição |
|---|---|---|
Veja o nome |
– |
Identificador definido pelo usuário para a visualização. |
Itens de campo |
|
Matriz associativa, ou níprica, de pares de valor-chave que mapeiam nomes de campo definidos pelo usuário para expressões XPath que selecionam elementos nos itens da Tabela. Os nomes de campo devem ser nomes variáveis python válidos. |
Grupos de campo |
|
Matriz associativa, ou níprica, de pares de valor-chave que mapeiam nomes de campo definidos pelo usuário para expressões XPath que selecionam elementos nos itens da Tabela. As expressões XPath são relativas ao contexto definido pelo parâmetro de grupos correspondentes. Os nomes de campo devem ser nomes variáveis python válidos. |
Grupos |
|
Matriz associativa, ou níprica, de pares de valor-chave que mapeiam um nome de grupo definido pelo usuário para uma expressão XPath (em relação ao contexto do item Table) que define o contexto XPath para campos nesse grupo. |
Considere a seguinte tabela e visualização do Junos PyEZ, que estão incluídos na distribuição do Junos PyEZ. A Tabela extrai informações de estado operacional para interfaces Ethernet no dispositivo alvo.
---
EthPortTable:
rpc: get-interface-information
args:
media: True
interface_name: '[afgxe][et]-*'
args_key: interface_name
item: physical-interface
view: EthPortView
EthPortView:
groups:
mac_stats: ethernet-mac-statistics
flags: if-device-flags
fields:
oper: oper-status
admin: admin-status
description: description
mtu: { mtu : int }
link_mode: link-mode
macaddr: current-physical-address
fields_mac_stats:
rx_bytes: input-bytes
rx_packets: input-packets
tx_bytes: output-bytes
tx_packets: output-packets
fields_flags:
running: { ifdf-running: flag }
present: { ifdf-present: flag }
As seções a seguir discutem os diferentes componentes da visualização:
Veja o nome
O nome De visualização é um identificador definido pelo usuário para a visualização. Você associa uma Tabela a uma visualização específica, incluindo a view propriedade na definição da Tabela e fornecendo o nome De visualização como argumento. Por exemplo:
--- EthPortTable: # Table definition view: EthPortView EthPortView: # View definition
Campos (campos)
Você personaliza visualizações para que elas só façam referência aos elementos necessários dos itens da Tabela selecionada. Para isso, você inclui a fields propriedade e um arranjo associativo contendo o mapeamento de nomes de campo definidos pelo usuário para expressões XPath que selecionam os elementos desejados do item Tabela. Os nomes de campo devem ser nomes variáveis python válidos. As expressões do XPath são relativas ao contexto do item Tabela.
Considere a saída RPC da amostra a seguir:
<rpc-reply>
<interface-information>
<physical-interface>
<name>ge-0/3/0</name>
<admin-status junos:format="Enabled">up</admin-status>
<oper-status>down</oper-status>
<local-index>135</local-index>
<snmp-index>530</snmp-index>
<link-level-type>Ethernet</link-level-type>
<mtu>1514</mtu>
...
</physical-interface>
</interface-information>
</rpc-reply>
Se o parâmetro da Tabela item selecionar elementos <physical-interface> da saída, a expressão XPath para cada campo na definição de Visualização é relativa a esse contexto. A definição de visualização a seguir mapeia cada nome de campo definido pelo usuário para um elemento infantil do <physical-interface> elemento:
EthPortView:
fields:
oper: oper-status
admin: admin-status
mtu: { mtu : int }
No script Python, você pode acessar um item View como uma propriedade variável. Por padrão, cada item View tem uma name propriedade que faz referência à chave que identifica esse item com exclusividade.
from jnpr.junos import Device
from jnpr.junos.op.ethport import EthPortTable
with Device(host='router.example.com') as dev:
eths = EthPortTable(dev)
eths.get()
for item in eths:
print (item.name)
print (item.oper)
print (item.admin)
print (item.mtu)
O formato de campo determina o tipo de valor de um campo. Por padrão, os valores de campo são armazenados como strings. Você pode especificar um tipo diferente para o valor de campo no mapeamento de campo. O exemplo a seguir define o valor do mtu elemento como um inteiro:
EthPortView:
fields:
mtu: { mtu : int }
Na saída RPC, alguns elementos Do Junos XML são apenas elementos vazios que atuam como bandeiras. Você pode indicar explicitamente que um campo é uma bandeira no mapeamento de campo. O valor do item de campo para uma bandeira é verdadeiro se o elemento estiver presente na saída e falso se o elemento estiver ausente. O exemplo a seguir define o ifdf-running elemento como uma bandeira:
EthPortView:
fields:
mtu: { mtu : int }
running: { if-device-flags/ifdf-running : flag }
Você também pode definir o valor do item de campo para um Boolean usando a seguinte sintaxe:
fieldname: { element-name: (True | False)=regex(expression) }
O valor do elemento é avaliado em relação à expressão regular passada para regex(). Se o valor do elemento corresponde à expressão, o valor do item de campo será definido para o Boolean definido no formato. No exemplo a seguir, o oper_status_down campo é definido como verdadeiro se o valor do oper-status elemento contiver "down":
oper_status_down: { oper-status: True=regex(down) }
Você também pode usar expressões regulares mais complexas e combinar com vários valores. O item de campo a seguir é definido como verdadeiro se o endereço do rt-destination elemento começar com '198.51.':
dc1_route: { rt-destination: True=regex(^198\.51\.) }
O item de campo a seguir é definido como verdadeiro se o no-refresh elemento contiver qualquer valor na expressão regular.
no_refresh: { no-refresh: 'True=regex(Session ID: 0x0|no-refresh)' }
Grupos (grupos) e grupos de campo (fields_)
Os grupos fornecem um método de atalho para selecionar e referenciar elementos dentro de um nó específico definido em um item da Tabela.
Na saída RPC a seguir, o <if-device-flags> elemento contém vários elementos infantis correspondentes aos valores exibidos no Device flags campo na saída CLI:
<rpc-reply>
<interface-information>
<physical-interface>
<name>ge-0/3/0</name>
...
<if-device-flags>
<ifdf-present/>
<ifdf-running/>
</if-device-flags>
...
</physical-interface>
</interface-information>
</rpc-reply>
Dentro da definição de Visualização, você pode usar a fields propriedade para acessar os elementos infantis, fornecendo a expressão XPath completa a cada elemento em relação ao item de Tabela selecionado. Por exemplo, se a definição EthPortTable selecionar <physical-interface> itens, o mapeamento de itens de campo usaria as seguintes expressões XPath:
EthPortView:
fields:
present: if-device-flags/ifdf-present
running: if-device-flags/ifdf-running
Alternativamente, você pode criar um grupo que define o contexto para o <if-device-flags> elemento e, em seguida, definir itens de grupo de campo que apenas fornecem a expressão XPath em relação a esse contexto. Você pode definir qualquer número de grupos dentro de uma definição de visualização.
Para criar um grupo, inclua a groups propriedade e mapeie um nome de grupo definido pelo usuário para a expressão XPath que define o novo contexto. Em seguida, defina um grupo de campo cujo nome é fields_ seguido pelo nome do grupo. O grupo de campo é um conjunto associativo que contém o mapeamento de nomes de campo definidos pelo usuário para expressões XPath que agora são relativas ao contexto definido dentro groups. Os nomes de campo devem ser nomes variáveis python válidos.
O exemplo a seguir define o grupo flags e o grupo fields_flagsde campo correspondente. O flags grupo define o contexto para o nível de physical-interface/if-device-flags hierarquia, e os campos e os present campos running acessam os valores dos ifdf-present elementos e ifdf-running dos elementos, respectivamente.
EthPortView:
groups:
flags: if-device-flags
fields_flags:
present: ifdf-present
running: ifdf-running
Quer você use campos ou grupos de campo, você acessa o valor da mesma maneira dentro do script Junos PyEZ usando os nomes de campo definidos pelo usuário.