+ this.codecsRegistry.onSchemaContextUpdated(context);
+ }
+
+ @Override
+ public CodecsRegistry getCodecsRegistry() {
+ return this.codecsRegistry;
+ }
+
+ @Override
+ public Optional<BGPOpenConfigProvider> getOpenConfigProvider() {
+ return Optional.fromNullable(this.openConfigProvider);
+ }
+
+ @Override
+ public ImportPolicyPeerTracker getImportPolicyPeerTracker() {
+ return this.importPolicyPeerTracker;
+ }
+
+ @Override
+ public ExportPolicyPeerTracker getExportPolicyPeerTracker(final TablesKey tablesKey) {
+ return this.exportPolicyPeerTrackerMap.get(tablesKey);
+ }
+
+ @Override
+ public synchronized void instantiateServiceInstance() {
+ this.isServiceInstantiated = true;
+ this.domChain = this.domDataBroker.createTransactionChain(this);
+ if(this.configurationWriter != null) {
+ this.configurationWriter.apply();
+ }
+ LOG.info("RIB Singleton Service {} instantiated, RIB {}", getIdentifier().getValue(), this.ribId.getValue());
+ LOG.debug("Instantiating RIB table {} at {}", this.ribId , this.yangRibId);
+
+ final ContainerNode bgpRib = Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(BgpRib.QNAME))
+ .addChild(ImmutableNodes.mapNodeBuilder(Rib.QNAME).build()).build();
+
+ final MapEntryNode ribInstance = Builders.mapEntryBuilder().withNodeIdentifier(
+ new NodeIdentifierWithPredicates(Rib.QNAME, RIB_ID_QNAME, this.ribId .getValue()))
+ .addChild(ImmutableNodes.leafNode(RIB_ID_QNAME, this.ribId .getValue()))
+ .addChild(ImmutableNodes.mapNodeBuilder(Peer.QNAME).build())
+ .addChild(Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(LocRib.QNAME))
+ .addChild(ImmutableNodes.mapNodeBuilder(Tables.QNAME).build())
+ .build()).build();
+
+
+ final DOMDataWriteTransaction trans = this.domChain.newWriteOnlyTransaction();
+
+ // merge empty BgpRib + Rib, to make sure the top-level parent structure is present
+ trans.merge(LogicalDatastoreType.OPERATIONAL, YangInstanceIdentifier.builder().node(BgpRib.QNAME).build(), bgpRib);
+ trans.put(LogicalDatastoreType.OPERATIONAL, this.yangRibId, ribInstance);
+
+ try {
+ trans.submit().checkedGet();
+ } catch (final TransactionCommitFailedException e) {
+ LOG.error("Failed to initiate RIB {}", this.yangRibId, e);
+ }
+
+ LOG.debug("Effective RIB created.");
+
+ this.localTablesKeys.forEach(this::startLocRib);
+ if (this.configModuleTracker != null) {
+ this.configModuleTracker.onInstanceCreate();
+ }
+ }
+
+ @Override
+ public synchronized ListenableFuture<Void> closeServiceInstance() {
+ if(!this.isServiceInstantiated) {
+ LOG.trace("RIB Singleton Service {} already closed, RIB {}", getIdentifier().getValue(),
+ this.ribId.getValue());
+ return Futures.immediateFuture(null);
+ }
+ LOG.info("Close RIB Singleton Service {}, RIB {}", getIdentifier().getValue(), this.ribId.getValue());
+ this.isServiceInstantiated = false;
+
+ this.txChainToLocRibWriter.values().forEach(LocRibWriter::close);
+ this.txChainToLocRibWriter.clear();
+
+ this.renderStats.getLocRibRouteCounter().resetAll();
+
+ if (this.configModuleTracker != null) {
+ this.configModuleTracker.onInstanceClose();
+ }
+
+ final DOMDataWriteTransaction t = this.domChain.newWriteOnlyTransaction();
+ t.delete(LogicalDatastoreType.OPERATIONAL, getYangRibId());
+ final CheckedFuture<Void, TransactionCommitFailedException> cleanFuture = t.submit();
+
+ this.domChain.close();
+
+ return cleanFuture;
+ }
+
+ @Override
+ public ServiceGroupIdentifier getIdentifier() {
+ return this.serviceGroupIdentifier;
+ }
+
+ @Override
+ public ClusterSingletonServiceRegistration registerClusterSingletonService(final ClusterSingletonService clusterSingletonService) {
+ return ClusterSingletonServiceRegistrationHelper.registerSingletonService(this.provider, clusterSingletonService, MAX_REGISTRATION_ATTEMPTS,
+ SLEEP_TIME);
+ }
+
+ @Override
+ public ServiceGroupIdentifier getRibIServiceGroupIdentifier() {
+ return getIdentifier();