From 44f8beb1d137064983f903b204dc098fadd12de7 Mon Sep 17 00:00:00 2001 From: Martin Bobak Date: Sun, 31 Aug 2014 19:44:35 +0200 Subject: [PATCH] Bug 1680 - default table-miss-entry feature should be pulled out into separate module Change-Id: I45e01c2edecfde58ceb13d0ae9a7c905faf9a018 Signed-off-by: Martin Bobak --- applications/pom.xml | 105 ++++++++++++++++++ applications/table-miss-enforcer/pom.xml | 66 +++++++++++ .../LLDPPacketPuntEnforcer.java | 17 +-- .../LLDPPacketPuntEnforcerModule.java | 37 ++++++ .../LLDPPacketPuntEnforcerModuleFactory.java | 13 +++ .../initial/69-table-miss-enforcer.xml | 30 +++++ .../src/main/yang/table-miss-enforcer.yang | 42 +++++++ .../LLDPDataChangeListenerTest.java | 7 +- distribution/base/pom.xml | 9 +- .../md/core/sal/OpenflowPluginProvider.java | 36 ++---- pom.xml | 25 +++-- 11 files changed, 341 insertions(+), 46 deletions(-) create mode 100644 applications/pom.xml create mode 100644 applications/table-miss-enforcer/pom.xml rename openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/lldp/LLDPPAcketPuntEnforcer.java => applications/table-miss-enforcer/src/main/java/org/opendaylight/openflowplugin/applications/tableMissEnforcer/LLDPPacketPuntEnforcer.java (90%) create mode 100644 applications/table-miss-enforcer/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/applications/table/miss/enforcer/rev140326/LLDPPacketPuntEnforcerModule.java create mode 100644 applications/table-miss-enforcer/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/applications/table/miss/enforcer/rev140326/LLDPPacketPuntEnforcerModuleFactory.java create mode 100644 applications/table-miss-enforcer/src/main/resources/initial/69-table-miss-enforcer.xml create mode 100644 applications/table-miss-enforcer/src/main/yang/table-miss-enforcer.yang rename {openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/lldp => applications/table-miss-enforcer/src/test/java/org/opendaylight/openflowplugin/applications/tableMissEnforcer}/LLDPDataChangeListenerTest.java (88%) diff --git a/applications/pom.xml b/applications/pom.xml new file mode 100644 index 0000000000..d2e886e1dc --- /dev/null +++ b/applications/pom.xml @@ -0,0 +1,105 @@ + + + 4.0.0 + + + org.opendaylight.openflowplugin + openflowplugin-parent + 0.0.3-SNAPSHOT + + + org.opendaylight.openflowplugin + applications + 0.0.3-SNAPSHOT + applications + http://maven.apache.org + pom + + + + + org.opendaylight.openflowplugin + openflowplugin-api + ${project.version} + + + + + + + + org.opendaylight.yangtools + yang-maven-plugin + ${yang.binding.version} + + + + generate-sources + + + + + + org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + + ${project.build.directory}/generated-sources/config + + + urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang + + + + + + org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl + + ${project.build.directory}/generated-sources/sal + + + true + + + + + + org.opendaylight.controller + yang-jmx-generator-plugin + ${config.parent.version} + + + org.opendaylight.yangtools + maven-sal-api-gen-plugin + ${yang.binding.version} + jar + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.8 + + + add-source + generate-sources + + add-source + + + + ${project.build.directory}/generated-sources/config; + + + + + + + + + + + table-miss-enforcer + + + \ No newline at end of file diff --git a/applications/table-miss-enforcer/pom.xml b/applications/table-miss-enforcer/pom.xml new file mode 100644 index 0000000000..989f9629d1 --- /dev/null +++ b/applications/table-miss-enforcer/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + + org.opendaylight.openflowplugin + applications + 0.0.3-SNAPSHOT + + org.opendaylight.openflowplugin.applications + table-miss-enforcer + bundle + + + org.opendaylight.openflowplugin + openflowplugin-api + + + org.opendaylight.controller + sal-binding-api + + + org.opendaylight.controller + sal-binding-broker-impl + + + org.opendaylight.controller.model + model-inventory + + + org.opendaylight.controller.model + model-flow-service + + + org.mockito + mockito-all + test + + + junit + junit + test + + + org.opendaylight.controller + config-api + + + + + + + org.opendaylight.yangtools + yang-maven-plugin + + + org.codehaus.mojo + build-helper-maven-plugin + + + org.apache.felix + maven-bundle-plugin + + + + diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/lldp/LLDPPAcketPuntEnforcer.java b/applications/table-miss-enforcer/src/main/java/org/opendaylight/openflowplugin/applications/tableMissEnforcer/LLDPPacketPuntEnforcer.java similarity index 90% rename from openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/lldp/LLDPPAcketPuntEnforcer.java rename to applications/table-miss-enforcer/src/main/java/org/opendaylight/openflowplugin/applications/tableMissEnforcer/LLDPPacketPuntEnforcer.java index 477eed7244..cec87bc4b9 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/lldp/LLDPPAcketPuntEnforcer.java +++ b/applications/table-miss-enforcer/src/main/java/org/opendaylight/openflowplugin/applications/tableMissEnforcer/LLDPPacketPuntEnforcer.java @@ -6,7 +6,7 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.openflowplugin.openflow.md.lldp; +package org.opendaylight.openflowplugin.applications.tableMissEnforcer; import java.math.BigInteger; import java.util.ArrayList; @@ -38,20 +38,21 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instru import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; /** * Created by Martin Bobak mbobak@cisco.com on 8/27/14. */ -public class LLDPPAcketPuntEnforcer implements DataChangeListener { +public class LLDPPacketPuntEnforcer implements DataChangeListener { private static final short TABLE_ID = (short) 0; private static final String LLDP_PUNT_WHOLE_PACKET_FLOW = "LLDP_PUNT_WHOLE_PACKET_FLOW"; private static final String DEFAULT_FLOW_ID = "42"; private final SalFlowService flowService; - public LLDPPAcketPuntEnforcer(SalFlowService flowService) { + public LLDPPacketPuntEnforcer(SalFlowService flowService) { this.flowService = flowService; } @@ -59,10 +60,12 @@ public class LLDPPAcketPuntEnforcer implements DataChangeListener { public void onDataChanged(AsyncDataChangeEvent, DataObject> change) { final Set> changedDataKeys = change.getCreatedData().keySet(); - for (InstanceIdentifier key : changedDataKeys) { - AddFlowInputBuilder addFlowInput = new AddFlowInputBuilder(createFlow()); - addFlowInput.setNode(new NodeRef(key)); - this.flowService.addFlow(addFlowInput.build()); + if (changedDataKeys != null) { + for (InstanceIdentifier key : changedDataKeys) { + AddFlowInputBuilder addFlowInput = new AddFlowInputBuilder(createFlow()); + addFlowInput.setNode(new NodeRef(key.firstIdentifierOf(Node.class))); + this.flowService.addFlow(addFlowInput.build()); + } } } diff --git a/applications/table-miss-enforcer/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/applications/table/miss/enforcer/rev140326/LLDPPacketPuntEnforcerModule.java b/applications/table-miss-enforcer/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/applications/table/miss/enforcer/rev140326/LLDPPacketPuntEnforcerModule.java new file mode 100644 index 0000000000..fca8a63413 --- /dev/null +++ b/applications/table-miss-enforcer/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/applications/table/miss/enforcer/rev140326/LLDPPacketPuntEnforcerModule.java @@ -0,0 +1,37 @@ +package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.applications.table.miss.enforcer.rev140326; + +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.openflowplugin.applications.tableMissEnforcer.LLDPPacketPuntEnforcer; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class LLDPPacketPuntEnforcerModule extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.applications.table.miss.enforcer.rev140326.AbstractLLDPPacketPuntEnforcerModule { + public LLDPPacketPuntEnforcerModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public LLDPPacketPuntEnforcerModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.applications.table.miss.enforcer.rev140326.LLDPPacketPuntEnforcerModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void customValidation() { + // add custom validation form module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + InstanceIdentifier path = InstanceIdentifier.create(Nodes.class).child(Node.class).augmentation(FlowCapableNode.class); + SalFlowService salFlowService = getRpcRegistryDependency().getRpcService(SalFlowService.class); + return getDataBrokerDependency().registerDataChangeListener( + LogicalDatastoreType.OPERATIONAL, + path, + new LLDPPacketPuntEnforcer(salFlowService), + AsyncDataBroker.DataChangeScope.BASE); + } + +} diff --git a/applications/table-miss-enforcer/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/applications/table/miss/enforcer/rev140326/LLDPPacketPuntEnforcerModuleFactory.java b/applications/table-miss-enforcer/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/applications/table/miss/enforcer/rev140326/LLDPPacketPuntEnforcerModuleFactory.java new file mode 100644 index 0000000000..1ebc1f90ec --- /dev/null +++ b/applications/table-miss-enforcer/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflow/applications/table/miss/enforcer/rev140326/LLDPPacketPuntEnforcerModuleFactory.java @@ -0,0 +1,13 @@ +/* +* Generated file +* +* Generated from: yang module name: table-miss-enforcer yang module local name: table-miss-enforcer +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Mon Sep 08 15:26:18 CEST 2014 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.applications.table.miss.enforcer.rev140326; +public class LLDPPacketPuntEnforcerModuleFactory extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.applications.table.miss.enforcer.rev140326.AbstractLLDPPacketPuntEnforcerModuleFactory { + +} diff --git a/applications/table-miss-enforcer/src/main/resources/initial/69-table-miss-enforcer.xml b/applications/table-miss-enforcer/src/main/resources/initial/69-table-miss-enforcer.xml new file mode 100644 index 0000000000..003b563bb6 --- /dev/null +++ b/applications/table-miss-enforcer/src/main/resources/initial/69-table-miss-enforcer.xml @@ -0,0 +1,30 @@ + + + + + + + + + prefix:table-miss-enforcer + table-miss-enforcer + + binding:binding-async-data-broker + binding-data-broker + + + binding:binding-rpc-registry + binding-rpc-broker + + + + + + + \ No newline at end of file diff --git a/applications/table-miss-enforcer/src/main/yang/table-miss-enforcer.yang b/applications/table-miss-enforcer/src/main/yang/table-miss-enforcer.yang new file mode 100644 index 0000000000..139c5dc652 --- /dev/null +++ b/applications/table-miss-enforcer/src/main/yang/table-miss-enforcer.yang @@ -0,0 +1,42 @@ +module table-miss-enforcer { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:openflow:applications:table-miss-enforcer"; + prefix "table-miss-enforcer"; + import config {prefix config; revision-date 2013-04-05;} + import opendaylight-md-sal-binding { prefix mdsal; revision-date 2013-10-28; } + + description + "table-miss-enforcer-custom-config-impl"; + + revision "2014-03-26" { + description + "Initial revision"; + } + + identity table-miss-enforcer { + base "config:module-type"; + config:java-name-prefix LLDPPacketPuntEnforcer; + } + + augment "/config:modules/config:module/config:configuration" { + case table-miss-enforcer { + when "/config:modules/config:module/config:type = 'table-miss-enforcer'"; + container rpc-registry { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity mdsal:binding-rpc-registry; + } + } + } + container data-broker { + uses config:service-ref { + refine type { + mandatory false; + config:required-identity mdsal:binding-async-data-broker; + } + } + } + } + } +} diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/lldp/LLDPDataChangeListenerTest.java b/applications/table-miss-enforcer/src/test/java/org/opendaylight/openflowplugin/applications/tableMissEnforcer/LLDPDataChangeListenerTest.java similarity index 88% rename from openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/lldp/LLDPDataChangeListenerTest.java rename to applications/table-miss-enforcer/src/test/java/org/opendaylight/openflowplugin/applications/tableMissEnforcer/LLDPDataChangeListenerTest.java index ad4b1f8d44..c5d0d43e7a 100644 --- a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/lldp/LLDPDataChangeListenerTest.java +++ b/applications/table-miss-enforcer/src/test/java/org/opendaylight/openflowplugin/applications/tableMissEnforcer/LLDPDataChangeListenerTest.java @@ -6,13 +6,14 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.openflowplugin.openflow.md.lldp; +package org.opendaylight.openflowplugin.applications.tableMissEnforcer; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import org.junit.Test; import org.mockito.Mock; +import org.opendaylight.openflowplugin.applications.tableMissEnforcer.LLDPPacketPuntEnforcer; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; @@ -30,12 +31,12 @@ public class LLDPDataChangeListenerTest { private static SalFlowService flowService; /** - * Test method for {@link LLDPPAcketPuntEnforcer#createFlow()} + * Test method for {@link org.opendaylight.openflowplugin.applications.tableMissEnforcer.LLDPPacketPuntEnforcer#createFlow()} * which ensures that LLDPDataChangeListener creates proper flow for */ @Test public void testCreateFlow() { - LLDPPAcketPuntEnforcer lldpDataChangeListener = new LLDPPAcketPuntEnforcer(flowService); + LLDPPacketPuntEnforcer lldpDataChangeListener = new LLDPPacketPuntEnforcer(flowService); evaluateFlow(lldpDataChangeListener.createFlow()); } diff --git a/distribution/base/pom.xml b/distribution/base/pom.xml index 875b3cdfaa..4725c99f66 100644 --- a/distribution/base/pom.xml +++ b/distribution/base/pom.xml @@ -120,6 +120,12 @@ see https://git.opendaylight.org/gerrit/#/c/390/ org.opendaylight.openflowjava util + + + org.opendaylight.openflowplugin.applications + table-miss-enforcer + ${project.version} + @@ -161,7 +167,8 @@ see https://git.opendaylight.org/gerrit/#/c/390/ ${project.build.directory}/generated-resources/opendaylight/configuration openflowplugin-controller-config, - test-extension, openflowjava-extension-nicira, openflowjava-extension-nicira-api, openflowplugin-extension-nicira + test-extension, openflowjava-extension-nicira, openflowjava-extension-nicira-api, openflowplugin-extension-nicira, + table-miss-enforcer, **\/*.xml META-INF diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OpenflowPluginProvider.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OpenflowPluginProvider.java index 4dac6c9191..bddc84feac 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OpenflowPluginProvider.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OpenflowPluginProvider.java @@ -9,9 +9,6 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal; import java.util.Collection; import java.util.Collections; - -import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; @@ -19,17 +16,12 @@ import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider; import org.opendaylight.openflowplugin.extension.api.ExtensionConverterRegistrator; import org.opendaylight.openflowplugin.openflow.md.core.MDController; -import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManagerImpl; import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManager; -import org.opendaylight.openflowplugin.openflow.md.lldp.LLDPPAcketPuntEnforcer; +import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManagerImpl; import org.opendaylight.openflowplugin.api.statistics.MessageCountDumper; import org.opendaylight.openflowplugin.api.statistics.MessageObservatory; import org.opendaylight.openflowplugin.statistics.MessageSpyCounterImpl; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yangtools.yang.binding.DataContainer; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.RpcService; import org.osgi.framework.BundleContext; import org.slf4j.Logger; @@ -53,8 +45,8 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab private MessageObservatory messageCountProvider; private SalRegistrationManager registrationManager; - - private ExtensionConverterManager extensionConverterManager; + + private ExtensionConverterManager extensionConverterManager; /** * Initialization of services and msgSpy counter @@ -84,14 +76,6 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab LOG.debug("onSessionInitiated"); registrationManager = new SalRegistrationManager(); registrationManager.onSessionInitiated(session); - //TODO : LLDPPAcketPuntEnforcer should be instantiated and registered in separate module driven by config subsystem - InstanceIdentifier path = InstanceIdentifier.create(Nodes.class).child(Node.class); - registrationManager.getSessionManager().getDataBroker().registerDataChangeListener( - LogicalDatastoreType.OPERATIONAL, - path, - new LLDPPAcketPuntEnforcer( - session.getRpcService(SalFlowService.class)), - AsyncDataBroker.DataChangeScope.BASE); mdController = new MDController(); mdController.setSwitchConnectionProviders(switchConnectionProviders); mdController.setMessageSpyCounter(messageCountProvider); @@ -133,6 +117,7 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab /** * dependencymanager requirement + * * @param broker */ public void setBroker(BindingAwareBroker broker) { @@ -141,14 +126,15 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab /** * dependencymanager requirement + * * @param brokerArg */ public void unsetBroker(BindingAwareBroker brokerArg) { this.broker = null; } - private boolean hasAllDependencies(){ - if(this.broker != null && this.switchConnectionProviders != null) { + private boolean hasAllDependencies() { + if (this.broker != null && this.switchConnectionProviders != null) { return true; } return false; @@ -158,19 +144,19 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab * register providers for md-sal */ private void registerProvider() { - if(hasAllDependencies()) { - this.broker.registerProvider(this,context); + if (hasAllDependencies()) { + this.broker.registerProvider(this, context); } } public MessageCountDumper getMessageCountDumper() { return messageCountProvider; } - + /** * @return the extensionConverterRegistry */ public ExtensionConverterRegistrator getExtensionConverterRegistrator() { return extensionConverterManager; } - } +} diff --git a/pom.xml b/pom.xml index 6092930ff9..7b3e34105d 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.opendaylight.odlparent odlparent 1.4.2-SNAPSHOT - + 3.0 @@ -76,6 +76,11 @@ yang-binding ${yang.binding.version} + + org.opendaylight.openflowplugin + openflowplugin-api + ${project.version} + org.opendaylight.openflowjava openflow-protocol-impl @@ -136,7 +141,6 @@ sal-common-util ${controller.model.version} - org.opendaylight.controller @@ -395,7 +399,7 @@ - + @@ -408,7 +412,7 @@ - + @@ -423,7 +427,7 @@ - + @@ -451,7 +455,7 @@ - + @@ -464,7 +468,7 @@ - + @@ -477,7 +481,7 @@ - + @@ -490,7 +494,7 @@ - + @@ -635,5 +639,6 @@ features samples/sample-consumer samples/learning-switch - + applications + -- 2.36.6