Date: Fri, 29 Mar 2024 11:55:11 +0000 (UTC) Message-ID: <372232318.1527.1711713311256@b9607565de67> Subject: Exported From Confluence MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_Part_1526_1692222208.1711713311245" ------=_Part_1526_1692222208.1711713311245 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Location: file:///C:/exported.html
Overall
Key | Summary | T | Updated | Status | Resolution |
---|---|---|---|---|---|
TSC-285= a> | Netvirt Silicon Release P= lan | Sep 22, = 2020 | Open | Unresolved | |
TSC-286= a> | DAEXIM Silicon Release Pl= an | Sep 21, = 2020 | Open | Unresolved | |
TSC-287= a> | JSONRPC Silicon Release P= lan | Sep 21, = 2020 | Open | Unresolved | |
TSC-288= a> | Ovsdb Silicon Release Pla= n | Oct 04, = 2020 | Open | Unresolved | |
TSC-292= a> | Distribution Silicon Rele= ase Plan | Oct 02, = 2020 | Open | Unresolved | |
TSC-293= a> | TransportPCE Silicon rele= ase plan | Mar 25, = 2021 | Closed | Unresolved | |
TSC-294= a> | ODL-Guice Silicon Plan = a> | Oct 06, = 2020 | Open | Unresolved | |
TSC-295= a> | ODL-Micro Silicon Plan = a> | Oct 11, = 2020 | Open | Unresolved | |
TSC-297= a> | AAA Silicon Release Plan = | Oct 22, = 2020 | Open | Unresolved | |
TSC-298= a> | BGPCEP Silicon Plan <= /td> | Oct 22, = 2020 | Open | Unresolved |
BGPCEP
Status | Key | Summary | Description |
---|---|---|---|
Resolved | BGPCEP= -932 | Remove use of SchemaPa= th from config.loader.spi.ConfigFileProcessor |
SchemaPath is going to be deprecated. Replace it with SchemaNodeIdentifi= er.Absolute, which seems to be the appropriate thing. |
Resolved | BGPCEP= -905 | Remove use of blueprin= t in config-loader-impl |
config-loader-impl does not use anything blueprint-specific, in fact it = actively battles blueprint by using odl:static-reference. Reformulate it in= terms of OSGi DS, binding it to proper codec services, so that we can disc= over the associated EffectiveModelContext. Also clean up the FileWatcher lifecycle, as it seems it should not reall= y be a separate component. |
Resolved | BGPCEP= -923 | Remove blueprint from = rsvp-spi |
rsvp-spi is using blueprint to wire itself. Convert it to OSGi DS/inject= annotations instead. This might be problematic, as it is using the ODL BP = extension. |
Resolved | BGPCEP= -924 | Remove blueprint from = rsvp-impl |
rsvp-impl is using blueprint to wire itself. Convert it to OSGi DS/injec= t annotations instead. |
Resolved | BGPCEP= -926 | Remove blueprint from = bmp-monitors-config-loader |
bmp-monitors-config-loader is using blueprint to wire itself. Conve= rt it to OSGi DS/inject annotations instead. |
Resolved | BGPCEP= -927 | Remove blueprint from = protocols-config-loader |
protocols-config-loader is using blueprint to wire itself. Convert it to= OSGi DS/inject annotations instead. |
Resolved | BGPCEP= -928 | Remove blueprint from = routing-policy-config-loader |
routing-policy-config-loader is using blueprint to wire itself. Con= vert it to OSGi DS/inject annotations instead. |
Resolved | BGPCEP= -929 | Remove blueprint from = topology-config-loader |
topology-config-loader is using blueprint to wire itself. Convert it to = OSGi DS/inject annotations instead. |
Resolved | BGPCEP= -930 | Remove blueprint from = data-change-counter |
data-change-counter is using blueprint to wire itself. Convert it to OSG= i DS/inject annotations instead. |
Resolved | BGPCEP= -935 | Remove blueprint from = pcep-base-parser |
This is is simplistic service, convert it to OSGi DS |
Resolved | BGPCEP= -936 | Remove blueprint from = bgp-parser-impl |
This has a very small component, convert it to OSGi DS. |
Resolved | BGPCEP= -937 | Convert ServiceLoader = definitions to @MetaInfServices |
We are using ServiceLoader injection, having hand-written META-INF/servi= ces entries. This makes is hard to reason about them. Generate these entries through @MetaInfServices, so that we have a clear= code-visible control of what services we provide. |
Resolved | BGPCEP= -938 | Remove blueprint from = bgp-openconfig-rp-statement |
This component is rather simple, clean it up and convert it to OSGi DS.<= /p> |
Resolved | BGPCEP= -939 | Remove blueprint from = bgp-openconfig-rp-spi |
The blueprint here seems to be involved, but is in reality a simple whit= eboard. Let's convert it to an OSGi DS component instead. This shows we could actually directly retain registrations, eliminating = the need for an abstract class. |
Resolved | BGPCEP= -940 | Remove blueprint from = bgp-route-target |
This component is really simple, convert it to OSGi DS. |
Resolved | BGPCEP= -942 | Remove blueprint from = bgp-openconfig-spi |
bgp-openconfig-spi wiring is using a combination of Blueprint and Servic= eLoader, while performing a rather straightforward whiteboard activation.= p> Refactor the classes to provide properly-injected immutable environment,= so that table types work seamlessly in any environment. While we are refactoring, also remove use of Optional from BGPTableTypeRegistryConsumer, as users benefit from nul= lable. |
Resolved | BGPCEP= -943 | Remove blueprint from = bgp-openconfig-rp-impl |
With bgp-openconfig-rp-spi refactored and properly working we can now co= nvert bgp-openconfig-rp-impl, which ends up being a trivial conversion. = |
Resolved | BGPCEP= -944 | Remove blueprint from = bgp-rib-spi |
bgp-rib-spi ends up being a very simple whiteboard, convert it to OSGi D= S instead of blueprint. |
Resolved | BGPCEP= -933 | Switch config loaders = to DOM API |
All four config loaders end up translating the parsed structure to Bindi= ng form only to feed it into DataBroker. This is completely unnecessary, as the data is coming from XML files and= is therefore in DOM form =E2=80=93 hence we end up encoding it to and from= Binding for no particularly good reason. We are also using inefficient datastore operations in individual impleme= ntations, which really should be using the bare minimum required. Switching to DOM interfaces is a bit of juggling of paths, but will impr= ove performance and most notably will make config loaders independent of co= dec services. |
Resolved | BGPCEP= -853 | Move RIB to be indepen= dent |
EffectiveRibInWriter and LocRibWriter should be binding-independent. Thi= s means they need to interface with DOMDataBroker only and handle attribute= encoding when interfacing with import/export policies. |
Resolved | BGPCEP= -861 | Audit and fix use of r= ead-only transactions in openconfig-rp-statement |
Cursory look during migration to MD-SAL APIs reveals this component is n= ot properly closing read-only transactions. Audit all callers and make sure transactions are used in a proper try-wi= th-resources block. While we are in the area, it seems the results of the c= all could use Optional.map() handling rather than the explicit isPresent()/= get() combo. |
Resolved | BGPCEP= -906 | Propagate only negotia= ted afi/safi routes to adj-rib-out |
When BGP session comes, empty entries for negotiated afi/safi are If routes are written to non-existent afi/safi table in adj-rib-out, |
Controller
Status | Assignee | Summary | Description |
---|---|---|---|
Resolved | Tadey Bilan | Update cluster do= cumentation re. multi-dc deployment |
Akka 2.6 brings about a great deal of change we are pulling in. Most not= ably there is no auto-downing, but rather SBR or something else coming in.<= /p> |
Resolved | Tadey Bilan | Upgrade Akka to 2= .6.x |
Now that we have control over Akka packaging, we can safely upgrade to 2= .6.x release train. |
NETCONF
Status | Assignee | Summary | Description |
---|---|---|---|
Resolved | Robert Varga | Deprecate messagebus-= netconf |
messagebus-netconf is a proof-of-concept component, which is not used by= anyone and has some serious deficiencies. Deprecate it for removal. |
Resolved | Iaroslav Kholiavko | Support for Root Reso= urce Discovery is missing |
Both RFC8040 [0] and draft 18 [1] define Root Resource Discovery mechanism. Neither Dra= ft18 in Nitrogen snapshots, not rfc8040 in oxygen snapshots seem to have th= at implemented. $ curl -v -u admin:admin -H "Accept:application/xrd+xml" http:= //127.0.0.1:8181/.well-known/host-meta * Trying 127.0.0.1... * TCP_NODELAY set * Connected to 127.0.0.1 (127.0.0.1) port 8181 (#0) * Server auth using Basic with user 'admin' > GET /.well-known/host-meta HTTP/1.1 > Host: 127.0.0.1:8181 > Authorization: Basic YWRtaW46YWRtaW4=3D > User-Agent: curl/7.52.1 > Accept:application/xrd+xml > < HTTP/1.1 404 Not Found < Content-Type: text/html; charset=3DISO-8859-1 < Cache-Control: must-revalidate,no-cache,no-store < Content-Length: 305 < <html> <head> <meta http-equiv=3D"Content-Type" cont= ent=3D"text/html; charset=3DUTF-8"/> <title>Error 404 Not Found</title> </head> <body><h2>HTTP ERROR 404</h2> <p>Problem accessing /.well-known/host-meta. Reason: <pre> Not Found</pre></p><hr><= i><small>Powered by Jetty://</smal= l></i><hr/> </body> </html> * Curl_http_done: called premature =3D=3D 0 * Connection #0 to host 127.0.0.1 left intact [0] https://tools.ietf.org/html/rfc8040#section-3.1 |
Resolved | Oleksii Mozghovyi | Update call home to RFC= 8071 |
http://to= ols.ietf.org/html/draft-ietf-netconf-reverse-ssh is a very useful featu= re for controller deployments, where we do not need to pre-configure the de= vice locations. Implement it such that a sal-netconf-connector instance can= be configured to accept Call Home connections. |
Resolved | Oleksii Mozghovyi | Get rid of GzipFilter= |
GzipFilter is deprecated and the functionality would much better we serv= ed through registering a GzipHandler instance with the HTTP service. Examine how we can do this in a seamless way, so that we do not have a h= ard dependency on jetty-servlets. |
Resolved | Nikhil Soni | Extend Websocket stre= ams for data-less notifications |
In one of our customers, the use case was to listen to changes in a part= icular yangtree. however the data underneath was quite huge, thereby causin= g the heap running over and the controller crashing in response to lot of c= hanges in the subtree. Hence, we had to fallback to a mechanism to detect j= ust a change in the yangtree from a northbound application and on detection= of the change, do a bulk get of the data. that was more effective.
In supporting this usecase, the current implementation needed an extensi= on. Currently, WebSocket stream notification contains notification me= tadata with data. However, there is no way to avoid collecting data d= uring notification processing in the websocket server. Hence, we decided to= add a new filter named "odl-skip-notification-data", similar to "odl= -leaf-nodes-only" in the subscription API.
1. Create Stream: POST http://\controller-ip:8181/restconf/operations/sal-remote:create-= data-change-event-subscription { "input": { "path": "/network-topology:network-topology", "sal-remote-augment:datastore": "CONFIGURATION", "sal-remote-augment:scope": "SUBTREE", "sal-remote-augment:notification-output-type": "JSON" } } Response: { "output": { "stream-name": "data-change-event-subscription/network-topology:network= -topology/datastore=3DCONFIGURATION/scope=3DSUBTREE" } }
2. Subscribe: GET http://{{controller-ip}}:8181/restconf/streams/stream/data-change-= event-subscription/network-topology:network-topology/datastore=3DCONFIGURAT= ION/scope=3DSUBTREE?&odl-skip-notification-data=3Dtrue Response: { "location": "ws://localhost:8185/data-change-event-subscription/network= -topology:network-topology/datastore=3DCONFIGURATION/scope=3DSUBTREE" } 3. Get Notification: GET ws://localhost:8185/data-change-event-subscription/network-topolo= gy:network-topology/datastore=3DCONFIGURATION/scope=3DSUBTREE 4. Write to topology or any respective data tree: 5. Websocket JSON Response - { "notification":{ "xmlns":"urn:ietf:params:xml:ns:netconf:notification:1.0", "data-changed-notification":{ "xmlns":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:rem= ote", "data-change-event":{ "path":"/network-topology:network-topology", "operation":"updated" } }, "eventTime":"2020-05-05T20:22:23.293+05:30" } } |
Resolved | Vladyslav Marchenko | Rework KeepaliveSalFa= cade time tracking |
Current implementation ends up rescheduling timer tasks all over the pla= ce. This should be reworked to keep only a single task and maintain the tim= e of last activity. |
Resolved | Robert Varga | Create NetconfTopolog= yRPCProvider using OSGi DS |
NetconfTopologyRPCProvider are being created and they are very simple re= gistrations. Convert them to a separate component provided from netconf-top= ology automatically. |
Resolved | Iaroslav Kholiavko | Upgrade sshd to 2.6.0= |
Upgrade to sshd-2.6.0, removing workaround introduced in
|
Resolved | Oleksii Mozghovyi | Unstable test behavio= r on Windows (NetconfDeviceCommunicatorTest) |
There is NetconfDeviceCommunicatorTest.testNetconfDeviceReconnectIn= Communicator test that works fine on Unix-type OS but is not stable on Wind= ows environments. |
Resolved | Iaroslav Kholiavko | Return status code 50= 3 instead of 404 when a mountpoint is not mounted |
Currently the returned status code is 404, which callers might understan= d as a confirmation that the resource is not present in the mounted datasto= re. But the resource might be in fact present in the datastore, just ODL ca= nnot access the datastore this time. This distinction is important for CSIT to distinguish transient instabil= ity (for example in cluster High Availability testing) from really missing = data. |
Resolved | Vladyslav Marchenko | Eliminate blocking ch= ecks in loops, so the checks are done in parallel |
Do not mix read and write operations in one loop. This change is needed for old restconf (BrokerFacade.java) and also for = new restconf (RestconfDataServiceImpl and its utility helper classes). <= /td> |
Resolved | Tomas Cere | ListenerAdapter needs= to serialize JSON directly |
Currently, when producing JSON, ListenerAdapter serialises to XML, and t= hen converts that to JSON using org.json. It should instead serialise direc= tly to JSON using the YANG codecs. |
Resolved | Jamo Luhrsen | Extra superfluous edi= t-config RPC sent just prior to correct edit-config RPC for top-level lists= |
Symptom: What's actually happening: Solution: If the target is a mounted network element, don't create the e= mpty subtree at all. Regardless of whether or not the standard allows it, m= ost vendor netconf implementations reject this behavior. See MakePut in Bro= kerFacade for the root cause, and also see corresponding post method.. One example of the failure: : Error reply from remote device, request: <rpc message-id=3D"m-7538"=
xmlns=3D"urn:ietf:params:xml:ns:netconf:base:1.0"> |
Resolved | Peter Suna | Non-clustered NETCONF= topology leaks schema registrations |
This issue is correctly flagged by SpotBugs and has escaped attention fo= r quite some time. When we are creating the context for a device, we add ya= nglib if it is configured for that particular device. If there are multiple devices pointing to the same url, we end up regist= ering for each of them, and if they point to the same schema directory we e= nd up with quadratic number of registrations. At the very least we should be tearing down the registrations when the d= evice goes away. |
Verified | Jamo Luhrsen | regression in netconf= -scale CSIT betweeen Mg Sr1 and Sr2 |
This job appears to have a regression between SR1 and=
SR2. The job will pass from In the sandbox, I ran a job with the Sr1 release which saw two failures =
in 35 iterations, Jenkins job history in the web ui only goes back 30 builds or so, but I =
pulled all the There seems to be two points of interest. The job was mostly passing for=
quite some Nothing in the netconf project stands out to me in the June 6th timefram=
e, but there Here is a karaf=
.log from the most recent failed job. There is some ugliness that |
Resolved | Vladyslav Marchenko | Yang model file witho= ut "revision" statement |
According to RFC6020 https://tools.ietf.org/html/rfc6020#section-7.1.9 the "revision" st=
atement is not mandatory in yang model file. |
Resolved | Robert Varga | RFC8040 ignores unkno= wn with-defaults values |
RFC8040 states: If the server does not support the requested value of the "with-defaults" parameter, the server MUST return a response with a "400 Bad Request" status-line. The error-tag value "invalid-value" is used in this case. our implementation ignores the value, letting the request succeed. = td> |
Resolved | Robert Varga | SSH session does not = close properly after device disconnects |
This issue is related to https://issues.apache.org/jira/browse/SSHD-1028. sshd/common/io/nio2/Nio2Session.handleReadCycleCompletion() no lo= nger closes the session. The close(boolean) statement invocation was remove= d in version 2.5.0. Upstream have fixed the issue, but there is no sshd-2.6= .0 yet. |
Resolved | Michal Cmarada | ApiDoc generator fail= s to parse string types with pattern containing {isBasicLatin} |
example typedef with failing pattern: typedef DisplayString { type string { length "0..255"; pattern "((\p{IsBasicLatin}{0,255}))= "; } } parsing this type fails with IllegalArgumentException and stops further = processing of api docs. |
Resolved | Robert Varga | restconf/operations: = XML not acceptable |
> curl -u admin:admin -H "Accept: application/yang-data+json" http://localhost:8181/rests/opera= tions < OK > curl -v -u admin:admin -H "Accept: application/yang-data+xml" = http://localhost:8181/rests/ope= rations < 406 Not Acceptable
|
Resolved | Tomas Cere | Regression in SSE Not= ification test |
SSE notification test started failing in master: After this patch was merged: https://git.= opendaylight.org/gerrit/c/netconf/+/92446 Some of the issues detected:
|
Resolved | Kostiantyn Nosach | RFC8040 RESTCONF Auth= mechanism is broken |
The integration of AAA and RFC8040 RESTconf is broken - auth is not requ=
ired to access RESTconf API anymore(expectation - at least basic auth shoul=
d be on by default). It seems like the root cause was the following change-=
set: |
Resolved | Marek Hurban | Commit to non-candida= te device |
Please find attached karaf log (TRACE) 2021-01-28T11:35:55,158 | TRACE | qtp1820169956-75 | NetconfDeviceComm= unicator | 279 - org.opendaylight= .netconf.sal-netconf-connector - 1.12.1 | RemoteDevice{NO-CANDIDATE}: Sendi= ng message <rpc message-id=3D"m-24" xmlns=3D"urn:ietf:params:xml:ns:netc= onf:base:1.0"> <edit-config> <target> <runn= ing/> </target> <error-option>rollback-on-= error</error-option> <config> <cont= rol-construct xmlns=3D"urn:onf:yang:core-model-1-4"> &nb= sp; <logical-termination-point> &nb= sp; <uuid>cdcd6b3f-1543-0d47-48c5= -6132ff3f493a</uuid> &n= bsp; <label> &nb= sp; <value-n= ame>my-label</value-name> &nb= sp; <value x= mlns:op=3D"urn:ietf:params:xml:ns:netconf:base:1.0" op:operation=3D"create"= >works</value> &nb= sp; </label> &nb= sp; </logical-termination-point> </con= trol-construct> </config> </edit-config> </rpc> 2021-01-28T11:35:55,158 | TRACE | nioEventLoopGroupCloseable-3-1 | NetconfC= lientSessionImpl | 281 - or= g.opendaylight.netconf.shaded-sshd - 1.9.1 | encode(NetconfClientSessionImp= l[netconf@/127.0.0.1:18300]) packet #89 [chunk #11](704/785) 20 20 20 20 20= 20 20 20 20 20 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20 20 20 20 20 20= 20 20 20 20 20 3c 2f 6c 6f 67 69 63 61 6c 2d 74 65 72 6d 69 6e 61 74 69 6f= 6e 2d 70 6f 69 6e 74 3e 0a ..........</label>.....= ............</logical-termination-point>. 2021-01-28T11:35:55,158 | TRACE | qtp1820169956-75 | KeepaliveSalFacade&nbs= p; &= nbsp; | 279 - org.opendaylight.netconf.sal-netconf-connector - 1.12.1 | Sta= rt to waiting for result. 2021-01-28T11:35:55,159 | TRACE | qtp1820169956-75 | KeepaliveSalFacade&nbs= p; &= nbsp; | 279 - org.opendaylight.netconf.sal-netconf-connector - 1.12.1 | Rem= oteDevice{NO-CANDIDATE}: Resetting netconf keepalive timer 2021-01-28T11:35:55,159 | TRACE | qtp1820169956-75 | KeepaliveSalFacade&nbs= p; &= nbsp; | 279 - org.opendaylight.netconf.sal-netconf-connector - 1.12.1 | Rem= oteDevice{NO-CANDIDATE}: Scheduling keepalives every 120 SECONDS 2021-01-28T11:35:55,159 | TRACE | qtp1820169956-75 | NetconfDeviceCommunica= tor | 279 - org.opendaylight.netc= onf.sal-netconf-connector - 1.12.1 | RemoteDevice{NO-CANDIDATE}: Sending me= ssage <rpc message-id=3D"m-25" xmlns=3D"urn:ietf:params:xml:ns:netconf:b= ase:1.0"> <commit/> </rpc> The NetconfDeviceCommunicator correctly sends the <edit-config> to= <running/> - but later also the <commit/>. In case of non cand= idate devices the <commit/> must not be send. This functions correctly in Magnesium. |
Resolved | Iaroslav Kholiavko | Netconf Testtool fail= s on Windows if --schemas-dir parameter set |
While --schemas-dir parameter set Netconf Testtool fails with excep= tion. Bug reproduces only on Windows.
Expected behavior: Test tool should work the same way as = on Linux. Actual behavior: Test tool fails with exception: Exception in thread "main" java.lang.IllegalStateException: Failed to re= name '%s'.D:\workspace\netconf\schemas\augment-main-a.yangException in thre= ad "main" java.lang.IllegalStateException: Failed to rename '%s'.D:\workspa= ce\netconf\schemas\augment-main-a.yang at org.opendaylight.netconf.test.too= l.TesttoolParameters.validate(TesttoolParameters.java:329) at org.opendayli= ght.netconf.test.tool.Main.main(Main.java:38) |
Resolved | Michal Banik | `/.well-known/*` endp= oint responses only once |
/.well-know/* REST endpoint introduced in
javax.ws.rs.core.Response.status(Status.OK) creates new OutboundMessageC=
ontext with CommittingOutputStream instance, which is closed during the pro=
cess of sending the response to client. java.lang.IllegalStateException: The output stream= has already been closed. when `/.well-known/*` endpoint is requesting multiple times, which makes= the endpoint working only once. |
AAA
Status | Assignee | Summary | Description |
---|---|---|---|
Resolved | Robert Varga | AuthenticationManager req= uires OSGi to function |
This issue happens when we are running AAA outside of karaf environment.= We try to create instance of org.opendaylight.aaa.shiro.tokenauthrea= lm.auth.AuthenticationManager, which implements also org.osgi.service.= cm.ManagedService. This dependency is stated as provided in poms, but for n= on karaf environment this is causing runtime errors since it doesnt need to= use osgi at all. stack trace from our app: Exception in thread "po= ol-14-thread-1" java.lang.RuntimeException: java.lang.NoClassDefFoun= dError: org/osgi/service/cm/ManagedServiceException in thread "pool-14-thread-1" java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/osgi/service/cm/ManagedService at io.lighty.kit.examples.community.aaa.restconf.Main$1.onFailure(Main.java:1= 36) at com.google.common.util.concurrent.Futures$CallbackListener.run(Futures.jav= a:1064) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExec= utor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExe= cutor.java:628) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: java.lang.NoClassDefFoundError: org/osgi/service/cm/ManagedServi= ce at java.base/java.lang.ClassLoader.defineC= lass1(Native Method) at java.base/java.lang.ClassLoader.defineC= lass(ClassLoader.java:1017) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.ja= va:174) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassL= oader.java:800) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNul= l(BuiltinClassLoader.java:698) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinCl= assLoader.java:621) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoa= der.java:579) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassL= oaders.java:178) at java.base/java.lang.ClassLoader.loadCla= ss(ClassLoader.java:522) at io.lighty.aaa.AAALightyShiroProvider.<init>(AAALightyShiroProvide= r.java:104) at io.lighty.aaa.AAALightyShiroProvider.newInstance(AAALightyShiroProvider.ja= va:184) at io.lighty.aaa.AAALighty.initProcedure(AAALighty.java:63) at io.lighty.core.controller.api.AbstractLightyModule.lambda$start$0(Abstract= LightyModule.java:117) at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutur= eInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:125) a= t com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.= java:69) at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedL= istenableFutureTask.java:78) ... 3 more Caused by: java.lang.ClassNotFoundException: org.osgi.service.cm.ManagedSer= vice at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoa= der.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassL= oaders.java:178) at java.base/java.lang.ClassLoader.loadCla= ss(ClassLoader.java:522) ... 19 more
|
Resolved | Ilya Igushev | Migrate aaa-cert use of B= C APIs |
Current build reports: [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ aaa= -cert --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 64 source files to /home/nite/odl/aaa/aaa-cert/target/clas= ses [WARNING] /home/nite/odl/aaa/aaa-cert/src/main/java/org/opendaylight/aaa/ce= rt/impl/ODLKeyTool.java:[37,34] org.bouncycastle.asn1.x509.X509Name in org.= bouncycastle.asn1.x509 has been deprecated [WARNING] /home/nite/odl/aaa/aaa-cert/src/main/java/org/opendaylight/aaa/ce= rt/impl/ODLKeyTool.java:[38,28] org.bouncycastle.jce.PKCS10CertificationReq= uest in org.bouncycastle.jce has been deprecated [WARNING] /home/nite/odl/aaa/aaa-cert/src/main/java/org/opendaylight/aaa/ce= rt/impl/ODLKeyTool.java:[39,28] org.bouncycastle.jce.X509Principal in org.b= ouncycastle.jce has been deprecated [WARNING] /home/nite/odl/aaa/aaa-cert/src/main/java/org/opendaylight/aaa/ce= rt/impl/ODLKeyTool.java:[40,29] org.bouncycastle.x509.X509V3CertificateGene= rator in org.bouncycastle.x509 has been deprecated [WARNING] /home/nite/odl/aaa/aaa-cert/src/main/java/org/opendaylight/aaa/ce= rt/impl/ODLKeyTool.java:[173,19] org.bouncycastle.x509.X509V3CertificateGen= erator in org.bouncycastle.x509 has been deprecated [WARNING] /home/nite/odl/aaa/aaa-cert/src/main/java/org/opendaylight/aaa/ce= rt/impl/ODLKeyTool.java:[173,66] org.bouncycastle.x509.X509V3CertificateGen= erator in org.bouncycastle.x509 has been deprecated [WARNING] /home/nite/odl/aaa/aaa-cert/src/main/java/org/opendaylight/aaa/ce= rt/impl/ODLKeyTool.java:[175,43] org.bouncycastle.jce.X509Principal in org.= bouncycastle.jce has been deprecated [WARNING] /home/nite/odl/aaa/aaa-cert/src/main/java/org/opendaylight/aaa/ce= rt/impl/ODLKeyTool.java:[178,44] org.bouncycastle.jce.X509Principal in org.= bouncycastle.jce has been deprecated [WARNING] /home/nite/odl/aaa/aaa-cert/src/main/java/org/opendaylight/aaa/ce= rt/impl/ODLKeyTool.java:[181,59] generateX509Certificate(java.security.Priv= ateKey) in org.bouncycastle.x509.X509V3CertificateGenerator has been deprec= ated [WARNING] /home/nite/odl/aaa/aaa-cert/src/main/java/org/opendaylight/aaa/ce= rt/impl/ODLKeyTool.java:[262,23] org.bouncycastle.asn1.x509.X509Name in org= .bouncycastle.asn1.x509 has been deprecated [WARNING] /home/nite/odl/aaa/aaa-cert/src/main/java/org/opendaylight/aaa/ce= rt/impl/ODLKeyTool.java:[262,44] org.bouncycastle.asn1.x509.X509Name in org= .bouncycastle.asn1.x509 has been deprecated [WARNING] /home/nite/odl/aaa/aaa-cert/src/main/java/org/opendaylight/aaa/ce= rt/impl/ODLKeyTool.java:[262,40] X509Name(java.lang.String) in org.bouncyca= stle.asn1.x509.X509Name has been deprecated [WARNING] /home/nite/odl/aaa/aaa-cert/src/main/java/org/opendaylight/aaa/ce= rt/impl/ODLKeyTool.java:[264,23] org.bouncycastle.jce.PKCS10CertificationRe= quest in org.bouncycastle.jce has been deprecated [WARNING] /home/nite/odl/aaa/aaa-cert/src/main/java/org/opendaylight/aaa/ce= rt/impl/ODLKeyTool.java:[264,60] org.bouncycastle.jce.PKCS10CertificationRe= quest in org.bouncycastle.jce has been deprecated This should be addressed, but doing so is not completely straightforward= . |
Resolved | Robert Varga | Eliminate bleuprint from = aaa-password-service |
We are using aaa-password-service h= ere, but other than that this is a straightforward conversion. It is on cri= tical path to netconf, hence we should take extra effort to convert it. = |
Resolved | Robert Varga | Convert H2 datastore to a= OSGi DS component |
The datastore is really standalone here, let's split it into a component= first. |
Resolved | Tomas Cere | Convert IdmLight to OSGi = DS |
This is a simple service on top of IDMStore and aaa-password-service, wh= ich provides a number of critical services: org.opendaylight.aaa.api.IdMService org.opendaylight.aaa.api.ClaimCache org.opendaylight.aaa.api.CredentialAuth org.opendaylight.aaa.api.PasswordCredentialAuth It is also used by downstreams, hence we want to make it OSGi DS for eas= ier consumability.
|
Resolved | Tomas Cere | Convert ODLAuthenticator = into a component |
This is a simple standalone component. Split it out of aaa-shiro's impl-= blueprint as an OSGi DS component with immediate activation. |
Resolved | Robert Varga | Convert web-servlet-jerse= y to OSGi DS |
We are using OSGi activator, we should just use OSGi DS and provide a ja= vax.inject singleton. |
Infrautils
Status | Assignee | Summary | Description |
---|
JSONRPC
Status | Assignee | Summary | Description |
---|---|---|---|
Open | Unassigned | Rework Netty pipeline = |
Current Netty pipeline doesn't model output as jsonrpc message only - it= 's just a utf-8 text. Also, there is no possibility to do interception, which is required for = JSONRPC-35
|
Resolved | Richard Kosegi | Remove async RPC dispa= tch |
This feature never seen wide usage and has various problems:
|
Resolved | Richard Kosegi | Use proxy API in RPC <= /a> |
Currently, JsonRPCtoRPCBridge is using lower-level API (RequesterSession= ) to perform communication to remote ends. This is because exact interface = it's not known at compile-time. Generate interface on-the-fly (using ByteBuddy) based on resolved Schema= Context and replace communication with proxy API. |
Resolved | Unassigned | Move JSON/DOM codec in= to separate module |
Currently most of conversion is implemented in JsonConverter class with = lot of code duplicated/redundant. Create separate maven module for codecs a= nd make their usage more clear to downstream consumers. |
Resolved | Richard Kosegi | Read operation report = HTTP200 via restconf, even for non-existent data |
JSONRPC return empty JSON object to restconf, even when that does not ac= tually exists. This behavior prevent simple things such as verify success of delete ope= ration. |
Resolved | Richard Kosegi | Inband schema provider= require YangXPathParserFactory |
Error is thrown when peer is mounted using inband schema provider, as it= now require YangXPathParserFactory
java.lang.ExceptionInInitializerError: No YangXPat=
hParserFactory found=20
at org.opendaylight.yangtools.ya=
ng.parser.rfc7950.reactor.ServiceLoaderState$XPath.lambda$static$0(ServiceLoaderState.java:32) ~[bundleFile:?]=20
at java.util.Optional.orElseThro=
w(Optional.java:408) ~[?:?]=20
at org.opendaylight.yangtools.ya=
ng.parser.rfc7950.reactor.ServiceLoaderState$XPath.<clinit>(ServiceLo=
aderState.java:32) ~[bundleFile:?]=20
at org.opendaylight.yangtools.ya=
ng.parser.rfc7950.reactor.RFC7950Reactors.vanillaReactorBuilder(RFC7950Reac=
tors.java:327) ~[bundleFile:?]=20
at org.opendaylight.yangtools.ya=
ng.parser.rfc7950.reactor.RFC7950Reactors.defaultReactorBuilder(RFC7950Reac=
tors.java:290) ~[bundleFile:?]=20
at org.opendaylight.yangtools.ya=
ng.parser.rfc7950.reactor.ServiceLoaderState$DefaultReactor.<clinit>(=
ServiceLoaderState.java:23) ~[bundleFile:?]=20
at org.opendaylight.yangtools.ya=
ng.parser.rfc7950.reactor.RFC7950Reactors.defaultReactor(RFC7950Reactors.ja=
va:280) ~[bundleFile:?]=20
at org.opendaylight.jsonrpc.prov=
ider.common.InbandModelsSchemaContextProvider.createSchemaContext(InbandMod=
elsSchemaContextProvider.java:57) ~[bundleFile:?]=20
at org.opendaylight.jsonrpc.mode=
l.CombinedSchemaContextProvider.createSchemaContext(CombinedSchemaContextPr=
ovider.java:44) ~[bundleFile:?]=20
at org.opendaylight.jsonrpc.prov=
ider.common.MappedPeerContext.<init>(MappedPeerContext.java:76) ~[bun=
dleFile:?]=20
at org.opendaylight.jsonrpc.prov=
ider.single.JsonRPCProvider.doMountDevice(JsonRPCProvider.java:181) ~[bundl=
eFile:?]=20
at org.opendaylight.jsonrpc.prov=
ider.single.JsonRPCProvider.mountPeers(JsonRPCProvider.java:131) ~[bundleFi=
le:?]=20
at org.opendaylight.jsonrpc.prov=
ider.single.JsonRPCProvider.processNotificationInternal(JsonRPCProvider.jav=
a:106) ~[bundleFile:?]=20
at org.opendaylight.jsonrpc.prov=
ider.single.JsonRPCProvider.processNotification(JsonRPCProvider.java:149) ~=
[bundleFile:?]=20
at org.opendaylight.jsonrpc.prov=
ider.single.JsonRPCProvider.lambda$init$1(JsonRPCProvider.java:158) ~[bundl=
eFile:?]=20
|
Resolved | Richard Kosegi | RPC implementation not= available in cluster |
Cluster-aware JSONRPC provider doesn't implement and register JsonRpcSer= vice. This leads to { "errors": { "error": [ { "error-type": "application", "error-tag": "operation-not-supported", "error-message": "No implementation of RPC AbsoluteSchemaPath{path=3D[(ur= n:opendaylight:jsonrpc?revision=3D2016-12-01)force-reload]} available" } ] } } |
ODL parent
Status | Assignee | Summary | Description |
---|---|---|---|
Resolved | Robert Varga | Remove sshd declara= tion |
NETCONF is moving to shading mina-sshd itself, to not conflict with Kara= f. Once that is done, we should remove the feature and declaration, so that= we do not interfere with downstreams. |
Resolved | Robert Varga | Remove org.eclipse.= persistence dependency declarations |
These dependencies are only used by Neutron, which has to re-specify ver=
sions and wiring to make things working again and provide overrides-and-wha=
tnot to get around
Remove all declarations that are used only in Neutron, so that it can a = completely local solution based on whatever technology it chooses to deal w= ith that mess. |
Resolved | Robert Varga | Remove javax.json d= eclaration |
This declaration has interplay with org.eclipse.persistence and seems to= only be used in neutron. aaa has an equivalent declaration, which seems to= be unreferenced. Remove it in our next release. |
Resolved | Robert Varga | Remove org.codehaus= .jettison declaration |
This declaration is only used in lispflowmapping, where it is only used = in integration tests. Remove its declaration and let lispflowmapping manage= the version used. |
Resolved | Robert Varga | Remove Scala/Akka p= ackaging |
As a follow-up from
|
Resolved | Robert Varga | Add com.guicedee.se= rvices:javax.inject declaration |
This artifact has the same contents, but modularized for JPMS, allowing = downstreams to link against a proper module. |
Resolved | Oleksii Mozghovyi | Add support for Kar= af static distribution |
Dynamic distro works ouf of the box, but we provide no tooling to make s= tatic distro. Add a proper parent. |
Resolved | Robert Varga | Add support for @ap= iNote, @implSpec, @implNote javadoc tags |
As noted in https://nipafx.dev/javadoc-tags-apiNote-implSpec-implNote/ there ar= e new apidoc tags used throughout the JDK. While these are not standardized, but were introducied with https://bugs.openjdk.java.net/bro= wse/JDK-8008632 and are documented in https://bugs.openjdk.java.net/browse/JDK-8068562<= /a> and are very useful for documentation. Add required javadoc configurati= on to recognize these tags, essentially saying we are endorsing them =E2=80= =93 but the spec is really owned by odlparent. |
Resolved | Robert Varga | Exclude Guava's tra= nsitive dependencies from features |
Testing with static distribution it is clear we do not want to pull in '= wrap' feature =E2=80=93 and the only reason we do is Guava's transitive dep= endencies. Two of them are annotations, which we do not need and one is a s= afety against listenablefuture.jar duplicates. Filter these dependencies out, so we do not package them anymore. |
Resolved | Robert Varga | Service Component R= untime does not conform to R6 spec w.r.t Factory Components |
Felix SCR 4.1.20 (and before), as bundled with karaf-4.2.9, fails to enf= orce correct lifecycle on factory-defined component configurations. In particular, SCR will deactivate such a component configuration when i= ts services become unused, such as going through a getService/ungetService = cycle. This mirrors the lifecycle of a Delayed Component, not a Factory com= ponent =E2=80=93 see sections 112.5.4 and 112.5.5 of OSGi Compendium spec.<= /p> This issue tracks two things:
The mitigation comes in form of https://issues.apache.org/jira/browse/FELIX-3039, i.e. pr= eventing Felix from deactivating unused delayed components. |
YANG Tools
Status | Assignee | Summary | Description |
---|---|---|---|
Resolved | Robert Varga | Cleanup yang-model= -util |
yang-model-util contains a number of classes relevant to implentations o= f yang-model-api as well as a number of classes relevant to users of yang-m= odel-api. The problem here is that the latter cannot be really tested with real mo= dels, as yang-model-util cannot depend on yang-parser-rfc7950 (as it depend= s on it). Split out the implementation classes to yang-model-spi, which is used by= yang-parser-rfc7950 (and others) and make yang-model-util depend on the pa= rser for testing purposes. |
Resolved | Robert Varga | Sort out yang.mode= l.repo.{api,spi,util} placement |
During the course of transitioning to JPMS modules the repo.api package = placement came up. Resolve it somehow =E2=80=93 either by creating a new co= mponent, or renaming it. This needs to be examined with yang-parser-api in mind. |
Resolved | Robert Varga | Restructure git re= pository |
Our current layout is a bit redundant, in that most of our artifacts are= in yang/ directory and most start with yang- prefix. As our scope is pretty much nailed down and we know the general structur= e of our deliverables, we should have a few top-level directories into the = content of yang/ is distributed:
Also, yang-common-* should be moved to common/ .= |
Resolved | Robert Varga | Graduate OrderedBy= Statement.Ordering as yang.common |
The concept of ordering is shared between yang-model-api and yang-data-a= pi =E2=80=93 similar as QName. Graduate OrderedBy into a proper yang-common= contract. |
Resolved | Robert Varga | Remove YangModeled= AnyxmlSchemaNode |
YangModeledAnyxmlSchemaNode is a relic of a design, where this kind of n= ode was treated specially for various XML/JSON interface tricks. These days we have ForeignDataNode to mediate data exchange. The semanti= cs of this node are readily available from examination of substatements, so= we are not losing anything there. There is actually a notable gap in support for this node, which cannot r= eally be serialized by the datastore =E2=80=93 hence it really was never fu= nctional. Remove this construct and all special handling it receives. |
Resolved | Robert Varga | Remove yang-data-j= axen |
yang-data-jaxen has been deprecated for some time, remove its experiment= al feature and the corresponding artifacts. |
Resolved | Robert Varga | Split out yang-dat= a-spi |
yang-data-impl and yang-data-api host a number of elements which should = really be part of yang-data-spi. Split them out to make them more widely av= ailable. |
Resolved | Robert Varga | Remove AnyxmlSchem= aLocation |
AnyxmlSchemaLocationStatement is not defi= ned in the MD-SAL version yang-ext, which everyone is using =E2=80=93 hence= it is not used anywhere. Remove its definition and parser support. |
Resolved | Robert Varga | Move data.impl.sch= ema.builder.api to yang-data-api |
Builders exposed from yang-data-impl conform to a well-defined API. Quit= e a few components depend on this API to feed information into the specific= builder implementation. Factor this API surface into yang-data-api, so it can be implementated w= ithout having ties to yang-data-impl itself. |
Resolved | Robert Varga | Refine statements = are not SchemaNodes |
RefineEffectiveStatementImpl happens to implement SchemaNode contract, w= hich is not actually used anywhere. Most notably UsesNodes do not expose re= fines, but rather their effective indirection, i.e. pointers to the target = nodes which have been refined. Drop the implementation of SchemaNode, reducit overhead and the mismatch= ed contract we are attempting to fulfull. |
Resolved | Robert Varga | Add RootStmtContex= t |
Global namespace behavior might play well with StmtContexts which are kn= own to be root. Add such a marker interface. |
Resolved | Miroslav Kovac | Improve InferredSt= atementContext on-demand instantiation |
When we are faced for a query for a particular child, we really do not w= ant to instantiate all children. Given we can use logic from
Initialize only that child and remember that action in a Map. When it co= mes time to materialize children be mindful of any such instantiations whic= h might have happened and skip those statements. |
Resolved | Miroslav Kovac | Reformulate Statem= entContextFactory.createEffective() |
Rather than passing down StmtContext and its parent via StmtContext.getP= arent() we want to be in control of what gets accessed during statement bui= ld phase. The core contract is StatementContextFactory, which will need two replac= ement interfaces, and the primary implementation is StatementContextBase.= p> We then need to audit all subclasses of StatementContextBase and migrate= their accesses to the new interfaces. InferredStatement context plays a role here in that will plugin into the= se interfaces with methods which do not force memoized materialization in S= tatementContextBase |
Resolved | Michal Banik | Eliminate parser.r= fc7950.stmt.AbstractDeclaredStatement's use of StmtContext |
As the FIXME in the class hints, we are about to promote this class. We = also are moving away from using StmtContext, so migrate all users of deprec= ated constructors. |
Resolved | Robert Varga | Clarify StatementS= upport.applyCopyPolicy()'s targetModule |
Audit all callers of this method to see how they are specifying targetMo= dule. Also audit all implementations to see what they are doing. Based on the audit determine what the contract is and specify it. |
Resolved | Miroslav Kovac | Audit all Statemen= tSupport classes for correct CopyPolicy |
Having a correct CopyPolicy is critical in minimizing the amount of copy= ing we do. Audit all StatementSupports and supply the correct CopyPolicy. A= t least TypedefStatementSupport is doing the wrong thing and AbstractAugmen= tStatementSupport ends up compensating for it. |
Resolved | Robert Varga | Release InferredSt= atementContext's effective statements after build |
Performing lazy copy operations means we can end up copying a statement = after it has been built and hence should no longer need its effective state= ments. Add an explicit ModelProcessingPhase.EFFECTIVE_VIEW, which will run afte= r EFFECTIVE_MODEL has been completed and the effective statement has been b= uilt. It's execution is a straightforward children-first walk from root, just = as any other processing phase. All copy operations need to hook a prerequisite for EFFECTIVE_VIEW on th= eir source context =E2=80=93 which prevents it from completing =E2=80=93 fo= r each copied statement. That hook needs to resolve when the copy acquires = the substatements. |
Resolved | Miroslav Kovac | Integrate Effectiv= eStmtCtx and StmtContext |
EffectiveStmtCtx is always implemented as a proxy on top of a StatementC= ontextBase =E2=80=93 hence it is a superfluous object. Make sure StmtContext and EffectiveStmtCtx.Current can be implemented by= StatementContextBase at the same time. There is a lot of overlap in their = methods =E2=80=93 these should be isolated into CommonStmtCtx with their (s= horter) EffectiveStmtCtx names. StmtContext should then extend CommonStmtCtx and provide its current met= hod as default forwarders. |
Resolved | Miroslav Kovac | Shortcut InferredS= tatement.buildEffective() when no inference was done |
With all the work done in
Unfortunately we still end up materializing substatements even when ther= e was no inference and we may actually end up building an EffectiveStatemen= t which is equal to our prototype. Devise a reactor-internal shortcut where InferredStatementContext can as= k its prototype to provide an EffectiveStatement taking parent/history (and= probably others) into account. This shortcut needs to be taken when Inferr= edStatementContext.substatements is null =E2=80=93 i.e. the difference is o= nly in things InferredStatementContext has readily available.
|
Resolved | Robert Varga | Reuse effective su= bstatement lists when possible |
This is the first step in fly-weight statements. As described in
This is mostly yang-parser-reactor work, but also requires exposing acce= ss to AbstractStatementSupport.createEffective(Current, List). This should prove effective in this test case:
module foo { namespace foo; prefix foo; grouping grp { container foo { description "desc= "; reference "ref"= span>; } } uses foo; } while /grp/foo and /foo are distinct objects, their EffectiveStatement.e= ffectiveSubstatements() need to return the same object.
|
Resolved | Robert Varga | Allow substatement= -derived state to be inherited | {Data,Schema}=20
TreeAwareEffectiveStatements are deriving QName->EffectiveStatement m= aps from substatements of a particular statement. With
Also update all implementations to pass this derived state around.
|
Resolved | Robert Varga | Expand DataTreeAwa= reEffectiveStatements |
Wider adoption of SchemaInferenceStack shows that we are lacking the abi= lity to follow data tree from choice/case nodes. This is counter-intuitive = =E2=80=93 choice already has the notion of searching case nodes =E2=80=93 h= ence indexing data tree children does make sense. While we are reconsidering things, it might well be suitable for groupin= gs as well. |
Resolved | Robert Varga | Add SchemaInferenc= eStack.enterChoice(QName) |
yang-data-impl's SchemaTracker performs a rather weird dance, where (due= to NormalizedNode) hierarchy it performs a hybrid schema tree/data tree wa= lk. While it can enter a ChoiceEffectiveStatement via schema tree, it needs = to deal with choice/case/choice traversal, where it does not see the interm= ediate case. SchemaInferenceStack is well equipped to handle this, as it already need= s to deal with choice/case crossing during SchemaNodeIdentifier constructio= n when data tree steps are involved. Introduce an alternative enterChoice(QName), which will examine parent a= nd based on that either turns into a enterSchemaTree() or, if parent is a C= hoice, will do a case traversal search =E2=80=93 resulting in a clean=3Dfal= se step which resolveSchemaTreeSteps() needs to unwind. |
Resolved | Robert Varga | Do not use DataSch= emaNode in Anydata normalization |
NormalizedAnydata and NormalizableAnydata rely on DataSchemaNode to prov= ide enough context to decode the data. This is made with the implicit assum= ption that DataSchemaNode.getPath() provides the context needed to perform = things like leafref resolution. We have a better replacement in EffectiveStatementInference, which combi= nes an EffectiveModelContext with an ordered list of EffectiveStatements = =E2=80=93 providing a simple-to-use alternative. |
Resolved | Robert Varga | Promote yang.data.= impl.SchemaTracker |
yang-data-impl's SchemaTracker provides a common interface used by yang-= data-codec-{gson,xml} when interacting with AbstractCodecFactory, which in = turn interacts with SchemaContextUtil. SchemaTracker really follows NormalizedNodeStrea=
mWriter contract's view on NormalizedNode, hence it is fair to provi=
de it as NormalizedNode counterpart of SchemaInferenceStack. From naming pe=
rspective, NormalizedNodeInferenceStack |
Resolved | Robert Varga | Remove SchemaUtils= methods |
There is a ton of now-unused methods in SchemaUtils. Remove them to prev= ent confusion. |
Resolved | Robert Varga | Define ModelProces= singPhase.ExecutionOrder |
ModelProcessingPhase enumeration really is a strongly-ordered, i.e. it a= mounts to what steps need to be taken, in order. Define ExecutionOrder, which is actually a set of positive byte values r= eflecting current implications of ModelProcessingPhase. This allows us to store the equivalent of ModelProcessingPhase in Statem= entContextBase for the cost of a single byte instead of a reference, freein= g up 3-7 bytes of storage. |
Resolved | Robert Varga | Inline CopyHistory= storage |
CopyHistory is a rather simple construct, recording 4 bits of informatio= n, for which are expending 4/8 bytes in every instance. Store all history information in a single byte, providing CopyHistory op= erations as a bit masking exercise. |
Resolved | Robert Varga | Add org.opendaylig= ht.yang.parser.api.YangParserFactory et al. |
We have slight confusion in yang-parser-api naming, where the name of th= e artifact does not actually match the exported package. As a first step retrofit the API and implementations to export both pack= ages. |
Resolved | Robert Varga | Add ItemOrder.{Ord= ered,Unordered} concept |
YANG defines distinct equality classes based on whether order of items i= s significant. This is typically expressed via 'ordered-by' statement. Our NormalizedNode model does not correctly capture this property, leadi= ng to ill-defined equality contract where MapNode and LeafSetNode are invol= ved. Define a general ItemOrder construct with two subclasses, Ordered and Un= ordered, which capture this contract. These need to be mutally-exclusive si= milar to Mutable/Immutable contract. |
Resolved | Robert Varga | Enforce unique con= straints when opted-in |
DataTreeConfiguration.uniqueIndexes is a configuration option we are cur= rently ignoring. It should result in unique constraints being enforced. As a first step add UniqueValidation, which will perform external uninde= xed validation =E2=80=93 i.e. will not keep additional state while ensuring= all unique constraints are enforced. |
Resolved | =D0=90=D0=BD=D1=82=D0=BE= =D0=BD =D0=A2=D1=80=D0=B5=D0=B3=D1=83=D0=B1=D0=BE=D0=B2 | Add the option to = retain declaration reference in DeclaredStatement |
This feature allows to create a navigation link to anchor in source= file for "main" statements in YANGs Visualization UI.
This feature already implemented in https://github.com/anton-tregubov/yangtools/tree/6.= 0.x But I can't find any way to create Pull Request or Merge Reque= st |
Resolved | Robert Varga | Do not generate Ef= fectiveStatements for unbound extensions |
Our current behavior regarding extensions is that we try to fudge them, = making a number of guesses around what the extension might be doing. This involves quite some complexity, recursive statement builds and the = like =E2=80=93 which seems counter-productive given that we can just claim = ignorance, treat them as unknown statements and therefore ignore them as pe= r https://tools.ietf= .org/html/rfc7950#section-6.3.1
|
Resolved | Robert Varga | Add yang.model.api= .EffectiveStatementInference |
A number of places need to exchange a stack of EffectiveStatements as a = means to maintain cohesiveness within a single logical operation on top of = an EffectiveModelContext. While the details and semantics of exchange can v= ary, we need an overarching construct, the basis of which is:
Introduce EffectiveStatementInference as such a capture and integrate it= with SchemaInferenceStack, providing a simple means of exchanging SchemaIn= ferenceStack state. |
Resolved | Robert Varga | Add yang.model.api= .SchemaTreeInference |
As a special case of EffectiveStatementInference, we have a class which = guarantees that all constituent statements are SchemaTreeEffective statemen= ts and are linearizable to a SchemaNodeIdentifier. Introduce SchemaTreeInference, which will capture this capability. = td> |
Resolved | Robert Varga | Move RFC7950 effec= tive statements to yang-model-ri |
yang-model-spi is a common place to keep implementation-shared bits and = pieces. Just as we moved declared statement implementations, move as many o= f effective statement implementations as possible. |
Resolved | Robert Varga | Convert yang-commo= n-netty to a JPMS module |
yang-common-netty is a very simple library, convert it to a JPMS module<= /p> |
Resolved | Miroslav Kovac | Eliminate duplicate= DescriptionEffectiveStatementImpl objects |
Analysis of a memory snapshot with vendor models shows we end up with a = SchemaContext which weighs about 240MB. Further analysis of duplicate objec= ts shows we have ~4000 instances of DescriptionEffectiveStatementImpl wasti= ng ~400kB, which refer to a single description statement defined in a group= ing. This hints at us not having the understanding that a statement has been = copied and unmodified from a grouping. Analyze the exact cause for this and= fix it either by not performing a copy, or squashing resulting duplicates.= This theory is reinforced by the fact that the same dump shows ~64K When= EffectiveStatementImpl objects (23x groups of 2769 instances each) coming f= rom a construct like: grouping foo {
leaf bar {
when "../x";
}
}
A similar situation happens with UnitsEffectiveStatementImpl =E2=80=93 1= 5K instances wasting 450kB. |
Resolved | Miroslav Kovac | Defer statement ini= tialization in InferredStatementContext |
In order to implement efficient grouping inlining with working augment/d= eviate statements, we need to have the concept of a node which represents a= tree of potential nodes. This cannot be realized via internals of parser.s= tmt.reactor because it changes the mechanics of how NamespaceBehaviours wor= k. Current design assumption is that namespaces are populated eagerly with = key/value pairs and inference actions can be registered to respond to those= key/values. Efficient inlining (
Currently the only use of listeners is to perform mutation, which simpli= fies the contract, as we really need to have a way to:
Further simplification comes from the fact that we need this to work onl= y in one specific namespace, which is ChildSchemaNodeNamespace. |
Resolved | Robert Varga | Make DataSchemaNod= e.isConfiguration() tri-state |
The idea that isConfiguration() boils down to a simple boolean is flawed= , as DataSchemaNodes defined under a grouping can be either. There are thre= e basic models here: module foo { grouping foo { container indeterminate { // ancestors is neither true or false, hen= ce we do not know } } container cfg { // No config, defaults to true grouping foo { container indeterminate { // ancestor is config=3Dtrue, but this ma= y be used in config=3Dfalse }=20 } } container oper { // Explicitly false config false; grouping foo { container false { // ancestor is config=3Dfalse and hence this can only be referenced // by other config=3Dfalse nodes. } } } } For the purposes of modeling, though, DataSchemaNodes defined within a g= rouping hierarchy should have a isConfiguration=3DUNDEF. Semantically the question is what happens to nodes in notifications/acti= ons/RPCs =E2=80=93 they are not inherently tied to a particular data store,= although RFC7950 would seem to imply these are runtime constructs and henc= e would be config=3Dfalse. Since ODL extends the invocation model to allow = RPC/action/notifications on any datastore, these should end up being undefi= ned, too.
|
Resolved | Robert Varga | Redefine TypeState= ment in terms of QName |
TypeStatement currently takes String argument, which is not entirely acc= urate, as it does not provide type expansion required for lookup. This leads to SourceExceptions during building of effective statement ra= ther than a failure to parse the argument when the statement is being defin= ed. Fix the definition of TypeStatement and TypeEffectiveStatement so that t= hese take a QName argument. This leads to the question of which QNameModule should built-in types re= solve =E2=80=93 and that should be "urn:ietf:params:xml:ns:yang:1", as defi= ned in org.opendaylight.yangtools.yang.model.util.BaseTypes. During unprefi= xed parsing, hence AbstractTypeStatementSupport needs to account for this m= anually. |
Resolved | Robert Varga | Ditch URI as names= pace identifier |
URI is a bit baroque for our needs as namespace representation. It is no= t as clunky as java.util.Date was for revision-date, but there are still is= sues. Most notably we routinely need to convert between String-based Java name= space and URI, hence we end up adding caches, which is suboptimal. Bite the bullet and define a yang.common.Namespace, which will just wrap= a String and validate it. |
Resolved | Robert Varga | Rename concepts.Va= riant |
Variant is a general name, where Scala has a Try (for exceptions) and Ei= ther =E2=80=93 the latter been a terminus technicus. As Variant is still @B= eta, plain rename it while nobody is watching. |
Resolved | Robert Varga | Introduce parser.s= pi.SchemaTreeNamespace |
As it turns out ChildSchemaNodeNamespace is an addressing contract missi= ng from reactor, but intended to be there (see SchemaNodeIdentifierNamespac= e). Promote ChildSchemaNodeNamespace to a yang-parser-spi construct and prop= erly tie it with other pieces of that API. |
Resolved | Robert Varga | Remove parser.spi.= SchemaNodeIdentifierNamespace |
SchemaNodeIdentifierNamespace was never implemented and reactor-wards we= have SchemaTreeNamespace, which is much better. Remove the old namespace s= o as to prevent confusion. |
Resolved | Robert Varga | Do not depend on j= avax.xml.bind |
We are using DatatypeConverter just for Base64 parsing. Replace this dep= endency with Base64's MIME decoder. |
Resolved | Robert Varga | Convert yang-data-= impl into a JPMS module |
yang-data-impl is our primary implementation, make sure it is a proper J= PMS module. |
Resolved | Robert Varga | Define Modificatio= nApplyOperation.toString() |
Most of the implementations already have a toString() contract, but it i= s not carried in the base class. Improve debugging experience by providing = uniform toString(). |
Resolved | Robert Varga | Update StoreTreeNo= de methods |
yang.data.api.schema.tree.StoreTreeNode.getChild() is forcing users to d= eal with optionals, where a lot of the time they would prefer to deal with = a plain nullable. Update StoreTreeNode so that it has three methods: @Nullable TreeNode childByArg(PathArgument);
@NonNull TreeNode getChildByArg(PathArgument); // throws VerifyException
Optional<TreeNode> findChildByArg(PathArgument);
|
Resolved | Robert Varga | Update MutableTree= Node methods |
yang.data.api.schema.tree.spi.MutableTreeNode acts as a lazy intermediar= y between ModificationApplyOperation and a backing Map. Its addChild() and = removeChild() hide lifecycle events, making it impossible to discern when a= child was replaced by addChild() and what child was removed by removeChild= (). Update these methods (renaming addChild() to putChild()) to match map se= mantics. |
Resolved | Robert Varga | Update DataNodeCon= tainer methods |
DataNodeContainer.getDataChildByName() is a @Nullable getter, which is u= sed in that capacity all over the place. On the other hand a number of plac= es would like to make that an assertion. Fix this by centering the implementation around dataChildByName(), which= is nullable and then spinning Optional and non-null from that. |
Resolved | Robert Varga | Remove use of Stat= ementSourceReference from AbstractDeclaredEffectiveStatement |
AbstractDeclaredEffectiveStatement uses StatementSourceReference to thro= w SourceException when schema tree/data tree indexing fails. Define two IllegalArgumentExceptions and throws those instead, adjusting= callers to wrap these exceptions with SourceException. |
Resolved | Robert Varga | Eliminate duplicat= e indexing in AbstractEffectiveModule |
AbstractEffectiveModule performs schema tree/data tree indexing, which i= s duplicating work already done by its superclass, DefaultWithDataTree.With= Substatements. Switch to using pre-built index, allowing us to speed up statement creat= ion and lower memory footprint of {Module,Submodule}EffectiveStatementImpl.=
|
Resolved | Robert Varga | Eliminate exceptio= n throws from UnrecognizedEffectiveStatementImpl |
Unrecognized statements get some very weird handling in an attempt to cr= eate a SchemaPath, including attempting to create QNames. This leads to a lot of exceptions being thrown:
We should be able to do better if we expose validity checking mechanics = from AbstractQName and rely on that instead of throwing/catching exceptions= . |
Resolved | Robert Varga | Reduce StatementSo= urceReference proliferation |
We have a large number of users who assume acquiring CommonStmtContext.s= ourceReference() is cheap, which is not really the case. Most of the time t= he reference is acquired only for the purposes of throwing an exception =E2= =80=93 which we rarely really do. Refactor SourceException and its subclasses to offer instantiation with = CommonStmtCtx, calling sourceReference() only if an exception is about to b= e thrown. This should help with code verbosity as well as improve performance. = |
Resolved | Robert Varga | Release GroupingNa= mespace when module/submodule is done |
We currently do not wipe GroupingNamespace because it is used after infe= rence by UsesStatementSupport.getSourceGrouping(). Logic in UsesStatementSupport needs to be updated to store a StmtContext= .replicaAsChildOf() for its context and add it to a dedicated namespace in = that statement. During UsesStatementSupport.createEffective() we need to pi= ck this replica up and use it as the source of the effective statement. This way we do not look into GroupingNamespace after inference, have the= grouping tied down with a proper reference, which will be cleared when we = build the statement. Once this is done, add GroupingNamespace to RootStatementContext.SWEPT_N= AMESPACES. |
Resolved | Robert Varga | Release TypeNamesp= ace when module/submodule is done |
We currently do not wipe TypeNamespace because it is used by AbstractTyp= eSupport.resolveType() after inference is done. Similar to
Once that is done, add TypeNamespace to RootStatementContext.SWEPT_NAMES= PACES. |
Resolved | Ivan Hrasko | Improve Normalized= Node formatting capabilities |
In case of data tree operation errors we end up dumping the NormalizedNo= de involved in the operation this way: [pool-3-thread-5] ERROR org.opendaylight.mdsal.dom.spi.store.SnapshotB= ackedWriteTransaction - Tx: OPER-34, failed to write /(urn:opendaylight:par= ams:xml:ns:yang:bgp-rib?revision=3D2018-03-29)bgp-rib/rib/rib[{(urn:openday= light:params:xml:ns:yang:bgp-rib?revision=3D2018-03-29)id=3Dtest-rib}]/loc-= rib/tables/tables[{(urn:ope ndaylight:params:xml:ns:yang:bgp-rib?revision=3D2018-03-29)afi=3D(urn:opend= aylight:params:xml:ns:yang:bgp-types?revision=3D2020-01-20)ipv4-address-fam= ily, (urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=3D2018-03-29)saf= i=3D(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=3D2020-01-20)un= icast-subsequent-address-fam ily}]/(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=3D2018-03-29)i= pv4-routes/ipv4-route/ipv4-route[{(urn:opendaylight:params:xml:ns:yang:bgp-= inet?revision=3D2018-03-29)path-id=3D1, (urn:opendaylight:params:xml:ns:yan= g:bgp-inet?revision=3D2018-03-29)route-key=3D1.1.1.1/32}]:ImmutableMapEntry= Node{identifier=3D(urn:opend aylight:params:xml:ns:yang:bgp-inet?revision=3D2018-03-29)ipv4-route[{(urn:= opendaylight:params:xml:ns:yang:bgp-inet?revision=3D2018-03-29)path-id=3D1,= (urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=3D2018-03-29)route-= key=3D1.1.1.1/32}], value=3D[ImmutableLeafNode{identifier=3D(urn:opendaylig= ht:params:xml:ns:yang:bgp-inet ?revision=3D2018-03-29)prefix, value=3D1.1.1.1/32}, ImmutableContainerNode{= identifier=3D(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=3D2018-= 03-29)attributes, value=3D[ImmutableContainerNode{identifier=3D(urn:openday= light:params:xml:ns:yang:bgp-inet?revision=3D2018-03-29)origin, value=3D[Im= mutableLeafNode{identifier=3D(urn: opendaylight:params:xml:ns:yang:bgp-inet?revision=3D2018-03-29)value, value= =3Digp}]}, ImmutableContainerNode{identifier=3D(urn:opendaylight:params:xml= :ns:yang:bgp-inet?revision=3D2018-03-29)multi-exit-disc, value=3D[Immutable= LeafNode{identifier=3D(urn:opendaylight:params:xml:ns:yang:bgp-inet?revisio= n=3D2018-03-29)med, value=3D0}]} , ImmutableChoiceNode{identifier=3D(urn:opendaylight:params:xml:ns:yang:bgp= -inet?revision=3D2018-03-29)c-next-hop, value=3D[ImmutableContainerNode{ide= ntifier=3D(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=3D2018-03-= 29)ipv4-next-hop, value=3D[ImmutableLeafNode{identifier=3D(urn:opendaylight= :params:xml:ns:yang:bgp-inet?r evision=3D2018-03-29)global, value=3D2.2.2.2}]}]}, ImmutableContainerNode{i= dentifier=3D(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=3D2018-0= 3-29)local-pref, value=3D[ImmutableLeafNode{identifier=3D(urn:opendaylight:= params:xml:ns:yang:bgp-inet?revision=3D2018-03-29)pref, value=3D100}]}, Imm= utableContainerNode{identifier=3D( urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=3D2018-03-29)as-path,= value=3D[]}]}, ImmutableLeafNode{identifier=3D(urn:opendaylight:params:xml= :ns:yang:bgp-inet?revision=3D2018-03-29)path-id, value=3D1}, ImmutableLeafN= ode{identifier=3D(urn:opendaylight:params:xml:ns:yang:bgp-inet?revision=3D2= 018-03-29)route-key, value=3D1.1 .1.1/32}]} in MutableDataTree [modification=3DModifiedNode{identifier=3D(ur= n:ietf:params:xml:ns:netconf:base:1.0)data, operation=3DTOUCH, childModific= ation=3D{(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=3D2018-03-29= )bgp-rib=3DModifiedNode{identifier=3D(urn:opendaylight:params:xml:ns:yang:b= gp-rib?revision=3D2018-03-29)bgp -rib, operation=3DTOUCH, childModification=3D{(urn:opendaylight:params:xml:= ns:yang:bgp-rib?revision=3D2018-03-29)rib=3DModifiedNode{identifier=3D(urn:= opendaylight:params:xml:ns:yang:bgp-rib?revision=3D2018-03-29)rib, operatio= n=3DTOUCH, childModification=3D{(urn:opendaylight:params:xml:ns:yang:bgp-ri= b?revision=3D2018-03-29)rib[{(urn: opendaylight:params:xml:ns:yang:bgp-rib?revision=3D2018-03-29)id=3Dtest-rib= }]=3DModifiedNode{identifier=3D(urn:opendaylight:params:xml:ns:yang:bgp-rib= ?revision=3D2018-03-29)rib[{(urn:opendaylight:params:xml:ns:yang:bgp-rib?re= vision=3D2018-03-29)id=3Dtest-rib}], operation=3DTOUCH, childModification= =3D{(urn:opendaylight:params:xml:ns: yang:bgp-rib?revision=3D2018-03-29)loc-rib=3DModifiedNode{identifier=3D(urn= :opendaylight:params:xml:ns:yang:bgp-rib?revision=3D2018-03-29)loc-rib, ope= ration=3DTOUCH, childModification=3D{(urn:opendaylight:params:xml:ns:yang:b= gp-rib?revision=3D2018-03-29)tables=3DModifiedNode{identifier=3D(urn:openda= ylight:params:xml:ns:yang:bgp-rib? revision=3D2018-03-29)tables, operation=3DTOUCH, childModification=3D{(urn:= opendaylight:params:xml:ns:yang:bgp-rib?revision=3D2018-03-29)tables[{(urn:= opendaylight:params:xml:ns:yang:bgp-rib?revision=3D2018-03-29)afi=3D(urn:op= endaylight:params:xml:ns:yang:bgp-types?revision=3D2020-01-20)ipv4-address-= family, (urn:opendaylight:para ms:xml:ns:yang:bgp-rib?revision=3D2018-03-29)safi=3D(urn:opendaylight:param= s:xml:ns:yang:bgp-types?revision=3D2020-01-20)unicast-subsequent-address-fa= mily}]=3DModifiedNode{identifier=3D(urn:opendaylight:params:xml:ns:yang:bgp= -rib?revision=3D2018-03-29)tables[{(urn:opendaylight:params:xml:ns:yang:bgp= -rib?revision=3D2018-03-29)afi =3D(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=3D2020-01-20)ipv= 4-address-family, (urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=3D2= 018-03-29)safi=3D(urn:opendaylight:params:xml:ns:yang:bgp-types?revision=3D= 2020-01-20)unicast-subsequent-address-family}], operation=3DNONE}}}}}}}}}}}= }}] org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaValidationFaile= dException: Child /(urn:opendaylight:params:xml:ns:yang:bgp-rib?revision=3D= 2018-03-29)bgp-rib/rib/rib[{(urn:opendaylight:params:xml:ns:yang:bgp-rib?re= vision=3D2018-03-29)id=3Dtest-rib}]/loc-rib/tables/tables[{(urn:opendayligh= t:params:xml:ns:yang:b gp-rib?revision=3D2018-03-29)afi=3D(urn:opendaylight:params:xml:ns:yang:bgp= -types?revision=3D2020-01-20)ipv4-address-family, (urn:opendaylight:params:= xml:ns:yang:bgp-rib?revision=3D2018-03-29)safi=3D(urn:opendaylight:params:x= ml:ns:yang:bgp-types?revision=3D2020-01-20)unicast-subsequent-address-famil= y}]/(urn:opendaylight:params :xml:ns:yang:bgp-inet?revision=3D2018-03-29)ipv4-routes is not present in s= chema tree. at org.opendaylight.yangtools.yang.data.impl.schema.tree= .InMemoryDataTreeModification.resolveModificationFor(InMemoryDataTreeModifi= cation.java:182) at org.opendaylight.yangtools.yang.data.impl.schema.tree= .InMemoryDataTreeModification.write(InMemoryDataTreeModification.java:95) at org.opendaylight.mdsal.dom.spi.store.SnapshotBackedWr= iteTransaction.write(SnapshotBackedWriteTransaction.java:72) at org.opendaylight.mdsal.dom.broker.DOMForwardedWriteTr= ansaction.put(DOMForwardedWriteTransaction.java:87) at org.opendaylight.mdsal.dom.spi.ForwardingDOMDataReadW= riteTransaction.put(ForwardingDOMDataReadWriteTransaction.java:48) at org.opendaylight.protocol.bgp.rib.impl.LocRibWriter.u= pdateLocRib(LocRibWriter.java:372) at org.opendaylight.protocol.bgp.rib.impl.LocRibWriter.w= alkThrough(LocRibWriter.java:344) at org.opendaylight.protocol.bgp.rib.impl.LocRibWriter.o= nDataTreeChanged(LocRibWriter.java:216) at org.opendaylight.mdsal.dom.store.inmemory.InMemoryDOM= StoreTreeChangePublisher.lambda$new$0(InMemoryDOMStoreTreeChangePublisher.j= ava:43) at org.opendaylight.yangtools.util.concurrent.AbstractQu= euedNotificationManager.executeBatch(AbstractQueuedNotificationManager.java= :88) at org.opendaylight.yangtools.util.concurrent.AbstractBa= tchingExecutor$DispatcherTask.invokeWorker(AbstractBatchingExecutor.java:30= 5) at org.opendaylight.yangtools.util.concurrent.AbstractBa= tchingExecutor$DispatcherTask.run(AbstractBatchingExecutor.java:292) at java.base/java.util.concurrent.ThreadPoolExecutor.run= Worker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Wor= ker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:834) which does contain a lot of information, but it is in a very unfriendly = format. Improve NormalizedNode with: interface Norm= alizedNode { Supplier<String> prettyTree(); } which will return a memoizing supplier: final class NormalizedNodePrettyTree implements Supplier<String>= { private @Nullable String str; // Lazy init, etc. =20 @Override public String toString() { return get(); } } The resulting string should be very similar to what NormalizedNodes.toSt= ringTree() does, except it needs to print augmentations (as a list of singl= e-namespace nodes) and omit namespaces only when unnecessary. |
Resolved | Robert Varga | Refactor Identifie= rNamespace |
org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace is an= interface specifying a get() method, which is not directly implemented any= where. The reality is that this interface is not really meant to be instantiate= d =E2=80=93 there are no yang-model-api-level means to acquire an instance = of it, as all lookups operate on the .class object instead. Since the parser internals will be disconnected from this interface with=
|
Resolved | Robert Varga | Improve model.api.= ValueRange$Range usage |
ValueRange is a simple construct which works on any java.lang.Number. Ex= amining a heap dump of Junos 19.3 test case reveals we are allocating java.= math.BigIntegers to hold ranges =E2=80=93 32428 instances Each BigInteger costs us 64 bytes of memory, even when we could get away= with much smaller storage =E2=80=93 Integer/Uint32 and Long/Uint64 end up = costing 16/24 bytes, hence we could potentially cut memory usage from ~2.5M= iB to 500-800KiB. Track down the user and try to persuade it to use smaller Number classes= . |
Resolved | Robert Varga | Migrate users of S= tatementPolicy.legacyDeclaredCopy() |
Eliminate these users by providing the appropriate policy and culminatin= g in removal of legacyDeclaredCopy(). |
Resolved | Robert Varga | Track substatement= independence in StatementContextBase |
When we are considering a statement for reuse of EffectiveStatement, we = need to consult both the statement itself and its substatements. The substatement consultation is very rudimentary: we only deal with the= case on empty statements and fall back to normal instantiation for everyth= ing else. There is a middle step we can take: if all substatements are CONTEXT_IND= EPENDENT or IGNORE, we can reuse all of the substatements, skipping their i= nstantiation. While this is very similar to the aims of
|
Resolved | Robert Varga | Make CopyHistory i= mplement CopyableNode |
It has become obvious most users want the same thing and we are ending u= p with duplicated code. Furthermore there is room for optimizing the two qu= eries. Make CopyHistory implement CopyableNode and migrate all callers mucking = with contains(CopyType) to use those instead. |
Resolved | Robert Varga | Require QName inst= ead of SchemaPath for TypeDefinition implementions |
TypeDefinition has no semantics dependent on SchemaPath, just QName =E2=
=80=93 ever since
Since https://git.opendaylight.org/gerrit/q/I3490d6d70611= 3ea14ee3f4181a7ba827380c8181 the default SchemaPath contract throws an = UOE. This makes TypeDefinition.getPath() a pure implementation detail. This e= nds up being costly in terms of memory overhead (SchemaPath vs QName) as we= ll as accidental mis-features, such as seemingly guaranteeing type definiti= on uniqueness. |
Resolved | Robert Varga | Add QNameAwareData= {Input,Output} |
QName implements WritableObject and we also have Data{input,Output) in y= ang-data-codec-binfmt. Currently QName.writeTo() has no way to take advantage of facilities pro= vided by NormalizedNodeDataOutput, leading to poor serialization in this ca= se. Add common meeting points for the two components, so that they can effic= iently interoperate. |
Resolved | Robert Varga | Do not synchronize= in ReactorStmtContext.schemaPath() |
Our parser is inherently single-threaded, there is no point in having vo= latiles/synchronized guarding just this field. Make it a normal field, remo= ving some dancing around. |
Resolved | Robert Varga | Switch non-existen= t arguments to Empty instead of Void |
We currently allow ModelStatement.argument() to return null for the purp= oses on supporting argumentless statements. We really want to make sure nulls do no occur =E2=80=93 and for that yan= g.common.Empty is a much better fit. Convert all Void use to Empty, making sure ModelStatement.argument() alw= ays returns non-null. |
Resolved | Robert Varga | Defer substatement= search to effective instace |
BoundStmtCtx.findSubstatementArgument() and hasSubstatement() are search= methods very similar to what EffectiveStatement provides, in fact they are= a strict subset of that. Take advantage of this to perform a faster search without the need to lo= ok at isSupportedToBuildEffective().
|
Resolved | Robert Varga | Do not retain reus= ed substatements |
In case we end up not needing to copy substatements and there is no exis= ting reference towards us, we can skip instantiation of replicas as these w= ill not be accessed afterwards. This reduces the amount of garbage for the cost of a modest check agains= t parent reference axis. |
Resolved | Robert Varga | Move AbstractDecla= redStatement et al. to yang-model-spi |
AbstractDeclaredStatement is a useful baseline class for implementations= . Since we now have have a proper artifact for these, promote this class in= to org.opendaylight.yangtools.yang.model.spi.meta where it is better access= ible. |
Resolved | Robert Varga | Move RFC7950 decla= red statements to yang-model-ri |
RFC7950 declared statements are covered by the yang.model.api.stmt set o= f contracts. Make sure yang.model.spi users can instantiate all of them via= a DeclaredSubstatements utility class. |
Resolved | Robert Varga | Remove SchemaNode.= getPath() from yang-data-codec-xml |
SchemaNode.getPath() is only used for diagnostic purposes, other logic s= hould not be affected. Find a suitable replacement. |
Resolved | Miroslav Kovac | Rework SchemaConte= xtUtil.getBaseTypeForLeafRef() |
SchemaContextUtil.getBaseTypeForLeafRef() is the most significant user o= f SchemaNode.getPath(). Create a suitable replacement to work with data.util.codec.AbstractCodec= Factory and SchemaAwareXMLStreamWriterUtils. |
Resolved | Robert Varga | Remove SchemaUtils= .findParentSchemaNodesOnPath() |
This method is overly-general in an attempt to deal with uninstantiated = contexts. As it turns out, though, these are not really valid, as we invari= antly want to interpret SchemaPath as an SchemaNodeIdentifier equivalent.= p> Use SchemaInference stack to sort out addressing and initialization, rem= oving users of this method and then the method itself. |
Resolved | Robert Varga | A SchemaInferenceS= tack.enterDataTree() |
So far SchemaInferenceStack only dealt with simple steps like grouping/s= chema tree. In order to make it more useful in data-centric world, it also = needs to support going through data tree. While the enter/exit logic is very much similar to what schema tree does= , the result is not exactly the same: toSchemaNodeIdentifier() needs to ess= entially double-check each statement to see if it needs actually multiple s= teps. |
Resolved | Robert Varga | Rework AbstractCod= ecFactory.codecFor() |
AbstractCodecFactory performs leafref resolution based on an 'S extends = TypeAware & SchemaNode' =E2=80=93 leading to a call to SchemaContextUti= l.getBaseTypeForLeafRef().
|
Resolved | Robert Varga | Maintain a SchemaI= nferenceStack in SchemaTracker |
SchemaTracker acts as a common tracker for yang.model.api equivalence, t= racking arguments for things like SchemaContextUtil =E2=80=93 which inheren= tly need SchemaNode.getPath() for corner cases. Maintain a SchemaInferenceStack inside SchemaTracker, which should= improve performance and remove some code duplication due to SchemaInferece= Stack.enterDataTree() being available. |
Resolved | Robert Varga | Clean up {Schema,D= ata}TreeAwareStatement lookups |
Current set of lookup methods uses an unsafe type-variance: <E extends =
SchemaTreeEffectiveStatement<?>> Optional<E> findSchemaTreeN=
ode(List<QName> qnames);
This needs to be split up into multiple methods, so we support proper Cl= ass-based filters: <E> Optional<E> findSchemaTreeNode( while also providing a simplified Optional<SchemaTreeEffectiveStatement<?>&= gt; findSchemaTreeNode(List<QName> qnames);
|
Resolved | Robert Varga | Improve SharedSche= maContextFactory |
SharedSchemaContextFactory is widely used for caching context. Unfortuna= tely it has a major deficiency around first computation: if multiple reques= ts enter resolution process, we end up computing the schema context concurr= ent and only deduplicate it afterwards. Refactor the implementation to remember futures, so concurrent accesses = end up waiting for the initial computation to finish. This requires some fa= ncy dance around references, as the indirection in cache values will mean t= hat soft references will clean up on Future not being referenced, rather th= an the context not being referenced. |
Resolved | Robert Varga | Optimize Statement= ContextBase layout |
We currently store CopyHistory as a reference to an object, costing us 4= b/8b of storage in StatementContextBase. StatementContextBase is the bread&butter of memory/CPU trade-offs an= d it does not have a single bit of storage left. At the end of the day, CopyHistory encodes the following information:
This currently boils down to 2+log2(4)=3D4 significant bits, for which w= e are storing 32/64 bits. Refactor StatementContextBase.copyHistory to be private final byte= copyHistory; This frees up 3-7 bytes of storage, which provides 24bits of additional = free storage.
Another candidate is StatementContextBase.completedPhase, which again is= 4/8 bytes of storage, but it only stores 7 states, i.e. none + ModelProces= singPhase which there are 6 of. We could use only 3 bits for storing that state, but that would incur ma= sking operations for sub-byte access. Since this is an utterly hot path, le= t's instead keep private byte completedPhase; Which again frees up 3-7 bytes of storage.
Combining these two, though, we get real gains =E2=80=93 we trim down 8-= 16 bytes of storage for everything 64bit, while also a creating an unused 2= -byte alignment gap. There also remain 4 unused bits in copyHistory, giving= us comfortable 20bits if we need to store more information. |
Resolved | Robert Varga | Convert yang-data-= codec-xml into a JPMS module |
The XML codec is one of the key bits of yangtools, make sure it is a JPM= S module |
Resolved | Robert Varga | Propagate SchemaSo= urceRepresentation symbolic names |
SchemaSourceRepresentation has the notion of a symbolic name, which aids= debugging. Unfortunately a number of places do not think about this aspect= , either failing to provide an override method, or by failing to propagate = a name through a transformation. Audit all participants and ensure they are doing the right thing. For ya= ngtools-7, also make sure symbolic name is something that is quite explicit= ly in the face of SchemaSourceRepresentation implementations as well as the= ir users. |
Resolved | Miroslav Kovac | Fix SchemaContextU= til.findDataSchemaNodeForRelativeXPath() |
On resolving relative paths for key_leaf1 and leaf2 leafrefs(with findDa= taSchemaNodeForRelativeXPath) SchemaContextUtil.resolveRelativePath()= returns incorrect paths. module
module a { yang-version 1; namespace "a"; prefix "a"; grouping foo_grp { leaf key_leaf1 { type leafref { path "../../../../../../a:foo_cont/a:nam= e"; } } } container bar_cont { leaf leaf2 { type leafref { path "../../../../../../a:foo_cont/a:nam= e"; } } } } Incorrect paths: for leaf2: [(a)bar_cont, (a)leaf2, (a)foo_cont, (a= )name] On call findDataSchemaNodeForRelativeXPath with leaf2 fails with java.lang.IllegalArgumentException: Path [(a)bar_c=
ont, (a)leaf2, (a)foo_cont, (a)name] extends=
span> beyond terminal child
On call findDataSchemaNodeForRelativeXPath with key_leaf1 returns null.<= /p>
Let's check whether the path goes behind grouping root node or root node= of a different type. With this improvement, we will not lookup knowingly i= ncorrect paths.
|
Resolved | Robert Varga | ListModificationSt= rategy cannot handle child modifications |
Ever since at least I70c9745fc9ed8751c643d9= bd3e9d58be10aa4a0e our handling of nested operations is broken, as i= t will result in a ClassCastException. This can be demostrated by moving th= e cast to UnkeyedListEntryNode to entry= of the method =E2=80=93 the UT suite will start exploding. |
Resolved | Robert Varga | Parser does not re= ject use of mis-matching augment argument |
Augment statement support gets quite confused by itself and how it is su= pposed to work its argument. For starters it barely distinguishes its two m= odes of operation and does not enforce rules set down in 7.15 of RFC6020 (a= nd 7.17 of RFC7950). Fix the implementation to enforce augment statement validity. |
Resolved | Robert Varga | ModifierImpl leaks= post buildEffective() |
Examining a reference benchmark's heap dump, the following is retained b= etween when buildEffective() finishes and GlobalBuildContext is released:= p>
Since inference has completed, there should be no outstanding actions: h= ere we have some listeners still hanging in. |
Resolved | Robert Varga | Unable to validate= new line separated key-arg nodes |
Problem with parsing list's key statement argument where nodes are separ= ted by new line character, like in this example [1]= span>: list gen-test-session-allocation { key "entity-name
Error message: Caused by: org.opendaylight.yangtools.yang.parser.= spi.source.SourceException: Invalid identifier 'entity-name test-instance-name untagged pcp color' [at vendor/ciena/ciena-sat.yang:1854:6]
By YANG ABNF Grammar [2]: key-arg =3D node-identifier *(sep node-identifier)
By RFC6020 list's key Statement documentation [3]<= /span>: The "key" statement, which MUST be present if the list represents
[1] - https://github.com/YangModels/yang/blob/master/ven= dor/ciena/ciena-sat.yang#L1854 |
Resolved | Robert Varga | Unable to use pref= ix in augmention when argument inside submodule |
Problem with using prefix inside a when argument. This happens onl= y inside a submodule trying to augment nodes from module to which it belong= s. Example [1]: submodule ietf-snmp-community {=20
belongs-to ietf-snmp {=20
prefix snmp;=20
}
...
augment /snmp:snmp/snmp:target {=20
when "snmp:v1 or snmp:v2c";
...
}
}
Error message: Caused by: org.opendaylight.yangtools.yang.parser.=
spi.source.SourceException: Argument "snmp:v1 or=
snmp:v2c" is not valid XPath string [at experimental/ietf-extracted=
-YANG-modules/ietf-snmp-community@2014-05-06.yang:192:4]
...
Caused by: javax.xml.xpath.XPathExpressionException: java.lang.IllegalArgum=
entException: Prefix snmp is not bound
|
Resolved | Robert Varga | Data codecs may mi= s-enforce String length constraints |
RFC7950 states that: A "length" statement restricts the number of Unicode characters in the string. This is distinct diffrent what java.lang.String.length() provides: Returns the length of this string. The length is equal to the number o= f Unicode code units in the string. with the following (from java.lang.Character): In the Java SE API documentation, Unicode code point is used for chara= cter values in the range between U+0000 and U+10FFFF, and Unicode code unit is used for 16-bit char values that are code units of= the UTF-16 encoding. We should not be checking the String.length(), but rather String.codePoi= ntCount(). Audit all enforcement points for correct checks. |
Resolved | Ivan Hrasko | QName translation = fails for identity leaf value |
The background: The problem: Expected behavior: |
MD-SAL
Status | Assignee | Summary | Description |
---|---|---|---|
Resolved | Robert Varga | Binding Query - Interfa= ce MatchBuilderPath doesn't support matching leafs with boolean value <= /td> |
Current interface MatchBuilderPath not support matching leaf with Boolea= n type. |
Resolved | Robert Varga | Binding Query - Result = from method lessThan and lessThanOrEquals are switched |
Result from method lessThan and lessThanOrEquals are switched. Same for = method greaterThan and greaterThanOrEqual. |
Resolved | Robert Varga | Binding Query - Failed = to execute object() method in QueryResult.Item |
Binding Query result data failed after executing object() method at= QueryResult.Item instance. |