X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fprotocol_plugins%2Fopenflow%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fprotocol_plugin%2Fopenflow%2Finternal%2FActivator.java;h=d92c57bd8a59d9852326e2f2238af9dac2784971;hp=9bccbd1d68f450dc60889b1c35f21742da690d1e;hb=315a10ec8b79abec3f4d718359ebb4202bffcb11;hpb=e326757873804be369d20efd0b54467871094c06 diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/Activator.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/Activator.java index 9bccbd1d68..d92c57bd8a 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/Activator.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/Activator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * Copyright (c) 2013-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, @@ -14,21 +14,26 @@ import java.util.Hashtable; import org.apache.felix.dm.Component; import org.opendaylight.controller.protocol_plugin.openflow.IDataPacketListen; import org.opendaylight.controller.protocol_plugin.openflow.IDataPacketMux; +import org.opendaylight.controller.protocol_plugin.openflow.IDiscoveryListener; import org.opendaylight.controller.protocol_plugin.openflow.IFlowProgrammerNotifier; +import org.opendaylight.controller.protocol_plugin.openflow.IInventoryProvider; import org.opendaylight.controller.protocol_plugin.openflow.IInventoryShimExternalListener; import org.opendaylight.controller.protocol_plugin.openflow.IInventoryShimInternalListener; +import org.opendaylight.controller.protocol_plugin.openflow.IOFStatisticsListener; import org.opendaylight.controller.protocol_plugin.openflow.IOFStatisticsManager; -import org.opendaylight.controller.protocol_plugin.openflow.IPluginReadServiceFilter; +import org.opendaylight.controller.protocol_plugin.openflow.IReadFilterInternalListener; +import org.opendaylight.controller.protocol_plugin.openflow.IReadServiceFilter; import org.opendaylight.controller.protocol_plugin.openflow.IRefreshInternalProvider; -import org.opendaylight.controller.protocol_plugin.openflow.IStatisticsListener; import org.opendaylight.controller.protocol_plugin.openflow.ITopologyServiceShimListener; import org.opendaylight.controller.protocol_plugin.openflow.core.IController; import org.opendaylight.controller.protocol_plugin.openflow.core.IMessageListener; import org.opendaylight.controller.protocol_plugin.openflow.core.internal.Controller; +import org.opendaylight.controller.sal.connection.IPluginInConnectionService; +import org.opendaylight.controller.sal.connection.IPluginOutConnectionService; import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase; +import org.opendaylight.controller.sal.core.IContainerAware; import org.opendaylight.controller.sal.core.IContainerListener; import org.opendaylight.controller.sal.core.Node; -import org.opendaylight.controller.sal.discovery.IDiscoveryService; import org.opendaylight.controller.sal.flowprogrammer.IPluginInFlowProgrammerService; import org.opendaylight.controller.sal.flowprogrammer.IPluginOutFlowProgrammerService; import org.opendaylight.controller.sal.inventory.IPluginInInventoryService; @@ -36,6 +41,7 @@ import org.opendaylight.controller.sal.inventory.IPluginOutInventoryService; import org.opendaylight.controller.sal.packet.IPluginInDataPacketService; import org.opendaylight.controller.sal.packet.IPluginOutDataPacketService; import org.opendaylight.controller.sal.reader.IPluginInReadService; +import org.opendaylight.controller.sal.reader.IPluginOutReadService; import org.opendaylight.controller.sal.topology.IPluginInTopologyService; import org.opendaylight.controller.sal.topology.IPluginOutTopologyService; import org.opendaylight.controller.sal.utils.GlobalConstants; @@ -44,38 +50,28 @@ import org.slf4j.LoggerFactory; /** * Openflow protocol plugin Activator - * - * + * + * */ public class Activator extends ComponentActivatorAbstractBase { protected static final Logger logger = LoggerFactory .getLogger(Activator.class); /** - * Function called when the activator starts just after some initializations - * are done by the ComponentActivatorAbstractBase. - * - */ - public void init() { - } - - /** - * Function called when the activator stops just before the cleanup done by - * ComponentActivatorAbstractBase - * + * Priority to determine whether to override existing protocol service. */ - public void destroy() { - } + private static final int PLUGIN_PRIORITY = 10; /** * Function that is used to communicate to dependency manager the list of * known implementations for services inside a container - * - * + * + * * @return An array containing all the CLASS objects that will be * instantiated in order to get an fully working implementation * Object */ + @Override public Object[] getImplementations() { Object[] res = { TopologyServices.class, DataPacketServices.class, InventoryService.class, ReadService.class, @@ -86,7 +82,7 @@ public class Activator extends ComponentActivatorAbstractBase { /** * Function that is called when configuration of the dependencies is * required. - * + * * @param c * dependency manager Component object, used for configuring the * dependencies exported and imported @@ -98,13 +94,13 @@ public class Activator extends ComponentActivatorAbstractBase { * per-container different behavior if needed, usually should not * be the case though. */ + @Override public void configureInstance(Component c, Object imp, String containerName) { if (imp.equals(TopologyServices.class)) { // export the service to be used by SAL c.setInterface( new String[] { IPluginInTopologyService.class.getName(), - ITopologyServiceShimListener.class.getName() }, - null); + ITopologyServiceShimListener.class.getName() }, null); // Hook the services coming in from SAL, as optional in // case SAL is not yet there, could happen c.add(createContainerServiceDependency(containerName) @@ -120,10 +116,10 @@ public class Activator extends ComponentActivatorAbstractBase { if (imp.equals(InventoryService.class)) { // export the service c.setInterface( - new String[] { IPluginInInventoryService.class.getName(), - IStatisticsListener.class.getName(), - IInventoryShimInternalListener.class.getName() }, - null); + new String[] { + IPluginInInventoryService.class.getName(), + IInventoryShimInternalListener.class.getName(), + IInventoryProvider.class.getName() }, null); // Now lets add a service dependency to make sure the // provider of service exists @@ -143,7 +139,9 @@ public class Activator extends ComponentActivatorAbstractBase { Dictionary props = new Hashtable(); // Set the protocolPluginType property which will be used // by SAL - props.put("protocolPluginType", Node.NodeIDType.OPENFLOW); + props.put(GlobalConstants.PROTOCOLPLUGINTYPE.toString(), Node.NodeIDType.OPENFLOW); + props.put(GlobalConstants.PROTOCOLPLUGINPRIORITY.toString(), + Integer.valueOf(PLUGIN_PRIORITY)); c.setInterface(IPluginInDataPacketService.class.getName(), props); // Hook the services coming in from SAL, as optional in // case SAL is not yet there, could happen @@ -160,6 +158,11 @@ public class Activator extends ComponentActivatorAbstractBase { .setCallbacks("setPluginOutDataPacketService", "unsetPluginOutDataPacketService") .setRequired(false)); + c.add(createServiceDependency() + .setService(IPluginOutConnectionService.class) + .setCallbacks("setIPluginOutConnectionService", + "unsetIPluginOutConnectionService") + .setRequired(true)); } if (imp.equals(ReadService.class)) { @@ -167,12 +170,29 @@ public class Activator extends ComponentActivatorAbstractBase { Dictionary props = new Hashtable(); // Set the protocolPluginType property which will be used // by SAL - props.put("protocolPluginType", Node.NodeIDType.OPENFLOW); - c.setInterface(IPluginInReadService.class.getName(), props); + props.put(GlobalConstants.PROTOCOLPLUGINTYPE.toString(), Node.NodeIDType.OPENFLOW); + props.put(GlobalConstants.PROTOCOLPLUGINPRIORITY.toString(), + Integer.valueOf(PLUGIN_PRIORITY)); + c.setInterface(new String[] { + IReadFilterInternalListener.class.getName(), + IPluginInReadService.class.getName() }, props); + c.add(createServiceDependency() - .setService(IPluginReadServiceFilter.class) + .setService(IReadServiceFilter.class) .setCallbacks("setService", "unsetService") .setRequired(true)); + + c.add(createContainerServiceDependency(containerName) + .setService(IPluginOutReadService.class) + .setCallbacks("setPluginOutReadServices", + "unsetPluginOutReadServices") + .setRequired(false)); + + c.add(createServiceDependency() + .setService(IPluginOutConnectionService.class) + .setCallbacks("setIPluginOutConnectionService", + "unsetIPluginOutConnectionService") + .setRequired(true)); } if (imp.equals(FlowProgrammerNotifier.class)) { @@ -180,7 +200,7 @@ public class Activator extends ComponentActivatorAbstractBase { Dictionary props = new Hashtable(); // Set the protocolPluginType property which will be used // by SAL - props.put("protocolPluginType", Node.NodeIDType.OPENFLOW); + props.put(GlobalConstants.PROTOCOLPLUGINTYPE.toString(), Node.NodeIDType.OPENFLOW); c.setInterface(IFlowProgrammerNotifier.class.getName(), props); c.add(createContainerServiceDependency(containerName) @@ -188,22 +208,28 @@ public class Activator extends ComponentActivatorAbstractBase { .setCallbacks("setPluginOutFlowProgrammerService", "unsetPluginOutFlowProgrammerService") .setRequired(true)); + c.add(createServiceDependency() + .setService(IPluginOutConnectionService.class) + .setCallbacks("setIPluginOutConnectionService", + "unsetIPluginOutConnectionService") + .setRequired(true)); } } /** * Function that is used to communicate to dependency manager the list of * known implementations for services that are container independent. - * - * + * + * * @return An array containing all the CLASS objects that will be * instantiated in order to get an fully working implementation * Object */ + @Override public Object[] getGlobalImplementations() { Object[] res = { Controller.class, OFStatisticsManager.class, FlowProgrammerService.class, ReadServiceFilter.class, - DiscoveryService.class, DataPacketMuxDemux.class, + DiscoveryService.class, DataPacketMuxDemux.class, InventoryService.class, InventoryServiceShim.class, TopologyServiceShim.class }; return res; } @@ -211,7 +237,7 @@ public class Activator extends ComponentActivatorAbstractBase { /** * Function that is called when configuration of the dependencies is * required. - * + * * @param c * dependency manager Component object, used for configuring the * dependencies exported and imported @@ -219,13 +245,17 @@ public class Activator extends ComponentActivatorAbstractBase { * Implementation class that is being configured, needed as long * as the same routine can configure multiple implementations */ + @Override public void configureGlobalInstance(Component c, Object imp) { if (imp.equals(Controller.class)) { logger.debug("Activator configureGlobalInstance( ) is called"); Dictionary props = new Hashtable(); props.put("name", "Controller"); - c.setInterface(IController.class.getName(), props); + props.put(GlobalConstants.PROTOCOLPLUGINTYPE.toString(), Node.NodeIDType.OPENFLOW); + c.setInterface(new String[] { IController.class.getName(), + IPluginInConnectionService.class.getName()}, + props); } if (imp.equals(FlowProgrammerService.class)) { @@ -233,14 +263,13 @@ public class Activator extends ComponentActivatorAbstractBase { Dictionary props = new Hashtable(); // Set the protocolPluginType property which will be used // by SAL - props.put("protocolPluginType", Node.NodeIDType.OPENFLOW); + props.put(GlobalConstants.PROTOCOLPLUGINTYPE.toString(), Node.NodeIDType.OPENFLOW); + props.put(GlobalConstants.PROTOCOLPLUGINPRIORITY.toString(), + Integer.valueOf(PLUGIN_PRIORITY)); c.setInterface( - new String[] { - IPluginInFlowProgrammerService.class.getName(), - IMessageListener.class.getName(), - IContainerListener.class.getName(), - IInventoryShimExternalListener.class.getName() }, - props); + new String[] { IPluginInFlowProgrammerService.class.getName(), IMessageListener.class.getName(), + IContainerListener.class.getName(), IInventoryShimExternalListener.class.getName(), + IContainerAware.class.getName() }, props); c.add(createServiceDependency() .setService(IController.class, "(name=Controller)") @@ -250,16 +279,20 @@ public class Activator extends ComponentActivatorAbstractBase { c.add(createServiceDependency() .setService(IFlowProgrammerNotifier.class) .setCallbacks("setFlowProgrammerNotifier", - "unsetsetFlowProgrammerNotifier") + "unsetFlowProgrammerNotifier") .setRequired(false)); + c.add(createServiceDependency() + .setService(IPluginOutConnectionService.class) + .setCallbacks("setIPluginOutConnectionService", + "unsetIPluginOutConnectionService") + .setRequired(true)); } if (imp.equals(ReadServiceFilter.class)) { - c.setInterface( - new String[] { IPluginReadServiceFilter.class.getName(), - IContainerListener.class.getName() }, null); + c.setInterface(new String[] { IReadServiceFilter.class.getName(), IContainerListener.class.getName(), + IOFStatisticsListener.class.getName(), IContainerAware.class.getName() }, null); c.add(createServiceDependency() .setService(IController.class, "(name=Controller)") @@ -269,6 +302,11 @@ public class Activator extends ComponentActivatorAbstractBase { .setService(IOFStatisticsManager.class) .setCallbacks("setService", "unsetService") .setRequired(true)); + c.add(createServiceDependency() + .setService(IReadFilterInternalListener.class) + .setCallbacks("setReadFilterInternalListener", + "unsetReadFilterInternalListener") + .setRequired(false)); } if (imp.equals(OFStatisticsManager.class)) { @@ -281,7 +319,7 @@ public class Activator extends ComponentActivatorAbstractBase { .setCallbacks("setController", "unsetController") .setRequired(true)); c.add(createServiceDependency() - .setService(IStatisticsListener.class) + .setService(IOFStatisticsListener.class) .setCallbacks("setStatisticsListener", "unsetStatisticsListener").setRequired(false)); } @@ -289,9 +327,7 @@ public class Activator extends ComponentActivatorAbstractBase { if (imp.equals(DiscoveryService.class)) { // export the service c.setInterface( - new String[] { - IInventoryShimExternalListener.class.getName(), - IDataPacketListen.class.getName(), + new String[] { IInventoryShimExternalListener.class.getName(), IDataPacketListen.class.getName(), IContainerListener.class.getName() }, null); c.add(createServiceDependency() @@ -300,24 +336,28 @@ public class Activator extends ComponentActivatorAbstractBase { .setRequired(true)); c.add(createContainerServiceDependency( GlobalConstants.DEFAULT.toString()) - .setService(IPluginInInventoryService.class) - .setCallbacks("setPluginInInventoryService", - "unsetPluginInInventoryService").setRequired(true)); + .setService(IInventoryProvider.class) + .setCallbacks("setInventoryProvider", + "unsetInventoryProvider").setRequired(true)); c.add(createServiceDependency().setService(IDataPacketMux.class) .setCallbacks("setIDataPacketMux", "unsetIDataPacketMux") .setRequired(true)); c.add(createServiceDependency() - .setService(IDiscoveryService.class) - .setCallbacks("setDiscoveryService", - "unsetDiscoveryService").setRequired(true)); + .setService(IDiscoveryListener.class) + .setCallbacks("setDiscoveryListener", + "unsetDiscoveryListener").setRequired(true)); + c.add(createServiceDependency() + .setService(IPluginOutConnectionService.class) + .setCallbacks("setIPluginOutConnectionService", + "unsetIPluginOutConnectionService") + .setRequired(true)); } // DataPacket mux/demux services, which is teh actual engine // doing the packet switching if (imp.equals(DataPacketMuxDemux.class)) { - c.setInterface(new String[] { IDataPacketMux.class.getName(), - IContainerListener.class.getName(), - IInventoryShimExternalListener.class.getName() }, null); + c.setInterface(new String[] { IDataPacketMux.class.getName(), IContainerListener.class.getName(), + IInventoryShimExternalListener.class.getName(), IContainerAware.class.getName() }, null); c.add(createServiceDependency() .setService(IController.class, "(name=Controller)") @@ -333,33 +373,71 @@ public class Activator extends ComponentActivatorAbstractBase { .setService(IDataPacketListen.class) .setCallbacks("setIDataPacketListen", "unsetIDataPacketListen").setRequired(false)); + c.add(createServiceDependency() + .setService(IPluginOutConnectionService.class) + .setCallbacks("setIPluginOutConnectionService", + "unsetIPluginOutConnectionService") + .setRequired(true)); + } + + if (imp.equals(InventoryService.class)) { + // export the service + Dictionary props = new Hashtable(); + props.put("scope", "Global"); + + c.setInterface( + new String[] { IPluginInInventoryService.class.getName(), + IInventoryShimInternalListener.class.getName(), + IInventoryProvider.class.getName() }, props); + + // Now lets add a service dependency to make sure the + // provider of service exists + c.add(createServiceDependency() + .setService(IController.class, "(name=Controller)") + .setCallbacks("setController", "unsetController") + .setRequired(true)); + c.add(createServiceDependency() + .setService(IPluginOutInventoryService.class, "(scope=Global)") + .setCallbacks("setPluginOutInventoryServices", + "unsetPluginOutInventoryServices") + .setRequired(true)); } if (imp.equals(InventoryServiceShim.class)) { - c.setInterface(new String[] { IContainerListener.class.getName() }, - null); + c.setInterface(new String[] { IContainerListener.class.getName(), + IOFStatisticsListener.class.getName(), IContainerAware.class.getName() }, null); c.add(createServiceDependency() .setService(IController.class, "(name=Controller)") .setCallbacks("setController", "unsetController") .setRequired(true)); c.add(createServiceDependency() - .setService(IInventoryShimInternalListener.class) + .setService(IInventoryShimInternalListener.class, "(!(scope=Global))") .setCallbacks("setInventoryShimInternalListener", "unsetInventoryShimInternalListener") .setRequired(true)); + c.add(createServiceDependency() + .setService(IInventoryShimInternalListener.class, "(scope=Global)") + .setCallbacks("setInventoryShimGlobalInternalListener", + "unsetInventoryShimGlobalInternalListener") + .setRequired(true)); c.add(createServiceDependency() .setService(IInventoryShimExternalListener.class) .setCallbacks("setInventoryShimExternalListener", "unsetInventoryShimExternalListener") .setRequired(false)); + c.add(createServiceDependency() + .setService(IPluginOutConnectionService.class) + .setCallbacks("setIPluginOutConnectionService", + "unsetIPluginOutConnectionService") + .setRequired(true)); } if (imp.equals(TopologyServiceShim.class)) { - c.setInterface(new String[] { IDiscoveryService.class.getName(), - IContainerListener.class.getName(), - IRefreshInternalProvider.class.getName() }, null); - c.add(createServiceDependency() + c.setInterface(new String[] { IDiscoveryListener.class.getName(), IContainerListener.class.getName(), + IRefreshInternalProvider.class.getName(), IInventoryShimExternalListener.class.getName(), + IContainerAware.class.getName() }, null); + c.add(createServiceDependency() .setService(ITopologyServiceShimListener.class) .setCallbacks("setTopologyServiceShimListener", "unsetTopologyServiceShimListener")