Add configuration knob for Single Layer 71/52671/4
authorTomas Slusny <tomas.slusny@pantheon.tech>
Thu, 2 Mar 2017 16:50:50 +0000 (17:50 +0100)
committerTomas Slusny <tomas.slusny@pantheon.tech>
Tue, 7 Mar 2017 13:37:20 +0000 (13:37 +0000)
Add configuration knob to openflowplugin.cfg that will enable/disable
use-single-layer-serialization.

Change-Id: I9473a80495060aaa252757ba4d0b1450d252b08e
Signed-off-by: Tomas Slusny <tomas.slusny@pantheon.tech>
openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/DeviceManager.java
openflowplugin-blueprint-config/src/main/resources/initial/openflowplugin.cfg
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderImpl.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceManagerImpl.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/DeserializerInjector.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/MessageDeserializerInjector.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/MultipartDeserializerInjector.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/AbstractDeserializerTest.java

index 9698c2551562d7ac968ebe5a50f82dee9e35286d..e86e06fdd80b7adc4ad847c3f1efb76a69aa8205 100644 (file)
@@ -42,5 +42,7 @@ public interface DeviceManager extends
     void setBarrierInterval(long barrierTimeoutLimit);
 
     CheckedFuture<Void, TransactionCommitFailedException> removeDeviceFromOperationalDS(DeviceInfo deviceInfo);
+
+    void setUseSingleLayerSerialization(Boolean useSingleLayerSerilization);
 }
 
index bcf40e7dcfa52a347e595ae46bc3ffa6cf63caa4..c7056a596db580d628f8665c9f229588eedbd03d 100644 (file)
@@ -33,3 +33,4 @@ basic-timer-delay=3000
 #maximum timer delay is the wait time to collect next statistics
 #used in polling the statistics, value is in milliseconds
 maximum-timer-delay=900000
