From 8e0c7007906730fe4547b0265a895ad8a322a7dc Mon Sep 17 00:00:00 2001 From: Maros Marsalek Date: Thu, 10 Nov 2016 12:22:28 +0100 Subject: Remove hc2vpp codebase Moved to a dedicated hc2vpp project in fd.io Change-Id: I03dc3b3029f21b127a00c69a86bcd8e467896241 Signed-off-by: Maros Marsalek --- .../v3po/vppclassifier/ClassifySessionReader.java | 207 --------------------- .../v3po/vppclassifier/ClassifySessionWriter.java | 165 ---------------- .../v3po/vppclassifier/ClassifyTableReader.java | 171 ----------------- .../v3po/vppclassifier/ClassifyTableWriter.java | 149 --------------- .../vppclassifier/VppClassifierContextManager.java | 106 ----------- .../VppClassifierContextManagerImpl.java | 181 ------------------ .../v3po/vppclassifier/VppNodeReader.java | 45 ----- .../v3po/vppclassifier/VppNodeWriter.java | 79 -------- 8 files changed, 1103 deletions(-) delete mode 100644 v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifySessionReader.java delete mode 100644 v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifySessionWriter.java delete mode 100644 v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifyTableReader.java delete mode 100644 v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifyTableWriter.java delete mode 100644 v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppClassifierContextManager.java delete mode 100644 v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppClassifierContextManagerImpl.java delete mode 100644 v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppNodeReader.java delete mode 100644 v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppNodeWriter.java (limited to 'v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier') diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifySessionReader.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifySessionReader.java deleted file mode 100644 index 9f4cd7e77..000000000 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifySessionReader.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (c) 2016 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.translate.v3po.vppclassifier; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; - -import com.google.common.base.Optional; -import com.google.common.primitives.UnsignedInts; -import io.fd.honeycomb.translate.MappingContext; -import io.fd.honeycomb.translate.read.ReadContext; -import io.fd.honeycomb.translate.read.ReadFailedException; -import io.fd.honeycomb.translate.spi.read.ListReaderCustomizer; -import io.fd.honeycomb.translate.v3po.interfacesstate.InterfaceDataTranslator; -import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer; -import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer; -import io.fd.vpp.jvpp.core.dto.ClassifySessionDetails; -import io.fd.vpp.jvpp.core.dto.ClassifySessionDetailsReplyDump; -import io.fd.vpp.jvpp.core.dto.ClassifySessionDump; -import io.fd.vpp.jvpp.core.future.FutureJVppCore; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.xml.bind.DatatypeConverter; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.HexString; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.OpaqueIndex; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.VppNode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.classify.table.base.attributes.ClassifySession; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.classify.table.base.attributes.ClassifySessionBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.classify.table.base.attributes.ClassifySessionKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.vpp.classifier.state.ClassifyTable; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.vpp.classifier.state.ClassifyTableBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.vpp.classifier.state.ClassifyTableKey; -import org.opendaylight.yangtools.concepts.Builder; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Reader customizer responsible for classify session read.
to VPP.
Equivalent to invoking {@code vppctl show - * class table verbose} command. - */ -public class ClassifySessionReader extends FutureJVppCustomizer - implements ListReaderCustomizer, - InterfaceDataTranslator, VppNodeReader, JvppReplyConsumer { - - private static final Logger LOG = LoggerFactory.getLogger(ClassifySessionReader.class); - static final String CACHE_KEY = ClassifySessionReader.class.getName(); - - private final VppClassifierContextManager classifyTableContext; - - public ClassifySessionReader(@Nonnull final FutureJVppCore futureJVppCore, - @Nonnull final VppClassifierContextManager classifyTableContext) { - super(futureJVppCore); - this.classifyTableContext = checkNotNull(classifyTableContext, "classifyTableContext should not be null"); - } - - @Override - public void merge(@Nonnull final Builder builder, - @Nonnull final List readData) { - ((ClassifyTableBuilder) builder).setClassifySession(readData); - } - - @Nonnull - @Override - public ClassifySessionBuilder getBuilder(@Nonnull final InstanceIdentifier id) { - return new ClassifySessionBuilder(); - } - - @Override - public void readCurrentAttributes(@Nonnull final InstanceIdentifier id, - @Nonnull final ClassifySessionBuilder builder, @Nonnull final ReadContext ctx) - throws ReadFailedException { - LOG.debug("Reading attributes for classify session: {}", id); - - final ClassifySessionKey key = id.firstKeyOf(ClassifySession.class); - checkArgument(key != null, "could not find ClassifySession key in {}", id); - - final ClassifySessionDetailsReplyDump classifySessionDump = dumpClassifySessions(id, ctx); - final byte[] match = DatatypeConverter.parseHexBinary(key.getMatch().getValue().replace(":", "")); - final Optional classifySession = - findClassifySessionDetailsByMatch(classifySessionDump, match); - - if (classifySession.isPresent()) { - final ClassifySessionDetails detail = classifySession.get(); - builder.setHitNext( - readVppNode(detail.tableId, detail.hitNextIndex, classifyTableContext, ctx.getMappingContext(), LOG) - .get()); - if (detail.opaqueIndex != ~0) { - // value is specified: - builder.setOpaqueIndex(readOpaqueIndex(detail.tableId, detail.opaqueIndex, ctx.getMappingContext())); - } - builder.setAdvance(detail.advance); - builder.setMatch(key.getMatch()); - - if (LOG.isTraceEnabled()) { - LOG.trace("Attributes for classify session {} successfully read: {}", id, builder.build()); - } - } - } - - private OpaqueIndex readOpaqueIndex(final int tableIndex, final int opaqueIndex, final MappingContext ctx) { - // We first try to map the value to a vpp node, if that fails, simply wrap the u32 value - // TODO: HONEYCOMB-118 the approach might fail if the opaqueIndex contains small value that collides - // with some of the adjacent nodes - - final Optional node = readVppNode(tableIndex, opaqueIndex, classifyTableContext, ctx, LOG); - if (node.isPresent()) { - return new OpaqueIndex(node.get()); - } else { - return new OpaqueIndex(UnsignedInts.toLong(opaqueIndex)); - } - } - - @Nullable - private ClassifySessionDetailsReplyDump dumpClassifySessions(@Nonnull final InstanceIdentifier id, - @Nonnull final ReadContext ctx) - throws ReadFailedException { - final ClassifyTableKey tableKey = id.firstKeyOf(ClassifyTable.class); - checkArgument(tableKey != null, "could not find ClassifyTable key in {}", id); - - final String cacheKey = CACHE_KEY + tableKey; - - ClassifySessionDetailsReplyDump classifySessionDump = - (ClassifySessionDetailsReplyDump) ctx.getModificationCache().get(cacheKey); - if (classifySessionDump != null) { - LOG.debug("Classify sessions is present in cache: {}", cacheKey); - return classifySessionDump; - } - - final String tableName = tableKey.getName(); - checkState(classifyTableContext.containsTable(tableName, ctx.getMappingContext()), - "Reading classify sessions for table {}, but table index could not be found in the classify table context", - tableName); - final int tableId = classifyTableContext.getTableIndex(tableName, ctx.getMappingContext()); - LOG.debug("Dumping classify sessions for classify table id={}", tableId); - - - final ClassifySessionDump dumpRequest = new ClassifySessionDump(); - dumpRequest.tableId = tableId; - final int timeOut = 30; // there can be many session with current ietf-acl implementation (could be probably - // removed after fixing HONEYCOMB-247) - classifySessionDump = - getReplyForRead(getFutureJVpp().classifySessionDump(dumpRequest).toCompletableFuture(), id, timeOut); - - if (classifySessionDump != null) { - // update the cache: - ctx.getModificationCache().put(cacheKey, classifySessionDump); - } - - return classifySessionDump; - } - - private static Optional findClassifySessionDetailsByMatch( - @Nullable final ClassifySessionDetailsReplyDump classifySessionDump, @Nonnull final byte[] match) { - if (classifySessionDump != null && classifySessionDump.classifySessionDetails != null) { - final List details = classifySessionDump.classifySessionDetails; - final List filteredSessions = details.stream() - .filter(singleDetail -> Arrays.equals(singleDetail.match, match)).collect(Collectors.toList()); - if (filteredSessions.isEmpty()) { - return Optional.absent(); - } else if (filteredSessions.size() == 1) { - return Optional.of(filteredSessions.get(0)); - } else { - throw new IllegalStateException(String.format( - "Found %d classify sessions witch given match. Single session expected.", - filteredSessions.size())); - } - } - return Optional.absent(); - } - - @Nonnull - @Override - public List getAllIds(@Nonnull final InstanceIdentifier id, - @Nonnull final ReadContext ctx) throws ReadFailedException { - LOG.debug("Reading list of keys for classify sessions: {}", id); - - final ClassifySessionDetailsReplyDump classifySessionDump = dumpClassifySessions(id, ctx); - if (classifySessionDump != null && classifySessionDump.classifySessionDetails != null) { - return classifySessionDump.classifySessionDetails.stream() - .map(detail -> new ClassifySessionKey(new HexString(printHexBinary(detail.match)))) - .collect(Collectors.toList()); - } else { - return Collections.emptyList(); - } - } -} diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifySessionWriter.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifySessionWriter.java deleted file mode 100644 index 996e76eca..000000000 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifySessionWriter.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (c) 2016 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.translate.v3po.vppclassifier; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; - -import com.google.common.base.Optional; -import io.fd.honeycomb.translate.MappingContext; -import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer; -import io.fd.honeycomb.translate.vpp.util.ByteDataTranslator; -import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer; -import io.fd.honeycomb.translate.write.WriteContext; -import io.fd.honeycomb.translate.write.WriteFailedException; -import java.util.concurrent.CompletionStage; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.xml.bind.DatatypeConverter; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.OpaqueIndex; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.classify.table.base.attributes.ClassifySession; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.classify.table.base.attributes.ClassifySessionKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.vpp.classifier.ClassifyTable; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.vpp.classifier.ClassifyTableKey; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import io.fd.vpp.jvpp.VppBaseCallException; -import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSession; -import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSessionReply; -import io.fd.vpp.jvpp.core.future.FutureJVppCore; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Writer customizer responsible for classify session create/delete.
Sends {@code classify_add_del_session} message - * to VPP.
Equivalent to invoking {@code vppctl classify table} command. - */ -public class ClassifySessionWriter extends VppNodeWriter - implements ListWriterCustomizer, ByteDataTranslator, JvppReplyConsumer { - - private static final Logger LOG = LoggerFactory.getLogger(ClassifySessionWriter.class); - private final VppClassifierContextManager classifyTableContext; - - public ClassifySessionWriter(@Nonnull final FutureJVppCore futureJVppCore, - @Nonnull final VppClassifierContextManager classifyTableContext) { - super(futureJVppCore); - this.classifyTableContext = checkNotNull(classifyTableContext, "classifyTableContext should not be null"); - } - - @Override - public void writeCurrentAttributes(@Nonnull final InstanceIdentifier id, - @Nonnull final ClassifySession dataAfter, - @Nonnull final WriteContext writeContext) throws WriteFailedException { - LOG.debug("Creating classify session: iid={} dataAfter={}", id, dataAfter); - try { - classifyAddDelSession(true, id, dataAfter, writeContext); - LOG.debug("Successfully created classify session: iid={} dataAfter={}", id, dataAfter); - } catch (VppBaseCallException e) { - throw new WriteFailedException.CreateFailedException(id, dataAfter, e); - } - } - - @Override - public void updateCurrentAttributes(@Nonnull final InstanceIdentifier id, - @Nonnull final ClassifySession dataBefore, - @Nonnull final ClassifySession dataAfter, - @Nonnull final WriteContext writeContext) throws WriteFailedException { - throw new UnsupportedOperationException("Classify session update is not supported"); - } - - @Override - public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier id, - @Nonnull final ClassifySession dataBefore, - @Nonnull final WriteContext writeContext) throws WriteFailedException { - LOG.debug("Removing classify session: iid={} dataBefore={}", id, dataBefore); - try { - classifyAddDelSession(false, id, dataBefore, writeContext); - LOG.debug("Successfully removed classify session: iid={} dataBefore={}", id, dataBefore); - } catch (VppBaseCallException e) { - throw new WriteFailedException.DeleteFailedException(id, e); - } - } - - private void classifyAddDelSession(final boolean isAdd, @Nonnull final InstanceIdentifier id, - @Nonnull final ClassifySession classifySession, - @Nonnull final WriteContext writeContext) - throws VppBaseCallException, WriteFailedException { - final ClassifyTableKey tableKey = id.firstKeyOf(ClassifyTable.class); - checkArgument(tableKey != null, "could not find classify table key in {}", id); - - final String tableName = tableKey.getName(); - checkState(classifyTableContext.containsTable(tableName, writeContext.getMappingContext()), - "Could not find classify table index for {} in the classify table context", tableName); - final int tableIndex = classifyTableContext.getTableIndex(tableName, writeContext.getMappingContext()); - - final ClassifyTable classifyTable = - getClassifyTable(writeContext, id.firstIdentifierOf(ClassifyTable.class), isAdd); - final int hitNextIndex = getNodeIndex(classifySession.getHitNext(), classifyTable, classifyTableContext, - writeContext.getMappingContext(), id); - final int opaqueIndex = - getOpaqueIndex(classifySession.getOpaqueIndex(), classifyTable, writeContext.getMappingContext(), id); - - final CompletionStage createClassifyTableReplyCompletionStage = getFutureJVpp() - .classifyAddDelSession( - getClassifyAddDelSessionRequest(isAdd, classifySession, tableIndex, hitNextIndex, opaqueIndex)); - - getReplyForWrite(createClassifyTableReplyCompletionStage.toCompletableFuture(), id); - } - - private ClassifyTable getClassifyTable(final WriteContext writeContext, - @Nonnull final InstanceIdentifier id, - final boolean isAdd) { - final Optional classifyTable; - if (isAdd) { - classifyTable = writeContext.readAfter(id); - } else { - classifyTable = writeContext.readBefore(id); - } - return classifyTable.get(); - } - - private ClassifyAddDelSession getClassifyAddDelSessionRequest(final boolean isAdd, - @Nonnull final ClassifySession classifySession, - final int tableIndex, - final int hitNextIndex, - final int opaqueIndex) { - ClassifyAddDelSession request = new ClassifyAddDelSession(); - request.isAdd = booleanToByte(isAdd); - request.tableIndex = tableIndex; - request.hitNextIndex = hitNextIndex; - request.opaqueIndex = opaqueIndex; - - // default 0: - request.advance = classifySession.getAdvance(); - - request.match = DatatypeConverter.parseHexBinary(classifySession.getMatch().getValue().replace(":", "")); - return request; - } - - private int getOpaqueIndex(@Nullable final OpaqueIndex opaqueIndex, final ClassifyTable classifyTable, - final MappingContext ctx, final InstanceIdentifier id) - throws VppBaseCallException, WriteFailedException { - if (opaqueIndex == null) { - return ~0; // value not specified - } - if (opaqueIndex.getUint32() != null) { - return opaqueIndex.getUint32().intValue(); - } else { - return getNodeIndex(opaqueIndex.getVppNode(), classifyTable, classifyTableContext, ctx, id); - } - } -} diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifyTableReader.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifyTableReader.java deleted file mode 100644 index 745168635..000000000 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifyTableReader.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (c) 2016 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.translate.v3po.vppclassifier; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; - -import com.google.common.base.Optional; -import com.google.common.primitives.UnsignedInts; -import io.fd.honeycomb.translate.read.ReadContext; -import io.fd.honeycomb.translate.read.ReadFailedException; -import io.fd.honeycomb.translate.spi.read.Initialized; -import io.fd.honeycomb.translate.spi.read.InitializingListReaderCustomizer; -import io.fd.honeycomb.translate.v3po.interfacesstate.InterfaceDataTranslator; -import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer; -import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer; -import io.fd.honeycomb.translate.vpp.util.MacTranslator; -import io.fd.vpp.jvpp.core.dto.ClassifyTableIds; -import io.fd.vpp.jvpp.core.dto.ClassifyTableIdsReply; -import io.fd.vpp.jvpp.core.dto.ClassifyTableInfo; -import io.fd.vpp.jvpp.core.dto.ClassifyTableInfoReply; -import io.fd.vpp.jvpp.core.future.FutureJVppCore; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import javax.annotation.Nonnull; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.HexString; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.VppClassifier; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.VppClassifierStateBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.VppNodeName; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.vpp.classifier.state.ClassifyTable; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.vpp.classifier.state.ClassifyTableBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.vpp.classifier.state.ClassifyTableKey; -import org.opendaylight.yangtools.concepts.Builder; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Reader customizer responsible for classify table read.
to VPP.
Equivalent to invoking {@code vppctl show - * class table} command. - */ -public class ClassifyTableReader extends FutureJVppCustomizer - implements InitializingListReaderCustomizer, VppNodeReader, - MacTranslator, InterfaceDataTranslator, JvppReplyConsumer { - - private static final Logger LOG = LoggerFactory.getLogger(ClassifyTableReader.class); - private final VppClassifierContextManager classifyTableContext; - - public ClassifyTableReader(@Nonnull final FutureJVppCore futureJVppCore, - @Nonnull final VppClassifierContextManager classifyTableContext) { - super(futureJVppCore); - this.classifyTableContext = checkNotNull(classifyTableContext, "classifyTableContext should not be null"); - } - - - @Override - public void merge(@Nonnull final Builder builder, - @Nonnull final List readData) { - ((VppClassifierStateBuilder) builder).setClassifyTable(readData); - } - - @Nonnull - @Override - public ClassifyTableBuilder getBuilder(@Nonnull final InstanceIdentifier id) { - return new ClassifyTableBuilder(); - } - - @Override - public void readCurrentAttributes(@Nonnull final InstanceIdentifier id, - @Nonnull final ClassifyTableBuilder builder, @Nonnull final ReadContext ctx) - throws ReadFailedException { - LOG.debug("Reading attributes for classify table: {}", id); - - final ClassifyTableKey key = id.firstKeyOf(ClassifyTable.class); - checkArgument(key != null, "could not find ClassifyTable key in {}", id); - final ClassifyTableInfo request = new ClassifyTableInfo(); - - final String tableName = key.getName(); - if (!classifyTableContext.containsTable(tableName, ctx.getMappingContext())) { - LOG.debug("Could not find classify table {} in the naming context", tableName); - return; - } - request.tableId = classifyTableContext.getTableIndex(tableName, ctx.getMappingContext()); - - - final ClassifyTableInfoReply reply = - getReplyForRead(getFutureJVpp().classifyTableInfo(request).toCompletableFuture(), id); - - // mandatory values: - builder.setName(tableName); - builder.setKey(key); - builder.setNbuckets(UnsignedInts.toLong(reply.nbuckets)); - builder.setSkipNVectors(UnsignedInts.toLong(reply.skipNVectors)); - - // optional value read from context - final Optional tableBaseNode = - classifyTableContext.getTableBaseNode(tableName, ctx.getMappingContext()); - if (tableBaseNode.isPresent()) { - builder.setClassifierNode(new VppNodeName(tableBaseNode.get())); - } - - builder.setMissNext( - readVppNode(reply.tableId, reply.missNextIndex, classifyTableContext, ctx.getMappingContext(), LOG) - .get()); - builder.setMask(new HexString(printHexBinary(reply.mask))); - builder.setActiveSessions(UnsignedInts.toLong(reply.activeSessions)); - - if (reply.nextTableIndex != ~0) { - // next table index is present: - builder.setNextTable(classifyTableContext.getTableName(reply.nextTableIndex, ctx.getMappingContext())); - } - - if (LOG.isTraceEnabled()) { - LOG.trace("Attributes for classify table {} successfully read: {}", id, builder.build()); - } - } - - @Nonnull - @Override - public List getAllIds(@Nonnull final InstanceIdentifier id, - @Nonnull final ReadContext context) throws ReadFailedException { - LOG.debug("Reading list of keys for classify tables: {}", id); - - final ClassifyTableIdsReply classifyTableIdsReply = - getReplyForRead(getFutureJVpp().classifyTableIds(new ClassifyTableIds()).toCompletableFuture(), - id); - if (classifyTableIdsReply.ids != null) { - return Arrays.stream(classifyTableIdsReply.ids).mapToObj(i -> { - final String tableName = classifyTableContext.getTableName(i, context.getMappingContext()); - LOG.trace("Classify table with name: {} and index: {} found in VPP", tableName, i); - return new ClassifyTableKey(tableName); - }).collect(Collectors.toList()); - } else { - return Collections.emptyList(); - } - } - - @Override - public Initialized init( - @Nonnull final InstanceIdentifier id, @Nonnull final ClassifyTable readValue, - @Nonnull final ReadContext ctx) { - return Initialized.create(getCfgId(id), - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.vpp.classifier.ClassifyTableBuilder(readValue) - .setName(readValue.getName()) - .build()); - } - - static InstanceIdentifier getCfgId( - final InstanceIdentifier id) { - return InstanceIdentifier.create(VppClassifier.class) - .child(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.vpp.classifier.ClassifyTable.class, - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.vpp.classifier.ClassifyTableKey(id.firstKeyOf(ClassifyTable.class).getName())); - } -} diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifyTableWriter.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifyTableWriter.java deleted file mode 100644 index 33dc64103..000000000 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/ClassifyTableWriter.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (c) 2016 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.translate.v3po.vppclassifier; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; - -import io.fd.honeycomb.translate.MappingContext; -import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer; -import io.fd.honeycomb.translate.vpp.util.ByteDataTranslator; -import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer; -import io.fd.honeycomb.translate.write.WriteContext; -import io.fd.honeycomb.translate.write.WriteFailedException; -import java.util.concurrent.CompletionStage; -import javax.annotation.Nonnull; -import javax.xml.bind.DatatypeConverter; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.vpp.classifier.ClassifyTable; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.vpp.classifier.ClassifyTableKey; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import io.fd.vpp.jvpp.VppBaseCallException; -import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTable; -import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTableReply; -import io.fd.vpp.jvpp.core.future.FutureJVppCore; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Writer customizer responsible for classify table create/delete.
Sends {@code classify_add_del_table} message to - * VPP.
Equivalent to invoking {@code vppctl classify table} command. - */ -public class ClassifyTableWriter extends VppNodeWriter - implements ListWriterCustomizer, ByteDataTranslator, JvppReplyConsumer { - - private static final Logger LOG = LoggerFactory.getLogger(ClassifyTableWriter.class); - private final VppClassifierContextManager classifyTableContext; - - public ClassifyTableWriter(@Nonnull final FutureJVppCore futureJVppCore, - @Nonnull final VppClassifierContextManager classifyTableContext) { - super(futureJVppCore); - this.classifyTableContext = checkNotNull(classifyTableContext, "classifyTableContext should not be null"); - } - - @Override - public void writeCurrentAttributes(@Nonnull final InstanceIdentifier id, - @Nonnull final ClassifyTable dataAfter, @Nonnull final WriteContext writeContext) - throws WriteFailedException { - LOG.debug("Creating classify table: iid={} dataAfter={}", id, dataAfter); - try { - final int newTableIndex = - classifyAddDelTable(true, id, dataAfter, ~0 /* value not present */, - writeContext.getMappingContext()); - - // Add classify table name <-> vpp index mapping to the naming context: - classifyTableContext.addTable(newTableIndex, dataAfter.getName(), dataAfter.getClassifierNode(), - writeContext.getMappingContext()); - LOG.debug("Successfully created classify table(id={]): iid={} dataAfter={}", newTableIndex, id, dataAfter); - } catch (VppBaseCallException e) { - throw new WriteFailedException.CreateFailedException(id, dataAfter, e); - } - } - - @Override - public void updateCurrentAttributes(@Nonnull final InstanceIdentifier id, - @Nonnull final ClassifyTable dataBefore, @Nonnull final ClassifyTable dataAfter, - @Nonnull final WriteContext writeContext) throws WriteFailedException { - throw new UnsupportedOperationException("Classify table update is not supported"); - } - - @Override - public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier id, - @Nonnull final ClassifyTable dataBefore, - @Nonnull final WriteContext writeContext) throws WriteFailedException { - LOG.debug("Removing classify table: iid={} dataBefore={}", id, dataBefore); - final String tableName = dataBefore.getName(); - checkState(classifyTableContext.containsTable(tableName, writeContext.getMappingContext()), - "Removing classify table {}, but index could not be found in the classify table context", tableName); - - final int tableIndex = classifyTableContext.getTableIndex(tableName, writeContext.getMappingContext()); - try { - classifyAddDelTable(false, id, dataBefore, tableIndex, writeContext.getMappingContext()); - - // Remove deleted interface from interface context: - classifyTableContext.removeTable(dataBefore.getName(), writeContext.getMappingContext()); - LOG.debug("Successfully removed classify table(id={]): iid={} dataAfter={}", tableIndex, id, dataBefore); - } catch (VppBaseCallException e) { - throw new WriteFailedException.DeleteFailedException(id, e); - } - } - - private int classifyAddDelTable(final boolean isAdd, @Nonnull final InstanceIdentifier id, - @Nonnull final ClassifyTable table, final int tableId, final MappingContext ctx) - throws VppBaseCallException, WriteFailedException { - - final int missNextIndex = - getNodeIndex(table.getMissNext(), table, classifyTableContext, ctx, id); - - final CompletionStage createClassifyTableReplyCompletionStage = - getFutureJVpp() - .classifyAddDelTable(getClassifyAddDelTableRequest(isAdd, tableId, table, missNextIndex, ctx)); - - final ClassifyAddDelTableReply reply = - getReplyForWrite(createClassifyTableReplyCompletionStage.toCompletableFuture(), id); - return reply.newTableIndex; - } - - private ClassifyAddDelTable getClassifyAddDelTableRequest(final boolean isAdd, final int tableIndex, - @Nonnull final ClassifyTable table, - final int missNextIndex, - @Nonnull final MappingContext ctx) { - final ClassifyAddDelTable request = new ClassifyAddDelTable(); - request.isAdd = booleanToByte(isAdd); - request.tableIndex = tableIndex; - - // mandatory, all u32 values are permitted: - request.nbuckets = table.getNbuckets().intValue(); - request.memorySize = table.getMemorySize().intValue(); - request.skipNVectors = table.getSkipNVectors().intValue(); - - // mandatory - request.missNextIndex = missNextIndex; - - final String nextTable = table.getNextTable(); - if (isAdd && nextTable != null) { - request.nextTableIndex = classifyTableContext.getTableIndex(nextTable, ctx); - } else { - request.nextTableIndex = ~0; // value not specified - } - request.mask = DatatypeConverter.parseHexBinary(table.getMask().getValue().replace(":", "")); - checkArgument(request.mask.length % 16 == 0, "Number of mask bytes must be multiple of 16."); - request.matchNVectors = request.mask.length / 16; - - return request; - } -} \ No newline at end of file diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppClassifierContextManager.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppClassifierContextManager.java deleted file mode 100644 index 69dfb644a..000000000 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppClassifierContextManager.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2016 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.translate.v3po.vppclassifier; - -import com.google.common.base.Optional; -import io.fd.honeycomb.translate.MappingContext; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.VppNodeName; - -/** - * Manages metadata for vpp-classifier - */ -public interface VppClassifierContextManager { - - /** - * Creates metadata for classify table. - * - * @param id classify table index - * @param name classify table name - * @param classifierNode name of VPP node the table is defined for - * @param ctx mapping context providing context data for current transaction - */ - void addTable(final int id, @Nonnull final String name, @Nullable final VppNodeName classifierNode, - @Nonnull final MappingContext ctx); - - /** - * Check whether metadata for given classify table metadata is present. - * - * @param name classify table name - * @param ctx mapping context providing context data for current transaction - * @return true if present, false otherwise - */ - boolean containsTable(@Nonnull String name, @Nonnull final MappingContext ctx); - - /** - * Returns classify table index associated with the given name. - * - * @param name classify table name - * @param ctx mapping context providing context data for current transaction - * @return integer index value matching supplied classify table name - * @throws IllegalArgumentException if classify table was not found - */ - int getTableIndex(@Nonnull final String name, @Nonnull final MappingContext ctx); - - /** - * Retrieves classify table name for given id. If not present, artificial name will be generated. - * - * @param id classify table index - * @param ctx mapping context providing context data for current transaction - * @return classify table name matching supplied index - */ - String getTableName(final int id, @Nonnull final MappingContext ctx); - - /** - * Returns name of the base vpp node associated with the classify table. - * - * @param name classify table name - * @param ctx mapping context providing context data for current transaction - * @return name of VPP node the table is defined for - */ - Optional getTableBaseNode(final String name, @Nonnull final MappingContext ctx); - - /** - * Removes classify table metadata from current context. - * - * @param name classify table name - * @param ctx mapping context providing context data for current transaction - */ - void removeTable(@Nonnull final String name, @Nonnull final MappingContext ctx); - - /** - * Adds relative node index to node name mapping for given classify table. - * - * @param tableName classify table name - * @param nodeIndex index of a vpp node, relative to table's base node - * @param nodeName name of a vpp node - * @param ctx mapping context providing context data for current transaction - */ - void addNodeName(@Nonnull String tableName, final int nodeIndex, @Nonnull final String nodeName, - @Nonnull final MappingContext ctx); - - /** - * Retrieves node name associated with the given classify table and node index. - * - * @param tableIndex classify table index - * @param nodeIndex relative index of a vpp node - * @param ctx mapping context providing context data for current transaction - * @return name of vpp node - */ - Optional getNodeName(final int tableIndex, final int nodeIndex, @Nonnull final MappingContext ctx); -} diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppClassifierContextManagerImpl.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppClassifierContextManagerImpl.java deleted file mode 100644 index 13931ae47..000000000 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppClassifierContextManagerImpl.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) 2016 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.translate.v3po.vppclassifier; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkState; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.google.inject.Inject; -import io.fd.honeycomb.translate.MappingContext; -import io.fd.honeycomb.translate.read.ReaderFactory; -import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder; -import io.fd.honeycomb.translate.util.RWUtils; -import io.fd.honeycomb.translate.util.read.BindingBrokerReader; -import java.util.List; -import java.util.stream.Collector; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.inject.Named; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.VppNodeName; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev160909.VppClassifierContext; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev160909.VppClassifierContextBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev160909.vpp.classifier.context.ClassifyTableContext; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev160909.vpp.classifier.context.ClassifyTableContextBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev160909.vpp.classifier.context.ClassifyTableContextKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev160909.vpp.classifier.context.classify.table.context.NodeContext; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev160909.vpp.classifier.context.classify.table.context.NodeContextBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev160909.vpp.classifier.context.classify.table.context.NodeContextKey; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; - -/** - * Facade on top of {@link MappingContext} that manages {@link ClassifyTableContext}. - */ -public final class VppClassifierContextManagerImpl implements VppClassifierContextManager { - private static final Collector SINGLE_ITEM_COLLECTOR = - RWUtils.singleItemCollector(); - - @VisibleForTesting - static final InstanceIdentifier - VPP_CLASSIFIER_CONTEXT_IID = KeyedInstanceIdentifier.create(VppClassifierContext.class); - private final String artificialNamePrefix; - - /** - * Creates new VppClassifierContextManagerImpl. - * - * @param artificialNamePrefix artificial name to be used to generate names for classify tables without existing - * metadata - */ - public VppClassifierContextManagerImpl(@Nonnull final String artificialNamePrefix) { - this.artificialNamePrefix = - Preconditions.checkNotNull(artificialNamePrefix, "artificialNamePrefix should not be null"); - } - - private KeyedInstanceIdentifier getMappingIid(final String name) { - return VPP_CLASSIFIER_CONTEXT_IID.child(ClassifyTableContext.class, new ClassifyTableContextKey(name)); - } - - @Override - public void addTable(final int id, @Nonnull final String name, @Nullable final VppNodeName classifierNode, - @Nonnull final MappingContext ctx) { - final KeyedInstanceIdentifier mappingIid = getMappingIid(name); - final ClassifyTableContextBuilder tableCtx = new ClassifyTableContextBuilder().setIndex(id).setName(name); - if (classifierNode != null) { - tableCtx.setClassifierNodeName(classifierNode.getValue()); - } - ctx.put(mappingIid, tableCtx.build()); - } - - @Override - public boolean containsTable(@Nonnull final String name, @Nonnull final MappingContext ctx) { - final Optional read = ctx.read(getMappingIid(name)); - return read.isPresent(); - } - - @Override - public int getTableIndex(@Nonnull final String name, @Nonnull final MappingContext ctx) { - final Optional read = ctx.read(getMappingIid(name)); - checkArgument(read.isPresent(), "No mapping stored for name: %s", name); - return read.get().getIndex(); - } - - @Override - public String getTableName(final int id, @Nonnull final MappingContext ctx) { - if (!containsName(id, ctx)) { - final String artificialName = getArtificialName(id); - addTable(id, artificialName, null, ctx); - } - - final Optional read = ctx.read(VPP_CLASSIFIER_CONTEXT_IID); - checkState(read.isPresent(), "VppClassifierContext for index: %s is not present. But should be", id); - - return read.get().getClassifyTableContext().stream() - .filter(t -> t.getIndex().equals(id)) - .collect(SINGLE_ITEM_COLLECTOR).getName(); - } - - private boolean containsName(final int index, @Nonnull final MappingContext mappingContext) { - final Optional read = mappingContext.read(VPP_CLASSIFIER_CONTEXT_IID); - return read.isPresent() - ? read.get().getClassifyTableContext().stream().anyMatch(t -> t.getIndex().equals(index)) - : false; - } - - @Override - public Optional getTableBaseNode(@Nonnull final String name, @Nonnull final MappingContext ctx) { - final Optional read = ctx.read(getMappingIid(name)); - if (read.isPresent()) { - return Optional.fromNullable(read.get().getClassifierNodeName()); - } - return Optional.absent(); - } - - @Override - public void removeTable(@Nonnull final String name, @Nonnull final MappingContext ctx) { - ctx.delete(getMappingIid(name)); - } - - @Override - public void addNodeName(@Nonnull final String tableName, final int nodeIndex, - @Nonnull final String nodeName, - @Nonnull final MappingContext ctx) { - final KeyedInstanceIdentifier iid = - getMappingIid(tableName).child(NodeContext.class, new NodeContextKey(nodeName)); - ctx.put(iid, new NodeContextBuilder().setName(nodeName).setIndex(nodeIndex).build()); - } - - @Override - public Optional getNodeName(final int tableIndex, final int nodeIndex, @Nonnull final MappingContext ctx) { - if (!containsName(tableIndex, ctx)) { - return Optional.absent(); - } - final String tableName = getTableName(tableIndex, ctx); - final Optional tableCtx = ctx.read(getMappingIid(tableName)); - final List nodeContext = tableCtx.get().getNodeContext(); - if (nodeContext == null) { - return Optional.absent(); - } - return Optional.fromNullable(nodeContext.stream() - .filter(n -> n.getIndex().equals(nodeIndex)) - .findFirst() - .map(nodes -> nodes.getName()) - .orElse(null)); - } - - private String getArtificialName(final int index) { - return artificialNamePrefix + index; - } - - public static final class ContextsReaderFactory implements ReaderFactory { - - @Inject - @Named("honeycomb-context") - private DataBroker contextBindingBrokerDependency; - - @Override - public void init(final ModifiableReaderRegistryBuilder registry) { - registry.add(new BindingBrokerReader<>(VPP_CLASSIFIER_CONTEXT_IID, - contextBindingBrokerDependency, - LogicalDatastoreType.OPERATIONAL, VppClassifierContextBuilder.class)); - } - } -} diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppNodeReader.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppNodeReader.java deleted file mode 100644 index 23ce094c1..000000000 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppNodeReader.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2016 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.translate.v3po.vppclassifier; - -import com.google.common.base.Optional; -import io.fd.honeycomb.translate.MappingContext; -import javax.annotation.Nonnull; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.PacketHandlingAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.VppNode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.VppNodeName; -import org.slf4j.Logger; - -interface VppNodeReader { - - /** - * Converts vpp node index to YANG representation of vpp node. - * - * @param nodeIndex index of vpp node treated as signed integer. - * @return vpp node representation - */ - default Optional readVppNode(final int tableIndex, final int nodeIndex, - @Nonnull final VppClassifierContextManager vppClassifierContextManager, - @Nonnull final MappingContext ctx, @Nonnull final Logger log) { - final PacketHandlingAction action = PacketHandlingAction.forValue(nodeIndex); - if (action == null) { - return vppClassifierContextManager.getNodeName(tableIndex, nodeIndex, ctx) - .transform(nodeName -> new VppNode(new VppNodeName(nodeName))); - } - return Optional.of(new VppNode(action)); - } -} diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppNodeWriter.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppNodeWriter.java deleted file mode 100644 index 308c2496e..000000000 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/vppclassifier/VppNodeWriter.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2016 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.translate.v3po.vppclassifier; - -import static com.google.common.base.Preconditions.checkArgument; - -import io.fd.honeycomb.translate.MappingContext; -import io.fd.honeycomb.translate.read.ReadFailedException; -import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer; -import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer; -import io.fd.honeycomb.translate.write.WriteFailedException; -import io.fd.vpp.jvpp.VppBaseCallException; -import io.fd.vpp.jvpp.core.dto.GetNextIndex; -import io.fd.vpp.jvpp.core.dto.GetNextIndexReply; -import io.fd.vpp.jvpp.core.future.FutureJVppCore; -import java.util.concurrent.CompletionStage; -import javax.annotation.Nonnull; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.VppNode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev161214.vpp.classifier.ClassifyTable; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -abstract class VppNodeWriter extends FutureJVppCustomizer implements JvppReplyConsumer { - - protected VppNodeWriter(@Nonnull final FutureJVppCore futureJvpp) { - super(futureJvpp); - } - - protected int getNodeIndex(@Nonnull final VppNode node, @Nonnull final ClassifyTable classifyTable, - @Nonnull final VppClassifierContextManager vppClassifierContextManager, - @Nonnull final MappingContext ctx, @Nonnull final InstanceIdentifier id) - throws VppBaseCallException, WriteFailedException { - if (node.getPacketHandlingAction() != null) { - return node.getPacketHandlingAction().getIntValue(); - } else { - return nodeNameToIndex(classifyTable, node.getVppNodeName().getValue(), vppClassifierContextManager, ctx, - id); - } - } - - private int nodeNameToIndex(@Nonnull final ClassifyTable classifyTable, @Nonnull final String nextNodeName, - @Nonnull final VppClassifierContextManager vppClassifierContextManager, - @Nonnull final MappingContext ctx, @Nonnull final InstanceIdentifier id) - throws WriteFailedException { - checkArgument(classifyTable != null && classifyTable.getClassifierNode() != null, - "to use relative node names, table classifier node needs to be provided"); - final GetNextIndex request = new GetNextIndex(); - request.nodeName = classifyTable.getClassifierNode().getValue().getBytes(); - request.nextName = nextNodeName.getBytes(); - final CompletionStage getNextIndexCompletionStage = - getFutureJVpp().getNextIndex(request); - - final GetNextIndexReply reply; - try { - reply = getReplyForRead(getNextIndexCompletionStage.toCompletableFuture(), id); - - // vpp does not provide relative node index to node name conversion (https://jira.fd.io/browse/VPP-219) - // as a workaround we need to add mapping to vpp-classfier-context - vppClassifierContextManager.addNodeName(classifyTable.getName(), reply.nextIndex, nextNodeName, ctx); - } catch (ReadFailedException e) { - throw new WriteFailedException(id, String.format("Failed to get node index for %s relative to %s", - nextNodeName, classifyTable.getClassifierNode()), e); - } - return reply.nextIndex; - } -} -- cgit 1.2.3-korg