From 38e5b14321192e7511d333b957974bbccc3468d5 Mon Sep 17 00:00:00 2001 From: Michal Rehak Date: Thu, 22 Oct 2015 17:37:51 +0200 Subject: [PATCH] BUG-4283 experimenter msg support - registration part - added registration point for experimenter message converters - depends on OFJava https://git.opendaylight.org/gerrit/#/c/28813/ - checkstyle fix Change-Id: Ibb8294c522335a0f5df783fbf92b617e45f29930 Signed-off-by: Michal Rehak --- .../api/ConvertorMessageFromOFJava.java | 28 +++++++ .../api/ConvertorMessageToOFJava.java | 26 ++++++ .../api/ExtensionConverterRegistrator.java | 22 +++++ .../extension/api/path/MessagePath.java | 49 ++++++++++++ .../openflowplugin-experimenter-types.yang | 15 ++++ .../main/yang/sal-experimenter-message.yang | 33 ++++++++ .../yang/sal-experimenter-mp-message.yang | 24 ++++++ .../ExtensionConverterManagerImpl.java | 80 +++++++++++++++++++ .../md/core/extension/RegistrationCloser.java | 65 +++++++++++---- 9 files changed, 327 insertions(+), 15 deletions(-) create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorMessageFromOFJava.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorMessageToOFJava.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/MessagePath.java create mode 100644 extension/openflowplugin-extension-api/src/main/yang/openflowplugin-experimenter-types.yang create mode 100644 extension/openflowplugin-extension-api/src/main/yang/sal-experimenter-message.yang create mode 100644 extension/openflowplugin-extension-api/src/main/yang/sal-experimenter-mp-message.yang diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorMessageFromOFJava.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorMessageFromOFJava.java new file mode 100644 index 0000000000..84a7880b5c --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorMessageFromOFJava.java @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. 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.extension.api; + +import org.opendaylight.openflowplugin.extension.api.path.AugmentationPath; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.experimenter.core.message.ExperimenterMessageOfChoice; +import org.opendaylight.yangtools.yang.binding.DataContainer; + +/** + * convert message from OFJava-API model into MD-SAL model + * + * @param input message model - OFJava-API + * @param

