From aaf712b80ac93d80e975014c235d7b8ba9db4747 Mon Sep 17 00:00:00 2001 From: Marek Gradzki Date: Mon, 19 Jun 2017 08:30:19 +0200 Subject: HONEYCOMB-356: API implementation RibWriter registers DataTreeChangeListener for given route type. RouteWriter recevies create/update/delete notifications for single route modifications in LocRib DS. Change-Id: I4832abfb25aa189ecd3964febd6071f9a25117b2 Signed-off-by: Marek Gradzki --- .../bgp/translate/impl/LocRibChangeListener.java | 79 ++++++++++++++++++++++ .../honeycomb/bgp/translate/impl/LocRibWriter.java | 58 ++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 infra/bgp-translate-impl/src/main/java/io/fd/honeycomb/bgp/translate/impl/LocRibChangeListener.java create mode 100644 infra/bgp-translate-impl/src/main/java/io/fd/honeycomb/bgp/translate/impl/LocRibWriter.java (limited to 'infra/bgp-translate-impl/src/main/java/io/fd/honeycomb/bgp/translate/impl') diff --git a/infra/bgp-translate-impl/src/main/java/io/fd/honeycomb/bgp/translate/impl/LocRibChangeListener.java b/infra/bgp-translate-impl/src/main/java/io/fd/honeycomb/bgp/translate/impl/LocRibChangeListener.java new file mode 100644 index 000000000..7e9a3c1e8 --- /dev/null +++ b/infra/bgp-translate-impl/src/main/java/io/fd/honeycomb/bgp/translate/impl/LocRibChangeListener.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.honeycomb.bgp.translate.impl; + +import com.google.common.base.Preconditions; +import io.fd.honeycomb.translate.bgp.RouteWriter; +import io.fd.honeycomb.translate.write.WriteFailedException; +import java.util.Collection; +import javax.annotation.Nonnull; +import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; +import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener; +import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; +import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.Route; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +final class LocRibChangeListener implements DataTreeChangeListener { + + private static final Logger LOG = LoggerFactory.getLogger(LocRibChangeListener.class); + private final RouteWriter writer; + + LocRibChangeListener(final RouteWriter writer) { + this.writer = writer; + } + + @Override + public void onDataTreeChanged(@Nonnull final Collection> changes) { + for (DataTreeModification change : changes) { + final DataObjectModification rootNode = change.getRootNode(); + final DataTreeIdentifier rootPath = change.getRootPath(); + final Route dataBefore = rootNode.getDataBefore(); + final Route dataAfter = rootNode.getDataAfter(); + LOG.trace("Received LocRib change({}): before={} after={}", rootNode.getModificationType(), dataBefore, dataAfter); + + try { + processChange(rootPath.getRootIdentifier(), dataBefore, dataAfter); + } catch (WriteFailedException e) { + LOG.warn("Route translation failed", e); + } + } + } + + @SuppressWarnings("unchecked") + private void processChange(final InstanceIdentifier id, final Route dataBefore, final Route dataAfter) throws WriteFailedException { + if (isCreate(dataBefore, dataAfter)) { + writer.create(id, dataAfter); + } else if (isDelete(dataBefore, dataAfter)) { + writer.delete(id, dataBefore); + } else { + Preconditions.checkArgument(dataBefore != null && dataAfter != null, "No data to process"); + writer.update(id, dataBefore, dataAfter); + } + } + + private static boolean isCreate(final DataObject dataBefore, final DataObject dataAfter) { + return dataBefore == null && dataAfter != null; + } + + private static boolean isDelete(final DataObject dataBefore, final DataObject dataAfter) { + return dataAfter == null && dataBefore != null; + } +} diff --git a/infra/bgp-translate-impl/src/main/java/io/fd/honeycomb/bgp/translate/impl/LocRibWriter.java b/infra/bgp-translate-impl/src/main/java/io/fd/honeycomb/bgp/translate/impl/LocRibWriter.java new file mode 100644 index 000000000..ce3c0c7b8 --- /dev/null +++ b/infra/bgp-translate-impl/src/main/java/io/fd/honeycomb/bgp/translate/impl/LocRibWriter.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.honeycomb.bgp.translate.impl; + +import com.google.common.base.Preconditions; +import io.fd.honeycomb.translate.bgp.RibWriter; +import io.fd.honeycomb.translate.bgp.RouteWriter; +import javax.annotation.Nonnull; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.Route; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.LocRib; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * Provides route translation for routes in local RIB. + */ +public final class LocRibWriter implements RibWriter { + private final DataBroker bgpDataBroker; + + public LocRibWriter(final DataBroker bgpDataBroker) { + this.bgpDataBroker = bgpDataBroker; + } + + @Override + public void register(@Nonnull final RouteWriter writer) { + @SuppressWarnings("unchecked") + final InstanceIdentifier managedId = (InstanceIdentifier)writer.getManagedDataObjectType(); + final Class routeType = managedId.getTargetType(); + Preconditions.checkArgument(Route.class.isAssignableFrom(routeType), + "{} managed by {} is not subclass of Route", routeType, writer); + Preconditions.checkArgument(managedId.firstIdentifierOf(LocRib.class) != null, + "{} managed by {} does not contain LocRib.class", managedId, writer); + Preconditions.checkArgument(managedId.isWildcarded(), + "{} managed by {} should not contain route key", managedId, writer); + + // TODO(HONEYCOMB-367): updates for whole list instead of list item + // are needed to support deleteALL (might be required for performance reasons). + bgpDataBroker + .registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, managedId), + new LocRibChangeListener(writer)); + } +} -- cgit 1.2.3-korg