In get_object call flow, how do we need to implement choice-case type and How the hierarchy must be handled? If am trying to set the case using CONFD_SET_TAG_XMLBEGIN & CONFD_SET_TAG_XMLEND am getting the following error in confd_devel.log: Can you please guide me in this.
1-Aug-2020::17:38:32.778 localhost confd[18967]: devel-c bad get_object() return value: /if:interfaces-state/interface{flexe-group/565337}/flexe-group/group{565337}/flexe-channel/channel{18765}/oam/oam-dm-status: one-dm is not a child element
Yang snippet:
choice choice-dm-type {
case one-dm {
leaf oam-one-dm{
type uint32{
range "0..4294967295";
}
}
}
case two-dm {
leaf oam-two-dm{
type uint32{
range "0..4294967295";
}
}
}
}
i am writing now without cross-checking the docs/manual, so hopefully i’m not confusing this with something else…
…oam/oam-dm-status: one-dm is not a child element
All the elements related to choice statement - flagged with ( … ) in your Pyang printout, try to leave them out.
If i recall correctly, they are used rarely in one or two callback functions like get_case(), but are generally not part of the tag arrays/keypath strings…
So, no one-dm, no choice-dm-type in your responses/keypaths of requests, etc.
ConfD/lib will imply which case is in effect either by previous get-case callback invocations, or by name of the following data element (leaf/container) in tag array/keypath - due to the fact that you may not have same leaf name in two sibling cases…
edit:
so, paths/tag arrays like:
../channel{11}/oam/oam-dm-status/oam-one-dm
should be fine.
“invalid” paths / corresponding tag arrays:
../channel{11}/oam/oam-dm-status/choice-dm-type/oam-one-dm
or
../channel{11}/oam/oam-dm-status/one-dm/oam-one-dm
Explanation clarified few behaviors [Statement flagged with (…) & get_case() calls are not part of tag array].
I can see get_case() after get_object() call for the above mentioned hierarchy, if i see no error - means if not filling tag array for choice statement (of-course, its not recommended as you mentioned).
TRACE CALL data get_object(thandle=17,/interfaces-state/interface{flexe-group/565337}/flexe-group/group{565337}/flexe-channel/channel{20766})2020-08-01 17:17:47:876 --> CONFD_OK
TRACE CALL data get_case(thandle=17, /interfaces-state/interface{flexe-group/565337}/flexe-group/group{565337}/flexe-channel/channel{20766}/oam/oam-dm-status, choice-dm-type)2020-08-01 17:17:47:877 (NOEXISTS) 2020-08-01 17:17:47:881 --> CONFD_ACCUMULATE
While looking at the trace log, seems choice-case statement is decoupled with get_object call. Do we need to fill the choice-case statement data separately during get_case call after get_object? if yes, how do we need to handle for case child elements (container/leafs, if any) - providing sample code snippet will be helpful for my understanding. if am wrong, please correct me.
i am not sure myself i haven’t worked with more complex tagged arrays for quite some time (am not ConfD developer, just sort of more extensive (in some areas) user).
my unverified assumption is that:
it should be possible to send specific case items as part of get_object() response data
you will probably still need to have get_case() implementation in case confd internally needs / invokes it for some processing
(second point possibly contradicts with my previous statement about confd implying which case is set, but maybe it’s only for some/specific cases)
Unless someone else can confirm/add more info, please test try it, as i assume you have the the above work-in-progress and can verify it more quickly…
edit:
assuming my first point above is true, tagged array rules about nested lists/containers/etc. still apply, so if the nested items of choice you have are also “nests” - containers/lists, you can not add all the sub-nested children, only the nest itself - resp. its stub as described/explained in other forum topics/man pages) and there will be subsequent nested calls…
As you said, get_case is required & can send specific case items as part of get_object/get_next_object response data. Confd will initiate separate get_case call to understand the case selection & read the data from get_object/get_next_object response based on it.