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 ++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 infra/bgp-translate-impl/src/main/java/io/fd/honeycomb/bgp/translate/impl/LocRibChangeListener.java (limited to 'infra/bgp-translate-impl/src/main/java/io/fd/honeycomb/bgp/translate/impl/LocRibChangeListener.java') 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; + } +} -- cgit 1.2.3-korg