import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.Optional;
import java.util.Set;
import javax.annotation.Nonnull;
import javax.annotation.concurrent.GuardedBy;
import javax.annotation.concurrent.ThreadSafe;
+import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
import org.opendaylight.protocol.bgp.mode.impl.base.BasePathSelectionModeFactory;
import org.opendaylight.protocol.bgp.rib.spi.BGPPeerTracker;
import org.opendaylight.protocol.bgp.rib.spi.ExportPolicyPeerTracker;
import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
-import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
import org.opendaylight.protocol.bgp.rib.spi.RibSupportUtils;
import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRibRoutingPolicy;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.Attributes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev171207.BgpTableType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.BgpRib;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.RibId;
import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes;
import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
private final Set<BgpTableType> localTables;
private final Set<TablesKey> localTablesKeys;
private final DOMDataBroker domDataBroker;
+ private final DataBroker dataBroker;
private final RIBExtensionConsumerContext extensions;
private final YangInstanceIdentifier yangRibId;
- private final YangInstanceIdentifier yangTables;
private final RIBSupportContextRegistryImpl ribContextRegistry;
private final CodecsRegistryImpl codecsRegistry;
@GuardedBy("this")
private final BGPPeerTracker peerTracker;
private final BGPRibRoutingPolicy ribPolicies;
private final Map<TablesKey, ExportPolicyPeerTracker> exportPolicyPeerTrackerMap;
- private final BindingNormalizedNodeSerializer bindingSerializer;
@GuardedBy("this")
private DOMTransactionChain domChain;
final BGPDispatcher dispatcher,
final CodecsRegistryImpl codecsRegistry,
final DOMDataBroker domDataBroker,
+ final DataBroker dataBroker,
final BGPRibRoutingPolicy ribPolicies,
final BGPPeerTracker bgpPeerTracker,
final List<BgpTableType> localTables,
- final Map<TablesKey, PathSelectionMode> bestPathSelectionStrategies,
- final BindingNormalizedNodeSerializer bindingSerializer
+ final Map<TablesKey, PathSelectionMode> bestPathSelectionStrategies
) {
super(InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(requireNonNull(ribId))),
localBgpId, localAs);
this.localTables = ImmutableSet.copyOf(localTables);
this.localTablesKeys = new HashSet<>();
this.domDataBroker = requireNonNull(domDataBroker);
+ this.dataBroker = requireNonNull(dataBroker);
this.service = this.domDataBroker.getSupportedExtensions().get(DOMDataTreeChangeService.class);
this.extensions = requireNonNull(extensions);
this.ribPolicies = requireNonNull(ribPolicies);
this.ribContextRegistry = RIBSupportContextRegistryImpl.create(extensions, this.codecsRegistry);
final InstanceIdentifierBuilder yangRibIdBuilder = YangInstanceIdentifier.builder().node(BgpRib.QNAME).node(Rib.QNAME);
this.yangRibId = yangRibIdBuilder.nodeWithKey(Rib.QNAME, RIB_ID_QNAME, ribId.getValue()).build();
- this.yangTables = this.yangRibId.node(LocRib.QNAME).node(Tables.QNAME);
this.bestPathSelectionStrategies = requireNonNull(bestPathSelectionStrategies);
final ClusterIdentifier cId = clusterId == null ? new ClusterIdentifier(localBgpId) : clusterId;
this.ribId = ribId;
exportPolicies.put(key, new ExportPolicyPeerTrackerImpl(policyDatabase, key));
}
this.exportPolicyPeerTrackerMap = exportPolicies.build();
- this.bindingSerializer = requireNonNull(bindingSerializer);
}
private synchronized void startLocRib(final TablesKey key) {
private synchronized void createLocRibWriter(final TablesKey key) {
LOG.debug("Creating LocRIB writer for key {}", key);
- final DOMTransactionChain txChain = createPeerChain(this);
+ final DOMTransactionChain txChain = createPeerDOMChain(this);
PathSelectionMode pathSelectionStrategy = this.bestPathSelectionStrategies.get(key);
if (pathSelectionStrategy == null) {
pathSelectionStrategy = BasePathSelectionModeFactory.createBestPathSelectionStrategy(this.peerTracker);
LOG.error("Broken chain in RIB {} transaction {}", getInstanceIdentifier(), transaction != null ? transaction.getIdentifier() : null, cause);
if (this.txChainToLocRibWriter.containsKey(chain)) {
final LocRibWriter locRibWriter = this.txChainToLocRibWriter.remove(chain);
- final DOMTransactionChain newChain = createPeerChain(this);
+ final DOMTransactionChain newChain = createPeerDOMChain(this);
locRibWriter.restart(newChain);
this.txChainToLocRibWriter.put(newChain, locRibWriter);
}
return (DOMDataTreeChangeService) this.service;
}
+ @Override
+ public DataBroker getDataBroker() {
+ return this.dataBroker;
+ }
+
@Override
public YangInstanceIdentifier getYangRibId() {
return this.yangRibId;
}
@Override
- public DOMTransactionChain createPeerChain(final TransactionChainListener listener) {
+ public DOMTransactionChain createPeerDOMChain(final TransactionChainListener listener) {
return this.domDataBroker.createTransactionChain(listener);
}
+ @Override
+ public BindingTransactionChain createPeerChain(final TransactionChainListener listener) {
+ return this.dataBroker.createTransactionChain(this);
+ }
+
@Override
public RIBExtensionConsumerContext getRibExtensions() {
return this.extensions;
this.domChain.close();
return cleanFuture;
}
-
-
- @Override
- @SuppressWarnings("unchecked")
- public final Optional<ContainerNode> toNormalizedNodeAttribute(
- final RIBSupport ribSupport,
- final NodeIdentifierWithPredicates routeIdentifier,
- final Optional<Attributes> attributes) {
- if (!attributes.isPresent()) {
- return Optional.empty();
- }
- final InstanceIdentifier<Attributes> yii
- = (InstanceIdentifier<Attributes>) this.bindingSerializer
- .fromYangInstanceIdentifier(ribSupport.buildRouteAttributeYii(this.yangTables, routeIdentifier));
- return Optional.of((ContainerNode) this.bindingSerializer.toNormalizedNode(yii, attributes.get()).getValue());
- }
-
- @Override
- public final Optional<Attributes> getAttributes(
- final RIBSupport ribSupport,
- final NodeIdentifierWithPredicates routeIdentifier,
- final NormalizedNode<?, ?> route) {
- final ContainerNode advertisedAttrs = (ContainerNode) NormalizedNodes
- .findNode(route, ribSupport.routeAttributesIdentifier()).orElse(null);
- if (advertisedAttrs == null) {
- return Optional.empty();
- }
-
- return Optional.ofNullable((Attributes) this.bindingSerializer
- .fromNormalizedNode(ribSupport.buildRouteAttributeYii(this.yangTables, routeIdentifier),
- advertisedAttrs).getValue());
- }
}