02-02-2022 05:37 AM
Hi,
Does anybody know if it's possible to concatenate the output of one leaf with a substring in another leafref. In my specific use-case I have a device-group that makes up an area, in that 'area' device-group I have a child device-group that contains all access-switches;
leaf area-id {
tailf:info "Area assignment";
mandatory true;
type leafref {
path "/ncs:devices/ncs:device-group/ncs:name";
}
}
container access-port {
leaf access-sw {
type leafref {
path "/ncs:devices/ncs:device-group[ncs:name=concat(current()/../../area-id,'-SW')]/ncs:member";
}
leaf port {
type leafref {
path "deref(../access-sw)/../ncs:config/ios:interface/ios:GigabitEthernet/ios:name";
}
}
}Is this possible?
-J
Solved! Go to Solution.
02-02-2022 11:37 AM
leaf area-id {
tailf:info "Area assignment";
mandatory false;
type leafref {
path "/ncs:devices/ncs:device-group/ncs:name";
}
}
container access-port {
leaf access-sw {
type leafref {
path "/ncs:devices/ncs:device-group/ncs:member";
require-instance false;
}
must ". = concat(current()/../../area-id, '-SW')";
}
leaf port {
type leafref {
path "/ncs:devices/ncs:device[ncs:name=current()/../access-sw]/ncs:config/ios:interface/ios:GigabitEthernet/ios:name";
}
}
}
admin@ncs# show devices device-group member
NAME MEMBER
-----------------------------
area1 [ area1-R area1-SW ]
area2 [ area2-R area2-SW ]
admin@ncs# conf
Entering configuration mode terminal
admin@ncs(config)# myservice example area-id area
Possible completions:
area1 area2
admin@ncs(config)# myservice example area-id area1
admin@ncs(config-myservice-example)# access-port access-sw area1-SW
admin@ncs(config-myservice-example)# port
^
% Invalid input detected at '^' marker.
admin@ncs(config-myservice-example)# access-port port 0/
Possible completions:
1 Hi
2 Hi
admin@ncs(config-myservice-example)# access-port port 0/1
admin@ncs(config-myservice-example)# val
Validation complete
02-02-2022 07:30 AM
02-02-2022 10:31 AM - edited 02-02-2022 10:32 AM
Thanks for your reply, Viktor.
Can you provide an example on how to do that?
I tried to do this, but I the access-sw leafref returned a list of device-group names instead of the members (and the port leafref failed as well);
leaf area-id {
tailf:info "Area assignment";
mandatory true;
type leafref {
path "/ncs:devices/ncs:device-group/ncs:name";
}
}
list access-port {
tailf:info "Access ports to assign vlan to";
key "access-sw port";
leaf access-sw {
type leafref {
path "/ncs:devices/ncs:device-group/ncs:name";
}
must "contains(deref(current())/../ncs:name,deref(current())/../../area-id) and contains(deref(current())/../ncs:name,'-SW')" {
tailf:dependency "/ncs:devices/ncs:device-group/ncs:name";
}
}
leaf port {
type leafref {
path "/ncs:devices/ncs:device[name=current()/../access-sw]/ncs:config/ios:interface/ios:GigabitEthernet/ios:name";
}
}
}
02-02-2022 11:37 AM
leaf area-id {
tailf:info "Area assignment";
mandatory false;
type leafref {
path "/ncs:devices/ncs:device-group/ncs:name";
}
}
container access-port {
leaf access-sw {
type leafref {
path "/ncs:devices/ncs:device-group/ncs:member";
require-instance false;
}
must ". = concat(current()/../../area-id, '-SW')";
}
leaf port {
type leafref {
path "/ncs:devices/ncs:device[ncs:name=current()/../access-sw]/ncs:config/ios:interface/ios:GigabitEthernet/ios:name";
}
}
}
admin@ncs# show devices device-group member
NAME MEMBER
-----------------------------
area1 [ area1-R area1-SW ]
area2 [ area2-R area2-SW ]
admin@ncs# conf
Entering configuration mode terminal
admin@ncs(config)# myservice example area-id area
Possible completions:
area1 area2
admin@ncs(config)# myservice example area-id area1
admin@ncs(config-myservice-example)# access-port access-sw area1-SW
admin@ncs(config-myservice-example)# port
^
% Invalid input detected at '^' marker.
admin@ncs(config-myservice-example)# access-port port 0/
Possible completions:
1 Hi
2 Hi
admin@ncs(config-myservice-example)# access-port port 0/1
admin@ncs(config-myservice-example)# val
Validation complete
02-02-2022 01:10 PM - edited 02-02-2022 01:11 PM
I could imagine that the level of details I've provided makes it a bit weird
Image that you have a "distribution-block" consisting of a range of routers and range of access switches. All access switches are grouped in a device group "AREA01-SW" and all routers in that area are in "AREA01-RTR" device-group. As a parent device group, we have "AREA01" which has the two device-groups as child device-groups.
So basically, when constructing the service I want to reference only the top-level device-group AREA01, then for the access-port element (which is actually a list, and not a container) I want the YANG model to figure out to only allow (or display in the UI) all devices in the AREA01-SW device-group.
Further down, for the access-port selection I want to allow or display the ports on the particular device selected from the AREA01-SW device-group.
I know that this goes against the idea being abstracted from the underlying hardware/vendor etc. But in this case, the major purpose is to develop a user-friendly UI in a strict environment that doesn't require very deep network configuration skills to be able to deploy a service.
02-02-2022 02:59 PM
02-02-2022 05:12 PM
Ok thanks, I think that I've found an approach then. I do have another issue about the 'port' element. Then name in the path is in the /devices/device tree, while the element-name is derived from /devices/device-group. This doesn't seem to work..
Is there a way to just use the 'device-name' element as a string in the /ncs:devices/ncs:device[ncs:name=...] ?
02-02-2022 05:16 PM
02-02-2022 10:42 PM - edited 02-03-2022 01:02 AM
Thanks a lot Viktor! It seem to be working for me now
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