<groupId>org.opendaylight.controller</groupId>
<artifactId>sal-common-api</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.openflowjava</groupId>
+ <artifactId>openflow-protocol-impl</artifactId>
+ </dependency>
</dependencies>
</project>
import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
import io.netty.util.HashedWheelTimer;
import java.lang.management.ManagementFactory;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterManager;
import org.opendaylight.openflowplugin.impl.connection.ConnectionManagerImpl;
import org.opendaylight.openflowplugin.impl.device.DeviceManagerImpl;
+import org.opendaylight.openflowplugin.impl.protocol.deserialization.DeserializerInjector;
+import org.opendaylight.openflowplugin.impl.protocol.serialization.SerializerInjector;
import org.opendaylight.openflowplugin.impl.rpc.RpcManagerImpl;
import org.opendaylight.openflowplugin.impl.statistics.StatisticsManagerImpl;
import org.opendaylight.openflowplugin.impl.statistics.ofpspecific.MessageIntelligenceAgencyImpl;
}
private void startSwitchConnections() {
- final List<ListenableFuture<Boolean>> starterChain = new ArrayList<>(switchConnectionProviders.size());
- for (final SwitchConnectionProvider switchConnectionPrv : switchConnectionProviders) {
- switchConnectionPrv.setSwitchConnectionHandler(connectionManager);
- final ListenableFuture<Boolean> isOnlineFuture = switchConnectionPrv.startup();
- starterChain.add(isOnlineFuture);
- }
-
- final ListenableFuture<List<Boolean>> srvStarted = Futures.allAsList(starterChain);
- Futures.addCallback(srvStarted, new FutureCallback<List<Boolean>>() {
+ Futures.addCallback(Futures.allAsList(switchConnectionProviders.stream().map(switchConnectionProvider -> {
+ // Inject OpenflowPlugin custom serializers and deserializers into OpenflowJava
+ SerializerInjector.injectSerializers(switchConnectionProvider);
+ DeserializerInjector.injectDeserializers(switchConnectionProvider);
+
+ // Set handler of incoming connections and start switch connection provider
+ switchConnectionProvider.setSwitchConnectionHandler(connectionManager);
+ return switchConnectionProvider.startup();
+ }).collect(Collectors.toSet())), new FutureCallback<List<Boolean>>() {
@Override
public void onSuccess(final List<Boolean> result) {
- LOG.info("All switchConnectionProviders are up and running ({}).",
- result.size());
+ LOG.info("All switchConnectionProviders are up and running ({}).", result.size());
}
@Override
--- /dev/null
+/*
+ * Copyright (c) 2016 Pantheon Technologies s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.openflowplugin.impl.protocol.deserialization;
+
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider;
+
+/**
+ * Util class for injecting new deserializers into OpenflowJava
+ */
+public class DeserializerInjector {
+
+ /**
+ * Injects deserializers into provided {@link org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider}
+ * @param provider OpenflowJava deserializer extension provider
+ */
+ public static void injectDeserializers(final DeserializerExtensionProvider provider) {
+ // Inject new deserializers here
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 Pantheon Technologies s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.openflowplugin.impl.protocol.serialization;
+
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerExtensionProvider;
+
+/**
+ * Util class for injecting new serializers into OpenflowJava
+ */
+public class SerializerInjector {
+
+ /**
+ * Injects serializers into provided {@link org.opendaylight.openflowjava.protocol.api.extensibility.SerializerExtensionProvider}
+ * @param provider OpenflowJava serializer extension provider
+ */
+ public static void injectSerializers(final SerializerExtensionProvider provider) {
+ // Inject new serializers here
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 Pantheon Technologies s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.openflowplugin.impl.protocol.deserialization;
+
+import org.junit.Before;
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider;
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterActionDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterInstructionDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
+import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
+import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializationFactory;
+import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializerRegistryImpl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.property.header.QueueProperty;
+
+public abstract class AbstractDeserializerTest {
+ private DeserializerExtensionProvider provider;
+ private DeserializerRegistry registry;
+ private DeserializationFactory factory;
+
+ @Before
+ public void setUp() throws Exception {
+ registry = new DeserializerRegistryImpl();
+ registry.init();
+ factory = new DeserializationFactory();
+ factory.setRegistry(registry);
+ provider = new DeserializerExtensionProviderImpl(registry, factory);
+ DeserializerInjector.injectDeserializers(provider);
+ init();
+ }
+
+ protected DeserializationFactory getFactory() {
+ return factory;
+ }
+
+ protected DeserializerRegistry getRegistry() {
+ return registry;
+ }
+
+ protected DeserializerExtensionProvider getProvider() {
+ return provider;
+ }
+
+ protected abstract void init();
+
+ static class DeserializerExtensionProviderImpl implements DeserializerExtensionProvider {
+
+ private final DeserializerRegistry registry;
+ private final DeserializationFactory factory;
+
+ public DeserializerExtensionProviderImpl(final DeserializerRegistry registry, DeserializationFactory factory) {
+ this.registry = registry;
+ this.factory = factory;
+ }
+
+ @Override
+ public void registerDeserializer(MessageCodeKey messageCodeKey, OFGeneralDeserializer ofGeneralDeserializer) {
+ registry.registerDeserializer(messageCodeKey, ofGeneralDeserializer);
+ }
+
+ @Override
+ public boolean unregisterDeserializer(ExperimenterDeserializerKey key) {
+ return false;
+ }
+
+ @Override
+ public void registerActionDeserializer(ExperimenterActionDeserializerKey key, OFGeneralDeserializer deserializer) {
+
+ }
+
+ @Override
+ public void registerInstructionDeserializer(ExperimenterInstructionDeserializerKey key, OFGeneralDeserializer deserializer) {
+
+ }
+
+ @Override
+ public void registerMatchEntryDeserializer(MatchEntryDeserializerKey key, OFGeneralDeserializer deserializer) {
+
+ }
+
+ @Override
+ public void registerErrorDeserializer(ExperimenterIdDeserializerKey key, OFDeserializer<ErrorMessage> deserializer) {
+
+ }
+
+ @Override
+ public void registerExperimenterMessageDeserializer(ExperimenterIdDeserializerKey key, OFDeserializer<? extends ExperimenterDataOfChoice> deserializer) {
+
+ }
+
+ @Override
+ public void registerMultipartReplyMessageDeserializer(ExperimenterIdDeserializerKey key, OFDeserializer<? extends ExperimenterDataOfChoice> deserializer) {
+
+ }
+
+ @Override
+ public void registerMultipartReplyTFDeserializer(ExperimenterIdDeserializerKey key, OFGeneralDeserializer deserializer) {
+
+ }
+
+ @Override
+ public void registerMeterBandDeserializer(ExperimenterIdDeserializerKey key, OFDeserializer<MeterBandExperimenterCase> deserializer) {
+
+ }
+
+ @Override
+ public void registerQueuePropertyDeserializer(ExperimenterIdDeserializerKey key, OFDeserializer<QueueProperty> deserializer) {
+
+ }
+
+ @Override
+ public void registerDeserializerMapping(TypeToClassKey typeToClassKey, Class<?> aClass) {
+ factory.registerMapping(typeToClassKey, aClass);
+ }
+
+ @Override
+ public boolean unregisterDeserializerMapping(TypeToClassKey typeToClassKey) {
+ return factory.unregisterMapping(typeToClassKey);
+ }
+ }
+
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2016 Pantheon Technologies s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.openflowplugin.impl.protocol.serialization;
+
+import org.junit.Before;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralSerializer;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerExtensionProvider;
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.keys.ActionSerializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdMeterSubTypeSerializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdSerializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterSerializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.InstructionSerializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
+import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmClassBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeatureProperties;
+
+public abstract class AbstractSerializerTest {
+ private SerializerExtensionProvider provider;
+ private SerializerRegistry registry;
+
+ @Before
+ public void setUp() throws Exception {
+ registry = new SerializerRegistryImpl();
+ registry.init();
+ provider = new SerializerExtensionProviderImpl(registry);
+ SerializerInjector.injectSerializers(provider);
+ init();
+ }
+
+ protected SerializerRegistry getRegistry() {
+ return registry;
+ }
+
+ protected SerializerExtensionProvider getProvider() {
+ return provider;
+ }
+
+ protected abstract void init();
+
+ private static class SerializerExtensionProviderImpl implements SerializerExtensionProvider {
+
+ private final SerializerRegistry registry;
+
+ SerializerExtensionProviderImpl(final SerializerRegistry registry) {
+ this.registry = registry;
+ }
+
+ @Override
+ public <K> void registerSerializer(MessageTypeKey<K> messageTypeKey, OFGeneralSerializer ofGeneralSerializer) {
+ registry.registerSerializer(messageTypeKey, ofGeneralSerializer);
+ }
+
+ @Override
+ public boolean unregisterSerializer(ExperimenterSerializerKey key) {
+ return false;
+ }
+
+ @Override
+ public void registerActionSerializer(ActionSerializerKey<?> key, OFGeneralSerializer serializer) {
+
+ }
+
+ @Override
+ public void registerInstructionSerializer(InstructionSerializerKey<?> key, OFGeneralSerializer serializer) {
+
+ }
+
+ @Override
+ public <C extends OxmClassBase, F extends MatchField> void registerMatchEntrySerializer(MatchEntrySerializerKey<C, F> key, OFGeneralSerializer serializer) {
+
+ }
+
+ @Override
+ public void registerExperimenterMessageSerializer(ExperimenterIdSerializerKey<? extends ExperimenterDataOfChoice> key, OFSerializer<? extends ExperimenterDataOfChoice> serializer) {
+
+ }
+
+ @Override
+ public void registerMultipartRequestSerializer(ExperimenterIdSerializerKey<? extends ExperimenterDataOfChoice> key, OFSerializer<? extends ExperimenterDataOfChoice> serializer) {
+
+ }
+
+ @Override
+ public void registerMultipartRequestTFSerializer(ExperimenterIdSerializerKey<TableFeatureProperties> key, OFGeneralSerializer serializer) {
+
+ }
+
+ @Override
+ public void registerMeterBandSerializer(ExperimenterIdSerializerKey<MeterBandExperimenterCase> key, OFSerializer<MeterBandExperimenterCase> serializer) {
+
+ }
+
+ @Override
+ public void registerMeterBandSerializer(ExperimenterIdMeterSubTypeSerializerKey<MeterBandExperimenterCase> key, OFSerializer<MeterBandExperimenterCase> serializer) {
+
+ }
+ }
+
+}
\ No newline at end of file