+use-single-layer-serialization=true
index 1864a2c38fe93b90cc94715cf0f6afaed127698d..759e6ee67007b6af8380af2e62dedcddab6ebe1b 100644 (file)
@@ -291,7 +291,30 @@ public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenF
     public void update(Map<String,Object> props) {
         LOG.debug("Update managed properties = {}", props.toString());
 
+        final boolean containsUseSingleLayer = props.containsKey("use-single-layer-serialization");
+
+        if (containsUseSingleLayer) {
+            final Boolean useSingleLayer = Boolean.valueOf(props.get("use-single-layer-serialization").toString());
+
+            if (useSingleLayer != useSingleLayerSerialization) {
+                useSingleLayerSerialization = useSingleLayer;
+
+                if (useSingleLayer) {
+                    switchConnectionProviders.forEach(switchConnectionProvider -> {
+                        SerializerInjector.injectSerializers(switchConnectionProvider);
+                        DeserializerInjector.injectDeserializers(switchConnectionProvider);
+                    });
+                } else {
+                    switchConnectionProviders.forEach(DeserializerInjector::revertDeserializers);
+                }
+            }
+        }
+
         if(deviceManager != null) {
+            if (containsUseSingleLayer) {
+                deviceManager.setUseSingleLayerSerialization(Boolean.valueOf(props.get("use-single-layer-serialization").toString()));
+            }
+
             if (props.containsKey("notification-flow-removed-off")) {
                 deviceManager.setFlowRemovedNotificationOn(Boolean.valueOf(props.get("enable-flow-removed-notification").toString()));
             }
index c55970b3187d8ffa75df6f972266759afd3c465e..3c20df9ec6a1609b706f7e5dd57fd64dbf9a8e66 100644 (file)
@@ -97,7 +97,7 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi
     private final NotificationPublishService notificationPublishService;
     private final MessageSpy messageSpy;
     private final HashedWheelTimer hashedWheelTimer;
-    private final boolean useSingleLayerSerialization;
+    private boolean useSingleLayerSerialization;
 
     public DeviceManagerImpl(@Nonnull final DataBroker dataBroker,
                              final long globalNotificationQuota,
@@ -399,6 +399,11 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi
         return delFuture;
     }
 
+    @Override
+    public void setUseSingleLayerSerialization(final Boolean useSingleLayerSerialization) {
+        this.useSingleLayerSerialization = useSingleLayerSerialization;
+    }
+
 
     private void addCallbackToDeviceInitializeToSlave(final DeviceInfo deviceInfo, final DeviceContext deviceContext, final LifecycleService lifecycleService) {
         Futures.addCallback(deviceContext.makeDeviceSlave(), new FutureCallback<RpcResult<SetRoleOutput>>() {
index e88138385fb8fa119309b5a09a3499af78c85187..56d9b799ee61c69cbc28ca5994ad7ce6b7eb967b 100644 (file)
@@ -25,9 +25,14 @@ public class DeserializerInjector {
         ActionDeserializerInjector.injectDeserializers(provider);
         InstructionDeserializerInjector.injectDeserializers(provider);
         MultipartDeserializerInjector.injectDeserializers(provider);
+        MessageDeserializerInjector.injectDeserializers(provider);
+    }
 
-        // Message deserializers are not used, so disable them here
-        // Uncomment to enable
-        // MessageDeserializerInjector.injectDeserializers(provider);
+    /**
+     * Reverts original deserializers in provided {@link org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider}
+     * @param provider OpenflowJava deserializer extension provider
+     */
+    public static void revertDeserializers(final DeserializerExtensionProvider provider) {
+        MessageDeserializerInjector.revertDeserializers(provider);
     }
 }
index af385e045ddd45bfd59e75c68d8e7b5f8c206a5b..6c670b0d66e5a365f95d2fd55a89db62138dc699 100644 (file)
@@ -17,14 +17,21 @@ import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
 import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.messages.FlowMessageDeserializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowMessage;
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.messages.GroupMessageDeserializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupMessage;
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.messages.MeterMessageDeserializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterMessage;
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.messages.PortMessageDeserializer;
+import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyMessageDeserializer;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartReply;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
 
 public class MessageDeserializerInjector {
 
@@ -37,10 +44,24 @@ public class MessageDeserializerInjector {
         final Function<Integer, Function<Class<? extends OfHeader>, Consumer<OFDeserializer<? extends OfHeader>>>> injector =
                 createInjector(provider, EncodeConstants.OF13_VERSION_ID);
 
-        injector.apply(14).apply(FlowMessage.class).accept(new FlowMessageDeserializer());
-        injector.apply(15).apply(GroupMessage.class).accept(new GroupMessageDeserializer());
-        injector.apply(29).apply(MeterMessage.class).accept(new MeterMessageDeserializer());
-        injector.apply(16).apply(PortMessage.class).accept(new PortMessageDeserializer());
+        injector.apply(19).apply(MultipartReply.class).accept(new MultipartReplyMessageDeserializer());
+    }
+
+    /**
+     * Reverts original message deserializers in provided {@link org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider}
+     * @param provider OpenflowJava deserializer extension provider
+     */
+    static void revertDeserializers(final DeserializerExtensionProvider provider) {
+        provider.unregisterDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 14));
+        provider.registerDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 14), FlowModInput.class);
+        provider.unregisterDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 15));
+        provider.registerDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 15), GroupModInput.class);
+        provider.unregisterDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 29));
+        provider.registerDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 29), MeterModInput.class);
+        provider.unregisterDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 16));
+        provider.registerDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 16), PortModInput.class);
+        provider.unregisterDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 19));
+        provider.registerDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 19), MultipartReplyMessage.class);
     }
 
     /**
@@ -62,4 +83,15 @@ public class MessageDeserializerInjector {
         };
     }
 
+    @VisibleForTesting
+    static void injectLegacyDeserializers(final DeserializerExtensionProvider provider) {
+        final Function<Integer, Function<Class<? extends OfHeader>, Consumer<OFDeserializer<? extends OfHeader>>>> injector =
+            createInjector(provider, EncodeConstants.OF13_VERSION_ID);
+
+         injector.apply(14).apply(FlowMessage.class).accept(new FlowMessageDeserializer());
+         injector.apply(15).apply(GroupMessage.class).accept(new GroupMessageDeserializer());
+         injector.apply(29).apply(MeterMessage.class).accept(new MeterMessageDeserializer());
+         injector.apply(16).apply(PortMessage.class).accept(new PortMessageDeserializer());
+    }
+
 }
index 4e2a747161b7e10ef8e9fcd24bcb3403adf9e9ee..dd47f0fa43670c56e9ffffeb2324cbf7fe47502a 100644 (file)
@@ -14,7 +14,6 @@ import java.util.function.Function;
 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider;
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
 import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
-import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyDescDeserializer;
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyExperimenterDeserializer;
@@ -24,7 +23,6 @@ import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.M
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyGroupDescDeserializer;
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyGroupFeaturesDeserializer;
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyGroupStatsDeserializer;
-import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyMessageDeserializer;
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyMeterConfigDeserializer;
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyMeterFeaturesDeserializer;
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyMeterStatsDeserializer;
@@ -32,10 +30,8 @@ import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.M
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyPortStatsDeserializer;
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyQueueStatsDeserializer;
 import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyTableFeaturesDeserializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartReply;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.reply.MultipartReplyBody;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
 
 public class MultipartDeserializerInjector {
 
@@ -46,9 +42,6 @@ public class MultipartDeserializerInjector {
     static void injectDeserializers(final DeserializerExtensionProvider provider) {
         final short version = EncodeConstants.OF13_VERSION_ID;
 
-        // Inject main multipart reply deserializer
-        injectMultipartReplyDeserializer(provider, version);
-
         // Inject new multipart body deserializers here using injector created by createInjector method
         final Function<Integer, Consumer<OFDeserializer<? extends MultipartReplyBody>>> injector =
                 createInjector(provider, version);
@@ -69,21 +62,6 @@ public class MultipartDeserializerInjector {
         injector.apply(MultipartType.OFPMPEXPERIMENTER.getIntValue()).accept(new MultipartReplyExperimenterDeserializer());
     }
 
-    /**
-     * Register main multipart reply deserializer
-     * @param provider OpenflowJava deserializer extension provider
-     * @param version Openflow version
-     */
-    static void injectMultipartReplyDeserializer(final DeserializerExtensionProvider provider, final short version) {
-        final short code = 19;
-        final Class<? extends OfHeader> retType = MultipartReply.class;
-        provider.unregisterDeserializerMapping(new TypeToClassKey(version, code));
-        provider.registerDeserializerMapping(new TypeToClassKey(version, code), retType);
-        provider.registerDeserializer(
-                new MessageCodeKey(version, code, retType),
-                new MultipartReplyMessageDeserializer());
-    }
-
     /**
      * Create injector that will inject new deserializers into #{@link org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider}
      * @param provider OpenflowJava deserializer extension provider
index 41d48b200891ac9b835b95b352b7f2bc1d9f025d..19121391aace19e21ff19ad421d86e58386f8e80 100644 (file)
@@ -40,7 +40,7 @@ public abstract class AbstractDeserializerTest {
         factory.setRegistry(registry);
         provider = new DeserializerExtensionProviderImpl(registry, factory);
         DeserializerInjector.injectDeserializers(provider);
-        MessageDeserializerInjector.injectDeserializers(provider);
+        MessageDeserializerInjector.injectLegacyDeserializers(provider);
         init();
     }