02-19-2021 01:55 PM - edited 02-19-2021 01:56 PM
Hello,
Is there anything extra that should be done to convert enum to string for eval at templates?
I have this simple model and XML template:
<config-template xmlns="http://tail-f.com/ns/config/1.0"> <devices xmlns="http://tail-f.com/ns/ncs"> <device> <!-- Select the devices from some data structure in the service model. In this skeleton the devices are specified in a leaf-list. Select all devices in that leaf-list: --> <name>{/device}</name> <config> <interface xmlns="http://tail-f.com/ned/cisco-nx"> <?if {interface_type = 'Ethernet'} ?> <Ethernet> <name>{interface_id}</name> <switchport> <access> <vlan>200</vlan> </access> </switchport> <description>ncepnspkafd0001-1V.15.25.OB1</description> <speed>10000</speed> <duplex>full</duplex> </Ethernet> <?end?> <?if {interface_type = 'Loopback'} ?> <loopback> <name>{interface_id}</name> <description>Routing loopback interface</description> <ip> <address> <ipaddr>10.2.0.3/32</ipaddr> <tag>12345</tag> </address> </ip> </loopback> <?end?> </interface> </config> </device> </devices> </config-template>
module xpath-yang-tests { namespace "http://example.com/xpath-yang-tests"; prefix xpath-yang-tests; import ietf-inet-types { prefix inet; } import tailf-common { prefix tailf; } import tailf-ncs { prefix ncs; } description "Bla bla..."; revision 2016-01-01 { description "Initial revision."; } container action { tailf:action double { tailf:actionpoint xpath-yang-tests-action; input { leaf number { type uint8; } } output { leaf result { type uint16; } } } } list xpath-yang-tests { description "This is an RFS skeleton service"; key name; leaf name { tailf:info "Unique service id"; tailf:cli-allow-range; type string; } uses ncs:service-data; ncs:servicepoint xpath-yang-tests-servicepoint; // may replace this with other ways of refering to the devices. leaf-list device { type leafref { path "/ncs:devices/ncs:device/ncs:name"; } } // replace with your own stuff here leaf interface_id { type string; } leaf interface_type { tailf:info "nve, Ethernet, TenGigE, etc"; description "nve, Ethernet, TenGigE, etc"; type enumeration { enum nve; enum Ethernet; enum Loopback; } } /* leaf test { type leafref { path "/xpath-yang-tests:xpath-yang-tests/"; } } */ } }
But I can't get the <?if ?> to work, they always evaluate to false even when the enum has the same value
Thanks in advance
Solved! Go to Solution.
02-19-2021 02:25 PM
Try using /interface_type and /interface_id, I wonder if your context node gets moved by the implicit /device iteration, since it is a leaf-list.
02-19-2021 02:12 PM - edited 02-19-2021 02:12 PM
I don't think you need to do anything extra. But, what do you get in xpath.trace or when doing commit dry-run | debug xpath?
02-19-2021 02:15 PM
Hi Viktor, this is the output:
sfloresk@ncs(config)# show configuration xpath-yang-tests test device [ eng04-cspine-01 ] interface_id 100 interface_type Loopback ! sfloresk@ncs(config)# commit dry-run | debug xpath 2021-02-19T15:14:22.405 xpath: evaluating: /xpath-yang-tests[name='test']/device: /ncs:devices/ncs:device/ncs:name 2021-02-19T15:14:22.405 xpath: exists(/devices/device[name='eng04-cspine-01']) = true 2021-02-19T15:14:22.406 xpath: result: /xpath-yang-tests[name='test']/device: true (0.000 s) 2021-02-19T15:14:22.428 xpath: template xpath-yang-tests-template: evaluating: /device 2021-02-19T15:14:22.428 xpath: template xpath-yang-tests-template: match: /xpath-yang-tests[name='test']/device[.='eng04-cspine-01']: eng04-cspine-01 2021-02-19T15:14:22.428 xpath: template xpath-yang-tests-template: result: one node (0.000 s) 2021-02-19T15:14:22.429 xpath: template xpath-yang-tests-template: evaluating: string(boolean(interface_type = 'Ethernet')) 2021-02-19T15:14:22.429 xpath: template xpath-yang-tests-template: result: false (0.000 s) 2021-02-19T15:14:22.429 xpath: template xpath-yang-tests-template: evaluating: string(boolean(interface_type = 'Loopback')) 2021-02-19T15:14:22.429 xpath: template xpath-yang-tests-template: result: false (0.000 s) 2021-02-19T15:14:22.437 xpath: evaluating: /xpath-yang-tests[name='test']/device: /ncs:devices/ncs:device/ncs:name 2021-02-19T15:14:22.437 xpath: exists(/devices/device[name='eng04-cspine-01']) = true 2021-02-19T15:14:22.437 xpath: result: /xpath-yang-tests[name='test']/device: true (0.000 s) cli { local-node { data +xpath-yang-tests test { + device [ eng04-cspine-01 ]; + interface_id 100; + interface_type Loopback; +} } } sfloresk@ncs(config)#
02-19-2021 02:25 PM
Try using /interface_type and /interface_id, I wonder if your context node gets moved by the implicit /device iteration, since it is a leaf-list.
02-19-2021 03:07 PM
That worked, thanks!
Discover and save your favorite ideas. Come back to expert answers, step-by-step guides, recent topics, and more.
New here? Get started with these tips. How to use Community New member guide