represents possible paths in yang schema for augmentations + */ +public interface ConvertorMessageFromOFJava { + + /** + * @param input + * @param path in yang schema where a converted value has to be augmented + * @return message converted to MD-SAL and its type + */ + ExperimenterMessageOfChoice convert(F input, P path); +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorMessageToOFJava.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorMessageToOFJava.java new file mode 100644 index 0000000000..586ca1a415 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorMessageToOFJava.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. 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.extension.api; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.experimenter.core.message.ExperimenterMessageOfChoice; +import org.opendaylight.yangtools.yang.binding.DataContainer; + +/** + * convert message from MD-SAL model into OFJava-API model + * + * @param input message model - MD-SAL model + * @param output message model - OFJava-API + */ +public interface ConvertorMessageToOFJava { + + /** + * @param experimenterMessageCase where is vendor's augmentation + * @return message converted to OFJava-API + */ + T convert(F experimenterMessageCase); +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionConverterRegistrator.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionConverterRegistrator.java index 745ad1454e..bc419c61d4 100644 --- a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionConverterRegistrator.java +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionConverterRegistrator.java @@ -9,14 +9,19 @@ package org.opendaylight.openflowplugin.extension.api; import org.opendaylight.openflowjava.protocol.api.keys.ActionSerializerKey; import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey; import org.opendaylight.openflowplugin.extension.api.path.ActionPath; import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.extension.api.path.MessagePath; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action; 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.oxm.rev150225.match.entries.grouping.MatchEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.experimenter.core.message.ExperimenterMessageOfChoice; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; import org.opendaylight.yangtools.concepts.ObjectRegistration; +import org.opendaylight.yangtools.yang.binding.DataContainer; /** * registration place for message converters provided by vendor extension @@ -48,4 +53,21 @@ public interface ExtensionConverterRegistrator { */ ObjectRegistration> registerActionConvertor( ActionSerializerKey key, ConvertorActionFromOFJava convertor); + + /** + * @param key consists of: experimenter type, version + * @param convertor TO OFJava (suitable for both: symmetric and multipart) + * @return closeable registration + */ + ObjectRegistration> registerMessageConvertor( + TypeVersionKey key, ConvertorMessageToOFJava convertor); + + /** + * @param key consists of: experimenter type, version + * @param convertor FROM OFJava (suitable for both: symmetric and multipart) + * @return closeable registration + */ + ObjectRegistration> registerMessageConvertor( + MessageTypeKey key, + ConvertorMessageFromOFJava convertor); } diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/MessagePath.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/MessagePath.java new file mode 100644 index 0000000000..e83bf27a43 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/MessagePath.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. 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.extension.api.path; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * List of augmentation points available for experimenter symmetric message and multipart message + */ +public enum MessagePath implements AugmentationPath { + + /** + *

+     * module: sal-experimenter-message
+     * notifications:
+     * +---n experimenter-message-from-dev
+     *    +--ro (experimenter-message-of-choice)?module: sal-flow
+     * 
+ */ + MESSAGE_NOTIFICATION(null), + /** + *
+     * module: sal-experimenter-mp-message
+     * rpcs:
+     * +---x send-experimenter-mp-request
+     *    +--ro output
+     *       +--ro (experimenter-message-of-choice)?notifications:
+     * 
+ */ + MPMESSAGE_RPC_OUTPUT(null); + + private final InstanceIdentifier iid; + + private MessagePath(InstanceIdentifier iid) { + this.iid = iid; + } + + @Override + public final InstanceIdentifier getInstanceIdentifier() { + return iid; + } + +} diff --git a/extension/openflowplugin-extension-api/src/main/yang/openflowplugin-experimenter-types.yang b/extension/openflowplugin-extension-api/src/main/yang/openflowplugin-experimenter-types.yang new file mode 100644 index 0000000000..8dcd9fdc93 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/yang/openflowplugin-experimenter-types.yang @@ -0,0 +1,15 @@ +module openflowplugin-experimenter-types { + namespace "urn:opendaylight:openflowplugin:experimenter:types"; + prefix exp-type; + + revision "2015-10-20" { + description "Initial revision of experimenter basic types"; + } + + + grouping experimenter-core-message { + choice experimenter-message-of-choice { + // to be augmented by vendors + } + } +} diff --git a/extension/openflowplugin-extension-api/src/main/yang/sal-experimenter-message.yang b/extension/openflowplugin-extension-api/src/main/yang/sal-experimenter-message.yang new file mode 100644 index 0000000000..5025b741f7 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/yang/sal-experimenter-message.yang @@ -0,0 +1,33 @@ +module sal-experimenter-message { + namespace "urn:opendaylight:experimenter-message:service"; + prefix exp-msg; + + import opendaylight-inventory {prefix inv; revision-date "2013-08-19";} + import openflowplugin-experimenter-types {prefix exp-type; revision-date "2015-10-20";} + + description "Openflow experimenter (symmetric) message service and notification."; + + revision "2015-10-20" { + description "Initial revision of experimenter message service"; + } + + grouping experimenter-symmetric-message { + description "Experimenter message with node and xid reference included."; + uses "inv:node-context-ref"; + uses exp-type:experimenter-core-message; + } + + rpc send-experimenter { + description "Send experimenter request to device, expecting reply."; + input { + uses "inv:node-context-ref"; + uses exp-type:experimenter-core-message; + } + } + + notification experimenter-message-from-dev { + description "Upon experimenter request message received."; + uses experimenter-symmetric-message; + } + +} diff --git a/extension/openflowplugin-extension-api/src/main/yang/sal-experimenter-mp-message.yang b/extension/openflowplugin-extension-api/src/main/yang/sal-experimenter-mp-message.yang new file mode 100644 index 0000000000..1b19dd0018 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/yang/sal-experimenter-mp-message.yang @@ -0,0 +1,24 @@ +module sal-experimenter-mp-message { + namespace "urn:opendaylight:experimenter-mp-message:service"; + prefix exp-mp-msg; + + import opendaylight-inventory {prefix inv;revision-date "2013-08-19";} + import openflowplugin-experimenter-types {prefix exp-type;revision-date "2015-10-20";} + + description "Openflow multipart experimenter message service."; + + revision "2015-10-20" { + description "Initial revision of experimenter multipart message service"; + } + + rpc send-experimenter-mp-request { + description "Send experimenter multipart request to device, expecting reply."; + input { + uses "inv:node-context-ref"; + uses exp-type:experimenter-core-message; + } + output { + uses exp-type:experimenter-core-message; + } + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManagerImpl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManagerImpl.java index 624364a323..4aad646dea 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManagerImpl.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManagerImpl.java @@ -16,19 +16,26 @@ import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey; import org.opendaylight.openflowplugin.extension.api.ConvertorActionFromOFJava; import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava; import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorMessageFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorMessageToOFJava; import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; import org.opendaylight.openflowplugin.extension.api.TypeVersionKey; import org.opendaylight.openflowplugin.extension.api.path.ActionPath; import org.opendaylight.openflowplugin.extension.api.path.AugmentationPath; import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.extension.api.path.MessagePath; import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserActionFromOFJava; import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserActionToOFJava; import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserFromOFJava; +import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserMessageFromOFJava; +import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserMessageToOFJava; import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserToOFJava; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action; 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.oxm.rev150225.match.entries.grouping.MatchEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.experimenter.core.message.ExperimenterMessageOfChoice; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; import org.opendaylight.yangtools.concepts.ObjectRegistration; import org.opendaylight.yangtools.yang.binding.DataContainer; @@ -42,6 +49,8 @@ public class ExtensionConverterManagerImpl implements ExtensionConverterManager private final Map, ConvertorToOFJava> registryToOFJAva; private final Map, ConvertorActionToOFJava> registryActionToOFJAva; private final Map, ConvertorActionFromOFJava> registryActionFromOFJAva; + private final Map, ConvertorMessageToOFJava> registryMessageToOFJAva; + private final Map, ConvertorMessageFromOFJava> registryMessageFromOFJAva; /** * default ctor @@ -51,6 +60,8 @@ public class ExtensionConverterManagerImpl implements ExtensionConverterManager registryToOFJAva = new ConcurrentHashMap<>(); registryActionToOFJAva = new ConcurrentHashMap<>(); registryActionFromOFJAva = new ConcurrentHashMap<>(); + registryMessageToOFJAva = new ConcurrentHashMap<>(); + registryMessageFromOFJAva = new ConcurrentHashMap<>(); } /** @@ -111,6 +122,36 @@ public class ExtensionConverterManagerImpl implements ExtensionConverterManager return janitor; } + /** + * @param key + * @param extConvertor + * @return + */ + private RegistrationCloserMessageToOFJava hireMessageJanitor( + final TypeVersionKey key, + final ConvertorMessageToOFJava extConvertor) { + RegistrationCloserMessageToOFJava janitor = new RegistrationCloserMessageToOFJava<>(); + janitor.setConverter(extConvertor); + janitor.setKey(key); + janitor.setRegistrator(this); + return janitor; + } + + /** + * @param key + * @param extConvertor + * @return + */ + private > + RegistrationCloserMessageFromOFJava hireMessageJanitor( + final KEY key, final ConvertorMessageFromOFJava extConvertor) { + RegistrationCloserMessageFromOFJava janitor = new RegistrationCloserMessageFromOFJava<>(); + janitor.setConverter(extConvertor); + janitor.setKey(key); + janitor.setRegistrator(this); + return janitor; + } + /** * cancel registration of given converter * @@ -163,6 +204,32 @@ public class ExtensionConverterManagerImpl implements ExtensionConverterManager } } + /** + * cancel registration of given converter + * + * @param key + * @param converter + */ + public void unregister(final MessageTypeKey key, final ConvertorMessageFromOFJava converter) { + ConvertorMessageFromOFJava registeredConverter = registryMessageFromOFJAva.get(key); + if (registeredConverter != null && registeredConverter == converter) { + registryMessageFromOFJAva.remove(key); + } + } + + /** + * cancel registration of given converter + * + * @param key + * @param converter + */ + public void unregister(final TypeVersionKey key, final ConvertorMessageToOFJava converter) { + ConvertorMessageToOFJava registeredConverter = registryMessageToOFJAva.get(key); + if (registeredConverter != null && registeredConverter == converter) { + registryMessageToOFJAva.remove(key); + } + } + @SuppressWarnings("unchecked") @Override public ConvertorToOFJava getConverter( @@ -224,4 +291,17 @@ public class ExtensionConverterManagerImpl implements ExtensionConverterManager return hireJanitor(key, convertor); } + @Override + public ObjectRegistration> registerMessageConvertor( + TypeVersionKey key, ConvertorMessageToOFJava convertor) { + registryMessageToOFJAva.put(key, convertor); + return hireMessageJanitor(key, convertor); + } + + @Override + public ObjectRegistration> registerMessageConvertor( + MessageTypeKey key, ConvertorMessageFromOFJava convertor) { + registryMessageFromOFJAva.put(key, convertor); + return hireMessageJanitor(key, convertor); + } } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/RegistrationCloser.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/RegistrationCloser.java index 11a7b6fed2..0e28937b21 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/RegistrationCloser.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/RegistrationCloser.java @@ -1,6 +1,6 @@ /** * Copyright (c) 2014 Cisco Systems, Inc. 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 @@ -12,10 +12,13 @@ import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey; import org.opendaylight.openflowplugin.extension.api.ConvertorActionFromOFJava; import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava; import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorMessageFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorMessageToOFJava; import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; import org.opendaylight.openflowplugin.extension.api.TypeVersionKey; import org.opendaylight.openflowplugin.extension.api.path.AugmentationPath; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.experimenter.core.message.ExperimenterMessageOfChoice; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; import org.opendaylight.yangtools.concepts.ObjectRegistration; import org.opendaylight.yangtools.yang.binding.DataContainer; @@ -25,11 +28,11 @@ import org.opendaylight.yangtools.yang.binding.DataContainer; * @param converter instance */ public abstract class RegistrationCloser implements ObjectRegistration { - + private ExtensionConverterManagerImpl registrator; private KEY key; private CONVERTER converter; - + /** * @param registrator the registrator to set */ @@ -66,61 +69,93 @@ public abstract class RegistrationCloser implements ObjectRegist public CONVERTER getConverter() { return converter; } - + @Override public CONVERTER getInstance() { return getConverter(); } - + /** * standalone deregistrator * @param target type of wrapped convertor */ - public static class RegistrationCloserToOFJava extends + public static class RegistrationCloserToOFJava extends RegistrationCloser, ConvertorToOFJava> { - + @Override public void close() throws Exception { getRegistrator().unregister(getKey(), getConverter()); } } - + /** * standalone deregistrator * @param source type of wrapped convertor * @param associated augmentation path */ public static class RegistrationCloserFromOFJava extends RegistrationCloser, ConvertorFromOFJava> { - + @Override public void close() throws Exception { getRegistrator().unregister(getKey(), getConverter()); } } - + /** * standalone deregistrator * @param target type of wrapped convertor */ - public static class RegistrationCloserActionToOFJava extends + public static class RegistrationCloserActionToOFJava extends RegistrationCloser, ConvertorActionToOFJava> { - + + @Override + public void close() throws Exception { + getRegistrator().unregister(getKey(), getConverter()); + } + } + + /** + * standalone deregistrator + * @param source type of wrapped convertor + * @param associated augmentation path + */ + public static class RegistrationCloserActionFromOFJava extends + RegistrationCloser, ConvertorActionFromOFJava> { + + @Override + public void close() throws Exception { + getRegistrator().unregister(getKey(), getConverter()); + } + } + + /** + * standalone deregistrator + * + * @param target type of wrapped convertor + */ + public static class RegistrationCloserMessageToOFJava extends + RegistrationCloser, ConvertorMessageToOFJava> { + @Override public void close() throws Exception { getRegistrator().unregister(getKey(), getConverter()); } } - + /** * standalone deregistrator + * * @param source type of wrapped convertor * @param associated augmentation path */ - public static class RegistrationCloserActionFromOFJava extends RegistrationCloser, ConvertorActionFromOFJava> { - + public static class RegistrationCloserMessageFromOFJava extends + RegistrationCloser, ConvertorMessageFromOFJava> { + @Override public void close() throws Exception { getRegistrator().unregister(getKey(), getConverter()); } } + + } -- 2.36.6