- public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
- final UpdateBuilder ub = new UpdateBuilder();
- for (final Entry<InstanceIdentifier<?>, DataObject> data : change.getCreatedData().entrySet()) {
- fillMpReach(ub, data);
- }
- for (final Entry<InstanceIdentifier<?>, DataObject> data : change.getUpdatedData().entrySet()) {
- fillMpReach(ub, data);
- }
- for (final InstanceIdentifier<?> data : change.getRemovedPaths()) {
- final MpUnreachNlriBuilder unreachBuilder = new MpUnreachNlriBuilder();
- final TablesKey key = data.firstKeyOf(Tables.class, TablesKey.class);
- unreachBuilder.setAfi(key.getAfi());
- unreachBuilder.setSafi(key.getSafi());
- final AbstractAdjRIBs<?,?,?> ribsIn = (AbstractAdjRIBs<?,?,?>)this.targetRib.getTable(key);
- ribsIn.addWith(unreachBuilder, data);
- ub.setPathAttributes(new PathAttributesBuilder().addAugmentation(PathAttributes2.class, new PathAttributes2Builder().setMpUnreachNlri(unreachBuilder.build()).build()).build());
- LOG.debug("Updating RIB with {}", ub.build());
- this.targetRib.updateTables(this, ub.build());
- }
-
- }
-
- private void fillMpReach(final UpdateBuilder ub, final Entry<InstanceIdentifier<?>, DataObject> data) {
- if (data.getValue() instanceof Route) {
- final Route r = (Route) data.getValue();
- final MpReachNlriBuilder reachBuilder = new MpReachNlriBuilder();
- final TablesKey key = data.getKey().firstKeyOf(Tables.class, TablesKey.class);
- reachBuilder.setAfi(key.getAfi());
- reachBuilder.setSafi(key.getSafi());
- final AdjRIBsIn<?,Route> ribsIn = this.targetRib.getTable(key);
- ribsIn.addAdvertisement(reachBuilder, (Route)data.getValue());
- final PathAttributesBuilder pa = new PathAttributesBuilder();
- pa.addAugmentation(PathAttributes1.class, new PathAttributes1Builder().setMpReachNlri(reachBuilder.build()).build());
- this.addAttributes(pa, r.getAttributes());
- pa.setCNextHop(reachBuilder.getCNextHop());
- ub.setPathAttributes(pa.build());
- LOG.debug("Updating RIB with {}", ub.build());
- this.targetRib.updateTables(this, ub.build());
- }
- }
-
- private void addAttributes(final PathAttributesBuilder pa, final Attributes a) {
- if (a != null) {
- pa.setAggregator(a.getAggregator());
- pa.setAsPath(a.getAsPath());
- pa.setAtomicAggregate(a.getAtomicAggregate());
- pa.setClusterId(a.getClusterId());
- pa.setCommunities(a.getCommunities());
- pa.setExtendedCommunities(a.getExtendedCommunities());
- pa.setLocalPref(a.getLocalPref());
- pa.setMultiExitDisc(a.getMultiExitDisc());
- pa.setOrigin(a.getOrigin());
- pa.setOriginatorId(a.getOriginatorId());
+ public void onDataTreeChanged(final Collection<DataTreeCandidate> changes) {
+ final DOMDataWriteTransaction tx = this.chain.newWriteOnlyTransaction();
+ LOG.debug("Received data change to ApplicationRib {}", changes);
+ for (final DataTreeCandidate tc : changes) {
+ LOG.debug("Modification Type {}", tc.getRootNode().getModificationType());
+ final YangInstanceIdentifier path = tc.getRootPath();
+ final PathArgument lastArg = path.getLastPathArgument();
+ Verify.verify(lastArg instanceof NodeIdentifierWithPredicates, "Unexpected type %s in path %s", lastArg.getClass(), path);
+ final NodeIdentifierWithPredicates tableKey = (NodeIdentifierWithPredicates) lastArg;
+ for (final DataTreeCandidateNode child : tc.getRootNode().getChildNodes()) {
+ final YangInstanceIdentifier tableId = this.adjRibsInId.node(tableKey).node(child.getIdentifier());
+ if (child.getDataAfter().isPresent()) {
+ LOG.trace("App peer -> AdjRibsIn path : {}", tableId);
+ LOG.trace("App peer -> AdjRibsIn data : {}", child.getDataAfter().get());
+ tx.put(LogicalDatastoreType.OPERATIONAL, tableId, child.getDataAfter().get());
+ }
+ }