[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: sub-tree filtering proposals
At 07:43 AM 6/3/2004, Juergen Schoenwaelder wrote:
>On Fri, May 28, 2004 at 02:56:05PM -0700, Andy Bierman wrote:
>>
>> A) Issue 14.1: Subset specification
>>
>> A.1) Extensibility
>>
>> The <get> and <get-config> operations should be modified to
>> allow for the utilization of different types of standard,
>> proprietary, and experimental filter mechanisms in an extensible
>> way.
>> - An additional containment layer (called <filter>) is needed
>> above the user data model content in the get operation <rpc>
>> message.
>> - The <filter> element can appear zero or one times
>> - There is one attribute defined, called 'filter-type', which
>> identifies the type of filter processing requested by the manager
>> - The content type is 'any' (any element outside the netconf
>> namespace)
>
>Any specific reason why you want to put the <filter/> element into
>the <data/> element? Why not just do the following:
>
> <rpc message-id="101" xmlns="netconf-uri">
> <get>
> <filter filter-type="subtree">
> <foo xmlns="http://example.com/schema-1"/>
> </filter>
> </get>
> </rpc>
>
> <rpc-reply message-id="101" xmlns="netconf-uri">
> <data>
> <foo xmlns="http://example.com/schema-1">7</foo>
> </data>
> </rpc-reply>
I guess this would be fine.
You still need to "get everything", but that can be if
filter is missing, then get everything.
>> B) Issue 14.1.2: Subtree Filtering
>> ----------------------------------
>
>[...]
>
>Out of curiosity, I am wondering how this subtree matching relates to
>XPATH filters or a subset thereof. So I started a little exercise to
>write XPATH expressions for your examples. In fact, it might be useful
>if the subtree filtering actually can be translated into XPATH
>expressions automatically on boxes that are capable to do XPATH
>filtering (so you just have one piece of filtering logic).
The problem with XPath (as we went through before)
is that we are not going to specify a NETCONF-only subset
of XPath. We are not going to require every box to
implement XPath. This subtree filtering is intentionally
very limited so it's easy to implement.
>Some open issues are listed at the end. Perhaps someone with more XPATH
>experience can answer some of them.
>
>> C) Examples
>> -----------
>>
>> C.1: No filter
>>
>> Request:
>>
>> <rpc message-id="101" xmlns="netconf-uri">
>> <get>
>> <data>
>> </data>
>> </get>
>> </rpc>
>>
>> Reply:
>>
>> <rpc-reply message-id="101" xmlns="netconf-uri">
>> <data>
>> ... entire set of data models returned ...
>> </data>
>> </rpc-reply>
>>
>> Notes:
>>
>> - Since the sub-tree filter is inclusive, and the start state
>> is the empty set, the best way to get everything on the
>> agent is to leave out the filter. Not sure the best way
>> to fit this into <get> and <get-config> operations though.
>
>The equivalent XPATH expression might be "//*".
>
>> C.2: Empty filter
>>
>> Request:
>>
>> <rpc message-id="101" xmlns="netconf-uri">
>> <get>
>> <data>
>> <filter type="subtree">
>> </filter>
>> </data>
>> </get>
>> </rpc>
>>
>> Reply:
>>
>> <rpc-reply message-id="101" xmlns="netconf-uri">
>> <data>
>> </data>
>> </rpc-reply>
>>
>> Notes:
>>
>> - Nothing is selected because no content match or selection
>> nodes are present. This is not an error.
>
>I think there are several XPATH expressions that produce an empty result
>- not sure yet which is the nicest (not that this is really important).
>
>> C.3) Select the entire <users> sub-tree
>>
>> Request:
>>
>> <rpc message-id="101" xmlns="netconf-uri">
>> <get>
>> <data>
>> <filter filter-type="subtree">
>> <users xmlns="http://example.com/schema-1"/>
>> </filter>
>> </data>
>> </get>
>> </rpc>
>>
>> Reply:
>>
>> <rpc-reply message-id="101" xmlns="netconf-uri">
>> <data>
>> <users xmlns="http://example.com/schema-1">
>> <user>
>> <name>root</name>
>> <type>superuser</type>
>> <full-name>Charlie Root</full-name>
>> <company-info>
>> <dept>1</dept>
>> <id>1</id>
>> </company-info>
>> </user>
>> <user>
>> <name>fred</name>
>> <type>admin</type>
>> <full-name>Fred Flintstone</full-name>
>> <company-info>
>> <dept>2</dept>
>> <id>2</id>
>> </company-info>
>> </user>
>> <user>
>> <name>barney</name>
>> <type>admin</type>
>> <full-name>Barney Rubble</full-name>
>> <company-info>
>> <dept>2</dept>
>> <id>3</id>
>> </company-info>
>> </user>
>> </users>
>> </data>
>> </rpc-reply>
>>
>> Notes:
>>
>> - The filter contains one selection node (<users>), so just
>> that sub-tree is selected by the filter
>> - This example represents the fully-populated <users> data model
>> in most of the filter examples that follow. In a real
>> data model, the 'company-info' would not likely be returned
>> with the list of users for a particular host or network.
>
>The equivalent XPATH expression might be "//users" or "/users"
>(not sure yet what precisely your semantics are here).
>
>> - The following filter request would have produced the same
>> result, but only because the container <users> defines one
>> child element (<user>)
>>
>> <rpc message-id="101" xmlns="netconf-uri">
>> <get>
>> <data>
>> <filter filter-type="subtree">
>> <users xmlns="http://example.com/schema-1">
>> <user/>
>> </users>
>> </filter>
>> </data>
>> </get>
>> </rpc>
>
>The equivalent XPATH expression might be "//users/user" or "/users/user"
>(not sure yet what precisely your semantics are here).
>
>> C.4) Select all 'name' elements within the 'users' sub-tree
>>
>> Request:
>>
>> <rpc message-id="101" xmlns="netconf-uri">
>> <get>
>> <data>
>> <filter filter-type="subtree">
>> <users xmlns="http://example.com/schema-1">
>> <user>
>> <name/>
>> </user>
>> </users>
>> </filter>
>> </data>
>> </get>
>> </rpc>
>>
>> Reply:
>>
>> <rpc-reply message-id="101" xmlns="netconf-uri">
>> <data>
>> <users xmlns="http://example.com/schema-1">
>> <user>
>> <name>root</name>
>> </user>
>> <user>
>> <name>fred</name>
>> </user>
>> <user>
>> <name>barney</name>
>> </user>
>> </users>
>> </data>
>> </rpc-reply>
>>
>> Notes:
>>
>> - This filter contains two containment nodes (users, user),
>> and one selector node (name).
>> - All instances of the 'name' element in the same sibling set
>> are selected in the filter output.
>> - The manager may need to know that 'name' is used as an
>> instance identifier in this particular data structure,
>> but the agent does not need to know that meta-data in
>> order to process the request.
>
>The equivalent XPATH expression might be "//users/user/name".
>
>> C.5) One specific <user> entry
>>
>> Request:
>>
>> <rpc message-id="101" xmlns="netconf-uri">
>> <get>
>> <data>
>> <filter filter-type="subtree">
>> <users xmlns="http://example.com/schema-1">
>> <user>
>> <name>fred</name>
>> </user>
>> </users>
>> </filter>
>> </data>
>> </get>
>> </rpc>
>>
>> Reply:
>>
>> <rpc-reply message-id="101" xmlns="netconf-uri">
>> <data>
>> <users xmlns="http://example.com/schema-1">
>> <user>
>> <name>fred</name>
>> <type>admin</type>
>> <full-name>Fred Flintstone</full-name>
>> <company-info>
>> <dept>2</dept>
>> <id>2</id>
>> </company-info>
>> </user>
>> </users>
>> </data>
>> </rpc-reply>
>>
>> Notes:
>>
>> - This filter contains two containment nodes (users, user)
>> and one content match node (name).
>> - All instances of the sibling set containing 'name',
>> for which the value of 'name' equals "fred", are selected
>> in the filter output.
>
>The equivalent XPATH expression might be "//users/user[name="fred"]".
>
>> C.6) Specific elements from a specific <user> entry
>>
>> Request:
>>
>> <rpc message-id="101" xmlns="netconf-uri">
>> <get>
>> <data>
>> <filter filter-type="subtree">
>> <users xmlns="http://example.com/schema-1">
>> <user>
>> <name>fred</name>
>> <type/>
>> <full-name/>
>> </user>
>> </users>
>> </filter>
>> </data>
>> </get>
>> </rpc>
>>
>> Reply:
>>
>> <rpc-reply message-id="101" xmlns="netconf-uri">
>> <data>
>> <users xmlns="http://example.com/schema-1">
>> <user>
>> <name>fred</name>
>> <type>admin</type>
>> <full-name>Fred Flintstone</full-name>
>> </user>
>> </users>
>> </data>
>> </rpc-reply>
>>
>> Notes:
>>
>> - This filter contains two containment nodes (users, user),
>> one content match node (name), and two selector nodes
>> (type, full-name).
>> - All instances of the 'type' and 'full-name' elements in
>> the same siibling set containing 'name', for which the value
>> of 'name' equals "fred", are selected in the filter output.
>> The 'company-info' element is not included because the
>> sibling set contains selection nodes.
>
>The XPATH expression "//users/user[name="fred"]/name" will just return
>the name element - not sure how one can select multiple elements with
>XPATH in this case (but I am an XPATH beginner - perhaps someone out
>there knows the answer).
>
>> C.7) Multiple sub-trees
>>
>> Request:
>>
>> <rpc message-id="101" xmlns="netconf-uri">
>> <get>
>> <data>
>> <filter filter-type="subtree">
>> <users xmlns="http://example.com/schema-1"/>
>> <user>
>> <name>root</name>
>> <company-info/>
>> </user>
>> <user>
>> <name>fred</name>
>> <company-info>
>> <id/>
>> </company-info>
>> </user>
>> <user>
>> <name>barney</name>
>> <type>superuser</type>
>> <company-info>
>> <dept/>
>> </company-info>
>> </user>
>> </users>
>> </filter>
>> </data>
>> </get>
>> </rpc>
>>
>> Reply:
>>
>> <rpc-reply message-id="101" xmlns="netconf-uri">
>> <data>
>> <users xmlns="http://example.com/schema-1"/>
>> <user>
>> <name>root</name>
>> <company-info>
>> <dept>1</dept>
>> <id>1</id>
>> </company-info>
>> </user>
>> <user>
>> <name>fred</name>
>> <company-info>
>> <id>2</id>
>> </company-info>
>> </user>
>> </users>
>> </data>
>> </rpc-reply>
>>
>> Notes:
>>
>> - This filter contains three sub-trees (name=root, fred, barney)
>> - The "root" sub-tree filter contains two containment nodes (users,
>> user), one content match node (name), and one selector node
>> (company-info). The sub-tree selection criteria is met, and just
>> the company-info sub-tree for "root" is selected in the filter
>> output.
>
>//users/user[name="root"]/company-info
>
>> - The "fred" sub-tree filter contains three containment nodes
>> (users, user, company-info), one content match node (name), and
>> one selector node (id). The sub-tree selection criteria is met,
>> and just the 'id' element within the company-info sub-tree for
>> "fred" is selected in the filter output.
>
>//users/user[name="fred"]/company-info/id
>
>> - The "barney" sub-tree filter contains three containment nodes (users,
>> user, company-info), two content match nodes (name, type), and one
>> selector node (dept). The sub-tree selection criteria is not met
>> because user "barney" is not a "superuser", and the entire sub-tree
>> for "barney" (including its parent 'user' entry) is excluded from
>> the filter output.
>
>//users/user[name="barney" and type="superuser"]/company-info
>
>You can combine these these expressions using a pipe character:
>
>//users/user[name="root"]/company-info |
>//users/user[name="fred"]/company-info/id |
>//users/user[name="barney" and type="superuser"]/company-info
>
>> C.8) Table with attribute naming
>>
>> Request:
>>
>> <rpc message-id="101" xmlns="netconf-uri">
>> <get>
>> <data>
>> <filter filter-type="subtree">
>> <t:interfaces xmlns:t="http://example.com/schema-2"/>
>> <t:interface t:ifName="eth0"/>
>> </t:interfaces>
>> </filter>
>> </data>
>> </get>
>> </rpc>
>>
>> Reply:
>>
>> <rpc-reply message-id="101" xmlns="netconf-uri">
>> <data>
>> <t:interfaces xmlns:t="http://example.com/schema-2">
>> <t:interface t:ifName="eth0">
>> <t:ifInOctets>45621</t:ifInOctets>
>> <t:ifOutOctets>774344</t:ifOutOctets>
>> </t:interface>
>> </t:interfaces>
>> </data>
>> </rpc-reply>
>>
>> Notes:
>>
>> - This filter contains one containment node (interfaces), one
>> attribute match expression (ifName), and one selector node
>> (interface).
>> - All instances of the 'interface' sub-tree which have an
>> ifName attribute equal to "eth0" are selected in the
>> filter output.
>> - The filter data elements and attributes must be qualified
>> because the 'ifName' attribute will not be considered part
>> of the 'schema-2' namespace if it is unqualified.
>> - If 'ifName' were a child node instead of an attribute, then
>> the following request would produce the same results:
>>
>> <rpc message-id="101" xmlns="netconf-uri">
>> <get>
>> <data>
>> <filter filter-type="subtree">
>> <interfaces xmlns="http://example.com/schema-2">
>> <interface>
>> <ifName>eth0</ifName>
>> </interface>
>> </interfaces>
>> </filter>
>> </data>
>> </get>
>> </rpc>
>
>interfaces/interface/[@ifName="eth0"]
>
>OPEN ISSUES:
>
>- I have ignored namespaces so far. I am sure XPATH will have a way
> to deal with them. Not sure though how that looks like in concrete
> syntax (and how ugly it will be).
>- I do not yet know how to select several elements (kind of doing a
> projection on elements) (see example C.6 above).
>
>/js
>
>--
>Juergen Schoenwaelder International University Bremen
><http://www.eecs.iu-bremen.de/> P.O. Box 750 561, 28725 Bremen, Germany
--
to unsubscribe send a message to netconf-request@ops.ietf.org with
the word 'unsubscribe' in a single line as the message text body.
archive: <http://ops.ietf.org/lists/netconf/>